HTTP_Tomcat_Servlet_JSP_Spring_Springmvc回顾(上)
什么是Tomcat? 什么是Servelet? 什么又是JSP、Spring、SpringMVC他们之间究竟是什么关系?带着这些问题去梳理知识,理解框架和技术!!!
1. HTTP_Tomcat_Servlet
1.1 HTTP请求和Tomcat
1.1.1 Http协议
- 什么是Http协议
- 浏览器中HTTP 协议的格式
- HTTP协议的特点
- HTTP的URL和URI
- Http请求和响应
- 消息头—>请求头—>响应头
-
什么是Http协议?
HTTP 协议(Hypertext Transfer Protocol)即超文本传输协议,是一个客户端请求和响应的标准协议,这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。用户输入地址和端口号之后就可 以从服务器上取得所需要的网页信息。
通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。客户端 发送给服务器的格式叫"请求协议";服务器发送给客户端的格式叫"响应协议"。
总结:HTTP协议就是客户端和服务器之间通信的规则,包含了请求和响应的标准,以及内容的格式;它分为请求协议和响应协议。
-
浏览器中HTTP 协议的格式:
服务器端资源需要通过浏览器进行展示,浏览器通过地址栏拿到我们的请求,然后把请求解析为满足 HTTP 协议的格式并发出。
最终服务器在把相应的页面响应给我们。浏览器规定的请求格式如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nhp9Ai6Q-1624347353043)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210622124731786.png)]
HTTP:// 127.0.0.1:8080/ web01/servlet01 ? name=zhangsan&age=18
-
HTTP协议的特点:
1)HTTP 协议是基于 TCP 的连接方式,无连接的、无状态的协议。
2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的 有 GET、POST。
3)灵活:HTTP 允许传输任意类型的数据对象。传输的类型由Content-Type加以标记
-
HTTP的URL和URI:
HTTP(超文本传输协议)是一个基于请求与响应模式的、应用层的协议,常基于 TCP 的连接方式, 绝大多数的 Web 开发,都是构建在 HTTP 协议之上的 Web 应用。
[http://host] (http://host/)[:port]/[abc_path]
http://IP(主机名/域名):端口 /访问的资源路径
http://IP(主机名/域名):端口 ---->IP定位到某个网络节点上的某台计算机设备,端口号定位到每个应用程序,
/访问的资源路径------>定位到每个具体的资源
URL是整个绝对路径,URI只是相对路径,不包含前面的主机名端口号
-
Http请求和响应:
HTTP 请求由三部分组成,分别是:请求行、请求头、请求正文。
HTTP请求:
1). Get 请求(没有请求体)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AQl0Bd3W-1624347353048)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210622130630077.png)]
2). Post 请求
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1WIcY1fA-1624347353052)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210622130654471.png)]
请求行以一个方法符号开头,以空格分开,后面跟着请求的 URI 和协议的版本。格式如下:Method Request-URI HTTP-Version CRLF
Method 表示请求方法;
Request-URI 是一个统一资源标识符;
HTTP-Version 表示请求的 HTTP 协议版本;
CRLF 表示回车和换行;
HTTP响应:
在接收和解释请求消息后,服务器返回一个 HTTP 响应消息。HTTP 响应也是由三个部分组成,分别是:状态行、消息报头、响应正文。
- 消息头—>请求头—>响应头:
消息头:
HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行), 消息报头(可选),空行(只有 CRLF 的行),消息正文(可选)组成。每一个报头域都是由 名字+":"+空格+值 组成,消息报头域的名字是大小写无关的。
请求头:
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SA357RBb-1624347353065)(file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif)] Referer:该请求头指明请求从哪里来 。
如果是地址栏中输入地址访问的都没有该请求头 地址栏输入地址,通过请求可以看到,此时多了一个 Referer 的请求头,并且后面的 值 为该请求从哪里发出。比如:百度竞价,只能从百度来的才有效果,否则不算;通常用来做统计工作、 防盗链。
响应头:
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和 对 Request- URI 所标识的资源进行下一步访问的信息。
-
Location:Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域,常用在更换域名的时候。
-
response.sendRedirect("http://www.baidu.com");
-
Refresh:自动跳转(单位是秒),可以在页面通过meta标签实现,也可在后台实现。
-
<meta http-equiv="refresh" content="3;url=http://www.baidu.com">
1.1.2 Tomcat服务器
- 什么是Tomcat服务器
- Tomcat的作用
-
什么是Tomcat服务器:
Tomcat 是一个符合 JavaEE WEB 标准的最小的 WEB 容器,所有的 JSP 程序一定要有 WEB 容器的支持才能运行,而且在给定的 WEB 容器里面都会支持事务处理操作。
-
Tomcat的作用:
Tomcat 实际上是在运行 JSP 页面和 Servlet,它是一个web服务器,本质上Tomcat是一个Servelet容器,从源码皆可以看出!
关于Tomcat底层原理可以看博客Tomcat底层原理
1.2 Servlet
1.2.1 servlet到底是什么?
- Servlet是什么?
Servlet是sun公司提供的一门用于开发动态web资源的技术。Sun公司在其API中提供了一个servlet接口,若用户想用servlet技术开发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
1、编写一个Java类,实现servlet接口。
2、把开发好的Java类部署到web服务器中。
按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet
2. Servlet是如何运行的?运行的过程是什么?
Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
②装载并创建该Servlet的一个实例对象。
③调用Servlet实例对象的init()方法。
④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用 Servlet的service()方法并将请求和响应对象作为参数传递进去。
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
- Servlet接口实现类
Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。
-
Servlet和普通Java类的区别
Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。
针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。(注)
在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
1.2.2 Servlet的实现
Servlet 本质上也是 Java 类,但要遵循 Servlet 规范进行编写,没有 main()方法,它的创建、使用、销毁都由 Servlet 容器进行管理(如 Tomcat)。(言外之意:写自己的类,不用写 main 方法,别人自动调用)Servlet 是和 HTTP 协议是紧密联系的,其可以处理 HTTP 协议相关的所有内容。这也是 Servlet 应用广泛的原因之一。提供了 Servlet 功能的服务器,叫做 Servlet 容器,其常见容器有很多,如 Tomcat, Jetty, WebLogic Server, WebSphere, JBoss 等等。
- 创建一个java类继承继承 HttpServlet 类,并到如响应的包,该类中已经完成了通信的规则,我们只需要进行业务的实现即可。
package com.xxxx.servlet; import javax.servlet.http.HttpServlet; public class Servlet01 extends HttpServlet { }
- 重写service方法: 满足 Servlet 规范只是让我们的类能够满足接收请求的要求,接收到请求后需要对请求进行分析,以及进行业务逻辑处理,计算出结果. service的方法是专门用来做请求处理的操作,业务代码则可以写在该方法中。
package com.xxxx.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class Servlet01 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("Hello Servlet!"); resp.getWriter().write("Hello World"); } }
WebServlet注解的作用:
使用@WebServlet将一个继承于javax.servlet.http.HttpServlet 的类定义为Servlet 组件。在Servlet3.0中 , 可以使用@WebServlet注解将一个继承于javax.servlet.http.HttpServlet的类标注为可以处理用户请求的 Servlet。
package com.xxxx.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/ser01") public class Servlet01 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("Hello Servlet!"); resp.getWriter().write("Hello World"); } }
用注解配置 Servlet:
@WebServlet(name="Servlet01",value="/ser01")
@WebServlet(name="Servlet01",urlPatterns = "/ser01")
也可以配置多个访问路径:
@WebServlet(name="Servlet01",value={"/ser01",'/ser001'})
@WebServlet(name="Servlet01",urlPatterns={"/ser01",'/ser001'})
1.2.3 Servlet的工作流程
通过请求头获知浏览器访问的是哪个主机------>浏览器访问地址:http://localhost:8080/s01/ser01 本地主机找到8080端口程序 Tomcat—>访问对应的项目资源
再通过请求行获取访问的是哪个一个web应用
再通过请求行中的请求路径获知访问的是哪个资源
通过获取的资源路径在配置中匹配到真实的路径,
服务器会创建servlet对象,(如果是第一次访问时,创建servlet实例,并调用init方法进行初始化 操作)
调用service(request, response)方法来处理请求和响应的操作
调用service完毕后返回服务器 由服务器将response缓冲区的数据取出,以http响应的格式发送给浏览器
1.2.4 Servlet的生命周期
Servlet没有 main()方法,不能独立运行,它的运行完全由 Servlet 引擎来控制和调度。 所谓生命周期,指的是 servlet 容器(Tomcat)何时创建 servlet 实例、何时调用其方法进行请求的处理、 何时并销毁其实例的整个过程。
-
实例和初始化时机
当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会创建实例并进行初始化。
-
就绪/调用/服务阶段
有请求到达Tomcat容器,容器调用 servlet 对象的 service()方法,处理请求的方法在整个生命周期中可以被多次调用; HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost()方法。但是, 这两个 do 方法默认情况下,会抛出异常,需要子类去 override。
-
销毁时机
当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁。
上述的生命周期可以通过 Servlet 中的生命周期方法来观察。在 Servlet 中有三个生命周 期方法, 不由用户手动调用,而是在特定的时机有容器自动调用,观察这三个生命周期方法 即可观察到
Servlet 的生命周期。
- init 方法,在 Servlet 实例创建之后执行(证明该 Servlet 有实例创建了)
public void init(ServletConfig config) throws ServletException { System.out.println("实例创建了...");}
2)service 方法,每次有请求到达某个 Servlet 方法时执行,用来处理请求(证明该Servlet 进行服务了)
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("服务调用了...");}
- destroy 方法,Servlet 实例销毁时执行(证明该 Servlet 的实例被销毁了)
public void destroy() { System.out.println("实例销毁了...");}
Servlet 的生命周期,简单的概括这就分为四步:servlet 类加载–>实例化–>服务–>销毁。
Web Client 向 Servlet 容器(Tomcat)发出 Http 请求
Servlet 容器接收 Web Client 的请求
Servlet 容器创建一个 HttpServletRequest 对象,将 Web Client 请求的信息封装到这个对象 中
Servlet 容器创建一个 HttpServletResponse 对象
Servlet 容器调HttpServlet 对象service 方法,把 Request 与 Response 作为参数,传给
HttpServlet
HttpServlet 调用 HttpServletRequest 对象的有关方法,获取 Http 请求信息
HttpServlet 调用 HttpServletResponse 对象的有关方法,生成响应数据
Servlet 容器把 HttpServlet 的响应结果传给 Web Client
1.2.5 Servlet 的五大对象
1.2.5.1 HttpServletRequest对象
HttpServletRequest 对象:主要作用是用来接收客户端发送过来的请求信息,例如:请求的参数,发送的头信息等都属于客户端发来的信息,service()方法中形参接收的是 HttpServletRequest 接口的实例化对象,表示该对象主要应用在 HTTP 协议上,该对象是由 Tomcat 封装好传递过来。HttpServletRequest 是 ServletRequest 的子接口,ServletRequest 只有一个子接口,HttpServletRequest。
既然只有一个子接口为什么不将两个接口合并为一个?
从长远上讲:现在主要用的协议是 HTTP 协议,但以后可能出现更多新的协议。若以后想要支持这种新协议,只需要直接继承 ServletRequest 接口就行了。
在 HttpServletRequest 接口中,定义的方法很多,但都是围绕接收客户端参数的。
如何获取HttpServletRequest 对象呢?------->无需关心这个问题,该对象直接在 Service 方法中由容器传入过来,而我们需要做的就是取出对象中的数据,进行分析、处理。
1.接收请求
常用方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6GBSHii1-1624347353068)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210622144805228.png)]
示例:
// 获取客户端请求的完整URL (从http开始,到?前面结束) String url = request.getRequestURL().toString(); System.out.println("获取客户端请求的完整URL:" + url);// 获取客户端请求的部分URL (从站点名开始,到?前面结束)String uri = request.getRequestURI(); System.out.println("获取客户端请求的部分URL:" + uri);// 获取请求行中的参数部分String queryString = request.getQueryString(); System.out.println("获取请求行中的参数部分:" + queryString);// 获取客户端的请求方式String method = request.getMethod(); System.out.println("获取客户端的请求方式:" + method);// 获取HTTP版本号String protocol = request.getProtocol(); System.out.println("获取HTTP版本号:" + protocol);// 获取webapp名字 (站点名)String webapp = request.getContextPath(); System.out.println("获取webapp名字:" + webapp);
2.获取请求参数
常用方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZtSoBBqQ-1624347353071)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210622145012678.png)]
示例:
// 获取指定名称的参数,返回字符串String uname = request.getParameter("uname"); System.out.println("uname的参数值:" + uname);// 获取指定名称参数的所有参数值,返回数组String[] hobbys = request.getParameterValues("hobby"); System.out.println("获取指定名称参数的所有参数值:" + Arrays.toString(hobbys));
3.乱码问题:
请求乱码和响应乱码处理:
request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");//此时还只完成了一半的工作,要保证数据正确显示,还需要**指定客户端**的解码方式response.setHeader("content-type", "text/html;charset=UTF-8");
4.请求转发
请求转发,是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保 存,地址栏中的 URL 地址不会改变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。
request.getRequestDispatcher(url).forward(request,response);
5.request作用域
通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。
request 域对象中的数据在一次请求中有效,则经过请求转发,request 域中的数据依然存在,则在请求转发的过程中可以通过 request 来传输/共享数据。
// 设置域对象内容request.setAttribute(String name, String value);// 获取域对象内容request.getAttribute(String name);// 删除域对象内容request.removeAttribute(String name);
1.2.5.2 HttpServletResponse对象
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的 request 对象和代表响应的 response 对象。
request 和 response 对象代表请求和响应:获取客户端数据,需要通过 request 对象;向客户端输出数据,需要通过 response 对象。
HttpServletResponse 的主要功能用于服务器对客户端的请求进行响应,将 Web 服务器处理后的结 果返回给客户端。service()方法中形参接收的是 HttpServletResponse 接口的实例化对象,这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
-
响应数据
接收到客户端请求后,可以通过 HttpServletResponse 对象直接进行响应,响应时需要获取输出流。有两种形式:
getWriter() 获取字符流(只能响应回字符)
getOutputStream() 获取字节流(能响应一切数据)
响应回的数据到客户端被浏览器解析。
// 字符输出流PrintWriter writer = response.getWriter(); writer.write("Hello"); writer.write("<h2>Hello</h2>");
// 字节输出流ServletOutputStream out = response.getOutputStream(); out.write("Hello".getBytes()); out.write("<h2>Hello</h2>".getBytes());
设置响应类型,默认是字符串
// 设置响应MIME类型response.setHeader("content-type","text/html"); // html
-
重定向
重定向是一种服务器指导,客户端的行为。客户端发出第一个请求,被服务器接收处理后,服务器会 进行响应,在响应的同时,服务器会给客户端一个新的地址(下次请求的地址
response.sendRedirect(url);),当客户端接收到响应后,会立刻、马上、自动根据服务器给的新地址 发起第二个请求,服务器接收请求并作出响应,重定向完成。从描述中可以看出重定向当中有两个请求存在,并且属于客户端行为。
// 重定向跳转到index.jsp response.sendRedirect("index.jsp");
1.2.5.3 Cookie对象
Cookie是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或者在客户端进行 处理的数据,放在本地的计算机上,不需要通过网络传输,因而提高网页处理的效率,并且能够减少服 务器的负载,但是由于 Cookie 是服务器端保存在客户端的信息, 所以其安全性也是很差的。例如常见的记住密码则可以通过 Cookie 来实现。
有一个专门操作Cookie的类 javax.servlet.http.Cookie。随着服务器端的响应发送给客户端,保存在浏览器。当下次再访问服务器时把Cookie再带回服务器。
Cookie 的格式:键值对用“=”链接,多个键值对间通过“;”隔开。
1. Cookie的创建和发送
通过 new Cookie(“key”,“value”); 来创建一个 Cookie 对象,要想将 Cookie 随响应发送到客户端,需要先添加到 response 对象中,response.addCookie(cookie);此时该 cookie 对象则随着响应发送至了客户端。在浏览器上可以看见。
// 创建Cookie对象Cookie cookie = new Cookie("uname","zhangsan");// 发送Cookie对象response.addCookie(cookie);
2.cookie 的获取
在服务器端只提供了一个 getCookies()的方法用来获取客户端回传的所有 cookie 组成的一个数组,如果需要获取单个 cookie 则需要通过遍历,getName()获取 Cookie 的名称,getValue()获取 Cookie 的值。
// 获取Cookie数组Cookie[] cookies = request.getCookies();// 判断数组是否为空if (cookies != null && cookies.length > 0) {// 遍历Cookie数组for (Cookie cookie : cookies){ System.out.println(cookie.getName()); System.out.println(cookie.getValue());}}
1.2.5.4 HttpSession对象
HttpSession对象是 javax.servlet.http.HttpSession 的实例,该接口并不像 HttpServletRequest 或HttpServletResponse 还存在一个父接口,该接口只是一个纯粹的接口。这因为 session 本身就属于HTTP 协议的范畴。
对于服务器而言,每一个连接到它的客户端都是一个 session,servlet 容器使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的时间段,跨多个连接或来自用户的页面请求。一个会话通常对应于一个用户,该用户可能多次访问一个站点。可以通过此接口查看和操作有关某个会话的 信息,比如会话标识符、创建时间和最后一次访问时间。在整个 session 中,最重要的就是属性的操作。
// 如果session对象存在,则获取;如果session对象不存在,则创建HttpSession session = request.getSession();
1. 标识符sessionId
每当一次请求到达服务器,如果开启了会话(访问了 session),服务器第一步会查看是否从客户端回传一个名为 JSESSIONID 的 cookie,如果没有则认为这是一次新的会话,会创建 一个新的 session 对象,并用唯一的 sessionId 为此次会话做一个标志。如果有 JESSIONID 这 个cookie回传,服务器则会根据 JSESSIONID 这个值去查看是否含有id为JSESSION值的session 对象,如果没有则认为是一个新的会 话,重新创建一个新的 session 对象,并标志此次会话; 如果找到了相应的 session 对象,则认为是之前标志过的一次会话,返回该 session 对象,数据达到共享。
这里提到一个叫做 JSESSIONID 的 cookie,这是一个比较特殊的 cookie,当用户请求服务器时,如果访问了 session,则服务器会创建一个名为 JSESSIONID,值为获取到的 session(无论是获取到的还是新创建的)的 sessionId 的 cookie 对象,并添加到 response 对象中,响应给客户端,有效时间为关闭浏览器。
所以 Session 的底层依赖 Cookie 来实现。
2.Session 作用域对象
Session 用来表示一次会话,在一次会话中数据是可以共享的,这时 session 作为域对象存在,可以通过 setAttribute(name,value) 方法向域对象中添加数据,通过 getAttribute(name) 从域对象中获取数据,通过 removeAttribute(name) 从域对象中移除数据。
// 获取session对象HttpSession session = request.getSession();// 设置session域对象session.setAttribute("uname","admin");// 获取指定名称的session域对象String uname = (String) request.getAttribute("uname");// 移除指定名称的session域对象session.removeAttribute("uname");
数据存储在 session 域对象中,当 session 对象不存在了,或者是两个不同的 session 对象时,数据也就不能共享了。这就不得不谈到 session 的生命周期。
3.session对象的销毁
当客户端第一次请求 servlet 并且操作 session 时,session 对象生成,Tomcat 中 session 默认的存活时间为 30min,即你不操作界面的时间,一旦有操作,session 会重新计时。
修改Session默认值
可以在 Tomcat 中的 conf 目录下的 web.xml 文件中进行修改。
<!-- session 默认的最大不活动时间。单位:分钟。 --><session-config><session-timeout>30</session-timeout></session-config>
当然除了以上的修改方式外,我们也可以在程序中自己设定 session 的生命周期,通过
session.setMaxInactiveInterval(int) 来设定 session 的最大不活动时间,单位为秒。
// 获取session对象HttpSession session = request.getSession();// 设置session的最大不活动时间session.setMaxInactiveInterval(15); // 15秒//当然我们也可以通过 getMaxInactiveInterval() 方法来查看当前 Session 对象的最大不活动时间。// 获取session的最大不活动时间int time = session.getMaxInactiveInterval();//或者我们也可以通过 session.invalidate() 方法让 session 立刻失效// 销毁session对象session.invalidate();
ookie 的有效时间为关闭浏览器,从而 session 在浏览器关闭时也相当于失效了,当关闭服务器时,session 销毁。Session 失效则意味着此次会话结束,数据共享结束。
1.2.5.5 ServletContext对象
每一个 web 应用都有且仅有一个ServletContext 对象,又称 Application 对象,从名称中可知,该对象是与应用程序相关的。在 WEB 容器启动的时候,会为每一个 WEB 应用程序创建一个对应的ServletContext 对象。该对象有两大作用,第一、作为域对象用来共享数据,此时数据在整个应用程序中共享; 第二、该对象中保存了当前应用程序相关信息。例如可以通过 getServerInfo() 方法获取当前服务器信息 , getRealPath(String path) 获取资源的真实路径等。
1.ServletContext 对象的获取--------->常用的四种获取方式:
通过 request 对象获取
ServletContext servletContext = request.getServletContext();
通过 session 对象获取
ServletContext servletContext = request.getSession().getServletContext();
通过 servletConfig 对象获取,在 Servlet 标准中提供了 ServletConfig 方法
ServletConfig servletConfig = getServletConfig();ServletContext servletContext = servletConfig.getServletContext();
直接获取,Servlet 类中提供了直接获取 ServletContext 对象的方法
ServletContext servletContext = getServletContext();
常用方法:
// 获取项目存放的真实路径String realPath = request.getServletContext().getRealPath("/");// 获取当前服务器的版本信息String serverInfo = request.getServletContext().getServerInfo();
2.ServletContext域对象
ServletContext 也可当做域对象来使用,通过向 ServletContext 中存取数据,可以使得整个应用程序共享某些数据。当然不建议存放过多数据,因为 ServletContext 中的数据一旦存储进去没有手动移除将会一直保存。
// 获取ServletContext对象ServletContext servletContext = request.getServletContext();// 设置域对象servletContext.setAttribute("name","zhangsan");// 获取域对象String name = (String) servletContext.getAttribute("name");// 移除域对象servletContext.removeAttribute("name");
- Servelet三大作用域对象:
request域对象在一次请求中有效。请求转发有效,重定向失效。
session域对象在一次会话中有效。请求转发和重定向都有效,session销毁后失效。
servletContext域对象在整个应用程序中有效。服务器关闭后失效。