问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-23 18:13

我来回答

5个回答

热心网友 时间:2022-05-03 10:34

你是指你的 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);
        ...
         
    }
}

热心网友 时间:2022-05-03 11:52

在spring的普通类中:

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

request.getSession();

在Struts的普通类中:

HttpServletRequest request = ServletActionContext.getRequest();

request.getSession();

HttpServletResponse response =ServletActionContext.getResponse();

热心网友 时间:2022-05-03 13:27

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();

热心网友 时间:2022-05-03 15:18

普通类中无法获得request对象 这些对象是由servlet容器管理的

热心网友 时间:2022-05-03 17:26

你是学这个的吗 不是的话 我也不好说 要想知道留言给我
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 锻炼颈椎的几个动作 水多久能结冰 冰能在多长时间内形成 请问水低于0度会结冰吗? 如何防止脱发严重 在jsp中如何用request中获取后台传来的数据? servlet如何利用request来获取http请求中的主体信息??? Request对象的主要方法有哪些 JSP和Servlet中request怎么获得请求发起页面的地址或路径 java怎么在任意位置获得当前请求的request request对象获取用户的请求信息是指什么 如何获取request请求携带的cookie servlet request请求对象常用方法总结 servlet如何利用request来获取http请求中的主体信息? java request 如何取到发送请求的地址是什么 request怎么获取请求类型 request获取get或者post请求后续通过什么属性来获取文本内容 儿童湿疹会传染吗?夏天快到了,饮食需要注意什么?吃什么食物有助于预防儿童湿疹? 夏天是手足口病的高发期,那应该怎么预防手足口病呢? 夏季传染病有哪些 夏季,儿童得传染感冒的几率大吗? 夏季,儿童得传染感冒的几率大吗?谢谢了,大神帮忙啊 结合当前疫情,请谈谈传染病的特征以及学前儿童常见传染病的一般预防措施? 夏天容易得哪些病? 小孩手足口病会不会传染给大人呀? 怎样唯一确定一个request请求 ThinkPHP5.0中Request请求对象的常用操作 如何获取request,session和application对象 request的所有方法 哪里有 什么是手势交互?它的原理是什么? 哪些游戏用到了手势识别交互 拜腾停摆,是一场浪漫主义造车的终结? 移动端交互动效设计你怎么看? 肢体语言在谈判中有效运用的案例有哪些? 实时手势识别,有没有经较成熟的案例 用手势和电脑进行交互,体现了什么技术 什么叫 边缘手势交互技术 手势识别和人机交互是什么关系? 基于单目手势识别交互系统_毕业设计论文 人机交互有哪些有意思的解决方案? 在手势识别领域现在有哪些不同的解决方案?都分别来自哪些公司的技术? 手势遥控,交换技能是什么局 几种常用的手势有哪些? 岚图FREE发布,杠上蔚来和理想,东风做高端的王牌与命门 移动VR更便捷的交互方式?