servlet--跳转、Cookie、Session和三大作用域对象

Web组件之间的跳转方式

1.请求转发

从Servlet1,请求转发到Servlet2. Servlet1完成一部分功能,再跳转到Servlet2继续完成剩下的功能.

  • 语法
    request.getRequestDispatcher(String path).forward(request,response)
    参数path为需要转发到的url地址,如"/hello"

  • 特点

  1. 浏览器的地址栏不发生改变.
  2. 请求转发只发送一个请求
  3. 共享同一个请求中的数据
  4. 最终响应给浏览器的由Servlet2来决定

2.URL重定向

  • 语法
    response.sendRedirect(String url);
    参数url表示目标资源地,如"/learnJava/hello?name=Bob"

这里的url应包含项目名(如/learnJava),因为该地址是用浏览器来进行解析

  • 特点
  1. 浏览器地址栏发生改变
  2. URL重定向发了两次请求.
  3. 因为URL重定向是两次独立的请求,所以不共享请求中的数据
  4. 最终响应给浏览器的由Servlet2来决定
  5. URL重定向不能访问WEB-INF目录中的资源.

Cookie

Cookie是客户端技术

Cookie操作:

  1. 创建Cookie对象
Cookie cookie = new Cookie(String name, String value);

name必须是唯一的,同名则会覆盖之前的cookie

  1. 把Cookie放入响应中,响应给浏览器,把共享的数据存储到浏览器中
response.addCookie(cookie);
  1. 从请求中获取Cookie及里面的数据
Cookie[] cs = request.getCookie();
String cookie_value=null;
for(Cookie c:cs){
	if(c.getName.equals("想要获取的name-value键值对的name")){
		cookie_value = c.getValue();
		break;
	}
}

其他cookie操作

  • 设置cookie最大存活时间
cookie.setMaxAge(int seconds);

Cookie的生命周期,默认是在关闭浏览器的时候销毁
seconds = 0: 删除Cookie;
seconds < 0: 关闭浏览器时销毁
seconds > 0: 存储指定的秒数.

  • 修改cookie的值
    新建一个相同name的cookie对象,加入response中,重新覆盖

Session

Session是服务器端技术,服务器在运行时可以为每一个用户的浏览器创建一个独享的session对象.由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其他web资源时,其他web资源再从用户各自的session中取出数据为用户服务.总而言之,将数据保存在服务器.

  • Session工作流程为:
    首先客户端登录账号密码访问服务器, 服务器收到请求后获取到参数内容后, 创建一个session对象, 获取sessionId, 将sessionid保存到cookie中(Cookie c = new Cookie(“JSESSIONID”, sessionid)), 然后通过response.addCookie©响应给客户端, 获取到的参数也要保存到session中, 当客户端再次请求服务端时, 就会携带带有sessionid的cookie请求服务器, 此时通过sessionid获取session对象, 再从session中获取共享数据~

1.获取Session对象

HttpSession session = request.getSession(): 获取Session对象,如果没有Session对象,直接创建一个新的返回,缺省值

2.设置共享数据

  1. 往Session中存放键值对
session.setAttribute(String name, Object value);
  1. 从Session中取出数据
Object value = session.getAttribute(String key);
  1. 删除Session中指定key的键值对
session.removeAttribute(String key);
  1. 销毁Session对象(Session中所有键值对都不存在了)
session.invalidate();

3.demo

@WebServlet(urlPatterns = "/session")
public class SessionServlet extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		String sid = session.getId();
		Cookie jsessionid = new Cookie("JSESSIONID", sid);
		jsessionid.setMaxAge(60*2);
		response.addCookie(jsessionid);
	}
}

Servlet三大作用域对象

  • HttpServletReuqest
    每一次请求都是一个新的request对象,如果在Web组件之间需要共享同一个请求中的数据,只能使用请求转发

  • HttpSession
    每一次会话都是一个新的session对象,如果需要在一次会话中的多个请求之间需要共享数据,只能使用session.

  • ServletContext
    应用对象,Tomcat启动到Tomcat关闭,表示一个应用,在一个应用中有且只有一个application对象,作用于整个Web应用,可以实现多次会话之间的数据共享

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值