في Struts2 ، جزء الحركة ، أي طبقة وحدة التحكم ، تعتمد طريقة تدخل منخفضة. لماذا تقول ذلك؟ هذا لأنه في Struts2 Action Class لا يحتاج إلى ورث أي فئة أساسية أو تنفيذ أي واجهة ، كما أنه لا يقترن مباشرة مع واجهة برمجة تطبيقات Servlet. عادة ما يكون الأمر أشبه بـ POJO العادي (يجب أن يحتوي عادةً على طريقة تنفيذ بدون معلمات) ، ويمكنه تحديد سلسلة من الطرق (لا توجد طرق معلمة) في المحتوى ، ويمكن استخدامها كعمل مستقل من خلال التكوين ، وبالتالي تحقيق إعادة استخدام التعليمات البرمجية.
على سبيل المثال:
حزمة مثال ؛ فئة عامة مستخدم {private string username ؛ كلمة مرور السلسلة الخاصة ؛ السلسلة العامة تنفيذ () رمي الاستثناء {// ............ إرجاع "النجاح" ؛ } السلسلة العامة getUserName () {return username ؛ } public void setusername (string username) {this.userName = username ؛ } السلسلة العامة getPassword () {return password ؛ } public void setPassword (سلسلة كلمة مرور) {this.password = password ؛ }}عمل Action Access Servlet
يمكن للخصائص في فئة الإجراء هذه أن تُغلف المعلمات ونتائج المعالجة. النظام لا يميزهم بدقة.
ومع ذلك ، من أجل جعل فئة الإجراءات التي تم تطويرها أكثر موحدة ، توفر لنا Struts2 إجراء واجهة ، يتم تعريفه على النحو التالي:
ActionInterface Action {publicstaticfinal string error = "error" ؛ publicstaticfinal string input = "input" ؛ سلسلة publicstaticfinal none = "none" ؛ publicstaticfinal سلسلة تسجيل الدخول = "تسجيل الدخول" ؛ PublicStaticFinal String Success = "Success" ؛ السلسلة العامة تنفيذ () رمي الاستثناء ؛}ومع ذلك ، عندما نكتب الإجراء ، فإننا عادة لا ننفذ الواجهة ، ولكن نرث إجراءات فئة التنفيذ للواجهة.
رمز هذه الفئة كما يلي:
تقوم إجراءات الطبقة العامة بتنفيذ الإجراءات ، القابلة للتحقق من الصحة ، TextProvider ، LocaleProvider ، قابلة للتسلسل {............. } Collection GetActionErrors () {return valideAware.getActionErrors () ؛ } public void setActionMessages (رسائل التجميع) {ValidayAware.SetActionMessages (الرسائل) ؛ } collection getActionMessages () {return validentaware.getActionMessages () ؛ } collection geterrormessages () {return getActionErrors () ؛ } الخريطة العامة geterRors () {return getFielderrors () ؛ }. } الخريطة العامة getFielderRors () {return validentAware.getFielderRors () ؛ } public locale getLocale () {ActionContext ctx = actionContext.getContext () ؛ if (ctx! = null) {return ctx.getlocale () ؛ } آخر {log.debug ("سياق الإجراء غير تهيئة") ؛ العودة لاغية. }} // method للحصول على المعلومات الدولية السلسلة العامة getText (string atextName) {return textProvider.getText (atextName) ؛ } السلسلة العامة getText (String atextName ، String defaultValue) {return textProvider.getText (atextName ، defaultValue) ؛ } السلسلة العامة getText (String atextName ، String defaultValue ، String OBJ) {return textProvider.getText (atextName ، defaultValue ، OBJ) ؛ } ......... // الأساليب المستخدمة للوصول إلى حزم الموارد الدولية ResourceBundle getTexts () {return textProvider.getTexts () ؛ } public ResourceBundle getTexts (String AbundLename) {return textProvider.getTexts (AmbundLename) ؛ }. }. } public void addfielderror (string fieldName ، errormessage) {validayaware.addfielderror (fieldName ، errormessage) ؛ } void public void viadiated () {} clone clone () remons clonenotsupportedException {return super.clone () ؛ } .........}كما ذكرنا سابقًا ، لا يقترن Struts2 بشكل مباشر مع واجهة برمجة تطبيقات Servlet ، فكيف يمكنه الوصول إلى واجهة برمجة تطبيقات Servlet؟
اتضح أن Struts2 يوفر فئة ActionContext ، والتي تحاكي واجهة برمجة تطبيقات servlet. الطرق الرئيسية هي كما يلي:
1) الكائن الحصول على (مفتاح الكائن): تحاكي هذه الطريقة طريقة httpservletrequest.getattribute (اسم السلسلة).
2) خريطة getApplication () إرجاع كائن خريطة يحاكي مثيل ServletContext.
3) static ActionContext getContext (): احصل على مثيل ActionContext للنظام.
4) خريطة getSession (): إرجاع كائن خريطة يحاكي مثيل HTTPSENESS.
5) خريطة getParameters (): الحصول على جميع معلمات الطلب ، محاكاة httpservletrequest.getParameterMap ()
قد تتساءل لماذا تعيد هذه الطرق دائمًا الخريطة؟ هذا أساسا لسهولة الاختبار. أما بالنسبة لكيفية تحويل كائنات MAP مع مثيلات API Servlet الفعلية ، فإننا لا نقلق بشأن هذا على الإطلاق ، لأن Struts2 يحتوي على اعتراضات مدمجة لمساعدتنا على إكمال هذا التحويل.
من أجل استخدام واجهة برمجة تطبيقات Servlet مباشرة ، يوفر لنا Struts2 الواجهات التالية.
1) ServletContextAware: الإجراء الذي ينفذ هذه الواجهة يمكنه الوصول مباشرة إلى مثيل ServletContext.
2) ServletRequestAware: الإجراء الذي ينفذ هذه الواجهة يمكنه الوصول مباشرة إلى مثيل httpservletrequest.
3) ServletResponsearware: الإجراء الذي ينفذ هذه الواجهة يمكنه الوصول مباشرة إلى مثيل httpservletresponse.
ما سبق يتحدث بشكل رئيسي عن عمل Servlets Action Access. دعونا نلقي نظرة على كيفية إعادة استخدام STRUTS2. خذ عامل المستخدم على سبيل المثال. إذا سمحت لهذا الإجراء بالتعامل مع كل من تسجيل المستخدم وتسجيل الدخول (Longin) ، فكيف يمكنني إعادة كتابة هذا الإجراء؟ المعالجة المعاد كتابتها هي كما يلي:
Package Movement ؛ Useraction Public Class يمتد ActionSupport {private String username ؛ كلمة مرور السلسلة الخاصة ؛ تسجيل السلسلة العامة () يلقي استثناء {// ................. إرجاع النجاح ؛ } سلسلة تسجيل الدخول العامة () يلقي استثناء {// ........... } السلسلة العامة getUserName () {return username ؛ } public void setusername (string username) {this.userName = username ؛ } السلسلة العامة getPassword () {return password ؛ } public void setPassword (سلسلة كلمة مرور) {this.password = password ؛ }} تكوين الإجراء في Struts.xml
هل من المقبول أن تكتب بهذه الطريقة؟ بالطبع ، لا يعمل. يجب علينا أيضًا تكوينه في ملف Struts.xml. هناك طريقتان للتكوين:
1) استخدم طريقة طبيعية لتحديد سمة الطريقة لعنصر الإجراء.
<action name = "loginAction" class = "example.userAction" method = "login"> <result name = "success">/success.jsp </sults
2) استخدم الأرقام البرية لتحديد سمة الطريقة لعنصر الإجراء.
<Action Name = "*Action" class = "example.userAction" method = "{1}"> <result name = "success">/success.jsp </redress> </uction>طريقة استخدام البطاقات البرية مرنة للغاية ، والما يلي هو موقف تكوين أكثر تعقيدًا.
<اسم الإجراء = "*_*" class = "مثال. {1} الإجراء" method = "{2}"> .........حيث يتطابق العنصر النائم {1} مع * السابق لـ _ ، و {2} يطابق التالي *.
تكوين الإجراء بناءً على طريقة التعليقات التوضيحية:
إن تكوين الإجراء الذي أريد التحدث عنه أدناه ليس في SRC/Struts.xml ، ولكن الشرط المسبق لتكوينه باستخدام التعليقات التوضيحية هو أنه بالإضافة إلى حزم الجرة الستة الأساسية ، تحتاج أيضًا
ومع ذلك ، لا يزال struts.xml يحتاج إلى أمثلة محددة
login.jsp
<٪@ page language = "java" import = "java.util.*" pageencoding = "utf-8" ٪> <! doctype html public "-// w3c // dtd html 4.01 transitional // en"> <html> <head> content = "keyword1 ، keyword2 ، keyword3"> <meta http-equiv = "description" content = "this is is my page"> <!-<link rel = "stylesheet" type = "text/css" href = "hr/>- ACTION = "$ {pagecontext.request.contextpath} /user/login.qqi" method = "post"> <tتم name = "pwd"/> </td> </tr> <tr> <td colspan = "2"> <إدخال type = "إرسال" value = "login"/> </td> </tr> </table> </form> </body> </html> SRC/Struts.xml
<span style = "font-size: large ؛"> <؟ xml version = "1.0" inchoding = "utf-8"؟> <! doctype struts public "-// apache software found طريقة الترميز لمعلمات الطلب-> <name name = "struts.i18n.encoding" value = "UTF-8"/> <!-حدد نوع لاحقة الطلب التي تمت معالجتها بواسطة Struts2. متعددة مفصولة بالفواصل-> <name constant = "struts.action.extense" value = "الإجراء ، القيام ، اذهب ، QQI"/> <!-عندما يتم تغيير struts.xml ، سواء أكان إعادة تحميل. القيمة الافتراضية خاطئة (المستخدمة في بيئة الإنتاج) ، من الأفضل فتح مرحلة التطوير-> <name struts.configuration.xml.reload "value =" true "/> <!-سواء لاستخدام وضع تطوير الدعامات. سيكون هناك المزيد من معلومات التصحيح في نموذج التطوير. القيمة الافتراضية خاطئة (المستخدمة في بيئة الإنتاج) ، ومن الأفضل فتح مرحلة التطوير-> <name struts.devmode "value =" false "/> <!-اضبط ما إذا كان المتصفح يخبئ المحتوى الثابت. القيمة الافتراضية صحيحة (المستخدمة في بيئة الإنتاج) ، من الأفضل إغلاق مرحلة التطوير-> <name constate = "struts.serve.static.static.browsercache" value = "false" /> <!-حدد أن الربيع مسؤول عن إنشاء كائن الإجراء <struts.ObjectFactory "value =" spring " />- 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") // Parent package @namespace ("/user") results ({result (name = "success" ، location = "/msg.jsp") ، result (name = "error" ، sitial = "/"/} "java.lange.runtimeexception" ، result = "error")}) تمديد وضع تسجيل الدخول إلى الفئة العامة Actionupport {Private Static Final Long SerialVersionuid = -2554018432709689579L ؛ سلسلة تسجيل الدخول الخاصة ؛ سلسلة خاصة PWD ؛ @action (value = "login") login public string () يلقي الاستثناء {if ("qq" .equals (loginName) && "123" .equals (pwd)) {return success ؛ } آخر {عودة خطأ ؛ }} @action (value = "add" ، النتائج = {result (name = "success" ، location = "/index.jsp")}) السلسلة العامة add () رمي الاستثناء {return success ؛ } السلسلة العامة getLoginName () {return loginName ؛ } public void setLoginName (سلسلة loginName) {this.loginName = logInName ؛ } السلسلة العامة getPwd () {return pwd ؛ } public void setPwd (String pwd) {this.pwd = pwd ؛ }}
لن أنشر Success.jsp و Error.jsp
شرح تكوين التعليق التوضيحي
1) parentPackage حدد الحزمة الأصل
2) namespace حدد مساحة الاسم
3) ترحيل مجموعة من النتائج
4) result (name = "Success" ، location = "/msg.jsp") رسم خرائط للنتائج
5) @action (value = "login") يحدد عنوان URL للطلب لطريقة معالجة الطلب. لاحظ أنه لا يمكن إضافتها إلى فئة الإجراء ، إلى الطريقة.
6) exceptionMappings صفيف إعلان الاستثناءات من المستوى الأول
7) exceptionmapping خريطة استثناء إعلان
نظرًا لأن هذه الطريقة ليست شائعة الاستخدام ، يمكنك فهمها فقط