struts2.3.24 + Spring4.1.6 + Hibernate4.3.11 + MySQL5.5.25 การสร้างสภาพแวดล้อมการพัฒนาและคำแนะนำที่เกี่ยวข้อง
1. เป้าหมาย
1. สร้างสภาพแวดล้อมการพัฒนา SSH แบบดั้งเดิมและดำเนินการได้สำเร็จ (แทรก, สอบถาม)
2. เข้าใจการกำหนดค่าของพูลการเชื่อมต่อ C3P0
3. เข้าใจแคชรองของไฮเบอร์เนตและตรวจสอบ
4. เข้าใจการกำหนดค่าของสปริงและตรวจสอบ
5. เข้าใจ IOC ของฤดูใบไม้ผลิ (การฉีดพึ่งพา), ส่งมอบวัตถุแอ็คชั่น (ถั่ว) ของ struts2 ถึงการจัดการฤดูใบไม้ผลิถั่วที่กำหนดเอง ฯลฯ และตรวจสอบ
6. ทำความเข้าใจกับ Spring AOP (การเขียนโปรแกรมที่เน้นส่วน) และเขียนฟังก์ชั่นส่วนที่กำหนดเองเพื่อตรวจสอบผลลัพธ์
2. การเตรียม
สภาพแวดล้อมการพัฒนา: Eclipse สำหรับ Java EE; MySQL5.5.25; JDK1.7.0_79; navicat10.1.7 (ไม่บังคับ);
สร้างการสาธิตฐานข้อมูล:
/*Navicat MySQL Data Transfersource Server: LocalHost_3306Source เวอร์ชันเซิร์ฟเวอร์: 50519Source โฮสต์: LocalHost: 3306Source ฐานข้อมูล: Demotarget Server Type: MySQLTARGET Server: 026- การเข้ารหัส: 02 ------------------------------ โครงสร้างตารางสำหรับ `user`----------------------------- ตารางการวางถ้ามีอยู่` ผู้ใช้ 'สร้างตาราง `ผู้ใช้' (` id` bigint (20) ไม่ใช่ null auto_increment, `varchar 'varchar (200) null) charset = utf8;
สร้างโครงการเว็บใหม่โครงสร้างไดเรกทอรีมีดังนี้:
เตรียมแพ็คเกจ JAR และวางไว้ในไดเรกทอรี Web-Inf LIB (หากคุณสนใจคุณสามารถใช้ Maven เพื่อจัดการกระบวนการ แต่บางครั้งก็ช้ามากที่จะดาวน์โหลดแพ็คเกจ JAR ... )
แพ็คเกจขวดที่เกี่ยวข้องสามารถพบได้ใน Struts, Spring และ Hibernate ที่ดาวน์โหลด นี่คือข้อมูลอ้างอิง บางส่วนสามารถลบได้เช่นแพ็คเกจขวดในส่วน MVC ฤดูใบไม้ผลิ:
3. กำหนดค่า web.xml
กำหนดค่าตัวกรอง struts2 เพื่อแมปคำขอ *.Action ทั้งหมดและได้รับการจัดการโดยวัตถุ strutspreprepareedexecuteFilter;
กำหนดค่าพารามิเตอร์บริบทของพารามิเตอร์และระบุเส้นทางของไฟล์การกำหนดค่าสปริง สามารถรับพารามิเตอร์ใน <บริบท param> ได้โดยใช้ servletContext.getInitParameter ("param-name");
การกำหนดค่าผู้ฟังส่วนใหญ่จะอ่านข้อมูลไฟล์การกำหนดค่า ApplicationContext.xml สร้างถั่วและงานเริ่มต้นอื่น ๆ
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <web-app xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://java.sun.com/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 <plill-Name> SSH </display-Name> <Filter> <filter-Name> struts2 </filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter </filter-class> <url-pattern>*. action </url-pattern> </filter-mapping> <context-param> <param-name> contextConfigLocation </param-name> <param-value> classpath: ApplicationContext.xml </param-value> <Sistener-Lass> org.springframework.web.context.contextloaderlistener </listener-class> </listener> <welcome-file-list> <welcome-file> index.jsp </welcome-file>
4. กำหนดค่า ApplicationContext.xml
กำหนดค่าการสแกนอัตโนมัติของ @repostory, @Service และคำอธิบายประกอบอื่น ๆ ภายใต้แพ็คเกจ SSH และสร้างถั่วที่สอดคล้องกัน
กำหนดค่าแหล่งข้อมูล (พูลการเชื่อมต่อ JDBC คือ C3P0 คุณสามารถอ้างถึงการกำหนดค่าโดยละเอียดของ C3P0) ฟังก์ชั่นหลักของกลุ่มการเชื่อมต่อคือการให้การเชื่อมต่ออย่างรวดเร็วและนำกลับมาใช้ใหม่ ไม่ต้องการการทำลายและการสร้างแต่ละครั้ง ต้องมีการกำหนดค่าชื่อผู้ใช้รหัสผ่านจำนวนการเชื่อมต่อสูงสุดจำนวนการเชื่อมต่อขั้นต่ำจำนวนการเชื่อมต่อเริ่มต้นและพารามิเตอร์อื่น ๆ ที่เกี่ยวข้อง
กำหนดค่า SessionFactory (คุณสามารถอ้างถึงการกำหนดค่าโดยละเอียดของไฮเบอร์เนตซึ่งคุณกำหนดค่าเพื่อเปิดใช้งานแคชระดับ 2) ฟังก์ชั่นหลักคือการจัดเตรียมเซสชันและดำเนินการคำสั่ง SQL; ที่นี่เราจะใช้ hibernatetemplate เพื่อใช้งานฐานข้อมูลเพื่ออำนวยความสะดวกในการควบคุมทางกายภาพของสปริง PS ควรกำหนดค่าการแมประหว่างคลาสและตารางฐานข้อมูลในการกำหนดค่าไฮเบอร์เนต
กำหนดค่าตัวจัดการธุรกรรม Bean เป็น hibernatetransactionmanager และเริ่มต้นแอตทริบิวต์สมาชิก SessionFactory ไปยังถั่ว SessionFactory ที่กำหนดค่าไว้ก่อนหน้านี้
กำหนดค่าลักษณะการแพร่กระจายของธุรกรรมและกำหนดค่าส่วนเพื่ออ้างถึงและดำเนินการควบคุมธุรกรรมของการเพิ่มลบอัปเดตและบันทึกวิธีการทั้งหมดภายใต้แพ็คเกจ SSH.Service ทั้งหมดและแพคเกจย่อย คุณยังสามารถกำหนดค่าพฤติกรรมการแพร่กระจายธุรกรรมและพารามิเตอร์อื่น ๆ
ในที่สุดมีการกำหนดค่าที่เกี่ยวข้องกับ AOP ที่กำหนดเองซึ่งใช้ส่วนที่กำหนดเอง 'MYAOP' เพื่อควบคุมวิธีการทั้งหมดเริ่มต้นด้วยการทดสอบภายใต้ SSH.AOP.AOPTEST และผลลัพธ์จะได้รับการตรวจสอบในภายหลัง
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: p = "http://ww.springframework xmlns: context = "http://www.springframework.org/schema/context" xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: xsi = "http:/ http:/ xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: jdbc = "http://www.springframework.org/schema/jdbc" Xsi: schemalocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans http://www.springframework.org/schema/aop http:/ http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://ww.springframework.org/schema http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc/spring-jdbc/spring-jdbc http://www.springframework.org/schema/context/spring-context-4.1.xsd "> <!-สแกน classpath สำหรับส่วนประกอบที่มีคำอธิบายประกอบ (รวมถึง @repostory และ @Service name = "dataSource" destroy-method = "close"> <property name = "driverclass" value = "com.mysql.jdbc.driver" /> <property name = "jdbcurl" value = "jdbc: mysql: // localhost: 3306 /demo" /> name = "AcquireIncrement" value = "1"> </คุณสมบัติ> <property name = "InitialPoolSize" value = "80"> </คุณสมบัติ> <property name = "maxidLetime" value = "60"> </คุณสมบัติ> <property name = "maxPoolSize" value = "80"> value = "1000"> </property> <property name = "acquireeretretempts" value = "60"> </คุณสมบัติ> <property name = "breakafteracquirefailure" value = "false"> </property> <!-หากการเชื่อมต่อมากเกินไป <bean id = "sessionfactory"> <property name = "dataSource" ref = "dataSource"/> <property name = "hibernateProperties"> <prop key = "hibernate.dialect"> org.hibernate.dialect.mysqldialect </prop> key = "hibernate.hbm2ddl.auto"> อัปเดต </prop> <prop key = "current_session_context_class"> เธรด </prop> <prop key = "hibernate.cache.use_second_level_cache"> true </prop> key = "hibernate.cache.region.factory_class"> org.hibernate.cache.ehcache.ehcacheregionfactory </prop> <prop key = "hibernate.cache.use_query_cache"> True </prop> <prop key = "hibernate.cache.provider_configuration_file_resource_path"> ehcache.xml </prop> </prop> </props> </คุณสมบัติ> <property name = "MappingLocations" NAME = "AnnotatedClasses"> <list> <value> SSH.Model.User </value> </list> </property>-> </ebean> <!-การกำหนดค่าผู้จัดการธุรกรรม-> <Bean ID = "TransactionManager"> <property name = "sessionFactory <tx: แอตทริบิวต์> <tx: method name = "เพิ่ม*" การแพร่กระจาย = "จำเป็น" read-only = "false" rollback-for = "java.lang.exception"/> <tx: method name = "delete*" การแพร่กระจาย = "จำเป็น" Read-only = "False" Rollback-for = "java.lang.exception"/> <tx: method name = "save*" การแพร่กระจาย = "จำเป็น" read-only = "false" rollback-for = "java.lang.exception"/> </tx: attributes> </tx: คำแนะนำ> ssh.service ..*.*(.. )) "/> <aop: ที่ปรึกษา pointcut-ref =" pcmethod "คำแนะนำ-ref =" txadvice "/> </aop: config> <! <aop: ref = "myaop"> <aop: pointcut id = "pcmethodtest" expression = "การดำเนินการ (* ssh.aop.aoptest.test* (.. ))"/> <aop: ก่อน pointcut-ref = "pcmethodtest" </aop: แง่มุม> </aop: config> </ beans>
5. กำหนดค่า struts.xml
กำหนดค่าโครงสร้างค่าคงที่ของวัตถุประสงค์เพื่อสปริงแสดงให้เห็นว่าการกระทำนั้นได้มาจากถั่วจนถึงฤดูใบไม้ผลิ
กำหนดค่าประเภทผลลัพธ์เป็น "JSON" และคุณสามารถกำหนดค่าสิ่งอื่น ๆ ได้ ที่นี่เพื่อความสะดวกของการโต้ตอบกับข้อมูลส่วนหน้าและส่วนหลังมันถูกกำหนดค่าในรูปแบบ JSON;
กำหนดค่าการกระทำสองอย่าง Adduser และ QueryAlluser;
<? xml version = "1.0" encoding = "utf-8"?> <! doctype struts สาธารณะ "-// Apache ซอฟต์แวร์ Foundation // dtd struts การกำหนดค่า 2.3 // en" "http://struts.apache.org/dtds/struts-2.3.dtd" name = "struts.enable.dynamicmethodinVocation" value = "false" /> <constant name = "struts.devmode" value = "false" /> <package name = "default" ขยาย = "struts-default, json-default" name = "contentType"> text/html </param> </result> </global-results> <action name = "adduser" method = "adduser"> <results>. </result> </action> <action name = "queryAlluser" method = "queryAlluser">
6. เขียนรหัสที่เกี่ยวข้อง
หมายเหตุ:
DAO สืบทอดคลาส HibernatedaoSupport และการดำเนินการที่เกี่ยวข้องกับฐานข้อมูลทั้งหมดดำเนินการโดย hibernatetemplate;
เพิ่มคำอธิบายประกอบที่สอดคล้องกันในชั้น DAO, ชั้นบริการและการกระทำและลงทะเบียนเป็นถั่วฤดูใบไม้ผลิ;
รหัสที่แนบมามีดังนี้:
useraction.java
แพ็คเกจ ssh.action; นำเข้า java.io.printwriter; นำเข้า java.util.list; นำเข้า javax.annotation.resource; นำเข้า javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletresponse; org.apache.struts2.servletactionContext; นำเข้า org.springframework.stereotype.controller; นำเข้า ssh.aop.aoptest; นำเข้า ssh.model.user; นำเข้า ssh.service.userservice; logger.getLogger (useraction.class); @Resource ผู้ใช้ส่วนตัวผู้ใช้บริการ; @Resource ส่วนตัว AOPTEST AOPTEST; โมฆะสาธารณะ Adduser () {PrintWriter out = null; ลอง {httpservletRequest request = servletactionContext.getRequest (); httpservletResponse response = servletactionContext.getResponse (); Response.setContentType ("ข้อความ/html; charset = utf-8"); บัญชีสตริง = request.getParameter ("บัญชี"); ชื่อสตริง = request.getParameter ("ชื่อ"); String address = request.getParameter ("ที่อยู่"); ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ (); user.setAccount (บัญชี); user.setAddress (ที่อยู่); user.setName (ชื่อ); userservice.add (ผู้ใช้); out = response.getWriter (); out.write (new gson (). tojson ("ความสำเร็จ")); } catch (exception e) {e.printstacktrace (); logger.error (e.getMessage ()); ถ้า (ออก! = null) out.write (new gson (). tojson ("ล้มเหลว")); } ในที่สุด {out.flush (); out.close (); }} โมฆะสาธารณะ QueryAllUser () {PrintWriter out = null; aoptest.test1 (); aoptest.test2 (); //logger.error("i "); ลอง {httpservletResponse response = servletactionContext.getResponse (); Response.setContentType ("ข้อความ/html; charset = utf-8"); GSON GSON = New GSON (); รายการ <user> userlist = userservice.QueryAllUser (); String gsonstr = gson.tojson (userlist); out = response.getWriter (); out.write (gsonstr); } catch (exception e) {e.printstacktrace (); logger.error (e.getMessage ()); ถ้า (ออก! = null) out.write (new gson (). tojson ("ล้มเหลว")); } ในที่สุด {out.flush (); out.close (); -aoptest.java
แพ็คเกจ ssh.aop; คลาสสาธารณะ aoptest {public void test1 () {system.out.println ("วิธีการทดสอบ AOPTEST 1 กำลังทำงาน ~"); } โมฆะสาธารณะ test2 () {system.out.println ("วิธีการทดสอบ AOPTest Test2 กำลังทำงาน ~"); -myaop.java
แพ็คเกจ ssh.aop; คลาสสาธารณะ myaop {โมฆะสาธารณะก่อน () {system.out.println ("befor ~"); } โมฆะสาธารณะหลังจาก () {System.out.println ("After ~"); -basedao.java
แพ็คเกจ ssh.dao.base; นำเข้า Javax.annotation.resource; นำเข้า org.hibernate.sessionfactory; นำเข้า org.springframework.orm.hibernate4.support.hibernatedaosupport; this.setsessionfactory (SessionFactory); -
userdao.java
แพ็คเกจ ssh.dao; นำเข้า java.util.arraylist; นำเข้า java.util.list; นำเข้า org.springframework.orm.hibernate4.hibernatetemplate; นำเข้า org.springframework.stereotype.Repository; UserDao ขยาย Agemase {โมฆะสาธารณะเพิ่ม (ผู้ใช้ผู้ใช้) {this.getHiberNateTemplate (). บันทึก (ผู้ใช้); } @suppresswarnings ("ไม่ได้ตรวจสอบ") รายการสาธารณะ <user> queryAlluser () {รายการ <ผู้ใช้> ผู้ใช้ = ใหม่ ArrayList <ผู้ใช้> (); hibernatetemplate hibernatetemplate = this.getHibernatetemplate (); Hibernatetemplate.SetCachequeries (จริง); ผู้ใช้ = (รายการ <user>) hibernatetemplate.find ("จากผู้ใช้"); Hibernatetemplate.SetCachequeries (เท็จ); ผู้ใช้ที่ส่งคืน; -user.java
แพ็คเกจ ssh.model; นำเข้า java.io.serializable; ผู้ใช้ระดับสาธารณะใช้ serializable { / ** * * / ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = -6190571611246371934L; ID ยาวส่วนตัว; บัญชีสตริงส่วนตัว ชื่อสตริงส่วนตัว; ที่อยู่สตริงส่วนตัว สตริงสาธารณะ getAccount () {บัญชีส่งคืน; } สตริงสาธารณะ getName () {ชื่อคืน; } สตริงสาธารณะ getAddress () {return address; } โมฆะสาธารณะ setAccount (บัญชีสตริง) {this.account = บัญชี; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } โมฆะสาธารณะ setAddress (ที่อยู่สตริง) {this.address = ที่อยู่; } / ** * @return id * / สาธารณะ Long getId () {return id; } / ** * @param id รหัสที่จะตั้งค่า * / โมฆะสาธารณะ setId (id ยาว) {this.id = id; -user.hbm.xml
<? xml version = "1.0"?> <!-~ hibernate, การคงอยู่เชิงสัมพันธ์สำหรับสำนวน Java ~ ~ ลิขสิทธิ์ (c) 2010, Red Hat Inc. หรือผู้สนับสนุนบุคคลที่สามตามที่ระบุโดยแท็ก @author หรือแอตทริบิวต์ลิขสิทธิ์ การมีส่วนร่วมของบุคคลที่สามทั้งหมดได้รับการแจกจ่ายภายใต้ใบอนุญาตโดย Red Hat Inc. ~ ~ วัสดุที่มีลิขสิทธิ์นี้จัดทำขึ้นสำหรับทุกคนที่ต้องการใช้แก้ไข ~ คัดลอกหรือแจกจ่ายซ้ำตามข้อกำหนดและเงื่อนไขของใบอนุญาตสาธารณะทั่วไปที่เผยแพร่โดยมูลนิธิซอฟต์แวร์ฟรี ~ ~ โปรแกรมนี้มีการแจกจ่ายด้วยความหวังว่ามันจะเป็นประโยชน์ ~ แต่ไม่มีการรับประกันใด ๆ โดยไม่มีการรับประกันโดยนัยเกี่ยวกับการค้า ~ หรือความเหมาะสมสำหรับวัตถุประสงค์เฉพาะ ดูใบอนุญาตสาธารณะ GNU Lesser ทั่วไป ~ สำหรับรายละเอียดเพิ่มเติม ~ ~ คุณควรได้รับสำเนาใบอนุญาตสาธารณะ GNU Lesser ทั่วไป ~ พร้อมกับการแจกจ่ายนี้ ถ้าไม่เขียนถึง: ~ Free Software Foundation, Inc. ~ 51 Franklin Street, Fifth Floor ~ Boston, MA 02110-1301 USA-> <! Doctype Hibernate-Mapping สาธารณะ "-// Hibernate/Hibernate Mapping DTD 3.0 // en" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> package hibernate-mapping =" ssh.model "> <class name =" user "table =" ผู้ใช้ "> <cache usage =" read-write " type = "java.lang.string" คอลัมน์ = "บัญชี"/> <property name = "name" type = "java.lang.string" คอลัมน์ = "name"/> <property name = "address" type = "java.lang.string" คอลัมน์ = "ที่อยู่"/>
userservice.java
แพ็คเกจ ssh.service; นำเข้า java.util.list; นำเข้า Javax.annotation.resource; นำเข้า org.springframework.stereotype.service; นำเข้า ssh.dao.userdao; นำเข้า ssh.model.user; @ServicePublic รายการสาธารณะ <user> queryalluser () {return userdao.QueryAlluser (); } โมฆะสาธารณะเพิ่ม (ผู้ใช้ผู้ใช้) {userdao.add (ผู้ใช้); -index.jsp (อย่าลืมเพิ่มไลบรารี jQuery)
<%@ page language = "java" contentType = "ข้อความ/html; charset = utf-8" pageencoding = "utf-8"%> <! doctype html สาธารณะ "-// w3c // dtd html 4.01 transitional // en" "http://www.w3.org/tr/html4/loose.dtd"><html><head> <meta http-equiv =" content-type "content =" text/html; charset = utf-8 " 20px;} </style> </head> <body> <div style = "text-allign: center;"> <div> <dable> บัญชี: </label> <อินพุต id = "บัญชี" type = "text"/> </div> <divel type = "text"/> </div> <div> <button id = "adduser"> เพิ่ม </button> </div> <h3> รายการผู้ใช้: </h3> <ul id = "userlist"> </ul> <script type = "text/javascript" src = "js/jQuery url: 'queryalluser.action', พิมพ์: 'โพสต์', ข้อมูล: 'json', ความสำเร็จ: ฟังก์ชั่น (ข้อมูล) {ลอง {สำหรับ (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) {}; }, ข้อผิดพลาด: ฟังก์ชั่น (e) {แจ้งเตือน ("ข้อผิดพลาด SYS"); - $ ("#adduser"). on ("คลิก", function () {var account = $ ("#account"). val (); var name = $ ("#name"). val (); var address = $ ("#address"). val (); $. ajax ({url: }, ความสำเร็จ: ฟังก์ชั่น (ข้อมูล) {ลอง {$ ("#userlist"). ภาคผนวก ("<li> บัญชี ="+บัญชี ", name ="+name+", address ="+ที่อยู่+"</li>"); - }); </script> </body> </html>7. ผลการตรวจสอบ
ย้อนกลับไปที่จุดเริ่มต้นเริ่มทำความคุ้นเคยกับเทคโนโลยีที่เกี่ยวข้องและตรวจสอบผลลัพธ์
1. สร้างสภาพแวดล้อมการพัฒนา SSH แบบดั้งเดิมและดำเนินการได้สำเร็จ (แทรก, สอบถาม)
รูปต่อไปนี้: แบบสอบถามและเพิ่มผู้ใช้สำเร็จ
2. เข้าใจการกำหนดค่าของพูลการเชื่อมต่อ C3P0
การเชื่อมต่อฐานข้อมูลเป็นทรัพยากรที่มีราคาแพงและการเปิดและปิดใช้ประสิทธิภาพ ดังนั้นพวกเขาสามารถจัดการกับพูลการเชื่อมต่อเริ่มต้นการเชื่อมต่อหลายครั้งและนำกลับมาใช้ใหม่แทนที่จะสร้างการปิดซ้ำ ๆ ซึ่งคล้ายกับพูลเธรด
การกำหนดค่ามีดังนี้ หากต้องการกำหนดค่าการเชื่อมต่อขั้นต่ำและสูงสุดอย่างสมเหตุสมผลตามสถานการณ์โครงการจริงโปรดดูลิงค์สำหรับความหมายโดยละเอียดของแต่ละพารามิเตอร์
นอกจากนี้ยังง่ายมากในการตรวจสอบการกำหนดค่าหมายเลขการเชื่อมต่อ คุณสามารถเขียนโปรแกรมเพื่อยืนยันด้วยตัวเอง ตัวอย่างเช่นเมื่อจำนวนการเชื่อมต่อสูงสุดคือ 10 คุณสามารถเขียนโปรแกรมเพื่อตรวจสอบได้ หลังจากเปิดการเชื่อมต่อ 10 ครั้งการเชื่อมต่อที่ 11 จะอยู่ในสถานะรอและไม่สามารถรับได้ ดังนั้นคุณต้องกำหนดค่าจำนวนการเชื่อมต่ออย่างสมเหตุสมผลตามสถานการณ์มิฉะนั้นอาจส่งผลกระทบต่อประสิทธิภาพของแอปพลิเคชัน
<!-แหล่งข้อมูลสนับสนุน-> <bean name = "dataSource" destroy-method = "close"> <property name = "driverclass" value = "com.mysql.jdbc.driver" /> <property name = "jdbcurl" value "jdbc: mysql: // localhost: 3306 /demo" /> value = "root"/> <property name = "AcquireIncrement" value = "1"> </คุณสมบัติ> <property name = "InitialPoolSize" value = "80"> </property> <property name = "MaxidLetime" value = "60"> </property> <property name = "MaxPoolSize name = "acquireeretryDelay" value = "1000"> </property> <property name = "acquireeretretempts" value = "60"> </property> <property name = "breakafteracquirefailure" value = "false"> </property> <! ProcessList) -> </ebean>
3. เข้าใจแคชรองของไฮเบอร์เนตและตรวจสอบ
แคชระดับแรกของไฮเบอร์เนตหมายถึงแคชทั่วทั้งเซสชันซึ่งเปิดใช้งานโดยค่าเริ่มต้น แคชระดับที่สองคือแคชช่วง SessionFactory เมื่อกำหนดค่า SessionFactory เราได้กำหนดค่าแคชระดับที่สองเป็น ehcache ต่อไปเราตรวจสอบผลกระทบและสอบถามการทำงานของผู้ใช้ เราพบว่าแบบสอบถามแรกจะใช้งานฐานข้อมูลพิมพ์คำสั่ง SQL และหลังจากรีเฟรชหน้าเราพบว่าแบบสอบถามประสบความสำเร็จและไม่มีการพิมพ์คำสั่ง SQL ดังที่แสดงในรูปด้านล่างเราจะเห็นว่างานแคชรองนั้นโอเค;
4. เข้าใจการกำหนดค่าของสปริงและตรวจสอบ
หลักการควบคุมการทำธุรกรรมที่เรียกว่าเหมือนกันซึ่งก็คือเพื่อให้แน่ใจว่าอะตอมความสอดคล้องความโดดเดี่ยวและการคงอยู่ เมื่อเขียนโปรแกรม JDBC มันจะถูกควบคุมด้วยตัวเอง ตั้งค่า autocommit = false เพื่อไม่ส่งโดยอัตโนมัติจากนั้นเริ่มเขียนการดำเนินการฐานข้อมูลเฉพาะ เมื่อมีข้อยกเว้นเกิดขึ้นให้ย้อนกลับมิฉะนั้นจะกระทำ; ในความเป็นจริงหลักการควบคุมของสปริงในสิ่งที่คล้ายกันและมีการเพิ่มด้วยบรรจุภัณฑ์การกำหนดค่า ฯลฯ ซึ่งสะดวกกว่าเช่นการควบคุมวิธีการต่าง ๆ ในชั้นบริการ
การตรวจสอบนั้นง่ายมาก เขียนการดำเนินการแทรกสองครั้งในวิธีการที่ระดับบริการ (โปรดทราบว่าชื่อวิธีจะต้องปฏิบัติตามกฎที่กำหนดค่าในไฟล์การกำหนดค่าสปริง) โยนข้อยกเว้นตรงกลางแล้วดำเนินการ หากคุณพบว่าผู้ใช้รายแรกได้รับการแทรกสำเร็จก็หมายความว่าการควบคุมการทำธุรกรรมนั้นไม่ถูกต้องมิฉะนั้นก็โอเค
5. เข้าใจ IOC ของฤดูใบไม้ผลิ (การฉีดพึ่งพา), ส่งมอบวัตถุแอ็คชั่น (ถั่ว) ของ struts2 ถึงการจัดการฤดูใบไม้ผลิถั่วที่กำหนดเอง ฯลฯ และตรวจสอบ
หากคุณสังเกตอย่างรอบคอบในกระบวนการกำหนดค่าไฟล์ ApplicationContext.xml งานหลักคือการกำหนดค่าข้อมูลที่เกี่ยวข้องกับถั่ว ถั่วเหล่านี้ถูกสร้างขึ้นล่วงหน้า แต่ในความเป็นจริงถั่วที่เรียกว่าเป็นวัตถุ
จุดประสงค์ของการส่งมอบวัตถุไปยังภาชนะสปริงคือการแยกตัวออก
นอกจากนี้เมื่อใช้ struts สปริงลงทะเบียนการกระทำเป็นถั่วซึ่งเป็นซิงเกิลตันโดยค่าเริ่มต้น ไม่ใช่ทุกครั้งที่มีการดำเนินการใหม่ในระหว่างการเข้าถึงจะมีความเสี่ยงเมื่อการเข้าถึงพร้อมกัน
อย่างไรก็ตามคุณสามารถกำหนดค่าการดำเนินการเป็นหลายกรณีผ่าน prope = "prototype"; PS: การกระทำใน struts2 เป็นหลายกรณีโดยค่าเริ่มต้น;
หมายเหตุ: ถั่วที่กำหนดค่าใน ApplicationContext.xml และถั่วที่กำหนดค่าในคำอธิบายประกอบแบบกำหนดเองสามารถรับได้โดยตรงระหว่างการทำงานของโปรแกรม นี่เป็นเรื่องง่ายที่จะตรวจสอบเพียงแค่เขียนโปรแกรมเล็ก ๆ
6. ทำความเข้าใจกับ Spring AOP (การเขียนโปรแกรมที่เน้นส่วน) และเขียนฟังก์ชั่นส่วนที่กำหนดเองเพื่อตรวจสอบผลลัพธ์
ความคิดนี้ใช้ในหลาย ๆ ที่ในรูปแบบของการเขียนโปรแกรมแบบแยกส่วนเช่นตัวกรองตัวดักจับการควบคุมธุรกรรม ฯลฯ
หลักการคือ Java Reflection และ Dynamic Proxy ซึ่งควบคุมวิธีการก่อนและหลังการดำเนินการและเพิ่มรหัสที่คุณต้องการดำเนินการ
ส่วนจะถูกเพิ่มลงในตัวอย่างเล็ก ๆ และก่อนและหลังสตริงจะถูกพิมพ์ก่อนและหลังวิธีการถูกดำเนินการ ดังที่แสดงในรูปด้านล่างมันทำงานได้ตามปกติ โปรดดูส่วนก่อนหน้าของรหัส:
<!-การทดสอบการประมวลผล AOP ที่กำหนดเอง-> <bean id = "aoptest"> </epean> <bean id = "myaop"> </ebean> <aop: config proxy-target-class = "true"> <aop: ref = "myaop"> <aop: pointcut id = "pcmethodtest ssh.aop.aoptest.test*(.. )) "/> <aop: ก่อน pointcut-ref =" pcmethodtest "method =" ก่อน "/> <aop: หลังจาก pointcut-ref =" pcmethodtest "method =" หลังจาก "/> </aop
@author ผู้เขียนแบบมีลมเหมือนลม
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น