2011-03-23 56 views
1

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

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

这可能发生的两种方式:1,你有多个包。其中一个软件包定义了您的自定义拦截器堆栈,另一个则没有。第一次不渲染视图,然后渲染会通过拦截器,2)如果您有多个渲染视图的操作并且您在拦截器上应用了拦截器,则也是可行的。

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

编辑:因为params拦截器不会在myInterceptor之前运行,所以它们的默认顺序和myInterceptor的顺序相反。

+0

对不起,但你没有回答在提供的限制问题。如果我刷新页面并使其工作,那么它必须遵循相同的路径。另外,我确实有日志记录。我已经记录了头文件已经发送,并且记录了如下所示的结果:“会话中设置的session.getAttribute(”value“)。它打印出来很好,告诉我它已经正确设置。 – geowa4 2011-03-25 04:36:10

+0

对不起,但我没有阅读以及应该的,答案被修改。 – Quaternion 2011-03-28 18:04:43

+0

不错........... – geowa4 2011-04-16 16:44:15