บทความนี้เริ่มต้นด้วยโครงการห้างสรรพสินค้าออนไลน์เริ่มต้นด้วยการก่อสร้างสิ่งแวดล้อมและรวม S2SH ทีละขั้นตอน โพสต์บล็อกนี้ส่วนใหญ่สรุปวิธีการรวม struts2, hibernate4.3 และ spring4.2
ในการรวมกรอบหลักสามเฟรมคุณต้องเริ่มต้นด้วยการสร้างสภาพแวดล้อมที่หลากหลายนั่นคือก่อนอื่นคุณต้องสร้างสภาพแวดล้อมของฤดูใบไม้ผลิไฮเบอร์เนตและ struts2 เพื่อให้แน่ใจว่าพวกเขาไม่มีปัญหาและรวมเข้าด้วยกัน ลำดับที่โพสต์บล็อกนี้ดังต่อไปนี้คือ: แรกสร้างสภาพแวดล้อมฤดูใบไม้ผลิ -> จากนั้นสร้างสภาพแวดล้อมที่ไฮเบอร์เนต -> รวมฤดูใบไม้ผลิและไฮเบอร์เนต -> สร้างสภาพแวดล้อม struts2 -> รวมฤดูใบไม้ผลิและ struts2
1. การจัดการแพ็คเกจ Jar โครงการทั้งหมด
ฤดูใบไม้ผลิมีแพ็คเกจขวดมากมาย ขอแนะนำให้จำแนกพวกเขาในหมวดหมู่แล้วเพิ่มลงในไลบรารีผู้ใช้เพื่อให้การจัดการที่ง่ายและชัดเจน ที่นี่ฉันจะสรุปแพ็คเกจขวดพื้นฐานที่จำเป็นสำหรับ SSH ทั้งหมดและดูภาพต่อไปนี้:
ดังที่เห็นได้จากรูปแรกไหฤดูใบไม้ผลิแบ่งออกเป็นสี่หมวดหมู่: Spring-4.2.4-core, Spring-4.2.4-AOP, Spring-4.2.4-persistence และ Spring-4.2.4.4-Web ใส่แพ็คเกจหลักทั้งหมดของฤดูใบไม้ผลิลงในคอร์ใส่ทั้งหมดที่เกี่ยวข้องกับ AOP ลงใน AOP ใส่ทั้งหมดที่เกี่ยวข้องกับการคงอยู่ (รวมเข้ากับไฮเบอร์เนต) ในการคงอยู่และใส่ทั้งหมดที่เกี่ยวข้องกับเว็บ (รวมกับ struts2) ลงในเว็บ แต่ละส่วนมีแพ็คเกจอะไรบ้าง? โปรดดูภาพหน้าจอด้านล่าง:
หมายเหตุ: แพ็คเกจในแต่ละหมวดหมู่ด้านบนไม่มีขวดทั้งหมดในแพ็คเกจดั้งเดิม ไม่มีการใช้ไฟล์ขวดบางไฟล์ เพียงเพิ่มเมื่อโครงการเฉพาะต้องการ รูปภาพด้านบนเป็นแพ็คเกจ JAR พื้นฐานที่สุดที่จำเป็นเพื่อให้แน่ใจว่าสภาพแวดล้อมของโครงการสามารถสร้างแพ็คเกจ JAR ขั้นพื้นฐานที่สุดได้
2. สร้างสภาพแวดล้อมฤดูใบไม้ผลิ
ภาพหน้าจอด้านบนของแพ็คเกจ JAR คือแพ็คเกจ JAR ทั้งหมดที่รวมเข้าด้วยกันในครั้งสุดท้าย เมื่อคุณสร้างสภาพแวดล้อมครั้งแรกคุณไม่จำเป็นต้องเพิ่มทั้งหมดในครั้งเดียว คุณสามารถเพิ่มพวกเขาทีละบิต นี่เป็นสิ่งที่เอื้อต่อการทำความเข้าใจว่าแพ็คเกจขวดในแต่ละส่วนมีอะไรบ้าง แน่นอนว่ามันเป็นไปได้ที่จะเพิ่มพวกเขาทั้งหมดในครั้งเดียว
2.1 เพิ่มไฟล์การกำหนดค่า beans.xml และแพ็คเกจ JAR ที่เกี่ยวข้อง
สร้างโครงการใหม่จากนั้นเพิ่มไลบรารีของคุณเองในไลบรารีผู้ใช้ นี่คือสองหลักคือ Spring-4.2.4-core และ Spring4.2.4-AOP ฉันจะไม่เข้าไปดูรายละเอียดเกี่ยวกับการเพิ่มแพ็คเกจ JAR หลังจากเพิ่มแล้วให้เพิ่มไฟล์ beans.xml ในไดเรกทอรี SRC มีเทมเพลตมากมายสำหรับไฟล์นี้ออนไลน์และยังมีตัวอย่างที่จัดทำโดยฤดูใบไม้ผลิ เพียงแค่ใช้สำเนาดูภาพต่อไปนี้:
2.2 สภาพแวดล้อม IOC ของ Test Spring
มาเขียนคลาส Java Java.util.date ทั่วไปเพื่อทดสอบว่า Spring IOC เป็นเรื่องปกติหรือไม่ หากสามารถฉีดได้ตามปกติในโปรแกรมทดสอบนั่นหมายความว่าสภาพแวดล้อม IOC ของฤดูใบไม้ผลินั้นประสบความสำเร็จ มาเขียนกรณีทดสอบด้านล่าง:
/** * @description todo (ใช้การดีบักคำอธิบายประกอบของฤดูใบไม้ผลิรองรับ Spring3.1 ขึ้นไปเท่านั้น) * @author ni Shengwu * * / / * * หลังจาก Spring3.1 มีการทดสอบ Spring-4.2.4.4.4. แพ็คเกจ JAR นี้ใช้เป็นพิเศษเพื่อรองรับการทดสอบตามคำอธิบายประกอบ Junit แพ็คเกจ JAR อยู่ใน Spring-4.2.4-core * มี SpringJunit4ClassRunner.class ในแพ็คเกจ Jar นี้และคุณสามารถเพิ่มได้ด้วย @Runwith Annotation * * Annotation @ContextConfiguration หมายถึงการฉีดวัตถุ ApplicationContext คุณไม่ต้องใหม่ในโปรแกรมทดสอบก่อนหน้านี้ @ContextConfiguration (locations = "classpath: beans.xml") คลาสสาธารณะ sshtest {@Resource วันที่ส่วนตัววันที่; @Test // ทดสอบสภาพแวดล้อมการพัฒนาของสปริง IOC เป็นโมฆะสาธารณะ SpringIoc () {System.out.println (วันที่); - ในที่สุดก็สามารถส่งออกได้ตามปกติ: พ.อ. 28 เม.ย. 22:45:13 CST 2016 สิ่งนี้บ่งชี้ว่าวัตถุวันที่ถูกฉีดโดยฤดูใบไม้ผลิซึ่งตรวจสอบว่าฟังก์ชั่นสปริง IOC เป็นเรื่องปกติ ด้วยเหตุนี้สภาพแวดล้อมฤดูใบไม้ผลิจึงถูกสร้างขึ้น
3. สร้างสภาพแวดล้อมที่จำศีล
การก่อสร้างสภาพแวดล้อมของไฮเบอร์เนตนั้นซับซ้อนกว่าฤดูใบไม้ผลิเพราะใช้วิศวกรรมย้อนกลับใน MyEclipse เราทำตามขั้นตอนต่อไปนี้เพื่อสร้างสภาพแวดล้อมการพัฒนาไฮเบอร์เนต:
3.1 เพิ่มแพ็คเกจ Jar ที่เกี่ยวข้อง
ที่นี่เราเพิ่มแพ็คเกจ JAR สองชุดลงในไลบรารีผู้ใช้: Hibernate4.3.11 และแพ็คเกจไดรเวอร์ MySQL MySQL-Connector-Java-5.1.26 ซึ่งจะไม่อธิบายรายละเอียด
3.2 สร้างฐานข้อมูลและตารางใหม่
วางฐานข้อมูลหากมีร้านค้าอยู่ สร้างฐานข้อมูลร้านค้าเริ่มต้นอักขระอักขระเริ่มต้น UTF8; ใช้ร้านค้า; ตารางวางถ้ามีหมวดหมู่; สร้างหมวดหมู่ตาราง ( /* หมายเลขหมวดหมู่, การเติบโตอัตโนมัติ* / id int ไม่ใช่ null auto_increment, /* ชื่อหมวดหมู่* / ประเภท varchar (20), /* ไม่ว่าหมวดหมู่จะเป็นหมวดหมู่ร้อนหมวดหมู่ร้อนอาจแสดงในหน้าแรก* / ร้อนเริ่มต้นเท็จ
3.3 dB เบราว์เซอร์เชื่อมต่อกับฐานข้อมูล MySQL
เบราว์เซอร์ DB หมายถึงหน้าต่างมุมมองใน MyEclipse คุณสามารถเห็นฐานข้อมูลและตารางใดใน MySQL วิธีการเปิดเบราว์เซอร์ DB: Window-> เปิดมุมมอง-> เบราว์เซอร์ DB เปิดหน้าต่างการทำงานของเบราว์เซอร์ DB หากไม่มีเบราว์เซอร์ DB ให้ทำตามต่อไปนี้: window-> show view-> other-> ป้อนเบราว์เซอร์ db และค้นหาที่จะเปิด
หลังจากเปิดเราเริ่มเชื่อมต่อกับฐานข้อมูล MySQL คลิกขวา -> ใหม่ในพื้นที่ว่างของหน้าต่างเบราว์เซอร์ DB และกล่องโต้ตอบต่อไปนี้จะปรากฏขึ้น:
หลังจากกรอกให้คลิกไดรเวอร์ทดสอบเพื่อทดสอบ การทดสอบผ่านการทดสอบและระบุว่าไดรเวอร์การเชื่อมต่อฐานข้อมูลได้รับการกำหนดค่าแล้วเสร็จสิ้น ด้วยวิธีนี้เราสามารถเห็นฐานข้อมูล MySQL 5.6 ในหน้าต่างเบราว์เซอร์ DB คลิกขวาที่จะเปิดเพื่อดูไลบรารีและตารางที่มีอยู่ในฐานข้อมูลดังนี้:
3.4 สร้างไฟล์การแมป XML และ SessionFactory
SessionFactory ใช้เพื่อสร้างเซสชัน เราสร้างพวกเขาด้วยวิธีต่อไปนี้: คลิกขวาที่ชื่อโครงการ-> myeclipse-> เพิ่มความสามารถในการจำศีล หากไม่มีความสามารถในการเพิ่มไฮเบอร์เนตให้คลิก facets โครงการ-> ติดตั้ง facets hibernate และหน้าต่างต่อไปนี้จะปรากฏขึ้น:
ถัดไปเพิ่มการสนับสนุน Hibernate นั่นคือไฟล์การแมป hibernate.cfg.xml และ SessionFactory ใน MyEclipse ที่นี่เราสร้างแพ็คเกจสำหรับ SessionFactory เป็นหลักและไม่สามารถใช้แพ็คเกจเริ่มต้นได้
ถัดไปเพิ่มไดรเวอร์ เนื่องจากเราได้กำหนดค่าไดรเวอร์มาก่อนเราจึงสามารถเลือกไดรเวอร์ที่กำหนดค่าใหม่ได้โดยตรงที่นี่
ต่อไปเนื่องจากเราได้เพิ่มการจอง Jar ของเราเองมาก่อนจึงไม่จำเป็นต้องเลือกที่นี่เพียงแค่เสร็จสิ้นโดยตรง
ด้วยวิธีนี้เราเสร็จสิ้นการสร้างไฟล์การกำหนดค่าไฮเบอร์เนตและ SessionFactory ลองมาดูสั้น ๆ ว่ามีอะไรอยู่ใน SessionFactory ที่สร้างโดย MyEclipse:
ชั้นเรียนสาธารณะ HibernatesessionFactory {ส่วนตัวคงที่ threadLocal <Session> threadLocal = new ThreadLocal <Session> (); // SessionFactory ใช้ใน SessionFactory ส่วนตัว org.hibernate.sessionfactory SessionFactory; // SessionFactory: สร้างโรงงานสำหรับเซสชันส่วนตัวการกำหนดค่าการกำหนดค่าแบบคงที่ = การกำหนดค่าใหม่ (); Serviceregistry Serviceregistry ส่วนตัว; คงที่ {// เริ่มต้น SessionFactory ลอง {configuration.configure (); serviceregistry = ใหม่ serviceregistryBuilder (). applysettings (configuration.getProperties ()). buildServiceregistry (); SessionFactory = configuration.buildsessionFactory (serviceregistry); // วิธีการสร้าง SessionFactory ใน hibernate4} catch (Exception e) {system.err.println ("%%%%% 2. ข้อผิดพลาดการสร้าง sessionfactory %%%%%%"); E.PrintStackTrace (); }} private hibernatesessionFactory () {// วิธีตัวสร้างส่วนตัวป้องกันวัตถุใหม่จากการถูกปล่อยออกมาเพื่อให้แน่ใจว่า SessionFactory Singleton} เซสชั่นคงที่สาธารณะ getSession () โยน hibernateException {เซสชัน = (เซสชัน) ThreadLocal.get (); // รับเซสชันจากพูลเธรดถ้า (เซสชัน == null ||! session.isopen ()) {// ถ้าพูลเธรดว่างเปล่าหรือการเปิดเซสชันล้มเหลวถ้า (SessionFactory == null) {rebuildSessionFactory (); // ถ้า SessionFactory ว่างเปล่าให้สร้างอีกครั้งเหมือนกับส่วนคงที่} เซสชัน = (SessionFactory! = null)? SessionFactory.opensession (): NULL; // SessionFactory ไม่ว่างเปล่าสร้างเซสชัน threadlocal.set (เซสชัน); // จากนั้นใส่เซสชันนี้ลงในพูลเธรดและรับในครั้งต่อไป} ส่งคืนเซสชัน; } โมฆะคงที่สาธารณะ rebuildSessionFactory () {ลอง {configuration.configure (); serviceregistry = ใหม่ serviceregistryBuilder (). applysettings (configuration.getProperties ()). buildServiceregistry (); SessionFactory = configuration.buildsessionFactory (serviceregistry); } catch (exception e) {system.err.println ("%%%%% 2. ข้อผิดพลาดในการสร้าง sessionfactory %%%% $"); E.PrintStackTrace (); }} โมฆะคงที่สาธารณะปิด () พ่น HibernateException {เซสชันเซสชัน = (เซสชัน) threadlocal.get (); threadlocal.set (null); if (session! = null) {session.close (); }} สาธารณะคงที่ org.hibernate.sessionfactory getSessionFactory () {// ให้อินเทอร์เฟซสาธารณะเพื่อให้โลกภายนอกได้รับ Singleton SessionFactory SessionFactory นี้; } การกำหนดค่าคงที่สาธารณะ getConfiguration () {return configuration; - จะเห็นได้จาก HibernatesessionFactory ที่สร้างขึ้นว่ารูปแบบ Singleton และเทคโนโลยีการรวมเกลียวส่วนใหญ่จะใช้ ไม่ยากที่จะเข้าใจ
3.5 สร้างไฟล์การแมปรุ่นและ ORM ผ่านวิศวกรรมย้อนกลับ
ต่อไปเราจะเริ่มใช้ reverse Engineering เพื่อสร้างวัตถุอินสแตนซ์นั่นคือโมเดลที่สอดคล้องกับตารางฐานข้อมูล ในหน้าต่าง DB Browsera คลิกขวาที่ร้านขายโต๊ะที่เราเพิ่งสร้างและเลือกวิศวกรรมย้อนกลับไฮเบอร์เนตเพื่อเริ่มสร้าง:
มีสองวิธีในการสร้างมันขึ้นอยู่กับไฟล์การกำหนดค่าและขึ้นอยู่กับคำอธิบายประกอบ ขึ้นอยู่กับอารมณ์ของนักพัฒนา คุณสามารถเลือก:
จากนั้นในขั้นตอนถัดไปเลือกวิธีการอัตโนมัติคีย์หลักดั้งเดิมจากนั้นทำวิศวกรรมย้อนกลับเพื่อสร้างแบบจำลองและการแมป ORM
หลังจากเสร็จสิ้นโมเดลของหมวดหมู่จะถูกสร้างขึ้นและการแมปที่สอดคล้องกันจะถูกสร้างขึ้นในไฟล์ hibernate.cfg.xml การแมปก่อนหน้านี้ขึ้นอยู่กับไฟล์การกำหนดค่าและคำอธิบายประกอบตามคำอธิบายประกอบจะแตกต่างกัน
3.6 การทดสอบฐานข้อมูลแบบถาวร
เนื่องจากไม่ได้รวมเข้ากับฤดูใบไม้ผลิจึงเป็นเพียงการสร้างสภาพแวดล้อมการพัฒนาไฮเบอร์เนตอย่างง่ายดังนั้นเราจึงไม่จำเป็นต้องใช้คำอธิบายประกอบ เราดำเนินการป้อนข้อมูลลงในฐานข้อมูลโดยบริการใหม่โดยตรง
ก่อนอื่นเขียน Interface CategoryService และคลาสการใช้งาน:
ส่วนต่อประสานสาธารณะหมวดหมู่บริการ {โมฆะสาธารณะบันทึก (หมวดหมู่หมวดหมู่); // ใช้เพื่อทดสอบสภาพแวดล้อม hibernate} คลาสสาธารณะหมวดหมู่ ServiceImpl ใช้หมวดหมู่ {@Override // ไม่มีการรวมเข้ากับโมฆะสาธารณะสปริงบันทึก (หมวดหมู่) {// รับเซสชันเซสชัน = HibernatesessionFactory.getSession (); ลอง {// เซสชันการทำธุรกรรมด้วยตนเอง getTransaction (). เริ่มต้น (); // ดำเนินการทางธุรกิจ Session.save (หมวดหมู่); // ส่ง session.getTransaction ด้วยตนเอง (). commit (); } catch (exception e) {session.getTransaction (). ย้อนกลับ (); โยน RuntimeException ใหม่ (E); } ในที่สุด {hibernatesessionFactory.losesession (); - ต่อไปนี้คือการเพิ่มการทดสอบของไฮเบอร์เนตในกรณีทดสอบตอนนี้:
@runwith (springjunit4classrunner.class) @contextconfiguration (locations = "classpath: beans.xml") คลาสสาธารณะ sshtest {@resource วันที่ส่วนตัว; @Test // ทดสอบสภาพแวดล้อมการพัฒนาของสปริง IOC เป็นโมฆะสาธารณะ SpringIoc () {System.out.println (วันที่); } @Test // ทดสอบ /ทดสอบสภาพแวดล้อมการพัฒนาของไฮเบอร์เนตเนื่องจากไม่มีการรวมเข้าด้วยกันคุณสามารถใหม่โมฆะสาธารณะใหม่โดยตรง hiHernate () {categoryService categoryService = หมวดหมู่ใหม่ ServiceImpl (); หมวดหมู่หมวดหมู่ = หมวดหมู่ใหม่ ("Men's Casual", True); categoryservice.save (หมวดหมู่); -เราตรวจสอบฐานข้อมูลและพบว่ามีรายการจำนวนมากเกินไปที่เพิ่งแทรกซึ่งหมายความว่าไม่มีปัญหากับสภาพแวดล้อมที่จำศีล ณ จุดนี้เราได้สร้างสภาพแวดล้อมการพัฒนาไฮเบอร์เนต
4. รวมฤดูใบไม้ผลิและไฮเบอร์เนต
หลังจากสร้างสภาพแวดล้อมการพัฒนาสำหรับฤดูใบไม้ผลิและไฮเบอร์เนตเราเริ่มรวมทั้งสองเข้าด้วยกัน หลังจากรวมสปริงและไฮเบอร์เนตคุณสามารถใช้ AOP เพื่อให้สปริงจัดการธุรกรรมไฮเบอร์เนต การรวมสปริงและไฮเบอร์เนตส่วนใหญ่เริ่มต้นจากสองด้าน: หนึ่งคือการนำเข้าแพ็คเกจ JAR ที่จำเป็นและอื่น ๆ คือการกำหนดค่าไฟล์ beans.xml ด้านล่างเรารวมสปริงและไฮเบอร์เนตทีละขั้นตอน
4.1 นำเข้าแพ็คเกจ Jar ที่เกี่ยวข้อง
มีแพ็คเกจขวดหลักสองชุดที่ต้องนำเข้าเมื่อรวมสปริงและไฮเบอร์เนต, Spring4.2.4-persistence และ C3P0-0.9.5.1 สำหรับไฟล์ JAR เฉพาะในแต่ละแพ็คเกจ JAR โปรดดูภาพหน้าจอด้านบนและจะไม่ได้รับการอธิบายที่นี่ ตอนนี้เราจะเริ่มกำหนดค่าไฟล์ beans.xml
4.2 การกำหนดค่าแหล่งข้อมูลแหล่งข้อมูล
ก่อนกำหนด dataSource จากนั้นส่วนที่สอดคล้องกันใน hibernate.cfg.xml สามารถฆ่าได้ เนื่องจากมีการกำหนดค่าในฤดูใบไม้ผลิฤดูใบไม้ผลิจะเริ่มต้นแหล่งข้อมูลนี้ซึ่งหมายความว่าสิ่งนี้จะถูกทิ้งให้เป็นฤดูใบไม้ผลิเพื่อให้เสร็จสมบูรณ์และส่วนที่สอดคล้องกันใน hibernate.cfg.xml สามารถลบได้ ดังนี้:
<!-com.mchange.v2.c3p0.combopooledDataSource คลาสอยู่ในแพ็คเกจ com.mchange.v2.c3p0 ของ c3p0-0.9.5.1.jar แพ็คเกจ-> <bean id = "dataSource"> value = "jdbc: mysql: // localhost: 3306/shop"/> <property name = "user" value = "root"/> <property name = "รหัสผ่าน" value = "root"/> </ebean>
ส่วนที่ต้องถูกฆ่าใน hibernate.cfg.xml:
4.3 การกำหนดค่า SessionFactory
SessionFactory ได้รับการกำหนดค่าให้สร้างเซสชัน นอกจากนี้ยังมี Hibernatetemplate อย่างไรก็ตาม SessionFactory ใช้ที่นี่แทนที่จะเป็น hibernatetemplate เนื่องจาก hibernatetemplate มีให้โดยฤดูใบไม้ผลิและขึ้นอยู่กับฤดูใบไม้ผลิ หากสปริงไม่ได้ใช้หนึ่งวันจะมีการรายงานข้อผิดพลาด และ SessionFactory จัดทำโดย Hibernate ไม่มีปัญหา Hibernatetemplate ขึ้นอยู่กับเกินไป มาดูการกำหนดค่าเฉพาะ:
<!-org.springframework.orm.hibernate4.localsessionfactorybean คลาสใน org.springframework.orm.hibernate4 แพ็คเกจของ Spring-orm-4.2.4.Release.jar "> <bean ID =" SessionFactory " value = "classpath: hibernate.cfg.xml" /> <!-โหลดไฟล์กำหนดค่าไฮเบอร์เนต-> </ebean>
เราเพิ่งใช้ DataSource ใน SessionFactory เพื่ออ้างอิงแหล่งข้อมูลด้วยแอตทริบิวต์ REF เราไม่ได้ใช้การกำหนดค่าที่นี่อีกต่อไป เราโหลดไฟล์ hibernate.cfg.xml โดยตรงและใช้การกำหนดค่าในไฟล์กำหนดค่าไฮเบอร์เนตเพื่อให้กระชับและสะดวกยิ่งขึ้น
4.4 การกำหนดค่าตัวจัดการธุรกรรม
ตัวจัดการธุรกรรมการกำหนดค่าใช้เพื่อจัดการ SessionFactory เพื่อให้เซสชันทั้งหมดที่สร้างโดย SessionFactory จะได้รับการจัดการอย่างชัดเจน การกำหนดค่ามีดังนี้:
<!-org.springframework.orm.hibernate4.hibernatetransactionmanager คลาส Spring-orm-4.2.4.release.jar แพ็คเกจใน org.springframework.orm.hibernate4 แพ็คเกจ-> <bean id = "transactionmanager"
ในทำนองเดียวกันเราสามารถใช้ SessionFactory เพียงกำหนดค่าและอ้างอิงด้วยแอตทริบิวต์ REF ณ จุดนี้คุณจะพบว่าตลอดทางจากด้านบนเป็นชุดของการดำเนินการโดยอ้างถึงพวกเขาทีละคน
4.5 กำหนดค่าคำแนะนำ (การแจ้งเตือน)
วัตถุประสงค์ของการกำหนดค่าคำแนะนำคือการระบุวิธีการที่ต้องการโหมดการทำธุรกรรมประเภทใด ดูการกำหนดค่า:
<TX: คำแนะนำ ID = "คำแนะนำ" transaction-manager = "transactionManager"> <tx: attributes> <tx: method name = "บันทึก*" การแพร่กระจาย = "ต้องการ"/> <tx: แอตทริบิวต์> </tx: คุณลักษณะ> </tx: คำแนะนำ>
ต้องการหมายความว่าหากมีธุรกรรมการทำธุรกรรมปัจจุบันได้รับการสนับสนุน หากไม่มีธุรกรรมใหม่จะถูกสร้างขึ้น โหมดการทำธุรกรรมนี้ใช้กับวิธีการทั้งหมดที่เริ่มต้นด้วยการบันทึกอัปเดตและลบนั่นคือจำเป็นต้องมีการสนับสนุนการทำธุรกรรมเมื่อเพิ่มการลบและแก้ไขฐานข้อมูล การสนับสนุนหมายความว่าหากมีธุรกรรมการทำธุรกรรมปัจจุบันได้รับการสนับสนุนและหากไม่มีใครก็จะดี
4.6 การกำหนดค่า AOP facets
<AOP: config> <!-กำหนดค่าคลาสแพ็คเกจที่จะเข้าสู่ธุรกรรม-> <aop: pointcut id = "pointcut" expression = "การดำเนินการ (*cn.it.shop.service.impl.*.*(.. ))" /> <aop: คำแนะนำที่ปรึกษา yahei; "> และ pointcut ด้านบน-> <!-aop: pointcut ต้องเขียนบน AOP: ที่ปรึกษามิฉะนั้นจะมีการรายงานข้อผิดพลาด-> </aop: config>
AOP คือการเขียนโปรแกรมแบบแทนเจนต์ AOP: Pointcut กำหนดแทนเจนต์ การกำหนดค่าในคุณสมบัตินิพจน์หมายความว่าวิธีการทั้งหมดภายใต้แพ็คเกจ cn.it.shop.service.impl โดยไม่คำนึงถึงค่าส่งคืนและพารามิเตอร์จะต้องป้อนธุรกรรม แพ็คเกจนี้เป็นของเลเยอร์ DAO และใช้งานฐานข้อมูลโดยตรง AOP: คำแนะนำรวมการแจ้งเตือนและส่วนต่างๆ เราสามารถใช้คำแนะนำและ PointCut ที่กำหนดค่าไว้ข้างต้นโดยตรงเพื่อแนะนำพวกเขา หลังจากการกำหนดค่านี้หมายความว่าวิธีการทั้งหมดภายใต้แพ็คเกจ cn.it.shop.service.impl จำเป็นต้องป้อนการจัดการธุรกรรม โดยเฉพาะอย่างยิ่งวิธีการเริ่มต้นด้วยการบันทึกอัปเดตและลบใช้วิธีการที่ต้องการและวิธีการอื่น ๆ ใช้วิธีการสนับสนุน สิ่งนี้ทำให้ง่ายต่อการเข้าใจความหมายของการกำหนดค่านี้
4.7 ผลการทดสอบการรวม
เมื่อเราสร้างสภาพแวดล้อมไฮเบอร์เนตมาก่อนเราทดสอบว่าเราใหม่บริการใหม่โดยตรงในการใช้งานฐานข้อมูลเพราะมันไม่ได้รวมเข้ากับฤดูใบไม้ผลิในเวลานั้น ตอนนี้หลังจากกำหนดค่า beans.xml สปริงได้รับอนุญาตให้จัดการธุรกรรมไฮเบอร์เนต ดังนั้นการทดสอบในปัจจุบันจำเป็นต้องส่งมอบบริการไปยังการจัดการฤดูใบไม้ผลิฉีดผ่านฤดูใบไม้ผลิและพึ่งพา SessionFactory หากข้อมูลสามารถแทรกลงในฐานข้อมูลก็หมายความว่าธุรกรรมนั้นโอเค
ก่อนอื่นเราต้องจับคู่บริการนี้ในไฟล์การกำหนดค่าของฤดูใบไม้ผลิ xml:
คัดลอกรหัสดังนี้: <bean id = "categoryService">
<property name = "SessionFactory" ref = "SessionFactory" /> <!-การพึ่งพา SessionFactory ใช้ SessionFactory ที่เราเคยติดตั้งไว้ก่อนหน้านี้->
</ebean>
ประการที่สองเราจำเป็นต้องเพิ่มวิธีการในหมวดหมู่อินเตอร์เฟสและหมวดหมู่การใช้งานหมวดหมู่ ServiceImpl เพื่อทดสอบสถานการณ์การรวม:
ส่วนต่อประสานสาธารณะหมวดหมู่บริการ {โมฆะสาธารณะบันทึก (หมวดหมู่หมวดหมู่); // ใช้เพื่อทดสอบการอัปเดตโมฆะสาธารณะของ Hibernate Environment (หมวดหมู่); // ใช้เพื่อทดสอบการบูรณาการของฤดูใบไม้ผลิและไฮเบอร์เนต} หมวดหมู่ระดับสาธารณะหมวดหมู่ ServiceImpl ใช้หมวดหมู่ {@Override // สถานการณ์ที่ไม่มีการรวมเข้ากับสปริงโมฆะบันทึก (หมวดหมู่) {// รับเซสชันเซสชัน = HibernatesessionFactory.getSession ลอง {// เซสชันการทำธุรกรรมด้วยตนเอง getTransaction (). เริ่มต้น (); // ดำเนินการทางธุรกิจ Session.save (หมวดหมู่); // ส่ง session.getTransaction ด้วยตนเอง (). commit (); } catch (exception e) {session.getTransaction (). ย้อนกลับ (); โยน RuntimeException ใหม่ (E); } ในที่สุด {hibernatesessionFactory.losesession (); }} /*สปริงและไฮเบอร์เนตทั้งหมด* / ส่วนตัวเซสชัน factory SessionFactory; // กำหนด SessionFactory // เมื่อคุณต้องการใช้ SessionFactory สปริงจะฉีด SessionFactory ลงในโมฆะสาธารณะ setSessionFactory (SessionFactory SessionFactory) {this.sessionFactory = SessionFactory; } การป้องกันเซสชัน getSession () {// รับเซสชันจากเธรดปัจจุบัน ถ้าไม่สร้างเซสชันใหม่ return sessionfactory.getCurrentsession (); } @Override // สถานการณ์หลังจากฤดูใบไม้ผลิและไฮเบอร์เนตเป็นการอัปเดตโมฆะสาธารณะ (หมวดหมู่หมวดหมู่) {getSession (). อัปเดต (หมวดหมู่); - ตอนนี้เราสามารถเพิ่มวิธีการทดสอบในคลาสทดสอบเพื่อทดสอบผลลัพธ์หลังจากการรวมสปริงและไฮเบอร์เนต:
@runwith (springjunit4classrunner.class) @contextconfiguration (locations = "classpath: beans.xml") คลาสสาธารณะ sshtest {@resource วันที่ส่วนตัว; @Resource หมวดหมู่ส่วนตัวประเภทบริการ; @Test // ทดสอบสภาพแวดล้อมการพัฒนาสปริง IOC เป็นโมฆะสาธารณะ SpringIoc () {System.out.println (วันที่); } @Test // ทดสอบ // การทดสอบสภาพแวดล้อมการพัฒนาของ Hibernate เนื่องจากไม่มีการรวมเข้าด้วยกันคุณสามารถใหม่ได้โดยตรงกับโมฆะสาธารณะใหม่ hiHernate () {หมวดหมู่หมวดหมู่บริการ = หมวดหมู่ใหม่ ServiceImpl (); หมวดหมู่หมวดหมู่ = หมวดหมู่ใหม่ ("Men's Casual", True); categoryservice.save (หมวดหมู่); } @test // ทดสอบโมฆะสาธารณะ hibernateandspring () {categoryservice.update (หมวดหมู่ใหม่ (1, "ผู้หญิงทั่วไป", จริง)); // categoryservice ฉีดจากด้านบนถึงฤดูใบไม้ผลิ}}จากนั้นเราตรวจสอบฐานข้อมูลและพบว่าหมวดหมู่ที่มี ID = 1 ได้รับการแก้ไขเป็นสไตล์ของผู้หญิงที่ไม่เป็นทางการซึ่งหมายความว่าการอัปเดตนั้นประสบความสำเร็จ ณ จุดนี้ฤดูใบไม้ผลิและไฮเบอร์เนตได้รับการบูรณาการสำเร็จแล้ว
5. สร้างสภาพแวดล้อม struts2
5.1 เพิ่มการกำหนดค่าที่สอดคล้องกันและแพ็คเกจ JAR
ฉันใส่แพ็คเกจ jar ที่จำเป็นสำหรับ struts2 เพื่อทำงานในห้องสมุดของ struts2.3.41 ดังนั้นฉันจึงสามารถแนะนำได้โดยตรงและฉันจะไม่ทำซ้ำ นอกจากนี้ไฟล์ web.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 <plude-name> e_shop </display-name> <welcome-file-list> <welcome-file> index.jsp </welcome-file> </welcome-file-list> <filter> <stripter-name> struts2 </filter-name> </filter> <filter-mapping> <filter-name> struts2 </filter-name> <url-pattern>*. action </url-pattern> </filter-mapping> </eb-app>
ดังกล่าวข้างต้นเรากำหนดค่าตัวกรอง strutspreprepareedexecutefilter และตั้งค่า url-pattern ของตัวกรองเป็น *.Action นั่นคือคำต่อท้าย. การกระทำทั้งหมดจะผ่านตัวกรองนี้ก่อนซึ่งเป็นทางเข้าสู่ struts2
5.2 สร้างการกระทำและกำหนดค่าเป็นไฟล์ struts.xml
เราสร้างการกระทำดังนี้:
หมวดหมู่ระดับสาธารณะขยายการดำเนินการ {หมวดหมู่ส่วนตัวหมวดหมู่บริการ; // CategoryService ถูกตั้งค่าให้เห็นความแตกต่างอย่างสังหรณ์ใจก่อนและหลังการรวมเข้ากับโมฆะสาธารณะสปริง setCategoryService (หมวดหมู่หมวดหมู่บริการ) {this.CategoryService = categoryService; } การอัปเดตสตริงสาธารณะ () {System.out.println ("---- Update ----"); System.out.println (categoryservice); // เอาต์พุตผลตอบแทนที่แตกต่างกัน "ดัชนี"; } สตริงสาธารณะบันทึก () {system.out.println ("---- บันทึก ----"); System.out.println (categoryservice); // เปิดผลตอบแทนที่แตกต่างกัน "ดัชนี" ก่อนและหลังการรวม; - จากนั้นเรากำหนดค่าไฟล์ struts.xml ซึ่งวางไว้ในไดเรกทอรี SRC:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <! doctype struts สาธารณะ "-// Apache ซอฟต์แวร์ Foundation // dtd struts การกำหนดค่า 2.3 // en" "http://struts.apache.org/dtds/struts-2.3.dtd" category_update.actiocan: วิธีการอัปเดตการเข้าถึง-> <action name = "category_*" method = "{1}"> <name result = "index">/index.jsp </result> </action> </package> </struts> 5.3 การทดสอบสภาพแวดล้อม struts2
วิธีการทดสอบคือ: เขียนการดำเนินการเข้าถึง JSP และหากสามารถสร้างการกระทำได้หมายความว่าสภาพแวดล้อม struts2 นั้นโอเค นั่นคือชุดของกระบวนการใน struts2 สามารถทำให้เสร็จตามปกติ: jsp-> struts.xml-> action-> struts.xml-> jsp เพื่อให้สภาพแวดล้อมของ struts2 พร้อม มาเขียน index.jsp ง่ายๆ
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <! doctype html สาธารณะ "-// w3c // dtd html 4.01 transitional // en"> <html> สามารถเข้าถึงได้-> </span> <a href = "$ {pageContext.request.contextpath} /category_update.action"> การอัปเดตการเข้าถึง </a> <a href = "category_save.action"> เข้าถึงบันทึก </a> </body> </html> จากนั้นเราปรับใช้โครงการต่อไปนี้เปิดเซิร์ฟเวอร์ Tomcat, Enter: http: // localhost: 8080/e_shop/index.jsp ในเบราว์เซอร์หน้า JSP ปกติจะปรากฏขึ้นจากนั้นคลิกสองปุ่ม
---อัปเดต---
โมฆะ
---บันทึก---
โมฆะ
นี่แสดงให้เห็นว่าสาย struts2 เสร็จสมบูรณ์และไม่มีปัญหากับสภาพแวดล้อม ณ จุดนี้สภาพแวดล้อมการพัฒนา Struts2 ได้ถูกสร้างขึ้น
เราเห็นว่าคอนโซลเอาท์พุท NULL ซึ่งหมายความว่าหมวดหมู่บริการว่างเปล่าซึ่งหมายความว่าเราไม่ได้รับหมวดหมู่บริการเลยเพราะเราไม่ได้รวมเข้ากับฤดูใบไม้ผลิและไม่ได้รับการฉีดดังนั้น NULL จึงเป็นเรื่องปกติ เราพลิกไปตามเอาต์พุตข้อมูลจากคอนโซลและเราจะพบข้อความ: การเลือกถั่ว (struts) สำหรับ (com.opensymphony.xwork2.objectFactory) วงเล็บบอกว่า struts ถูกสร้างขึ้นโดย struts2 ก่อนที่จะรวมเข้ากับฤดูใบไม้ผลิ
6. การรวม Spring and Struts2
6.1 เพิ่มแพ็คเกจ Jar ที่เกี่ยวข้อง
เมื่อรวมสปริงและ struts2 แพ็คเกจ JAR ส่วนใหญ่จะอยู่ใน Spring4.2.4-Web รวมถึง Struts2-Spring-Plugin-2.3.24.1.jar แพ็คเกจคู่มือจะไม่ถูกอธิบายอีกครั้ง
6.2 ออกจากการดำเนินการและการพึ่งพาการจัดการฤดูใบไม้ผลิ
กำหนดค่าการกระทำและการพึ่งพาในไฟล์การกำหนดค่าของ Spring.xml ขณะนี้เรามีการกระทำเพียงครั้งเดียวซึ่งกำหนดค่าดังนี้:
<bean id = "วันที่" /> <bean id = "หมวดหมู่" scope = "ต้นแบบ"> <ชื่อคุณสมบัติ = "categoryService" ref = "หมวดหมู่บริการ" /> <!
6.3 แก้ไขการกำหนดค่าใน struts.xml
ปรากฎว่าใน struts.xml แอตทริบิวต์คลาสสอดคล้องกับชื่อที่มีคุณสมบัติครบถ้วนของการกระทำที่เฉพาะเจาะจง ตอนนี้เปลี่ยนค่าของแอตทริบิวต์คลาสเป็นค่า id ของการกระทำที่กำหนดค่าในฤดูใบไม้ผลินั่นคือหมวดหมู่ดังนี้:
<struts> <package name = "Shop" Extre = "struts-default"> <!-คลาสสอดคล้องกับค่า id ของการกระทำที่กำหนดค่าในฤดูใบไม้ผลิเพราะมันจะถูกส่งไปยังการจัดการฤดูใบไม้ผลิ-> <action name = "category_*" method = "{1}"> <ชื่อผลลัพธ์ = "ดัชนี">/index.js 6.4 กำหนดค่าฟัง
กำหนดค่า contextloaderListener ของ Listener ใน web.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 <plude-name> e_shop </display-name> <welcome-file-list> <welcome-file> index.jsp </welcome-file> </welcome-file-list> <filter> <stripter-name> struts2 </filter-name> </filter> <filter-mapping> <silter-name> struts2 </filter-name> <url-pattern>*. การกระทำ </url-pattern> </filter-mapping> <!-ลำดับความสำคัญเริ่มต้นของผู้ฟังใน web.xml สูงกว่าตัวกรอง <Sistener-Lass> org.springframework.web.context.contextloaderListener </listener-class> </listener> <context-param> <param-name> contextconfiglocation </param-name> <param-value> classpath: beans.xml
6.5 ผลการทดสอบการรวม
เราเพิ่มคำสั่งใหม่ลงในการดำเนินการเพื่ออัปเดตฐานข้อมูลดังนี้:
หมวดหมู่ระดับสาธารณะขยายการกระทำที่มีการดำเนินการ {หมวดหมู่ส่วนตัว; // ตั้งค่าตัวแปรสมาชิกส่วนตัวเพื่อรับพารามิเตอร์ที่นำโดย URL โปรดทราบว่าควรเขียนวิธี GET และ SET ด้านล่าง หมวดหมู่ส่วนตัวหมวดหมู่บริการ; โมฆะสาธารณะ setCategoryService (หมวดหมู่บริการหมวดหมู่ Service) {this.CategoryService = categoryService; } การอัปเดตสตริงสาธารณะ () {system.out.println ("--- อัปเดต ---"); System.out.println (categoryservice); // เนื่องจากมันถูกรวมเข้ากับฤดูใบไม้ผลิคุณสามารถรับหมวดหมู่นี้ได้ มันไม่ได้เป็นโมฆะหลังจากพิมพ์ออกมาหมวดหมู่ Service.update (หมวดหมู่); // เพิ่มคำสั่งใหม่เพื่ออัปเดตฐานข้อมูลส่งคืน "ดัชนี"; } สตริงสาธารณะบันทึก () {system.out.println (categoryService); กลับ "ดัชนี"; } หมวดหมู่สาธารณะ getCategory () {return category; } โมฆะสาธารณะ setCategory (หมวดหมู่หมวดหมู่) {this.category = หมวดหมู่; - จากนั้นเราแก้ไขไฟล์ index.jsp ดังนี้:
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <! doctype html สาธารณะ "-// w3c // dtd html 4.01 transitional // en"> <html> href = "$ {pageContext.request.contextpath} /category_update.action?category.id=2&category.type=gga&category.hot=false"> การอัปเดตการเข้าถึง </a> <a href = "category_save.action จากนั้นเราปรับใช้โครงการต่อไปนี้เปิดเซิร์ฟเวอร์ Tomcat, Enter: http: // localhost: 8080/e_shop/index.jsp ในเบราว์เซอร์หน้า JSP ปกติจะปรากฏขึ้นจากนั้นคลิกปุ่ม "การอัปเดตการเข้าถึง"
--- อัปเดต --- cn.it.shop.service.impl.categoryserviceimpl@7c5ecf80 Hibernate: อัปเดตหมวดหมู่ชุด hot =?, type =? id =?
เราสามารถส่งออกข้อมูลของวัตถุหมวดหมู่บริการและยังสามารถส่งออกคำสั่ง SQL เมื่อดำเนินการคำสั่ง UPDATE จากนั้นเราสอบถามฐานข้อมูลและพบว่าประเภทของข้อมูลที่มี ID = 2 ได้รับการอัปเดตเป็น GGA และ HOT ได้รับการอัปเดตเป็น FALSE เราพลิกเอาต์พุตข้อมูลจากคอนโซลขึ้นไปและเราจะพบข้อความ: การเลือกถั่ว (สปริง) สำหรับ (com.opensymphony.xwork2.objectFactory) พร้อมกับวงเล็บฤดูใบไม้ผลิ เมื่อเทียบกับสถานการณ์ข้างต้นเราจะเห็นว่าหลังจาก struts2 ถูกรวมเข้ากับฤดูใบไม้ผลิการกระทำจะถูกส่งมอบให้กับฤดูใบไม้ผลิเพื่อการจัดการ
ณ จุดนี้การรวมกันของ Struts2, Hibernate4 และ Spring4 เสร็จสมบูรณ์และเราสามารถพัฒนามันในสภาพแวดล้อม SSH ต่อไป!
แพ็คเกจ JAR ที่สมบูรณ์ที่จำเป็นสำหรับการรวม SSH ที่แนะนำในบทความนี้: ดาวน์โหลดฟรี
ซอร์สโค้ดดาวน์โหลดที่อยู่ของโครงการทั้งหมด: //www.vevb.com/article/86099.htm
ที่อยู่ดั้งเดิม: http://blog.csdn.net/eson_15/article/details/51277324
(หมายเหตุ: ในตอนท้ายการดาวน์โหลดซอร์สโค้ดของโครงการทั้งหมดมีให้! ทุกคนยินดีที่จะรวบรวมหรือติดตาม)
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น