webwork做的网站,现在需要无论从网站任何一个页面进入网站,都能先从后台查询变量x然后设置变量x到session里,然后再在这个页面里把变量x取出来。
先在我的网站数据库中有个库存变量storage,int类型。设计网站时只是在打开首页index.jsp的时候先执行了后台index.action在里面查询了storage,然后设置到session中,在index.jsp页面中取到storage。但是如果首先打开其他页面由于没有先执行后台index.action,所以在这个页面取不到storage。我想在过滤器里打开每个页面时执行查询操作设置storage到session中,但是由于webwork中HttpSession httpSession = ServletActionContext.getRequest().getSession();但是由于不是在webwork的action中,所以ServletActionContext.getRequest()取到的request为空会报异常,所以该咋办?
楼主,看来你对serlvet-jsp编程的基础方面有些薄弱。不管是用struts1,struts2,还是webwork。他们的原理都还是jsp-serlvet,所以,你也可以直接使用jsp-servlet编程。
所以你提到的过滤器里可以直接使用楼上所说的request.getSession(0;只不过,这里的request需要由ServletRequest 强制转换成HttpServletRequest。不要怀疑,直接强制转换即可!
当然就这个问题,我想说的还不止这些,关于思路方面,我觉得你的这个思路未免把问题看得太复杂。
事实上,你只需要写一个servlet,设置这个servlet在服务器启动的时候跟随启动[在web.xml里配置]
比如[code="java"]
JSPSupportServlet
org.apache.struts2.views.JspSupportServlet
4
[/code]
在这个servlet里把你的库级变量存到application里,虽然我不知道你的需求。但是,如果是放到session里,对于每个用户都有一个session.这就如同多线程,你的这个变量并非线程安全的,就是说用户A拿了变量a后,用户B可能会执行修改变量a的行为。而反过来当用户A执行更新行为的时候,那么这个变量就已经是无效数据了,比如用户A拿到得是100,用户B拿到的是100,此时用户B执行了+1,那么数据库里是101了,但用户A手上还是100,用户A在执行+1后也是101,然后存入数据库,显然,本来应该是100+1+1=102的。所以我建议你建立一起全局变量,public static a;
并且在对a进行更新的方法内部必须调用加载a变量的方法。这样,在执行操作前变量a始终是最新的。
我猜测你是做一个访问量统计吧,应该是类似的东西。但也许不是,希望对你有帮助。如果不是就权当讨论。
在过滤器中就直接用
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2)
参数的ServletRequest arg0
public class AuthorizationInterceptor extends AbstractInterceptor {
private String gn;
public String intercept(ActionInvocation ai) throws Exception {
Map sess = ai.getInvocationContext().getSession();
HttpServletRequest request = (HttpServletRequest) ai
.getInvocationContext().get(ServletActionContext.HTTP_REQUEST);
return ai.invoke();
}