ServletContext、Session、Request

    科技2023-10-25  119

    ServlerContext的对象由Web容器在启动项目时创建,该对象可用于从web.xml文件获取配置信息.

    每个Web应用程序只有一个ServletContext对象.

    如有信息要共享给多个Servlet,可以在web.xml文件中使用标签.

    例1:处理中文乱码,统一编码:

    在web.xml中:

    <context-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </context-param>

    在servlet中:

    ServletContext context = req.getServletContext(); context.getInitParameter("encoding");

    例2:在多个servlet中共享信息:

    ServletContext、Session和 HttpServletRequest都含有setAttribute() 和 getAttribute(),下面比较三者的不同.

    servlet01

    //ServletContext ServletContext application = req.getServletContext(); application.setAttribute("name","tom"); //Session HttpSession session = req.getSession(); session.setAttribute("name","marry"); //HttpServletRequest req.setAttribute("name","jack");

    servlet02

    //ServletContext ServletContext context = req.getServletContext(); String string = (String) context.getAttribute("name"); resp.getWriter().println("ServletContext:"+string); //Session String str = (String) req.getAttribute("name"); resp.getWriter().println("Session:"+str); //HttpSession HttpSession session = req.getSession(); String str1 = (String) session.getAttribute("name"); resp.getWriter().println("HttpRequest:"+str1);

    客户端页面打印:

    ServletContext:tom

    HttpRequest:null

    HttpRequest:marry

    为什么 req.getAttribute(“name”)返回的是 null呢?

    因为 http的无连接特性,客户端访问不同的 servlet就相当于断开原有的连接,重新再发起一次请求. 那么有没有可能让req.getAttribute(“name”)返回的是 jack呢? 有,req.stAttribute()和req.getAttribute()在同一 servlet中; 或者携带 req 数据请求转发

    生命周期

    **Request **:保存的键值仅在下一个request对象中可以得到。 **Session ** :它是一个会话范围,相当于一个局部变量,从Session第一次创建知道关闭,数据都一直保存,每一个 客户都有一个Session,所以它可以被客户一直访问,只要Session没有关闭和超时即浏览器关闭。 **servletContext **: 它代表了servlet环境的上下文,相当于一个全局变量,即只要某个web应用在启动中,这个对象就一直都有效的存在,所以它的范围是最大的,存储的数据可以被所有用户使用,只要服务器不关闭,数据就会一直都存在。

    request:

    好处:用完就仍,不会导致资源占用的无限增长。 弊处:数据只能被下一个对象获取,所以在写程序时会因为无法共享数据导致每次要用都从数据库中取,多做操作,自然会对性能有一些影响。

    session:

    好处:是一个局部变量,可以保存用户的信息并直接取出,不用每次都去数据库抓,少做操作,极大的方便了程序的编写。 弊处:每个客户都有一个session,只能自己使用,不同session可能保存大量重复数据; 可能耗费大量服务器内存; 另外session构建在cookie和url重写的基础上,所以用session实现会话跟踪,会用掉一点点服务器带宽和客户端保持联络, 当然session越多,耗费的带宽越多,理论上也会对性能造成影响。 集群的session同步会是个问题。

    servletContext:

    好处:不用每次都去数据库抓,少做操作。 存储的数据所有客户都可以用。 可减少重复在内存中存储数据造成的开销。

    参考链接:

    讲透Session、Cookie和ServletContext

    关于javaWeb的学习,有几篇文章写得很好,推荐一下: ServletContext和ServletContext的区别 getAttribute与getParameter的区别

    Processed: 0.010, SQL: 8