对于JavaWeb应用,都需要很多个Servlet来完成不同页面的不同请求处理,那么对于数据就出现一个共享问题,可能多个Servlet都需要一个页面的数据,这一个页面的数据不可能去请求多个Servlet,那么域对象就会帮我们解决这个问题,完成不同Servlet之间数据的共享问题。
ServletContext
ServletContext是全局域对象
生命周期
当web应用被加载到容器时,创建ServletContext全局域对象,代表整个web应用,当服务器关闭或web应用被移除时,ServletContext对象才会被销毁
作用
整个web应用中的Servlet都可以共享全局域对象,所以Servlet之间可以通过ServletContext来实现通信
应用
- 多个Servlet之间实现数据共享
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//可以通过配置对象获取ServletContext(全局域对象)
//该对象由服务器创建,服务器启动该对象就会被创建
String name="张三";
ServletContext sc = this.getServletContext();
//将数据存放到sc全局域对象中
sc.setAttribute("name",name);
}
//第二个Servlet
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取到name对象
ServletContext servletContext = this.getServletContext();
System.out.println((String) servletContext.getAttribute("name"));//张三
}
- 获取web应用的初始化参数
String username = servletContext.getInitParameter("username");//获取web.xml中初始化参数的方法
System.out.println(username);
- 通过全局域对象进行内部的请求转发
- 读取资源文件
ServletContext.getRealPath(),ServletContext.getResourceAsStream()
非Servlet获取资源文件,需要使用类加载器将资源文件加载到内存中。
Properties properties = new Properties();
//web项目中普通的类读取src下的文件
InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(in);
Session与Cokkie
会话跟踪是web程序用来跟踪整个会话的技术。
Cookie是在客户端记录用户信息
Session是在服务器端记录用户信息
web程序中,一个用户的所有请求操作属于一次会话,另一个用户请求操作属于另一次会话 ,但是web程序是使用http协议传递数据的,在数据交换完毕后,服务器与客户端建立的连接就会关闭,再次请求会建立新的连接,但是新的连接需要使用上次连接的数据这就需要引入会话域。
Cookie就相当于一个“通行证”,在客户端用来保存服务器返回的数据,当下次访问服务器时会将Cookie中的数据一起带上给服务器,而服务器就可以通过获取Cookie中的数据就能进行逻辑处理。
Cookie有不可跨域名性
不同的网站会给用户返回不同的Cookie数据,但是在再次访问不同的网站时只会带上各自网站的Cookie,从而保障用户的数据安全。
Cookie的有效期
Cookie中有MaxAge()属性,可以设置浏览器保存的Cookie数据的时间,单位是秒,保存时间过后,浏览器会自动删除Cookie数据。maxAge()为负数的情况下,代表Cookie数据在本次浏览器窗口以及子窗口中有效,关闭浏览器该数据也不会被保存。
Session机制就是在服务器上保存用户的信息,返回给用户一个id,用户再次访问时,Http协议的Cookie头会带上该id,然后服务器获取到id就可以获得该用户的信息。
Session也是一种key-value的属性对,通过getAttribute(Stringkey)和setAttribute(String key,Objectvalue)方法读写客户状态信息。Servlet里通过request.getSession()方法获取该客户的Session
Session的生命周期
Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。
Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE静态资源并不会创建Session。如果没有生成Session,也可以使用request.getSession(true)强制生成Session。
Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。
Session需要浏览器的支持,因为Session需要Cookie作为识别标志,服务端会向客户端发送一个名为JSESSIONID的Cookie,用来记录服务端Session的id,根据这个id区别用户。
浏览器也有功能可以禁止Cookie,也就是禁止浏览器记录Cookie数据,这时就需要URL地址重写
URL地址重写:
为了解决浏览器不支持Cookie,可以将JESSIONID写入到URL地址中,服务器就可以通过解析地址来获取到JESSIONID,这样就可以防止浏览器不支持Cookie也可以通过Session来获取用户信息。
Cookie与Session的区别
- Cookie将数据存放在客户端,Session将数据存放在服务端
- Cookie安全性不高,用户可以通过分析Cookie数据也可以进行修改
- Session会在一定时间保存在服务器,但是当用户访问过多,会给服务器带来压力
request
请求域
request是在一次请求链中的对象。
浏览器在对服务器的一次请求中,如果在服务器内部进行请求转发,也属于一次请求;要是服务器内部是重定向,那么就是两次请求,那么在请求域中存放的数据也不能被共享。
在一次请求中,可以通过getAttribute、setAttribute这两个方法获取,存储数据。
pageContext
pageContext是JSP页面的对象
生命周期
对JSP页面请求的时候创建,响应结束后销毁
pageContext对象封装了8大隐式对象,通过它可以获得其它的8个对象。
getException()返回Exception。
getPage()返回Page。
getRequest()返回request。
getResponse()返回response。
getServletConfig()返回config。
getServletContext()返回application。
getSession()返回session。
getOut()返回out。