Struts1 ต้องการคลาส Action เพื่อสืบทอดคลาสฐานนามธรรม ปัญหาทั่วไปของ Struts1 คือการเขียนโปรแกรมด้วยคลาสนามธรรมแทนที่จะเป็นอินเทอร์เฟซ
• คลาส Struts 2 Action สามารถใช้อินเทอร์เฟซ Action หรืออินเทอร์เฟซอื่น ๆ ทำให้บริการเสริมและปรับแต่งได้ Struts2 จัดเตรียมคลาสพื้นฐาน ActionSupport เพื่อใช้อินเทอร์เฟซที่ใช้กันทั่วไป ไม่จำเป็นต้องใช้อินเทอร์เฟซ Action อ็อบเจ็กต์ POJO ใดๆ ที่มีตัวระบุการดำเนินการสามารถใช้เป็นอ็อบเจ็กต์ Action ของ Struts2
โหมดเธรด:
• Struts1 Action เป็นโหมดซิงเกิลตันและจะต้องปลอดภัยสำหรับเธรด เนื่องจากมีการดำเนินการเพียงอินสแตนซ์เดียวเท่านั้นที่จัดการคำขอทั้งหมด กลยุทธ์ซิงเกิลตันจำกัดสิ่งที่ Struts1 Action สามารถทำได้ และต้องใช้ความระมัดระวังเป็นพิเศษในระหว่างการพัฒนา ทรัพยากรการดำเนินการต้องเป็นแบบเธรดที่ปลอดภัยหรือซิงโครไนซ์
• อ็อบเจ็กต์ Struts2 Action จะสร้างอินสแตนซ์สำหรับแต่ละคำขอ ดังนั้นจึงไม่มีปัญหาด้านความปลอดภัยของเธรด (อันที่จริงแล้ว คอนเทนเนอร์เซิร์ฟเล็ตสร้างอ็อบเจ็กต์ที่สามารถทิ้งได้จำนวนมากต่อการร้องขอ และไม่ทำให้เกิดปัญหาด้านประสิทธิภาพและปัญหาการรีไซเคิล LJ)
การพึ่งพาเซิร์ฟเล็ต:
• Struts1 Action อาศัย Servlet API เนื่องจาก HttpServletRequest และ HttpServletResponse ถูกส่งผ่านไปยังวิธีการดำเนินการเมื่อมีการเรียกใช้ Action
• Struts 2 Action ไม่ได้ขึ้นอยู่กับคอนเทนเนอร์ ทำให้สามารถทดสอบ Action ได้อย่างอิสระจากคอนเทนเนอร์ Struts2 Action ยังคงสามารถเข้าถึงคำขอและการตอบกลับดั้งเดิมได้หากจำเป็น อย่างไรก็ตาม องค์ประกอบอื่นๆ จะลดหรือขจัดความจำเป็นในการเข้าถึง HttpServetRequest และ HttpServletResponse โดยตรง
ความสามารถในการทดสอบ:
ปัญหาสำคัญในการทดสอบ Struts 1 Actions คือวิธีการดำเนินการเปิดเผย servlet API (ซึ่งทำให้การทดสอบขึ้นอยู่กับคอนเทนเนอร์) ส่วนขยายของบุคคลที่สาม - Struts TestCase - จัดเตรียมชุดของวัตถุจำลอง Struts1 (สำหรับการทดสอบ)
สามารถทดสอบ Struts 2 Action ได้โดยการเริ่มต้น การตั้งค่าคุณสมบัติ และวิธีการเรียก การสนับสนุน "การพึ่งพาการฉีด" ยังทำให้การทดสอบง่ายขึ้น
อินพุตจับภาพ:
• Struts1 ใช้วัตถุ ActionForm เพื่อจับอินพุต ActionForms ทั้งหมดจะต้องสืบทอดคลาสพื้นฐาน เนื่องจาก JavaBeans อื่นๆ ไม่สามารถใช้เป็น ActionForms ได้ นักพัฒนาจึงมักสร้างคลาสที่ซ้ำซ้อนเพื่อดักจับอินพุต Dynamic Beans (DynaBeans) สามารถใช้เป็นทางเลือกแทนการสร้าง ActionForms แบบดั้งเดิมได้ อย่างไรก็ตาม นักพัฒนาอาจกำลังอธิบาย (สร้าง) JavaBeans ที่มีอยู่ใหม่ (ยังคงส่งผลให้ javabeans ซ้ำซ้อน)
• Struts 2 ใช้คุณสมบัติ Action เป็นคุณสมบัติอินพุตโดยตรง โดยไม่จำเป็นต้องใช้ออบเจ็กต์อินพุตตัวที่สอง คุณสมบัติอินพุตอาจเป็นประเภทอ็อบเจ็กต์ที่หลากหลายที่มีคุณสมบัติ (ย่อย) ของตัวเอง คุณสมบัติการดำเนินการสามารถเข้าถึงได้ผ่าน taglibs บนหน้าเว็บ Struts2 ยังรองรับโหมด ActionForm ประเภทออบเจ็กต์ที่หลากหลาย รวมถึงออบเจ็กต์ทางธุรกิจ สามารถใช้เป็นออบเจ็กต์อินพุต/เอาท์พุตได้ คุณลักษณะ ModelDriven นี้ทำให้การอ้างอิงของ taglib ไปยังออบเจ็กต์อินพุต POJO ง่ายขึ้น
ภาษานิพจน์:
• Struts1 รวม JSTL เข้าด้วยกันดังนั้นจึงใช้ JSTL EL EL นี้มีการสำรวจกราฟวัตถุพื้นฐาน แต่การรองรับคอลเลกชันและคุณสมบัติที่จัดทำดัชนียังอ่อนแอ
• Struts2 สามารถใช้ JSTL ได้ แต่ยังรองรับภาษานิพจน์ที่ทรงพลังและยืดหยุ่นยิ่งขึ้น - "Object Graph Notation Language" (OGNL)
ผูกค่ากับหน้า (ดู):
• Struts 1 ใช้กลไก JSP มาตรฐานเพื่อผูกอ็อบเจ็กต์เข้ากับเพจเพื่อการเข้าถึง
Struts 2 ใช้เทคโนโลยี "ValueStack" เพื่อให้ taglib เข้าถึงค่าโดยไม่ต้องผูกเพจของคุณ (ดู) กับอ็อบเจ็กต์ กลยุทธ์ ValueStack อนุญาตให้นำเพจกลับมาใช้ซ้ำ (การดู) ผ่านชุดคุณสมบัติที่มีชื่อเดียวกัน แต่มีประเภทต่างกัน
การแปลงประเภท:
• คุณสมบัติ Struts 1 ActionForm มักจะเป็นประเภท String Struts1 ใช้ Commons-Beanutils สำหรับการแปลงประเภท ตัวแปลงหนึ่งตัวต่อคลาส ไม่สามารถกำหนดค่าได้ต่ออินสแตนซ์
• Struts2 ใช้ OGNL สำหรับการแปลงประเภท ให้ตัวแปลงสำหรับวัตถุพื้นฐานและวัตถุที่ใช้กันทั่วไป
ตรวจสอบ:
• Struts 1 รองรับการตรวจสอบด้วยตนเองในวิธีการตรวจสอบของ ActionForm หรือการตรวจสอบผ่านส่วนขยายของ Commons Validator คลาสเดียวกันอาจมีเนื้อหาการตรวจสอบที่แตกต่างกัน แต่ไม่สามารถตรวจสอบวัตถุย่อยได้
• Struts2 รองรับการตรวจสอบผ่านวิธีการตรวจสอบและกรอบการตรวจสอบ XWork กรอบการตรวจสอบความถูกต้องของ XWork ใช้การตรวจสอบความถูกต้องและการตรวจสอบเนื้อหาที่กำหนดไว้สำหรับประเภทคลาสแอตทริบิวต์เพื่อรองรับคุณสมบัติย่อยการตรวจสอบความถูกต้องของลูกโซ่
การควบคุมการดำเนินการ:
• Struts1 รองรับตัวประมวลผลคำขอแยกกัน (วงจรชีวิต) สำหรับแต่ละโมดูล แต่การดำเนินการทั้งหมดในโมดูลต้องใช้วงจรชีวิตเดียวกัน
• Struts2 รองรับการสร้างวงจรชีวิตที่แตกต่างกันสำหรับแต่ละ Action ผ่าน Interceptor Stacks สามารถใช้สแต็คกับการดำเนินการต่างๆ ได้ตามต้องการ
บทความนี้มาจากบล็อก CSDN โปรดระบุแหล่งที่มาเมื่อพิมพ์ซ้ำ: http://blog.csdn.net/Ryan_lz/archive/2009/12/29/5101758.aspx