我正在使用 Struts 2。
我想从一个动作返回到调用它的页面。
假设我在页面 x.jsp 中,我调用 Visual 操作来更改会话中的 CSS 首选项;我想返回 x.jsp 而不是固定页面(即 home.jsp)
这里是相关的 struts.xml Fragments:
1 2 3 4 5
| 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 中使用动态结果。例如:
1 2 3 4 5
| action
name="Visual"
class="it.___.web.actions.VisualizationAction"
result name="next"${next}/result
/action |
然后在您的操作中,您创建一个名为 next 的字段。因此,要调用该操作,您将传递下一个要转发到的页面的名称。然后该操作返回"下一个",struts 将知道要转到哪个页面。
这篇文章有一个更好的解释:Stack Overflow
我的解决方案将涉及一个接口和一个拦截器。您为可能要重定向到的所有操作实现以下接口:
1 2 3 4
| public interface TargetAware {
public String getTarget();
public void setTarget(String target);
} |
如果需要,拦截器只是确保设置了目标:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 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) 的解释进行重定向:
1 2 3 4 5 6
| 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 可能会有所不同...)。
会成功的。 INPUT 常量在 Action 接口本身中定义。它表示动作需要更多输入。
如果您是指将您带到操作输入页面的页面,则通过调用页面,那么您的输入页面将必须在操作的请求范围内存储 HTTP 标头"Referer"。
好的,在你的类中.___.web.actions.VisualizationAction,你必须返回一个包含INPUT的字符串值,然后,在struts.xml上你必须设置这样的东西:
1 2 3
| action name="Visual" class="it.___.web.actions.VisualizationAction"
result name="input"yourJspPage.jsp/result
/action |
这会将您带到您想要的页面。
这应该可行,我在 struts2 上工作了 2 个月
我更喜欢通过特定操作引导用户的方式。
http://domain.com/myAction.action
你可以使用一些参数作为指标,你想改变当前的设计:
即
http://domain.com/myAction.action?changeDesign=silver_theme
那么,你编写了一些struts 2拦截器,其逻辑是检查是否存在这样的参数'changeDesign',这个拦截器将完成改变设计的必要工作并控制工作流程。使用拦截器,您可以将您的操作与横切逻辑分离。