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. สิ่งนี้จะสร้างหน้าจอต่อไปนี้ -

ในส่วนบนสุดเราจะได้รับแบบฟอร์มสำหรับป้อนค่าสำหรับระเบียนนักเรียนใหม่และส่วนด้านล่างจะแสดงรายการนักเรียนในฐานข้อมูล เพิ่มระเบียนนักเรียนใหม่แล้วกดส่ง หน้าจอจะรีเฟรชและแสดงรายการที่อัปเดตทุกครั้งที่คุณคลิกส่ง