Servlet之间的交互

1、请求转发

将请求转发给另一个Servlet

//创建一个请求转发
RequestDispatcher requestDispatcher =
req.getRequestDispatcher("接收请求的对象");

//携带请求和响应对象
requestDispatcher.forward("req,resp")

//直接一下写完就行!
RequestDispatcher requestDispatcher =
req.getRequestDispatcher("接收请求的对象").forward("req,resp")

特点

  • 请求转发地址栏不变
  • 请求转发是服务器内部行为
  • 当做域对西昂使用,即相当于容器,可以转载数据
  • 两个servlet中请求域数据再一次请求转发中共享

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q7EdWMgJ-1662380332327)(D:\千峰上课\Every Day Stage2\day40\code\day40_servlet.assets\image-20220905105311320.png)]

1.1请求域

两个方法,实现两个Servlet请求转发中传输数据

  • 在两个servlet请求转发时,会存在A类的数据要传递给B类
  • 此时就需要使用请求对象的请求域功能
  • req.setAttribute(key,value),这样就可以将数据存储在请求对象
  • 在另外一个servlet使用请求对象取出值req.getAttribute(“key”)

2、重定向

重定向也可以使用Servlet直接的跳转,以及跳转页面

//直接输入需要转到的路径
resp.sendRedirect("路径");

特点:

  • 重定向是响应重定向,是浏览器行为
  • 两次请求
  • 地址栏会变化
  • 请求域数据无法共享

2.1路径问题

请求转发是服务器行为,服务器根路径是项目名,

​ 所以发请求,从/开始,不会丢失项目名

重定向是浏览器行为,浏览器根路径是端口

​ 所以发请求,从/开始,就会丢项目名

// req.getContextPath(); // 获得项目名 ,例如 /day40
resp.sendRedirect(req.getContextPath()+"/redirect2"); // 拼接项目名

3、会话技术

HTTP是无状态,保存会话数据的技术:cookie,session

cookie是浏览器技术,储存到浏览器

session是服务器技术,储存到服务器

3.1 Cookie[熟悉]

是保存到浏览器的数据

  • 创建
  • 响应到浏览器
//在服务器中创建
Cookie cookie = new Cookie(key,value);
//用响应添加到浏览器
resp.addCookie(cookie);
  • 获取cookie
// 从请求中获得cookie.一次获得全部的cookie对象
// 但是一次获得当前站点所有cookie对象,没有获得单独某一个cookie
Cookie[] cookies = req.getCookies();
for (int i = 0; cookies != null && i < cookies.length; i++) {
    
    
    Cookie ck = cookies[i];
    String name = ck.getName( );
    String value = ck.getValue( );
    System.out.println(name+"="+value );
}
  • 删除cookie
    • 没有删除的方法
    • 主要靠最大生命值来确定
    • 默认保存至会话结束(浏览器关闭)
    • 也可以通过在创建时指定生命周期
      • setMaxAge
      • 大于0,存在指定的秒
      • 等于0,直接删除
      • 小于0,一般是-1,保存至浏览器关闭(默认的)
        // 创建cookie
        Cookie cookie = new Cookie("username","admin");// 中文会乱码

        // 创建的cookie,默认存储到浏览器关闭.
        // 可以设置时间,单位是秒!!
        // cookie.setMaxAge(30);
        // cookie.setMaxAge(0); // 直接删除该cookie
        cookie.setMaxAge(-1); // 保存至浏览器关闭
  • 设置cookie的路径

设计两个Servlet,来读取CookieServlet1设置的cookie

一个叫UserServlet,映射路径/user/ck,读取cookie

一个叫AdminServlet,映射路径/admin/ck,读取cookie


演示1:

​ CookieServlet1设置的cookie的路径默认是http://localhost/day40/

​ 通过http://localhost/day40/user/ck 能读取到cookie值

​ 通过http://localhost/day40/admin/ck 能读取到cookie值


演示2

​ CookieServlet1设置的cookie的路径为是==/day40/user==

​ 通过http://localhost/day40/user/ck 能读取到cookie值

​ 通过http://localhost/day40/admin/ck 能读取不到cookie值

// 设置cookie路径
cookie.setPath("/day40/user");

总结: cookie设置路径,其实就是设置cookie的读取范围

  • 中文乱码解决

    // 中文编码 URLEncoded.encoded("value","UTF-8")
    // 将乱码解码成中文  URLDecode.decode(value,"UTF-8")
    // cookie中文解决
    // jdk自带有将中文编码和解码的方法
    Cookie cookie = new Cookie(
        URLEncoder.encode("姓名","UTF-8"),
        URLEncoder.encode("张三","UTF-8"));
    
    for (int i = 0; cookies != null && i < cookies.length; i++) {
          
          
        Cookie ck = cookies[i];
        String name = ck.getName( );
        String value = ck.getValue( );
    
        // 解码
        String u = URLDecoder.decode(name, "UTF-8");
        String v = URLDecoder.decode(value, "UTF-8");
    
        System.out.println(u+"="+v );
    }
    

3.2 Session 【重点】

将数据保存到服务器

基于cookie

浏览器会利用cookie存储一个叫做JSESSIONID的值

  • 创建
  • 存储数据
    • 一般用在登录成功之后,将用户信息储存到session
  • 获取数据【重点】
    • 请求转发后从另外一个Servlie取值,可以取出session值
    • 重定向后从另外一个Servlet取值,可以取出session值
    • 因为session域实在整个会话有效,只要会话不结束,当前服务器中的请求都可以后的session域的数据
  • 删除
  // 销毁session
  session.invalidate();

删除session一般用在注销登录

可以取出session值

  • 重定向后从另外一个Servlet取值,可以取出session值
  • 因为session域实在整个会话有效,只要会话不结束,当前服务器中的请求都可以后的session域的数据
  • 删除
  // 销毁session
  session.invalidate();

删除session一般用在注销登录

������������

猜你喜欢

转载自blog.csdn.net/m0_73050509/article/details/126712716
今日推荐