1. สร้างโครงการเว็บใหม่และเพิ่มแพ็คเกจ JAR ในไดเรกทอรี LIB
แพ็คเกจขวดหลัก: แพ็คเกจที่เกี่ยวข้องกับ struts2, mybatis3.3 แพ็คเกจที่เกี่ยวข้อง, mysql-connector-java-5.1.22-bin.jar, gson-2.1.jar
2. กำหนดค่า web.xml เพิ่มตัวกรอง strutspreprepareedexecuteFilter และจัดการคำขอ *.Action ทั้งหมด;
<? 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> ms </display-name> <filter> <filter-name> struts2 </filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter </filter-class> </filter> <url-pattern>*. action </url-pattern> </filter-mapping> <welcome-file-list> <welcome-file> index.jsp </welcome-file>
ตรวจสอบซอร์สโค้ด Dofilter ของตัวกรองนี้และทำสิ่งต่อไปนี้:
1. ตรวจสอบว่า URL ที่ถูกแยกออกโดย struts ถูกตั้งค่าหรือไม่ (struts.action.excludepattern จับคู่โดยนิพจน์ทั่วไป) หากมีและเส้นทางปัจจุบันเป็นไปตามกฎคำขอจะถูกส่งต่อไปยังวัตถุถัดไปในห่วงโซ่ตัวกรองและจะไม่ถูกส่งไปยัง struts2 สำหรับการประมวลผล
if (excludedPatterns! = null && prepay.isurlexcluded (คำขอ, excludedPatterns)) {chain.dofilter (คำขอ, การตอบสนอง);}2. ค้นหา ActionMapping: ค้นหาวิธีการค้นหาวิธีการทำแผนที่ หากไม่พบการร้องขอจะถูกส่งต่อไปยังวัตถุถัดไปในห่วงโซ่ตัวกรองและจะไม่ถูกส่งไปยัง struts2 สำหรับการประมวลผล หากพบ ActionMapping วิธีการทำงานของ ExecuteOperations จะถูกเรียกให้เริ่มดำเนินการ รูปต่อไปนี้เป็นกรณีของการค้นหา actionmapping ตาม URL
3. กำหนดค่าไฟล์ struts.xml การสาธิตนี้ส่วนใหญ่แสดงให้เห็นถึงการส่งข้อมูลรูปแบบ JSON ไปยังส่วนหน้าตั้งค่าประเภทผลลัพธ์เป็นรูปแบบ JSON และแน่นอนว่ามันสามารถตั้งค่าเป็นข้อมูลอื่น ๆ ได้
<? XML เวอร์ชัน = "1.0" การเข้ารหัส = "UTF-8"?> <! Doctype struts สาธารณะ "-// Apache Software Foundation // dtd struts การกำหนดค่า 2.3 // en" "http://struts.apache.org/dtds/struts-2.3.dtd" name = "default" extrem = "struts-default, json-default"> <global-results> <type result = "json"> <param name = "root"> json </param> <param name = "contentType"> text/html </param> name = "queryAllUser" method = "queryAllUser"> <result>. </result> </action> </package> <!-เพิ่มแพ็คเกจที่นี่-> </struts>
4. กำหนดค่า mybatis.xml และ usermapper.xml
กำหนดค่า cacheenabled เป็นแคชระดับ 2 และเปิดใช้งาน
การกำหนดค่าข้อมูลที่เกี่ยวข้องกับแหล่งข้อมูล: ประเภทเป็นแบบฟอร์มการเชื่อมต่อพูลแบบรวมการเชื่อมต่อ PoolMaximumActiveConnections มีจำนวนการเชื่อมต่อที่ใช้งานอยู่ (นั่นคือการใช้งาน) ได้ตลอดเวลาค่าเริ่มต้นคือ: 10
กำหนดค่าการแมปการแมปคลาสเอนทิตี // <mapper resource = "MS/Model/UserMapper.xml"/>
<? XML เวอร์ชัน = "1.0" การเข้ารหัส = "UTF-8"?> <! การกำหนดค่า Doctype สาธารณะ "-// mybatis.org//dtd SQL แผนที่ config 3.0 // en" "http://mybatis.org/dtd/mybatis-3-config.dtd" name = "cacheenabled" value = "true" /> < /settings> <environment default = "การพัฒนา"> <environment id = "การพัฒนา"> <transactionManager type = "jdbc" /> <dataSource type = "pooled"> <property name = "driver" value = "com.mysql.jdbc.driver" /> value = "jdbc: mysql: // localhost: 3306 /demo" /> <property name = "ชื่อผู้ใช้" value = "root" /> <property name = "รหัสผ่าน" value = "admin" /> <property name = "poolmaximumactiveConnections PoolPingQuery "/> </TataSource> </environment> </environments> <mappers> <mapper Resource =" MS/Model/UserMapper.xml "/> </aemappers>
กำหนดค่า usermapper.xml กำหนดค่าแคชเป็น ehcache และพารามิเตอร์ที่เกี่ยวข้องโปรดจำไว้ว่าคลาสเอนทิตีจำเป็นต้องใช้อินเตอร์เฟส serializable
<? xml เวอร์ชัน = "1.0" การเข้ารหัส = "utf-8"?> <! doctype mapper สาธารณะ "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd /> ---> <!-การใช้ Ehcache Cache-> <cache type = "org.mybatis.caches.ehcache.loggingehcache"> <property name = "timetoidleseconds" value = "3600" /> <! value = "3600"/> <!-1 ชั่วโมงหลังจากสร้างแคชเวลาระหว่างวันที่เข้าถึงแคชครั้งล่าสุดจนถึงเวลาหมดอายุ-> <ชื่อคุณสมบัติ = "MaxentriesLocalHeap" value = "1000"/> <property name = "MaxEntRiesLocalDisk" value = "10000000"/> <!-ใหม่-> <insert id = "saveUser" parameterType = "ms.model.user"> แทรกลงในผู้ใช้ (บัญชีชื่อที่อยู่) ค่า ( #{บัญชี}, #{ชื่อ}, #{ที่อยู่}) </select> </ mapper> 5. รหัสคีย์
Dao Layer:
ก่อนอื่นให้สร้างคลาสเพื่อรับ SQLSessionFactory และออกแบบให้เป็นรูปแบบซิงเกิล
แพ็คเกจ ms.dao.base; นำเข้า java.io.ioexception; นำเข้า org.apache.ibatis.io.resources; นำเข้า org.apache.ibatis.session.sqlsessionfactory; นำเข้า org.apache.ibatis.session.sqlsessionformactorybuilder SQLSessionFactory SessionFactory; ส่วนตัว mysessionfactory () {} สาธารณะคงที่แบบคงที่ sqlsessionfactory getSqlSessionFactory () {ถ้า (sessionfactory == null) {ลอง {sessionFactory = ใหม่ sqlsessionFactoryBuilder () สร้าง ส่งคืน SessionFactory; } catch (ioexception e) {logger.getLogger (mysessionfactory.class). error ("ข้อผิดพลาด getsqlsessionfactory"); E.PrintStackTrace (); คืนค่า null; }} else {return sessionFactory; }}}ถัดไปคือ UserDao ซึ่งได้รับ SQLSession ผ่าน OpenSession โปรดทราบว่าการควบคุมธุรกรรมสามารถทำได้ผ่านการกระทำและการย้อนกลับของ SQLSession แน่นอนถ้ามีการดำเนินการ SQL เพียงครั้งเดียวจะไม่มีการควบคุมการทำธุรกรรม (ตัวอย่างนี้เป็นเพียงการสาธิต);
แพ็คเกจ Ms.dao; นำเข้า java.util.arraylist; นำเข้า java.util.list; นำเข้า org.apache.ibatis.session.sqlsession; นำเข้า ms.dao.base.mysessionfactory; นำเข้า ms.model.user; mysessionfactory.getsqlsessionfactory (). opensession (); ลอง {string statement = "usermapper.saveuser"; session.insert (คำสั่ง, ผู้ใช้); session.commit (จริง); } catch (exception e) {session.rollback (จริง); E.PrintStackTrace (); โยนข้อยกเว้นใหม่ ("ข้อผิดพลาดในวิธีเพิ่ม"); } ในที่สุด {session.close (); }} รายการสาธารณะ <user> queryalluser () โยนข้อยกเว้น {sqlsession session = mysessionfactory.getsqlsessionfactory (). opensession (); รายการ <user> ผู้ใช้ = arrayList ใหม่ <user> (); ลอง {string statement = "usermapper.QueryAlluser"; ผู้ใช้ = session.selectList (คำสั่ง 1); session.commit (จริง); } catch (exception e) {session.rollback (จริง); E.PrintStackTrace (); โยนข้อยกเว้นใหม่ ("ข้อผิดพลาดในเมธอด queryalluser"); } ในที่สุด {session.close (); } ผู้ใช้ที่ส่งคืน; - ชั้นบริการ:
รุ่น: ไม่
เลเยอร์การกระทำ:
แปลงเป็นข้อมูลรูปแบบ JSON และกลับไปที่ส่วนหน้า
แพ็คเกจ Ms.Action; นำเข้า java.io.printwriter; นำเข้า java.util.list; นำเข้า javax.servlet.http.httpservletrequest นำเข้า javax.servlet.http.httpservletresponse; org.apache.struts2.servletactionContext; นำเข้า com.google.gson.gson; คลาสสาธารณะ useraction {logger logger = logger.getLogger (useraction.class); Userservice PrivateService userservice = userservice ใหม่ (); โมฆะสาธารณะ 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; ลอง {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 (); -รหัสส่วนหน้า:
<%@ 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>6. ผลการทดสอบ:
struts2 ทำงานตามปกติ;
ทดสอบว่าแคชรองนั้นโอเคและสืบค้นผู้ใช้ทั้งหมดหรือไม่
แบบสอบถามแรก: แคชที่พลาดไปเข้าถึงฐานข้อมูล:
แบบสอบถามหลายครั้งที่สองและถัดไปแคชฮิตไม่มีการเข้าถึงฐานข้อมูล:
@author ผู้เขียนแบบมีลมเหมือนลม
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น