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();

注:request.getSession(false); 方法:
false:有session返回session对象,没有返回null;
true:有session返回session对象,没有构建session对象。

设置值:

<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的创建:

  1. 浏览器第一次访问非静态资源创建。
  2. 浏览器中jessionid存在 服务器session对象销毁,服务器端重新创建。(服务器关闭,删除SESSIONS.ser文件)
  3. 浏览器中jessionid不存在,服务器session对象存在,重新创建。(重新开启浏览器,原来的服务器端的session没有销毁)
  4. 服务器正常关闭session所有的对象序列号保存到work目录中的SESSIONS.ser文件,启动反序列化读取,不会重新创建。
  5. session对象对于同一个浏览器访问的任意资源都共享
  6. (图为:浏览器访问服务器时的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集合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值