ใน struts2 ส่วนการกระทำนั่นคือเลเยอร์คอนโทรลเลอร์ใช้วิธีการบุกรุกต่ำ ทำไมคุณถึงพูดอย่างนั้น? นี่เป็นเพราะในคลาสแอ็คชั่น struts2 ไม่จำเป็นต้องสืบทอดคลาสฐานใด ๆ หรือใช้อินเทอร์เฟซใด ๆ และไม่ได้เชื่อมโยงโดยตรงกับ Servlet API มันมักจะเป็นเหมือน pojo ปกติ (โดยปกติควรมีวิธีการดำเนินการโดยไม่มีพารามิเตอร์) และสามารถกำหนดชุดของวิธีการ (ไม่มีวิธีการพารามิเตอร์) ในเนื้อหาและสามารถใช้เป็นการกระทำอิสระผ่านการกำหนดค่าจึงตระหนักถึงการใช้รหัสซ้ำ
ตัวอย่างเช่น:
ตัวอย่างแพ็คเกจ; คลาสสาธารณะผู้ใช้งาน {ชื่อผู้ใช้สตริงส่วนตัว; รหัสผ่านสตริงส่วนตัว String Public Execute () โยนข้อยกเว้น {// ……… .. ส่งคืน "ความสำเร็จ"; } สตริงสาธารณะ getUserName () {ส่งคืนชื่อผู้ใช้; } โมฆะสาธารณะ setUserName (ชื่อผู้ใช้สตริง) {this.userName = ชื่อผู้ใช้; } สตริงสาธารณะ getPassword () {ส่งคืนรหัสผ่าน; } โมฆะสาธารณะ setPassword (รหัสผ่านสตริง) {this.password = รหัสผ่าน; -Action Access Servlet
คุณสมบัติในคลาสแอ็คชั่นนี้สามารถห่อหุ้มพารามิเตอร์และผลลัพธ์กระบวนการ ระบบไม่ได้แยกแยะความแตกต่างอย่างเคร่งครัด
อย่างไรก็ตามเพื่อให้คลาสแอ็คชั่นที่ผู้ใช้พัฒนาได้มาตรฐานมากขึ้น Struts2 ให้การดำเนินการอินเทอร์เฟซแก่เราซึ่งกำหนดไว้ดังนี้:
การกระทำของ PublicInterface {PublicStaticFinal String Error = "ข้อผิดพลาด"; PublicStaticFinal String Input = "Input"; PublicStaticFinal String None = "None"; PublicStaticFinal String login = "เข้าสู่ระบบ"; PublicStaticFinal String Success = "Success"; String Public Execute () โยนข้อยกเว้น;}อย่างไรก็ตามเมื่อเราเขียนการกระทำเรามักจะไม่ใช้อินเทอร์เฟซ แต่สืบทอดการดำเนินการคลาสการใช้งานของอินเทอร์เฟซ
รหัสของคลาสนี้มีดังนี้:
การดำเนินการในชั้นเรียนสาธารณะใช้การดำเนินการที่ถูกต้อง, ValidationAware, TextProvider, LocaleProvider, serializable {............. โมฆะสาธารณะ setActionERrors (คอลเลกชัน errorMessages) {validationAware.SetActionErrors (errorMessages); } collection สาธารณะ getActionErrors () {return validationaware.getActionErrors (); } โมฆะสาธารณะ setActionMessages (ข้อความรวบรวม) {validationAware.SetActionMessages (ข้อความ); } collection สาธารณะ getActionMessages () {return validationAware.getActionMessages (); } คอลเล็กชันสาธารณะ geterRorMessages () {return getActionErrors (); } แผนที่สาธารณะ geterrors () {return getFielderRors (); } // ตั้งค่าฟิลด์การตรวจสอบฟิลด์ข้อผิดพลาดโมฆะสาธารณะ setFielderRors (แผนที่ errorMap) {validationaware.setFielderRors (errorMap); } แผนที่สาธารณะ getFielderRors () {return validationaware.getFielderRors (); } สถานที่สาธารณะ locale getLocale () {actionContext ctx = actionContext.getContext (); if (ctx! = null) {return ctx.getLocale (); } else {log.debug ("บริบทการดำเนินการไม่เริ่มต้น"); คืนค่า null; }} // เมธอดเพื่อรับข้อมูลระหว่างประเทศสตริงสาธารณะ getText (สตริง atextName) {ส่งคืน textProvider.getText (atextName); } สตริงสาธารณะ getText (สตริง atextName, สตริง defaultValue) {ส่งคืน textProvider.getText (atextName, defaultValue); } สตริงสาธารณะ getText (สตริง atextName, สตริง defaultValue, สตริง obj) {ส่งคืน textProvider.getText (atextName, defaultValue, obj); } ......... // วิธีที่ใช้ในการเข้าถึงแพ็คเกจทรัพยากรระหว่างประเทศ ResourceBundle GetTexts () {ส่งคืน textProvider.getTexts (); } Public ResourceBundle GetTexts (String unquildLename) {return textProvider.getTexts (undernlename); } // เพิ่มข้อความแสดงข้อผิดพลาดของการกระทำโมฆะสาธารณะ addactionError (สตริง anerrorMessage) {validationaware.addactionError (anerrorMessage); } // เพิ่มข้อมูลสามัญของการกระทำโมฆะสาธารณะ addactionMessage (amessage สตริง) {validationaware.addaCtionMessage (amessage); } โมฆะสาธารณะ addFielderRor (String fieldName, String errorMessage) {validationaware.addfielderror (ชื่อ FieldName, errorMessage); } void public validate () {} object clone () พ่น clonenotsupportedException {return super.clone (); -ดังที่ได้กล่าวไว้ก่อนหน้านี้ struts2 ไม่ได้เชื่อมโยงโดยตรงกับ Servlet API ดังนั้นจึงเข้าถึง Servlet API ได้อย่างไร
ปรากฎว่า Struts2 มีคลาส ActionContext ซึ่งจำลอง Servlet API วิธีการหลักมีดังนี้:
1) Object Get (Key Object): วิธีนี้จำลองวิธี HTTPSERVLETREQUEST.GETATTRIUME (ชื่อสตริง)
2) แผนที่ getApplication () ส่งคืนวัตถุแผนที่ที่จำลองอินสแตนซ์ servletContext
3) actionContext getContext (): รับอินสแตนซ์ ActionContext ของระบบ
4) แผนที่ getSession (): ส่งคืนวัตถุแผนที่ที่จำลองอินสแตนซ์ httpsession
5) แผนที่ getParameters (): รับพารามิเตอร์คำขอทั้งหมด, httpservletrequest.getParametermap จำลอง ()
คุณอาจสงสัยว่าทำไมวิธีการเหล่านี้จึงส่งคืนแผนที่เสมอ? นี่คือความสะดวกในการทดสอบเป็นหลัก สำหรับวิธีที่มันแปลงวัตถุแผนที่ด้วยอินสแตนซ์ Servlet API จริงเราไม่ต้องกังวลเกี่ยวกับเรื่องนี้เลยเพราะ Struts2 มีตัวดักจับในตัวเพื่อช่วยให้เราทำการแปลงนี้ให้เสร็จสมบูรณ์
ในการใช้ Servlet API โดยตรง struts2 ให้อินเทอร์เฟซต่อไปนี้แก่เรา
1) ServletContextAware: การกระทำที่ใช้อินเทอร์เฟซนี้สามารถเข้าถึงอินสแตนซ์ของ ServletContext ได้โดยตรง
2) ServletRequestaware: การดำเนินการที่ใช้อินเทอร์เฟซนี้สามารถเข้าถึงอินสแตนซ์ HTTPSERVLETREQUEST โดยตรง
3) ServletResponseAware: การดำเนินการที่ใช้อินเทอร์เฟซนี้สามารถเข้าถึงอินสแตนซ์ HTTPSERVLETRESSESPONSE โดยตรง
ส่วนใหญ่พูดคุยเกี่ยวกับการเข้าถึงเซิร์ฟเวอร์การดำเนินการ ลองมาดูกันว่าการกระทำของ Struts2 ใช้รหัสนำกลับมาใช้ซ้ำอย่างไร ยกตัวอย่างเช่น ถ้าฉันปล่อยให้การกระทำนี้จัดการทั้งการลงทะเบียนผู้ใช้และเข้าสู่ระบบ (longin) ฉันจะเขียนการกระทำนี้ใหม่ได้อย่างไร ผู้ใช้ที่เขียนใหม่มีดังนี้:
ตัวอย่างแพ็คเกจ; การเรียนรู้ระดับสาธารณะขยายการกระทำ actionsupport {ชื่อผู้ใช้สตริงส่วนตัว; รหัสผ่านสตริงส่วนตัว การลงทะเบียนสตริงสาธารณะ () โยนข้อยกเว้น {// ………… .. กลับมาประสบความสำเร็จ } การเข้าสู่ระบบสตริงสาธารณะ () พ่นข้อยกเว้น {// ……… .. ส่งคืนความสำเร็จ; } สตริงสาธารณะ getUserName () {ส่งคืนชื่อผู้ใช้; } โมฆะสาธารณะ setUserName (ชื่อผู้ใช้สตริง) {this.userName = ชื่อผู้ใช้; } สตริงสาธารณะ getPassword () {ส่งคืนรหัสผ่าน; } โมฆะสาธารณะ setPassword (รหัสผ่านสตริง) {this.password = รหัสผ่าน; - การกำหนดค่าการดำเนินการใน struts.xml
สามารถเขียนด้วยวิธีนี้ได้หรือไม่? แน่นอนมันไม่ได้ผล เราต้องกำหนดค่าไว้ในไฟล์ struts.xml มีสองวิธีการกำหนดค่า:
1) ใช้วิธีปกติในการระบุแอตทริบิวต์วิธีการสำหรับองค์ประกอบการกระทำ
<action name =” loginAction” class =” example.userAction” method =” การเข้าสู่ระบบ”> <ชื่อผลลัพธ์ =” ความสำเร็จ”>/success.jsp </result> </action> <action name =” registaction” class =” userAction” method =” regist”> <result name =” ความสำเร็จ”
2) ใช้ WildCards เพื่อระบุแอตทริบิวต์วิธีการสำหรับองค์ประกอบการกระทำ
<action name =”*action” class =” example.userAction” method =” {1}”> <name result =” ความสำเร็จ”>/success.jsp </result> </action>วิธีการใช้ไวด์การ์ดมีความยืดหยุ่นเกินไปและต่อไปนี้เป็นสถานการณ์การกำหนดค่าที่ซับซ้อนมากขึ้น
<action name =”*_*” class =” ตัวอย่าง {1} action” method =” {2}”> ………. </action>โดยที่ตัวยึด {1} ตรงกับ * ก่อนหน้าของ _ และ {2} ตรงกับถัดไป *
การกำหนดค่าการดำเนินการตามวิธีการเพิ่มความคิดเห็น:
การกำหนดค่าของการกระทำที่ฉันต้องการพูดคุยเกี่ยวกับด้านล่างไม่ได้อยู่ใน src/struts.xml แต่ข้อกำหนดเบื้องต้นสำหรับการกำหนดค่าโดยใช้คำอธิบายประกอบคือนอกเหนือจากแพ็คเกจหกขวดพื้นฐานคุณต้องใช้ struts-2.1.8.1/lib/struts2-convention-plugin-2.1.8.
อย่างไรก็ตาม struts.xml ยังต้องการตัวอย่างเฉพาะ
เข้าสู่ระบบ.jsp
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <! doctype html สาธารณะ "-// w3c // dtd html 4.01 transitional // en"> <html> <head> <head> content = "keyword1, keyword2, keyword3"> <meta http-equiv = "คำอธิบาย" content = "นี่คือหน้าของฉัน"> <!-<link rel = "stylesheet" type = "text/css" href = "styles.css">-> </head> action = "$ {pageContext.request.contextpath} /user/login.qqi" method = "post"> <table> <tr> <td> ชื่อผู้ใช้ </td> <td> <อินพุต type = "text" name = "loginName"/> </td> <td> <td> <td> name = "pwd"/> </td> </tr> <tr> <td colspan = "2"> <อินพุต type = "ส่ง" value = "เข้าสู่ระบบ"/> </td> </tr> </table> </form> </body> src/struts.xml
<span style = "Font-size: large;"> <? xml version = "1.0" การเข้ารหัส = "utf-8"?> <! doctype struts สาธารณะ "-// Apache Software Foundation // dtd struts การกำหนดค่า 2.1.7 // en" "http://struts.apache.org/dtds วิธีการเข้ารหัสพารามิเตอร์การร้องขอ-> <ค่าคงที่ = "struts.i18n.Encoding" value = "UTF-8"/> <!-ระบุประเภทคำต่อท้ายของคำขอที่ประมวลผลโดย struts2 หลายตัวคั่นด้วยเครื่องหมายจุลภาค-> <constant name = "struts.action.extension" value = "การกระทำ, ทำ, ไป, qqi"/> <!-เมื่อ struts.xml เปลี่ยนไปไม่ว่าจะโหลดซ้ำ ค่าเริ่มต้นเป็นเท็จ (ใช้ในสภาพแวดล้อมการผลิต) เป็นการดีที่สุดที่จะเปิดขั้นตอนการพัฒนา-> <constant name = "struts.configuration.xml.reload" value = "true"/> <!-ไม่ว่าจะใช้โหมดการพัฒนาของ struts จะมีข้อมูลการดีบักมากขึ้นในรูปแบบการพัฒนา ค่าเริ่มต้นเป็นเท็จ (ใช้ในสภาพแวดล้อมการผลิต) และเป็นการดีที่สุดที่จะเปิดขั้นตอนการพัฒนา-> <constant name = "struts.devmode" value = "false"/> <!-ตั้งค่าว่าเบราว์เซอร์แคชเนื้อหาคงที่ ค่าเริ่มต้นเป็นจริง (ใช้ในสภาพแวดล้อมการผลิต) เป็นการดีที่สุดที่จะปิดขั้นตอนการพัฒนา-> <constant name = "struts.serve.static.browsercache" value = "false" /> <!-ระบุว่าฤดูใบไม้ผลินั้นรับผิดชอบการสร้างวัตถุแอ็คชั่น <constant Name = "struts.objectFactory" name = "struts.enable.dynamicmethodinvocation" value = "false"/> </struts> </span>
loginaction.java
แพ็คเกจ com.javacrazyer.web.action; นำเข้า org.apache.struts2.convention.annotation.action; นำเข้า org.apache.struts2.convention.annotation.exceptionmapping; นำเข้า org.apache.struts2.convention.annotation.exceptionMappings; นำเข้า org.apache.struts2.convention.annotation.namespace; นำเข้า org.apache.struts2.convention.annotation.parentpackage; นำเข้า org.apache.struts2.convention.annotation.result; นำเข้า org.apache.struts2.convention.annotation.results; นำเข้า com.opensymphony.xwork2.actionsupport; /** * ใช้คำอธิบายประกอบเพื่อกำหนดค่าการกระทำ * */@parentPackage ("struts-default") // แพ็คเกจพาเรนต์ @Namespace ("/ผู้ใช้") @Results ({@Result (name = "Success", location = "/msg.jsp"), @Result (name = "ข้อผิดพลาด" "java.lange.runtimeException", result = "ข้อผิดพลาด")}) การเข้าสู่ระบบระดับสาธารณะขยายการกระทำ asctative {ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = -2554018432709689579L; สตริงส่วนตัวเข้าสู่ระบบชื่อ; สตริงส่วนตัว PWD; @Action (value = "เข้าสู่ระบบ") การเข้าสู่ระบบสตริงสาธารณะ () โยนข้อยกเว้น {ถ้า ("qq" .equals (loginName) && "123" .Equals (PWD)) {คืนความสำเร็จ; } else {return error; }} @Action (value = "เพิ่ม", results = {@Result (name = "ความสำเร็จ", location = "/index.jsp")}) สตริงสาธารณะเพิ่ม () โยนข้อยกเว้น {คืนความสำเร็จ; } สตริงสาธารณะ getLoginName () {ส่งคืน loginName; } โมฆะสาธารณะ setLoginName (สตริง loginName) {this.loginName = loginName; } สตริงสาธารณะ getpwd () {return pwd; } โมฆะสาธารณะ setpwd (สตริง pwd) {this.pwd = pwd; -
ฉันจะไม่โพสต์ success.jsp และ error.jsp
คำอธิบายการกำหนดค่าคำอธิบายประกอบ
1) @ParentPackage ระบุแพ็คเกจหลัก
2) @namespace ระบุเนมสเปซ
3) @Results อาร์เรย์ของผลลัพธ์
4) @Result (name = "ความสำเร็จ", location = "/msg.jsp") การแมปของผลลัพธ์
5) @Action (value = "เข้าสู่ระบบ") ระบุ URL คำขอสำหรับวิธีการประมวลผลคำขอ โปรดทราบว่าไม่สามารถเพิ่มลงในคลาสแอ็คชั่นลงในวิธีการ
6) @ExceptionMappings อาร์เรย์ของการประกาศระดับแรกของข้อยกเว้น
7) @ExceptionMapping แผนที่ข้อยกเว้นการประกาศ
เนื่องจากวิธีนี้ไม่ได้ใช้กันมากคุณสามารถเข้าใจได้เท่านั้น