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

java如何在一个普通的类中获取request对象... java如何在一个普通的类中获取request对象 展开
 我来答
百度网友8b476d5
2017-10-25 · TA获得超过179个赞
知道小有建树答主
回答量:196
采纳率:87%
帮助的人:92.3万
展开全部

你是指你的 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);
        ...
         
    }
}
申喉诱鸡
2018-03-30 · TA获得超过2962个赞
知道小有建树答主
回答量:40
采纳率:100%
帮助的人:5542
展开全部

在spring的普通类中:

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

request.getSession();

在Struts的普通类中:

HttpServletRequest request = ServletActionContext.getRequest();

request.getSession();

HttpServletResponse response =ServletActionContext.getResponse();

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
原雁戎0hi
2013-04-03 · 超过17用户采纳过TA的回答
知道答主
回答量:107
采纳率:0%
帮助的人:35.8万
展开全部
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();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
whhit2011
2013-04-03
知道答主
回答量:8
采纳率:0%
帮助的人:1.2万
展开全部
普通类中无法获得request对象 这些对象是由servlet容器管理的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-04-01
展开全部
你是学这个的吗 不是的话 我也不好说 要想知道留言给我
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 9条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式