عمل Struts2 لا يتصل بشكل صحيح
-
21-09-2019 - |
سؤال
على الافتراضي ، أريد أن يتم توجيه تطبيق Struts2 الخاص بي إلى إجراء:
<?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.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<package name="myApp" namespace="/myApp" extends="struts-default">
<action name="Login_*" method="{1}" class="myApp.SessionManager">
<result name="input">/myApp/Login.jsp</result>
<result type="redirectAction">Menu</result>
</action>
</package>
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">Login_input.action</param>
<param name="namespace">/myApp</param>
</result>
</action>
</package>
</struts>
أنا أبحث عن التطبيق لاتصال SessionManager.input () ، ولكن بدلاً من ذلك يدعو SessionManager.execute ().
المحلول
أنت لا تريد عادة الجمهور إدخال() طريقة. السيناريو الأساسي والنموذجي لعمل ما هو:
- يهدف الإجراء إلى "القيام بشيء ما" (شيء واحد) ، وهذا الإجراء يحتاج إلى بعض مدخلات المستخدم.
- الإجراء يفعل من شيء في الطريقة ينفذ()
- إذا كان الإجراء قد فعل هذا شيئًا ما ، فإنه يحفظ نجاح. هذا يؤدي إلى نتيجة jsp بالمعلومات.
- إذا لم يحصل الإجراء على إدخال المستخدم (لأنه لم يكن هناك أي ، أو لأنه لم يكن كافيًا أو خطأ) ، فإنه يعود إدخال. يؤدي هذا إلى "نموذج الإدخال" JSP حتى يتمكن المستخدم من ملء البيانات و (إعادة) تجربة الإجراء.
الآن ، يمكن ترميز هذا السيناريو الأساسي بعدة طرق ، من بينها:
1) تعيينان مختلفان ، أحدهما لنموذج الإدخال ، والآخر للتنفيذ
<!-- default action class: execute does nothing, returns SUCCES -->
<action name="ActionXXXShowForm">
<result>/myApp/XXXForm.jsp</result>
</action>
<action name="ActionXXX" class="myApp.XXXAction">
<result name="input">/myApp/XXXForm.jsp</result>
<result>/myApp/XXXDone.jsp</result>
</action>
2) رسم خرائط واحد فقط
<action name="ActionXXX" class="myApp.XXXAction">
<result name="input">/myApp/XXXForm.jsp</result>
<result>/myApp/XXXDone.jsp</result>
</action>
كلاهما متشابه جدًا (خاصة إذا كان لديك التحقق من صحة البرنامج). في كلتا الحالتين ، ليس لدينا سوى طريقة "دعامات" في الإجراء (ينفذ) ، وهي ممارسة جيدة مثل عملنا فقط "يفعل شيئًا واحدًا". ولكن في الحالة الثانية ، نحتاج إلى التعامل مع الحالة التي لا يتم فيها نشر أي بيانات ، ولا تنبعث منها رسالة خطأ لهذه الحالة.
مثال: في الحالة 1:
public class XXXAction extends ActionSupport {
...
public String execute() throws Exception {
if(! inputOk()) return INPUT;
// .. do your stuff
return SUCCESS;
}
private boolean inputOk() {
// ... check your inputs - sort of programatic validation
if( surname == null ) addActionError("no surname");
// .... more checks
return ! hasActionErrors());
}
}
في الحالة 2 ، تقوم بتعديله قليلاً:
public class XXXAction extends ActionSupport {
....
public String execute() throws Exception {
if( emptyInput() ) return INPUT; // no error messages in this case
if(! inputOk()) return INPUT;
// .. do your stuff
return SUCCESS;
}
private boolean inputOk() {
// same as before
}
private boolean emptyInput() {
// detect no input was sent. do not emit errors herer
}
}
نصائح أخرى
عند استدعاء إجراءات من JSP ، فإن الطريقة الافتراضية هي تنفيذ (). إذا كنت ترغب في استدعاء طريقة أخرى ، فيمكنك المواصفات بواسطة طريقة السمة = "".
<s:url action="SessionManager" method="input"/>
طريقة السمة شائعة على العلامات الأخرى.
إذا كنت تستخدم أ <s:a...
العلامة ، ثم لن تتمكن من الاتصال بالطريقة المقصودة بصرف النظر عن طريقة التنفيذ الافتراضي (). بدلاً من <s:a...
العلامة ، تحتاج إلى تحديد الإجراء باستخدام <s:url...
علامة مع معرف واتصل بنفسه باستخدام علامة مرساة HTML العادية IE. ،<a href=${<<id>>}
ولكن قد تحتاج إلى تحديد الطريقة في Struts.xml أو أي ملف تكوين XML آخر ، والذي قمت بتضمينه في ملف STRuts.xml الخاص بك مع سمة الطريقة في الخاص بك <action... method="..."
بند.