JavaWeb-Session和ServletContext
目录
一、Session技术
二、Servlet中的doGet方法和doPost方法
三、ServletContext对象
一、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中的代码
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 {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//从浏览器提交一个数据a = abcString a = req.getParameter("a");//创建一个Session对象HttpSession session = req.getSession();//如果服务器中没有Session对象,就由tomcat创建一个新的对象,如果有用现有的//把a的值放入session对象中session.setAttribute("a",a);/*tomcat会自动完成以下:session创建之后,会自动生成一个JsessionId,交给resp对象,响应给用户的浏览器*/}
}
(2)ServletB中的代码
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 {@Overrideprotected 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中的代码
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 {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();session.setMaxInactiveInterval(10);//单位:分钟; 设置Session的失效时间,只针对当前工程有效//强制销毁Sessionsession.invalidate();}
}
二、Servlet中的doGet方法和doPost方法
1.doGet方法用来接收get请求的提交方式。
2.doPost方法用来接收post请求的提交方式。
3.注意:如果有service方法,那么tomcat就不会去调用doGet或者是doPost方法,而是直接调用service方法;如果没有service方法,那么就会根据用户的请求去调用对应的doGet方法或者是doPost方法。
4.开发中推荐使用service方法,并删除其调用父类service方法的代码。
5.案例:
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请求的提交方式@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doGet(req, resp);System.out.println("doGet方法被调用了");}//用来接收post请求的提交方式@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.doPost(req, resp);System.out.println("doPost方法被调用了");}//开发中推荐使用service方法,并删除super.service(req, resp);@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.service(req, resp);//这里会调用doGet或者doPostSystem.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中的代码
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 {@Overrideprotected 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中的代码
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 {@Overrideprotected 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 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中的代码
-
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 {@Overrideprotected 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)案例:
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 {@Overrideprotected 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容器内部打交道的对象*/}
}