在我刷新之前,JSP中没有Struts2会话数据

时间:2011-03-23 04:39:01

标签: java jsp session struts2

我正在构建一个Struts2应用程序,其中数据在请求标头中发送到我的应用程序。我有一个自定义拦截器,它抓取这些数据并使用它从数据库中检索一些数据并将其存储在会话中。然后,我在结果JSP中使用此会话数据。一个问题:在刷新页面之前,会话变量为空。

这是我的堆栈:

<interceptor-stack name="myStack">
    <interceptor-ref name="myInterceptor"/>
    <interceptor-ref name="defaultStack"/>
</interceptor-stack>

这是我在myInterceptor中的拦截方法:

ActionContext context = invocation.getInvocationContext();
HttpServletRequest request = (HttpServletRequest) context.get(StrutsStatics.HTTP_REQUEST);
HttpSession session =  request.getSession(true);

MyObject obj = new MyObject();
String header = request.getHeader("HEADER_VALUE");
if(header != null) {
    obj.loadByHeader(header);
    session.setAttribute("value", obj);
}
return invocation.invoke();

这是JSP代码:

<s:if test="#session.value == null">
    ...
</s:if>

就像我说的,当我刷新或使用此值转到另一个页面时,这是有效的。难道我做错了什么?或者直到下一次才能获得价值?如果是后者,是否有另一种方法可以在第一次通过时获取数据?

1 个答案:

答案 0 :(得分:1)

您应该可以设置并一次性使用它!我没有看到你提供的任何问题,我的猜测是你第一次渲染你的视图而不通过你的拦截器。

这可能有两种方式:1,你有多个包。其中一个包定义了您的自定义拦截器堆栈,另一个没有。第一次没有渲染视图,然后后续渲染确实通过你的拦截器传递,2)如果你有多个动作来渲染视图,你也可以在动作级别应用拦截器。

将打印/记录消息抛出到拦截器中,并确保它在您认为是正在执行时。

编辑:defaultStack和myInterceptor的逆序,因为params拦截器不会在myInterceptor之前运行。