Struts 2 - คู่มือฉบับย่อ
Mโอเดล Vเอียว Cผู้ควบคุมหรือ MVCตามที่นิยมเรียกกันว่าเป็นรูปแบบการออกแบบซอฟต์แวร์สำหรับพัฒนาเว็บแอปพลิเคชัน รูปแบบ Model View Controller ประกอบด้วยสามส่วนต่อไปนี้ -
Model - ระดับต่ำสุดของรูปแบบที่รับผิดชอบในการรักษาข้อมูล
View - มีหน้าที่ในการแสดงข้อมูลทั้งหมดหรือบางส่วนให้กับผู้ใช้
Controller - รหัสซอฟต์แวร์ที่ควบคุมการโต้ตอบระหว่าง Model และ View
MVC ได้รับความนิยมเนื่องจากแยกตรรกะของแอปพลิเคชันออกจากเลเยอร์อินเทอร์เฟซผู้ใช้และสนับสนุนการแยกข้อกังวล ที่นี่ Controller จะรับคำขอทั้งหมดสำหรับแอปพลิเคชันจากนั้นจะทำงานร่วมกับ Model เพื่อเตรียมข้อมูลที่ต้องการโดย View จากนั้น View จะใช้ข้อมูลที่เตรียมโดย Controller เพื่อสร้างคำตอบสุดท้ายที่สามารถนำเสนอได้ นามธรรม MVC สามารถแสดงเป็นกราฟิกได้ดังนี้
นางแบบ
แบบจำลองมีหน้าที่จัดการข้อมูลของแอปพลิเคชัน ตอบสนองต่อคำขอจากมุมมองและยังตอบสนองต่อคำสั่งจากคอนโทรลเลอร์เพื่ออัปเดตตัวเอง
มุมมอง
หมายถึงการนำเสนอข้อมูลในรูปแบบเฉพาะที่เกิดจากการตัดสินใจของผู้ควบคุมในการนำเสนอข้อมูล เป็นระบบเทมเพลตที่ใช้สคริปต์เช่น JSP, ASP, PHP และง่ายต่อการผสานรวมกับเทคโนโลยี AJAX
ตัวควบคุม
คอนโทรลเลอร์มีหน้าที่ตอบสนองต่ออินพุตของผู้ใช้และดำเนินการโต้ตอบกับอ็อบเจ็กต์โมเดลข้อมูล คอนโทรลเลอร์ได้รับอินพุตจะตรวจสอบความถูกต้องของอินพุตและดำเนินการทางธุรกิจที่ปรับเปลี่ยนสถานะของโมเดลข้อมูล
Struts2เป็นกรอบงานที่ใช้ MVC ในบทต่อ ๆ ไปให้เราดูว่าเราจะใช้วิธีการ MVC ภายใน Struts2 ได้อย่างไร
Struts2เป็นเฟรมเวิร์กแอปพลิเคชันบนเว็บที่เป็นที่นิยมและเป็นผู้ใหญ่ตามรูปแบบการออกแบบ MVC Struts2 ไม่ใช่แค่ Struts 1 เวอร์ชันใหม่ แต่เป็นการเขียนสถาปัตยกรรม Struts ใหม่ทั้งหมด
เฟรมเวิร์ก Webwork เริ่มต้นด้วยเฟรมเวิร์ก Struts เป็นพื้นฐานและเป้าหมายของมันคือการนำเสนอเฟรมเวิร์กที่ได้รับการปรับปรุงและปรับปรุงที่สร้างขึ้นบน Struts เพื่อให้การพัฒนาเว็บง่ายขึ้นสำหรับนักพัฒนา
หลังจากนั้นไม่นาน Webwork framework และชุมชน Struts ก็ร่วมมือกันสร้าง Struts2 framework อันโด่งดัง
คุณสมบัติของ Struts 2 Framework
นี่คือคุณสมบัติที่ยอดเยี่ยมบางประการที่อาจบังคับให้คุณพิจารณา Struts2 -
POJO Forms and POJO Actions- Struts2 เลิกใช้แบบฟอร์มการดำเนินการซึ่งเป็นส่วนสำคัญของกรอบงาน Struts ด้วย Struts2 คุณสามารถใช้ POJO ใดก็ได้เพื่อรับอินพุตแบบฟอร์ม ในทำนองเดียวกันตอนนี้คุณสามารถเห็น POJO เป็นคลาส Action ได้แล้ว
Tag Support - Struts2 ได้ปรับปรุงแท็กฟอร์มและแท็กใหม่ซึ่งช่วยให้นักพัฒนาเขียนโค้ดน้อยลง
AJAX Support - Struts2 ยอมรับการครอบครองโดยเทคโนโลยี Web2.0 และได้รวมการสนับสนุน AJAX เข้ากับผลิตภัณฑ์ด้วยการสร้างแท็ก AJAX ฟังก์ชันนี้จะคล้ายกับแท็ก Struts2 มาตรฐานมาก
Easy Integration - การผสานรวมกับเฟรมเวิร์กอื่น ๆ เช่น Spring, Tiles และ SiteMesh ทำได้ง่ายขึ้นด้วยการผสานรวมที่หลากหลายกับ Struts2
Template Support - รองรับการสร้างมุมมองโดยใช้เทมเพลต
Plugin Support- พฤติกรรมหลักของ Struts2 สามารถปรับปรุงและเพิ่มได้โดยการใช้ปลั๊กอิน มีปลั๊กอินจำนวนมากสำหรับ Struts2
Profiling- Struts2 นำเสนอการทำโปรไฟล์แบบบูรณาการเพื่อแก้ไขข้อบกพร่องและกำหนดโปรไฟล์แอปพลิเคชัน นอกจากนี้ Struts ยังมีการดีบักแบบบูรณาการด้วยความช่วยเหลือของเครื่องมือดีบั๊กในตัว
Easy to Modify Tags- แท็กมาร์กอัปใน Struts2 สามารถปรับแต่งได้โดยใช้เทมเพลต Freemarker สิ่งนี้ไม่จำเป็นต้องมีความรู้ JSP หรือ java ความรู้พื้นฐาน HTML, XML และ CSS เพียงพอที่จะแก้ไขแท็ก
Promote Less configuration- Struts2 ส่งเสริมการกำหนดค่าน้อยลงด้วยความช่วยเหลือของการใช้ค่าเริ่มต้นสำหรับการตั้งค่าต่างๆ คุณไม่จำเป็นต้องกำหนดค่าบางอย่างเว้นแต่จะเบี่ยงเบนไปจากการตั้งค่าเริ่มต้นที่ Struts2 กำหนด
View Technologies - Struts2 รองรับตัวเลือกหลายมุมมอง (JSP, Freemarker, Velocity และ XSLT)
รายการด้านบนเป็นคุณสมบัติ 10 อันดับแรกของ Struts 2 ซึ่งทำให้เป็นกรอบงานที่พร้อมใช้งานสำหรับองค์กร
Struts 2 ข้อเสีย
แม้ว่า Struts 2 จะมาพร้อมกับรายการคุณสมบัติที่ยอดเยี่ยม แต่ก็มีข้อ จำกัด บางประการของเวอร์ชันปัจจุบัน - Struts 2 ซึ่งต้องปรับปรุงเพิ่มเติม รายการนี้เป็นประเด็นหลักบางประการ -
Bigger Learning Curve - ในการใช้ MVC กับ Struts คุณต้องคุ้นเคยกับ JSP มาตรฐาน Servlet API และกรอบงานที่มีขนาดใหญ่และซับซ้อน
Poor Documentation - เมื่อเปรียบเทียบกับ servlet มาตรฐานและ JSP API แล้ว Struts มีทรัพยากรออนไลน์น้อยกว่าและผู้ใช้ครั้งแรกจำนวนมากพบว่าเอกสาร Apache ออนไลน์สับสนและจัดระเบียบไม่ดี
Less Transparent - ด้วยแอปพลิเคชัน Struts มีเบื้องหลังเบื้องหลังมากกว่าแอปพลิเคชันบนเว็บที่ใช้ Java ทั่วไปซึ่งทำให้เข้าใจกรอบงานได้ยาก
หมายเหตุสุดท้ายเฟรมเวิร์กที่ดีควรให้ลักษณะการทำงานทั่วไปที่แอปพลิเคชันประเภทต่างๆสามารถใช้ประโยชน์ได้
Struts 2 เป็นหนึ่งในเว็บเฟรมเวิร์กที่ดีที่สุดและถูกใช้อย่างมากในการพัฒนา Rich Internet Applications (RIA)
งานแรกของเราคือการทำให้แอปพลิเคชั่น Struts 2 ทำงานน้อยที่สุด บทนี้จะแนะนำคุณเกี่ยวกับวิธีการเตรียมสภาพแวดล้อมการพัฒนาเพื่อเริ่มงานกับ Struts 2
ฉันคิดว่าคุณมี JDK (5+), Tomcat และ Eclipse ติดตั้งอยู่ในเครื่องของคุณแล้ว หากคุณไม่ได้ติดตั้งส่วนประกอบเหล่านี้ให้ทำตามขั้นตอนที่กำหนดบนแทร็กด่วน -
ขั้นตอนที่ 1 - ตั้งค่า Java Development Kit (JDK)
คุณสามารถดาวน์โหลด SDK เวอร์ชันล่าสุดจากเว็บไซต์ Java ของออราเคิล - Java SE ดาวน์โหลด คุณจะพบคำแนะนำในการติดตั้ง JDK ในไฟล์ที่ดาวน์โหลดทำตามคำแนะนำที่กำหนดเพื่อติดตั้งและกำหนดค่าการตั้งค่า สุดท้ายตั้งค่าตัวแปรสภาพแวดล้อม PATH และ JAVA_HOME เพื่ออ้างถึงไดเร็กทอรีที่มี java และ javac โดยทั่วไปคือ java_install_dir / bin และ java_install_dir ตามลำดับ
หากคุณใช้ Windows และติดตั้ง SDK ใน C: \ jdk1.5.0_20 คุณควรป้อนบรรทัดต่อไปนี้ในไฟล์ C: \ autoexec.bat ของคุณ
set PATH = C:\jdk1.5.0_20\bin;%PATH%
set JAVA_HOME = C:\jdk1.5.0_20
หรือใน Windows NT / 2000 / XP -
คุณสามารถคลิกขวาที่ My Computer เลือก Properties จากนั้น Advanced จากนั้น Environment Variables จากนั้นคุณจะอัปเดตค่า PATH และกดปุ่ม OK
ใน Unix (Solaris, Linux ฯลฯ ) หากติดตั้ง SDK ใน /usr/local/jdk1.5.0_20 และคุณใช้ C เชลล์คุณจะใส่สิ่งต่อไปนี้ลงในไฟล์. cshrc ของคุณ
ใน Unix (Solaris, Linux ฯลฯ ) หากติดตั้ง SDK ใน /usr/local/jdk1.5.0_20 และคุณใช้ C เชลล์คุณจะใส่สิ่งต่อไปนี้ลงในไฟล์. cshrc ของคุณ
setenv PATH /usr/local/jdk1.5.0_20/bin:$PATH
setenv JAVA_HOME /usr/local/jdk1.5.0_20
หรือถ้าคุณใช้ Integrated Development Environment (IDE) เช่น Borland JBuilder, Eclipse, IntelliJ IDEA หรือ Sun ONE Studio ให้คอมไพล์และรันโปรแกรมง่ายๆเพื่อยืนยันว่า IDE รู้ตำแหน่งที่คุณติดตั้ง Java มิฉะนั้นให้ทำการตั้งค่าที่เหมาะสมตาม เอกสารของ IDE
ขั้นตอนที่ 2 - ตั้งค่า Apache Tomcat
คุณสามารถดาวน์โหลด Tomcat เวอร์ชันล่าสุดได้จาก https://tomcat.apache.org/. เมื่อคุณดาวน์โหลดการติดตั้งแล้วให้แกะการแจกแจงไบนารีในตำแหน่งที่สะดวก
ตัวอย่างเช่นใน C: \ apache-tomcat-6.0.33 บน windows หรือ /usr/local/apachetomcat-6.0.33 บน Linux / Unix และสร้างตัวแปรสภาพแวดล้อม CATALINA_HOME ที่ชี้ไปยังตำแหน่งเหล่านี้
คุณสามารถเริ่ม Tomcat ได้โดยดำเนินการตามคำสั่งต่อไปนี้บนเครื่อง windows หรือคุณสามารถดับเบิลคลิกที่ startup.bat
%CATALINA_HOME%\bin\startup.bat
or
C:\apache-tomcat-6.0.33\bin\startup.bat
Tomcat สามารถเริ่มต้นได้โดยดำเนินการคำสั่งต่อไปนี้บนเครื่อง Unix (Solaris, Linux และอื่น ๆ ) -
$CATALINA_HOME/bin/startup.sh
or
/usr/local/apache-tomcat-6.0.33/bin/startup.sh
หลังจากเริ่มต้นสำเร็จเว็บแอปพลิเคชันเริ่มต้นที่มาพร้อมกับ Tomcat จะพร้อมใช้งานโดยไปที่ http://localhost:8080/. หากทุกอย่างเรียบร้อยดีควรแสดงผลลัพธ์ต่อไปนี้ -
ข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่าและการเรียกใช้ Tomcat สามารถพบได้ในเอกสารประกอบที่นี่รวมถึงเว็บไซต์ Tomcat: https://tomcat.apache.org/
Tomcat สามารถหยุดได้โดยดำเนินการคำสั่งต่อไปนี้บนเครื่อง windows -
%CATALINA_HOME%\bin\shutdown
or
C:\apache-tomcat-5.5.29\bin\shutdown
Tomcat สามารถหยุดได้โดยดำเนินการคำสั่งต่อไปนี้บนเครื่อง Unix (Solaris, Linux และอื่น ๆ ) -
$CATALINA_HOME/bin/shutdown.sh
or
/usr/local/apache-tomcat-5.5.29/bin/shutdown.sh
ขั้นตอนที่ 3 - ตั้งค่า Eclipse (IDE)
ตัวอย่างทั้งหมดในบทช่วยสอนนี้เขียนโดยใช้ Eclipse IDE ฉันขอแนะนำว่าคุณมี Eclipse เวอร์ชันล่าสุดติดตั้งอยู่ในเครื่องของคุณ
ในการติดตั้ง Eclipse ให้ดาวน์โหลดไบนารี Eclipse ล่าสุดจาก https://www.eclipse.org/downloads/. เมื่อคุณดาวน์โหลดการติดตั้งแล้วให้แกะการกระจายไบนารีในตำแหน่งที่สะดวก
ตัวอย่างเช่นใน C: \ eclipse บน windows หรือ / usr / local / eclipse บน Linux / Unix และสุดท้ายตั้งค่าตัวแปร PATH ให้เหมาะสม Eclipse สามารถเริ่มต้นได้โดยดำเนินการคำสั่งต่อไปนี้บนเครื่อง windows หรือคุณสามารถดับเบิลคลิกที่ eclipse.exe
%C:\eclipse\eclipse.exe
Eclipse สามารถเริ่มต้นได้โดยดำเนินการคำสั่งต่อไปนี้บนเครื่อง Unix (Solaris, Linux และอื่น ๆ ) -
$/usr/local/eclipse/eclipse
หลังจากเริ่มต้นสำเร็จหากทุกอย่างเรียบร้อยดีควรแสดงผลลัพธ์ต่อไปนี้ -
ขั้นตอนที่ 4 - ตั้งค่าไลบรารี Struts2
ตอนนี้ถ้าทุกอย่างเรียบร้อยคุณสามารถดำเนินการตั้งค่า Struts2 framemwork ของคุณได้ ต่อไปนี้เป็นขั้นตอนง่ายๆในการดาวน์โหลดและติดตั้ง Struts2 บนเครื่องของคุณ
เลือกว่าคุณต้องการติดตั้ง Struts2 บน Windows หรือ Unix จากนั้นดำเนินการขั้นตอนต่อไปเพื่อดาวน์โหลดไฟล์. zip สำหรับ windows และไฟล์. tz สำหรับ Unix
ดาวน์โหลดเวอร์ชันล่าสุดของไบนารี Struts2 จาก https://struts.apache.org/download.cgi.
ในขณะที่เขียนบทช่วยสอนนี้ฉันดาวน์โหลด struts-2.0.14-all.zip และเมื่อคุณคลายซิปไฟล์ที่ดาวน์โหลดมามันจะให้โครงสร้างไดเร็กทอรีภายใน C: \ struts-2.2.3 ดังต่อไปนี้
ขั้นตอนที่สองคือการแตกไฟล์ zip จากที่ใดก็ได้ฉันดาวน์โหลดและแตกไฟล์ struts-2.2.3-all.zip ใน c:\ โฟลเดอร์ในเครื่อง Windows 7 ของฉันเพื่อให้ฉันมีไฟล์ jar ทั้งหมดเป็นไฟล์ C:\struts-2.2.3\lib. ตรวจสอบให้แน่ใจว่าคุณตั้งค่าตัวแปร CLASSPATH ของคุณอย่างถูกต้องมิฉะนั้นคุณจะประสบปัญหาขณะเรียกใช้แอปพลิเคชันของคุณ
จากระดับสูง Struts2 เป็นเฟรมเวิร์กแบบดึง MVC (หรือ MVC2) รูปแบบ Model-ViewController ใน Struts2 ถูกนำไปใช้กับส่วนประกอบหลัก 5 ส่วนต่อไปนี้ -
- Actions
- Interceptors
- กองค่า / OGNL
- ผลลัพธ์ / ประเภทผลลัพธ์
- ดูเทคโนโลยี
Struts 2 แตกต่างจากเฟรมเวิร์ก MVC แบบเดิมเล็กน้อยซึ่งการกระทำจะมีบทบาทของโมเดลมากกว่าตัวควบคุมแม้ว่าจะมีการทับซ้อนกันอยู่บ้างก็ตาม
แผนภาพด้านบนแสดงถึงไฟล์ Mโอเดล View และ Cผู้ควบคุมไปยังสถาปัตยกรรมระดับสูง Struts2 ตัวควบคุมใช้งานด้วยไฟล์Struts2จัดส่งตัวกรอง servlet เช่นเดียวกับตัวสกัดกั้นโมเดลนี้ถูกนำไปใช้กับการดำเนินการและมุมมองเป็นการรวมกันของประเภทผลลัพธ์และผลลัพธ์ กองค่าและ OGNL จัดเตรียมเธรดทั่วไปการเชื่อมโยงและการเปิดใช้งานการรวมระหว่างส่วนประกอบอื่น ๆ
นอกเหนือจากส่วนประกอบข้างต้นแล้วยังมีข้อมูลอีกมากมายที่เกี่ยวข้องกับการกำหนดค่า การกำหนดค่าสำหรับเว็บแอปพลิเคชันตลอดจนการกำหนดค่าสำหรับการกระทำตัวสกัดกั้นผลลัพธ์ ฯลฯ
นี่คือภาพรวมสถาปัตยกรรมของรูปแบบ Struts 2 MVC เราจะพูดถึงแต่ละองค์ประกอบโดยละเอียดในบทต่อ ๆ ไป
ขอวงจรชีวิต
จากแผนภาพด้านบนคุณสามารถเข้าใจขั้นตอนการทำงานผ่านวงจรชีวิตคำขอของผู้ใช้ใน Struts 2 ดังต่อไปนี้ -
ผู้ใช้ส่งคำขอไปยังเซิร์ฟเวอร์เพื่อขอทรัพยากรบางอย่าง (เช่นเพจ)
Filter Dispatcher จะตรวจสอบคำขอจากนั้นกำหนดการดำเนินการที่เหมาะสม
ฟังก์ชันเครื่องสกัดกั้นที่กำหนดค่าไว้ใช้เช่นการตรวจสอบความถูกต้องการอัปโหลดไฟล์เป็นต้น
การดำเนินการที่เลือกจะดำเนินการตามการดำเนินการที่ร้องขอ
อีกครั้งมีการใช้ตัวสกัดกั้นที่กำหนดค่าไว้เพื่อดำเนินการหลังการประมวลผลหากจำเป็น
สุดท้ายผลลัพธ์จะถูกจัดเตรียมโดยมุมมองและส่งคืนผลลัพธ์ให้กับผู้ใช้
ดังที่คุณได้เรียนรู้แล้วจากสถาปัตยกรรม Struts 2 เมื่อคุณคลิกที่ไฮเปอร์ลิงก์หรือส่งแบบฟอร์ม HTML ในเว็บแอปพลิเคชัน Struts 2 อินพุตจะถูกรวบรวมโดยคอนโทรลเลอร์ซึ่งส่งไปยังคลาส Java ที่เรียกว่า Actions หลังจากดำเนินการดำเนินการผลลัพธ์จะเลือกทรัพยากรที่จะแสดงผลการตอบกลับ โดยทั่วไปทรัพยากรจะเป็น JSP แต่อาจเป็นไฟล์ PDF สเปรดชีต Excel หรือหน้าต่าง Java applet ก็ได้
สมมติว่าคุณได้สร้างสภาพแวดล้อมการพัฒนาของคุณแล้ว ตอนนี้ให้เราดำเนินการสร้างอาคารแรกของเราHello World Struts2โครงการ. จุดมุ่งหมายของโครงการนี้คือการสร้างเว็บแอปพลิเคชันที่รวบรวมชื่อของผู้ใช้และแสดง "Hello World" ตามด้วยชื่อผู้ใช้
เราจะต้องสร้างองค์ประกอบสี่อย่างต่อไปนี้สำหรับโครงการ Struts 2 ใด ๆ -
ซีเนียร์ No | ส่วนประกอบและคำอธิบาย |
---|---|
1 | Action สร้างคลาสการดำเนินการซึ่งจะมีตรรกะทางธุรกิจที่สมบูรณ์และควบคุมการโต้ตอบระหว่างผู้ใช้โมเดลและมุมมอง |
2 | Interceptors สร้างเครื่องสกัดกั้นหากจำเป็นหรือใช้เครื่องสกัดกั้นที่มีอยู่ นี่เป็นส่วนหนึ่งของ Controller |
3 | View สร้าง JSP เพื่อโต้ตอบกับผู้ใช้เพื่อรับอินพุตและนำเสนอข้อความสุดท้าย |
4 | Configuration Files สร้างไฟล์คอนฟิกูเรชันเพื่อจับคู่ Action, View และ Controllers ไฟล์เหล่านี้คือ struts.xml, web.xml, struts.properties |
ฉันจะใช้ Eclipse IDE เพื่อให้ส่วนประกอบที่จำเป็นทั้งหมดถูกสร้างขึ้นภายใต้ Dynamic Web Project ให้เราเริ่มต้นด้วยการสร้าง Dynamic Web Project
สร้างโครงการเว็บแบบไดนามิก
เริ่ม Eclipse ของคุณแล้วไปด้วย File > New > Dynamic Web Project และป้อนชื่อโครงการเป็น HelloWorldStruts2 และตั้งค่าตัวเลือกที่เหลือตามที่ระบุในหน้าจอต่อไปนี้ -
เลือกตัวเลือกเริ่มต้นทั้งหมดในหน้าจอถัดไปและสุดท้ายตรวจสอบ Generate Web.xml deployment descriptorตัวเลือก สิ่งนี้จะสร้างโครงการเว็บแบบไดนามิกให้คุณใน Eclipse ตอนนี้ไปกับWindows > Show View > Project Explorerและคุณจะเห็นหน้าต่างโครงการของคุณดังต่อไปนี้ -
ตอนนี้คัดลอกไฟล์ต่อไปนี้จากโฟลเดอร์ struts 2 lib C:\struts-2.2.3\lib ไปยังโครงการของเรา WEB-INF\libโฟลเดอร์ ในการดำเนินการนี้คุณสามารถลากและวางไฟล์ต่อไปนี้ทั้งหมดลงในโฟลเดอร์ WEB-INF \ lib
- commons-fileupload-x.y.z.jar
- commons-io-x.y.z.jar
- commons-lang-x.y.jar
- commons-logging-x.y.z.jar
- commons-logging-api-x.y.jar
- freemarker-x.y.z.jar
- javassist-.xy.z.GA
- ognl-x.y.z.jar
- struts2-core-x.y.z.jar
- xwork-core.x.y.z.jar
สร้างคลาสการดำเนินการ
คลาสการดำเนินการเป็นกุญแจสำคัญของแอปพลิเคชัน Struts 2 และเราใช้ตรรกะทางธุรกิจส่วนใหญ่ในคลาสแอ็คชั่น ให้เราสร้างไฟล์ java HelloWorldAction.java ภายใต้Java Resources > src ด้วยชื่อแพ็คเกจ com.tutorialspoint.struts2 ด้วยเนื้อหาที่ระบุด้านล่าง
คลาส Action ตอบสนองต่อการกระทำของผู้ใช้เมื่อผู้ใช้คลิก URL เมธอดของคลาส Action อย่างน้อยหนึ่งถูกเรียกใช้งานและผลลัพธ์ String จะถูกส่งกลับ ขึ้นอยู่กับค่าของผลลัพธ์เพจ JSP เฉพาะจะถูกแสดงผล
package com.tutorialspoint.struts2;
public class HelloWorldAction {
private String name;
public String execute() throws Exception {
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
นี่เป็นคลาสที่เรียบง่ายมากที่มีคุณสมบัติหนึ่งที่เรียกว่า "ชื่อ" เรามี getters มาตรฐานและเมธอด setter สำหรับคุณสมบัติ "name" และเมธอด execute ที่ส่งกลับสตริง "success"
กรอบงาน Struts 2 จะสร้างวัตถุของ HelloWorldActionคลาสและเรียกใช้เมธอดที่เรียกใช้เพื่อตอบสนองต่อการกระทำของผู้ใช้ คุณใส่ตรรกะทางธุรกิจของคุณไว้ในวิธีนี้ซึ่งสุดท้ายจะส่งคืนค่าคงที่ของสตริง กล่าวอีกนัยหนึ่งสำหรับแต่ละ URL คุณจะต้องใช้คลาสแอ็คชันหนึ่งคลาสและคุณสามารถใช้ชื่อคลาสนั้นโดยตรงเป็นชื่อแอ็คชันของคุณหรือคุณสามารถแมปกับชื่ออื่นโดยใช้ไฟล์ struts.xml ดังที่แสดงด้านล่าง
สร้างมุมมอง
เราต้องการ JSP เพื่อนำเสนอข้อความสุดท้ายหน้านี้จะถูกเรียกโดยเฟรมเวิร์ก Struts 2 เมื่อการกระทำที่กำหนดไว้ล่วงหน้าจะเกิดขึ้นและการแมปนี้จะถูกกำหนดในไฟล์ struts.xml ให้เราสร้างไฟล์ jsp ด้านล่างHelloWorld.jspในโฟลเดอร์ WebContent ในโปรเจ็กต์ eclipse ของคุณ ในการดำเนินการนี้ให้คลิกขวาที่โฟลเดอร์ WebContent ใน project explorer และเลือกNew >JSP File.
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World, <s:property value = "name"/>
</body>
</html>
คำสั่ง taglib บอกคอนเทนเนอร์ Servlet ว่าหน้านี้จะใช้ไฟล์ Struts 2 แท็กและแท็กเหล่านี้จะนำหน้าด้วย s.
แท็ก s: property แสดงค่าของ action class property "name> ซึ่งส่งคืนโดยเมธอด getName() ของคลาส HelloWorldAction
สร้างหน้าหลัก
เรายังต้องสร้าง index.jspในโฟลเดอร์ WebContent ไฟล์นี้จะทำหน้าที่เป็น URL การดำเนินการเริ่มต้นที่ผู้ใช้สามารถคลิกเพื่อบอกกรอบงาน Struts 2 เพื่อเรียกใช้เมธอดที่กำหนดไว้ของคลาส HelloWorldAction และแสดงผลมุมมอง HelloWorld.jsp
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World From Struts2</h1>
<form action = "hello">
<label for = "name">Please enter your name</label><br/>
<input type = "text" name = "name"/>
<input type = "submit" value = "Say Hello"/>
</form>
</body>
</html>
helloการดำเนินการที่กำหนดไว้ในไฟล์มุมมองด้านบนจะถูกแมปกับคลาส HelloWorldAction และวิธีการดำเนินการโดยใช้ไฟล์ struts.xml เมื่อผู้ใช้คลิกที่ปุ่มส่งจะทำให้เฟรมเวิร์ก Struts 2 รันเมธอดที่กำหนดไว้ในคลาส HelloWorldAction และขึ้นอยู่กับค่าที่ส่งคืนของเมธอดมุมมองที่เหมาะสมจะถูกเลือกและแสดงผลเป็นการตอบสนอง
ไฟล์การกำหนดค่า
เราจำเป็นต้องมีการแมปเพื่อผูก URL คลาส HelloWorldAction (โมเดล) และ HelloWorld.jsp (มุมมอง) เข้าด้วยกัน การแม็ปจะบอกเฟรมเวิร์ก Struts 2 ว่าคลาสใดจะตอบสนองต่อการกระทำของผู้ใช้ (URL) วิธีการของคลาสนั้นจะถูกเรียกใช้และมุมมองใดที่จะแสดงผลตามผลลัพธ์ของสตริงที่เมธอดส่งคืน
ให้เราสร้างไฟล์ชื่อ struts.xml. เนื่องจาก Struts 2 ต้องการให้ struts.xml อยู่ในโฟลเดอร์คลาส ดังนั้นสร้างไฟล์ struts.xml ภายใต้โฟลเดอร์ WebContent / WEB-INF / คลาส Eclipse ไม่ได้สร้างโฟลเดอร์ "คลาส" ตามค่าเริ่มต้นดังนั้นคุณต้องดำเนินการด้วยตัวเอง ในการดำเนินการนี้ให้คลิกขวาที่โฟลเดอร์ WEB-INF ใน project explorer และเลือกNew > Folder. struts.xml ของคุณควรมีลักษณะดังนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
คำไม่กี่คำที่ต้องเข้าใจเกี่ยวกับไฟล์กำหนดค่าข้างต้น ที่นี่เราตั้งค่าคงที่struts.devMode ถึง trueเนื่องจากเรากำลังทำงานในสภาพแวดล้อมการพัฒนาและเราจำเป็นต้องเห็นข้อความบันทึกที่เป็นประโยชน์ จากนั้นเรากำหนดแพ็คเกจที่เรียกว่าhelloworld.
การสร้างแพ็คเกจมีประโยชน์เมื่อคุณต้องการรวมกลุ่มการกระทำของคุณเข้าด้วยกัน ในตัวอย่างของเราเราตั้งชื่อการกระทำของเราว่า "สวัสดี" ซึ่งสอดคล้องกับ URL/hello.action และได้รับการสำรองข้อมูลโดยไฟล์HelloWorldAction.class. execute วิธีการของ HelloWorldAction.class เป็นวิธีการที่เรียกใช้เมื่อ URL /hello.actionถูกเรียกใช้ หากผลลัพธ์ของวิธีการดำเนินการส่งกลับ "สำเร็จ" เราจะนำผู้ใช้ไปที่HelloWorld.jsp.
ขั้นตอนต่อไปคือการสร้างไฟล์ web.xmlไฟล์ซึ่งเป็นจุดเริ่มต้นสำหรับการร้องขอไปยัง Struts 2 จุดเริ่มต้นของแอ็พพลิเคชัน Struts2 จะเป็นตัวกรองที่กำหนดไว้ในตัวอธิบายการปรับใช้ (web.xml) ดังนั้นเราจะกำหนดรายการของคลาส org.apache.struts2.dispatcher.FilterDispatcher ใน web.xml ต้องสร้างไฟล์ web.xml ภายใต้โฟลเดอร์ WEB-INF ภายใต้ WebContent Eclipse ได้สร้างไฟล์ skeleton web.xml สำหรับคุณแล้วเมื่อคุณสร้างโปรเจ็กต์ ดังนั้นให้แก้ไขได้ดังนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
เราได้ระบุให้ index.jsp เป็นไฟล์ต้อนรับของเรา จากนั้นเราได้กำหนดค่าตัวกรอง Struts2 ให้ทำงานบน URL ทั้งหมด (เช่น url ใด ๆ ที่ตรงกับรูปแบบ / *)
เพื่อเปิดใช้งานบันทึกโดยละเอียด
คุณสามารถเปิดใช้งานฟังก์ชันการบันทึกที่สมบูรณ์ในขณะที่ทำงานกับ Struts 2 ได้โดยการสร้าง logging.properties ไฟล์ภายใต้ WEB-INF/classesโฟลเดอร์ เก็บสองบรรทัดต่อไปนี้ไว้ในไฟล์คุณสมบัติของคุณ -
org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers = \
java.util.logging.ConsoleHandler
logging.properties ดีฟอลต์ระบุ ConsoleHandler สำหรับการกำหนดเส้นทางการบันทึกไปยัง stdout และ FileHandler เกณฑ์ระดับการบันทึกของตัวจัดการสามารถตั้งค่าได้โดยใช้ SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST หรือ ALL
แค่นั้นแหละ. เราพร้อมที่จะเรียกใช้แอปพลิเคชัน Hello World ของเราโดยใช้กรอบงาน Struts 2
ขั้นตอนการดำเนินการแอปพลิเคชัน
คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR File เพื่อสร้างไฟล์ War
จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat
สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URL http://localhost:8080/HelloWorldStruts2/index.jsp. ซึ่งจะแสดงหน้าจอต่อไปนี้ -
ป้อนค่า "Struts2" และส่งเพจ คุณควรจะเห็นหน้าถัดไป
โปรดทราบว่าคุณสามารถกำหนด index เป็นการกระทำในไฟล์ struts.xml และในกรณีนั้นคุณสามารถเรียกหน้าดัชนีเป็น http://localhost:8080/HelloWorldStruts2/index.action. ตรวจสอบด้านล่างว่าคุณสามารถกำหนดดัชนีเป็นการกระทำได้อย่างไร -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "index">
<result >/index.jsp</result>
</action>
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
บทนี้จะนำคุณไปสู่การกำหนดค่าพื้นฐานซึ่งจำเป็นสำหรับไฟล์ Struts 2ใบสมัคร ที่นี่เราจะเห็นสิ่งที่สามารถกำหนดค่าได้ด้วยความช่วยเหลือของไฟล์กำหนดค่าที่สำคัญบางอย่างเช่นweb.xml, struts.xml, strutsconfig.xml และ struts.properties
พูดตามตรงคุณสามารถเริ่มทำงานได้โดยใช้ web.xml และ struts.xmlไฟล์การกำหนดค่า (ดังที่คุณได้เห็นไปแล้วในบทก่อนหน้าของเราซึ่งตัวอย่างของเราทำงานโดยใช้สองไฟล์นี้) อย่างไรก็ตามเพื่อความรู้ของคุณเราจะอธิบายเกี่ยวกับไฟล์อื่น ๆ ด้วย
ไฟล์ web.xml
ไฟล์คอนฟิกูเรชัน web.xml คือไฟล์คอนฟิกูเรชัน J2EE ที่กำหนดวิธีการประมวลผลองค์ประกอบของคำร้องขอ HTTP โดยคอนเทนเนอร์ servlet ไม่ใช่ไฟล์คอนฟิกูเรชัน Struts2 อย่างเคร่งครัด แต่เป็นไฟล์ที่ต้องกำหนดค่าเพื่อให้ Struts2 ทำงานได้
ตามที่กล่าวไว้ก่อนหน้านี้ไฟล์นี้เป็นจุดเริ่มต้นสำหรับเว็บแอปพลิเคชันใด ๆ จุดเริ่มต้นของแอ็พพลิเคชัน Struts2 จะเป็นตัวกรองที่กำหนดไว้ใน Deployment descriptor (web.xml) ดังนั้นเราจะกำหนดรายการของคลาสFilterDispatcherใน web.xml ไฟล์ web.xml ต้องถูกสร้างขึ้นภายใต้โฟลเดอร์WebContent/WEB-INF.
นี่เป็นไฟล์คอนฟิกูเรชันแรกที่คุณจะต้องกำหนดค่าหากคุณเริ่มต้นโดยไม่ได้รับความช่วยเหลือจากเทมเพลตหรือเครื่องมือที่สร้างขึ้น (เช่น Eclipse หรือ Maven2)
ต่อไปนี้เป็นเนื้อหาของไฟล์ web.xml ที่เราใช้ในตัวอย่างสุดท้ายของเรา
<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
โปรดทราบว่าเราจับคู่ตัวกรอง Struts 2 กับ /*และไม่ทำ /*.actionซึ่งหมายความว่า URL ทั้งหมดจะถูกแยกวิเคราะห์โดยตัวกรอง struts เราจะกล่าวถึงเรื่องนี้เมื่อเราจะอ่านบทคำอธิบายประกอบ
ไฟล์ Struts.xml
struts.xmlไฟล์มีข้อมูลการกำหนดค่าที่คุณจะแก้ไขเมื่อมีการพัฒนาการกระทำ ไฟล์นี้สามารถใช้เพื่อลบล้างการตั้งค่าเริ่มต้นสำหรับแอปพลิเคชันตัวอย่างเช่นstruts.devMode = falseและการตั้งค่าอื่น ๆ ซึ่งกำหนดไว้ในไฟล์คุณสมบัติ ไฟล์นี้สามารถสร้างได้ภายใต้โฟลเดอร์WEB-INF/classes.
ให้เราดูไฟล์ struts.xml ที่เราสร้างขึ้นในตัวอย่าง Hello World ที่อธิบายไว้ในบทที่แล้ว
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
</action>
<-- more actions can be listed here -->
</package>
<-- more packages can be listed here -->
</struts>
สิ่งแรกที่ควรทราบคือ DOCTYPE. ไฟล์คอนฟิกูเรชัน struts ทั้งหมดต้องมีประเภทหลักที่ถูกต้องดังที่แสดงในตัวอย่างเล็กน้อยของเรา <struts> เป็นองค์ประกอบแท็กรูทซึ่งเราประกาศแพ็กเกจที่แตกต่างกันโดยใช้แท็ก <package> ที่นี่ <package> อนุญาตให้แยกและแยกส่วนของการกำหนดค่า สิ่งนี้มีประโยชน์มากเมื่อคุณมีโปรเจ็กต์ขนาดใหญ่และโปรเจ็กต์ถูกแบ่งออกเป็นโมดูลต่างๆ
ตัวอย่างเช่นหากโปรเจ็กต์ของคุณมีโดเมนสามโดเมน ได้แก่ business_application, customer_application และ staff_application คุณสามารถสร้างแพ็คเกจสามแพ็กเกจและจัดเก็บการดำเนินการที่เกี่ยวข้องในแพ็กเกจที่เหมาะสม
แท็กแพ็คเกจมีคุณสมบัติดังต่อไปนี้ -
ซีเนียร์ No | คุณสมบัติและคำอธิบาย |
---|---|
1 | name (required) ตัวระบุเฉพาะสำหรับแพ็กเกจ |
2 | extends แพ็คเกจนี้ขยายจากแพ็คเกจใด โดยค่าเริ่มต้นเราใช้ struts-default เป็นแพ็กเกจพื้นฐาน |
3 | abstract หากทำเครื่องหมายเป็นจริงแพ็กเกจจะไม่สามารถใช้งานได้สำหรับผู้ใช้ปลายทาง |
4 | namespace เนมสเปซเฉพาะสำหรับการดำเนินการ |
constant ควรใช้แท็กพร้อมกับแอตทริบิวต์ชื่อและค่าเพื่อแทนที่คุณสมบัติใด ๆ ต่อไปนี้ที่กำหนดไว้ใน default.propertiesเช่นเราเพิ่งตั้งค่า struts.devModeทรัพย์สิน. การตั้งค่าstruts.devMode คุณสมบัติช่วยให้เราเห็นข้อความดีบักเพิ่มเติมในไฟล์บันทึก
เรากำหนด action แท็กสอดคล้องกับทุก URL ที่เราต้องการเข้าถึงและเรากำหนดคลาสด้วยเมธอด execute () ซึ่งจะเข้าถึงเมื่อใดก็ตามที่เราจะเข้าถึง URL ที่เกี่ยวข้อง
ผลลัพธ์จะเป็นตัวกำหนดสิ่งที่ส่งกลับไปยังเบราว์เซอร์หลังจากดำเนินการ สตริงที่ส่งคืนจากการกระทำควรเป็นชื่อของผลลัพธ์ ผลลัพธ์ได้รับการกำหนดค่าต่อการกระทำตามด้านบนหรือเป็นผลลัพธ์ "ทั่วโลก" พร้อมใช้งานสำหรับทุกการกระทำในแพ็กเกจ ผลลัพธ์มีทางเลือกname และ typeคุณลักษณะ. ค่าชื่อเริ่มต้นคือ "สำเร็จ"
ไฟล์ Struts.xml สามารถขยายขนาดใหญ่ได้เมื่อเวลาผ่านไปดังนั้นการทำลายมันด้วยแพ็คเกจจึงเป็นวิธีหนึ่งในการแยกส่วน แต่ Strutsเสนอวิธีอื่นในการแยกไฟล์ struts.xml คุณสามารถแยกไฟล์ออกเป็นไฟล์ xml หลาย ๆ ไฟล์และนำเข้าได้ในลักษณะต่อไปนี้
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="my-struts1.xml"/>
<include file="my-struts2.xml"/>
</struts>
ไฟล์การกำหนดค่าอื่น ๆ ที่เราไม่ได้กล่าวถึงคือ struts-default.xml ไฟล์นี้มีการตั้งค่าการกำหนดค่ามาตรฐานสำหรับ Struts และคุณไม่จำเป็นต้องแตะการตั้งค่าเหล่านี้สำหรับโครงการของคุณ 99.99% ด้วยเหตุนี้เราจะไม่ลงรายละเอียดเกี่ยวกับไฟล์นี้มากเกินไป หากคุณสนใจลองดูที่ไฟล์default.properties ไฟล์ที่มีอยู่ในไฟล์ struts2-core-2.2.3.jar
ไฟล์ Struts-config.xml
ไฟล์คอนฟิกูเรชัน struts-config.xml คือลิงก์ระหว่างคอมโพเนนต์ View และ Model ใน Web Client แต่คุณไม่ต้องแตะการตั้งค่าเหล่านี้สำหรับ 99.99% ของโปรเจ็กต์ของคุณ
ไฟล์กำหนดค่าโดยทั่วไปมีองค์ประกอบหลักดังต่อไปนี้ -
ซีเนียร์ No | ผู้สกัดกั้นและคำอธิบาย |
---|---|
1 | struts-config นี่คือโหนดรูทของไฟล์คอนฟิกูเรชัน |
2 | form-beans นี่คือที่ที่คุณแมปคลาสย่อย ActionForm กับชื่อ คุณใช้ชื่อนี้เป็นนามแฝงสำหรับ ActionForm ของคุณตลอดส่วนที่เหลือของไฟล์ strutsconfig.xml และแม้แต่ในเพจ JSP ของคุณ |
3 | global forwards ส่วนนี้จะแมปเพจบนเว็บแอพของคุณกับชื่อ คุณสามารถใช้ชื่อนี้เพื่ออ้างถึงเพจจริง วิธีนี้จะหลีกเลี่ยงการเข้ารหัส URL บนหน้าเว็บของคุณ |
4 | action-mappings นี่คือที่ที่คุณประกาศตัวจัดการแบบฟอร์มและเรียกอีกอย่างว่าการแมปการดำเนินการ |
5 | controller ส่วนนี้กำหนดค่า Struts ภายในและแทบไม่ได้ใช้ในสถานการณ์จริง |
6 | plug-in ส่วนนี้จะบอก Struts ว่าจะค้นหาไฟล์คุณสมบัติของคุณได้ที่ไหนซึ่งมีข้อความแจ้งและข้อความแสดงข้อผิดพลาด |
ต่อไปนี้เป็นไฟล์ struts-config.xml ตัวอย่าง -
<?xml version = "1.0" Encoding = "ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
<struts-config>
<!-- ========== Form Bean Definitions ============ -->
<form-beans>
<form-bean name = "login" type = "test.struts.LoginForm" />
</form-beans>
<!-- ========== Global Forward Definitions ========= -->
<global-forwards>
</global-forwards>
<!-- ========== Action Mapping Definitions ======== -->
<action-mappings>
<action
path = "/login"
type = "test.struts.LoginAction" >
<forward name = "valid" path = "/jsp/MainMenu.jsp" />
<forward name = "invalid" path = "/jsp/LoginView.jsp" />
</action>
</action-mappings>
<!-- ========== Controller Definitions ======== -->
<controller contentType = "text/html;charset = UTF-8"
debug = "3" maxFileSize = "1.618M" locale = "true" nocache = "true"/>
</struts-config>
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับไฟล์ struts-config.xml โปรดตรวจสอบเอกสาร struts ของคุณ
ไฟล์ Struts.properties
ไฟล์คอนฟิกูเรชันนี้มีกลไกในการเปลี่ยนลักษณะการทำงานเริ่มต้นของเฟรมเวิร์ก จริงๆแล้วคุณสมบัติทั้งหมดที่มีอยู่ในไฟล์struts.properties ไฟล์การกำหนดค่ายังสามารถกำหนดค่าได้ในไฟล์ web.xml ใช้ init-paramเช่นเดียวกับการใช้แท็กค่าคงที่ในไฟล์ struts.xmlไฟล์กำหนดค่า แต่ถ้าคุณต้องการแยกสิ่งต่าง ๆ ออกจากกันและมีความเฉพาะเจาะจงมากขึ้นคุณสามารถสร้างไฟล์นี้ในโฟลเดอร์WEB-INF/classes.
ค่าที่กำหนดไว้ในไฟล์นี้จะแทนที่ค่าเริ่มต้นที่กำหนดค่าไว้ในไฟล์ default.propertiesซึ่งมีอยู่ในการแจกแจงแบบ struts2-core-xyzjar มีคุณสมบัติสองสามอย่างที่คุณอาจพิจารณาเปลี่ยนโดยใช้struts.properties ไฟล์ -
### When set to true, Struts will act much more friendly for developers
struts.devMode = true
### Enables reloading of internationalization files
struts.i18n.reload = true
### Enables reloading of XML configuration files
struts.configuration.xml.reload = true
### Sets the port that the server is run on
struts.url.http.port = 8080
บรรทัดใดก็ได้ที่ขึ้นต้นด้วย hash (#) จะถือว่าเป็นความคิดเห็นและจะถูกละเว้นโดย Struts 2.
Actionsเป็นแกนหลักของเฟรมเวิร์ก Struts2 เช่นเดียวกับเฟรมเวิร์ก MVC (Model View Controller) ใด ๆ URL แต่ละรายการถูกแมปกับการดำเนินการเฉพาะซึ่งจัดเตรียมตรรกะการประมวลผลที่จำเป็นในการให้บริการคำขอจากผู้ใช้
แต่การกระทำนี้ยังทำหน้าที่ในความสามารถที่สำคัญอีกสองอย่าง ประการแรกการดำเนินการมีบทบาทสำคัญในการถ่ายโอนข้อมูลจากคำขอไปยังมุมมองไม่ว่าจะเป็น JSP หรือผลลัพธ์ประเภทอื่น ๆ ประการที่สองการดำเนินการต้องช่วยกรอบในการพิจารณาว่าผลลัพธ์ใดควรแสดงมุมมองที่จะถูกส่งกลับในการตอบสนองต่อคำขอ
สร้างการดำเนินการ
ข้อกำหนดเฉพาะสำหรับการดำเนินการใน Struts2คือต้องมีหนึ่งเมธอด noargument ที่ส่งคืนอ็อบเจ็กต์ String หรือ Result และต้องเป็น POJO หากไม่ได้ระบุเมธอด no-argument ไว้พฤติกรรมเริ่มต้นคือการใช้เมธอด execute ()
คุณสามารถเลือกขยายไฟล์ ActionSupport คลาสที่ใช้หกอินเทอร์เฟซรวมถึง Actionอินเตอร์เฟซ. อินเทอร์เฟซ Action มีดังนี้ -
public interface Action {
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public String execute() throws Exception;
}
ลองดูวิธีการดำเนินการในตัวอย่าง Hello World -
package com.tutorialspoint.struts2;
public class HelloWorldAction {
private String name;
public String execute() throws Exception {
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
เพื่อแสดงจุดที่วิธีการดำเนินการควบคุมมุมมองให้เราทำการเปลี่ยนแปลงต่อไปนี้กับไฟล์ execute วิธีการและขยายคลาส ActionSupport ดังนี้ -
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private String name;
public String execute() throws Exception {
if ("SECRET".equals(name)) {
return SUCCESS;
} else {
return ERROR;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ในตัวอย่างนี้เรามีตรรกะบางอย่างในวิธีการดำเนินการเพื่อดูแอตทริบิวต์ชื่อ หากแอตทริบิวต์เท่ากับสตริง"SECRET"เรากลับมา SUCCESS เป็นผลลัพธ์มิฉะนั้นเราจะกลับมา ERRORดังผลลัพท์. เนื่องจากเราได้ขยาย ActionSupport ดังนั้นเราจึงสามารถใช้ค่าคงที่ของสตริงได้SUCCESSและข้อผิดพลาด ตอนนี้ให้เราแก้ไขไฟล์ struts.xml ของเราดังนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
<result name = "error">/AccessDenied.jsp</result>
</action>
</package>
</struts>
สร้างมุมมอง
ให้เราสร้างไฟล์ jsp ด้านล่าง HelloWorld.jspในโฟลเดอร์ WebContent ในโปรเจ็กต์ eclipse ของคุณ ในการดำเนินการนี้ให้คลิกขวาที่โฟลเดอร์ WebContent ใน project explorer และเลือกNew >JSP File. ไฟล์นี้จะถูกเรียกในกรณีที่ผลตอบแทนคือ SUCCESS ซึ่งเป็นค่าคงที่ของสตริง "ความสำเร็จ" ตามที่กำหนดไว้ในอินเตอร์เฟส Action -
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World, <s:property value = "name"/>
</body>
</html>
ต่อไปนี้เป็นไฟล์ที่จะเรียกใช้โดยเฟรมเวิร์กในกรณีผลการดำเนินการคือ ERROR ซึ่งเท่ากับค่าคงที่สตริง "ข้อผิดพลาด" ต่อไปนี้เป็นเนื้อหาของAccessDenied.jsp
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Access Denied</title>
</head>
<body>
You are not authorized to view this page.
</body>
</html>
เรายังต้องสร้าง index.jspในโฟลเดอร์ WebContent ไฟล์นี้จะทำหน้าที่เป็น URL การดำเนินการเริ่มต้นที่ผู้ใช้สามารถคลิกเพื่อบอกกรอบงาน Struts 2 เพื่อเรียกไฟล์executeวิธีการของคลาส HelloWorldAction และแสดงผลมุมมอง HelloWorld.jsp
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World From Struts2</h1>
<form action = "hello">
<label for = "name">Please enter your name</label><br/>
<input type = "text" name = "name"/>
<input type = "submit" value = "Say Hello"/>
</form>
</body>
</html>
เพียงเท่านี้ไฟล์ web.xml ก็ไม่จำเป็นต้องเปลี่ยนแปลงดังนั้นให้เราใช้ web.xml เดียวกันกับที่เราสร้างไว้ Examplesบท. ตอนนี้เราพร้อมที่จะเรียกใช้Hello World แอปพลิเคชันโดยใช้ Struts 2 framework
ดำเนินการแอปพลิเคชัน
คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WARไฟล์สำหรับสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. ซึ่งจะแสดงหน้าจอต่อไปนี้ -
ให้เราป้อนคำว่า "SECRET" และคุณจะเห็นหน้าต่อไปนี้ -
ตอนนี้ป้อนคำอื่น ๆ นอกเหนือจาก "SECRET" แล้วคุณจะเห็นหน้าต่อไปนี้ -
สร้างการดำเนินการหลายอย่าง
คุณมักจะกำหนดการดำเนินการมากกว่าหนึ่งรายการเพื่อจัดการคำขอที่แตกต่างกันและจัดเตรียม URL ที่แตกต่างกันให้กับผู้ใช้ดังนั้นคุณจะกำหนดคลาสต่างๆตามที่กำหนดไว้ด้านล่าง -
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
class MyAction extends ActionSupport {
public static String GOOD = SUCCESS;
public static String BAD = ERROR;
}
public class HelloWorld extends ActionSupport {
...
public String execute() {
if ("SECRET".equals(name)) return MyAction.GOOD;
return MyAction.BAD;
}
...
}
public class SomeOtherClass extends ActionSupport {
...
public String execute() {
return MyAction.GOOD;
}
...
}
คุณจะกำหนดค่าการกระทำเหล่านี้ในไฟล์ struts.xml ดังนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorld"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
<result name = "error">/AccessDenied.jsp</result>
</action>
<action name = "something"
class = "com.tutorialspoint.struts2.SomeOtherClass"
method = "execute">
<result name = "success">/Something.jsp</result>
<result name = "error">/AccessDenied.jsp</result>
</action>
</package>
</struts>
ดังที่คุณเห็นในตัวอย่างสมมุติฐานข้างต้นผลลัพธ์ของการกระทำ SUCCESS และ ERROR’s ซ้ำกัน
เพื่อหลีกเลี่ยงปัญหานี้ขอแนะนำให้คุณสร้างคลาสที่มีผลลัพธ์ของผลลัพธ์
ตัวดักจับมีแนวความคิดเหมือนกับตัวกรอง servlet หรือคลาส JDKs Proxy Interceptors อนุญาตให้ใช้ฟังก์ชันการตัดขวางแยกต่างหากจากการกระทำและกรอบงาน คุณสามารถบรรลุสิ่งต่อไปนี้โดยใช้ interceptors -
จัดเตรียมตรรกะก่อนการประมวลผลก่อนที่จะเรียกการดำเนินการ
จัดเตรียมตรรกะหลังการประมวลผลหลังจากเรียกการดำเนินการ
การจับข้อยกเว้นเพื่อให้สามารถดำเนินการประมวลผลอื่นได้
คุณสมบัติมากมายที่มีให้ใน Struts2 กรอบถูกนำไปใช้โดยใช้ตัวสกัดกั้น
Examples รวมถึงการจัดการข้อยกเว้นการอัปโหลดไฟล์การเรียกกลับตลอดอายุการใช้งานเป็นต้นในความเป็นจริงเนื่องจาก Struts2 เน้นฟังก์ชันการทำงานของตัวสกัดกั้นมากจึงไม่น่าจะมีการกำหนดตัวสกัดกั้น 7 หรือ 8 ตัวต่อการกระทำ
Struts2 Framework Interceptors
เฟรมเวิร์ก Struts 2 แสดงรายการตัวสกัดกั้นแบบสำเร็จรูปที่กำหนดค่าไว้ล่วงหน้าและพร้อมใช้งาน ตัวสกัดกั้นที่สำคัญมีอยู่ไม่กี่ตัวด้านล่าง -
ซีเนียร์ No | ผู้สกัดกั้นและคำอธิบาย |
---|---|
1 | alias อนุญาตให้พารามิเตอร์มีนามแฝงชื่อที่แตกต่างกันในคำขอ |
2 | checkbox ช่วยในการจัดการกล่องกาเครื่องหมายโดยการเพิ่มค่าพารามิเตอร์เป็นเท็จสำหรับกล่องกาเครื่องหมายที่ไม่ได้เลือก |
3 | conversionError วางข้อมูลข้อผิดพลาดจากการแปลงสตริงเป็นประเภทพารามิเตอร์เป็นข้อผิดพลาดฟิลด์ของการดำเนินการ |
4 | createSession สร้างเซสชัน HTTP โดยอัตโนมัติหากยังไม่มีอยู่ |
5 | debugging จัดเตรียมหน้าจอการแก้ไขจุดบกพร่องต่างๆให้กับนักพัฒนา |
6 | execAndWait ส่งผู้ใช้ไปยังหน้ารอตัวกลางในขณะที่การดำเนินการดำเนินการอยู่เบื้องหลัง |
7 | exception แผนที่ข้อยกเว้นที่เกิดจากการกระทำไปยังผลลัพธ์ทำให้สามารถจัดการข้อยกเว้นอัตโนมัติผ่านการเปลี่ยนเส้นทาง |
8 | fileUpload อำนวยความสะดวกในการอัพโหลดไฟล์ได้ง่าย |
9 | i18n ติดตามโลแคลที่เลือกระหว่างเซสชันของผู้ใช้ |
10 | logger จัดเตรียมการบันทึกอย่างง่ายโดยการส่งออกชื่อของการดำเนินการที่กำลังดำเนินการ |
11 | params ตั้งค่าพารามิเตอร์การร้องขอในการดำเนินการ |
12 | prepare โดยทั่วไปจะใช้เพื่อทำงานก่อนการประมวลผลเช่นตั้งค่าการเชื่อมต่อฐานข้อมูล |
13 | profile อนุญาตให้บันทึกข้อมูลการทำโปรไฟล์อย่างง่ายสำหรับการดำเนินการ |
14 | scope จัดเก็บและเรียกข้อมูลสถานะของการดำเนินการในขอบเขตเซสชันหรือแอปพลิเคชัน |
15 | ServletConfig จัดเตรียมการดำเนินการกับการเข้าถึงข้อมูลที่ใช้ servlet ต่างๆ |
16 | timer ให้ข้อมูลการทำโปรไฟล์อย่างง่ายในรูปแบบของระยะเวลาในการดำเนินการ |
17 | token ตรวจสอบการดำเนินการสำหรับโทเค็นที่ถูกต้องเพื่อป้องกันการส่งแบบฟอร์มที่ซ้ำกัน |
18 | validation ให้การสนับสนุนการตรวจสอบความถูกต้องสำหรับการดำเนินการ |
โปรดดูเอกสารของ Struts 2 เพื่อดูรายละเอียดทั้งหมดเกี่ยวกับเครื่องดักฟังข้างต้น แต่ฉันจะแสดงวิธีใช้เครื่องสกัดกั้นโดยทั่วไปในแอปพลิเคชัน Struts ของคุณ
วิธีใช้ Interceptors?
ให้เราดูวิธีใช้เครื่องดักฟังที่มีอยู่แล้วกับโปรแกรม "Hello World" ของเรา เราจะใช้ไฟล์timerผู้สกัดกั้นซึ่งมีวัตถุประสงค์เพื่อวัดระยะเวลาที่ใช้ในการดำเนินการวิธีการดำเนินการ ในเวลาเดียวกันฉันใช้paramsinterceptor ที่มีจุดประสงค์เพื่อส่งพารามิเตอร์การร้องขอไปยังการดำเนินการ คุณสามารถลองใช้ตัวอย่างของคุณได้โดยไม่ต้องใช้เครื่องสกัดกั้นนี้แล้วคุณจะพบว่าname ไม่ได้ตั้งค่าคุณสมบัติเนื่องจากพารามิเตอร์ไม่สามารถเข้าถึงการดำเนินการได้
เราจะเก็บไฟล์ HelloWorldAction.java, web.xml, HelloWorld.jsp และ index.jsp ตามที่สร้างไว้ใน Examples บท แต่ให้เราแก้ไขไฟล์ struts.xml ไฟล์เพื่อเพิ่มตัวสกัดกั้นดังต่อไปนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<interceptor-ref name = "params"/>
<interceptor-ref name = "timer" />
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -
ตอนนี้ป้อนคำใดก็ได้ในกล่องข้อความที่กำหนดแล้วคลิกปุ่มพูดสวัสดีเพื่อดำเนินการตามที่กำหนด ตอนนี้ถ้าคุณจะตรวจสอบบันทึกที่สร้างขึ้นคุณจะพบข้อความต่อไปนี้ -
INFO: Server startup in 3539 ms
27/08/2011 8:40:53 PM
com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
INFO: Executed action [//hello!execute] took 109 ms.
บรรทัดล่างถูกสร้างขึ้นเนื่องจาก timer interceptor ซึ่งกำลังบอกว่าการกระทำนั้นใช้เวลาทั้งหมด 109ms ในการดำเนินการ
สร้าง Custom Interceptors
การใช้เครื่องดักฟังแบบกำหนดเองในแอปพลิเคชันของคุณเป็นวิธีที่ยอดเยี่ยมในการมอบคุณสมบัติของแอปพลิเคชันแบบตัดขวาง การสร้างตัวสกัดกั้นแบบกำหนดเองนั้นง่ายมาก อินเทอร์เฟซที่ต้องขยายมีดังต่อไปนี้Interceptor อินเตอร์เฟซ -
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation)
throws Exception;
}
ตามชื่อที่แนะนำเมธอด init () จัดเตรียมวิธีการเริ่มต้นตัวสกัดกั้นและเมธอด destroy () จัดเตรียมสิ่งอำนวยความสะดวกสำหรับการล้างข้อมูลสกัดกั้น ต่างจากการดำเนินการ interceptors จะถูกนำกลับมาใช้ในการร้องขอและจำเป็นต้องมีความปลอดภัยโดยเฉพาะอย่างยิ่งเมธอด intercept ()
ActionInvocationวัตถุจัดเตรียมการเข้าถึงสภาพแวดล้อมรันไทม์ อนุญาตให้เข้าถึงการดำเนินการเองและวิธีการเรียกใช้การดำเนินการและตรวจสอบว่ามีการเรียกใช้การดำเนินการแล้วหรือไม่
หากคุณไม่จำเป็นต้องเริ่มต้นหรือรหัสล้างข้อมูลไฟล์ AbstractInterceptorสามารถขยายชั้นเรียนได้ ค่านี้จัดเตรียมการดำเนินการ nooperation เริ่มต้นของเมธอด init () และ destroy ()
สร้างคลาส Interceptor
ให้เราสร้าง MyInterceptor.java ต่อไปนี้ใน Java Resources > src โฟลเดอร์ -
package com.tutorialspoint.struts2;
import java.util.*;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation)throws Exception {
/* let us do some pre-processing */
String output = "Pre-Processing";
System.out.println(output);
/* let us call action or next interceptor */
String result = invocation.invoke();
/* let us do some post-processing */
output = "Post-Processing";
System.out.println(output);
return result;
}
}
ดังที่คุณสังเกตเห็นการดำเนินการจริงจะดำเนินการโดยใช้ตัวสกัดกั้นโดย invocation.invoke()โทร. ดังนั้นคุณสามารถทำการประมวลผลล่วงหน้าและกระบวนการหลังการประมวลผลบางอย่างตามความต้องการของคุณ
เฟรมเวิร์กเริ่มต้นกระบวนการโดยการเรียกครั้งแรกไปยังการเรียกใช้อ็อบเจ็กต์ ActionInvocation () แต่ละครั้งinvoke()เรียกว่า ActionInvocation ให้คำปรึกษาเกี่ยวกับสถานะและดำเนินการตามที่ผู้สกัดกั้นจะตามมา เมื่อมีการเรียกใช้ interceptors ที่กำหนดค่าไว้ทั้งหมดแล้วเมธอด invoke () จะทำให้การดำเนินการดำเนินการเอง
แผนภาพต่อไปนี้แสดงแนวคิดเดียวกันผ่านขั้นตอนการร้องขอ -
สร้างคลาสการดำเนินการ
ให้เราสร้างไฟล์ java HelloWorldAction.java ภายใต้ Java Resources > src ด้วยชื่อแพ็คเกจ com.tutorialspoint.struts2 ด้วยเนื้อหาที่ระบุด้านล่าง
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private String name;
public String execute() throws Exception {
System.out.println("Inside action....");
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
นี่คือคลาสเดียวกันกับที่เราได้เห็นในตัวอย่างก่อนหน้านี้ เรามี getters มาตรฐานและเมธอด setter สำหรับคุณสมบัติ "name" และเมธอด execute ที่ส่งกลับสตริง "success"
สร้างมุมมอง
ให้เราสร้างไฟล์ jsp ด้านล่าง HelloWorld.jsp ในโฟลเดอร์ WebContent ในโปรเจ็กต์ eclipse ของคุณ
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World, <s:property value = "name"/>
</body>
</html>
สร้างหน้าหลัก
เรายังต้องสร้าง index.jspในโฟลเดอร์ WebContent ไฟล์นี้จะทำหน้าที่เป็น URL การดำเนินการเริ่มต้นที่ผู้ใช้สามารถคลิกเพื่อบอกเฟรมเวิร์ก Struts 2 เพื่อเรียกเมธอดที่กำหนดไว้ของคลาส HelloWorldAction และแสดงผลมุมมอง HelloWorld.jsp
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World From Struts2</h1>
<form action = "hello">
<label for = "name">Please enter your name</label><br/>
<input type = "text" name = "name"/>
<input type = "submit" value = "Say Hello"/>
</form>
</body>
</html>
hello การดำเนินการที่กำหนดไว้ในไฟล์มุมมองด้านบนจะถูกแมปกับคลาส HelloWorldAction และวิธีการดำเนินการโดยใช้ไฟล์ struts.xml
ไฟล์การกำหนดค่า
ตอนนี้เราต้องลงทะเบียน interceptor ของเราแล้วเรียกมันตามที่เราเรียกว่า default interceptor ในตัวอย่างก่อนหน้านี้ ในการลงทะเบียน interceptor ที่กำหนดใหม่แท็ก <interceptors> ... </interceptors> จะถูกวางไว้ใต้แท็ก <package>struts.xmlไฟล์. คุณสามารถข้ามขั้นตอนนี้สำหรับตัวสกัดกั้นเริ่มต้นได้เหมือนที่เราทำในตัวอย่างก่อนหน้านี้ แต่ที่นี่ให้เราลงทะเบียนและใช้งานได้ดังนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<interceptors>
<interceptor name = "myinterceptor"
class = "com.tutorialspoint.struts2.MyInterceptor" />
</interceptors>
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<interceptor-ref name = "params"/>
<interceptor-ref name = "myinterceptor" />
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
ควรสังเกตว่าคุณสามารถลงทะเบียนเครื่องสกัดกั้นได้มากกว่าหนึ่งเครื่อง <package> แท็กและในเวลาเดียวกันคุณสามารถเรียกผู้สกัดกั้นได้มากกว่าหนึ่งตัวภายในไฟล์ <action>แท็ก คุณสามารถเรียกผู้สกัดกั้นคนเดียวกันด้วยการกระทำที่แตกต่างกัน
ไฟล์ web.xml จะต้องสร้างขึ้นภายใต้โฟลเดอร์ WEB-INF ภายใต้ WebContent ดังต่อไปนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -
ตอนนี้ป้อนคำใดก็ได้ในกล่องข้อความที่กำหนดแล้วคลิกปุ่มพูดสวัสดีเพื่อดำเนินการตามที่กำหนด ตอนนี้ถ้าคุณจะตรวจสอบบันทึกที่สร้างขึ้นคุณจะพบข้อความต่อไปนี้ที่ด้านล่าง -
Pre-Processing
Inside action....
Post-Processing
การซ้อนตัวสกัดกั้นหลายตัว
อย่างที่คุณสามารถจินตนาการได้การกำหนดค่าตัวสกัดกั้นหลายตัวสำหรับแต่ละการกระทำจะกลายเป็นเรื่องที่ไม่สามารถจัดการได้อย่างรวดเร็ว ด้วยเหตุนี้เครื่องสกัดกั้นจึงถูกจัดการด้วยกองสกัดกั้น นี่คือตัวอย่างโดยตรงจากไฟล์ strutsdefault.xml -
<interceptor-stack name = "basicStack">
<interceptor-ref name = "exception"/>
<interceptor-ref name = "servlet-config"/>
<interceptor-ref name = "prepare"/>
<interceptor-ref name = "checkbox"/>
<interceptor-ref name = "params"/>
<interceptor-ref name = "conversionError"/>
</interceptor-stack>
เงินเดิมพันข้างต้นเรียกว่า basicStackและสามารถใช้ในการกำหนดค่าของคุณตามที่แสดงด้านล่าง โหนดคอนฟิกูเรชันนี้อยู่ภายใต้โหนด <package ... /> แท็ก <interceptor-ref ... /> แต่ละแท็กอ้างอิงทั้ง interceptor หรือ interceptor stack ที่กำหนดค่าไว้ก่อน interceptor stack ปัจจุบัน ดังนั้นจึงเป็นเรื่องสำคัญมากที่จะต้องตรวจสอบให้แน่ใจว่าชื่อไม่ซ้ำกันในการกำหนดค่าสแต็ก interceptor และ interceptor ทั้งหมดเมื่อกำหนดค่าตัวสกัดกั้นเริ่มต้นและกองซ้อนของตัวสกัดกั้น
เราได้เห็นวิธีการใช้ interceptor กับการกระทำแล้วการใช้ interceptor stack ก็ไม่แตกต่างกัน อันที่จริงเราใช้แท็กเดียวกัน -
<action name = "hello" class = "com.tutorialspoint.struts2.MyAction">
<interceptor-ref name = "basicStack"/>
<result>view.jsp</result>
</action
การลงทะเบียนข้างต้นของ "basicStack" จะลงทะเบียนเงินเดิมพันที่สมบูรณ์ของผู้สกัดกั้นทั้งหกด้วยการดำเนินการสวัสดี สิ่งนี้ควรสังเกตว่าตัวสกัดกั้นจะถูกดำเนินการตามลำดับซึ่งได้รับการกำหนดค่าไว้ ตัวอย่างเช่นในกรณีข้างต้นข้อยกเว้นจะถูกดำเนินการก่อนอันดับที่สองจะเป็น servlet-config เป็นต้น
ดังที่ได้กล่าวไว้ก่อนหน้านี้ <results> แท็กมีบทบาทเป็นไฟล์ viewในเฟรมเวิร์ก Struts2 MVC การดำเนินการมีหน้าที่รับผิดชอบในการดำเนินการตามตรรกะทางธุรกิจ ขั้นตอนต่อไปหลังจากเรียกใช้ตรรกะทางธุรกิจคือการแสดงมุมมองโดยใช้ไฟล์<results> แท็ก
มักจะมีกฎการนำทางบางอย่างแนบมาพร้อมกับผลลัพธ์ ตัวอย่างเช่นหากวิธีการดำเนินการคือการพิสูจน์ตัวตนผู้ใช้อาจมีผลลัพธ์ที่เป็นไปได้สามประการ
- เข้าสู่ระบบสำเร็จ
- เข้าสู่ระบบไม่สำเร็จ - ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง
- บัญชีถูกล็อค
ในสถานการณ์สมมตินี้วิธีการดำเนินการจะถูกกำหนดค่าด้วยสตริงผลลัพธ์ที่เป็นไปได้สามแบบและมุมมองที่แตกต่างกันสามมุมมองเพื่อแสดงผลลัพธ์ เราได้เห็นสิ่งนี้แล้วในตัวอย่างก่อนหน้านี้
แต่ Struts2 ไม่ได้ผูกคุณกับการใช้ JSP เป็นเทคโนโลยีมุมมอง โดยรวมแล้ววัตถุประสงค์ทั้งหมดของกระบวนทัศน์ MVC คือการแยกชั้นและกำหนดค่าได้สูง ตัวอย่างเช่นสำหรับไคลเอ็นต์ Web2.0 คุณอาจต้องการส่งคืน XML หรือ JSON เป็นเอาต์พุต ในกรณีนี้คุณสามารถสร้างประเภทผลลัพธ์ใหม่สำหรับ XML หรือ JSON และบรรลุสิ่งนี้
Struts มาพร้อมกับจำนวนที่กำหนดไว้ล่วงหน้า result types และอะไรก็ตามที่เราเห็นแล้วนั่นคือประเภทผลลัพธ์เริ่มต้น dispatcherซึ่งใช้เพื่อส่งไปยังเพจ JSP Struts อนุญาตให้คุณใช้ภาษามาร์กอัปอื่น ๆ สำหรับเทคโนโลยีมุมมองเพื่อนำเสนอผลลัพธ์และตัวเลือกยอดนิยม ได้แก่Velocity, Freemaker, XSLT และ Tiles.
ประเภทผลลัพธ์ของผู้มอบหมายงาน
dispatcherชนิดผลลัพธ์เป็นประเภทดีฟอลต์และจะใช้หากไม่ได้ระบุประเภทผลลัพธ์อื่น ใช้เพื่อส่งต่อไปยัง servlet, JSP, HTML page และอื่น ๆ บนเซิร์ฟเวอร์ มันใช้เมธอดRequestDispatcher.forward ()
เราเห็นเวอร์ชัน "ชวเลข" ในตัวอย่างก่อนหน้านี้ซึ่งเราจัดเตรียมเส้นทาง JSP เป็นเนื้อหาของแท็กผลลัพธ์
<result name = "success">
/HelloWorld.jsp
</result>
เรายังสามารถระบุไฟล์ JSP โดยใช้แท็ก <param name = "location"> ภายในองค์ประกอบ <result ... > ดังนี้ -
<result name = "success" type = "dispatcher">
<param name = "location">
/HelloWorld.jsp
</param >
</result>
นอกจากนี้เรายังสามารถจัดหาไฟล์ parseพารามิเตอร์ซึ่งเป็นจริงตามค่าเริ่มต้น พารามิเตอร์แยกวิเคราะห์กำหนดว่าพารามิเตอร์ตำแหน่งจะถูกแยกวิเคราะห์สำหรับนิพจน์ OGNL หรือไม่
ประเภทผลลัพธ์ FreeMaker
ในตัวอย่างนี้เราจะมาดูวิธีการใช้งาน FreeMakerเป็นเทคโนโลยีมุมมอง Freemaker เป็นเครื่องมือสร้างเทมเพลตยอดนิยมที่ใช้ในการสร้างเอาต์พุตโดยใช้เทมเพลตที่กำหนดไว้ล่วงหน้า ให้เราสร้างไฟล์เทมเพลต Freemaker ชื่อhello.fm โดยมีเนื้อหาดังต่อไปนี้ -
Hello World ${name}
ไฟล์ด้านบนเป็นเทมเพลตที่ nameเป็นพารามิเตอร์ที่จะถูกส่งผ่านจากภายนอกโดยใช้การกระทำที่กำหนดไว้ คุณจะเก็บไฟล์นี้ไว้ใน CLASSPATH ของคุณ
ต่อไปให้เราแก้ไขไฟล์ struts.xml เพื่อระบุผลลัพธ์ดังนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success" type = "freemarker">
<param name = "location">/hello.fm</param>
</result>
</action>
</package>
</struts>
ให้เราเก็บไฟล์ HelloWorldAction.java, HelloWorldAction.jsp และ index.jsp ตามที่เราสร้างไว้ในบทตัวอย่าง
ตอนนี้คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR File เพื่อสร้างไฟล์ War
จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. ซึ่งจะแสดงหน้าจอต่อไปนี้
ป้อนค่า "Struts2" และส่งเพจ คุณควรจะเห็นหน้าถัดไป
อย่างที่คุณเห็นนี่เหมือนกับมุมมอง JSP ทุกประการยกเว้นว่าเราไม่ได้เชื่อมโยงกับการใช้ JSP เป็นเทคโนโลยีมุมมอง เราได้ใช้ Freemaker ในตัวอย่างนี้
ประเภทผลลัพธ์การเปลี่ยนเส้นทาง
redirectชนิดผลลัพธ์เรียกใช้เมธอดresponse.sendRedirect ()มาตรฐานทำให้เบราว์เซอร์สร้างคำขอใหม่ไปยังตำแหน่งที่กำหนด
เราสามารถระบุตำแหน่งในเนื้อความขององค์ประกอบ <result ... > หรือเป็นองค์ประกอบ <param name = "location"> การเปลี่ยนเส้นทางยังรองรับไฟล์parseพารามิเตอร์. นี่คือตัวอย่างที่กำหนดค่าโดยใช้ XML -
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success" type = "redirect">
<param name = "location">
/NewWorld.jsp
</param >
</result>
</action>
ดังนั้นเพียงแค่แก้ไขไฟล์ struts.xml ของคุณเพื่อกำหนดประเภทการเปลี่ยนเส้นทางตามที่กล่าวไว้ข้างต้นและสร้างไฟล์ NewWorld.jpg ใหม่ซึ่งคุณจะถูกเปลี่ยนเส้นทางเมื่อใดก็ตามที่การดำเนินการของ hello จะส่งคืนความสำเร็จ คุณสามารถตรวจสอบตัวอย่างการดำเนินการเปลี่ยนเส้นทาง Struts 2เพื่อความเข้าใจที่ดีขึ้น
กองคุณค่า
กองค่าเป็นชุดของวัตถุหลายชิ้นที่เก็บวัตถุต่อไปนี้ตามลำดับที่กำหนด -
ซีเนียร์ No | วัตถุและคำอธิบาย |
---|---|
1 | Temporary Objects มีอ็อบเจ็กต์ชั่วคราวต่างๆที่สร้างขึ้นระหว่างการเรียกใช้เพจ ตัวอย่างเช่นค่าการวนซ้ำปัจจุบันสำหรับคอลเล็กชันที่วนซ้ำอยู่ในแท็ก JSP |
2 | The Model Object หากคุณกำลังใช้โมเดลอ็อบเจ็กต์ในแอ็พพลิเคชัน struts อ็อบเจ็กต์โมเดลปัจจุบันจะถูกวางไว้ก่อนแอ็คชันบนสแตกค่า |
3 | The Action Object นี่จะเป็นวัตถุการดำเนินการปัจจุบันที่กำลังดำเนินการ |
4 | Named Objects วัตถุเหล่านี้ ได้แก่ #application, #session, #request, #attr และ #parameters และอ้างถึงขอบเขต servlet ที่เกี่ยวข้อง |
กองค่าสามารถเข้าถึงได้ผ่านแท็กที่ให้ไว้สำหรับ JSP, Velocity หรือ Freemarker มีแท็กต่างๆที่เราจะศึกษาในแต่ละบทซึ่งใช้ในการรับและตั้งค่า struts 2.0 คุณสามารถรับออบเจ็กต์ valueStack ภายในการกระทำของคุณดังนี้ -
ActionContext.getContext().getValueStack()
เมื่อคุณมีออบเจ็กต์ ValueStack คุณสามารถใช้วิธีการต่อไปนี้เพื่อจัดการกับวัตถุนั้น -
ซีเนียร์ No | วิธี ValueStack และคำอธิบาย |
---|---|
1 | Object findValue(String expr) ค้นหาค่าโดยการประเมินนิพจน์ที่กำหนดเทียบกับสแต็กในลำดับการค้นหาเริ่มต้น |
2 | CompoundRoot getRoot() รับ CompoundRoot ซึ่งเก็บวัตถุที่ผลักลงบนสแต็ก |
3 | Object peek() รับวัตถุที่ด้านบนของสแต็กโดยไม่ต้องเปลี่ยนสแต็ก |
4 | Object pop() รับวัตถุที่ด้านบนของสแต็กและนำออกจากสแต็ก |
5 | void push(Object o) วางวัตถุนี้ไว้ที่ด้านบนสุดของสแต็ก |
6 | void set(String key, Object o) ตั้งค่าวัตถุบนสแต็กด้วยคีย์ที่กำหนดเพื่อให้สามารถเรียกคืนได้โดย findValue (คีย์ ... ) |
7 | void setDefaultType(Class defaultType) ตั้งค่าประเภทเริ่มต้นที่จะแปลงเป็นหากไม่มีการระบุประเภทเมื่อได้รับค่า |
8 | void setValue(String expr, Object value) พยายามตั้งค่าคุณสมบัติบน bean ในสแตกด้วยนิพจน์ที่กำหนดโดยใช้ลำดับการค้นหาดีฟอลต์ |
9 | int size() รับจำนวนวัตถุในสแต็ก |
OGNL
Object-Graph Navigation Language(OGNL) เป็นภาษานิพจน์ที่มีประสิทธิภาพซึ่งใช้ในการอ้างอิงและจัดการข้อมูลบน ValueStack OGNL ยังช่วยในการถ่ายโอนข้อมูลและการแปลงประเภท
OGNL นั้นคล้ายกับ JSP Expression Language มาก OGNL ขึ้นอยู่กับแนวคิดของการมีรูทหรืออ็อบเจ็กต์เริ่มต้นภายในบริบท คุณสมบัติของอ็อบเจ็กต์ดีฟอลต์หรือรูทสามารถอ้างอิงได้โดยใช้สัญกรณ์มาร์กอัปซึ่งเป็นสัญลักษณ์ปอนด์
ดังที่กล่าวไว้ก่อนหน้านี้ OGNL ขึ้นอยู่กับบริบทและ Struts สร้างแผนที่ ActionContext เพื่อใช้กับ OGNL แผนผัง ActionContext ประกอบด้วยสิ่งต่อไปนี้ -
Application - ตัวแปรขอบเขตการใช้งาน
Session - ตัวแปรที่กำหนดขอบเขตเซสชัน
Root / value stack - ตัวแปรการกระทำทั้งหมดของคุณจะถูกเก็บไว้ที่นี่
Request - ขอตัวแปรที่กำหนดขอบเขต
Parameters - ขอพารามิเตอร์
Atributes - แอตทริบิวต์ที่เก็บไว้ในหน้าคำขอเซสชันและขอบเขตการใช้งาน
สิ่งสำคัญคือต้องเข้าใจว่าออบเจ็กต์ Action พร้อมใช้งานในกองค่าเสมอ ดังนั้นหากวัตถุ Action ของคุณมีคุณสมบัติ“x” และ “y” พร้อมให้คุณใช้งาน
อ็อบเจ็กต์ใน ActionContext ถูกอ้างอิงโดยใช้สัญลักษณ์ปอนด์อย่างไรก็ตามอ็อบเจ็กต์ในสแต็กค่าสามารถอ้างอิงได้โดยตรง
ตัวอย่างเช่นถ้า employee เป็นคุณสมบัติของคลาสแอ็คชันจากนั้นสามารถอ้างอิงได้ดังนี้ -
<s:property value = "name"/>
แทน
<s:property value = "#name"/>
หากคุณมีแอตทริบิวต์ในเซสชันที่เรียกว่า "เข้าสู่ระบบ" คุณสามารถเรียกดูได้ดังนี้ -
<s:property value = "#session.login"/>
OGNL ยังรองรับการจัดการกับคอลเลกชันเช่นแผนที่รายการและชุด ตัวอย่างเช่นในการแสดงรายการสีแบบเลื่อนลงคุณสามารถทำได้ -
<s:select name = "color" list = "{'red','yellow','green'}" />
นิพจน์ OGNL นั้นฉลาดในการตีความ "สีแดง" "สีเหลือง" "สีเขียว" เป็นสีและสร้างรายการตามนั้น
นิพจน์ OGNL จะถูกใช้อย่างกว้างขวางในบทถัดไปเมื่อเราจะศึกษาแท็กต่างๆ ดังนั้นแทนที่จะมองแยกกันให้เราดูโดยใช้ตัวอย่างบางส่วนในแท็กแบบฟอร์ม / แท็กควบคุม / แท็กข้อมูลและแท็ก Ajax
ValueStack / OGNL ตัวอย่าง
สร้างการดำเนินการ
ให้เราพิจารณาคลาสการดำเนินการต่อไปนี้ที่เรากำลังเข้าถึง valueStack จากนั้นตั้งค่าคีย์ไม่กี่คีย์ที่เราจะเข้าถึงโดยใช้ OGNL ในมุมมองของเราเช่นหน้า JSP
package com.tutorialspoint.struts2;
import java.util.*;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private String name;
public String execute() throws Exception {
ValueStack stack = ActionContext.getContext().getValueStack();
Map<String, Object> context = new HashMap<String, Object>();
context.put("key1", new String("This is key1"));
context.put("key2", new String("This is key2"));
stack.push(context);
System.out.println("Size of the valueStack: " + stack.size());
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ที่จริงแล้ว Struts 2 จะเพิ่มการกระทำของคุณที่ด้านบนสุดของ valueStack เมื่อดำเนินการ ดังนั้นวิธีปกติในการใส่สิ่งต่างๆใน Value Stack คือการเพิ่ม getters / setters สำหรับค่าลงในคลาส Action ของคุณจากนั้นใช้แท็ก <s: property> เพื่อเข้าถึงค่า แต่ฉันกำลังแสดงให้คุณเห็นว่า ActionContext และ ValueStack ทำงานอย่างไรใน struts
สร้างมุมมอง
ให้เราสร้างไฟล์ jsp ด้านล่าง HelloWorld.jspในโฟลเดอร์ WebContent ในโปรเจ็กต์ eclipse ของคุณ มุมมองนี้จะแสดงในกรณีที่การดำเนินการส่งคืนความสำเร็จ -
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
Entered value : <s:property value = "name"/><br/>
Value of key 1 : <s:property value = "key1" /><br/>
Value of key 2 : <s:property value = "key2" /> <br/>
</body>
</html>
เรายังต้องสร้าง index.jsp ในโฟลเดอร์ WebContent ซึ่งมีเนื้อหาดังนี้ -
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World From Struts2</h1>
<form action = "hello">
<label for = "name">Please enter your name</label><br/>
<input type = "text" name = "name"/>
<input type = "submit" value = "Say Hello"/>
</form>
</body>
</html>
ไฟล์การกำหนดค่า
ต่อไปนี้เป็นเนื้อหาของ struts.xml ไฟล์ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
ต่อไปนี้เป็นเนื้อหาของ web.xml ไฟล์ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat
สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URL http://localhost:8080/HelloWorldStruts2/index.jsp. ซึ่งจะแสดงหน้าจอต่อไปนี้
ตอนนี้ให้ป้อนคำใดก็ได้ในช่องข้อความที่กำหนดแล้วคลิกปุ่ม "พูดสวัสดี" เพื่อดำเนินการตามที่กำหนดไว้ ตอนนี้หากคุณจะตรวจสอบบันทึกที่สร้างขึ้นคุณจะพบข้อความต่อไปนี้ที่ด้านล่าง -
Size of the valueStack: 3
ซึ่งจะแสดงหน้าจอต่อไปนี้ซึ่งจะแสดงค่าใดก็ตามที่คุณจะป้อนและค่าของ key1 และ key2 ที่เราใส่ไว้ใน ValueStack
เฟรมเวิร์ก Struts 2 ให้การสนับสนุนในตัวสำหรับการประมวลผลการอัปโหลดไฟล์โดยใช้ "Form-based File Upload ใน HTML" เมื่ออัปโหลดไฟล์โดยทั่วไปไฟล์นั้นจะถูกเก็บไว้ในไดเร็กทอรีชั่วคราวและควรถูกประมวลผลหรือย้ายโดยคลาส Action ของคุณไปยังไดเร็กทอรีถาวรเพื่อให้แน่ใจว่าข้อมูลจะไม่สูญหาย
Note - เซิร์ฟเวอร์อาจมีนโยบายการรักษาความปลอดภัยที่ห้ามไม่ให้คุณเขียนไปยังไดเร็กทอรีอื่นที่ไม่ใช่ไดเร็กทอรีชั่วคราวและไดเร็กทอรีที่เป็นของเว็บแอปพลิเคชันของคุณ
การอัปโหลดไฟล์ใน Struts ทำได้โดยใช้ตัวสกัดกั้นที่กำหนดไว้ล่วงหน้าที่เรียกว่า FileUpload interceptor ซึ่งพร้อมใช้งานผ่านคลาส org.apache.struts2.interceptor.FileUploadInterceptor และรวมเป็นส่วนหนึ่งของdefaultStack. คุณยังสามารถใช้สิ่งนั้นใน struts.xml เพื่อตั้งค่าพารามิเตอร์ต่างๆตามที่เราจะเห็นด้านล่าง
สร้างไฟล์ดู
เริ่มต้นด้วยการสร้างมุมมองของเราซึ่งจะต้องใช้ในการเรียกดูและอัปโหลดไฟล์ที่เลือก ให้เราสร้างไฟล์index.jsp ด้วยรูปแบบการอัปโหลด HTML ธรรมดาที่อนุญาตให้ผู้ใช้อัปโหลดไฟล์ -
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>File Upload</title>
</head>
<body>
<form action = "upload" method = "post" enctype = "multipart/form-data">
<label for = "myFile">Upload your file</label>
<input type = "file" name = "myFile" />
<input type = "submit" value = "Upload"/>
</form>
</body>
</html>
มีสองจุดที่ควรสังเกตในตัวอย่างข้างต้น ขั้นแรก enctype ของแบบฟอร์มถูกตั้งค่าเป็นmultipart/form-data. ควรตั้งค่านี้เพื่อให้ตัวสกัดการอัปโหลดไฟล์จัดการการอัปโหลดไฟล์ได้สำเร็จ ข้อสังเกตต่อไปคือวิธีการดำเนินการของแบบฟอร์มupload และชื่อของช่องอัปโหลดไฟล์ - ซึ่งก็คือ myFile. เราต้องการข้อมูลนี้เพื่อสร้างวิธีการดำเนินการและการกำหนดค่า struts
ต่อไปให้เราสร้างไฟล์ jsp ง่ายๆ success.jsp เพื่อแสดงผลลัพธ์ของการอัปโหลดไฟล์ของเราในกรณีที่ประสบความสำเร็จ
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>File Upload Success</title>
</head>
<body>
You have successfully uploaded <s:property value = "myFileFileName"/>
</body>
</html>
ต่อไปนี้จะเป็นไฟล์ผลลัพธ์ error.jsp ในกรณีที่มีข้อผิดพลาดในการอัปโหลดไฟล์ -
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>File Upload Error</title>
</head>
<body>
There has been an error in uploading the file.
</body>
</html>
สร้างคลาสการดำเนินการ
ต่อไปให้เราสร้างคลาส Java ที่เรียกว่า uploadFile.java ซึ่งจะดูแลการอัปโหลดไฟล์และจัดเก็บไฟล์นั้นในตำแหน่งที่ปลอดภัย -
package com.tutorialspoint.struts2;
import java.io.File;
import org.apache.commons.io.FileUtils;
import java.io.IOException;
import com.opensymphony.xwork2.ActionSupport;
public class uploadFile extends ActionSupport {
private File myFile;
private String myFileContentType;
private String myFileFileName;
private String destPath;
public String execute() {
/* Copy file to a safe location */
destPath = "C:/apache-tomcat-6.0.33/work/";
try {
System.out.println("Src File name: " + myFile);
System.out.println("Dst File name: " + myFileFileName);
File destFile = new File(destPath, myFileFileName);
FileUtils.copyFile(myFile, destFile);
} catch(IOException e) {
e.printStackTrace();
return ERROR;
}
return SUCCESS;
}
public File getMyFile() {
return myFile;
}
public void setMyFile(File myFile) {
this.myFile = myFile;
}
public String getMyFileContentType() {
return myFileContentType;
}
public void setMyFileContentType(String myFileContentType) {
this.myFileContentType = myFileContentType;
}
public String getMyFileFileName() {
return myFileFileName;
}
public void setMyFileFileName(String myFileFileName) {
this.myFileFileName = myFileFileName;
}
}
uploadFile.javaเป็นคลาสที่เรียบง่ายมาก สิ่งสำคัญที่ควรทราบคือตัวสกัดกั้น FileUpload พร้อมกับ Parameters Interceptor ทำหน้าที่ยกของหนักทั้งหมดให้กับเรา
ตัวสกัดกั้น FileUpload ทำให้สามพารามิเตอร์พร้อมใช้งานสำหรับคุณโดยค่าเริ่มต้น มีการตั้งชื่อตามรูปแบบต่อไปนี้ -
[your file name parameter] - นี่คือไฟล์จริงที่ผู้ใช้อัพโหลด ในตัวอย่างนี้จะเป็น "myFile"
[your file name parameter]ContentType- นี่คือประเภทเนื้อหาของไฟล์ที่อัปโหลด ในตัวอย่างนี้จะเป็น "myFileContentType"
[your file name parameter]FileName- นี่คือชื่อของไฟล์ที่อัปโหลด ในตัวอย่างนี้จะเป็น "myFileFileName"
มีพารามิเตอร์สามตัวสำหรับเราด้วย Struts Interceptors สิ่งที่เราต้องทำคือสร้างพารามิเตอร์สามตัวที่มีชื่อที่ถูกต้องในคลาส Action ของเราและโดยอัตโนมัติตัวแปรเหล่านี้จะต่อสายให้เราโดยอัตโนมัติ ดังนั้นในตัวอย่างข้างต้นเรามีพารามิเตอร์สามตัวและวิธีการดำเนินการที่ส่งคืน "ความสำเร็จ" หากทุกอย่างเป็นไปด้วยดีมิฉะนั้นจะส่งคืน "ข้อผิดพลาด"
ไฟล์การกำหนดค่า
ต่อไปนี้เป็นคุณสมบัติคอนฟิกูเรชัน Struts2 ที่ควบคุมกระบวนการอัพโหลดไฟล์ -
ซีเนียร์ No | คุณสมบัติและคำอธิบาย |
---|---|
1 | struts.multipart.maxSize ขนาดสูงสุด (เป็นไบต์) ของไฟล์ที่จะยอมรับในการอัปโหลดไฟล์ ค่าเริ่มต้นคือ 250M |
2 | struts.multipart.parser ไลบรารีที่ใช้ในการอัปโหลดแบบฟอร์มหลายส่วน โดยค่าเริ่มต้นคือjakarta |
3 | struts.multipart.saveDir ตำแหน่งที่จัดเก็บไฟล์ชั่วคราว โดยค่าเริ่มต้นคือ javax.servlet.context.tempdir |
ในการเปลี่ยนการตั้งค่าเหล่านี้คุณสามารถใช้ constant แท็กในไฟล์ struts.xml ของแอปพลิเคชันของคุณเช่นเดียวกับที่ฉันได้เปลี่ยนขนาดสูงสุดของไฟล์ที่จะอัปโหลด
ให้เรามี struts.xml ดังต่อไปนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<constant name = "struts.multipart.maxSize" value = "1000000" />
<package name = "helloworld" extends = "struts-default">
<action name = "upload" class = "com.tutorialspoint.struts2.uploadFile">
<result name = "success">/success.jsp</result>
<result name = "error">/error.jsp</result>
</action>
</package>
</struts>
ตั้งแต่, FileUploadinterceptor เป็นส่วนหนึ่งของ Stack ของ interceptors เริ่มต้นเราไม่จำเป็นต้องกำหนดค่าความชัดเจน แต่คุณสามารถเพิ่มแท็ก <interceptor-ref> ภายใน <action> ตัวสกัดกั้น fileUpload รับสองพารามิเตอร์(a) maximumSize และ (b) allowedTypes.
พารามิเตอร์ maximumSize ตั้งค่าขนาดไฟล์สูงสุดที่อนุญาต (ค่าดีฟอลต์คือประมาณ 2MB) พารามิเตอร์ allowTypes คือรายการประเภทเนื้อหาที่ยอมรับ (MIME) ที่คั่นด้วยเครื่องหมายจุลภาคดังที่แสดงด้านล่าง -
<action name = "upload" class = "com.tutorialspoint.struts2.uploadFile">
<interceptor-ref name = "basicStack">
<interceptor-ref name = "fileUpload">
<param name = "allowedTypes">image/jpeg,image/gif</param>
</interceptor-ref>
<result name = "success">/success.jsp</result>
<result name = "error">/error.jsp</result>
</action>
ต่อไปนี้เป็นเนื้อหาของ web.xml ไฟล์ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
ตอนนี้คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/upload.jsp. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -
ตอนนี้เลือกไฟล์ "Contacts.txt" โดยใช้ปุ่มเรียกดูและคลิกปุ่มอัปโหลดซึ่งจะอัปโหลดไฟล์ในบริการของคุณและคุณจะเห็นหน้าถัดไป คุณสามารถตรวจสอบว่าไฟล์ที่อัปโหลดควรบันทึกใน C: \ apache-tomcat-6.0.33 \ work
โปรดทราบว่า FileUpload Interceptor จะลบไฟล์ที่อัปโหลดโดยอัตโนมัติดังนั้นคุณจะต้องบันทึกไฟล์ที่อัปโหลดด้วยโปรแกรมในบางตำแหน่งก่อนที่ไฟล์นั้นจะถูกลบ
ข้อความแสดงข้อผิดพลาด
ตัวสกัดกั้น fileUplaod ใช้ปุ่มข้อความแสดงข้อผิดพลาดเริ่มต้นหลายปุ่ม -
ซีเนียร์ No | คีย์ข้อความแสดงข้อผิดพลาดและคำอธิบาย |
---|---|
1 | struts.messages.error.uploading ข้อผิดพลาดทั่วไปที่เกิดขึ้นเมื่อไม่สามารถอัปโหลดไฟล์ได้ |
2 | struts.messages.error.file.too.large เกิดขึ้นเมื่อไฟล์ที่อัปโหลดมีขนาดใหญ่เกินไปตามที่กำหนดโดย maximumSize |
3 | struts.messages.error.content.type.not.allowed เกิดขึ้นเมื่อไฟล์ที่อัปโหลดไม่ตรงกับประเภทเนื้อหาที่คาดไว้ที่ระบุ |
คุณสามารถแทนที่ข้อความของข้อความเหล่านี้ได้ใน WebContent/WEB-INF/classes/messages.properties ไฟล์ทรัพยากร
บทนี้จะสอนวิธีเข้าถึงฐานข้อมูลโดยใช้ Struts 2 ในขั้นตอนง่ายๆ Struts เป็นเฟรมเวิร์ก MVC ไม่ใช่เฟรมเวิร์กฐานข้อมูล แต่ให้การสนับสนุนที่ดีเยี่ยมสำหรับการรวม JPA / Hibernate เราจะดูการรวมไฮเบอร์เนตในบทต่อ ๆ ไป แต่ในบทนี้เราจะใช้ JDBC แบบเก่าในการเข้าถึงฐานข้อมูล
ขั้นตอนแรกในบทนี้คือการตั้งค่าและกำหนดฐานข้อมูลของเรา ฉันใช้ MySQL เป็นฐานข้อมูลสำหรับตัวอย่างนี้ ฉันติดตั้ง MySQL บนเครื่องของฉันและฉันได้สร้างฐานข้อมูลใหม่ชื่อ "struts_tutorial" ฉันได้สร้างตารางที่เรียกว่าloginและเติมด้วยค่าบางอย่าง ด้านล่างนี้คือสคริปต์ที่ฉันใช้สร้างและเติมข้อมูลในตาราง
ฐานข้อมูล MYSQL ของฉันมีชื่อผู้ใช้เริ่มต้น "root" และรหัสผ่าน "root123"
CREATE TABLE `struts_tutorial`.`login` (
`user` VARCHAR( 10 ) NOT NULL ,
`password` VARCHAR( 10 ) NOT NULL ,
`name` VARCHAR( 20 ) NOT NULL ,
PRIMARY KEY ( `user` )
) ENGINE = InnoDB;
INSERT INTO `struts_tutorial`.`login` (`user`, `password`, `name`)
VALUES ('scott', 'navy', 'Scott Burgemott');
ขั้นตอนต่อไปคือการดาวน์โหลดไฟล์ jar MySQL Connectorและวางไฟล์นี้ในโฟลเดอร์ WEB-INF \ lib ของโครงการของคุณ หลังจากที่เราทำเสร็จแล้วเราก็พร้อมที่จะสร้างคลาสแอ็กชัน
สร้างการดำเนินการ
คลาสการดำเนินการมีคุณสมบัติที่สอดคล้องกับคอลัมน์ในตารางฐานข้อมูล เรามีuser, password และ nameเป็นแอตทริบิวต์ String ในวิธีการดำเนินการเราใช้พารามิเตอร์ผู้ใช้และรหัสผ่านเพื่อตรวจสอบว่ามีผู้ใช้อยู่หรือไม่หากเป็นเช่นนั้นเราจะแสดงชื่อผู้ใช้ในหน้าจอถัดไป
หากผู้ใช้ป้อนข้อมูลผิดเราจะส่งไปที่หน้าจอเข้าสู่ระบบอีกครั้ง
ต่อไปนี้เป็นเนื้อหาของ LoginAction.java ไฟล์ -
package com.tutorialspoint.struts2;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String user;
private String password;
private String name;
public String execute() {
String ret = ERROR;
Connection conn = null;
try {
String URL = "jdbc:mysql://localhost/struts_tutorial";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(URL, "root", "root123");
String sql = "SELECT name FROM login WHERE";
sql+=" user = ? AND password = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, user);
ps.setString(2, password);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
name = rs.getString(1);
ret = SUCCESS;
}
} catch (Exception e) {
ret = ERROR;
} finally {
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
}
}
}
return ret;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
สร้างหน้าหลัก
ตอนนี้ให้เราสร้างไฟล์ JSP index.jspเพื่อรวบรวมชื่อผู้ใช้และรหัสผ่าน ชื่อผู้ใช้และรหัสผ่านนี้จะถูกตรวจสอบกับฐานข้อมูล
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Login</title>
</head>
<body>
<form action = "loginaction" method = "post">
User:<br/><input type = "text" name = "user"/><br/>
Password:<br/><input type = "password" name = "password"/><br/>
<input type = "submit" value = "Login"/>
</form>
</body>
</html>
สร้างมุมมอง
ตอนนี้ให้เราสร้าง success.jsp ซึ่งจะเรียกใช้ในกรณีที่การดำเนินการส่งคืน SUCCESS แต่เราจะมีไฟล์มุมมองอื่นในกรณีที่มีการส่งคืนข้อผิดพลาดจากการกระทำ
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Successful Login</title>
</head>
<body>
Hello World, <s:property value = "name"/>
</body>
</html>
ต่อไปนี้จะเป็นไฟล์ดู error.jsp ในกรณีของ ERROR จะถูกส่งกลับจากการดำเนินการ
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Invalid User Name or Password</title>
</head>
<body>
Wrong user name or password provided.
</body>
</html>
ไฟล์การกำหนดค่า
สุดท้ายให้เรารวบรวมทุกอย่างเข้าด้วยกันโดยใช้ไฟล์คอนฟิกูเรชัน struts.xml ดังนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "loginaction"
class = "com.tutorialspoint.struts2.LoginAction"
method = "execute">
<result name = "success">/success.jsp</result>
<result name = "error">/error.jsp</result>
</action>
</package>
</struts>
ต่อไปนี้เป็นเนื้อหาของ web.xml ไฟล์ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
ตอนนี้คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -
ป้อนชื่อผู้ใช้และรหัสผ่านผิด คุณควรจะเห็นหน้าถัดไป
ตอนนี้เข้า scott เป็นชื่อผู้ใช้และ navyเป็นรหัสผ่าน คุณควรจะเห็นหน้าถัดไป
บทนี้อธิบายวิธีการส่งอีเมลโดยใช้แอปพลิเคชัน Struts 2
สำหรับแบบฝึกหัดนี้คุณต้องดาวน์โหลดและติดตั้ง mail.jar จากJavaMail API 1.4.4และวางไฟล์mail.jar ไฟล์ในโฟลเดอร์ WEB-INF \ lib ของคุณจากนั้นดำเนินการตามขั้นตอนมาตรฐานในการสร้างไฟล์แอ็คชันดูและกำหนดค่า
สร้างการดำเนินการ
ขั้นตอนต่อไปคือการสร้างวิธีการดำเนินการที่ดูแลการส่งอีเมล ให้เราสร้างคลาสใหม่ที่เรียกว่าEmailer.java โดยมีเนื้อหาดังต่อไปนี้
package com.tutorialspoint.struts2;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import com.opensymphony.xwork2.ActionSupport;
public class Emailer extends ActionSupport {
private String from;
private String password;
private String to;
private String subject;
private String body;
static Properties properties = new Properties();
static {
properties.put("mail.smtp.host", "smtp.gmail.com");
properties.put("mail.smtp.socketFactory.port", "465");
properties.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.port", "465");
}
public String execute() {
String ret = SUCCESS;
try {
Session session = Session.getDefaultInstance(properties,
new javax.mail.Authenticator() {
protected PasswordAuthentication
getPasswordAuthentication() {
return new
PasswordAuthentication(from, password);
}
}
);
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
message.setSubject(subject);
message.setText(body);
Transport.send(message);
} catch(Exception e) {
ret = ERROR;
e.printStackTrace();
}
return ret;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public static Properties getProperties() {
return properties;
}
public static void setProperties(Properties properties) {
Emailer.properties = properties;
}
}
ดังที่เห็นในซอร์สโค้ดด้านบนไฟล์ Emailer.javaมีคุณสมบัติที่สอดคล้องกับแอตทริบิวต์แบบฟอร์มในหน้า email.jsp ที่ระบุด้านล่าง คุณลักษณะเหล่านี้คือ -
From- ที่อยู่อีเมลของผู้ส่ง เนื่องจากเราใช้ SMTP ของ Google เราจึงต้องมีรหัส gtalk ที่ถูกต้อง
Password - รหัสผ่านของบัญชีข้างต้น
To - จะส่งอีเมลไปหาใคร?
Subject - หัวเรื่องของอีเมล
Body - ข้อความอีเมลจริง
เราไม่ได้พิจารณาการตรวจสอบความถูกต้องใด ๆ ในฟิลด์ข้างต้นการตรวจสอบความถูกต้องจะถูกเพิ่มในบทถัดไป ตอนนี้ให้เราดูที่ execute () วิธีการ เมธอด execute () ใช้ไลบรารี javax Mail เพื่อส่งอีเมลโดยใช้พารามิเตอร์ที่ให้มา หากส่งอีเมลสำเร็จการดำเนินการจะส่งคืน SUCCESS มิฉะนั้นจะส่งกลับ ERROR
สร้างหน้าหลัก
ให้เราเขียนไฟล์ JSP หน้าหลัก index.jspซึ่งจะใช้ในการรวบรวมข้อมูลเกี่ยวกับอีเมลที่กล่าวถึงข้างต้น -
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Email Form</title>
</head>
<body>
<em>The form below uses Google's SMTP server.
So you need to enter a gmail username and password
</em>
<form action = "emailer" method = "post">
<label for = "from">From</label><br/>
<input type = "text" name = "from"/><br/>
<label for = "password">Password</label><br/>
<input type = "password" name = "password"/><br/>
<label for = "to">To</label><br/>
<input type = "text" name = "to"/><br/>
<label for = "subject">Subject</label><br/>
<input type = "text" name = "subject"/><br/>
<label for = "body">Body</label><br/>
<input type = "text" name = "body"/><br/>
<input type = "submit" value = "Send Email"/>
</form>
</body>
</html>
สร้างมุมมอง
เราจะใช้ไฟล์ JSP success.jsp ซึ่งจะถูกเรียกในกรณีที่การดำเนินการส่งคืน SUCCESS แต่เราจะมีไฟล์มุมมองอื่นในกรณีที่มีการส่งคืนข้อผิดพลาดจากการดำเนินการ
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Email Success</title>
</head>
<body>
Your email to <s:property value = "to"/> was sent successfully.
</body>
</html>
ต่อไปนี้จะเป็นไฟล์ดู error.jsp ในกรณีของ ERROR จะถูกส่งกลับจากการดำเนินการ
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Email Error</title>
</head>
<body>
There is a problem sending your email to <s:property value = "to"/>.
</body>
</html>
ไฟล์การกำหนดค่า
ตอนนี้ให้เรารวบรวมทุกอย่างเข้าด้วยกันโดยใช้ไฟล์กำหนดค่า struts.xml ดังนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "emailer"
class = "com.tutorialspoint.struts2.Emailer"
method = "execute">
<result name = "success">/success.jsp</result>
<result name = "error">/error.jsp</result>
</action>
</package>
</struts>
ต่อไปนี้เป็นเนื้อหาของ web.xml ไฟล์ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
ตอนนี้คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -
ป้อนข้อมูลที่จำเป็นแล้วคลิก Send Emailปุ่ม. หากทุกอย่างเรียบร้อยดีคุณจะเห็นหน้าต่อไปนี้
ในบทนี้เราจะดูลึกลงไปในกรอบการตรวจสอบความถูกต้องของ Struts ที่แกน Struts เรามีกรอบการตรวจสอบความถูกต้องที่ช่วยให้แอปพลิเคชันรันกฎเพื่อทำการตรวจสอบความถูกต้องก่อนที่วิธีการดำเนินการจะดำเนินการ
โดยปกติการตรวจสอบฝั่งไคลเอ็นต์ทำได้โดยใช้ Javascript อย่างไรก็ตามไม่ควรพึ่งพาการตรวจสอบความถูกต้องของฝั่งไคลเอ็นต์เพียงอย่างเดียว แนวทางปฏิบัติที่ดีที่สุดแนะนำว่าควรแนะนำการตรวจสอบความถูกต้องในทุกระดับของกรอบงานแอปพลิเคชันของคุณ ตอนนี้ให้เราดูสองวิธีในการเพิ่มการตรวจสอบความถูกต้องให้กับโครงการ Struts ของเรา
ที่นี่เราจะนำตัวอย่างของไฟล์ Employee ซึ่งควรจับชื่อและอายุโดยใช้หน้าเรียบง่ายและเราจะทำการตรวจสอบความถูกต้องทั้งสองนี้เพื่อให้แน่ใจว่าผู้ใช้ป้อนชื่อและอายุซึ่งควรอยู่ในช่วงระหว่าง 28 ถึง 65 เสมอ
เริ่มต้นด้วยหน้า JSP หลักของตัวอย่าง
สร้างหน้าหลัก
ให้เราเขียนไฟล์ JSP หน้าหลัก index.jspซึ่งจะใช้ในการรวบรวมข้อมูลที่เกี่ยวข้องกับพนักงานดังกล่าวข้างต้น
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Employee Form</title>
</head>
<body>
<s:form action = "empinfo" method = "post">
<s:textfield name = "name" label = "Name" size = "20" />
<s:textfield name = "age" label = "Age" size = "20" />
<s:submit name = "submit" label = "Submit" align="center" />
</s:form>
</body>
</html>
index.jsp ใช้ประโยชน์จากแท็ก Struts ซึ่งเรายังไม่ได้กล่าวถึง แต่เราจะศึกษาในบทที่เกี่ยวข้องกับแท็ก แต่ตอนนี้สมมติว่าแท็ก s: textfield พิมพ์ช่องป้อนข้อมูลและปุ่ม s: submit จะพิมพ์ปุ่มส่ง เราใช้คุณสมบัติป้ายกำกับสำหรับแต่ละแท็กซึ่งสร้างป้ายกำกับสำหรับแต่ละแท็ก
สร้างมุมมอง
เราจะใช้ไฟล์ JSP success.jsp ซึ่งจะถูกเรียกใช้ในกรณีที่การกระทำที่กำหนดส่งคืน SUCCESS
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Success</title>
</head>
<body>
Employee Information is captured successfully.
</body>
</html>
สร้างการดำเนินการ
ดังนั้นให้เรากำหนดคลาสแอ็คชั่นเล็ก ๆ Employeeแล้วเพิ่มวิธีการที่เรียกว่า validate() ดังแสดงด้านล่างใน Employee.javaไฟล์. ตรวจสอบให้แน่ใจว่าคลาสการกระทำของคุณขยายไฟล์ActionSupport class มิฉะนั้นวิธีการตรวจสอบของคุณจะไม่ถูกเรียกใช้งาน
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Employee extends ActionSupport {
private String name;
private int age;
public String execute() {
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void validate() {
if (name == null || name.trim().equals("")) {
addFieldError("name","The name is required");
}
if (age < 28 || age > 65) {
addFieldError("age","Age must be in between 28 and 65");
}
}
}
ดังที่แสดงในตัวอย่างข้างต้นวิธีการตรวจสอบความถูกต้องจะตรวจสอบว่าฟิลด์ "ชื่อ" มีค่าหรือไม่ หากไม่มีการระบุค่าเราจะเพิ่มข้อผิดพลาดของฟิลด์สำหรับฟิลด์ 'ชื่อ' ด้วยข้อความแสดงข้อผิดพลาดที่กำหนดเอง ประการที่สองเราตรวจสอบว่าค่าที่ป้อนสำหรับฟิลด์ "อายุ" อยู่ระหว่าง 28 ถึง 65 หรือไม่หากเงื่อนไขนี้ไม่เป็นไปตามเราจะเพิ่มข้อผิดพลาดเหนือฟิลด์ที่ตรวจสอบแล้ว
ไฟล์การกำหนดค่า
สุดท้ายให้เรารวบรวมทุกอย่างเข้าด้วยกันโดยใช้ struts.xml ไฟล์กำหนดค่าดังนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "empinfo"
class = "com.tutorialspoint.struts2.Employee"
method = "execute">
<result name = "input">/index.jsp</result>
<result name = "success">/success.jsp</result>
</action>
</package>
</struts>
ต่อไปนี้เป็นเนื้อหาของ web.xml ไฟล์ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
ตอนนี้คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -
ตอนนี้ไม่ต้องป้อนข้อมูลที่จำเป็นใด ๆ เพียงคลิกที่ Submitปุ่ม. คุณจะเห็นผลลัพธ์ต่อไปนี้ -
ป้อนข้อมูลที่จำเป็น แต่ป้อนช่องจากผิดให้เราพูดชื่อ "ทดสอบ" และอายุเป็น 30 ปีและสุดท้ายคลิกที่ Submitปุ่ม. คุณจะเห็นผลลัพธ์ต่อไปนี้ -
การตรวจสอบนี้ทำงานอย่างไร?
เมื่อผู้ใช้กดปุ่มส่ง Struts 2 จะเรียกใช้วิธีการตรวจสอบความถูกต้องโดยอัตโนมัติและหากมีไฟล์ “if”คำสั่งที่แสดงอยู่ในเมธอดนั้นเป็นจริง Struts 2 จะเรียกเมธอด addFieldError หากมีการเพิ่มข้อผิดพลาด Struts 2 จะไม่ดำเนินการเรียกใช้วิธีการดำเนินการ เฟรมเวิร์ก Struts 2 จะกลับมาinput อันเป็นผลมาจากการเรียกการดำเนินการ
ดังนั้นเมื่อการตรวจสอบความถูกต้องล้มเหลวและส่งคืน Struts 2 inputเฟรมเวิร์ก Struts 2 จะแสดงไฟล์ index.jsp อีกครั้ง เนื่องจากเราใช้แท็กแบบฟอร์ม Struts 2 Struts 2 จะเพิ่มข้อความแสดงข้อผิดพลาดโดยอัตโนมัติเหนือแบบฟอร์มที่ยื่น
ข้อความแสดงข้อผิดพลาดเหล่านี้เป็นข้อความที่เราระบุไว้ในการเรียกเมธอด addFieldError เมธอด addFieldError รับสองอาร์กิวเมนต์ ประการแรกคือform ชื่อฟิลด์ที่ใช้ข้อผิดพลาดและประการที่สองคือข้อความแสดงข้อผิดพลาดที่จะแสดงเหนือฟิลด์แบบฟอร์มนั้น
addFieldError("name","The name is required");
เพื่อจัดการกับค่าส่งคืนของ input เราจำเป็นต้องเพิ่มผลลัพธ์ต่อไปนี้ในโหนดการกระทำของเราใน struts.xml.
<result name = "input">/index.jsp</result>
การตรวจสอบตาม XML
วิธีที่สองในการตรวจสอบความถูกต้องคือการวางไฟล์ xml ถัดจากคลาสการดำเนินการ การตรวจสอบความถูกต้องโดยใช้ Struts2 XML มีตัวเลือกเพิ่มเติมในการตรวจสอบความถูกต้องเช่นการตรวจสอบอีเมลการตรวจสอบช่วงจำนวนเต็มฟิลด์การตรวจสอบแบบฟอร์มการตรวจสอบนิพจน์การตรวจสอบนิพจน์การตรวจสอบความถูกต้องที่จำเป็นการตรวจสอบสตริงที่จำเป็นการตรวจสอบความยาวสตริงและอื่น ๆ
ต้องตั้งชื่อไฟล์ xml '[action-class]'-validation.xml. ดังนั้นในกรณีของเราเราสร้างไฟล์ชื่อEmployee-validation.xml โดยมีเนื้อหาดังต่อไปนี้ -
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name = "name">
<field-validator type = "required">
<message>
The name is required.
</message>
</field-validator>
</field>
<field name = "age">
<field-validator type = "int">
<param name = "min">29</param>
<param name = "max">64</param>
<message>
Age must be in between 28 and 65
</message>
</field-validator>
</field>
</validators>
ไฟล์ XML ด้านบนจะถูกเก็บไว้ใน CLASSPATH ของคุณพร้อมกับไฟล์คลาส ให้เรามีคลาสการดำเนินการของพนักงานของเราดังต่อไปนี้โดยไม่ต้องมีvalidate() วิธีการ -
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Employee extends ActionSupport{
private String name;
private int age;
public String execute() {
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
ส่วนที่เหลือของการตั้งค่าจะยังคงอยู่เหมือนตัวอย่างก่อนหน้านี้ถ้าคุณจะเรียกใช้แอปพลิเคชันมันจะให้ผลลัพธ์เดียวกันกับที่เราได้รับในตัวอย่างก่อนหน้านี้
ข้อดีของการมีไฟล์ xml เพื่อจัดเก็บคอนฟิกูเรชันทำให้สามารถแยกการตรวจสอบความถูกต้องออกจากรหัสแอปพลิเคชันได้ คุณสามารถขอให้นักพัฒนาเขียนโค้ดและนักวิเคราะห์ธุรกิจเพื่อสร้างไฟล์ xml การตรวจสอบความถูกต้อง สิ่งที่ควรทราบอีกประการหนึ่งคือประเภทของโปรแกรมตรวจสอบความถูกต้องที่พร้อมใช้งานตามค่าเริ่มต้น
มีตัวตรวจสอบความถูกต้องอีกมากมายที่มาพร้อมกับ Struts โดยค่าเริ่มต้น ตัวตรวจสอบทั่วไป ได้แก่ Date Validator, Regex validator และ String Length validator ตรวจสอบการเชื่อมโยงต่อไปนี้สำหรับรายละเอียดเพิ่มเติมStruts - XML ตาม validators
Internationalization (i18n) เป็นกระบวนการในการวางแผนและการนำผลิตภัณฑ์และบริการไปใช้เพื่อให้สามารถปรับให้เข้ากับภาษาและวัฒนธรรมเฉพาะท้องถิ่นได้อย่างง่ายดายซึ่งเป็นกระบวนการที่เรียกว่า localization กระบวนการทำให้เป็นสากลเรียกว่าการเปิดใช้งานการแปลหรือการแปล
Internationalization เป็นคำย่อ i18n เพราะคำเริ่มต้นด้วยตัวอักษร “i” และลงท้ายด้วย “n”และมี 18 อักขระระหว่าง i ตัวแรกและ n ตัวสุดท้าย
Struts2 ให้การแปลเป็นภาษาท้องถิ่นเช่นการสนับสนุนสากล (i18n) ผ่านบันเดิลทรัพยากรตัวสกัดกั้นและไลบรารีแท็กในตำแหน่งต่อไปนี้ -
แท็ก UI
ข้อความและข้อผิดพลาด
ภายในคลาสแอ็กชัน
กลุ่มทรัพยากร
Struts2 ใช้รีซอร์สบันเดิลเพื่อจัดเตรียมอ็อพชันภาษาและโลแคลหลายภาษาให้กับผู้ใช้เว็บแอ็พพลิเคชัน คุณไม่จำเป็นต้องกังวลเกี่ยวกับการเขียนเพจในภาษาต่างๆ สิ่งที่คุณต้องทำคือสร้างชุดทรัพยากรสำหรับแต่ละภาษาที่คุณต้องการ ชุดทรัพยากรจะประกอบด้วยชื่อเรื่องข้อความและข้อความอื่น ๆ ในภาษาของผู้ใช้ของคุณ บันเดิลทรัพยากรคือไฟล์ที่มีคู่คีย์ / ค่าสำหรับภาษาเริ่มต้นของแอปพลิเคชันของคุณ
รูปแบบการตั้งชื่อที่ง่ายที่สุดสำหรับไฟล์ทรัพยากรคือ -
bundlename_language_country.properties
ที่นี่ bundlenameอาจเป็น ActionClass, Interface, SuperClass, Model, Package, Global resource properties ส่วนถัดไปlanguage_country แสดงถึงภาษาของประเทศเช่นภาษาสเปน (สเปน) แสดงด้วย es_ES และภาษาอังกฤษ (สหรัฐอเมริกา) แสดงด้วย en_US เป็นต้นซึ่งคุณสามารถข้ามส่วนของประเทศซึ่งเป็นทางเลือกได้
เมื่อคุณอ้างอิงองค์ประกอบข้อความตามคีย์ Struts framework จะค้นหาบันเดิลข้อความที่เกี่ยวข้องตามลำดับต่อไปนี้ -
- ActionClass.properties
- Interface.properties
- SuperClass.properties
- model.properties
- package.properties
- struts.properties
- global.properties
ในการพัฒนาแอปพลิเคชันของคุณในหลายภาษาคุณควรดูแลไฟล์คุณสมบัติหลายไฟล์ที่สอดคล้องกับภาษา / สถานที่เหล่านั้นและกำหนดเนื้อหาทั้งหมดในรูปแบบของคู่คีย์ / ค่า
ตัวอย่างเช่นหากคุณกำลังจะพัฒนาแอปพลิเคชันของคุณสำหรับภาษาอังกฤษแบบสหรัฐอเมริกา (ค่าเริ่มต้น) สเปนและฝรั่งเศสคุณจะต้องสร้างไฟล์คุณสมบัติสามไฟล์ ที่นี่ฉันจะใช้global.properties ไฟล์เท่านั้นคุณยังสามารถใช้ประโยชน์จากไฟล์คุณสมบัติต่างๆเพื่อแยกข้อความประเภทต่างๆ
global.properties - โดยค่าเริ่มต้นจะใช้ภาษาอังกฤษ (สหรัฐอเมริกา)
global_fr.properties - จะใช้สำหรับ Franch locale
global_es.properties - จะใช้สำหรับภาษาสเปน
เข้าถึงข้อความ
มีหลายวิธีในการเข้าถึงทรัพยากรข้อความ ได้แก่ getText แท็กข้อความแอตทริบิวต์คีย์ของแท็ก UI และแท็ก i18n ให้เราดูโดยสังเขป -
เพื่อแสดง i18n ส่งข้อความใช้โทร getText ในแท็กคุณสมบัติหรือแท็กอื่น ๆ เช่นแท็ก UI ดังนี้ -
<s:property value = "getText('some.key')" />
text tag ดึงข้อความจากบันเดิลรีซอร์สดีฟอลต์เช่น struts.properties
<s:text name = "some.key" />
i18n tagผลักดันบันเดิลทรัพยากรโดยพลการไปยังกองค่า แท็กอื่น ๆ ภายในขอบเขตของแท็ก i18n สามารถแสดงข้อความจากบันเดิลทรัพยากรนั้น
<s:i18n name = "some.package.bundle">
<s:text name = "some.key" />
</s:i18n>
key แอตทริบิวต์ของแท็ก UI ส่วนใหญ่สามารถใช้เพื่อสร้างข้อความจากชุดทรัพยากร -
<s:textfield key = "some.key" name = "textfieldName"/>
ตัวอย่างการแปล
ให้เรากำหนดเป้าหมายเพื่อสร้าง index.jspจากบทก่อนหน้าในหลายภาษา ไฟล์เดียวกันจะถูกเขียนดังนี้ -
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Employee Form with Multilingual Support</title>
</head>
<body>
<h1><s:text name = "global.heading"/></h1>
<s:url id = "indexEN" namespace="/" action = "locale" >
<s:param name = "request_locale" >en</s:param>
</s:url>
<s:url id = "indexES" namespace="/" action = "locale" >
<s:param name = "request_locale" >es</s:param>
</s:url>
<s:url id = "indexFR" namespace="/" action = "locale" >
<s:param name = "request_locale" >fr</s:param>
</s:url>
<s:a href="%{indexEN}" >English</s:a>
<s:a href="%{indexES}" >Spanish</s:a>
<s:a href="%{indexFR}" >France</s:a>
<s:form action = "empinfo" method = "post" namespace = "/">
<s:textfield name = "name" key = "global.name" size = "20" />
<s:textfield name = "age" key = "global.age" size = "20" />
<s:submit name = "submit" key = "global.submit" />
</s:form>
</body>
</html>
เราจะสร้าง success.jsp ซึ่งจะถูกเรียกใช้ในกรณีที่กำหนดการดำเนินการส่งคืน SUCCESS.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Success</title>
</head>
<body>
<s:property value = "getText('global.success')" />
</body>
</html>
ที่นี่เราจะต้องสร้างสองการกระทำต่อไปนี้ (a) ขั้นแรกดำเนินการ a เพื่อดูแล Locale และแสดงไฟล์ index.jsp เดียวกันด้วยภาษาที่แตกต่างกัน (b) การดำเนินการอีกอย่างหนึ่งคือดูแลการส่งแบบฟอร์มเอง การดำเนินการทั้งสองจะส่งคืน SUCCESS แต่เราจะดำเนินการที่แตกต่างกันตามค่าการส่งคืนเนื่องจากวัตถุประสงค์ของเราแตกต่างกันสำหรับทั้งการกระทำ
การดำเนินการเพื่อดูแล Locale
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Locale extends ActionSupport {
public String execute() {
return SUCCESS;
}
}
การดำเนินการในการส่งแบบฟอร์ม
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Employee extends ActionSupport{
private String name;
private int age;
public String execute() {
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
ตอนนี้ให้เราสร้างสามต่อไปนี้ global.properties ไฟล์และใส่ไฟล์ CLASSPATH -
global.properties
global.name = Name
global.age = Age
global.submit = Submit
global.heading = Select Locale
global.success = Successfully authenticated
global_fr.properties
global.name = Nom d'utilisateur
global.age = l'âge
global.submit = Soumettre des
global.heading = Sé lectionnez Local
global.success = Authentifi é avec succès
global_es.properties
global.name = Nombre de usuario
global.age = Edad
global.submit = Presentar
global.heading = seleccionar la configuracion regional
global.success = Autenticado correctamente
เราจะสร้างไฟล์ struts.xml โดยมีสองการกระทำดังนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<constant name = "struts.custom.i18n.resources" value = "global" />
<package name = "helloworld" extends = "struts-default" namespace="/">
<action name = "empinfo"
class = "com.tutorialspoint.struts2.Employee"
method = "execute">
<result name = "input">/index.jsp</result>
<result name = "success">/success.jsp</result>
</action>
<action name = "locale"
class = "com.tutorialspoint.struts2.Locale"
method = "execute">
<result name = "success">/index.jsp</result>
</action>
</package>
</struts>
ต่อไปนี้เป็นเนื้อหาของ web.xml ไฟล์ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
ตอนนี้คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -
ตอนนี้เลือกภาษาใดก็ได้ให้เราบอกว่าเราเลือก Spanishมันจะแสดงผลลัพธ์ต่อไปนี้ -
คุณสามารถลองใช้ภาษาฝรั่งเศสได้เช่นกัน สุดท้ายให้เราลองคลิกSubmit เมื่อเราอยู่ในภาษาสเปนมันจะแสดงหน้าจอต่อไปนี้ -
ขอแสดงความยินดีตอนนี้คุณมีหน้าเว็บหลายภาษาคุณสามารถเปิดตัวเว็บไซต์ของคุณได้ทั่วโลก
ทุกอย่างในคำขอ HTTP จะถือว่าเป็นไฟล์ Stringโดยโปรโตคอล ซึ่งรวมถึงตัวเลขบูลีนจำนวนเต็มวันที่ทศนิยมและอื่น ๆ อย่างไรก็ตามในคลาส Struts คุณสามารถมีคุณสมบัติของข้อมูลประเภทใดก็ได้
Struts กำหนดคุณสมบัติให้คุณโดยอัตโนมัติอย่างไร
Struts ใช้ตัวแปลงประเภทต่างๆใต้ฝาปิดเพื่อทำการยกของหนัก
ตัวอย่างเช่นหากคุณมีแอตทริบิวต์จำนวนเต็มในคลาส Action Struts จะแปลงพารามิเตอร์คำขอเป็นแอตทริบิวต์จำนวนเต็มโดยอัตโนมัติโดยที่คุณไม่ต้องทำอะไรเลย โดยค่าเริ่มต้น Struts มาพร้อมกับตัวแปลงประเภทต่างๆ
หากคุณกำลังใช้ตัวแปลงใด ๆ ในรายการด้านล่างคุณก็ไม่มีอะไรต้องกังวล -
- จำนวนเต็มลอยคู่ทศนิยม
- วันที่และวันที่และเวลา
- อาร์เรย์และคอลเลกชัน
- Enumerations
- Boolean
- BigDecimal
ในบางครั้งที่คุณใช้ชนิดข้อมูลของคุณเองจำเป็นต้องเพิ่มตัวแปลงของคุณเองเพื่อให้ Struts ทราบวิธีการแปลงค่าเหล่านั้นก่อนที่จะแสดง พิจารณาคลาส POJO ต่อไปนี้Environment.java.
package com.tutorialspoint.struts2;
public class Environment {
private String name;
public Environment(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
นี่เป็นคลาสที่ง่ายมากที่มีแอตทริบิวต์ที่เรียกว่า nameไม่มีอะไรพิเศษเกี่ยวกับคลาสนี้ ให้เราสร้างคลาสอื่นที่มีข้อมูลเกี่ยวกับระบบ -SystemDetails.java.
สำหรับจุดประสงค์ของแบบฝึกหัดนี้ฉันได้ฮาร์ดโค้ดสภาพแวดล้อมเป็น "การพัฒนา" และระบบปฏิบัติการเป็น "Windows XP SP3" แล้ว
ในโครงการแบบเรียลไทม์คุณจะได้รับข้อมูลนี้จากการกำหนดค่าระบบ
ให้เรามีคลาสแอ็กชันต่อไปนี้ -
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class SystemDetails extends ActionSupport {
private Environment environment = new Environment("Development");
private String operatingSystem = "Windows XP SP3";
public String execute() {
return SUCCESS;
}
public Environment getEnvironment() {
return environment;
}
public void setEnvironment(Environment environment) {
this.environment = environment;
}
public String getOperatingSystem() {
return operatingSystem;
}
public void setOperatingSystem(String operatingSystem) {
this.operatingSystem = operatingSystem;
}
}
ต่อไปให้เราสร้างไฟล์ JSP ง่ายๆ System.jsp เพื่อแสดงข้อมูลสภาพแวดล้อมและระบบปฏิบัติการ
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>System Details</title>
</head>
<body>
Environment: <s:property value = "environment"/><br/>
Operating System:<s:property value = "operatingSystem"/>
</body>
</html>
ให้เราเชื่อมต่อไฟล์ system.jsp และ SystemDetails.java เรียนด้วยกันโดยใช้ struts.xml.
คลาส SystemDetails มีเมธอด execute () อย่างง่ายที่ส่งคืนสตริง "SUCCESS".
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "system"
class = "com.tutorialspoint.struts2.SystemDetails"
method = "execute">
<result name = "success">/System.jsp</result>
</action>
</package>
</struts>
คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR File เพื่อสร้างไฟล์ War
จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat
สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URL http://localhost:8080/HelloWorldStruts2/system.action. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -
มีอะไรผิดปกติกับผลลัพธ์ข้างต้น? Struts รู้วิธีแสดงและแปลงสตริง "Windows XP SP3" และชนิดข้อมูลในตัวอื่น ๆ แต่ไม่ทราบว่าจะทำอย่างไรกับคุณสมบัติของEnvironmentประเภท. เรียกง่ายๆว่าtoString() วิธีการในชั้นเรียน
เพื่อแก้ไขปัญหานี้ให้เราสร้างและลงทะเบียนแบบง่าย TypeConverter สำหรับคลาส Environment
สร้างคลาสที่เรียกว่า EnvironmentConverter.java ดังต่อไปนี้
package com.tutorialspoint.struts2;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
public class EnvironmentConverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class clazz) {
Environment env = new Environment(values[0]);
return env;
}
@Override
public String convertToString(Map context, Object value) {
Environment env = (Environment) value;
return env == null ? null : env.getName();
}
}
EnvironmentConverter ขยายไฟล์ StrutsTypeConverter คลาสและบอก Struts ถึงวิธีการแปลง Environment เป็น String และในทางกลับกันโดยการแทนที่สองวิธีคือ convertFromString() และ convertToString().
ตอนนี้ให้เราลงทะเบียนตัวแปลงนี้ก่อนที่เราจะใช้ในแอปพลิเคชันของเรา มีสองวิธีในการลงทะเบียนตัวแปลง
หากตัวแปลงจะถูกใช้ในการกระทำบางอย่างเท่านั้นคุณจะต้องสร้างไฟล์คุณสมบัติที่ต้องตั้งชื่อเป็นไฟล์ '[action-class]'converstion.properties.
ในกรณีของเราเราสร้างไฟล์ชื่อ SystemDetails-converstion.properties ด้วยรายการลงทะเบียนดังต่อไปนี้ -
environment = com.tutorialspoint.struts2.EnvironmentConverter
ในตัวอย่างข้างต้น "สภาพแวดล้อม" คือชื่อของคุณสมบัติในไฟล์ SystemDetails.java ชั้นเรียนและเรากำลังบอกให้ Struts ใช้ไฟล์ EnvironmentConverter สำหรับการแปลงไปและกลับจากคุณสมบัตินี้
อย่างไรก็ตามเราจะไม่ทำเช่นนี้ แต่เราจะลงทะเบียนตัวแปลงนี้ทั่วโลกเพื่อให้สามารถใช้งานได้ตลอดทั้งแอปพลิเคชัน ในการดำเนินการนี้ให้สร้างไฟล์คุณสมบัติชื่อxwork-conversion.properties ใน WEBINF/classes โฟลเดอร์ที่มีบรรทัดต่อไปนี้
com.tutorialspoint.struts2.Environment = \
com.tutorialspoint.struts2.EnvironmentConverter
สิ่งนี้จะลงทะเบียนตัวแปลงทั่วโลกดังนั้น Strutsสามารถทำการแปลงโดยอัตโนมัติทุกครั้งเมื่อพบอ็อบเจ็กต์ประเภท Environment ตอนนี้ถ้าคุณคอมไพล์ใหม่และรันโปรแกรมอีกครั้งคุณจะได้ผลลัพธ์ที่ดีขึ้นดังนี้ -
เห็นได้ชัดว่าตอนนี้ผลลัพธ์จะดีขึ้นซึ่งหมายความว่าตัวแปลง Struts ของเราทำงานได้ดี
นี่คือวิธีที่คุณสามารถสร้างตัวแปลงหลายตัวและลงทะเบียนเพื่อใช้ตามความต้องการของคุณ
ก่อนที่จะเริ่มบทช่วยสอนจริงสำหรับบทนี้ให้เราพิจารณาคำจำกัดความบางประการตามที่กำหนดโดย https://struts.apache.org-
ซีเนียร์ No | ข้อกำหนดและคำอธิบาย |
---|---|
1 | TAG โค้ดชิ้นเล็ก ๆ ที่เรียกใช้งานจากภายใน JSP, FreeMarker หรือ Velocity |
2 | TEMPLATE บิตของโค้ดมักเขียนใน FreeMarker ซึ่งสามารถแสดงผลโดยแท็กบางแท็ก (แท็ก HTML) |
3 | THEME ชุดแม่แบบที่รวมเข้าด้วยกันเพื่อมอบฟังก์ชันการทำงานทั่วไป |
ฉันขอแนะนำให้อ่านบทStruts2 Localizationเพราะเราจะใช้ตัวอย่างเดียวกันอีกครั้งในการออกกำลังกายของเรา
เมื่อคุณใช้ไฟล์ Struts 2แท็กเช่น <s: submit ... >, <s: textfield ... > ฯลฯ ในหน้าเว็บของคุณเฟรมเวิร์ก Struts 2 จะสร้างโค้ด HTML ด้วยรูปแบบและเค้าโครงที่กำหนดไว้ล่วงหน้า Struts 2 มาพร้อมกับสามธีมในตัว -
ซีเนียร์ No | ธีมและคำอธิบาย |
---|---|
1 | SIMPLE theme ธีมมินิมอลที่ไม่มี "ระฆังและนกหวีด" ตัวอย่างเช่นแท็กฟิลด์ข้อความแสดงผลแท็ก HTML <input /> โดยไม่มีป้ายกำกับการตรวจสอบความถูกต้องการรายงานข้อผิดพลาดหรือการจัดรูปแบบหรือฟังก์ชันอื่น ๆ |
2 | XHTML theme นี่เป็นธีมเริ่มต้นที่ Struts 2 ใช้และมีพื้นฐานทั้งหมดที่ชุดรูปแบบธรรมดามีให้และเพิ่มคุณสมบัติต่างๆเช่นเค้าโครงตารางสองคอลัมน์มาตรฐานสำหรับ HTML ป้ายกำกับสำหรับ HTML แต่ละรายการการตรวจสอบความถูกต้องและการรายงานข้อผิดพลาดเป็นต้น |
3 | CSS_XHTML theme ชุดรูปแบบนี้ให้ข้อมูลพื้นฐานทั้งหมดที่ชุดรูปแบบเรียบง่ายมีให้และเพิ่มคุณสมบัติต่างๆเช่นรูปแบบตามมาตรฐาน CSS สองคอลัมน์โดยใช้ <div> สำหรับแท็ก HTML Struts ป้ายกำกับสำหรับแท็ก HTML Struts แต่ละแท็กที่วางตามสไตล์ชีท CSS . |
ตามที่กล่าวไว้ข้างต้นหากคุณไม่ได้ระบุธีม Struts 2 จะใช้ธีม xhtml เป็นค่าเริ่มต้น ตัวอย่างเช่นแท็กเลือก Struts 2 นี้ -
<s:textfield name = "name" label = "Name" />
สร้างมาร์กอัป HTML ต่อไปนี้ -
<tr>
<td class="tdLabel">
<label for = "empinfo_name" class="label">Name:</label>
</td>
<td>
<input type = "text" name = "name" value = "" id = "empinfo_name"/>
</td>
</tr>
ที่นี่ empinfo คือชื่อการดำเนินการที่กำหนดในไฟล์ struts.xml
การเลือกธีม
คุณสามารถระบุธีมตาม Struts 2 พื้นฐานแท็กหรือคุณสามารถใช้วิธีใดวิธีหนึ่งต่อไปนี้เพื่อระบุว่าควรใช้ธีม Struts 2 -
แอตทริบิวต์ธีมบนแท็กเฉพาะ
แอ็ตทริบิวต์ธีมบนแท็กแบบฟอร์มโดยรอบของแท็ก
แอตทริบิวต์ขอบเขตหน้าชื่อ "ธีม"
แอตทริบิวต์ request-scoped ชื่อ "theme"
แอตทริบิวต์ขอบเขตเซสชันชื่อ "ธีม"
แอตทริบิวต์ที่กำหนดขอบเขตแอปพลิเคชันชื่อ "theme"
คุณสมบัติ struts.ui.theme ใน struts.properties (ค่าดีฟอลต์คือ xhtml)
ต่อไปนี้เป็นไวยากรณ์เพื่อระบุที่ระดับแท็กหากคุณต้องการใช้ธีมที่แตกต่างกันสำหรับแท็กต่างๆ -
<s:textfield name = "name" label = "Name" theme="xhtml"/>
เนื่องจากการใช้ธีมตามแท็กนั้นไม่เป็นประโยชน์มากนักดังนั้นเราสามารถระบุกฎในรูปแบบ struts.properties ไฟล์โดยใช้แท็กต่อไปนี้ -
# Standard UI theme
struts.ui.theme = xhtml
# Directory where theme template resides
struts.ui.templateDir = template
# Sets the default template type. Either ftl, vm, or jsp
struts.ui.templateSuffix = ftl
ต่อไปนี้เป็นผลลัพธ์ที่เราเลือกจากบทการแปลภาษาที่เราใช้ธีมเริ่มต้นด้วยการตั้งค่า struts.ui.theme = xhtml ใน struts-default.properties ไฟล์ที่มาตามค่าเริ่มต้นในไฟล์ struts2-core.xy.z.jar
ธีมทำงานอย่างไร?
สำหรับธีมที่กำหนดแท็ก struts ทุกแท็กจะมีเทมเพลตที่เกี่ยวข้องเช่น s:textfield → text.ftl และ s:password → password.ftl เป็นต้น
ไฟล์เทมเพลตเหล่านี้ถูกบีบอัดในไฟล์ struts2-core.xy.z.jar ไฟล์เทมเพลตเหล่านี้เก็บเค้าโครง HTML ที่กำหนดไว้ล่วงหน้าสำหรับแต่ละแท็ก
ทางนี้, Struts 2 เฟรมเวิร์กสร้างโค้ดมาร์กอัป HTML สุดท้ายโดยใช้แท็ก Sturts และเทมเพลตที่เกี่ยวข้อง
Struts 2 tags + Associated template file = Final HTML markup code.
เทมเพลตเริ่มต้นเขียนใน FreeMarker และมีส่วนขยาย .ftl.
คุณยังสามารถออกแบบเทมเพลตของคุณโดยใช้ velocity หรือ JSP และตั้งค่าคอนฟิกใน struts.properties โดยใช้ struts.ui.templateSuffix และ struts.ui.templateDir.
การสร้างธีมใหม่
วิธีที่ง่ายที่สุดในการสร้างธีมใหม่คือการคัดลอกไฟล์ธีม / เทมเพลตที่มีอยู่และทำการแก้ไขที่จำเป็น
เริ่มต้นด้วยการสร้างโฟลเดอร์ชื่อ templateในWebContent / WEBINF / คลาสและโฟลเดอร์ย่อยที่มีชื่อธีมใหม่ของเรา ยกตัวอย่างเช่นWebContent / WEB-INF / เรียน / แม่แบบ / mytheme
จากที่นี่คุณสามารถเริ่มสร้างเทมเพลตตั้งแต่เริ่มต้นหรือคุณสามารถคัดลอกเทมเพลตจากไฟล์ Struts2 distribution ซึ่งคุณสามารถแก้ไขได้ตามต้องการในอนาคต
เรากำลังจะแก้ไขเทมเพลตเริ่มต้นที่มีอยู่ xhtmlเพื่อการเรียนรู้ ตอนนี้ให้เราคัดลอกเนื้อหาจากstruts2-core-xyzjar / template / xhtmlไปยังไดเร็กทอรีธีมของเราและแก้ไขเฉพาะไฟล์ WebContent / WEBINF / class / template / mytheme / control .ftl เมื่อเราเปิด control.ftl ซึ่งจะมีบรรทัดดังนี้ -
<table class="${parameters.cssClass?default('wwFormTable')?html}"<#rt/>
<#if parameters.cssStyle??> style="${parameters.cssStyle?html}"<#rt/>
</#if>
>
ให้เราเปลี่ยนไฟล์ด้านบน control.ftl มีเนื้อหาดังต่อไปนี้ -
<table style = "border:1px solid black;">
ถ้าคุณจะตรวจสอบ form.ftl แล้วคุณจะพบว่า control.ftlถูกใช้ในไฟล์นี้ แต่ form.ftl อ้างถึงไฟล์นี้จากธีม xhtml ให้เราเปลี่ยนเป็นดังนี้ -
<#include "/${parameters.templateDir}/xhtml/form-validate.ftl" />
<#include "/${parameters.templateDir}/simple/form-common.ftl" /> <#if (parameters.validate?default(false))> onreset = "${parameters.onreset?default('clearErrorMessages(this);\
clearErrorLabels(this);')}"
<#else>
<#if parameters.onreset??>
onreset="${parameters.onreset?html}" </#if> </#if> #include "/${parameters.templateDir}/mytheme/control.ftl" />
ฉันคิดว่าคุณคงไม่มีความเข้าใจเกี่ยวกับไฟล์ FreeMarker ภาษาแม่แบบคุณยังสามารถเข้าใจสิ่งที่ต้องทำโดยดูที่ไฟล์. ftl
อย่างไรก็ตามให้เราบันทึกการเปลี่ยนแปลงข้างต้นและกลับไปที่ตัวอย่างการแปลภาษาของเราและสร้างไฟล์ WebContent/WEB-INF/classes/struts.properties ไฟล์ที่มีเนื้อหาต่อไปนี้
# Customized them
struts.ui.theme = mytheme
# Directory where theme template resides
struts.ui.templateDir = template
# Sets the template type to ftl.
struts.ui.templateSuffix = ftl
หลังจากการเปลี่ยนแปลงนี้คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -
คุณสามารถเห็นเส้นขอบรอบองค์ประกอบฟอร์มซึ่งเป็นผลมาจากการเปลี่ยนแปลงที่เราทำในธีมนอกหลังจากคัดลอกจากธีม xhtml หากคุณใช้ความพยายามเพียงเล็กน้อยในการเรียนรู้ FreeMarker คุณจะสามารถสร้างหรือปรับเปลี่ยนธีมของคุณได้อย่างง่ายดาย
ฉันหวังว่าตอนนี้คุณมีความเข้าใจพื้นฐานเกี่ยวกับ Sturts 2 ธีมและเทมเพลตใช่ไหม
Strutsให้วิธีที่ง่ายกว่าในการจัดการข้อยกเว้นที่ไม่ถูกจับและเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าแสดงข้อผิดพลาด คุณสามารถกำหนดค่า Struts ให้มีหน้าข้อผิดพลาดที่แตกต่างกันสำหรับข้อยกเว้นที่แตกต่างกันได้อย่างง่ายดาย
Struts ทำให้การจัดการข้อยกเว้นทำได้ง่ายโดยใช้ตัวสกัดกั้น "ข้อยกเว้น" ตัวสกัดกั้น "ข้อยกเว้น" รวมอยู่ในส่วนหนึ่งของสแต็กเริ่มต้นดังนั้นคุณไม่ต้องทำอะไรเพิ่มเติมเพื่อกำหนดค่า พร้อมให้คุณใช้งานได้ทันที
ให้เราดูตัวอย่างง่ายๆของ Hello World พร้อมการปรับเปลี่ยนบางอย่างในไฟล์ HelloWorldAction.java ที่นี่เราจงใจนำเสนอข้อยกเว้น NullPointer ในไฟล์HelloWorldAction รหัสการดำเนินการ
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport{
private String name;
public String execute(){
String x = null;
x = x.substring(0);
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ให้เราเก็บเนื้อหาของ HelloWorld.jsp ดังต่อไปนี้ -
<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World, <s:property value = "name"/>
</body>
</html>
ต่อไปนี้เป็นเนื้อหาของ index.jsp -
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World From Struts2</h1>
<form action = "hello">
<label for = "name">Please enter your name</label><br/>
<input type = "text" name = "name"/>
<input type = "submit" value = "Say Hello"/>
</form>
</body>
</html>
ของคุณ struts.xml ควรมีลักษณะดังนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
ตอนนี้คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -
ป้อนค่า "Struts2" และส่งเพจ คุณควรเห็นหน้าต่อไปนี้ -
ดังที่แสดงในตัวอย่างข้างต้นตัวสกัดกั้นข้อยกเว้นเริ่มต้นทำงานได้อย่างยอดเยี่ยมในการจัดการข้อยกเว้น
ให้เราสร้างหน้าข้อผิดพลาดเฉพาะสำหรับข้อยกเว้นของเรา สร้างไฟล์ชื่อError.jsp โดยมีเนื้อหาดังต่อไปนี้ -
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
</head>
<body>
This is my custom error page
</body>
</html>
ตอนนี้ให้เรากำหนดค่า Struts เพื่อใช้หน้าข้อผิดพลาดนี้ในกรณีที่มีข้อยกเว้น ให้เราแก้ไขไฟล์struts.xml ดังต่อไปนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<exception-mapping exception = "java.lang.NullPointerException"
result = "error" />
<result name = "success">/HelloWorld.jsp</result>
<result name = "error">/Error.jsp</result>
</action>
</package>
</struts>
ดังที่แสดงในตัวอย่างด้านบนตอนนี้เราได้กำหนดค่า Struts เพื่อใช้ Error.jsp เฉพาะสำหรับ NullPointerException หากคุณรันโปรแกรมอีกครั้งตอนนี้คุณจะเห็นผลลัพธ์ต่อไปนี้ -
นอกจากนี้เฟรมเวิร์ก Struts2 ยังมาพร้อมกับตัวสกัดกั้น "การบันทึก" เพื่อบันทึกข้อยกเว้น ด้วยการเปิดใช้งานคนตัดไม้เพื่อบันทึกข้อยกเว้นที่ไม่ถูกจับเราสามารถดูการติดตามสแต็กและค้นหาสิ่งที่ผิดพลาดได้อย่างง่ายดาย
การแมปข้อยกเว้นส่วนกลาง
เราได้เห็นว่าเราสามารถจัดการกับข้อยกเว้นเฉพาะการดำเนินการได้อย่างไร เราสามารถกำหนดข้อยกเว้นได้ทั่วโลกซึ่งจะใช้กับการกระทำทั้งหมด ตัวอย่างเช่นหากต้องการตรวจจับข้อยกเว้น NullPointerException เดียวกันเราสามารถเพิ่ม<global-exception-mappings...> แท็กภายในแท็ก <package ... > และแท็ก <result ... > ควรจะถูกเพิ่มภายในแท็ก <action ... > ในไฟล์ struts.xml ดังนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<global-exception-mappings>
<exception-mapping exception = "java.lang.NullPointerException"
result = "error" />
</global-exception-mappings>
<action name = "hello"
class = "com.tutorialspoint.struts2.HelloWorldAction"
method = "execute">
<result name = "success">/HelloWorld.jsp</result>
<result name = "error">/Error.jsp</result>
</action>
</package>
</struts>
ดังที่ได้กล่าวไว้ก่อนหน้านี้ Struts มีการกำหนดค่าสองรูปแบบ วิธีดั้งเดิมคือการใช้ไฟล์struts.xmlไฟล์สำหรับการกำหนดค่าทั้งหมด เราได้เห็นตัวอย่างมากมายในบทแนะนำนี้แล้ว อีกวิธีหนึ่งในการกำหนดค่า Struts คือการใช้คุณลักษณะ Java 5 Annotations เราสามารถใช้คำอธิบายประกอบแบบ struts ได้Zero Configuration.
ในการเริ่มใช้คำอธิบายประกอบในโปรเจ็กต์ของคุณตรวจสอบให้แน่ใจว่าคุณได้รวมไฟล์ jar ต่อไปนี้ไว้ในไฟล์ WebContent/WEB-INF/lib โฟลเดอร์ -
- struts2-convention-plugin-x.y.z.jar
- asm-x.y.jar
- antlr-x.y.z.jar
- commons-fileupload-x.y.z.jar
- commons-io-x.y.z.jar
- commons-lang-x.y.jar
- commons-logging-x.y.z.jar
- commons-logging-api-x.y.jar
- freemarker-x.y.z.jar
- javassist-.xy.z.GA
- ognl-x.y.z.jar
- struts2-core-x.y.z.jar
- xwork-core.x.y.z.jar
ตอนนี้ให้เราดูว่าคุณจะทำอย่างไรกับการกำหนดค่าที่มีอยู่ในไฟล์ struts.xml ไฟล์และแทนที่ด้วยคำอธิบายประกอบ
เพื่ออธิบายแนวคิดของ Annotation ใน Struts2 เราจะต้องพิจารณาตัวอย่างการตรวจสอบความถูกต้องของเราอีกครั้งซึ่งอธิบายไว้ในบทการตรวจสอบ Struts2
ในที่นี้เราจะยกตัวอย่างพนักงานที่มีชื่ออายุจะถูกบันทึกโดยใช้หน้าเว็บง่ายๆและเราจะทำการตรวจสอบความถูกต้องสองครั้งเพื่อให้แน่ใจว่าÜSERป้อนชื่อและอายุควรอยู่ระหว่าง 28 ถึง 65 เสมอ
เริ่มต้นด้วยหน้า JSP หลักของตัวอย่าง
สร้างหน้าหลัก
ให้เราเขียนไฟล์ JSP หน้าหลัก index.jspซึ่งใช้ในการรวบรวมข้อมูลที่เกี่ยวข้องกับพนักงานดังกล่าวข้างต้น
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Employee Form</title>
</head>
<body>
<s:form action = "empinfo" method = "post">
<s:textfield name = "name" label = "Name" size = "20" />
<s:textfield name = "age" label = "Age" size = "20" />
<s:submit name = "submit" label = "Submit" align="center" />
</s:form>
</body>
</html>
index.jsp ใช้ประโยชน์จากแท็ก Struts ซึ่งเรายังไม่ได้กล่าวถึง แต่เราจะศึกษาในบทที่เกี่ยวข้องกับแท็ก แต่ตอนนี้สมมติว่าแท็ก s: textfield พิมพ์ช่องป้อนข้อมูลและปุ่ม s: submit จะพิมพ์ปุ่มส่ง เราใช้คุณสมบัติป้ายกำกับสำหรับแต่ละแท็กซึ่งสร้างป้ายกำกับสำหรับแต่ละแท็ก
สร้างมุมมอง
เราจะใช้ไฟล์ JSP success.jsp ซึ่งจะถูกเรียกใช้ในกรณีที่การกระทำที่กำหนดส่งคืน SUCCESS.
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Success</title>
</head>
<body>
Employee Information is captured successfully.
</body>
</html>
สร้างการดำเนินการ
นี่คือสถานที่ที่ใช้คำอธิบายประกอบ ให้เรากำหนดคลาสการกระทำใหม่Employee ด้วยคำอธิบายประกอบจากนั้นเพิ่มวิธีการที่เรียกว่า validate () ดังแสดงด้านล่างใน Employee.javaไฟล์. ตรวจสอบให้แน่ใจว่าคลาสการกระทำของคุณขยายไฟล์ActionSupport class มิฉะนั้นวิธีการตรวจสอบของคุณจะไม่ถูกเรียกใช้งาน
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.validator.annotations.*;
@Results({
@Result(name = "success", Location = "/success.jsp"),
@Result(name = "input", Location = "/index.jsp")
})
public class Employee extends ActionSupport {
private String name;
private int age;
@Action(value = "/empinfo")
public String execute() {
return SUCCESS;
}
@RequiredFieldValidator( message = "The name is required" )
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@IntRangeFieldValidator(message = "Age must be in between 28 and 65", min = "29", max = "65")
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
เราได้ใช้คำอธิบายประกอบเล็กน้อยในตัวอย่างนี้ ให้ฉันผ่านมันทีละคน -
ขั้นแรกเราได้รวมไฟล์ Resultsคำอธิบายประกอบ คำอธิบายประกอบผลลัพธ์คือชุดของผลลัพธ์
ภายใต้คำอธิบายประกอบผลลัพธ์เรามีคำอธิบายประกอบผลลัพธ์สองรายการ คำอธิบายประกอบผลลัพธ์มีนามสกุลnameที่สอดคล้องกับผลลัพธ์ของวิธีการดำเนินการ นอกจากนี้ยังมีตำแหน่งที่ควรให้บริการมุมมองที่สอดคล้องกับค่าที่ส่งคืนจาก execute ()
คำอธิบายประกอบถัดไปคือ Actionคำอธิบายประกอบ สิ่งนี้ใช้เพื่อตกแต่งเมธอด execute () นอกจากนี้วิธีการดำเนินการยังใช้ค่าซึ่งเป็น URL ที่เรียกใช้การดำเนินการ
ในที่สุดฉันก็ได้ใช้สองตัว validationคำอธิบายประกอบ ฉันได้กำหนดค่าตัวตรวจสอบฟิลด์ที่จำเป็นบนname ฟิลด์และตัวตรวจสอบช่วงจำนวนเต็มบน ageฟิลด์ ฉันยังได้ระบุข้อความที่กำหนดเองสำหรับการตรวจสอบความถูกต้อง
ไฟล์การกำหนดค่า
เราไม่ต้องการจริงๆ struts.xml ไฟล์กำหนดค่าดังนั้นให้เราลบไฟล์นี้และให้เราตรวจสอบเนื้อหาของ web.xml ไฟล์ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
<init-param>
<param-name>struts.devMode</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
ตอนนี้คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/index.jsp. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -
ตอนนี้ไม่ต้องป้อนข้อมูลที่จำเป็นใด ๆ เพียงคลิกที่ Submitปุ่ม. คุณจะเห็นผลลัพธ์ต่อไปนี้ -
ป้อนข้อมูลที่จำเป็น แต่ป้อนช่องจากผิดให้เราพูดชื่อ "ทดสอบ" และอายุเป็น 30 ปีและสุดท้ายคลิกที่ Submitปุ่ม. คุณจะเห็นผลลัพธ์ต่อไปนี้ -
Struts 2 ประเภทคำอธิบายประกอบ
แอ็พพลิเคชัน Struts 2 สามารถใช้คำอธิบายประกอบ Java 5 เป็นทางเลือกสำหรับการกำหนดค่าคุณสมบัติ XML และ Java คุณสามารถตรวจสอบรายการคำอธิบายประกอบที่สำคัญที่สุดที่เกี่ยวข้องกับหมวดหมู่ต่างๆ -
Struts 2 ประเภทคำอธิบายประกอบ
แท็ก Struts 2 มีชุดแท็กที่ทำให้ง่ายต่อการควบคุมขั้นตอนการเรียกใช้เพจ
ต่อไปนี้เป็นรายการแท็กควบคุม Struts 2 ที่สำคัญ -
แท็ก If และอื่น ๆ
แท็กเหล่านี้ดำเนินการตามเงื่อนไขพื้นฐานที่พบในทุกภาษา
'If' แท็กถูกใช้โดยตัวมันเองหรือด้วย 'Else If' แท็กและ / หรือเดี่ยว / หลาย 'Else' Tag ตามรูปด้านล่าง -
<s:if test = "%{false}">
<div>Will Not Be Executed</div>
</s:if>
<s:elseif test = "%{true}">
<div>Will Be Executed</div>
</s:elseif>
<s:else>
<div>Will Not Be Executed</div>
</s:else>
ตรวจสอบตัวอย่างโดยละเอียด
แท็ก Iterator
นี้ iteratorจะวนซ้ำค่า ค่าที่ทำซ้ำได้อาจเป็นไฟล์ itherjava.util.Collection หรือ java.util.Iterator ในขณะที่ทำซ้ำบนตัววนซ้ำคุณสามารถใช้ไฟล์Sort แท็กเพื่อจัดเรียงผลลัพธ์หรือ SubSet แท็กเพื่อรับชุดย่อยของรายการหรืออาร์เรย์
ตัวอย่างต่อไปนี้ดึงค่าของเมธอด getDays () ของอ็อบเจ็กต์ปัจจุบันบนสแต็กค่าและใช้เพื่อทำซ้ำ
แท็ก <s: property /> พิมพ์ค่าปัจจุบันของ iterator
<s:iterator value = "days">
<p>day is: <s:property/></p>
</s:iterator>
ตรวจสอบตัวอย่างโดยละเอียด
แท็กผสาน
เหล่านี้ merge แท็กใช้สองรายการขึ้นไปเป็นพารามิเตอร์และรวมเข้าด้วยกันตามที่แสดงด้านล่าง -
<s:merge var = "myMergedIterator">
<s:param value = "%{myList1}" />
<s:param value = "%{myList2}" />
<s:param value = "%{myList3}" />
</s:merge>
<s:iterator value = "%{#myMergedIterator}">
<s:property />
</s:iterator>
ตรวจสอบตัวอย่างโดยละเอียด
แท็กต่อท้าย
เหล่านี้ append แท็กใช้สองรายการขึ้นไปเป็นพารามิเตอร์และผนวกเข้าด้วยกันตามที่แสดงด้านล่าง -
<s:append var = "myAppendIterator">
<s:param value = "%{myList1}" />
<s:param value = "%{myList2}" />
<s:param value = "%{myList3}" />
</s:append>
<s:iterator value = "%{#myAppendIterator}">
<s:property />
</s:iterator>
ตรวจสอบตัวอย่างโดยละเอียด
แท็ก Generator
เหล่านี้ generatorแท็กสร้างตัววนซ้ำตามแอตทริบิวต์ val ที่ให้มา แท็กตัวสร้างต่อไปนี้สร้างตัววนซ้ำและพิมพ์ออกมาโดยใช้แท็กตัววนซ้ำ
<s:generator val = "%{'aaa,bbb,ccc,ddd,eee'}">
<s:iterator>
<s:property /><br/>
</s:iterator>
</s:generator>
ตรวจสอบตัวอย่างโดยละเอียด
The Struts 2 data tagsส่วนใหญ่จะใช้เพื่อจัดการกับข้อมูลที่แสดงบนเพจ ด้านล่างนี้เป็นแท็กข้อมูลที่สำคัญ: <เริ่มที่นี่>
แท็กการดำเนินการ
แท็กนี้ช่วยให้นักพัฒนาสามารถเรียกการดำเนินการได้โดยตรงจากเพจ JSP โดยระบุชื่อการดำเนินการและเนมสเปซที่เป็นทางเลือก เนื้อหาของแท็กใช้เพื่อแสดงผลลัพธ์จากการดำเนินการ ตัวประมวลผลผลลัพธ์ที่กำหนดไว้สำหรับการดำเนินการนี้ใน struts.xml จะถูกละเว้นเว้นแต่จะระบุพารามิเตอร์ executeResult
<div>Tag to execute the action</div>
<br />
<s:action name = "actionTagAction" executeresult = "true" />
<br />
<div>To invokes special method in action class</div>
<br />
<s:action name = "actionTagAction!specialMethod" executeresult = "true" />
ตรวจสอบตัวอย่างโดยละเอียด
แท็กรวม
เหล่านี้ include จะถูกใช้เพื่อรวมไฟล์ JSP ในเพจ JSP อื่น
<-- First Syntax -->
<s:include value = "myJsp.jsp" />
<-- Second Syntax -->
<s:include value = "myJsp.jsp">
<s:param name = "param1" value = "value2" />
<s:param name = "param2" value = "value2" />
</s:include>
<-- Third Syntax -->
<s:include value = "myJsp.jsp">
<s:param name = "param1">value1</s:param>
<s:param name = "param2">value2</s:param>
</s:include>
ตรวจสอบตัวอย่างโดยละเอียด
แท็กถั่ว
เหล่านี้ beanแท็กอินสแตนซ์คลาสที่สอดคล้องกับข้อกำหนด JavaBeans แท็กนี้มีเนื้อความซึ่งสามารถมีองค์ประกอบ Param จำนวนหนึ่งเพื่อตั้งค่าวิธีการกลายพันธุ์ในคลาสนั้น หากแอตทริบิวต์ var ถูกตั้งค่าบน BeanTag จะวางอินสแตนซ์ bean ไว้ในบริบทของสแตก
<s:bean name = "org.apache.struts2.util.Counter" var = "counter">
<s:param name = "first" value = "20"/>
<s:param name = "last" value = "25" />
</s:bean>
ตรวจสอบตัวอย่างโดยละเอียด
แท็กวันที่
เหล่านี้ dateแท็กจะช่วยให้คุณสามารถจัดรูปแบบวันที่ได้อย่างรวดเร็วและง่ายดาย คุณสามารถระบุรูปแบบที่กำหนดเอง (เช่น "dd / MM / yyyy hh: mm") คุณสามารถสร้างสัญกรณ์ที่อ่านง่าย (เช่น "ใน 2 ชั่วโมง 14 นาที") หรือคุณสามารถถอยกลับไปใช้รูปแบบที่กำหนดไว้ล่วงหน้าด้วย คีย์ 'struts.date.format' ในไฟล์คุณสมบัติของคุณ
<s:date name = "person.birthday" format = "dd/MM/yyyy" />
<s:date name = "person.birthday" format = "%{getText('some.i18n.key')}" />
<s:date name = "person.birthday" nice="true" />
<s:date name = "person.birthday" />
ตรวจสอบตัวอย่างโดยละเอียด
แท็ก Param
เหล่านี้ paramสามารถใช้แท็กเพื่อกำหนดพารามิเตอร์แท็กอื่น ๆ แท็กนี้มีพารามิเตอร์สองตัวต่อไปนี้
ชื่อ (สตริง) - ชื่อของพารามิเตอร์
value (Object) - ค่าของพารามิเตอร์
<pre>
<ui:component>
<ui:param name = "key" value = "[0]"/>
<ui:param name = "value" value = "[1]"/>
<ui:param name = "context" value = "[2]"/>
</ui:component>
</pre>
ตรวจสอบตัวอย่างโดยละเอียด
แท็กคุณสมบัติ
เหล่านี้ property แท็กใช้เพื่อรับคุณสมบัติของค่าซึ่งค่าเริ่มต้นจะอยู่ด้านบนสุดของสแต็กหากไม่มีการระบุ
<s:push value = "myBean">
<!-- Example 1: -->
<s:property value = "myBeanProperty" />
<!-- Example 2: -->TextUtils
<s:property value = "myBeanProperty" default = "a default value" />
</s:push>
ตรวจสอบตัวอย่างโดยละเอียด
แท็ก Push
เหล่านี้ push แท็กใช้เพื่อพุชค่าบนสแต็กเพื่อการใช้งานที่ง่ายขึ้น
<s:push value = "user">
<s:propery value = "firstName" />
<s:propery value = "lastName" />
</s:push>
ตรวจสอบตัวอย่างโดยละเอียด
แท็กชุด
เหล่านี้ setแท็กกำหนดค่าให้กับตัวแปรในขอบเขตที่ระบุ จะมีประโยชน์เมื่อคุณต้องการกำหนดตัวแปรให้กับนิพจน์ที่ซับซ้อนจากนั้นเพียงแค่อ้างอิงตัวแปรนั้นในแต่ละครั้งแทนที่จะเป็นนิพจน์ที่ซับซ้อน ขอบเขตที่มีอยู่คือapplication, session, request, page และ action.
<s:set name = "myenv" value = "environment.name"/>
<s:property value = "myenv"/>
ตรวจสอบตัวอย่างโดยละเอียด
แท็กข้อความ
เหล่านี้ text แท็กใช้เพื่อแสดงข้อความ I18n
<!-- First Example -->
<s:i18n name = "struts.action.test.i18n.Shop">
<s:text name = "main.title"/>
</s:i18n>
<!-- Second Example -->
<s:text name = "main.title" />
<!-- Third Examlpe -->
<s:text name = "i18n.label.greetings">
<s:param >Mr Smith</s:param>
</s:text>
ตรวจสอบตัวอย่างโดยละเอียด
แท็ก URL
เหล่านี้ url ใช้แท็กเพื่อสร้าง URL
<-- Example 1 -->
<s:url value = "editGadget.action">
<s:param name = "id" value = "%{selected}" />
</s:url>
<-- Example 2 -->
<s:url action = "editGadget">
<s:param name = "id" value = "%{selected}" />
</s:url>
<-- Example 3-->
<s:url includeParams="get">
<s:param name = "id" value = "%{'22'}" />
</s:url>
ตรวจสอบตัวอย่างโดยละเอียด
รายการของ formแท็กเป็นส่วนย่อยของแท็ก Struts UI แท็กเหล่านี้ช่วยในการแสดงผลอินเทอร์เฟซผู้ใช้ที่จำเป็นสำหรับเว็บแอปพลิเคชัน Struts และสามารถแบ่งออกเป็นสามประเภท บทนี้จะนำคุณไปสู่แท็ก UI ทั้งสามประเภท -
แท็ก UI แบบง่าย
เราได้ใช้แท็กเหล่านี้ในตัวอย่างของเราแล้วเราจะปัดมันในบทนี้ ให้เราดูหน้ามุมมองที่เรียบง่ายemail.jsp ด้วยแท็ก UI ที่เรียบง่ายหลายรายการ -
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<s:head/>
<title>Hello World</title>
</head>
<body>
<s:div>Email Form</s:div>
<s:text name = "Please fill in the form below:" />
<s:form action = "hello" method = "post" enctype = "multipart/form-data">
<s:hidden name = "secret" value = "abracadabra"/>
<s:textfield key = "email.from" name = "from" />
<s:password key = "email.password" name = "password" />
<s:textfield key = "email.to" name = "to" />
<s:textfield key = "email.subject" name = "subject" />
<s:textarea key = "email.body" name = "email.body" />
<s:label for = "attachment" value = "Attachment"/>
<s:file name = "attachment" accept = "text/html,text/plain" />
<s:token />
<s:submit key = "submit" />
</s:form>
</body>
</html>
หากคุณรู้จัก HTML แท็กทั้งหมดที่ใช้เป็นแท็ก HTML ทั่วไปที่มีคำนำหน้าเพิ่มเติม s:พร้อมกับแต่ละแท็กและแอตทริบิวต์ที่แตกต่างกัน เมื่อเราดำเนินการโปรแกรมข้างต้นเราจะได้รับอินเทอร์เฟซผู้ใช้ต่อไปนี้หากคุณตั้งค่าการแมปที่เหมาะสมสำหรับคีย์ทั้งหมดที่ใช้
ดังที่แสดงไว้หัว s: สร้างองค์ประกอบจาวาสคริปต์และสไตล์ชีทที่จำเป็นสำหรับแอ็พพลิเคชัน Struts2
ต่อไปเรามีองค์ประกอบข้อความ s: div และ s: s: div ใช้ในการแสดงผลองค์ประกอบ HTML Div สิ่งนี้มีประโยชน์สำหรับผู้ที่ไม่ต้องการผสมแท็ก HTML และ Struts เข้าด้วยกัน สำหรับคนเหล่านั้นพวกเขามีทางเลือกที่จะใช้ s: div เพื่อแสดงผล div
ข้อความ s: ตามที่แสดงใช้เพื่อแสดงข้อความบนหน้าจอ
ต่อไปเรามีแท็ก famiilar s: form แท็ก s: form มีแอ็ตทริบิวต์ action ที่กำหนดตำแหน่งที่จะส่งแบบฟอร์ม เนื่องจากเรามีองค์ประกอบอัพโหลดไฟล์ในรูปแบบเราจึงต้องตั้งค่า enctype เป็นหลายส่วน มิฉะนั้นเราสามารถเว้นว่างไว้ได้
ในตอนท้ายของแท็กฟอร์มเรามีแท็ก s: submit ใช้ในการส่งแบบฟอร์ม เมื่อส่งแบบฟอร์มค่าฟอร์มทั้งหมดจะถูกส่งไปยังการดำเนินการที่ระบุในแท็ก s: form
ภายในฟอร์ม s: เรามีแอตทริบิวต์ซ่อนอยู่ที่เรียกว่า secret สิ่งนี้แสดงผลองค์ประกอบที่ซ่อนอยู่ใน HTML ในกรณีของเราองค์ประกอบ "ความลับ" มีค่า "abracadabra" ผู้ใช้ปลายทางมองไม่เห็นองค์ประกอบนี้และใช้เพื่อนำสถานะจากมุมมองหนึ่งไปยังอีกมุมมองหนึ่ง
ต่อไปเรามีแท็ก s: label, s: textfield, s: password และ s: textarea สิ่งเหล่านี้ใช้ในการแสดงฉลากช่องป้อนรหัสผ่านและพื้นที่ข้อความตามลำดับ เราได้เห็นสิ่งเหล่านี้ในการใช้งานจริงในตัวอย่าง "Struts - การส่งอีเมล"
สิ่งสำคัญที่ควรทราบคือการใช้แอตทริบิวต์ "คีย์" แอตทริบิวต์ "key" ใช้เพื่อดึงป้ายกำกับสำหรับการควบคุมเหล่านี้จากไฟล์คุณสมบัติ เราได้กล่าวถึงคุณลักษณะนี้แล้วใน Struts2 Localization บทสากล
จากนั้นเรามีแท็ก s: file ซึ่งแสดงส่วนประกอบการอัปโหลดไฟล์อินพุต ส่วนประกอบนี้อนุญาตให้ผู้ใช้อัปโหลดไฟล์ ในตัวอย่างนี้เราได้ใช้พารามิเตอร์ "ยอมรับ" ของแท็ก s: file เพื่อระบุประเภทไฟล์ที่อนุญาตให้อัปโหลดได้
ในที่สุดเราก็มีแท็ก s: token แท็กโทเค็นสร้างโทเค็นที่ไม่ซ้ำกันซึ่งใช้เพื่อค้นหาว่ามีการส่งแบบฟอร์มสองครั้งหรือไม่
เมื่อแสดงผลแบบฟอร์มตัวแปรที่ซ่อนอยู่จะถูกวางเป็นค่าโทเค็น ตัวอย่างเช่นสมมติว่าโทเค็นคือ "ABC" เมื่อส่งแบบฟอร์มนี้ Struts Fitler จะตรวจสอบโทเค็นเทียบกับโทเค็นที่เก็บไว้ในเซสชัน หากตรงกันระบบจะลบโทเค็นออกจากเซสชัน ตอนนี้หากมีการส่งแบบฟอร์มอีกครั้งโดยไม่ได้ตั้งใจ (ไม่ว่าจะโดยการรีเฟรชหรือกดปุ่มย้อนกลับของเบราว์เซอร์) แบบฟอร์มจะถูกส่งอีกครั้งโดยมี "ABC" เป็นโทเค็น ในกรณีนี้ตัวกรองจะตรวจสอบโทเค็นเทียบกับโทเค็นที่เก็บไว้ในเซสชันอีกครั้ง แต่เนื่องจากโทเค็น "ABC" ถูกลบออกจากเซสชันจึงไม่ตรงกันและตัวกรอง Struts จะปฏิเสธคำขอ
แท็ก UI ของกลุ่ม
แท็ก UI ของกลุ่มใช้เพื่อสร้างปุ่มตัวเลือกและช่องทำเครื่องหมาย ให้เราดูหน้ามุมมองที่เรียบง่ายHelloWorld.jsp พร้อมกล่องกาเครื่องหมายและแท็กปุ่มตัวเลือก -
<%@ page contentType = "text/html; charset = UTF-8"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<html>
<head>
<title>Hello World</title>
<s:head />
</head>
<body>
<s:form action = "hello.action">
<s:radio label = "Gender" name = "gender" list="{'male','female'}" />
<s:checkboxlist label = "Hobbies" name = "hobbies"
list = "{'sports','tv','shopping'}" />
</s:form>
</body>
</html>
เมื่อเรารันโปรแกรมข้างต้นผลลัพธ์ของเราจะมีลักษณะคล้ายกับสิ่งต่อไปนี้ -
ให้เราดูตัวอย่างตอนนี้ ในตัวอย่างแรกเรากำลังสร้างปุ่มตัวเลือกง่ายๆที่มีป้ายกำกับ "Gender" แอตทริบิวต์ชื่อเป็นสิ่งจำเป็นสำหรับแท็กปุ่มตัวเลือกดังนั้นเราจึงระบุชื่อซึ่งเป็น "เพศ" จากนั้นเราจะจัดหารายชื่อให้กับเพศ รายการนี้มีค่า "ชาย" และ "หญิง" ดังนั้นในเอาต์พุตเราจะได้รับปุ่มตัวเลือกที่มีค่าสองค่า
ในตัวอย่างที่สองเรากำลังสร้างรายการช่องทำเครื่องหมาย นี่คือการรวบรวมงานอดิเรกของผู้ใช้ ผู้ใช้สามารถมีงานอดิเรกได้มากกว่าหนึ่งงานดังนั้นเราจึงใช้ช่องทำเครื่องหมายแทนปุ่มเรดิโอ ช่องทำเครื่องหมายจะมีรายการ "กีฬา" "ทีวี" และ "ช็อปปิ้ง" นี่แสดงงานอดิเรกเป็นรายการช่องทำเครื่องหมาย
เลือกแท็ก UI
ให้เราสำรวจรูปแบบต่างๆของ Select Tag ที่ Struts นำเสนอ ให้เราดูหน้ามุมมองที่เรียบง่ายHelloWorld.jsp ด้วยแท็กที่เลือก -
<%@ page contentType = "text/html; charset = UTF-8"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<html>
<head>
<title>Hello World</title>
<s:head />
</head>
<body>
<s:form action = "login.action">
<s:select name = "username" label = "Username"
list = "{'Mike','John','Smith'}" />
<s:select label = "Company Office" name = "mySelection"
value = "%{'America'}" list="%{#{'America':'America'}}">
<s:optgroup label = "Asia"
list = "%{#{'India':'India','China':'China'}}" />
<s:optgroup label = "Europe"
list="%{#{'UK':'UK','Sweden':'Sweden','Italy':'Italy'}}" />
</s:select>
<s:combobox label = "My Sign" name = "mySign"
list = "#{'aries':'aries','capricorn':'capricorn'}" headerkey = "-1"
headervalue = "--- Please Select ---" emptyOption = "true" value = "capricorn" />
<s:doubleselect label = "Occupation" name = "occupation"
list = "{'Technical','Other'}" doublename = "occupations2"
doubleList="top == 'Technical' ?
{'I.T', 'Hardware'} : {'Accounting', 'H.R'}" />
</s:form>
</body>
</html>
เมื่อเรารันโปรแกรมด้านบนผลลัพธ์ของเราจะมีลักษณะคล้ายกับสิ่งต่อไปนี้ -
ให้เราพิจารณาแต่ละกรณีไปทีละกรณี
ขั้นแรกแท็ก select จะแสดงผลกล่องเลือก HTML ในตัวอย่างแรกเรากำลังสร้างช่องเลือกง่ายๆที่มีชื่อ "ชื่อผู้ใช้" และป้ายกำกับ "ชื่อผู้ใช้" กล่องเลือกจะมีรายการที่มีชื่อไมค์จอห์นและสมิ ธ
ในตัวอย่างที่สอง บริษัท ของเรามีสำนักงานใหญ่ในอเมริกา นอกจากนี้ยังมีสำนักงานทั่วโลกในเอเชียและยุโรป เราต้องการแสดงสำนักงานในช่องเลือก แต่ต้องการจัดกลุ่มสำนักงานทั่วโลกตามชื่อของทวีป นี่คือจุดที่กลุ่ม optg มีประโยชน์ เราใช้แท็ก s: optgroup เพื่อสร้างกลุ่มใหม่ เราให้ป้ายกำกับกลุ่มและรายการแยกต่างหาก
ในตัวอย่างที่สามจะใช้คอมโบบ็อกซ์ กล่องคำสั่งผสมคือการรวมกันของช่องป้อนข้อมูลและกล่องเลือก ผู้ใช้สามารถเลือกค่าจากกล่องเลือกซึ่งในกรณีนี้ช่องป้อนข้อมูลจะถูกกรอกโดยอัตโนมัติด้วยค่าที่ผู้ใช้เลือก หากผู้ใช้ป้อนค่าโดยตรงจะไม่มีการเลือกค่าจากกล่องเลือก
ในตัวอย่างของเราเรามีกล่องคอมโบที่แสดงสัญลักษณ์ดวงอาทิตย์ กล่องเลือกจะแสดงรายการสี่รายการเท่านั้นที่อนุญาตให้ผู้ใช้พิมพ์สัญลักษณ์ดวงอาทิตย์ของเขาหากไม่มีอยู่ในรายการ นอกจากนี้เรายังเพิ่มรายการส่วนหัวในกล่องเลือก ส่วนหัวคือส่วนที่แสดงที่ด้านบนสุดของกล่องเลือก ในกรณีของเราเราต้องการแสดง "Please Select" หากผู้ใช้ไม่ได้เลือกอะไรเลยเราจะถือว่า -1 เป็นค่า ในบางกรณีเราไม่ต้องการให้ผู้ใช้เลือกค่าว่าง ในเงื่อนไขเหล่านั้นเราจะตั้งค่าคุณสมบัติ "emptyOption" เป็นเท็จ สุดท้ายในตัวอย่างของเราเราระบุ "capricorn" เป็นค่าเริ่มต้นสำหรับ combobox
ในตัวอย่างที่สี่เรามีการเลือกสองครั้ง การเลือกสองครั้งจะใช้เมื่อคุณต้องการแสดงกล่องเลือกสองกล่อง ค่าที่เลือกในกล่องเลือกแรกจะกำหนดสิ่งที่ปรากฏในกล่องเลือกที่สอง ในตัวอย่างของเราช่องเลือกแรกจะแสดง "เทคนิค" และ "อื่น ๆ " หากผู้ใช้เลือกทางเทคนิคเราจะแสดง IT และฮาร์ดแวร์ในช่องเลือกที่สอง มิฉะนั้นเราจะแสดง Accounting and HR ซึ่งเป็นไปได้โดยใช้ atrributes "list" และ "doubleList" ดังที่แสดงในตัวอย่าง
ในตัวอย่างข้างต้นเราทำการเปรียบเทียบเพื่อดูว่าช่องเลือกบนสุดเท่ากับทางเทคนิคหรือไม่ ถ้าเป็นเช่นนั้นเราจะแสดง IT และฮาร์ดแวร์
เราต้องตั้งชื่อสำหรับช่องด้านบนด้วย ("name = 'Occupations') และช่องด้านล่าง (doubleName = 'Occupations2')
Struts ใช้กรอบงาน DOJO สำหรับการติดตั้งแท็ก AJAX ก่อนอื่นในการดำเนินการกับตัวอย่างนี้คุณต้องเพิ่ม struts2-dojo-plugin-2.2.3.jar ใน classpath ของคุณ
คุณสามารถรับไฟล์นี้ได้จากโฟลเดอร์ lib ของการดาวน์โหลด struts2 ของคุณ (C: \ struts-2.2.3all \ struts-2.2.3 \ lib \ struts2-dojo-plugin-2.2.3.jar)
สำหรับแบบฝึกหัดนี้ให้เราแก้ไข HelloWorld.jsp ดังต่อไปนี้ -
<%@ page contentType = "text/html; charset = UTF-8"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<%@ taglib prefix = "sx" uri = "/struts-dojo-tags"%>
<html>
<head>
<title>Hello World</title>
<s:head />
<sx:head />
</head>
<body>
<s:form>
<sx:autocompleter label = "Favourite Colour"
list = "{'red','green','blue'}" />
<br />
<sx:datetimepicker name = "deliverydate" label = "Delivery Date"
displayformat = "dd/MM/yyyy" />
<br />
<s:url id = "url" value = "/hello.action" />
<sx:div href="%{#url}" delay="2000">
Initial Content
</sx:div>
<br/>
<sx:tabbedpanel id = "tabContainer">
<sx:div label = "Tab 1">Tab 1</sx:div>
<sx:div label = "Tab 2">Tab 2</sx:div>
</sx:tabbedpanel>
</s:form>
</body>
</html>
เมื่อเราเรียกใช้ตัวอย่างข้างต้นเราจะได้ผลลัพธ์ดังต่อไปนี้ -
ตอนนี้ให้เราทำตามตัวอย่างนี้ทีละขั้นตอน
สิ่งแรกที่ต้องสังเกตคือการเพิ่มไลบรารีแท็กใหม่ที่มีคำนำหน้า sx (struts-dojo-tags) นี้เป็นไลบรารีแท็กที่สร้างขึ้นโดยเฉพาะสำหรับการรวม ajax
จากนั้นภายในส่วนหัว HTML เราเรียกว่า sx: head สิ่งนี้จะเริ่มต้นกรอบงาน dojo และทำให้พร้อมสำหรับการเรียกใช้ AJAX ทั้งหมดภายในเพจ ขั้นตอนนี้สำคัญ - การโทร ajax ของคุณจะไม่ทำงานหากไม่มีการเริ่มต้น sx: head
อันดับแรกเรามีแท็กเติมข้อความอัตโนมัติ แท็กเติมข้อความอัตโนมัติดูเหมือนกับกล่องเลือก มีค่าเป็นสีแดงเขียวและน้ำเงิน แต่สิ่งที่แตกต่างกันระหว่างกล่องเลือกและกล่องนี้คือการกรอกข้อมูลอัตโนมัติ นั่นคือถ้าคุณเริ่มพิมพ์ใน gr มันจะเติมด้วย "สีเขียว" นอกเหนือจากนั้นแท็กนี้ยังคล้ายกับแท็ก s: select ที่เรากล่าวถึงก่อนหน้านี้มาก
ต่อไปเรามีตัวเลือกวันเวลา แท็กนี้สร้างช่องป้อนข้อมูลโดยมีปุ่มอยู่ข้างๆ เมื่อกดปุ่มตัวเลือกวันที่เวลาแบบป๊อปอัปจะปรากฏขึ้น เมื่อผู้ใช้เลือกวันที่วันที่จะถูกกรอกลงในข้อความที่ป้อนในรูปแบบที่ระบุไว้ในแอตทริบิวต์แท็ก ในตัวอย่างของเราเราได้ระบุ dd / MM / yyyy เป็นรูปแบบสำหรับวันที่
ต่อไปเราจะสร้างแท็ก url ไปยังไฟล์ system.action ซึ่งเราสร้างขึ้นในแบบฝึกหัดก่อนหน้านี้ ไม่จำเป็นต้องเป็น system.action - อาจเป็นไฟล์การดำเนินการใด ๆ ที่คุณสร้างไว้ก่อนหน้านี้ จากนั้นเรามี div พร้อมไฮเปอร์ลิงก์ที่ตั้งค่าเป็น url และตั้งค่าหน่วงเวลาเป็น 2 วินาที สิ่งที่เกิดขึ้นเมื่อคุณเรียกใช้สิ่งนี้ "เนื้อหาเริ่มต้น" จะปรากฏเป็นเวลา 2 วินาทีจากนั้นเนื้อหาของ div จะถูกแทนที่ด้วยเนื้อหาจากhello.action การดำเนินการ
ในที่สุดเราก็มีแผงแท็บง่ายๆที่มีสองแท็บ แท็บเหล่านี้เป็น divs ซึ่งมีป้ายกำกับ Tab 1 และ Tab2
เป็นที่น่าสังเกตว่าการรวมแท็ก AJAX ใน Struts ยังคงอยู่ระหว่างดำเนินการและความสมบูรณ์ของการผสานรวมนี้จะเพิ่มขึ้นอย่างช้าๆในทุก ๆ รุ่น
Spring เป็นเว็บเฟรมเวิร์กยอดนิยมที่ให้การผสานรวมที่ง่ายดายกับงานเว็บทั่วไปจำนวนมาก คำถามคือทำไมเราถึงต้องการ Spring เมื่อเรามี Struts2? Spring เป็นมากกว่าเฟรมเวิร์ก MVC - มีสินค้าอื่น ๆ อีกมากมายที่ไม่มีใน Struts
ตัวอย่างเช่นการฉีดพึ่งพาที่สามารถเป็นประโยชน์กับกรอบงานใด ๆ ในบทนี้เราจะกล่าวถึงตัวอย่างง่ายๆเพื่อดูวิธีการรวม Spring และ Struts2 เข้าด้วยกัน
ก่อนอื่นคุณต้องเพิ่มไฟล์ต่อไปนี้ในเส้นทางการสร้างของโครงการจากการติดตั้ง Spring คุณสามารถดาวน์โหลดและติดตั้ง Spring Framework เวอร์ชันล่าสุดได้จากhttps://www.springsource.org/download
- org.springframework.asm-x.y.z.M(a).jar
- org.springframework.beans-x.y.z.M(a).jar
- org.springframework.context-x.y.z.M(a).jar
- org.springframework.core-x.y.z.M(a).jar
- org.springframework.expression-x.y.z.M(a).jar
- org.springframework.web-x.y.z.M(a).jar
- org.springframework.web.servlet-x.y.z.M(a).jar
สุดท้ายเพิ่ม struts2-spring-plugin-x.y.z.jar ในไฟล์ WEB-INF/libจากไดเร็กทอรี lib ของ struts หากคุณกำลังใช้ Eclipse แล้วคุณอาจต้องเผชิญกับข้อยกเว้นjava.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
ในการแก้ไขปัญหานี้คุณควรต้องเข้าไป Markerแท็บและคลิกขวาที่การอ้างอิงคลาสทีละรายการและทำการแก้ไขด่วนเพื่อเผยแพร่ / ส่งออกการอ้างอิงทั้งหมด สุดท้ายตรวจสอบให้แน่ใจว่าไม่มีข้อขัดแย้งในการพึ่งพาอยู่ใต้แท็บเครื่องหมาย
ตอนนี้ให้เราตั้งค่าไฟล์ web.xml สำหรับการรวม Struts-Spring ดังต่อไปนี้ -
<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id = "WebApp_ID" version = "3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
สิ่งสำคัญที่ควรทราบคือ Listener ที่เรากำหนดค่าไว้ ContextLoaderListenerจำเป็นต้องโหลดไฟล์บริบทสปริง ไฟล์กำหนดค่าของ Spring เรียกว่าapplicationContext.xml ไฟล์และต้องวางไว้ที่ระดับเดียวกับไฟล์ web.xml ไฟล์
ให้เราสร้างคลาสการกระทำง่ายๆที่เรียกว่า User.java ด้วยคุณสมบัติสองอย่าง - firstName และ lastName
package com.tutorialspoint.struts2;
public class User {
private String firstName;
private String lastName;
public String execute() {
return "success";
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
ตอนนี้ให้เราสร้างไฟล์ applicationContext.xml ไฟล์การกำหนดค่า spring และสร้างอินสแตนซ์ไฟล์ User.javaชั้นเรียน. ดังที่ได้กล่าวไว้ก่อนหน้านี้ไฟล์นี้ควรอยู่ภายใต้โฟลเดอร์ WEB-INF -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id = "userClass" class = "com.tutorialspoint.struts2.User">
<property name = "firstName" value = "Michael" />
<property name = "lastName" value = "Jackson" />
</bean>
</beans>
ดังที่เห็นข้างต้นเราได้กำหนดค่าถั่วผู้ใช้และเราได้ฉีดค่า Michael และ Jacksonเข้าไปในถั่ว เรายังตั้งชื่อ bean นี้ว่า "userClass" เพื่อให้เราสามารถนำสิ่งนี้มาใช้ซ้ำที่อื่นได้ ต่อไปให้เราสร้างไฟล์User.jsp ในโฟลเดอร์ WebContent -
<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World From Struts2 - Spring integration</h1>
<s:form>
<s:textfield name = "firstName" label = "First Name"/><br/>
<s:textfield name = "lastName" label = "Last Name"/><br/>
</s:form>
</body>
</html>
User.jspไฟล์ค่อนข้างตรงไปตรงมา ทำหน้าที่เพียงจุดประสงค์เดียว - เพื่อแสดงค่าของชื่อและนามสกุลของออบเจ็กต์ผู้ใช้ สุดท้ายให้เรารวมเอนทิตีทั้งหมดเข้าด้วยกันโดยใช้struts.xml ไฟล์.
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "helloworld" extends = "struts-default">
<action name = "user" class="userClass"
method = "execute">
<result name = "success">/User.jsp</result>
</action>
</package>
</struts>
สิ่งสำคัญที่ควรทราบคือเรากำลังใช้ id userClassเพื่ออ้างถึงชั้นเรียน ซึ่งหมายความว่าเรากำลังใช้สปริงเพื่อทำการฉีดพึ่งพาสำหรับคลาส User
ตอนนี้คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/User.jsp. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -
ตอนนี้เราได้เห็นวิธีการนำสองกรอบที่ยอดเยี่ยมมารวมกันแล้ว นี่เป็นการสรุปบทการรวม Struts - Spring
ในบทนี้ให้เราทำตามขั้นตอนที่เกี่ยวข้องในการรวมเฟรมเวิร์ก Tiles กับ Struts2 Apache Tiles เป็นเฟรมเวิร์กเทมเพลตที่สร้างขึ้นเพื่อลดความซับซ้อนในการพัฒนาส่วนต่อประสานผู้ใช้เว็บแอปพลิเคชัน
ก่อนอื่นเราต้องดาวน์โหลดไฟล์ jar ของไทล์จากเว็บไซต์Apache Tiles คุณต้องเพิ่มไฟล์ jar ต่อไปนี้ในคลาสพา ธ ของโปรเจ็กต์
- tiles-api-x.y.z.jar
- tiles-compat-x.y.z.jar
- tiles-core-x.y.z.jar
- tiles-jsp-x.y.z.jar
- tiles-servlet-x.y.z.jar
นอกเหนือจากข้างต้นเราต้องคัดลอกไฟล์ jar ต่อไปนี้จากการดาวน์โหลด struts2 ในไฟล์ WEB-INF/lib.
- commons-beanutils-x.y.zjar
- commons-digester-x.y.jar
- struts2-tiles-plugin-x.y.z.jar
ตอนนี้ให้เราตั้งค่าไฟล์ web.xmlสำหรับการรวม Struts-Tiles ตามที่ระบุด้านล่าง มีสองประเด็นสำคัญที่ควรทราบที่นี่ อันดับแรกเราต้องบอกไทล์ว่าจะหาไฟล์คอนฟิกูเรชันไทล์ได้ที่ไหนtiles.xml. ในกรณีของเราจะอยู่ภายใต้/WEB-INFโฟลเดอร์ ต่อไปเราต้องเริ่มต้นฟัง Tiles ที่มาพร้อมกับการดาวน์โหลด Struts2
<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id = "WebApp_ID" version = "2.5">
<display-name>Struts2Example15</display-name>
<context-param>
<param-name>
org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG
</param-name>
<param-value>
/WEB-INF/tiles.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.apache.struts2.tiles.StrutsTilesListener
</listener-class>
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
ต่อไปให้เราสร้าง tiles.xml ภายใต้โฟลเดอร์ / WEB-INF ที่มีเนื้อหาดังต่อไปนี้ -
<?xml version = "1.0" Encoding = "UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
<definition name = "baseLayout" template="/baseLayout.jsp">
<put-attribute name = "title" value = "Template"/>
<put-attribute name = "banner" value = "/banner.jsp"/>
<put-attribute name = "menu" value = "/menu.jsp"/>
<put-attribute name = "body" value = "/body.jsp"/>
<put-attribute name = "footer" value = "/footer.jsp"/>
</definition>
<definition name = "tiger" extends = "baseLayout">
<put-attribute name = "title" value = "Tiger"/>
<put-attribute name = "body" value = "/tiger.jsp"/>
</definition>
<definition name = "lion" extends = "baseLayout">
<put-attribute name = "title" value = "Lion"/>
<put-attribute name = "body" value = "/lion.jsp"/>
</definition>
</tiles-definitions>
ต่อไปเราจะกำหนดโครงร่างโครงกระดูกพื้นฐานในไฟล์ baseLayout.jsp. มีพื้นที่ที่สามารถนำกลับมาใช้ใหม่ได้ 5 แบบ ได้แก่title, banner, menu, body และ footer. เราให้ค่าเริ่มต้นสำหรับ baseLayout จากนั้นเราจะสร้างการปรับแต่งสองแบบที่ขยายจากเค้าโครงเริ่มต้น เค้าโครงเสือคล้ายกับเลย์เอาต์พื้นฐานยกเว้นจะใช้รูปแบบtiger.jspเป็นตัวอักษรและมีข้อความ "Tiger" เป็นชื่อเรื่อง ในทำนองเดียวกันเลย์เอาต์สิงโตก็คล้ายกับเลย์เอาต์พื้นฐานยกเว้นจะใช้รูปแบบlion.jsp เป็นตัวอักษรและมีข้อความ "Lion" เป็นชื่อเรื่อง
ให้เราดูไฟล์ jsp แต่ละไฟล์ ต่อไปนี้เป็นเนื้อหาของbaseLayout.jsp ไฟล์ -
<%@ taglib uri = "http://tiles.apache.org/tags-tiles" prefix = "tiles"%>
<!DOCTYPE HTML PUBLIC "-//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">
<title>
<tiles:insertAttribute name = "title" ignore="true" />
</title>
</head>
<body>
<tiles:insertAttribute name = "banner" /><br/>
<hr/>
<tiles:insertAttribute name = "menu" /><br/>
<hr/>
<tiles:insertAttribute name = "body" /><br/>
<hr/>
<tiles:insertAttribute name = "footer" /><br/>
</body>
</html>
ที่นี่เราเพิ่งรวบรวมหน้า HTML พื้นฐานที่มีคุณสมบัติของกระเบื้อง เราแทรกแอตทริบิวต์ของกระเบื้องในสถานที่ที่เราต้องการให้เป็น ต่อไปให้เราสร้างไฟล์banner.jsp ไฟล์ที่มีเนื้อหาต่อไปนี้ -
<img src="http://www.tutorialspoint.com/images/tp-logo.gif"/>
menu.jsp ไฟล์จะมีบรรทัดต่อไปนี้ซึ่งเป็นลิงก์ไปยัง TigerMenu.action และการดำเนินการ struts LionMenu.action
<%@taglib uri = "/struts-tags" prefix = "s"%>
<a href = "<s:url action = "tigerMenu"/>" Tiger</a><br>
<a href = "<s:url action = "lionMenu"/>" Lion</a><br>
lion.jsp ไฟล์จะมีเนื้อหาดังต่อไปนี้ -
<img src="http://upload.wikimedia.org/wikipedia/commons/d/d2/Lion.jpg"/>
The lion
tiger.jsp ไฟล์จะมีเนื้อหาดังต่อไปนี้ -
<img src="http://www.freewebs.com/tigerofdarts/tiger.jpg"/>
The tiger
ต่อไปให้เราสร้างไฟล์คลาสการดำเนินการ MenuAction.java ซึ่งมีดังต่อไปนี้ -
package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class MenuAction extends ActionSupport {
public String tiger() { return "tiger"; }
public String lion() { return "lion"; }
}
นี่เป็นชั้นเรียนที่ค่อนข้างตรงไปตรงมา เราประกาศสองวิธีเสือ () และสิงโต () ที่คืนเสือและสิงโตเป็นผลลัพธ์ตามลำดับ ให้เรารวบรวมทั้งหมดเข้าด้วยกันในไฟล์struts.xml ไฟล์ -
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name = "default" extends = "struts-default">
<result-types>
<result-type name = "tiles"
class="org.apache.struts2.views.tiles.TilesResult" />
</result-types>
<action name = "*Menu" method = "{1}"
class = "com.tutorialspoint.struts2.MenuAction">
<result name = "tiger" type = "tiles">tiger</result>
<result name = "lion" type = "tiles">lion</result>
</action>
</package>
</struts>
ให้เราตรวจสอบสิ่งที่เราทำในไฟล์ด้านบน ก่อนอื่นเราได้ประกาศประเภทผลลัพธ์ใหม่ที่เรียกว่า "ไทล์" เนื่องจากตอนนี้เราใช้ไทล์แทน jsp ธรรมดาสำหรับเทคโนโลยีมุมมอง Struts2 รองรับประเภทผลลัพธ์ Tiles View ดังนั้นเราจึงสร้างผลลัพธ์ประเภท "ไทล์" ให้เป็นคลาส "org.apache.struts2.view.tiles.TilesResult"
ต่อไปเราต้องการทราบว่าคำขอเป็นของ /tigerMenu.action นำผู้ใช้ไปที่หน้าไทล์ไทล์หรือไม่และหากคำขอเป็นของ /lionMenu.action นำผู้ใช้ไปที่หน้ากระเบื้องสิงโต
เราบรรลุสิ่งนี้โดยใช้นิพจน์ทั่วไปเล็กน้อย ในคำจำกัดความของการกระทำของเราเราพูดอะไรก็ตามที่ตรงกับรูปแบบ "* เมนู" จะได้รับการจัดการโดยการกระทำนี้ วิธีการจับคู่จะถูกเรียกใช้ในคลาส MenuAction นั่นคือ tigerMenu.action จะเรียกใช้ tiger () และ lionMenu.action จะเรียกใช้ lion () จากนั้นเราต้องแมปผลลัพธ์ของผลลัพธ์กับหน้าไทล์ที่เหมาะสม
ตอนนี้คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/tigerMenu.jsp. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -
ในทำนองเดียวกันถ้าคุณไปที่หน้า lionMenu.action คุณจะเห็นหน้าสิงโตซึ่งใช้เค้าโครงกระเบื้องเดียวกัน
Hibernate เป็นบริการการคงอยู่และการสืบค้นของ Object / Relational ที่มีประสิทธิภาพสูงซึ่งได้รับอนุญาตภายใต้สัญญาอนุญาตสาธารณะทั่วไปของ GNU Lesser General Public License (LGPL) แบบโอเพนซอร์สและสามารถดาวน์โหลดได้ฟรี ในบทนี้. เราจะเรียนรู้วิธีการบรรลุการรวม Struts 2 กับ Hibernate หากคุณไม่คุ้นเคยกับไฮเบอร์เนตคุณสามารถตรวจสอบบทแนะนำไฮเบอร์เนตของเราได้
การตั้งค่าฐานข้อมูล
สำหรับบทช่วยสอนนี้ฉันจะใช้ฐานข้อมูล MySQL "struts2_tutorial" ฉันเชื่อมต่อกับฐานข้อมูลนี้บนเครื่องของฉันโดยใช้ชื่อผู้ใช้ "root" และไม่มีรหัสผ่าน ก่อนอื่นคุณต้องเรียกใช้สคริปต์ต่อไปนี้ สคริปต์นี้สร้างตารางใหม่ที่เรียกว่าstudent และสร้างระเบียนไม่กี่รายการในตารางนี้ -
CREATE TABLE IF NOT EXISTS `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(40) NOT NULL,
`last_name` varchar(40) NOT NULL,
`marks` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
--
-- Dumping data for table `student`
--
INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`)
VALUES(1, 'George', 'Kane', 20);
INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`)
VALUES(2, 'Melissa', 'Michael', 91);
INSERT INTO `student` (`id`, `first_name`, `last_name`, `marks`)
VALUES(3, 'Jessica', 'Drake', 21);
การกำหนดค่าไฮเบอร์เนต
ต่อไปให้เราสร้าง hibernate.cfg.xml ซึ่งเป็นไฟล์กำหนดค่าของ hibernate
<?xml version = '1.0' encoding = 'utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name = "hibernate.connection.driver_class">c
om.mysql.jdbc.Driver
</property>
<property name = "hibernate.connection.url">
jdbc:mysql://www.tutorialspoint.com/struts_tutorial
</property>
<property name = "hibernate.connection.username">root</property>
<property name = "hibernate.connection.password"></property>
<property name = "hibernate.connection.pool_size">10</property>
<property name = "show_sql">true</property>
<property name = "dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name = "hibernate.hbm2ddl.auto">update</property>
<mapping class = "com.tutorialspoint.hibernate.Student" />
</session-factory>
</hibernate-configuration>
ให้เราไปที่ไฟล์กำหนดค่าไฮเบอร์เนต อันดับแรกเราประกาศว่าเรากำลังใช้ไดรเวอร์ MySQL จากนั้นเราประกาศ jdbc url สำหรับเชื่อมต่อกับฐานข้อมูล จากนั้นเราก็ประกาศชื่อผู้ใช้รหัสผ่านและขนาดพูลของการเชื่อมต่อ นอกจากนี้เรายังระบุด้วยว่าเราต้องการเห็น SQL ในไฟล์บันทึกโดยเปิด "show_sql" เป็น true โปรดอ่านบทแนะนำการจำศีลเพื่อทำความเข้าใจว่าคุณสมบัติเหล่านี้หมายถึงอะไร
สุดท้ายเราตั้งค่าคลาสการทำแผนที่เป็น com.tutorialspoint.hibernate.Student ซึ่งเราจะสร้างในบทนี้
การตั้งค่าสภาพแวดล้อม
ถัดไปคุณต้องมีขวดจำนวนมากสำหรับโครงการนี้ แนบเป็นภาพหน้าจอของรายการไฟล์ JAR ทั้งหมดที่จำเป็น -
ไฟล์ JAR ส่วนใหญ่สามารถรับได้โดยเป็นส่วนหนึ่งของการกระจายสตรัทของคุณ หากคุณมีแอปพลิเคชันเซิร์ฟเวอร์เช่น glassfish, websphere หรือ jboss ติดตั้งคุณจะสามารถรับไฟล์ jar ที่เหลือส่วนใหญ่ได้จากโฟลเดอร์ lib ของ appserver หากไม่สามารถดาวน์โหลดไฟล์ทีละไฟล์ -
ไฟล์ Hibernate jar - Hibernate.org
Struts hibernate plugin - ปลั๊กอินStruts hibernate
ไฟล์ JTA - ไฟล์ JTA
ไฟล์Dom4j - Dom4j
ไฟล์log4j - log4j
ไฟล์ที่เหลือคุณควรจะได้รับจากการแจกจ่าย Struts2 ของคุณ
ไฮเบอร์เนตคลาส
ตอนนี้ให้เราสร้างคลาส java ที่จำเป็นสำหรับการรวมไฮเบอร์เนต ต่อไปนี้เป็นเนื้อหาของStudent.java -
package com.tutorialspoint.hibernate;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue
private int id;
@Column(name = "last_name")
private String lastName;
@Column(name = "first_name")
private String firstName;
private int marks;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public int getMarks() {
return marks;
}
public void setMarks(int marks) {
this.marks = marks;
}
}
นี่คือคลาส POJO ที่แสดงถึงไฟล์ studentตารางตามข้อกำหนดไฮเบอร์เนต มี id คุณสมบัติ firstName และ lastName ซึ่งสอดคล้องกับชื่อคอลัมน์ของตารางนักเรียน ต่อไปให้เราสร้างStudentDAO.java ไฟล์ดังนี้ -
package com.tutorialspoint.hibernate;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.googlecode.s2hibernate.struts2.plugin.\
annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.\
annotations.TransactionTarget;
public class StudentDAO {
@SessionTarget
Session session;
@TransactionTarget
Transaction transaction;
@SuppressWarnings("unchecked")
public List<Student> getStudents() {
List<Student> students = new ArrayList<Student>();
try {
students = session.createQuery("from Student").list();
} catch(Exception e) {
e.printStackTrace();
}
return students;
}
public void addStudent(Student student) {
session.save(student);
}
}
ชั้น StudentDAO เป็นชั้นการเข้าถึงข้อมูลสำหรับชั้นนักเรียน มีวิธีการในการแสดงรายชื่อนักเรียนทั้งหมดแล้วบันทึกข้อมูลนักเรียนใหม่
คลาสแอ็คชั่น
ไฟล์ต่อไปนี้ AddStudentAction.javaกำหนดคลาสการกระทำของเรา เรามีวิธีดำเนินการสองวิธีที่นี่ - execute () และ listStudents () เมธอด execute () ใช้เพื่อเพิ่มเรกคอร์ดนักเรียนใหม่ เราใช้วิธีบันทึกของ dao () เพื่อให้บรรลุสิ่งนี้
วิธีอื่น listStudents () ใช้เพื่อแสดงรายชื่อนักเรียน เราใช้วิธี dao's list เพื่อรับรายชื่อนักเรียนทั้งหมด
package com.tutorialspoint.struts2;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.tutorialspoint.hibernate.Student;
import com.tutorialspoint.hibernate.StudentDAO;
public class AddStudentAction extends ActionSupport implements ModelDriven<Student> {
Student student = new Student();
List<Student> students = new ArrayList<Student>();
StudentDAO dao = new StudentDAO();
@Override
public Student getModel() {
return student;
}
public String execute() {
dao.addStudent(student);
return "success";
}
public String listStudents() {
students = dao.getStudents();
return "success";
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
คุณจะสังเกตเห็นว่าเรากำลังใช้อินเทอร์เฟซ ModelDriven ใช้เมื่อคลาสการดำเนินการของคุณกำลังจัดการกับคลาสโมเดลที่เป็นรูปธรรม (เช่น Student) ซึ่งตรงข้ามกับคุณสมบัติแต่ละรายการ (เช่น firstName, lastName) อินเทอร์เฟซ ModelAware ต้องการให้คุณใช้วิธีการส่งคืนโมเดล ในกรณีของเราเรากำลังส่งคืนวัตถุ "นักเรียน"
สร้างไฟล์ดู
ให้เราสร้างไฟล์ student.jsp ดูไฟล์ที่มีเนื้อหาต่อไปนี้ -
<%@ page contentType = "text/html; charset = UTF-8"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<html>
<head>
<title>Hello World</title>
<s:head />
</head>
<body>
<s:form action = "addStudent">
<s:textfield name = "firstName" label = "First Name"/>
<s:textfield name = "lastName" label = "Last Name"/>
<s:textfield name = "marks" label = "Marks"/>
<s:submit/>
<hr/>
<table>
<tr>
<td>First Name</td>
<td>Last Name</td>
<td>Marks</td>
</tr>
<s:iterator value = "students">
<tr>
<td><s:property value = "firstName"/></td>
<td><s:property value = "lastName"/></td>
<td><s:property value = "marks"/></td>
</tr>
</s:iterator>
</table>
</s:form>
</body>
</html>
student.jsp ค่อนข้างตรงไปตรงมา ในส่วนบนสุดเรามีแบบฟอร์มที่ส่งไปที่ "addStudent.action" ใช้ใน firstName, lastName และเครื่องหมาย เนื่องจากแอ็คชัน addStudent เชื่อมโยงกับ ModelAware "AddSudentAction" โดยอัตโนมัติ student bean จะถูกสร้างขึ้นพร้อมกับค่าสำหรับ firstName, lastName และทำเครื่องหมายที่เติมอัตโนมัติ
ในส่วนด้านล่างเราจะดูรายชื่อนักเรียน (ดู AddStudentAction.java) เราวนซ้ำตามรายการและแสดงค่าสำหรับชื่อนามสกุลและเครื่องหมายในตาราง
การกำหนดค่า Struts
ให้เรารวบรวมทั้งหมดเข้าด้วยกันโดยใช้ struts.xml -
<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name = "struts.devMode" value = "true" />
<package name = "myhibernate" extends = "hibernate-default">
<action name = "addStudent" method = "execute"
class = "com.tutorialspoint.struts2.AddStudentAction">
<result name = "success" type = "redirect">
listStudents
</result>
</action>
<action name = "listStudents" method = "listStudents"
class = "com.tutorialspoint.struts2.AddStudentAction">
<result name = "success">/students.jsp</result>
</action>
</package>
</struts>
สิ่งสำคัญที่ต้องสังเกตคือแพ็คเกจ "myhibernate" ของเราขยายแพ็คเกจเริ่มต้น struts2 ที่เรียกว่า "hibernate-default" จากนั้นเราจะประกาศสองการกระทำ - addStudent และ listStudents addStudent เรียก execute () บนคลาส AddStudentAction จากนั้นเมื่อสำเร็จจะเรียกเมธอดการดำเนินการ listStudents
วิธีการดำเนินการ listStudent เรียก listStudents () บนคลาส AddStudentAction และใช้ student.jsp เป็นมุมมอง
ตอนนี้คลิกขวาที่ชื่อโครงการแล้วคลิก Export > WAR Fileเพื่อสร้างไฟล์ War จากนั้นปรับใช้ WAR นี้ในไดเรกทอรี webapps ของ Tomcat สุดท้ายเริ่มเซิร์ฟเวอร์ Tomcat และพยายามเข้าถึง URLhttp://localhost:8080/HelloWorldStruts2/student.jsp. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -
ในส่วนบนสุดเราจะได้รับแบบฟอร์มสำหรับป้อนค่าสำหรับระเบียนนักเรียนใหม่และส่วนด้านล่างจะแสดงรายการนักเรียนในฐานข้อมูล เพิ่มระเบียนนักเรียนใหม่แล้วกดส่ง หน้าจอจะรีเฟรชและแสดงรายการที่อัปเดตทุกครั้งที่คุณคลิกส่ง