Servlet上下文

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet上下文相关的知识,希望对你有一定的参考价值。

  

一、Servlet上下文的基本概念

Servlet上下文又叫做:ServletContext。

当WEB服务器启动时,会为每一个WEB应用程序(webapps下的每个目录就是一个应用程序)创建一块共享的存储区域。

技术分享

ServletContext也叫做“公共区域”,也就是同一个WEB应用程序中,所有的Servlet和JSP都可以共享同一个区域。

ServletContext在WEB服务器启动时创建,服务器关闭时销毁。

 

技术分享
//通过当前Servlet类的对象,得到与它关联的ServletContext对象,也就是上下文
ServletContext application = this.getServletContext();

//HttpSession(私有区域) 与 ServletContext(公共区域) 的区别是什么?
1、作用范围不同:HttpSession是针对每一个客户端浏览器单独有一个。
         ServletContext是针对每一个WEB应用程序有一个
2、存活时间不同:HttpSession第一次访问服务器,服务器端调用request.getSession()时创建,访问间隔时间超过30分钟就销毁。
         ServletContext服务器启动时创建,服务器停止时销毁。
技术分享

 

【ServletContext的5大作用】

1.获取web的上下文路径

String getContextPath();

2.获取全局的参数

String getInitParameter(String name);

Enumeration getInitParameterNames();

3.和域对象相关的

void setAttribute(String name,Onject object);

Object getAttribute(String name);

void removeAttribute(String name);

域对象(域对象就是在不同资源之前来共享数据,保存数据,获取数据)

ServletContext是我们学习的第一个域对象(Servlet共有三个域对象ServletContext、HttpServletRequest、HttpSession)

4. 请求转发

RequestDispatcher getRequestDispatcher(String path);

5.读取web项目的资源文件

 二、Servlet会话

 1、理解会话的作用

会话——浏览器请求一次服务器,服务器接收请求,处理之后,给出响应,这就是一次会话。

因为HTTP协议是一种“无状态”协议(断开连接式协议),也就是服务器给客户端浏览器响应之后,就会断开网络连接。下次客户端浏览器请求服务器时会再建立网络连接。实际上HTTP协议是为了保证服务器的性能。而这种情况下,默认服务器是不会记录客户端浏览器的信息的。

会话跟踪——在多次浏览器跟服务器的会话过程中,服务器必须要记录客户端浏览器的一些信息,这个叫会话跟踪。

 2、会话跟踪原理

试想一下储户和银行的交互过程:

技术分享

浏览器跟服务器交互的过程与其类似

技术分享

三、HttpSession的使用

对于HttpSession来说,每个独立的浏览器窗口就是一个不同的客户端,会为它们分配不同的会话ID。

技术分享
/*
得到会话对象
request.getSession() 方法有两重含义
1、如果浏览器是第一次请求服务器,则请求中没有会话ID,此时会分配ID,创建空间
2、如果浏览器不是第一次请求服务器,则请求中存在会话ID,此时会返回原来的HttpSession对象
*/
HttpSession session = request.getSession();
技术分享

 

 HttpSession何时被创建,何时被销毁呢?

创建:第一次请求服务器,服务器端的Servlet调用了 request.getSession()方法时被创建。

销毁:如果浏览器间隔时间超过30分钟没有访问服务器,则服务器会销毁对应的HttpSession对象。(默认30分钟是可以配置的。)

<session-config>
<session-timeout>30</session-timeout>
</session-config>

 技术分享

void setAttribute(String key, Object value);    存入键值对
Object getAttribute(String key);                根据键取出对应的值
HttpSession又被称为“私有作用域”,或者也叫做“私有区域“

 

使用HttpSession实现保存用户信息及登录验证!

技术分享

URL重写

我们前面如果要给Servlet传递数据,都是通过表单提交。

除了这种方式之外,还有一种常见的形式,就是:URL重写

URL重写的办法就是在URL地址之后传递请求参数:

格式:URL?参数名1=值1&参数名2=值2……

四、总结

技术分享

1、 HttpServlet是所有我们自己编写的Servlet的父类。我们要通常要重写它的 doGet() 或 doPostt()方法。

Servlet的生命周期是怎样的?

首次访问:实例化——>初始化 init() ——> 服务 service() 根据请求是GET还是POST——> 调用 doGet() 或 doPost()

后续访问:服务 service() 根据请求是GET还是POST ——> 调用 doGet() 或doPost()

              在服务器上,Servlet始终只有一个对象!

              服务器关闭时:销毁 destroy()

2、  HttpServletRequest是请求对象,服务器会在有客户端请求的时候创建这个对象来保存请求的数据。

常用方法:

        void setCharacterEncoding(编码方式)        设置请求内容的编码方式

        String getParameter(参数名称)             得到请求参数(表单提交,URL重写)的值

       HttpSession getSession()                    得到一个私有区域。

                                                                   首次调用:请求中没有SessionID,会创建一个新对象

                                                                   后续调用:请求中有SessionID,  会得到原来的对象

3、  HttpServletResponse是响应对象,Servlet处理之后的结果会放到里面,由服务器发送给客户端浏览器。

常用方法:

        void setCharacterEncoding(编码方式)         设置响应内容的编码方式

        PrintWriter getWritter()                             得到一个用来向客户端浏览器发送html内容的输出流对象

        void sendRedirect(URL地址)                     发送重定向(外部跳转)

 

        技术分享

4、  HttpSession 私有区域。

何时创建?

               客户端浏览器第一次请求服务器,服务器端的Servlet调用了request.getSession()时创建。

何时销毁?

                 访问间隔时间超过30分钟(可以配置)就销毁。

             

                 SessionID是存储在客户端浏览器的内存中,而HttpSession对象存储在服务器端。每次客户端浏览器请求服务器时,会自动将SessionID发送给服务器。

常用方法:

                     void setAttribute(键,值)

                     Object getAttribute(键)

                     boolean isNew()

5、  ServletContext 公共区域

何时创建?

        服务器启动时会为每一个WEB应用程序创建一个ServletContext。

何时销毁?

        服务器停止时销毁。

以上是关于Servlet上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何在android的片段中设置应用程序上下文?

片段未附加到上下文 - 延迟的 UI 更改

使用 jersey 测试框架时 Servlet 上下文注入失败

片段活动中的 ListView 适配器上下文错误,我该怎么办?

片段活动错误中的ListView Adapter上下文,我该怎么办?

如何理解这段代码片段中的两对括号?