Servlet 7:request & session & application
request & session & application(pageContext(作用范围:jsp页面内))
这三个对象可以在服务器内部帮我们保存数据以及传递数据.
※ 1. request(类型 ) HttpServletRequest(对象名)
设置值:
key必须是String,value是Object类型
<String,Object>
request.setAttribute(key,value);
取值:
通过key拿到value值,需要的话可以强转
Object obj=request.getAttribute(kay);
作用范围:
request的存/取数据只能在一次请求之内起作用.比如服务器内部跳转的时候(因为内部跳转客户端只发一次请求).
注意:客户端重定向是不行的,因为客户端重定向会发出多个请求.
生命周期:
request始于浏览器终止于浏览器(浏览器每发出一次http请求都会构建新的request对象)。
request给浏览器传数据是一次性的,只能借助服务器内部跳转给页面数据。
package com.briup.web.Servelt;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/reqT")
public class RequestTest extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//浏览器每次访问Tomcat都会构建一个request对象
Object obj=request.getAttribute("num");
if(obj==null) {
request.setAttribute("num",1);
}else {
int n=(int) request.getAttribute("num");
request.setAttribute("num",n+1);
}
//request.getRequestDispatcher("/test.jsp").forward(request, response);
//重定向是不同的request对象,拿不到值
response.sendRedirect("test.jsp");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
※ 2. session(会话) HttpSession
获取session对象:
httpSession session=request.getSession();
设置值:
<String,Object>
session.setAttribute(key,value);
取值:
session.getAttribute(kay);
作用范围:
在一个会话之中起作用.一个会话可以包括很多个request请求,所以放在session中的数据,可以被多个请求所共享。session存储的都是用户的私人信息。
生命周期:
默认的是浏览器和服务器30分钟之内没有交互,服务器自动销毁该session对象。
//web.xml文件
<session-config>
<!-- 设置session的生命周期 -->
<session-timeout>60</session-timeout>
</session-config>
Session的创建:
- 浏览器第一次访问非静态资源创建。
- 浏览器中jessionid存在 服务器session对象销毁,服务器端重新创建。(服务器关闭,删除SESSIONS.ser文件)
- 浏览器中jessionid不存在,服务器session对象存在,重新创建。(重新开启浏览器,原来的服务器端的session没有销毁)
- 服务器正常关闭session所有的对象***保存到work目录中的SESSIONS.ser文件,启动反序列化读取,不会重新创建。
- session对象对于同一个浏览器访问的任意资源都共享
-
(图为:浏览器访问服务器时的jesessionid的传递)
(如图:浏览器第一次访问非静态资源创建session对象,Tomcat会返回一个jessionid)
(如图:浏览器中jsessionid存在,发送请求有jsessionid)
特点:
http协议无状态协议(不记是哪个浏览器访问的,需要服务器给出一种机制(标记)用于标记是哪个浏览器访问的)
浏览器访问非静态资源(Servlet,jsp),服务器会给该浏览器创建一个session对象,当前请求回写资源给浏览器的时候会把session的ID带给浏览器,
浏览器把session的ID保存到浏览器的cookie中(会话追踪系统)同时会标记该项目及失效时间,下一次只要访问该项目都会把session的ID发给服务器。(session的ID在本地以jsessionid出现)
package com.briup.web.Servelt;
import java.io.IOException;
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;
/**
* Servlet implementation class sessionTest
*/
@WebServlet("/sess")
public class sessionTest extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
HttpSession session=request.getSession();
String id=session.getId();
System.out.println("sessionID:"+id);
Object obj=session.getAttribute("num");
if(obj==null) {
session.setAttribute("num", 1);
}else {
int n=(int) obj;
session.setAttribute("num", n+1);
}
request.getRequestDispatcher("/test.jsp").forward(request, response);;
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
※ 3. application & ServletContext
获取application对象
方法一:
ServletContext application=request.getServletContext();
方法二:
ServletContext application=session.getServletContext();
方法三:
ServletContext application=getServletContext();
方法四:
ServletContext application=this.getServletContext();
设置值:
<String,Object>
application.setAttribute(key,value);
取值:
application.getAttribute(kay);
作用范围:
整个项目在运行期间,只有一个application对象,所以这个对象是所有人所有会员共享的,大家都可以向这个对象里面存值,也可以再拿出来.因为 这个对象一个项目中只有一个。
特点:
储存的是公共数据(大家共享的数据)
每一个web项目只有一个application对象,整个项目中任何页面或Servlet共享该对象。
E.g.:商品信息
生命周期:
application对象Tomcat创建,并且Tomcat关闭的时候销毁。
package com.briup.web.Servelt;
import java.io.IOException;
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;
/**
* Servlet implementation class ContainerTest
*/
@WebServlet("/container")
public class ContainerTest extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//给request设置值<String ,Object>
request.setAttribute("name", "tom");
//取值
Object obj=request.getAttribute("name");
System.out.println("request:"+obj);
//获取session对象
HttpSession session=request.getSession();
session.setAttribute("age", 30);
System.out.println("session:"+session.getAttribute("age"));
//获取application对象
//方法一:ServletContext application=request.getServletContext();
//方法二:ServletContext application=session.getServletContext();
//方法三:ServletContext application=getServletContext();
//方法四:
ServletContext application=this.getServletContext();
application.setAttribute("gender", "男");
System.out.println("appolcation:"+application.getAttribute("gender"));
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
package com.briup.web.Servelt;
import java.io.IOException;
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;
/**
* Servlet implementation class ApplicationSer
*/
@WebServlet("/app")
public class ApplicationSer extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
ServletContext application=request.getServletContext();
Object obj=application.getAttribute("num");
if(obj==null) {
application.setAttribute("num", 1);
}else {
int n=(int) obj;
application.setAttribute("num", n+1);
}
request.getRequestDispatcher("test.jsp").forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
※ 三个容器的区别
作用范围: request<session<application
(page<request<session<application 这page是之后我们在jsp中要学习的另一个范围,页面范围,只在一个页面中起作用。)
注意:
getParameter(“key”)方法和getAttribute(“key”)方法,getParameter是接收客户端传过来的值,getAttribute方法是取到之前调用setAttribute方法保存到这个对象里面的值.
注意:三个容器内部都维护了Map集合