Web组件之间的跳转方式
1.请求转发
从Servlet1,请求转发到Servlet2. Servlet1完成一部分功能,再跳转到Servlet2继续完成剩下的功能.
-
语法
request.getRequestDispatcher(String path).forward(request,response)
参数path为需要转发到的url地址,如"/hello" -
特点
- 浏览器的地址栏不发生改变.
- 请求转发只发送一个请求
- 共享同一个请求中的数据
- 最终响应给浏览器的由Servlet2来决定
2.URL重定向
- 语法
response.sendRedirect(String url);
参数url表示目标资源地,如"/learnJava/hello?name=Bob"
这里的url应包含项目名(如/learnJava),因为该地址是用浏览器来进行解析
- 特点
- 浏览器地址栏发生改变
- URL重定向发了两次请求.
- 因为URL重定向是两次独立的请求,所以不共享请求中的数据
- 最终响应给浏览器的由Servlet2来决定
- URL重定向不能访问WEB-INF目录中的资源.
Cookie
Cookie是客户端技术
Cookie操作:
- 创建Cookie对象
Cookie cookie = new Cookie(String name, String value);
name必须是唯一的,同名则会覆盖之前的cookie
- 把Cookie放入响应中,响应给浏览器,把共享的数据存储到浏览器中
response.addCookie(cookie);
- 从请求中获取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.设置共享数据
- 往Session中存放键值对
session.setAttribute(String name, Object value);
- 从Session中取出数据
Object value = session.getAttribute(String key);
- 删除Session中指定key的键值对
session.removeAttribute(String key);
- 销毁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应用,可以实现多次会话之间的数据共享