คำนำ
SSH ไม่ใช่เฟรมเวิร์ก แต่เป็นการรวมกรอบหลายเฟรม (struts+สปริง+ไฮเบอร์เนต) ปัจจุบันเป็นกรอบการรวมโอเพนซอร์สยอดนิยมสำหรับเว็บแอปพลิเคชันที่ใช้ในการสร้างเว็บแอปพลิเคชันหลายชั้นที่ยืดหยุ่นและง่ายต่อการปรับขนาด
ระบบที่รวมกรอบ SSH แบ่งออกเป็นสี่เลเยอร์ในแง่ของความรับผิดชอบ: เลเยอร์การนำเสนอเลเยอร์ลอจิกธุรกิจเลเยอร์การคงอยู่ของข้อมูลและเลเยอร์โมดูลโดเมน (เลเยอร์เอนทิตี)
ในฐานะที่เป็นโครงสร้างพื้นฐานโดยรวมของระบบ Struts มีหน้าที่แยก MVC ในส่วนของโมเดลของกรอบ Struts มันควบคุมการกระโดดของธุรกิจและใช้กรอบการทำงาน Hibernate เพื่อให้การสนับสนุนสำหรับเลเยอร์การคงอยู่ ในอีกด้านหนึ่งฤดูใบไม้ผลิเป็นภาชนะ IOC ที่มีน้ำหนักเบารับผิดชอบในการค้นหาการวางตำแหน่งการสร้างและการจัดการการพึ่งพาระหว่างวัตถุและวัตถุและในทางกลับกันมันสามารถทำให้ struts และ hibernate ทำงานได้ดีขึ้น
ใช้ MyECLIPSE เพื่อรวมกรอบ SSH สามอันหลัก ๆ และใช้การสาธิตที่จำลองการลงทะเบียนผู้ใช้ซึ่งสอดคล้องกับเวอร์ชัน:
struts เวอร์ชัน: 2.1;
สปริงเวอร์ชัน: 3.1;
รุ่นไฮเบอร์เนต: 3.3;
1. การเตรียมการก่อนการรวม
1. สร้างโครงการเว็บดังนี้:
หมายเหตุ: ชื่อแพ็คเกจที่รองรับการกระทำจะต้องเป็น "การกระทำ" และคลาสแอ็คชั่นจะต้องจบลงด้วยการกระทำนั่นคือแบบฟอร์มเป็นเหมือน xxxaction ดังที่แสดงในรูปด้านบน
2. สร้างฐานข้อมูลและตาราง:
สร้างฐานข้อมูล sshdemo; สร้างตาราง t_user (รหัสหลัก ID int, ชื่อผู้ใช้ Varchar (10), รหัสผ่าน varchar (20))
3. นำเข้าแพ็คเกจการเชื่อมต่อฐานข้อมูล C3P0JAR คลิกเพื่อดาวน์โหลด:
C3P0-0.9.2-pre1.jar, mysql-connector-java-5.1.13-bin.jar
2. การกำหนดค่าของกรอบ Struts:
1. เลือกโครงการและคลิกขวาเพื่อเลือก: myeclipse -> facets โครงการ [ความสามารถ] -> ติดตั้ง apache struts (2.x) facet ดังต่อไปนี้:
2. เลือกเวอร์ชันที่นี่ฉันเลือก 2.1 คลิก "เสร็จสิ้น" ดังนี้:
3. หลังจากทำตามขั้นตอนข้างต้นเสร็จแล้วคุณจะพบว่ามีไฟล์ struts.xml พิเศษในไดเรกทอรี SRC พร้อมเนื้อหาต่อไปนี้:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <! doctype struts สาธารณะ "-// Apache Software Foundation // dtd struts การกำหนดค่า 2.1 // en" "http://struts.apache.org/dtds/struts-2.1.dtd"
4. ในไฟล์ web.xml ในไดเรกทอรี web-inf มีส่วนเพิ่มเติมของรหัสการกำหนดค่าสำหรับตัวกรอง struts ดังต่อไปนี้:
5. อ้างถึงรูปด้านบนแก้ไข *.Action เป็น "/ *" และ เฟรมเวิร์ก Struts ได้รับการกำหนดค่า ณ จุดนี้
3. การกำหนดค่า Framework Spring:
1. อ้างถึงการกำหนดค่าของ struts เลือกโครงการคลิกขวาและเลือก: myeclipse -> facets โครงการ [ความสามารถ] -> ติดตั้ง facet ฤดูใบไม้ผลิเลือกเวอร์ชันและเลือก 3.1 ดังนี้:
2. คลิก "เสร็จสิ้น" และคุณจะพบว่ามีไฟล์ ApplicationContext.xml ในไดเรกทอรี SRC ไฟล์ Spring-Form.TLD และ Spring.TLD ในไดเรกทอรี Web-Inf และรหัสชิ้นส่วนที่เกี่ยวข้องกับการกำหนดค่าสปริงจะถูกเพิ่มในไฟล์ web.xml การก่อสร้างกรอบฤดูใบไม้ผลินั้นเสร็จสมบูรณ์โดยทั่วไป (การแนะนำของเนมสเปซจะถูกกล่าวถึงในภายหลัง) ดังที่แสดงด้านล่าง:
4. การกำหนดค่าของ Hibernate Framework:
1. อ้างถึงการกำหนดค่า Struts เลือกโครงการคลิกขวาและเลือก: Myeclipse -> facets โครงการ [ความสามารถ] -> ติดตั้ง HibernateFacet เลือกเวอร์ชันและเลือก 3.3 ที่นี่ดังนี้:
2. คลิก "เสร็จสิ้น" และคุณจะพบว่ามีแพ็คเกจเริ่มต้นเพิ่มเติมในไดเรกทอรี SRC (สามารถลบได้) และส่วนหนึ่งของรหัสในไฟล์ web.xml (จะถูกกำหนดค่าใหม่ในภายหลัง) ดังที่แสดงด้านล่าง:
3. นำเข้าแพ็คเกจ JAR ที่รองรับคำอธิบายประกอบ "@Entity": เลือกโครงการคลิกขวาที่จะเลือก: myeclipse -> facets โครงการ [ความสามารถ] -> จัดการ ... แล้วทำตามขั้นตอนในรูปต่อไปนี้:
หลังจากทำตามขั้นตอนข้างต้นเสร็จแล้วสามเฟรมเวิร์กหลักจะถูกสร้างขึ้นโดยทั่วไปแล้วพวกเขาจะถูกรวมเข้าด้วยกัน
5. การรวม
1. เพื่อป้องกันไม่ให้ ApplicationContext.xml ดูป่องและจัดการได้ง่ายเกินไปเราจะบันทึกการกำหนดค่าที่เกี่ยวข้องกับไฮเบอร์เนตในไฟล์. xml อื่นแล้วนำเข้าใน ApplicationContext.xml ขั้นตอนเฉพาะ:
(1) สร้างไฟล์ชื่อ hibernateContext.xml ในไดเรกทอรี SRC (ระดับเดียวกับ ApplicationContext.xml) คัดลอกเนื้อหาใน ApplicationContext.xml แล้วทำการเปลี่ยนแปลง
(2) เนื้อหาในไฟล์ hibernatecontext.xml:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org/2001/xml xmlns: p = "http://www.springframework.org/schema/p" xsi: schemalocation = "http://www.springframework.org/schema/beans <!-การกำหนดค่า SessionFactory-> <bean id = "SessionFactory"> <!-คุณสมบัติ DataSource จะถูกกำหนดค่าในไฟล์ ApplicationContext.xml ref = "dataSource"> </คุณสมบัติ> <!-ตั้งค่ารายการการกำหนดค่าที่เกี่ยวข้องกับไฮเบอร์เนต-> <property name = "hibernateProperties"> <!-แท็กอุปกรณ์ประกอบฉากคือการฉีดคุณสมบัติประเภทคุณสมบัติ-> <! key = "hibernate.dialect"> org.hibernate.dialect.mysqldialect </prop> <!-show_sql เป็นจุดประสงค์ของการพิมพ์คำสั่ง sql-> <prop key = "hibernate.show_sql"> true </prop> <! <!-a) Create-Drop: สร้างตารางข้อมูลเมื่อดำเนินการโปรแกรมและลบตารางหลังจากดำเนินการ ในการพัฒนาจริงมันมักจะใช้สำหรับการทดสอบ b) สร้าง: สร้างตารางข้อมูลใหม่ทุกครั้งที่โปรแกรมดำเนินการ c) อัปเดต: เมื่อดำเนินการโปรแกรมมันจะถูกตัดสินว่าหากมีตารางจะไม่ถูกสร้างขึ้นมิฉะนั้นตารางข้อมูลจะถูกสร้างขึ้น ไม่สอดคล้องกับฟิลด์ในตารางจะมีการรายงานข้อผิดพลาด (สภาพแวดล้อมการผลิต)-> <prop key = "hibernate.hbm2ddl.auto"> ตรวจสอบ </prop> </props> </คุณสมบัติ> <! โดยทั่วไปแล้วค่าของมันคือชื่อเต็มของแพ็คเกจถั่วที่เกี่ยวข้องและคลาสในแพ็คเกจถั่วโดยทั่วไปจะสอดคล้องกับตารางในฐานข้อมูล-> <list> <dale> com.beauxie.bean </value> </list> </property> </ebean> <! ref = "SessionFactory"> </property> </ebean> </epeans>
(3) ลบการกำหนดค่าของ "SessionFactory" ใน ApplicationContext.xm (เนื่องจากได้รับการกำหนดค่าใน hibernateContext.xml) จากนั้นนำเข้าเนื้อหา hibernateContext.xml ที่แก้ไขแล้ว หลังจากนำเข้าเนื้อหาของ ApplicationContext.xml มีดังนี้:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org/2001/xml xmlns: p = "http://www.springframework.org/schema/p" xsi: schemalocation = "http://www.springframework.org/schema/beans <bean id = "DataSource"> </ebean> <!- นำเข้าไฟล์การกำหนดค่าสปริงอื่น ๆ หากวางไว้ในไฟล์เดียวพวกเขาจะดูป่อง -> <import Resource = "hibernateContext.xml"/> </ebeans>
2. ขึ้นอยู่กับแหล่งข้อมูลต้นฉบับในไฟล์ ApplicationContext.xm แก้ไขการกำหนดค่า (ชื่อฐานข้อมูลชื่อผู้ใช้รหัสผ่าน ฯลฯ ) ( หมายเหตุ: แท็กค่าต้องไม่มีช่องว่างหรือป้อน !! ) ดังที่แสดงด้านล่าง:
<bean id = "dataSource"> <property name = "jdbcurl"> <!-ถ้าคุณใช้แอตทริบิวต์ค่าโดยตรงแทนแท็กค่าคุณต้องหลบหนี "&" และใช้แท็กค่า แท็ก <span style = "สี:#ff0000;"> แท็กต้องไม่มีช่องว่างหรือการส่งคืนการขนส่งเพราะมันจะแปลงช่องว่างเป็น "" </span> ส่งผลให้ฐานข้อมูลไม่สามารถเชื่อมต่อได้เว้นแต่แหล่งข้อมูลจะถูกเขียนใหม่->> <ค่า> <! [cdata [jdbc: mysql: // localhost: 3306/sshdemo? useunicode = true & cyratecoding = utf8 & useerverprepstmts = true & prepstmtcachesqllimit = 256 & cacheprepstmts = true & prepstmtcaches </คุณสมบัติ> <property name = "driverclass" value = "com.mysql.jdbc.driver"> </คุณสมบัติ> <property name = "user" value = "root"> </property> <property name = "password" value = "root"> </property> <property name = "value" name = "minpoolsize" value = "2"> </property> <property name = "maxPoolSize" value = "10"> </คุณสมบัติ> </ebean>
3. ใน ApplicationContext.xm กำหนดค่าสแกนสปริงเพื่อเพิ่มคำอธิบายประกอบส่วนประกอบสปริงลงในชั้นเรียนของเราและถั่วสามารถโหลดได้โดยอัตโนมัติ ขั้นตอนเฉพาะมีดังนี้: (1) แนะนำบริบทเนมสเปซรองรับแท็กบริบทคลิก "เนมสเปซ" ที่ด้านล่างแล้วตรวจสอบรายการบริบท:
(2) กำหนดค่าสแกนสปริง:
<!-กำหนดค่าสแกนสปริงและเพิ่มคำอธิบายประกอบส่วนประกอบสปริงลงในชั้นเรียนของเราเพื่อโหลดถั่วโดยอัตโนมัติ->
<บริบท: Component-Scan base-package = "com.beauxie.action, com.beauxie.service, com.beauxie.dao">
</บริบท: Component-Scan>
ณ จุดนี้สภาพแวดล้อม SSH Framework ที่สำคัญทั้งสามได้ถูกสร้างขึ้นและขั้นตอนต่อไปคือการใช้การลงทะเบียนผู้ใช้ตามเฟรมเวิร์ก SSH
6. กรณี: การเลียนแบบการลงทะเบียนผู้ใช้อย่างง่าย
1. รหัสหน้าลงทะเบียนแผนกต้อนรับ, index.jsp:
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <%String Path = request.getContextPath (); String basepath = request.getScheme () + ": //" + request.getServerName () + ":" + request.getServerport () + path + "/"; %> <! doctype html public "-// w3c // dtd html 4.01 transitional // en"> <html> <head> <base href = "<%= basepath%>"> <title> ยินดีต้อนรับสู่การลงทะเบียน </title> http-equiv = "cache-control" content = "no-cache"> <meta http-equiv = "Expires" content = "0"> <meta http-equiv = "คำหลัก" content = "keyword1, คำหลัก 2, คำหลัก type = "text/css" href = "styles.css">-> </head> <body> <form action = "$ {pageContext.request.context.context}/ผู้ใช้/รีจิสต์" เมธอด = "โพสต์"> <! type = "text" name = "username"> <br> รหัสผ่าน: <อินพุต type = "รหัสผ่าน" ชื่อ = "รหัสผ่าน"> <br> <อินพุต type = "ส่ง" value = "การลงทะเบียน"> </form> </body> </html>2. ผู้ใช้รหัสคลาส:
แพ็คเกจ com.beauxie.bean; นำเข้า Javax.persistence.entity; นำเข้า Javax.persistence.id; นำเข้า Javax.persistence.Table; /** * @author beauxie * ที่นี่คุณสมบัติของผู้ใช้ควรจะเหมือนกับฟิลด์ในตาราง t_user * มิฉะนั้นคุณต้องระบุฟิลด์ในตารางที่สอดคล้องกันสำหรับคุณสมบัติที่แตกต่างกัน */ @เอนทิตี // map table @table name = "t_user") // T_USER TABLE ID ID ID ส่วนตัว; // ID ผู้ใช้ Private String ชื่อผู้ใช้ชื่อผู้ใช้; // ชื่อผู้ใช้รหัสผ่านสตริงส่วนตัว; // รหัสผ่านสาธารณะ int getId () {return id; } โมฆะสาธารณะ setId (int id) {this.id = id; } สตริงสาธารณะ getUserName () {ส่งคืนชื่อผู้ใช้; } โมฆะสาธารณะ setUserName (ชื่อผู้ใช้สตริง) {this.userName = ชื่อผู้ใช้; } สตริงสาธารณะ getPassword () {ส่งคืนรหัสผ่าน; } โมฆะสาธารณะ setPassword (รหัสผ่านสตริง) {this.password = รหัสผ่าน; - 3.USERDAO รหัสคลาส:
แพ็คเกจ com.beauxie.dao; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.orm.hibernate3.hibernatetemplate; นำเข้า org.springframework.stereotype.repository; นำเข้า com.beauxie.bean.user; /*** @author beauxie* dao layer ทำงานบนฐานข้อมูล*/ @repository // คุณสมบัตินี้สอดคล้องกับเลเยอร์การคงอยู่ (โดยปกติเลเยอร์ Dao) ซึ่งหมายความว่ามันถูกส่งไปยังการจัดการสปริง ไฟล์กำหนดค่า; /*** การลงทะเบียนผู้ใช้นั่นคือเพิ่มระเบียนใหม่ลงในตาราง* @param ผู้ใช้*/Public Void Adduser (ผู้ใช้ผู้ใช้) {// เพิ่มข้อมูลลงในฐานข้อมูลและคุณสามารถรับเทมเพลต Save (ผู้ใช้); - 4. ผู้ใช้รหัสคลาส:
แพ็คเกจ com.beauxie.service; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.stereotype.service; นำเข้า com.beauxie.bean.user; นำเข้า com.beauxie.dao.userdao; /*** @author Beauxie* Service Layer*/ @Service // คุณสมบัตินี้สอดคล้องกับเลเยอร์บริการโดยทั่วไปคือเลเยอร์บริการ) ซึ่งหมายความว่ามันถูกส่งไปยังการจัดการฤดูใบไม้ผลิและชื่อคลาสที่สอดคล้องกันจะมีผู้ใช้ระดับสาธารณะ "S" โมฆะสาธารณะ Adduser (ผู้ใช้ผู้ใช้) {// การเรียกวิธี Adduser ของ Dao Layer userdao.adduser (ผู้ใช้); - 5. รหัสคลาสการใช้งาน:
แพ็คเกจ com.beauxie.action; นำเข้า javax.servlet.http.httpservletrequest; นำเข้า org.apache.struts2.servletactionContext; นำเข้า org.apache.struts2.convention.annotation.action; นำเข้า org.apache.struts2.convention.annotation.namespace; นำเข้า org.apache.struts2.convention.annotation.results; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.context.annotation.scope; นำเข้า org.springframework.stereotype.controller; นำเข้า com.beauxie.bean.user; นำเข้า com.beauxie.service.userservice; /** * @author Beauxie * */ @คอนโทรลเลอร์ // ใช้เพื่อเพิ่มความหมายของส่วนประกอบเลเยอร์ควบคุม @Namespace ("/ผู้ใช้") // คำนำหน้า URL @Scope ("ต้นแบบ") // การกระทำเป็นค่าเริ่มต้น คือ "struts-default" ดังนั้น @Results ({@Result (name = "RegistSuccess", location = "/msg.jsp")}) ผู้ใช้ระดับสาธารณะ { @ @autowired // ฉีดบริการผู้ใช้ส่วนตัวโดยอัตโนมัติ; // struts ค่าเริ่มต้นในการสกัดกั้น ".Action และไม่มีคำต่อท้าย" @Action (value = "regist") // การเข้าถึง: /user/regist.action หรือ/ผู้ใช้/รีจิสต์การลงทะเบียนสตริงสาธารณะ () {// รับคำขอ httpservletRequest = servletactionContext.getRequest (); // รับฟอร์มที่ส่งข้อมูลสตริงชื่อผู้ใช้ = request.getParameter ("ชื่อผู้ใช้"); สตริงรหัสผ่าน = request.getParameter ("รหัสผ่าน"); // encapsulate user user user = user ใหม่ (); user.setId (1,000); user.setUserName (ชื่อผู้ใช้); user.setPassword (รหัสผ่าน); // โทรเมธอดบริการ Service เพื่อเพิ่มบันทึกลงในฐานข้อมูล Service.Adduser (ผู้ใช้); // บันทึกข้อมูลพรอมต์ลงในโดเมนคำขอและคำขอแสดงผล SetAttribute ("msg", "ขอแสดงความยินดีการลงทะเบียนสำเร็จ! <br> ชื่อลงทะเบียน:"+ชื่อผู้ใช้); กลับ "Registsuccess"; - 6. อินเตอร์เฟสข้อความพรอมต์: รหัส msg.jsp ดังต่อไปนี้:
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <%String Path = request.getContextPath (); String basepath = request.getScheme () + ": //" + request.getServerName () + ":" + request.getServerport () + path + "/"; %> <! doctype html public "-// w3c // dtd html 4.01 transitional // en"> <html> <head> <base href = "<%= basepath%>"> <title> ข้อความข้อความ </title> <meta http-equiv = "pragma" content = "no-cache"> <meta http-equiv = "Expires" content = "0"> <meta http-equiv = "คำหลัก" content = "keyword1, keyword2, keyword3"> <meta http-equiv = "คำอธิบาย" href = "styles.css"> -> </head> <body> $ {msg} </body> </html>7. เพิ่มโครงการลงในเซิร์ฟเวอร์เริ่มบริการเปิดเบราว์เซอร์และเยี่ยมชม: http: // localhost/sshdemo/ผู้ใช้/รีจิสต์
8. ป้อนชื่อผู้ใช้และรหัสผ่านคลิก "ลงทะเบียน" เพื่อแสดงผลลัพธ์:
9. คอนโซลเอาต์พุตคำสั่ง SQL (เอาต์พุตได้รับการกำหนดค่าและคำสั่ง SQL ได้รับการตกแต่งในไฟล์ hibernatecontext.xml):
10. ดูผลลัพธ์ฐานข้อมูล:
กรณีง่ายๆนี้สิ้นสุดลงแล้ว ไม่มีปัญหากับการตรวจสอบข้อมูลที่ส่งโดยแบบฟอร์มและรหัสที่อ่านไม่ออก ควรได้รับการปรับปรุงในอนาคต
7. สรุป:
1. การบูรณาการของสามเฟรมเวิร์กหลักควรได้รับการแนะนำก่อนแล้วจึงรวมเข้าด้วยกัน
2. อย่าลืมนำเข้าแพ็คเกจ Jar ฐานข้อมูล
3. คลาสแอ็คชั่นควรอยู่ภายใต้ชื่อแพ็คเกจ "การกระทำ" และชื่อคลาสควรจบลงด้วยการกระทำเช่น "xxxaction";
4. เมื่อกำหนดค่าไฮเบอร์เนตให้แน่ใจว่าได้นำเข้าแพ็คเกจ JAR ที่รองรับคำอธิบายประกอบ "@Entity";
5. คุณสามารถกำหนดประเภทคำขอสำหรับ struts ที่ถูกดักจับในไฟล์ struts.xml ซึ่งค่าเริ่มต้นเป็น. การกระทำและไม่มีคำต่อท้าย
6. คุณสามารถกำหนดประเภทตัวกรองของตัวกรอง struts ในไฟล์ web.xml ค่าเริ่มต้นคือ *.Action และควรเปลี่ยนเป็น / *;
7. ในไฟล์ ApplicationContext.xm คุณต้องกำหนดค่า: SessionFactory, คลาสเอนทิตีไฮเบอร์เนต, เทมเพลต hibernatetemplate, แหล่งข้อมูลแหล่งข้อมูลและสแกนเนอร์สปริง (รวมถึง hibernateContext.xml);
8. แต่ละคลาสจะต้องเพิ่มคำอธิบายประกอบที่สอดคล้องกันและต้องเพิ่มวิธีการในการดำเนินการด้วย
ดาวน์โหลดรหัสที่มาอินสแตนซ์: http://xiazai.vevb.com/201610/yuanma/sshzhuce(vevb.com).rar
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น