ستقدم هذه المقالة مشروع Java الأساسي ، لمشروع الويب ، لدمج Spring ، SpringMVC ، SpringDatajpa+Hibernate.
عادة ، قد نقوم ببناء مشروع من خلال قالب أو استيراد مشروع مباشرة. ومع ذلك ، تختار هذه المقالة أن تبدأ بمشروع Java الأساسي ، بهدف إظهار المزيد من المبادئ.
بالطبع ، ما زلنا نبدأ بمشروع Maven الأساسي. في الواقع ، فإن عملية بناء المشاريع العادية غير المافين هي نفسها تقريبًا. يجب إضافة حزمة JAR يدويًا إلى المشروع ، في حين أن مشروع Maven يغير ملف التكوين.
ما يلي بدأ رسميا.
1. إنشاء مشروع Java الأساسي القائم على Maven (إذا لم تستخدم Maven ، يمكنك أيضًا استخدام المشاريع التقليدية)
لإنشاء مشروع جديد ، حدد مشروع Maven ، التالي:
تحقق من ذلك كمشروع بسيط ، التالي:
معرف المجموعة هو الترتيب العكسي لاسم المجال الخاص بك ، والذي يتوافق عادة مع اسم حزمة رمز مصدر المشروع. معرف Artifact هو الاسم الوحيد للمشروع في معرف المجموعة هذا. يمكن ملؤه بأي شكل من الأشكال وفقًا لهواياتك ، ثم إنهاء:
هذا هو نتيجة بنية دليل المشروع مثل هذا:
pom.xml هو الملف الأساسي لـ Maven.
2. اضبط المشروع على وضع الويب الديناميكي
بعد ذلك ، تحويل المشروع إلى مشروع ويب ، انقر بزر الماوس الأيمن لفتح خصائص المشروع ، كما هو موضح في الشكل ، انقر فوق جوانب المشروع في القائمة على اليسار ، ثم انقر فوق تحويل إلى Faceted من ...
على اليمين ، نقوم بضعف وحدة الويب الديناميكية وانقر فوق موافق:
في هذا الوقت ، سيظهر دليل إضافي لعلاج الويب:
في دليل Web-Inf ، أضف ملف web.xml ، على النحو التالي:
<؟ xmlns = "http://java.sun.com/xml/ns/javaee" http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd "الإصدار =" 3.0 "
ثم أضف صفحة ترحيب index.html:
<html> <head> </head> <body> <h1> Hello Word! </h1> </body> </html>
هيكل الدليل كما يلي:
في هذا الوقت ، يمكنك النقر بزر الماوس الأيمن فوق المشروع وتشغيله على الخادم. يمكنك رؤية التأثير:
3. دمج الربيع+springmvc
قم بإنشاء حزمة جديدة وإضافة بعض الواجهات والفئات (سيتم سرد الرمز المحدد لاحقًا). بنية الحزمة كما هو موضح في الشكل:
إذا كنت بحاجة إلى إضافة حزمة جرة ، فما عليك سوى تعديل ملف POM مباشرة. إذا كان مشروعًا عاديًا ، فما عليك سوى إضافته إلى المشروع عن طريق الضغط على حزمة JAR في pom.xml.
أولاً ، أضف إصدار الربيع المستخدم لتسهيل الإدارة الموحدة ، ثم إضافة جميع حزم الجرة المطلوبة. فيما يلي إضافة جميع حزم الجرة المطلوبة هنا. Pom.xml المكتمل كما يلي:
<project xmlns = "http://maven.apache.org/pom/4.0.0" http://maven.apache.org/xsd/maven-4.0.0.xsd "> <DodelVersion> 4.0.0 </modelversion> <roupiD> com.anxpp </rougiD> <springdatajpa </spring proter> </spring propist <pring.version> 4.2.5.Release </spring.version> </properties> <تبعية> <!-حزمة النابض الأساسي-> <reperency> <roupiD> org.springframework </rougiD> </artifactid> spring-core </stifactid> <roupl> org.springframework </rougiD> <StifactId> Spring-Web </stifactid> <الإصدار> $ {spring.version} </version> </sependency> <reperency> <roupid> org.springframework </rougiD> <Sring-Impray> <Rependency> <roupend> org.springframework </rougiD> <StifactId> spring-tx </stifactid> <الإصدار> دولار </reperency> <reperency> <roupiD> org.springframework </rougiD> <StifactId> Spring-Webmvc </shintifactid> <soph> $ {spring.version} </version> </rependency> <sropency> <soph> $ {spring.version} </version> </sependency> <redence> <roupiD> org.springframework </rougeid> <StifactId> spring-context-support </stifactid> <splent> $ {Spring.Version} </reperency> <sperence> <StifactId> اختبار الربيع </artifactId> <soph> $} <Gropled> org.springframework.data </rougiD> <StifactId> spring-data-jpa </shintifactid> <الإصدار> 1.10.1.Release </version> </sependency> </تبعية> </project>أضف Application ApplicationContext.xml تكوين Spring Configuration في دليل الويب وأضف المحتوى التالي:
<؟ xmlns: context = "http://www.springframework.org/schema/context" xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: mvc = "http://www.springframework.org/schema/mvc" XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/context http://www.springframework.org/schema/spring-4.2.xt-4 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4 على مسح التعليقات التوضيحية IOC-> <السياق: مكون المسح القاعدة = "com.anxpp.demo" /> <!-قم بتشغيل مسح التعليقات التوضيحية MVC-> <mvc: تعليمية التعليق التوضيحي /> < /beans>
تعديل web.xml وأضف الربيع إلى:
<؟ XSI: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" <splay-name> springDatajpa </isplay-name> <stanker> <stanker-class> org.springframework.web.context.contextloaderListener </bame-class> </stanker> <context-param> <param-name> contextConfigLocation </param-name> </context-param> <Verlet> <Sradlet-Name> springmvc </servlet-name> <Sradlet-Class> org.springframework.web.servlet.dispatcherservlet </radlet-class> <Ing-param> <Parm-name> contextConfiglocation </param-name> <Param-value> classpath*: springmvc-servlet.xml </param-value> </ith-param> <load-on-startup> 1 </over-on-startup> </servlet> <cervlet mapping> <Sradlet-mapping> <list-file-list> <lispile-file> index.html </iship-file> </iship-file-list> </bil-app>
لنبدأ في كتابة الكود أدناه ، كن حذرًا في عدم نسيان كتابة التعليقات التوضيحية ، وقد تم تقديم التسلسل الهرمي للحزمة في بداية هذا القسم.
مستخدم الكيان:
package com.anxpp.demo.core.entity ؛ مستخدم الفئة العامة {private integer id ؛ اسم السلسلة الخاصة ؛ المستخدم العام (معرف Integer ، اسم السلسلة) {this.id = id ؛ this.name = name ؛ } integer getId () {return id ؛ } public void setId (integer id) {this.id = id ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } Override Public String ToString () {return "id:"+id+"، الاسم:"+name ؛ }}واجهة طبقة userdao:
package com.anxpp.demo.core.dao ؛ استيراد com.anxpp.demo.core.entity.user ؛ واجهة عامة userDao {user getUser (integer id ، اسم السلسلة) ؛}طبقة DAO تنفذ userdaoimpl:
package com.anxpp.demo.core.dao.impl ؛ استيراد org.springframework.stereotypee.repository getUser (integer id ، اسم السلسلة) {إرجاع مستخدم جديد (معرف ، اسم) ؛ }}واجهة طبقة الخدمة المستخدمين:
package com.anxpp.demo.core.service ؛ import com.anxpp.demo.core.entity.user ؛ public interface uservice {user getuser (integer id ، string name) ؛}تطبيق طبقة الخدمة:
package com.anxpp.demo.core.service.impl ؛ استيراد org.springframework.beans.factory.annotation. com.anxpp.demo.core.service.userservice ؛ servicepublic class userviceImpl تنفذ المستخدمين {autowired userdao userdao ؛ Override public user getUser (integer id ، اسم السلسلة) {return userDao.getuser (id ، name) ؛ }}وحدة التحكم في طبقة وحدة التحكم:
package com.anxpp.demo.controller ؛ استيراد org.springframework.beans.factory.annotation. org.springframework.web.bind.annotation.ResponseBody ؛ استيراد com.anxpp.demo.core.service.userservice ؛@controller@requestMapping ("/") الطبقة العامة democontroller {autowired userviservice ؛ requestMapping ("/") reSponsebody public index () {return "index" ؛ } @requestmapping ("/getUser") @Responsebody public getUser (integer id ، اسم السلسلة) {return userservice.getuser (id ، name) .ToString () ؛ }}لا يمكن تشغيل هذا على الخادم مباشرة ، لأنه لن يتم إصدار حزمة JAR معًا ، نحتاج إلى تكوين ما يلي:
انقر بزر الماوس الأيمن فوق المشروع لتحديد الخصائص وتكوينه وفقًا للشكل أدناه:
في هذا الوقت ، يمكنك إجراء الاختبار ، والتأثير على النحو التالي:
في هذه المرحلة ، لم ندير قاعدة البيانات بعد.
4. إضافة وإرجاع دعم بيانات تنسيق JSON
الآن ، غالبًا ما نستخدم JSON كتنسيق نقل البيانات. دعنا نضيف دعمًا لإرجاع JSON لـ SpringMVC.
أضف أولاً حزمة الجرة:
<Rependency> <roupency> com.fasterxml.jackson.core </rougiD> <artifactid> jackson-databind </shintifactid> <الإصدار> 2.5.0 </version> </sependency> <redency> <sropencid> com.fasterxml.jackson.core </groupid> </reperency> <reperency> <roupiD> com.fasterxml.jackson.core </groupId> <StifactId> annotations Jackson-annotations </intifactid> <الإصدار> 2.5.0 </version> </dependency>
ثم أعد كتابة طريقة getUser () على النحو التالي:
requestmapping ("/getUser") responsebody الخريطة العامة <string ، object> getUser (integer id ، اسم السلسلة) {map <string ، object> map = new hashmap <string ، object> () ؛ map.put ("الحالة" ، "النجاح") ؛ map.put ("Data" ، userService.getuser (id ، name)) ؛ خريطة العودة }بعد إعادة تشغيله ، يكون تأثير الوصول على النحو التالي:
في هذا الوقت ، يمكنك إعادة بيانات JSON.
5. تكوين وصول الموارد الثابتة
بشكل عام ، لا يمكننا الوصول إلى الموارد في دليل Web-INF مباشرة. إذا كان موقعنا على الويب يتكون من HTML+AJAX ، فيمكنك إنشاء دليل HTML جديد خارج Web-INF وتكوين المرشح الافتراضي لـ web.xml. ومع ذلك ، احرص على وضعه قبل مرشح springMVC:
<Sradlet-mapping> <Sradlet-Name> افتراضي </servlet-name> <url-pattern>*.
إذا كان يجب عليك الوصول إلى الموارد في دليل الويب الخاص بـ Web-Inf ، من خلال التحقق من المستندات الرسمية لربيع ، ستجد أن هناك طريقتان
1. الكتابة اليدوية خريطة الموارد:
@configuration @enablewebmvcpublic class webConfig يمتد webmvcConfigureRadapter {Override public void addresourceHandlers (ResourceHandlerRegistry Recistry) {registry.addresourceHandler ("/resources/**". timunit.hours) .cachepublic ()) ؛ }}كما ترون ، يمكنك أيضًا تعيين وقت ذاكرة التخزين المؤقت ، والطريقة الأكثر بساطة هي تكوين XML:
<mvc: الموارد mapping = "/resources/**" location = "/public-resources/"> <mvc: cache-control max-age = "3600" cache-public = "true"/> </mvc: Resources>
يمكنك أيضًا إضافة ما يلي:
<!-سيتم تسليم الوصول إلى ملفات الموارد الثابتة إلى معالج servlet الافتراضي للمعالجة عن طريق الوصول إلى المسار الذي لا يمكن تعيينه إلى وحدة التحكم-> <mvc: معالج الخدمات الافتراضي />>
6. حل رمز القمامة
عادةً ما نستخدم AJAX لتقديم الطلبات ، لكننا نستخدم أيضًا شريط العناوين للاختبار مباشرة. طلب التقديمات الحصول على ونشر.
إرسال الطلبات باستخدام Post ، وعموما لن يكون هناك رمز مشتعل صيني ، ولكن إذا ظهرت الرمز المشتعلة ، يمكنك حل المشكلة عن طريق إضافة مرشح ترميز إلى web.xml:
<Ivilter> <Ivilter-name> nareerencoding </filter-name> <lipter-class> org.springframework.web.filter.characterencodingfilter </filter-class> <IRIT-PARAM> <PARAM-NAME> FORCENCODING </param-name> <Param-value> true </param-value> </IPT-PARAM> </filter> <filter-mapping> <filter-name> characterencoding </filter-name> <url-patern>/*</erl-pattern>
ما سبق يمكن أن يحل فقط رمز بوست المشوهة الصينية. لـ GET (بما في ذلك طريقة التقديم المباشر لشريط عنوان المتصفح) ، نحتاج إلى تعديل تكوين tomcat ، والعثور عليه في server.xml في دليل conf وتعديله على النحو التالي:
<connector connectionTimeOut = "20000" port = "8080" protocol = "http/1.1" redirectport = "8443" uriencoding = "utf-8"/>
إذا كنا نختبر فقط ولم يتم نشر المشروع ، فيمكننا العثور مباشرة على server.xml تحت الخادم في Eclipse ونجري نفس التغييرات على النحو الوارد أعلاه:
7. دمج springdatajpa+hibernate
يمكنك التعرف على JPA: مقدمة في مواصفات JPA وأمثلة (حل ثبات بيانات Java)
SpringDatajpa هو أيضًا حل خفيف الوزن ، ويقوم الإسبات المفضل بتطبيق JPA.
بادئ ذي بدء ، تمت إضافة حزمة JAR ، SPRINGDATAJPA JAR ، معًا عند دمج الربيع. فيما يلي حزمة جرة من السبات (وسائق MySQL).
<!-hibernate-> <redency> <roupiD> org.hibernate </rougeid> <StifactId> hibernate-core </shintifactid> <sophy> $ {hibernate.version} </version> </dependency> <soph> $ {hibernate.version} </version> </sependency> <redency> <roupiD> org.hibernate </rougeid> <StifactId> hibernate-entityManager </stifactid> <الإصدار> $ {hibernate.version} </apperence> <sepensed> <StifactId> hibernate-c3p0 </stifactid> <sophy> $ {hibernate.version} </version> </repreadency> <redence> <roupiD> mysql </rougiD> </intifactid> mysql-connector-java </attifactid>نسخة الإدارة الموحدة هي:
<!-رقم الإصدار hibernate-> <hibernate.version> 5.1.0.final </hibernate.version>
إضافة ملف تكوين JPA Prosistence.xml إلى دليل meta-Inf. تستخدم قاعدة البيانات MySQL عند تقديم هذه المقالة. وأضف المحتوى التالي:
<؟ XSI: schemalocation = "http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence_1_0.xsd"> <nersistence-unit name = "demo" strentaction-type = Provider> org.eclipse.persistence.jpa.persistenceprovider </provider-> <rucider> org.hibernate.ejb.hibernatepersistence </provider> <class> com.ninlephas.meerkat.pojo name = "hibernate.connection.driver_class" value = "com.mysql.jdbc.driver"/> <property name = "hibernate.connection.url" value = "jdbc: mysql: //127.0.0.1: 3306/demo createdataBaseiFnotixist = value = "root" /> <property name = "hibernate.connection.password" value = "root" /> <property name = "hibernate.dialect" value = "org.hibernate.dialect.mysqldialect" /> < /properties> < /pronessence-unit> < / / /pretentence>
المحتوى الكامل بعد إضافة دعم JPA إلى ملف تعريف ملف Spring ApplicationContext.xml:
<؟ xmlns: context = "http://www.springframework.org/schema/context" xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: mvc = "http://www.springframework.org/schema/mvc" Xmlns: jpa = "http://www.springframework.org/schema/data/jpa" http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4 http://www.springframework.org/schema/data/jpa /> <bean id = "entityManagerFactory"> <property name = "jpavendoradapter"> <bean> <property name = "enderddl" value = "true" /> <property name = "database" value = "mysql" /> </bant> < /propert <mvc: تعرض التعليق التوضيحي/> <bean> <property name = "viewResolvers"> <list> <bean> <property name = "prefix" value = "/web-inf/view/"/> <property name = "falue". </list> </property> </boan> <!-سيترك الوصول إلى ملفات الموارد الثابتة المسار الذي لا يمكن تعيينه إلى وحدة التحكم إلى معالج servlet الافتراضي للمعالجة-> <mvc: معالج servlet الافتراضي/> <! تمكين معاملة التعليقات التوضيحية-> <tx: دليل المعاملات التي تعتمد على التعليقات التوضيحية = "TransactactionManager" /> <!-تكوين دليل SPRING DATA JPA Scanning Directory-> <jpa: repositories base-package = "com.anxpp.demo" /> < /beans>
تعديل الكيان:
package com.anxpp.demo.core.entity ؛ import javax.persistence.entity ؛ import javax.persistence.generatedvalue ؛ import javax.persistence.generationtype ؛ eSrate javax.persistence.id ؛ eashtistence.persistence ؛ GenerType.Auto) INTEGER ID ؛ اسم السلسلة الخاصة ؛ المستخدم العام () {} المستخدم العام (اسم السلسلة) {this.name = name ؛ } integer getId () {return id ؛ } public void setId (integer id) {this.id = id ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } Override Public String ToString () {return "id:"+id+"، الاسم:"+name ؛ }}يمكنك حذف تنفيذ طبقة DAO. نتذكر أن نرث واجهة طبقة داو من jparepository القوية:
الواجهة العامة userDao يمتد JParePository <user ، serializable> {user findbyid (integer id) ؛}هل تبدو موجزة بشكل خاص ولا تتطلب كتابة التنفيذ؟ سوف تساعدنا SpringDatajpa تلقائيًا في إكمالها.
تعديل واجهة طبقة الخدمة:
package com.anxpp.demo.core.service ؛ import java.util.list ؛ import com.anxpp.demo.core.user.user ؛ public interface userservice {userbyid (integer id) ؛ المستخدم حفظ (اسم السلسلة) ؛ قائمة <Sether> findall () ؛}تعديل تطبيق طبقة الخدمة:
package com.anxpp.demo.core.service.impl ؛ استيراد java.util.list ؛ استيراد org.springframework.beans.factory.annotation.autowired com.anxpp.demo.core.entity.user ؛ استيراد com.anxpp.demo.core.service.userservice ؛ servicepublic class userviceImpl تنفذ المستخدمين {autowired userdao userdao ؛ Override Public Userbyid (integer id) {return userDao.findbyid (id) ؛ } Override Public User Save (اسم السلسلة) {return userDao.save (مستخدم جديد (اسم)) ؛ } Override Public List <Sether> findall () {return userDao.findall () ؛ }}تعديل وحدة التحكم لتوفير واجهات اختبار متعددة:
package com.anxpp.demo.controller ؛ استيراد java.util.hashmap ؛ استيراد java.util.map ؛ استيراد org.springframework.beans.factory.annotation.autowired org.springframework.web.bind.annotation.requestMapping ؛ استيراد org.springframework.web.bind.annotation.responseBody ؛ استيراد com.anxpp.demo.core.service.userservice ؛@controller requestMapping ("/ requestMapping ("/") reSponsebody public index () {return "index" ؛ } @requestmapping ("/info") معلومات السلسلة العامة () {return "info" ؛ } @requestmapping ("/findall") responsebody خريطة عامة <string ، object> getUser () {map <string ، Object> map = new hashmap <string ، Object> () ؛ map.put ("الحالة" ، "النجاح") ؛ map.put ("data" ، userviservice.findall ()) ؛ خريطة العودة } @requestmapping ("/findById") @responsebody خريطة عامة <string ، object> findbyid (integer id) {map <string ، object> map = new hashmap <string ، object> () ؛ map.put ("الحالة" ، "النجاح") ؛ map.put ("Data" ، userService.findbyid (id)) ؛ خريطة العودة } @requestmapping ("/add") responsebody خريطة عامة <string ، كائن> حفظ (اسم السلسلة) {map <string ، object> map = new hashmap <string ، object> () ؛ map.put ("الحالة" ، "النجاح") ؛ map.put ("Data" ، userService.save (name)) ؛ خريطة العودة }}تأثير الجري:
لذا ، ماذا لو كنت بحاجة إلى إضافة بيانات تبحث عن اسم الأخير المحدد مع معرف أكبر من القيمة المحددة؟
إذا كان SQL ، فسوف نكتب بهذه الطريقة (؟ يمثل المعلمات):
حدد * من المستخدم أين المعرف>؟ واسم مثل "؟ ٪" ؛
ولكن هنا ، لا نحتاج حتى إلى كتابة SQL (أو HQL) وإضافة طريقة إلى واجهة طبقة DAO:
قائمة <Sether> findbyidgreaterthanandnamelike (INTEGER ID ، اسم السلسلة) ؛
لا تحتاج إلى الشك في أن الطريقة أعلاه ستكون ناجحة إذا تم تنفيذها (ملاحظة: استخدم تطبيق الخدمة ، تذكر الاسم+"٪" عند استدعاء هذه الطريقة)!
ما سبق هو المعرفة ذات الصلة التي تم تقديمها لك حول بناء springmvc+springdatajpa+hibernate من مشروع Java الأساسي. آمل أن يكون ذلك مفيدًا للجميع. إذا كنت تريد معرفة المزيد من المعلومات ، فيرجى الانتباه إلى موقع Wulin.com!