سؤال

على الافتراضي ، أريد أن يتم توجيه تطبيق 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="..." بند.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top