Struts2.3.24 + Spring4.1.6 + Hibernate4.3.11 + MySQL5.5.5.25 تطوير بيئة التطوير والتعليمات ذات الصلة.
1. الهدف
1. بناء بيئة تطوير SSH التقليدية وقم بتشغيلها بنجاح (إدراج ، استعلام)
2. فهم تكوين تجمع اتصال C3P0
3. فهم ذاكرة التخزين المؤقت الثانوية لإسباتا والتحقق
4. فهم تكوين أشياء الربيع والتحقق
5. فهم الربيع IOC (حقن التبعية) ، تسليم كائن الحركة (الفول) من Struts2 إلى إدارة الربيع ، والفاصوليا المخصصة ، وما إلى ذلك ، والتحقق من
6. فهم الربيع AOP (البرمجة الموجهة نحو القسم) ، واكتب وظائف قسم مخصص للتحقق من النتائج
2. التحضير
بيئة التنمية: Eclipse لـ Java EE ؛ MySQL5.5.25 ؛ JDK1.7.0_79 ؛ Navicat10.1.7 (اختياري) ؛
قم بإنشاء عرض تجريبي لقاعدة البيانات:
! ----------------------------------- بنية الجدول لـ `user`-- ---------------------------------- table إذا كان موجودًا` user` ؛ إنشاء جدول `user` (` id` bigint (20) charset الافتراضي = UTF8 ؛
إنشاء مشروع ويب جديد ، هيكل الدليل كما يلي:
قم بإعداد حزمة JAR ووضعها في دليل LIB على الويب (إذا كنت مهتمًا ، فيمكنك استخدام Maven لإدارة العملية ، ولكن في بعض الأحيان يكون بطيئًا للغاية في تنزيل حزمة JAR ...)
يمكن العثور على حزم الجرة ذات الصلة في الدعامات التي تم تنزيلها ، الربيع ، و hibernate. هنا مرجع. يمكن حذف بعضها ، مثل حزم الجرة في جزء الربيع MVC:
3. تكوين web.xml
تكوين مرشح Struts2 لتعيين جميع طلبات *.
قم بتكوين معلمة السياق param وحدد مسار ملف تكوين الربيع. يمكن الحصول على المعلمات في <context-param> باستخدام servletContext.getInitParameter ("param-name") ؛
تكوين المستمع هو أساسا قراءة ApplicationContext.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.xd <SPAND-NAME> SSH </isplay-name> <lipter> <filter-name> Struts2 </filter-name> <lipter-class> org.apache.struts2 <Url-pattern>*. الإجراء </url-pattern> </filter-mapping> <context-param> <Param-name> contextConfigLocation </param-name> <Param-value> classPath: ApplicationContext.xml </parm-value> <StaNerer-Class> org.springframework.web.context.contextloaderListener </stanker-class> </stanter> <-list-file-list> <lispile-file> index.jsp </iship-file> </self-file-list> </bil-app>
4. تكوين ApplicationContext.xml
تكوين المسح التلقائي لـ repostory و service وغيرها من التعليقات التوضيحية تحت حزمة SSH وإنشاء الفاصوليا المقابلة ؛
تكوين مصدر البيانات (تجمع اتصال JDBC هو C3P0 ، يمكنك الرجوع إلى التكوين التفصيلي لـ C3P0). الوظيفة الرئيسية لمجموعة الاتصال هي توفير الاتصال بسرعة وإعادة استخدامه. لا يتطلب كل دمار وخلق. يتطلب تكوين اسم المستخدم وكلمة المرور والحد الأقصى لعدد الاتصالات والحد الأدنى لعدد الاتصالات والعدد الأولي للاتصالات والمعلمات الأخرى ذات الصلة ؛
تكوين SessionFactory (يمكنك الرجوع إلى التكوين التفصيلي لـ Hibernate ، حيث تقوم بتكوين لتمكين ذاكرة التخزين المؤقت المستوى 2) ، وهي الوظيفة الرئيسية هي توفير جلسة وتنفيذ عبارات SQL ؛ هنا سوف نستخدم Hibernatetemplate لتشغيل قاعدة البيانات لتسهيل التحكم المادي في الربيع ؛ PS ، يجب أيضًا تكوين التعيين بين الفئات وجداول قاعدة البيانات في تكوين السبات ؛
قم بتكوين Bean Manager المعاملات على أنها HibernatetransactionManager ، وتهيئة سمة الأعضاء SessionFactory إلى Bean SessionFactory التي تم تكوينها مسبقًا ؛
قم بتكوين خصائص الانتشار للمعاملة ، وتكوين قسم للإشارة إليه ، وإجراء التحكم في المعاملات لجميع الأحرف والأحواض الفرعية والحذف ، وحفظها ضمن جميع حزم SSH.SERVICE. يمكنك أيضًا تكوين سلوك انتشار المعاملات والمعلمات الأخرى ؛
أخيرًا ، هناك تكوين مخصص يتعلق بـ AOP ، والذي يطبق القسم المخصص "myaop" للتحكم في جميع الطرق التي تبدأ بالاختبارات بموجب ssh.aoptest ، وسيتم التحقق من النتائج لاحقًا ؛
<؟ xmlns: context = "http://www.springframework.org/schema/context" xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: jdbc = "http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/Aop http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/context/spring-context-4.1.xsd "> <! name = "datasource" تدمير method = "elling"> <property name = "driverclass" value = "com.mysql.jdbc.driver" /> <property name = "jdbcurl" value = "jdbc: mysql: // localhost: 3306 /demo name = "quiverIncrement" value = "1"> </property> <property name = "initialPoolSize" value = "80"> </property> <property name = "maxidletime" value = "60" value = "1000"> </property> <property name = "quiveretryattempts" value = "60"> </propect id = "sessionfactory"> <property name = "dataSource" ref = "datasource"/> <property name = "hibernateProperties"> <prop key = "hibernate.dialect"> org.dibernate.dialect.mysqldilect </prop> <prop hibernate.show_sql key = "hibernate.hbm2ddl.auto"> تحديث </prop> <prop key = "current_session_context_class"> مؤشر ترابط </prop> <prop key = "hibernate.cache.use_second_level_cache"> true </prop> <propernate.cache.cache key = "hibernate.cache.region.factory_class"> org.hibernate.cache.ehcache.ehcacheregionfactory </rop> <prop key = "hibernate.cache.use_query_cache"> true </prop> <prop> key = "hibernate.cache.provider_configuration_file_resource_path"> ehcache.xml </prop> </prop> </props> </property> <property name = "mappinglocations"> <list> classpath: ssh/model <list> <value> ssh.model.user </value> </list> </sprention>-> </bean> <!-تكوين مدير المعاملات-> <bean id = "TransactionManager"> <property name = "sessionfactory" ref = "sessionfactory"/> </bean> <! name = "add*" spection = "مطلوبة" read-only = "false" rollack-for = "java.lang.exception"/> <tx: method name = "delete*" spection = "required" read-only = "false flackback-for = "java.lang.exception"/> <tx: method name = "save*" spection = "required" read-rely = "false" rollback-for = "java.lang.exception"/> </tx: attributes> </tx: explive> <aop: config> <a postcut id = ssh.Service ..*.* <aOP: Side ref = "myaop"> <aop: pointcut id = "pcmethodtest" expression = "execution (* ssh.aoptest.test* (..)) </aop: Side> </aop: config> </bans>
5. تكوين Struts.xml
قم بتكوين الهياكل. الثابت في الربيع ، مما يشير إلى أن الإجراء يتم الحصول عليه بواسطة الفول خلال الربيع ؛
قم بتكوين نوع النتيجة إلى "JSON" ، ويمكنك أيضًا تكوين أشياء أخرى. هنا ، لراحة التفاعل بين البيانات الأمامية والخلفية ، تم تكوينها بتنسيق JSON ؛
تكوين اثنين من الإجراءات ، adduser و QueryAlluser ؛
<؟ name = "struts.enable.dynamicMethodInvocation" value = "false" /> <name constant = "struts.devmode" value = "false" /> <package name = "default" extends = "struts-default ، name = "contentType"> text/html </param> </sults> </global-results> <action name = "addUser" method = "adduser">.
6. اكتب الكود ذي الصلة
ملحوظات:
يرث DAO فئة Hibernatedaosupport ، ويتم تشغيل جميع العمليات المتعلقة بقاعدة البيانات بواسطة HibernateTemplate ؛
أضف التعليقات التوضيحية المقابلة إلى طبقة DAO ، وطبقة الخدمة ، والعمل ، والتسجيل كحبوب الربيع ؛
الرمز المرفق كما يلي:
useraction.java
package ssh.action ؛ import java.io.printwriter ؛ import java.util.list ؛ import javax.annotation.resource ؛ import javax.servlet.http.httpservledrequest ؛ import javax.servlet.http.httpservletresponse ؛ import org.log4j.logger ؛ org.apache.struts2.servletactionContext ؛ import org.springframework.stereotype.controller ؛ import ssh.aop.aoptest ؛ استيراد ssh.model.user ؛ استيراد ssh.service.userservice ؛ استيراد com.gon.gson logger.getLogger (userAction.class) ؛ Resource الخاص userverservice uservice ؛ @resource private aoptest aoptest ؛ public void adduser () {printWriter out = null ؛ حاول {httpservletrequest request = servleTactionContext.getRequest () ؛ httpservletresponse استجابة = servleTactionContext.getResponse () ؛ استجابة. حساب string = request.getParameter ("حساب") ؛ اسم السلسلة = request.getParameter ("name") ؛ عنوان السلسلة = request.getParameter ("العنوان") ؛ مستخدم المستخدم = مستخدم جديد () ؛ user.setAccount (حساب) ؛ user.setaddress (العنوان) ؛ user.setName (name) ؛ UserService.add (المستخدم) ؛ out = response.getWriter () ؛ out.write (new gson (). tojson ("النجاح")) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ logger.error (e.getMessage ()) ؛ if (out! = null) out.write (new gson (). tojson ("fail")) ؛ } أخيرًا {out.flush () ؛ out.close () ؛ }} public void QueryAlluser () {printWriter out = null ؛ aoptest.test1 () ؛ aoptest.test2 () ؛ //logger.error("i ") ؛ حاول {httpservletresponse استجابة = servleTactionContext.getResponse () ؛ استجابة. gson gson = new gson () ؛ قائمة <Sether> userList = userService.queryAlluser () ؛ String gsonstr = gson.tojson (userlist) ؛ out = response.getWriter () ؛ out.write (gsonstr) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ logger.error (e.getMessage ()) ؛ if (out! = null) out.write (new gson (). tojson ("fail")) ؛ } أخيرًا {out.flush () ؛ out.close () ؛ }}}aoptest.java
Package Ssh.Aop ؛ public class aoptest {public void test1 () {system.out.println ("Aoptest test1 method تعمل ~") ؛ } public void test2 () {system.out.println ("طريقة اختبار AopTest 2 قيد التشغيل ~") ؛ }}myaop.java
حزمة ssh.aop ؛ الفئة العامة myaop {public void قبل () {system.out.println ("befor ~") ؛ } public void بعد () {system.out.println ("بعد ~") ؛ }}على أساس
package ssh.dao.base ؛ import javax.annotation.resource ؛ استيراد org.hibernate.sessionfactory ؛ استيراد org.springframework.orm.hibernate4 this.SetSessionFactory (SessionFactory) ؛ }}
userdao.java
package ssh.dao ؛ استيراد java.util.arraylist ؛ استيراد java.util.list ؛ استيراد org.springframework.orm.hibernate4.hibernateTemplate ؛ import org.springframework.stereotypy.repository يمتد على أساس {public void add (user user) {this.gethibernateTemplate (). Save (user) ؛ } suppressWarnings ("Unchecked") قائمة عامة <Sether> QueryAlluser () {list <serve> users = new ArrayList <Sether> () ؛ hibernateTemplate hibernateTemplate = this.gethibernateTemplate () ؛ hibernatetemplate.setCacheAqueries (صواب) ؛ المستخدمون = (قائمة <Sether>) hibernatetemplate.find ("من المستخدم") ؛ hibernatetemplate.setCacheAqueries (false) ؛ إرجاع المستخدمين ؛ }}user.java
حزمة ssh.model ؛ استيراد java.io.serializable ؛ مستخدم الفئة العامة ينفذ قابلة للتسلسل { / ** * * / private static static fong serialversionuid = -6190571611246371934l ؛ معرف طويل خاص ؛ حساب سلسلة خاصة ؛ اسم السلسلة الخاصة ؛ عنوان السلسلة الخاص ؛ السلسلة العامة getAccount () {return account ؛ } السلسلة العامة getName () {return name ؛ } السلسلة العامة getAddress () {return address ؛ } public void setAccount (string account) {this.account = account ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } public void setAddress (عنوان السلسلة) {this.address = العنوان ؛ } / ** * regurn the id * / public long getId () {return id ؛ } / ** * @param id المعرف لتعيين * / public void setId (id long) {this.id = id ؛ }}user.hbm.xml
<؟ يتم توزيع جميع مساهمات الطرف الثالث بموجب ترخيص من Red Hat Inc. ~ ~ يتم توفير هذه المواد المحمية بحقوق الطبع والنشر لأي شخص يرغب في استخدام أو تعديل أو نسخ أو إعادة توزيعه وفقًا لشروط وأحكام GNU ~ أقل رخصة عامة عامة ، كما نشرتها مؤسسة البرمجيات المجانية. ~ ~ يتم توزيع هذا البرنامج على أمل أن يكون مفيدًا ، ولكن بدون أي ضمان ؛ دون حتى الضمان الضمني للتجارة ~ أو اللياقة لغرض معين. راجع رخصة GNU Lesser General العامة ~ لمزيد من التفاصيل. ~ ~ يجب أن تكون قد تلقيت نسخة من رخصة GNU Lesser General Public ~ مع هذا التوزيع ؛ إذا لم يكن الأمر كذلك ، فاكتب إلى: ~ Free Software Foundation ، Inc. ~ 51 Franklin Street ، Fifth Floor ~ Boston ، MA 02110-1301 USA-> <! "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <Hibernate-mapping package =" ssh.model "> <class name =" user "table =" user "> <cache usage =" read-write "/> <id name =" id " type = "java.lang.string" column = "account"/> <property name = "name" type = "java.lang.String" column = "name"/> <property name = "address" type = "java.lang.string" column = "address"/> </slass> </hibernate-mapping>
userService.java
package ssh.service ؛ import java.util.list ؛ import javax.annotation.resource ؛ import org.springframework.stereotype.service ؛ import ssh.dao.userdao ؛ import ssh.model.user ؛ servicepublic class {resource userdao userdao = القائمة العامة <Sether> QueryAlluser () {return userDao.queryAlluser () ؛ } public void add (user user) {userDao.add (user) ؛ }}index.jsp (تذكر أن تضيف مكتبة jQuery)
<٪@ page language = "java" contentType = "text/html ؛ charset = utf-8" pageencoding = "utf-8" ٪> <! "http://www.w3. 20px ؛} </style> </head> <body> <div style = "text-align:">> <viv> <silling> الحساب: </label> <input id = "account" type = "text"/> </viv> <div> <blabel> name: </label> <input id = "name" type = "text"/> type = "text"/> </viv> <iv> <button id = "adduser"> إضافة </button> </fire> <h3> قائمة المستخدم: </h3> <ul id = "userlist"> </ul> <script type = "text/javaScript" src = "js/jquery-1.1.1.1.js $ .ajax ({url: 'queryalluser.action' ، النوع: 'post' ، datatype: 'json' ، success: function (data) {try {for (var i = 0 ؛ i <data.length ؛ i ++) {$ ("#userlist"). style = 'color: red'> id = "+data [i] .id+" </span> ، account = "+data [i] .Account+" ، name = "+data [i] .Name+" ، address = "+data [i] .address+" </li>) ؛ }} catch (e) {} ؛ } ، خطأ: function (e) {Alert ("sys error") ؛ }}) ؛ $ ("#adduser"). on ("Click" ، function () {var account = $ ("#account"). val () ؛ var name = $ ("#name"). val () ؛ var address = $ ("#عنوان") } ، الدالة (البيانات) {$ ("#userlist"). }) ؛ }) ؛ </script> </body> </html>7. نتائج التحقق
عد إلى البداية ، ابدأ في التعرف على التقنيات ذات الصلة والتحقق من النتائج
1. بناء بيئة تطوير SSH التقليدية وقم بتشغيلها بنجاح (إدراج ، استعلام)
الشكل التالي: الاستعلام وإضافة المستخدمين بنجاح ؛
2. فهم تكوين تجمع اتصال C3P0
توصيلات قاعدة البيانات هي موارد باهظة الثمن ، وفتح وإغلاق يستهلك الأداء. لذلك ، يمكن إدارتها باستخدام تجمع اتصال ، وتهيئة العديد من الاتصالات وإعادة استخدامها ، بدلاً من إنشاء إغلاق مرارًا وتكرارًا ، وهو يشبه إلى حد ما تجمع الخيوط ؛
التكوين كما يلي. لتكوين الحد الأدنى والحد الأقصى لعدد الاتصالات وفقًا لموقف المشروع الفعلي ، يرجى الرجوع إلى الرابط للمعنى التفصيلي لكل معلمة.
بالإضافة إلى ذلك ، من السهل جدًا التحقق من تكوين رقم الاتصال. يمكنك كتابة برنامج للتحقق منه بنفسك. على سبيل المثال ، عندما يكون الحد الأقصى لعدد الاتصالات هو 10 ، يمكنك كتابة برنامج للتحقق منه. بعد فتح 10 اتصالات ، سيكون الاتصال 11 في حالة انتظار ولا يمكن الحصول عليه. لذلك ، يجب عليك تكوين عدد الاتصالات بشكل معقول وفقًا للموقف ، وإلا فقد يؤثر على أداء التطبيق ؛
<!-دعم مصدر البيانات-> <bean name = "dataSource" تدمير method = "close"> <property name = "driverclass" value = "com.mysql.jdbc.driver" /> <property name = "jdbcurl value = "root"/> <property name = "quiverIncrement" value = "1"> </property> <property name = "initialPoolsize" value = "80" name = "quivereretryDelay" value = "1000"> </premart> <property name = "quiveretryattempts" value = "60"> </propert قائمة المعالجة) -> </ban>
3. فهم ذاكرة التخزين المؤقت الثانوية لإسباتا والتحقق
يشير ذاكرة التخزين المؤقت من المستوى الأول لإسبارنيت إلى ذاكرة التخزين المؤقت على مستوى الجلسة ، والتي يتم تمكينها افتراضيًا. ذاكرة التخزين المؤقت من المستوى الثاني هي ذاكرة التخزين المؤقت للنطاق SessionFactory. عند تكوين SessionFactory ، قمنا بتكوين ذاكرة التخزين المؤقت من المستوى الثاني كـ Ehcache. بعد ذلك ، نتحقق من التأثير والاستعلام عن عملية المستخدم. لقد وجدنا أن الاستعلام الأول سيقوم بتشغيل قاعدة البيانات ، وطباعة بيان SQL ، وبعد تحديث الصفحة ، وجدنا أن الاستعلام كان ناجحًا ولم يتم طباعة بيان SQL. كما هو موضح في الشكل أدناه ، يمكننا أن نرى أن عمل ذاكرة التخزين المؤقت الثانوية على ما يرام ؛
4. فهم تكوين أشياء الربيع والتحقق
مبدأ التحكم في المعاملة هو نفسه ، وهو ضمان الذرة والاتساق والعزلة والمثابرة. عند برمجة JDBC ، يتم التحكم فيها بنفسه. قم بتعيين AutoCommit = false لعدم إرسالها تلقائيًا ، ثم ابدأ في كتابة عمليات قاعدة بيانات محددة. عند حدوث استثناء ، تراجع ، خلاف ذلك ارتكاب ؛ في الواقع ، فإن مبدأ التحكم في Spring on Things متشابه ، ويتم إضافته مع بعض التغليف والتكوين وما إلى ذلك ، وهو أكثر ملاءمة ، مثل التحكم في الطرق المختلفة في طبقة الخدمة ؛
التحقق بسيط للغاية. اكتب عمليتين للإدراج بطريقة على مستوى الخدمة (لاحظ أن اسم الطريقة يجب أن يمتثل للقواعد التي تم تكوينها في ملف تكوين الربيع) ، ورمي استثناء في الوسط ، ثم تنفذه. إذا وجدت أنه يتم إدخال المستخدم الأول بنجاح ، فهذا يعني أن التحكم في المعاملة غير صالح ، وإلا فهو على ما يرام ؛
5. فهم الربيع IOC (حقن التبعية) ، تسليم كائن الحركة (الفول) من Struts2 إلى إدارة الربيع ، والفاصوليا المخصصة ، وما إلى ذلك ، والتحقق من
إذا لاحظت بعناية ، في عملية تكوين ملف ApplicationContext.xml ، فإن العمل الرئيسي هو تكوين المعلومات المتعلقة بالفاصوليا. يتم إنشاء هذه الفاصوليا مسبقا ، ولكن في الواقع ما يسمى الفول هي كائنات ؛
الغرض من تسليم الكائنات إلى حاوية الربيع هو فصلها ؛
بالإضافة إلى ذلك ، عند استخدام الدعامات ، يسجل Spring Action كحبة ، وهو Singleton افتراضيًا. ليس في كل مرة يتم فيها إصدار إجراء جديد أثناء الوصول ، سيكون هناك مخاطر عند الوصول المتزامن ؛
ومع ذلك ، يمكنك تكوين الإجراء في حالات متعددة من خلال Scope = "النموذج الأولي" ؛ ملاحظة: الإجراء في Struts2 هو متعدد الحالات بشكل افتراضي ؛
ملاحظة: يمكن الحصول على الفاصوليا التي تم تكوينها في ApplicationContext.xml ويمكن الحصول على الفاصوليا التي تم تكوينها في التعليقات التوضيحية المخصصة مباشرة أثناء تشغيل البرنامج. من السهل التحقق ، فقط اكتب برنامجًا صغيرًا ؛
6. فهم الربيع AOP (البرمجة الموجهة نحو القسم) ، واكتب وظائف قسم مخصص للتحقق من النتائج
تُستخدم هذه الفكرة في العديد من الأماكن في هذا الشكل من البرمجة المقطعية ، مثل المرشحات ، والتعاون ، والتحكم في المعاملات ، إلخ.
المبدأ هو انعكاس Java والوكيل الديناميكي ، الذي يتحكم في الطريقة قبل التنفيذ وبعده ، ويضيف الرمز الذي تريد تنفيذه ؛
تتم إضافة قسم إلى المثال الصغير ، وقبل وبعد طباعة السلاسل قبل وبعد تنفيذ الطريقة. كما هو موضح في الشكل أدناه ، فإنه يعمل بشكل طبيعي. يرجى الرجوع إلى الجزء السابق من الرمز:
<!-اختبار معالجة AOP المخصص-> <bean id = "aoptest"> </bean> <bean id = "myaop"> </bean> <aop: config proxy-t-arget-class = "true" <aOP: قبل pointcut-ref = "pcmethodtest" method = "قبل"/> <aop: بعد pointcut-ref = "pcmethodtest" method = "بعد"/> </aop: side> </aop: config>
Author مشفر يشبه الرياح
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.