java如何在一个普通的类中获取request对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java如何在一个普通的类中获取request对象相关的知识,希望对你有一定的参考价值。

java如何在一个普通的类中获取request对象

你是指你的 web 项目中使用到一个工具性的类,它的形参中没有 HttpRequest 或 HttpSession 参数?


如果是这样的话,我们需要使用一个 ThreadLocal 变量,我们把当前  request 的变量绑定到里面,在一个 request 请求的生命周期内我们在方法调用的各个更深的层次中都可以直接使用它而不需要在每个方法中都传递这个 request 参数,保存在某个地方就容易导致因为多个请求共用同一个实例而出问题,所有 context 相关的变量不保存在任何业务类相关并且可能被多线程共用的对象实例中才是保证不会出现线程安全问题的途径。


例如,这个例子中我们只要把 web.xml 中配置好 ContextFilter 后它就会自动在请求开始时绑定一个 context,结束后自动销毁,在这中间的任何时刻我们都可以通过 MyWebContext.getCurrentContext() 得到我们的 HttpServletRequest 实例和其它相关的 context 变量:

// MyWebContext 记录当前 Request 的所有 context 变量。因为 servlet 是一个请求绑定一个线程的,我们用 ThreadLocal 不会有线程安全问题。
 
class MyWebContext 
    private static final ThreadLocal contexts = new ThreadLocal();
     
    // 拿出当前线程绑定的 context
    public static MyWebContext getCurrentContext() 
        return (MyWebContext) contexts.get();
    
    public static MyWebContext createContext() 
        return new MyWebContext();
    
     
    // 绑定一个 context 到当前线程 
    public static void setContext(MyWebContext context) 
        contexts.set(context);
    
    public static void clearContext() 
        contexts.set(null);
    
     
    private HttpRequest request;
    public void setRequest(HttpRequest request) 
        this.request = request;
    
    public HttpRequest getRequest() 
        return this.request;
    

 
class ContextFilter implements Filter 
    public void doFilter(ServletRequest, SerlvetResponse, FilterChain chain) 
        // 创建并绑定我们的 context
        MyWebContext context = MyWebContext.createContext();
        context.setRequest(request);
        MyWebContext.setContext(context);
        try 
            chain.doFilter(request, response);
         finally 
            // 销毁 context
            MyWebContext.clearContext();
        
    

 
class MyToolClassWithoutRequestParameter 
    public static String getFileUploadPath() 
        // 其它方法只要它是工作在 servlet 请求调用键中间的某个时刻,它就肯定能拿到 Filter 绑定进去的 Request,这样我们就不必要在每次方法调用中都额外地传递一个 HttpRequest 参数,当调用层次很深时这能明显减少复杂性。
         
        MyWebContext contex = MyWebContext.getCurrentContext();
         
        HttpRequest request = context.getRequest();
         
        HttpServletContext servletContext = ...;
        HttpSession session = request.getSession(false);
        ...
         
    

参考技术A

在spring的普通类中:

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();

request.getSession();

在Struts的普通类中:

HttpServletRequest request = ServletActionContext.getRequest();

request.getSession();

HttpServletResponse response =ServletActionContext.getResponse();

参考技术B protected ServletContext getServletContext() return ServletActionContext.getServletContext();


protected HttpSession getSession(boolean paramBoolean) return ServletActionContext.getRequest().getSession(paramBoolean);


protected HttpSession getSession() return ServletActionContext.getRequest().getSession();


protected HttpServletRequest getRequest() return ServletActionContext.getRequest();


protected HttpServletResponse getResponse() return ServletActionContext.getResponse();

HttpServletRequest request = ServletActionContext.getRequest();
参考技术C 普通类中无法获得request对象 这些对象是由servlet容器管理的 参考技术D 你是学这个的吗 不是的话 我也不好说 要想知道留言给我

以上是关于java如何在一个普通的类中获取request对象的主要内容,如果未能解决你的问题,请参考以下文章

在java中如何在非servlet的普通类中获取requestresponsesession

从 Spring 访问普通 Java 类中的 HttpServletRequest 对象

java通过反射获取加了某个注解的所有的类

java的servlet类中如何实例化一个request对象

java如何获得linux下web路径

java中在同一类中普通方法可以直接调用普通方法和静态方法吗?