سؤال

أنا استخدم الدعامات 2.

أرغب في العودة من الإجراء إلى الصفحة التي استدعته.

قل أنا في الصفحة x.jsp, ، أقوم باستدعاء الإجراء المرئي لتغيير تفضيلات CSS في الجلسة؛أريد العودة إلى x.jsp بدلاً من صفحة ثابتة (أي home.jsp)

وهنا ذات الصلة struts.xml شظية:

<action
   name="Visual"
   class="it.___.web.actions.VisualizationAction">
   <result name="home">/pages/home.jsp</result>
</action>

بالطبع بلدي VisualizationAction.execute() عائدات بيت.

هل هناك أي ثابت "سحري" (مثل INPUT_PAGE على سبيل المثال) يمكنني العودة إليه للقيام بالخدعة؟

هل يجب علي استخدام طريقة أكثر مشاركة (أي؟استخراج صفحة الطلب وإعادة توجيهها إليها)؟

T.I.A.

هل كانت مفيدة؟

المحلول

يمكنك استخدام نتيجة ديناميكية في ملف struts.xml.على سبيل المثال:

<action
   name="Visual"
   class="it.___.web.actions.VisualizationAction">
   <result name="next">${next}</result>
</action>

ثم في الإجراء الخاص بك، يمكنك إنشاء حقل يسمى التالي.لذلك، لاستدعاء الإجراء، سوف تقوم بتمرير اسم الصفحة التي تريد إعادة توجيهها إلى الصفحة التالية.يقوم الإجراء بعد ذلك بإرجاع "التالي" وستعرف الدعامات الصفحة التي ستنتقل إليها.

هناك شرح أجمل في هذه المشاركة: تجاوز سعة المكدس

نصائح أخرى

return INPUT;

سوف تفعل الخدعة.يتم تعريف ثابت INPUT في واجهة الإجراء نفسها.إنه يشير إلى أن الإجراء يحتاج إلى مزيد من المدخلات.

من خلال استدعاء الصفحة، إذا كنت تقصد الصفحة التي تنقلك إلى صفحة إدخال الإجراء، فسيتعين على صفحة الإدخال الخاصة بك تخزين رأس HTTP "المرجع" في نطاق الطلب للإجراء.

سيتضمن الحل الخاص بي واجهة واحدة ومعترضًا واحدًا.يمكنك تنفيذ الواجهة التالية لجميع الإجراءات الذي من المحتمل أنك تريد إعادة التوجيه:

public interface TargetAware {
  public String getTarget();
  public void setTarget(String target);
}

يضمن المعترض ببساطة تحديد الهدف، إذا لزم الأمر:

public class SetTargetInterceptor extends MethodFilterInterceptor implements Interceptor {
   public String doIntercept(ActionInvocation invocation) {
      Object action = invocation.getAction();
      HttpServletRequest request = (HttpServletRequest) invocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
      if (action instanceof TargetAware) {
         TargetAware targetAwareAction = (TargetAware) action;
         if (targetAwareAction.getTarget() == null)
            targetAwareAction.setTarget(getCurrentUri(request));
      }     
      return invocation.invoke();
   }

   // I'm sure we can find a better implementation of this...
   private static String getCurrentUri(HttpServletRequest request) {
      String uri = request.getRequestURI();
      String queryString = request.getQueryString();
      if (queryString != null && !queryString.equals(""))
         uri += "?" + queryString;
      return uri;
   }

   public void init() { /* do nothing */ }
   public void destroy() { /* do nothing */ }
}

من الآن فصاعدًا، بمجرد وضع هاتين القطعتين في مكانهما الصحيح وتنفيذ أفعالك TargetAware الواجهة (إذا كنت تتوقع أن تضطر إلى إعادة التوجيه إليهم)، فيمكنك الوصول إلى ملف target المعلمة في JSPs الخاصة بك كلما كنت في حاجة إليها.قم بتمرير هذه المعلمة إلى ملفك VisualizationAction (والتي قد تنفذ أيضًا TargetAware واجهة!) ، وعلى SUCCESS, ، إعادة التوجيه كما أوضح فنسنت رمضاني:

<action name="Visual" class="it.___.web.actions.VisualizationAction">
   <result type="redirect">
      <param name="location">${target}</param>
      <param name="parse">true</param>
   </result>
</action>

لم أجرب كل تفاصيل هذه الإستراتيجية.على وجه الخصوص، احذر من التدوين المحيط بـ redirect نوع النتيجة (اعتمادًا على الإصدار المحدد من Struts2:قد يختلف الإصداران 2.0.x و2.1.x في هذا الشأن...).

أفضّل الطريقة التي تتنقل بها بين المستخدمين من خلال إجراءات معينة.

http://domain.com/myAction.action

يمكنك استخدام بعض المعلمات كمؤشر، الذي تريد تغيير التصميم الحالي:أي.

http://domain.com/myAction.action?changeDesign=silver_theme

بعد ذلك، تكتب بعض المعترضات الدعامية 2، وهو المنطق الذي يتمثل في التحقق من وجود مثل هذه المعلمة "changeDesign"، وسيقوم هذا المعترض بالعمل الضروري لتغيير التصميم وسيتحكم في سير العمل.باستخدام المعترض، يمكنك فصل أفعالك عن المنطق الشامل.

حسنًا، في صفك it.____.web.actions.VisualizationAction، يجب عليك إرجاع قيمة سلسلة تحتوي على INPUT، ثم في struts.xml عليك تعيين شيء مثل هذا:

<action name="Visual" class="it.___.web.actions.VisualizationAction">
   <result name="input">yourJspPage.jsp</result>
</action>

سيقودك هذا إلى الصفحة التي تريدها.من المفترض أن ينجح هذا، لقد كنت أعمل على الدعامات 2 لمدة شهرين

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