การพัฒนาการดำเนินการเสร็จสมบูรณ์โดยสืบทอดคลาส ActionsUpport คลาส ActionSupport ไม่เพียง แต่ใช้อินเทอร์เฟซการกระทำ แต่ยังเพิ่มการสนับสนุนสำหรับการตรวจสอบและการแปล การกระทำที่กำหนดเองในการพัฒนาจริงจำเป็นต้องสืบทอดคลาสนี้ เพิ่มฟังก์ชั่นการยืนยันแบบฟอร์มลงในการเข้าสู่ระบบของผู้ใช้
บทบาทของคลาส Actionsupport:
struts2 ไม่จำเป็นต้องมีคลาสแอ็คชั่นที่เราออกแบบมาเพื่อสืบทอดคลาสฐานหรืออินเทอร์เฟซ struts ใด ๆ แต่เพื่ออำนวยความสะดวกในการดำเนินการตามการกระทำของเราเองเราจะสืบทอด com.opensymphony.xwork2.actionsupport ในกรณีส่วนใหญ่ เนื่องจากมีข้อแก้ตัวในทางปฏิบัติมากมายในชั้นเรียนนี้จึงมีวิธีการเริ่มต้นมากมายรวมถึงวิธีการข้อมูลระหว่างประเทศวิธีการเริ่มต้นสำหรับการประมวลผลคำขอผู้ใช้ ฯลฯ ซึ่งสามารถทำให้การพัฒนาของ Acion ง่ายขึ้นอย่างมาก ใน struts2 การกระทำมักจะใช้โดยตรงเพื่อห่อหุ้มพารามิเตอร์การร้องขอ HTTP ดังนั้นคลาสการดำเนินการควรรวมแอตทริบิวต์ที่สอดคล้องกับพารามิเตอร์คำขอและให้วิธีการ getter และ setter ที่สอดคล้องกันสำหรับแอตทริบิวต์
ดังนั้นความแตกต่างระหว่างอินเทอร์เฟซการกระทำและคลาส ActionsUpport คืออะไร?
อินเตอร์เฟสการกระทำมี:
ความสำเร็จของสตริงสุดท้ายคงที่สาธารณะ = "ความสำเร็จ"; สตริงสุดท้ายคงที่สาธารณะไม่มี = "ไม่มี"; ข้อผิดพลาดสตริงสุดท้ายคงที่สาธารณะ = "ข้อผิดพลาด"; สตริงสุดท้ายคงที่ล็อกอินสุดท้าย = "เข้าสู่ระบบ"; สตริงสาธารณะดำเนินการ () โยนข้อยกเว้น;
คุณจะเห็นว่ามีค่าคงที่ห้าค่าคงที่และดำเนินการ () พร้อมสตริงประเภทส่งคืน
บนพื้นฐานของการใช้งานอินเทอร์เฟซการดำเนินการคลาสเครื่องมือ ActionsUpport ยังกำหนดวิธีการตรวจสอบ () หากวิธีการถูกแทนที่มันจะถูกดำเนินการก่อนวิธีการดำเนินการ () หากการตรวจสอบล้มเหลวจะถูกถ่ายโอนไปยังอินพุต แอตทริบิวต์อินพุตจะต้องกำหนดค่าเมื่อกำหนดค่าการกระทำ
นอกจากนี้ ActionsUpport ยังมีวิธีการ getText (คีย์สตริง) และตระหนักถึงความเป็นสากลซึ่งได้รับข้อมูลสากลจากไฟล์ทรัพยากร
ด้วยวิธีนี้เมื่อปรับแต่งแท็กคุณสามารถกำหนดตัวแปรเป็นวัตถุ Actionsupport ใหม่เพื่อให้บรรลุความเป็นสากล
คลาส ActionSupport มี (ซอร์สโค้ด):
การดำเนินการระดับสาธารณะการดำเนินการดำเนินการดำเนินการ, ถูกต้อง, validationAware, textProvider, localeProvider, serializable {logger logger แบบคงที่ได้รับการป้องกัน = loggerFactory.getLogger (ActionSupport.class); SetActionErrors (คอลเลกชัน <String> errorMessages) {validationAware.SetActionErrors (errorMessages);} การรวบรวมสาธารณะ <String> getActionErrors () {return validationAware.getActionErrors ();} โมฆะสาธารณะ setActionMessages (คอลเลกชัน validationAware.getActionMessages ();}@deprecatedPublic Collection <String> getERRORMESSAGES () {return getActionERrors ();}@MAP DEPRECATEDPBUBLIC <String, รายการ <String>> getERRORS () {validationAware.setFielderRors (errorMap);} แผนที่สาธารณะ <สตริง, รายการ <สตริง >> getFielderRors () {return validationAware.getFielderRors ();} locale สาธารณะ getLocale () {actionContext (log.isdebugenabled ()) {log.debug ("บริบทการกระทำที่ไม่ได้เริ่มต้น");} return null;}} public boolean haskey (คีย์สตริง) {return getTextProvider (). haskey (key); defaultValue) {return getTextProvider (). getText (atextName, defaultValue);} สตริงสาธารณะ getText (สตริง atextName, สตริง defaultValue, สตริง obj) {return getTextProvider (). getText (atextName, defaultValue, obj); getTextProvider (). getText (atextName, args);} สตริงสาธารณะ getText (คีย์สตริง, สตริง [] args) {return getTextProvider (). getText (key, args);} สตริงสาธารณะ getText getText (คีย์สตริง, สตริง defaultValue, string [] args) {return getTextProvider (). getText (คีย์, defaultValue, args);} public String getText (คีย์สตริง, สตริง defaultValue, รายการ <?> args, valuestack stack) String [] args, valuestack stack) {return getTextProvider (). getText (key, defaultValue, args, stack);} สตริงสาธารณะ getFormatted (สตริงคีย์, สตริง expr) {แผนที่ <สตริง, object> conversionerRors = actionContext.getContext () conversionerrors.get (expr); return vals [0];} else {valuestack valuestack สุดท้าย = actionContext.getContext (). getValuestack (); วัตถุสุดท้าย val = valuestack.findValue (expr); return getText (key, array.aslist (val); getTextProvider (). getTexts ();} public ResourceBundle getTexts (สตริง unquverlename) {return getTextProvider (). getTexts (undernlename);} โมฆะสาธารณะ addactionError (สตริง anerrorMessage) {validationaware.addactionMessage (amessage);} โมฆะสาธารณะ addfielderror (สตริง fieldName, สตริง errorMessage) {validationaware.addfielderror (fieldName, errorMessage); ความสำเร็จ;} บูลีนสาธารณะ HasactionErrors () {return validationaware.hasactionErrors ();} บูลีนสาธารณะ hasactionMessages () {return validationaware.hasactionMessages ();} public boolean haserrors () {return validationaware.haserrors () validationaware.hasfielderrors ();} โมฆะสาธารณะ clearfielderrors () {validationaware.clearfielderrors ();} โมฆะสาธารณะ clearactionerrors () {validationaware.ClearActionErrors (); {validationaware.clearerrors ();} โมฆะสาธารณะ ClearerRorSandMessages () {ValidationAware.ClearERRORRORSANDMESSAGES ();} โมฆะสาธารณะการตรวจสอบความถูกต้อง () {} @OverridePublic Object clone () getTextProvider () {ถ้า (textProvider == null) {textProviderFactory tpf = ใหม่ textProviderFactory (); ถ้า (container! = null) {container.inject (tpf);} textProvider = tpf.createinstance container) {this.container = container;} คุณจะเห็นว่ามีวิธีการมากมายในนั้น แต่เห็นได้ชัดว่าเราเห็นว่ามีวิธีการที่เรารู้ดีตรวจสอบ () และการตรวจสอบข้อมูล ด้วยวิธีนี้เราสามารถแจ้งเมื่อเข้าสู่ระบบชื่อผู้ใช้และรหัสผ่านว่างเปล่าหรืออื่น ๆ ...
ตอนนี้ให้ตัวอย่างง่ายๆ: เมื่อชื่อผู้ใช้และรหัสผ่านว่างเปล่าให้ลูกค้าได้รับพรอมต์ที่เป็นมิตร
ต่อไปนี้มีสองวิธีในการอธิบายฟังก์ชั่นการตรวจสอบข้อมูลของ struts 2
1. การตรวจสอบวิธีการเข้ารหัส
1) การกระทำจะต้องสืบทอดจาก ActionSupport
2) เขียนวิธีการเป็นโมฆะสาธารณะ Validatexxx () สำหรับวิธีการประมวลผลคำขอที่จะตรวจสอบและดำเนินการตรวจสอบข้อมูลแบบฟอร์มภายในวิธีการ
3) คุณยังสามารถเขียนวิธีการ Void Public Varidate () สำหรับวิธีการประมวลผลคำขอทั้งหมด
4) ในวิธีการตรวจสอบคุณสามารถเพิ่มข้อความแสดงข้อผิดพลาดการตรวจสอบฟิลด์ผ่านวิธี AddFielderRor ()
5) เมื่อการตรวจสอบล้มเหลวเฟรมเวิร์ก Struts จะข้ามไปยังหน้าผลลัพธ์โดยอัตโนมัติด้วยการป้อนชื่อ ในหน้าการตรวจสอบความล้มเหลวคุณสามารถใช้ <s: fielderror/> เพื่อแสดงข้อความแสดงข้อผิดพลาด
6) เรียบง่ายและยืดหยุ่น แต่มันไม่สามารถนำกลับมาใช้ใหม่ได้มากนัก
เขียนวิธีการตรวจสอบใหม่
1. การกระทำที่เราเขียนโดยทั่วไปสืบทอดและ Actionsupport และการกระทำไม่เพียง แต่ใช้อินเทอร์เฟซการกระทำ แต่ยังใช้อินเทอร์เฟซที่ถูกต้องซึ่งให้ฟังก์ชั่นการตรวจสอบข้อมูล กำหนดวิธีการตรวจสอบความถูกต้องในอินเทอร์เฟซที่ถูกต้องแทนที่วิธีการหากเกิดข้อผิดพลาดในฟิลด์อินพุตแบบฟอร์มการตรวจสอบเพิ่มข้อผิดพลาดไปยังฟิลด์ Fielderror ของคลาส ActionSupport แล้วส่งออกผ่านนิพจน์ OGNL
ต่อไปนี้เป็นอินเทอร์เฟซการตรวจสอบการเข้าสู่ระบบของผู้ใช้:
<body> <%-ข้อมูลการตรวจสอบเอาท์พุท-%> <%-ถ้าคุณต้องการพรอมต์เดียว <s: fielderror fieldName = "Uname"/>-%> <%-<s: ค่าคุณสมบัติ = "/>-%> <div style =" สีแดง "> <s: fielderror/> </div> < action = "loginValidateAction"> <s: div> โปรดป้อนชื่อผู้ใช้: <s: textfield name = "user.uname"> </s: textfield> </s: div> <s: div> โปรดป้อนรหัสผ่าน: <s: name = "user.upwd">/s: รหัสผ่าน> -%> <s: debug> </s: debug> </body>
หลังจากผู้ใช้ป้อนข้อมูลแล้วให้ส่งไปยัง LoginValidateAction:
Public Class LoginValidateAction ขยายการกระทำที่ใช้การดำเนินการ {ผู้ใช้สาธารณะผู้ใช้แผนที่สาธารณะ <สตริงวัตถุ> แผนที่ // วิธีการตรวจสอบจะทำงานกับการกระทำทั้งหมด @Override โมฆะสาธารณะตรวจสอบความถูกต้อง () {ถ้า (user.getUname (). length () == 0) {addFielderRor ( if (user.getUpwd (). length () == 0) {addFielderRor ("UPWD", "รหัสผ่านไม่สามารถว่างเปล่า!");}} // วิธีการจัดการสตริงสาธารณะทางธุรกิจ {system.out.println (user.getUname ()); ถ้า (user.getUname (). เท่ากับ ("ผู้ดูแลระบบ") && user.getUpwd (). เท่ากับ ("ผู้ดูแลระบบ")) {// ปล่อยให้การรวบรวมแผนที่ อินพุต errorreturn; // นี่ต้องเป็นอินพุต}}/*** @return ผู้ใช้*/ผู้ใช้สาธารณะ getUser () {return user;}/*** @param ผู้ใช้ผู้ใช้ให้ตั้งค่า*/public void setuser (ผู้ใช้ผู้ใช้) {this.user = user;}} คลาส LoginValidateAction ข้างต้นจะแทนที่วิธีการตรวจสอบความถูกต้องซึ่งจะดำเนินการก่อนที่จะดำเนินการวิธีการกระตุ้น หากหลังจากดำเนินการวิธีการแล้ว FiledError ของคลาสการกระทำจะมีข้อผิดพลาดการตรวจสอบข้อมูลคำขอจะถูกส่งต่อไปยังมุมมองเชิงตรรกะอินพุต
struts.xml ได้รับการกำหนดค่าดังนี้:
<!-การตรวจสอบข้อมูล-> <action name = "loginValidateAction"> <!-เมื่อผลลัพธ์คือ "ความสำเร็จ" ข้ามไปที่หน้า success.jsp-> <ชื่อผลลัพธ์ = "ความสำเร็จ"> success.jsp </result> <!-เมื่อผลลัพธ์คือ "ข้อผิดพลาด" name = "login"> fail.jsp </result> <name result = "error"> fail.jsp </result> </action>
ผลกระทบต่อลูกค้า:
แต่คุณสังเกตเห็นว่าเมื่อเกิดข้อผิดพลาดมันไม่ใช่เอฟเฟกต์ที่เราต้องการ
นี่ไม่ใช่สิ่งที่เราต้องการดังนั้นเราจะเปลี่ยนได้อย่างไร? อันที่จริงสิ่งนี้ส่วนใหญ่แสดงสไตล์ธีม struts2
ลองมาดูกันอีกครั้ง:
มันเพิ่มสไตล์ให้เราโดยอัตโนมัติ Struts2 มีสามธีม Ajax, Simple, XHTML มันเริ่มต้นเป็นธีม XHTML แน่นอนคุณสามารถเขียนธีมใด ๆ ของคุณเองซึ่งเราเรียกว่าธีมที่กำหนดเอง ปัญหาข้างต้นสามารถแก้ไขได้โดยการตั้งค่า
มีสองวิธีในการแก้ปัญหา:
1. วิธีการง่าย ๆ (ใช้งานได้จริงสำหรับแท็ก struts2 ทั้งหมด) เพิ่มรหัสบรรทัดถัดไปใน struts.xml
<constant name = "struts.ui.theme" value = "simple" />>
หมายความว่าทุกหน้าใช้ชุดรูปแบบง่าย ๆ ในเวลานี้หน้าเอาต์พุตไม่ได้เพิ่มรหัสที่ไม่จำเป็นเช่นตาราง tr td ฯลฯ และเราสามารถแก้ไขรูปแบบของหน้าเว็บเช่นหน้าแก้ไขอื่น ๆ
ลองดูรูปแบบพรอมต์ข้อผิดพลาด
เราสามารถตั้งค่าแท็กแบบนี้:
<s: ค่าคุณสมบัติ = "errors.uname [0]"/>
แสดงความคิดเห็นแท็กนี้:
<div style = "color: red"> <s: fielderror/> </div>
แต่เมื่อเราตั้งค่าเช่นนี้เอฟเฟกต์นี้จะเกิดขึ้น
เอฟเฟกต์นี้เป็นเหมือนพรอมต์เมื่อเรามักจะป้อนข้อผิดพลาดและมีค่าแอตทริบิวต์อื่น ๆ ดังนั้นเราไม่จำเป็นต้องแสดงรายการทีละรายการ
กรอบการตรวจสอบด้วย struts2
การตรวจสอบการกำหนดค่า XML
ดำเนินการก่อนเข้ารหัส
1) สำหรับคลาสแอ็คชั่นที่จะตรวจสอบให้เขียนไฟล์กฎการตรวจสอบชื่อ: คลาสการกระทำชื่อ-validation.xml ภายใต้แพ็คเกจเดียวกัน
2) เพิ่มกฎการตรวจสอบลงในไฟล์กฎการตรวจสอบ: สำหรับชื่ออุปกรณ์ตรวจสอบเฉพาะโปรดดูการอ้างอิงของ struts2 หรือ API ของ struts2
a) การตรวจสอบฟิลด์: กฎสำหรับการตรวจสอบแต่ละฟิลด์ประเภทที่ไม่ใช่ลูกค้าในคลาสการกระทำ
<field name = "ชื่อฟิลด์ที่จะตรวจสอบ"> <field-validator type = "ตรวจสอบชื่อไม้บรรทัด" การลัดวงจร = "ไม่ว่าจะเป็นการตรวจสอบเส้นทางสั้น ๆ (ค่าเริ่มต้นเป็นเท็จ)"> <param name = "ชื่อพารามิเตอร์ที่จะใช้โดยตัวตรวจสอบ"
b) การตรวจสอบที่ไม่ใช่ฟิลด์: ใช้นิพจน์ OGNL สำหรับการตรวจสอบ combinatorial สำหรับบางฟิลด์ในคลาสการกระทำ
<validator type = "FieldExpression"> <param name = "fieldName"> pwd </param> <param name = "fieldName"> pwd2 </param> <param name = "Expression"> <!
c) การตรวจสอบผู้เข้าชม: ส่วนใหญ่ใช้เพื่อตรวจสอบฟิลด์ประเภทที่กำหนดเองในคลาสการกระทำ (สำหรับการใช้โหมดขับเคลื่อนแบบจำลอง)
i) ใช้กฎการตรวจสอบผู้เข้าชมสำหรับฟิลด์ประเภทที่กำหนดเองในไฟล์กฎการตรวจสอบของคลาสการกระทำ
<!-ใช้การตรวจสอบผู้เยี่ยมชมสำหรับฟิลด์ที่กำหนดเอง-> <field name = "ผู้ใช้"> <field-validator type = "จำเป็น" การลัดวงจร = "true"> <messymes> ข้อมูล ussage ที่ต้องการ </message> <!-คำนำหน้าข้อความ-> </field-validator> < ระบุชื่อบริบทสำหรับการตรวจสอบผู้เข้าชมนี้-> <param name = "AppendPrefix"> true </param> <!-ไม่ว่าจะเพิ่มคำนำหน้าของข้อความการตรวจสอบความล้มเหลว-> <messions> useSage </message> <!
ii) เขียนไฟล์กฎการตรวจสอบสำหรับฟิลด์ของผู้เข้าชม ชื่อไฟล์คือ: ชื่อประเภทฟิลด์ผู้เข้าชม [-visitor การตรวจสอบชื่อบริบท] -validation.xml ตัวอย่างเช่น: ชื่อไฟล์ในตัวอย่างนี้คือ User-Usercontext-validation.xml
หมายเหตุ: ไฟล์นี้ควรเก็บไว้ในแพ็คเกจที่มีประเภทฟิลด์ผู้เข้าชมอยู่
iii) เพิ่มกฎการตรวจสอบสำหรับฟิลด์ที่จะตรวจสอบในไฟล์กฎการตรวจสอบฟิลด์ของผู้เข้าชม
นอกจากนี้เรายังสามารถทำการตรวจสอบข้อมูลได้โดยการเพิ่มไฟล์การกำหนดค่าการตรวจสอบโดยไม่ต้องเขียนวิธีการตรวจสอบใหม่ ไฟล์การกำหนดค่าการตรวจสอบนี้เสร็จสิ้นการตรวจสอบของฟิลด์ฟอร์มโดยใช้อุปกรณ์ตรวจสอบที่มีอยู่ใน struts2 ที่นี่นำอุปกรณ์ตรวจสอบที่จำเป็นต้องใช้เป็นตัวอย่าง อุปกรณ์ตรวจสอบนี้เป็นอุปกรณ์ตรวจสอบที่จำเป็นซึ่งระบุว่าต้องป้อนฟิลด์ฟอร์มบางอย่าง
ต่อไปนี้เป็นวิธีการเขียนของ loginValidateActaInction-validation.xml ของไฟล์กำหนดค่าการตรวจสอบนี้:
<? XML เวอร์ชัน = "1.0" การเข้ารหัส = "UTF-8"?> <! Doctype การตรวจสอบความถูกต้องสาธารณะ "-// apache struts // xwork validator 1.0.2 // en" "http://struts.apache.org/dtds/xwork-validator-1.0. type = "EdentialString"> <stemple> ชื่อผู้ใช้ไม่สามารถว่างเปล่า </message> </field-validator> </field> <field name = "Upwd"> <field-validator type = "จำเป็นต้องใช้" name = "minlength"> 6 </param> <message> ความยาวข้อความควรอยู่ระหว่าง $ {minlength}-$ {maxlength} bits </message> </field-validator> </field> </dalidators> หมายเหตุ: ไฟล์การกำหนดค่าการตรวจสอบนี้จะต้องปฏิบัติตามกฎสองข้อต่อไปนี้:
1. รูปแบบโชคชะตาของไฟล์จะต้องเป็นชื่อคลาสการกระทำ -validation.xml ตัวอย่างเช่นในตัวอย่างนี้ชื่อไฟล์คือ: loginValidateAction-validation.xml
2. ไฟล์จะต้องอยู่ในเส้นทางเดียวกับไฟล์คลาสของคลาสการกระทำ ในตัวอย่างนี้ไฟล์อยู่ใน
รหัสของคลาส LoginValidateAction ยังคงเหมือนเดิม:
Public Class LoginValidateAction ขยายการกระทำที่ใช้การดำเนินการ {ผู้ใช้สาธารณะผู้ใช้แผนที่สาธารณะ <สตริงวัตถุ> แผนที่ // วิธีการตรวจสอบจะทำงานกับการกระทำทั้งหมด @Override โมฆะสาธารณะตรวจสอบความถูกต้อง () {ถ้า (user.getUname (). length () == 0) {addFielderRor ( if (user.getUpwd (). length () == 0) {addFielderRor ("UPWD", "รหัสผ่านไม่สามารถว่างเปล่า!");}} // วิธีการจัดการสตริงสาธารณะทางธุรกิจ {system.out.println (user.getUname ()); ถ้า (user.getUname (). เท่ากับ ("ผู้ดูแลระบบ") && user.getUpwd (). เท่ากับ ("ผู้ดูแลระบบ")) {// ปล่อยให้การรวบรวมแผนที่ อินพุต errorreturn; // นี่ต้องเป็นอินพุต}}/*** @return ผู้ใช้*/ผู้ใช้สาธารณะ getUser () {return user;}/*** @param ผู้ใช้ผู้ใช้ให้ตั้งค่า*/public void setuser (ผู้ใช้ผู้ใช้) {this.user = user;}}ข้างต้นคือฟังก์ชั่นการตรวจสอบข้อมูล Struts 2 และการแก้ปัญหาการตรวจสอบที่แนะนำโดยตัวแก้ไข ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!