请求转发、重定向、路径

请求转发forward

请求转发图示

【建议记住图像】红圈代表域对象的范围

请求转发:一种在服务器内部的资源跳转方式
步骤:

  1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)

  2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

    request.getRequestDispatcher("/requestDemo2").forward(request, response);
    

    请求转发特点:

    1. 浏览器地址栏路径不发生变化

    2. 只能转发到当前服务器内部资源中。

    3. 转发是只发出一次请求,收到一次响应。可以使用requset对象来共享数据

共享数据

共享数据:
域对象:一个有作用范围的对象,可以在范围内共享数据
requset域:代表一次请求的范范围,一般用于请求转发的多个资源中共享数据
方法:

  1. void setAttribute(String name , Object obj):存储数据

  2. Object getAttitude(String name):通过键获或值

  3. void removeAttribute(String name):通过键移除键值对

    //在Demo1里:
    requset.setAttribute("msg", hello);
    //在Demo2里:获取
    Object msg = requset.getAttribute("msg");//可以获取hello
    
响应消息

在这里插入图片描述

重定向

重定向图示

response.sendRedirect("/day15/responseDemo2");

防止虚拟目录发生改变:(动态获取虚拟目录)【推荐】

response.sendRedirect(requset.getContextPath()+"/responseDemo2");

注意

  • 使用forward方法的Servlet,其标准输出流还未开启;
  • 使用include方法的Servlet,其标准输出流已经开启;
    • 对客户端的响应是include的Servlet给出的

重定向的特点

  1. 地址栏发生变化(是服务器外跳转)。地址栏中显示的是重定向的请求路径,而非用户提交请求的路径。因此,重定向可以防止表单的重复提交
  2. 重定向可以访问其他站点(服务器、应用)的资源(例如在Servlet里跳转到百度)
  3. 重定向是两次请求===>因此不可以使用requset对象来共享数据(即无法用setAttribute与getAttribute来获取数据)也不能直接获取用户提交请求中所携带的数据
  4. 两次请求,两次响应。

路径写法:

1.相对路径:通过相对路径不可以确定唯一资源

  • 如: ./index.html
  • 不以/开头,以.开头路径

**规则:**找到当前资源与目标资源的关系:例如:

目标资源: http://localhost/day15/responseDemo2

当前资源1: location.html http://localhost/day15/location.html

<a href="./responseDemo2">   ./可以省略:即 :  < a href="responseDemo2"> (当前目录)

当前资源2: http://localhost/day15/htmls/location.html

<a href="../responseDemo2">  ../向上退一级目录:  < a href="responseDemo2"> 

2.*绝对路径:通过绝对路径可以确定唯一资源

  • 如:http://localhost/day15/responseDemo2 即/day15/responseDemo2

  • 以/开头的路径

规则:

判断定义的路径是给谁用的?判断请求将来从哪儿发出

  • 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
<a>  ,<form> , 重定向......
  • 服务器使用:不需要加虚拟目录(转发路径)

    • 建议虚拟目录动态获取:requset.getContextPath()

例如:

①给客户端用:在页面浏览器(html里)

<a href="/day15/responseDemo2">

重定向是客户端路径(上面的图,是浏览器主动第二次发给B)==>因此重定向需要加虚拟目录

response.sendRedirect("/day15/demo2");

②给服务器:例如请求转发(不必写虚拟目录day15或getContentPath()):【因为是在同一个服务器】

request.getRequestDispatcher("/requestDemo2").forward(request, response);

服务器输出字符数据到浏览器

response.setContentType("text/html;charset=utf-8");
Printwriter pw = response. getWriter();
pw.write("hello");

步骤:

  1. 获取字符输出流

  2. 输出数据

乱码问题:

  1. Printwriter pw = response. getWriter();获取的流的默认编玛是ISO-8859-1

  2. 设置该流的默认编码

  3. 告诉浏览器响应体使用的编码

简单的形式,设置编玛,是在获取流之前设置

response.setContentType("text/html;charset=utf-8");

服务器输出字节数据到浏览器

response.setContentType("text/html;charset=utf-8");
//获取字节输出流
ServletOutputStream sos = response.getOutputStream();
sos.write("你好".getBytes());

ServletConText对象

获取方式:

//1.通过request对象获取
ServletContext contex1 = request.getServletContext();
//2.通过HttpServlet获取
ServletContext context2 = this.getServletContext();
System.out.printin(contextl == context2);//true
  1. 概念:代表整个web应用,可以和程序的容器(服务器)来通信

  2. 功能:

    1. 获取MIME类型:(text/html)

      String filename = "a.jpg";
      context.getMimeType(filename);//image/jpeg域对象:共享数据(用的少)
      
    2. 获取MIME类型:(text/html)

      void setAttribute(String name , Object obj)//存储数据
      Object getAttitude(String name)//通过键获或值
      void removeAttribute(String name)//通过键移除键值对
      
      • ServletConText对象 作用范围:所有用户所用请求的数据

      • 所有用户可以操纵,不太安全;(声明周期长)驻留时间长

    3. 获取文件服务器路径
      在这里插入图片描述最后还是再添加几张图吧:
      在这里插入图片描述在这里插入图片描述

这里还是推荐黑马的JavaWeb视频,确实可以,b站链接:黑马最新JavaWeb入门到入土(idea版)
自己算是得到了个惨痛教训:以后看视频尽量看最新版的,并且尽量看IDEA版本的😊

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值