مقدمة
اليوم سوف أراجع بناء springmvc+hibernate. لقد اعتقدت في الأصل أن إطار التحكم في أذواح الأمن الربيع سيتم تضمينه أيضًا ، لكنني وجدت أن هناك الكثير من المحتوى. دعنا نترك الأمر في المقال التالي. هذه المقالة تبني بشكل رئيسي springmvc4.1.4 و hibernate4.3.8. لقد استخدمت أيضًا الكثير من springmvc من قبل. هذا الجزء على دراية به. بعد كل شيء ، تم تطوير springMVC لأكثر من عام. هذه المرة ، تستخدم طبقة الثبات السبات ، ويستخدم مصدر البيانات C3P0 ، وتستخدم قاعدة البيانات MySQL مؤقتًا. أريد أساسا مراجعة السبات. فكرة بناء إطار عمل springmvc+هي كما يلي:
1. قاعدة بيانات التصميم: صمم بنية الجدول ، من الأفضل تلبية 3NF ، واستخدام أدوات السبات لإنشاء كيان الكيان المقابل تلقائيًا.
1. إنشاء مشروع Maven وأدخل تبعيات Maven Package حسب الحاجة.
2. بناء الربيع: تكوين حقن الربيع من حبوب طبقة التحكم.
3. بناء السبات: تكوين مصادر البيانات ، وتكوين SessionFactory ، وتكوين المعاملات ، وتكوين ذاكرة التخزين المؤقت الثانوية ehcache.
4. اختبار بناء إطار عمل الربيع+السبات ، وكتابة اختبار الوحدة Junit ، وتكوين معاملة الاختبار ، إلخ.
5. الإدخال springMVC: تكوين معلومات تكوين springMVC.
6. تكوين حاوية web.xml
7. اختبار تكامل ثلاثة أطر: تجميع Maven ، وحزم ، ونشر الخوادم ، والاختبارات.
1. تصميم قاعدة البيانات
تصميم جدول الأذونات والأدوار والمستخدمين. بالطبع ، إذا كان بإمكان المستخدم أن يكون له أدوار متعددة ، فإن دورًا واحدًا يمتلك عدة مستخدمين ؛ دور واحد له أذونات متعددة ، ويتوافق إذن واحد مع أدوار متعددة. لذلك ، وفقًا لتصميم بنية جدول قاعدة البيانات ، إذا كان يجتمع 3NF ، نحتاج إلى وجود 5 جداول. المعلومات المحددة للجدول غير مدرجة (يمكنك تنزيله في الكود المصدر ، وهناك أيضًا قاعدة بيانات فيه) ، وعلاقة الجدول هي كما يلي:
فقط في هذا المعرف يستخدم UUID (36 بت)
2. قم بإنشاء مشروع Maven واكتب ملف pom.xml
قم بإنشاء مشروع Maven WebApp ، واكتب ملف pom.xml ، وقم بتقديم تبعيات الحزمة المطلوبة. سأقوم بتخطيط جميع تلك المطلوبة هنا.
محتوى ملف pom.xml هو كما يلي:
<project xmlns = "http://maven.apache.org/pom/4.0.0" http://maven.apache.org/maven-v4_0_0.xsd "> <Dodeversion> 4.0.0 </modelversion> <roupiD> org.andy.sh </rougeid> <spressactid> springmvc_hibernate_demo </artifactid> war> <name> springmvc_hibernate_demo maven webapp </same> <Url> http://maven.apache.org </url> <properties> <project.build.sourceencoding> utf-8 </project.build.sourceencoding> <Hibernate.version> 4.3.8.final </hibernate.version> <jackson.version> 2.5.0 </jackson.version> </properties> <تبعية> <!-Junit-> <redence> <roupend> junit </groupid> -> <Rependency> <roupeD> org.springframework </rougiD> <ArtifactId> Spring-core </setifactid> <sophy> $ {spring.version} </version> </redence> <redency> <sropencid> org.springframework </suplesid> </reperency> <reperency> <roupiD> org.springframework </rougiD> <StifactId> spring-context </intifactid> <sophy> $ {spring.version} </version> </dependency> <redency> <roupiD> org.springframework </rougeid> <soph> $ {spring.version} </version> </sependency> <redence> <roupiD> org.springframework </rougiD> <StifactId> spring-web </shintifactid> <spert> $ {spring.version} </version> <StifactId> اختبار الربيع </artifactId> <soph> $} </rependency> <!- عند دمج قاعدة بيانات علائقية ، تحتاج إلى تكوين مثل Hibernate JPA. -> <redency> <roupeD> org.springframework </rougiD> <ArtifactId> Spring-Iorm </shintifactid> <sophy> $ {spring.version} </version> </sependency> <!-hibernate-> <redency> <soph> $ {hibernate.version} </version> </sependency> <redency> <roupiD> org.hibernate </rougeid> <StifactId> hibernate-ehcache </shintiD> <splement> $ {hibernate.version} </sperence> <! <rougiD> net.sf.ehcache </rougiD> <StifactId> ehcache </stifactid> <الإصدار> 2.9.0 </version> </premotency> <!-log4j-> <breent> <breadId> log4j </groupid> <Rependency> <roupEd> mysql </rougiD> <StifactId> mysql-connector-java </shintifactid> <sophy> 5.1.34 </version> </respensidency <!-C3P0 data source-> <redence> </reperency> <!-JSON-> <REPEDENCY> <LOUREID> COM.ALIBABA </rougeid> <STIFACTID> FASTJSON </STIFACTID> <الإصدار> 1.2.3 </version> </rEPERENCOM> <REPEDENCY> <NERTID> com.fasterxml.jackson.core </groupend> <soph> $ {jackson.version} </version> </sependency> <redency> <roupiD> com.fasterxml.jackson.core </rougeid> <terifactid> Jackson-Core </sontifactid> <splect> $ {jackson.version} </spertency> <sperency> <StifactId> Jackson-Databind </shintifactid> <sophy> $ {jackson.version} </version> </repreadency> <!-AOP-> <reperency> <roupiD> org.aspectj </groupid> <SetifactId> sidejweaver </attifactid> <splex> 1.8.4 </suredenc <roupiD> javax.servlet </rougiD> <StifactId> servlet-api </stifactid> <الإصدار> 3.0-alpha-1 </version> <scope> متوفر </scope> </redenced> <redency> <roupencid> javax.servlet </groupid> jstl> </sependencies> <build> <initalname> springmvc_hibernate_demo </initalname> <plugins> <!-قم بتشغيل اختبارات وحدة Junit في classloader معزولة-> <clupin> <roupiD> org.apache.maven.plugins </groupId> <IGUNCET> <SKIPTESTS> true </skiptests> </ispicturation> </suncloy> <clupin> <roupiD> org.apache.maven.plugins </groupid> <StifactId> maven-war-plugin </shintifactid> <sople> <Bebxml> src/main/webapp/web-inf/web.xml </webxml> </isplisturation> </sugionin> <!-إنشاء doc java-> <clupin> <roupiD> org.apache.maven.plugins </groupId> <javadocdirectory> الهدف/javadoc </javadocdirectory> <reperveOutPutDirectory> الهدف/javadoc </reportOutputDirectory> <charset> utf-8 </charset> </ishoding> utf-8 </ugending> <concencoding> utf-8 </cond تم نشره إلى الأصلي-> <rector> <roupiD> org.codehaus.cargo </groupId> <StifactId> Cargo-Maven2-plugin </stifactid> <sored> 1.0 </version> <configuration> <boutner> <itinerid> tomcat6x </containerid>/home> d: </sinater> <simpuration> <type> موجود </type> <ome> d: /webbserver/apache-tomcat-6.0.39 </ome> </isplicuration> </configuration> </plugin> </plugins> </build> </project>3. إدخال تكوين الربيع
اكتب ملف تكوين ، ووضع ملف التكوين في دليل موارد SRC/Main/Resources (نفسه أدناه).
معلومات التكوين المطلوبة من قبل Project config.properties
#APPlication تكوين#jdbc c3p0 configjdbc.driver = com.mysql.jdbc.driverjdbc.url = jdbc: mysql: // localhost: 3306/work؟ org.hibernate.dialect.mysqldialecthibernate.show_sql = trueHibernate.format_sql = falsehibernate.hbm2ddl.auto = updateHibernate.cache.use_second_level_cache = truehibernate.cache. org.hibernate.cache.ehcache.ehcacheregionfactoryhibernate.cache.provider_configuration_file_resource_path = ehcache.xml
3.1. تكوين الربيع
ملف التكوين الخاص بـ spring.xml كما يلي:
<؟ Xmlns: Context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context-context http://www.springframework.org/schema/spring-4 <!-ملف تكوين التحميل-> <السياق: property-placeholder location = "classpath: config.properties"/> <!-تم حقن خدمة المسح التلقائي كحبة-> <سياق: مكون مسكك الأساس = "org.andy.work.service.impl ،
يقوم الربيع أعلاه بتكوين إدارة حقن الفاصوليا التلقائي للفاصوليا المكونة المقابلة أسفل الحزمة. نحتاج إلى تسليم فئة التنفيذ من DAO والخدمة إلى الربيع لإدارتها ، مثل (repository ، service).
3.2. تقديم تكوين ملف السجل log4j
ملف التكوين الخاص بـ log4j.properties هو كما يلي: ### تعيين مستويات السجل ### log4j.rootlogger = info ، C ، D ، org.apache.log4j.patternlayoutlog4j.appender.c.layout.conversionpattern = [springmvc_hibernate_demo] [٪ p] [٪ -d {yyyy-mm-dd hh: mm: ss}] ٪ c. ٪ m (٪ l) | ٪ m ٪ n ### ملف سجل ### log4j.appender.d = org.apache.log4j.dailyrollingfilePenderDendLog4j.appender.d.file = log4j.appender.d.layout = org.apache.log4j.patternlayoutlog4j.appender.d.layout.conversionpattern = [springmvc_hibernate_demo] [٪ p] ٪ m ٪ n ### استثناء ### log4j.appender.e = org.apache.log4j.dailyrollingfilePendenderLog4j.appender.e.file = ../logs/springmvc_hibernate_demo_error. log4j.appender.e.layout = org.apache.log4j.patternlayoutlog4j.appender.e.layout.conversionpattern = [sspringmvc_hibernate_demo] [٪ P] ٪ م ٪ ن 4. تكوين السبات
يتضمن تكوين Hibernate بشكل أساسي: تكوين مصدر البيانات C3P0 ، وتكوين SessionFactory ، وتكوين مدير المعاملات ، وتكوين إدارة المعاملات. ملف spring--.xml هو كما يلي:
<؟ xmlns: tx = "http://www.springframework.org/schema/tx" http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4 id = "datasource" تدمير method = "elling"> <property name = "driverClass" value = "$ {jdbc.driver}" /> <property name = "jdbcurl" value = "$ {jdbc.url}" /> <property name = "user" value = $ {jdbc.username} value = "$ {jdbc.password}" /> <!-طلب مهلة-> <property name = "checkoutTimeOut" value = "30000" /> <!-تحقق من جميع اتصالات الخمول في مجموعة الاتصال كل 60 ثانية. القيمة الافتراضية: 0 ، لا تحقق-> <property name = "idleConnecteTestPeriod" value = "30" /> <!-الحد الأقصى لوقت الخمول لمجموعة اتصال قاعدة بيانات الاتصال-> <property name = "maxidletime" value = "30" /> <! /> <property name = "maxpoolsize" value = "20" /> <!- عدد الاتصالات التي تم الحصول عليها بواسطة C3P0 في نفس الوقت في وقت واحد عندما يتم استنفاد الاتصال في تجمع الاتصال. القيمة الافتراضية: 3-> <property name = "quiverincrement" value = "5" /> </bean> <!-تكوين Hibernate SessionFactory-> <bean id = "sessionfactory"> <!-راجع رمز المصدر لمصدر حقن البيانات-> <property name = "datasource" ref = "dataSource /> <BORS> <props key = "hibernate.dialect"> $ {hibernate.dialect} </prop> <prop key = "hibernate.show_sql"> $ {hibernate.show_sql} </prop> <propernate. key = "hibernate.hbm2ddl.auto"> $ {hibernate.hbm2ddl.auto} </prop> <!-تشغيل المستوى 2 ذاكرة التخزين المؤقت ehcache-> <propernate = "hibernate.cache_second_level_cache" key = "hibernate.cache.use_query_cache"> $ {hibernate.cache.use_query_cache} </prop> <prop key = "hibernate.cache.facion.factory_class"> $ {hibernate.cache.fion.factory_class} key = "hibernate.cache.provider_configuration_file_resource_path"> $ {hibernate.cache.provider_configuration_file_resource_path} </props> </property> <! /> < /bean> <!-تكوين مدير المعاملات-> <bean id = "TransactionManager"> <property name = "sessionfactory" ref = "sessionfactory" /> </bean> <!-تكوين تعزيز المعاملات الفاصوليا وتحديد المعالجة التفصيلية ". <tx: السمات> <tx: method name = "insert*" spection = "required" /> <tx: method name = "update*" spection = "required" /> <tx: method name = "delete*" spection = "required" /> read-only = "true" /> <tx: method name = "find*" spection = "supports" read-only = "true" /> <!-الآخرون يستخدمون طرق المعاملة الافتراضية-> <tx: method name = "*" /> < /tx: countibutes> < /tx: id = "TransactionPointCut" expression = "execution (*org.andy.work.service ..*INSL.*(..))" /> <!-حدد لتطبيق معالجة TXAdvice Trample Enhancement في TXAdvice PointCut-> <aOP: Advisor PointCut-REF = "المعاملات". تم تكوين ما ورد أعلاه مع ذاكرة التخزين المؤقت الثانوية و ehcache. للحصول على المعلومات المحددة ذات الصلة ، يرجى الاطلاع على المقالة السابقة Hibernate ذاكرة التخزين المؤقت الثانوية وتكوين بناء Ehcache. فيما يلي تكوين ذاكرة التخزين المؤقت الثانوية.
4.1. تكوين ehcache.xml
<؟ إعداد DefaultCache. -> <DefaultCache maxElementInmemory = "1000" ETERNAL = "false" timetoidleSeConds = "120" -> <cache name = "org.andy.work.entity.acctuser" maxElementSinMemory = "2" MemoryStoreEvictionPolicy = "lru" eternal = "true" diskpersister = "false" overflowtodisk = "false" maxElementSISK = "1000000" />
ذاكرة التخزين المؤقت الثانوية المذكورة أعلاه هي d:/ehcache
5. إنشاء كيان الأعمال
بعد تصميم جدول البيانات ، تحتوي كيانات السبات على أدوات الأداة التي يتم إنشاؤها تلقائيًا. يتطلب Eclipse تثبيت المكونات الإضافية لـ Hibernate Tools (لقد قمت بتثبيتها عبر الإنترنت عدة مرات ، لكنها غير ناجحة. من المستحسن استخدام الروابط لتثبيت الاتصال بالإنترنت ، وسيقوم التذييل بتقديمه). لذلك ، ليست هناك حاجة للكتابة يدويًا. فيما يلي كيان يحتوي على معلومات المستخدم ، acctuser.java
حزمة org.andy.work.entity ؛ // تم إنشاؤها 2015-2-3 10:43:00 من أدوات hibernate 4.0.0Import java.util.date ؛ استيراد java.util.hashset javax.persistence.id ؛ استيراد javax.persistence.joincolumn ؛ استيراد javax.persistence.jointable ؛ استيراد javax.persistence.manytomany org.hibernate.annotations.cacheconcurrencystrategy ؛ استيراد com.fasterxml.jackson.annotation.jsonignoreproperties ؛/** * acctuser تم إنشاؤها بواسطة hbm2java */estity@table (name = "acct_user" ، catalog = "work") class acctuser تنفذ java.io.serializable { / ** * * / private static final long serialversionuid = 6980093847795726310l ؛ معرف السلسلة الخاص ؛ لقب السلسلة الخاصة سلسلة سلسلة خاصة ؛ تاريخ التسجيل الخاص ؛ مجموعة خاصة <Acctrole> acctroles = new hassset <Acctrole> (0) ؛ acctuser public () {} acctuser العامة (معرف السلسلة ، لقب السلسلة) {this.id = id ؛ this.nickname = لقب ؛ } acctuser العامة (معرف السلسلة ، لقب السلسلة ، هاتف السلسلة ، سجل التاريخ ، تعيين <Acctrole> acctroles) {this.id = id ؛ this.nickname = لقب ؛ this.telephone = الهاتف ؛ this.registertime = registerTime ؛ this.acctroles = acctroles ؛ } idcolumn (name = "id" ، فريدة = true ، nullable = false ، length = 36) public string getId () {return this.id ؛ } public void setId (string id) {this.id = id ؛ } column (name = "nick_name" ، nullable = false) السلسلة العامة getNickName () {return this.nickname ؛ } public void setNickName (سلسلة لقب) {this.nickName = nablemed ؛ } column (name = "telephone") السلسلة العامة getTelePhone () {return this.telephone ؛ } public void settelephone (سلسلة الهاتف) {this.telephone = telephone ؛ } tmatmporal (ummortortype.timestamp) column (name = "register_time" ، length = 19) date public getRegisterTime () {return this.registertime ؛ } public void setRegisterTime (date registertime) {this.registertime = registerTime ؛ } jsonignoreRproperties (value = {"acctusers" ، "acctauthorities"}) manytomany (fetch = fetchtype.lazy) @cache (useAge = cacheconcurrencyStrategy.Read_write) jointable (name = "acct_user_rol "user_id" ، nullable = false ، updatable = false)} ، inversejoincolumns = {joincolumn (name = "rob_id" ، nullable = false ، updatable = false)}) مجموعة عامة <acctrole> getAcctroles () } public void setAcctroles (set <Acctrole> acctroles) {this.acctroles = acctroles ؛ }} هناك بعض الأشياء التي يجب ملاحظتها أعلاه:
يتم إنشاء معظم ما سبق تلقائيًا بواسطة أدوات السبات ، ولكن هناك العديد من الأشياء التي يجب إضافتها يدويًا:
1. إذا كان هذا الكيان يستخدم ذاكرة التخزين المؤقت من المستوى 2 ، فأنت بحاجة إلى إضافة التعليق التوضيحي Cache ؛
2. إذا كان هناك عناصر محددة (تعيين ، خريطة ، قائمة) في الكيان ، وإذا أراد الكيان استخدام ذاكرة التخزين المؤقت الثانوية ، فيجب إضافة هذه العناصر المحددة أيضًا مع شرح Cache.
3. @jsonignoreProperties annotation هو منع SpringMVC من إنتاج حلقة عند عودة JSON. إذا لم يتم تكوينه ، فسيحدث JSON Dead Loop (والعديد من الخصائص ، من طلاب واحد إلى أقصى).
4. jsonignore يتحول إلى JSON لتجاهل هذه الخاصية ، بينما يتجاهل @jsonignoreProperties (value = {"acctusers" ، "acctauthorities"}) خصائص acctusers و acctauthorities في acctroles.
6. إنشاء طبقة داو
6.1dao واجهة
يجب أن نتبنى فكرة برمجة واجهة الوجه في طبقة DAO وطبقة الخدمة ، لذلك نحدد أولاً واجهة DAO العامة ، genericdao.java
حزمة org.andy.work.dao ؛ استيراد java.io.serializable ؛ استيراد java.util.list ؛/** * تم إنشاء الوقت: 2015-2-6 2:26:42 pm * * author Andy * @Version 2.2 * * Dao General Interface */interface genericdao <t ، pk expable> {t load) t get (pk id) ؛ قائمة <T> findall () ؛ باطل يستمر (ر كيان) ؛ PK Save (t yound) ؛ void saveorupdate (t unitty) ؛ حذف باطل (معرف PK) ؛ void flush () ؛}تحديد واجهة userdao.java محددة
حزمة org.andy.work.dao ؛ استيراد org.andy.work.entity.acctuser ؛/** * وقت الإنشاء: 2015-2-6 2:43:50 PM * * Author Andy * @Varvent 2.2 * * user dao interface */public interface userdao
6.2. فئة تنفيذ طبقة داو
نحتاج إلى ضخ فئة التنفيذ لطبقة DAO في الفاصوليا ، لذلك نحتاج إلى إضافة التعليق التوضيحي @repository ، userDaoimpl كما يلي:
حزمة org.andy.work.dao.impl ؛ استيراد java.util.list ؛ استيراد org.andy.work.dao.userdao ؛ استيراد org.andy.entity.acctuser ؛ import org.hibernate.session ؛ org.springframework.stereotype. جلسة خاصة getCurrentsession () {return this.sessionfactory.getCurrentsession () ؛ } Override public acctuser load (string id) {return (acctuser) this.getCurrentsession (). load (acctuser.class ، id) ؛ } Override public acctuser get (string id) {return (acctuser) this.getCurrentsession (). get (acctuser.class ، id) ؛ } suppressWarnings ("Unchecked") Override Public List <Acctuser> findall () {list <Acctuser> acctusers = this.getCurrentsession (). إرجاع acctusers. } Override public void مستمر (كيان acctuser) {this.getCurrentsession (). } Override Public String Save (acctuser ictity) {return (string) this.getCurrentsession (). Save (intity) ؛ } Override public void saveorupdate (acctuser unitity) {this.getCurrentsession (). } Override public void delete (string id) {acctuser entity = this.load (id) ؛ this.getCurrentsession (). حذف (كيان) ؛ } Override public void flush () {this.getCurrentsession (). flush () ؛ }}7. إنشاء طبقة خدمة
7.1. واجهة طبقة الخدمة
package org.andy.work.service ؛ استيراد java.util.list ؛ استيراد org.andy.work.entity.acctuser ؛/** * وقت الإنشاء: 2015-2-6 3:18:57 PM * * Author Andy * Version 2.2 * userService Interface */usersevice usservice {acctuser old ( acctuser get (string id) ؛ قائمة <AcctUser> findall () ؛ باطل يظل (كيان acctuser) ؛ سلسلة حفظ (كيان acctuser) ؛ void saveorupdate (كيان acctuser) ؛ حذف باطل (معرف السلسلة) ؛ void flush () ؛}7.2. فئة تنفيذ طبقة الخدمة
يحتاج UserviceRviceImpl إلى حقن فول طبقة DAO المحددة أعلاه.
حزمة org.andy.work.service.impl ؛ استيراد java.util.list ؛ استيراد org.andy.work.dao.userdao ؛ import org.andy.entity.acctuser ؛ import org.andy.work.service.userservice org.springframework.stereotype.service ؛/** * وقت الإنشاء: 2015-2-6 3:24:16 PM * * Author Andy * @Version 2.2 Assorervice Application */ @service ("userservice") userServiceImpl التي تنفذ المستخدمين {autowired userdao userdao ؛ Override public acctuser load (string id) {return userDao.load (id) ؛ } Override public acctuser get (string id) {return userDao.get (id) ؛ } Override Public List <Acctuser> findall () {return userDao.findall () ؛ } Override public void refist (acctuser unitity) {userDao.persist (intity) ؛ } Override Public String Save (acctuser Entity) {return userDao.save (untity) ؛ } Override public void saveorupdate (acctuser unitity) {userDao.SaveorUpDate (intity) ؛ } Override public void delete (string id) {userDao.delete (id) ؛ } Override public void flush () {userDao.flush () ؛ }}8. اختبر تكامل الربيع والإسبات
يمكننا كتابة فئة اختبار في SRC/Test/Java لاختبار التكوين أعلاه. إذا نجح الاختبار ، فسيتم إكماله بشكل أساسي.
package org.andy.work.service ؛ import java.util.date ؛ import java.util.list ؛ import java.util.uuid ؛ import org.andy.entity.acctuser ؛ import org.apache.log4j.logger ؛ import org.junit.test ؛ org.springframework.beans.factory.annotation.autowired ؛ استيراد org.springframework.test.context.contextConfiguration ؛ import org.springframework.test.context.junit4.springJunit4Classrunner ؛ 3:31:07 PM * * Author Andy * @Version 2.2 */ @RunWith (SpringJunit4ClassRunner.Class) contextConfiguration (مواقع = {"classpath: spring.xml" ، "classpath: spring-hibernate.xml .getLogger (TestUserservice.class) ؛ @Autowired userverservice uservice ؛ test public void save () {acctuser acctuser = new acctuser () ؛ acctuser.setId (uuid.randomuuid (). toString ()) ؛ acctuser.setnickname ("Andy") ؛ acctuser.setRegisterTime (تاريخ جديد ()) ؛ acctuser.settelephone ("13022221111") ؛ معرف السلسلة = userService.save (acctuser) ؛ logger.info (json.tojsonstring (id)) ؛ }}9. إدخال springmvc
أضف ملف spring-mvc.xml
<؟ xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframeworg http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc-4 <!-حقن المسح التلقائي controller كحبة-> <السياق: مكون المسح الضوئي package = "org.andy.work.controller" /> <!-ما يلي هو تكوين springmvc-> <mvc: name = "supportedMediAtypes"> <list> <value> text/html ؛ charset = utf-8 </value> <value> application/json ؛ charset = utf-8 </value> </list> </spleneration> </bean> </mvc: message-converters> </mvc: ennotation-driven <Bean> <property name = "viewClass" value = "org.springframework.web.servlet.view.jstlview"/> <property name = "prefix" value = "/web-inf/vain
تم تكوين وحدة تحكم مسح الحزمة ، [البريد الإلكتروني المحمي] �� ، وعرض تكوينات الطبقة أعلاه.
10. قم بتكوين حاوية web.xml
حاويات الويب هي دماغ مشاريع الويب ، لذلك تحتاج حاويات الويب أولاً إلى تقديم الربيع ، والسماح لـ Spring بإدارة الأطر المختلفة ، وحقنها في الفاصوليا. ثم قم بتكوين معلومات التصفية لطبقة التحكم. ويتم تكوين عنوان URL الذي تم اعتراضه بواسطة SPRINGMVC للطلبات التي تنتهي في .HMLS.
ملف web.xml كما يلي:
<؟ xmlns: web = "http://java.sun.com/xml/ns/javaee" XSI: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id = "webapp_id" version = "2.5" <Param-Name> contextConfigLocation </param-name> <Param-value> classpath: spring.xml ، classpath: spring-hibernate.xml </param-value> </suctext-param> <lipter> <filter-name> encodingfilter </filter-name> <Filter-Class> org.springframework.web.filter.characterencodingfilter </filter-class> <Init-param> <param-name> الترميز </param-name> <Param-value> utf-8 </parm-value> <Param-value> true </param-value> </ith-param> </filter> <filter-mapping> <filter-name> charsoDingFilter </filter-name> <url-pattern>/*</url-pittern> </filter mapping> <! <filter-name> opensessionInviewFilter </filter-name> <lipter-class> org.springframework.orm.hibernate4 استمع إلى ServletContext وابدأ معلومات تكوين الربيع في ContextConfigLocation-> <stanker> <stanker-class> org.springframework.web.context.contextloaderListener </nancherer-class> </endrallistener> <!-المستمع> <cankerer-class> org.springframework.web.web.web.context </ </stanker> <!-منع مستمع تدفق الذاكرة الربيع-> <Stexer> <Canker-Class> org.springframework.web.util.introspectorcleanuplistener </stanterer-class> </stanker> <servlet> <Srevlet-Class> org.springframework.web.servlet.dispatcherservlet </servlet-class> <Ing-param> <Param-name> contextConfigLocation </parm-name> <!-هنا ملف تكوين springmvc-> <Parm-value> classpath: <load-on-startup> 1 </ load-on-startup> </qervlet> <Servlet-mapping> <servlet-mapping> <Sradlet-Name> REST </servlet-name> <Url-pattern>*. <Url-pattern>*.
11. إنشاء وحدة تحكم طبقة التحكم
السيطرة على طبقة USERCONTROLLER
package org.andy.work.controller ؛ import java.util.list ؛ import org.andy.work.entity.acctuser ؛ import org.andy org.springframework.stereotype.controller ؛ استيراد org.springframework.ui.modelmap ؛ استيراد org.springframework.web.bind.annotation.pathvariable org.springframework.web.bind.annotation.ResponseBody ؛/** * وقت الإنشاء: 2015-2-7 11:49:00 AM * Author Andy * @Varvent 2.2 * الوصف: وحدة التحكم في المستخدم */ @controller @requestMapping ("/user") userController @Autowired userverservice uservice ؛ @RequestMapping("/showInfo/{userId}") public String showUserInfo(ModelMap modelMap, @PathVariable String userId){ LOGGER.info("Query user: " + userId); AcctUser userInfo = userService.load(userId); modelMap.addAttribute("userInfo", userInfo); return "/user/showInfo"; } @RequestMapping("/showInfos") public @ResponseBody List<AcctUser> showUserInfos(){ LOGGER.info("Query all users of the user"); List<AcctUser> userInfos = userService.findAll(); return userInfos; }}12、创建视图层
在src/main/webapp/WEB-INF/views下创建user/showInfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%><% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><base href="<%=basePath%>" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script type="text/javascript" src="js/jquery-1.9.1.min.js"></script><title>userInfo</title></head><body> User information nickname: ${userInfo.nickName} User id: ${userInfo.id} User phone: ${userInfo.telephone } Registration time: <fmt:formatDate value="${userInfo.registerTime }" pattern="yyyy-MM-dd HH:mm:ss" /> Role: [ <c:forEach items="${ userInfo.acctRoles}" var="role"> ${role.name } Permissions[ <c:forEach items="${ role.acctAuthorities}" var="authority"> ${authority.name } </c:forEach> ] </c:forEach> ] <br /> ajax displays all user information: <div id="show_all_user"></div></body><script type="text/javascript"> $.ajax({ type : "get", url : "user/showInfos.htmls", dataType : "json", success : function(data) { $(data).each( function(i, user) { var p = "<p>Nickname:" + user.nickName + " Phone:" + user.telephone + " Registration time:" + user.registerTime + " id:" + user.id + "</p>"; $("#show_all_user").append(p); }) ؛ }, async : true });</script></html>13、部署服务器测试
使用Maven打包部署:clean compile package
部署到tomcat,测试主要测试上面的http://localhost:8080/springmvc_hibernate_demo/user/showInfo/6e5afb1d-50e1-45fe-b6fe-b9e399415387.htmls
和http://localhost:8080/springmvc_hibernate_demo/user/showInfos.htmls (json数据返回)
上面视图层就包含了这两条url请求的测试:
ok,到此Spring+SpringMVC+Hibernate搭建完毕。
博客来源:http://blog.csdn.net/fengshizty?viewmode=list
项目源码:http://download.csdn.net/detail/fengshizty/8432647
I hope to help friends in need and continue to add relevant information in the future. شكرا لك على دعمك لهذا الموقع!