请求转发、重定向、路径
发布日期:2021-05-07 23:14:27 浏览次数:33 分类:原创文章

本文共 3134 字,大约阅读时间需要 10 分钟。

请求转发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站链接:
自己算是得到了个惨痛教训:以后看视频尽量看最新版的,并且尽量看IDEA版本的😊

上一篇:Cookie与Session2[简洁版]
下一篇:Session与Cookie

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年03月27日 05时07分07秒