Servlet中的请求转发以及会话技术

Servlet中的请求转发:【重点】

什么是请求转发:

是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程是在服务器中实现的,并不是在客户端实现的,所有它的地址栏还是原理的地址。

特点:

  • 请求转发的地址栏不变,这是一次请求

  • 请求转发是服务器内部行为

  • 当做域对象使用,即相当于容器,可以转载数据

  • 两个servlet中请求域数据在一次请求转发中是共享的

工作原理:

  • 用户第一次通过手动方式要求浏览器访问Servlet

  • Servlet工作完成后,通过当前的请求对象代替浏览器向服务器发送请求申请再次调用Servlet1

  • 服务器接受请求后,自动调用Servlet1来完成剩余的任务

实现命令:

//通过当前请求对象生成资源文件(路径)申请报告对象
RequestDispathcher requestDispatcher = request.getRequestDispatcher("路径")
//将报告对象发给服务器
requestDispatcher.forward(request,response)

优点:

  • 无论本次请求涉及到多少Servlet,浏览器只是发送一次请求

  • Servlet之间调用发生在服务器计算机上,节省服务器与浏览器之间往返次数增加处理服务速度

重定向:(Redirect)

是服务端根据逻辑发送一个状态吗,告诉浏览器重新取去请求那个地址,所以地址栏显示的是新的URL

工作原理:

  • 用户第一次通过手动方式通过浏览器访问服务器中的Servlet

  • Servlet工作完毕后,将Servlet1写入到响应头localhost属性中,导致服务器将302状态码写入到状态行

实现命令:

response.sengRedirect("请求地址")

特点:

  • 重定向是浏览器行为

  • 浏览器的根路径是端口,即 http://localhost:8080/

  • 请求如果从” / “开始,就会从8080开始访问,就会丢失项目名,报错404

  • 重定向是两次请求

缺点:

重定向需要在浏览器与服务器之间惊醒多次往返,大量时间消耗在往返上,增加用户等待服务时间

会话技术-状态保存:

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的路径:cookie设置路径,其实就是设置cookie的读取范围

    // 设置cookie路径
    cookie.setPath("/day40/user");
    // 中文编码 
    URLEncoded.encoded("value","UTF-8")
    // 将乱码解码成中文  
    URLDecode.decode(value,"UTF-8")

    Session[重点]

    • 是什么

      • 会话技术,是将数据保存在服务器

      • session基于cookie

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

    • 创建:

    • //从请求中获得session对象
      HttpSession session = request.getSession()
      //session像请求域一样,被叫做session域
              session.setAttribute("name","xiaohua");
              //销毁session
              // session.invalidate();
              //请求转发
              RequestDispatcher requestDispatcher = req.getRequestDispatcher("/se2");
              requestDispatcher.forward(req,resp);
      /获得session
              HttpSession session = req.getSession();
              //取值
              String  username = (String)req.getAttribute("name");

    • 存储数据

      • 一般用在登录成功后,将用户信息存储到session

    • 获取数据[重点]

      • 请求转发后从另外一个Servlet取值,可以取出session的值

      • 重定向后从另外一个Servlet取值,可以取出session的值

      • 因为session域是在整个会话有效,只要会话不结束,当前服务器中的请求都可以获得session域的数据

    • 删除

      // 销毁session
      session.invalidate();

    删除session一般用在注销登录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值