Struts 2:返回调用页面
我正在使用Struts 2.
我想从一个Action返回到调用它的页面。
假设我在页面x.jsp中,我调用Visual动作来更改会话中的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.
解决方案
回答
return INPUT;
会成功的INPUT常量在Action接口本身中定义。这表明行动需要更多的投入。
通过调用page(如果意思是将我们带到操作输入页面的页面),则输入页面将必须在Action的请求范围中存储HTTP标头" Referer"。
回答
我们可以在struts.xml中使用动态结果。例如:
<action name="Visual" class="it.___.web.actions.VisualizationAction"> <result name="next">${next}</result> </action>
然后在操作中,创建一个名为next的字段。因此,要调用该动作,我们将传递我们想要转发到下一个页面的名称。然后该操作返回" next",struts将知道要转到哪个页面。
这篇文章有一个更好的解释:堆栈溢出
回答
当我们通过特定操作导航用户时,我更喜欢这种方式。
http://domain.com/myAction.action
我们可以使用一些参数作为指标,以更改当前设计:
IE。
http://domain.com/myAction.action?changeDesign=silver_theme
因此,然后编写一些struts 2拦截器,该逻辑是检查此类参数'changeDesign'的存在,并且该拦截器将完成更改设计的必要工作并控制工作流程。使用拦截器,我们可以使操作与横切逻辑脱钩。
回答
我的解决方案将涉及一个接口和一个拦截器。我们为可能要重定向到的所有操作实现以下接口:
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接口(如果我们希望重定向到它们),那么我们就可以在需要时访问JSP中的target参数。将该参数传递给" VisualizationAction"(可能还实现" TargetAware"接口!),并在" SUCCESS"上,按照Vincent Ramdhanie的说明进行重定向:
<action name="Visual" class="it.___.web.actions.VisualizationAction"> <result type="redirect"> <param name="location">${target}</param> <param name="parse">true</param> </result> </action>
我没有尝试此策略的每个细节。特别要提防有关"重定向"结果类型的表示法(取决于Struts2特定版本:2.0.x和2.1.x在此上可能有所不同...)。
回答
好的,在类___。web.actions.VisualizationAction中,我们必须返回一个包含INPUT的字符串值,然后,在struts.xml上我们必须设置以下内容:
<action name="Visual" class="it.___.web.actions.VisualizationAction"> <result name="input">yourJspPage.jsp</result> </action>
这将带我们进入所需的页面。
这应该可以工作,我已经在两个月的时间里从事struts2的工作了