目录
一、Session技术
1.session技术就是将信息存储在服务器上,实现不同servlet之间数据共享的一种技术。
2.session在使用时需要依赖于cookie技术。
3.session技术的使用流程:
(1)将要共享的数据保存在本地的Session对象中。
(2)这个Session对象会生成一个jsessionid。
(3)通过cookie技术将这个jsessionid响应到客户的浏览器中。
(4)下次访问,客户就会带着这个cookie,而服务器拿到这个cookie中的jsessionid后,会自动找到对应的Session对象,取出里面的数据。
4.创建Session对象:
(1)格式:req.getSession()
(2)返回的是一个HttpSession对象。
(3)在Session对象创建之后,会自动生成一个jsessionid,这个jsessionid会交给resp对象,响应给用户浏览器,这个过程是自动的。
(4)注意:如果服务器中没有Session对象,就由tomcat创建一个新的对象,如果有用现有的。
5.往Session对象里面存入值:
(1)HttpSession对象名.setAttribute("key","value")
(2)注意:将数据放入Session对象中时会自动提升为Object类型。
6.从Session对象中获取值:
(1)HttpSession对象名.getAttribute("key")
(2)注意:取值时需要强转为对应的类型,因为这个获取的的类型是Object。
7.强制销毁Session:
(1)HttpSession对象名.invalidate()
8.设置Session的有效期:
(1)HttpSession对象名.setMaxInactiveInterval(具体时间)
(2)这个的单位是分钟。
(3)注意:这个设置只针对当前的工程,在tomcat服务器的conf目录下的web.xml中设置的话是针对的所有工程。
9.Session的原理:
(1)用户使用浏览器第一次向服务器发送请求,服务器在接收到请求后,调用对应的Servlet进行处理。在处理过程中会给用户创建一个session对象(一但创建,就会有一个JSESSIONID),用来存储用户请求处理相关的公共数据,并将此Session对象的JSESSIONID以Cookie的形式存储在浏览器中(临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请求时,请求信息中会附带jSESSIONID,服务器在接收到请求后,调用对应的ServletB进行请求处理,同时根据JSESSIONID返回其对应的Session对象(解析JSESSIONID并通过JSESSIONID找对应Session的是服务器底层来完成)。
10.Session的特点:
(1)Session技术是依赖Cookie技术的服务器端的数据存储技术。
(2)由服务器进行创建。
(3)每个用户独立拥有一个session。
(4)注意:如果存储的动作和取出的动作发生在不同的请求中,存储要先于取出执行;一般用户在登录web项目时会将用户的个人信息存储到Session中,供该用户的其他请求使用。
(5)Session的默认存储时间为30分钟。
- session的默认存储时间可以在tomcat服务器的conf目录下的web.xml中找到,可以更改
11.总结:
(1)Session只要在不失效的情况下(不关闭浏览器),同一个用户的任意请求,在项目中,Servlet中都是获取的同一个Session对象,Session对象是基于用户的,一个用户一个Session。
(2)Session在整个工程中都是有效的,所以Session又叫上下文对象,上下文对象就是Tomcat服务器中的一个空间,这个空间是一个项目中的公共区域,也就是说在一个web应用程序中所有的Servlet都可以共享这个区域。
12.案例:
(1)ServletA中的代码
java
package com.web.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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/servletA")
public class ServletA extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//从浏览器提交一个数据a = abc
String a = req.getParameter("a");
//创建一个Session对象
HttpSession session = req.getSession();//如果服务器中没有Session对象,就由tomcat创建一个新的对象,如果有用现有的
//把a的值放入session对象中
session.setAttribute("a",a);
/*
tomcat会自动完成以下:
session创建之后,会自动生成一个JsessionId,交给resp对象,响应给用户的浏览器
*/
}
}
(2)ServletB中的代码
java
package com.web.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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/servletB")
public class ServletB extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Session对象
HttpSession session = req.getSession();//如果服务器中没有Session对象,就由tomcat创建一个新的对象,如果有用现有的
//从Session中取数据
String a = (String) session.getAttribute("a");
System.out.println("在ServletB中从Session中取到了:" + a);
}
}
(3)ServletC中的代码
java
package com.web.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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/servletC")
public class ServletC extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.setMaxInactiveInterval(10);//单位:分钟; 设置Session的失效时间,只针对当前工程有效
//强制销毁Session
session.invalidate();
}
}
二、Servlet中的doGet方法和doPost方法
1.doGet方法用来接收get请求的提交方式。
2.doPost方法用来接收post请求的提交方式。
3.注意:如果有service方法,那么tomcat就不会去调用doGet或者是doPost方法,而是直接调用service方法;如果没有service方法,那么就会根据用户的请求去调用对应的doGet方法或者是doPost方法。
4.开发中推荐使用service方法,并删除其调用父类service方法的代码。
5.案例:
java
package com.web.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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/test")
public class TestServlet extends HttpServlet {
//用来接收get请求的提交方式
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doGet(req, resp);
System.out.println("doGet方法被调用了");
}
//用来接收post请求的提交方式
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doPost(req, resp);
System.out.println("doPost方法被调用了");
}
//开发中推荐使用service方法,并删除super.service(req, resp);
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.service(req, resp);//这里会调用doGet或者doPost
System.out.println("service方法被调用了");
}
}
三、ServletContext对象
1.ServletContext对象是tomcat容器的上下文对象,这个对象在一个工程中有且只有一个,可以在不同的用户之间共享数据。
2.创建ServletContext对象:
(1)方法一:this.getServletContext
(2)方法二:req.getSession().getServletContext
(3)方法三:this.getServletConfig.getServletContext
3.往ServletContext对象中存入数据:
(1)ServletContext对象名.setAttribute("key","value")
4.从ServletContext对象中取出数据:
(1)ServletContext对象名.getAttribute("key")
5.删除ServletContext对象中的共享数据:
(1)ServletContext对象名.removeAttribute("key")
6.案例:
(1)ServletA中的代码
java
package com.web;
import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/ServletA")
public class ServletA extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
创建ServletContext对象,有三种方式
一个工程中只有一个ServletContext对象
*/
ServletContext sc1 = this.getServletContext();
ServletContext sc2 = req.getSession().getServletContext();
ServletContext sc3 = this.getServletConfig().getServletContext();
System.out.println(sc1.hashCode());
System.out.println(sc2.hashCode());
System.out.println(sc3.hashCode());
//从输出结果可以看出,输出的是相同的哈希码,说明是同一个对象
sc1.setAttribute("a","aaa");
sc2.setAttribute("b","bbb");
}
}
(2)ServletB中的代码
java
package com.web;
import javax.servlet.ServletContext;
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("/ServletB")
public class ServletB extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext sc = this.getServletContext();
String a = (String) sc.getAttribute("a");
String b = (String) sc.getAttribute("b");
System.out.println("a:" + a);
System.out.println("a:" + b);
}
}
7.ServletContext对象可以读取web.xml中的数据:
(1)将数据放入web.xml中的context-param标签中,可以通过ServletContext读取。
(2)使用ServletContext对象读取配置文件web.xml中的数据:
- 格式:ServletContext对象名.getInitParameter("key");
- 返回值类型是一个String类型
(3)案例:
- web.xml中的配置信息
XML
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--当前工程中都有效,配置文件中的信息-->
<context-param>
<param-name>flag</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>city</param-name>
<param-value>beijiing</param-value>
</context-param>
</web-app>
- ServletC中的代码
java
package com.web;
import javax.servlet.ServletContext;
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("/ServletC")
public class ServletC extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext sc = this.getServletContext();
//通过ServletContext从配置文件web.xml中取数据
String flag = sc.getInitParameter("flag");
if(flag.equals("true")){
System.out.println("定期清理缓存数据...");
}
String city = sc.getInitParameter("city");
}
}
8.作用:解决了不同用户的数据共享问题
9.原理:
(1)ServletContext对象由服务器进行创建,一个项目只有一个对象。不管在项目的任意位置进行获取,得到的都是同一个对象,那么不同用户发起的请求获取到的也就是同一个对象了,该对象由访问此项目工程(作用域在整个项目工程中)的所有用户共同拥有。
10.特点:
(1)由服务器创建
- ServletContext由服务器进行创建,在服务器启动的时候创建,目的:提供一个对象,用于开发者访问tomcat容器的内部数据
(2)用户共享
(3)一个项目只有一个
11.生命周期:服务器启动到服务器关闭。
12.作用域:项目(工程)内。
13.可以使用ServletContext获取到已经部署在项目中web下的资源的绝对路径:
(1)格式:ServletContext对象名.getRealPath();
(2)案例:
java
package com.web;
import javax.servlet.ServletContext;
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.File;
import java.io.IOException;
@WebServlet("/ServletD")
public class ServletD extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过ServletContext获取
ServletContext sc = this.getServletContext();
//当前工程的根目录
String basePath = sc.getRealPath("/");
File f = new File(basePath, "datas");
boolean flag = f.mkdir();
System.out.println("flag:" + flag);
//传统的方式获取当前工程的存储的路径
File file = new File("/datas/aa.txt");
String absolutePath = file.getAbsolutePath();
System.out.println("absolutePath:" + absolutePath); //E:\Java\apache-tomcat-9.0.41\bin\datas\aa.txt,这个不存在
System.out.println("basePath:" + basePath);//当前工程的根目录
String realPath = sc.getRealPath("/datas");
System.out.println("realPath:" + realPath);
/*
ServletContext对象是我们开发者可以与tomcat容器内部打交道的对象
*/
}
}