WEB核心【请求转发(阶段重点)】第六章

举报
爱吃豆的土豆 发表于 2022/09/25 03:50:43 2022/09/25
【摘要】 目录 1:请求转发【阶段重点】 1.1:语法格式及转发使用 1.2:request域对象 1.3:小结:请求转发间做数据传递 1.4:请求转发访问受保护目录 1:请求转发【阶段重点】 1.1:语法格式及转发使用 格式:forward:/要跳转的程序或者页面 forward:/index.html  &n...

目录

1:请求转发【阶段重点】

1.1:语法格式及转发使用

1.2:request域对象

1.3:小结:请求转发间做数据传递

1.4:请求转发访问受保护目录


1:请求转发【阶段重点】

1.1:语法格式及转发使用

格式:forward:/要跳转的程序或者页面

forward:/index.html        跳转到项目根目录的index.html页面

forward:/demo/index.html      跳转到项目demo目录的index.html页面

forward:/d1?method = run1 跳转到项目d1程序的run1方法

入门案例:

web.xml:注册一个servlet程序


  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <servlet>
  7. <servlet-name>Demo1Servlet</servlet-name>
  8. <servlet-class>com.czxy.demo1.servlet.Demo1Servlet</servlet-class>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>Demo1Servlet</servlet-name>
  12. <url-pattern>/d1</url-pattern>
  13. </servlet-mapping>
  14. </web-app>

Demo1Servlet:


  
  1. public class Demo1Servlet extends BaseServlet {
  2. //访问run1方法时,run1方法在控制台打印run1,并且将程序跳转到
  3. //01.html上
  4. //注意:forward中的第一个/,代表项目的根目录,项目的根目录从当前项目的web目录开始
  5. public String run1(){
  6. System.out.println("run1");
  7. return "forward:/01.html";
  8. }
  9. }

小结:

forward:/资源路径

forward中的第一个/,代表项目的根目录,项目的根目录从当前项目的web目录开始

Servlet之间的跳转


  
  1. //访问run2,在控制台打印run2,将程序跳转到d1?method=run3,run3方法打印run3
  2. public String run2(){
  3. System.out.println("run2");
  4. return "forward:/d1?method=run3";
  5. }
  6. public String run3(){
  7. System.out.println("run3");
  8. return null;//禁止进行递归跳转
  9. }

 注意:请求转发不会修改地址栏路径,用户不知道服务器进行过跳转操作

Servlet之间的跳转,传递参数

Person:  name   age


  
  1. public class Person implements Serializable {
  2. private String id;
  3. private String name;
  4. private String age;
  5. //get/set/无参/有参/toString 自行创建
  6. }

Servlet


  
  1. //访问run4,控制台打印run4,将程序跳转到d1?method=run5,传递name=xiaozhang&age=18,run5方法打印person数据
  2. public String run4(){
  3. System.out.println("run4");
  4. return "forward:/d1?method=run5&name=张三&age=18";
  5. }
  6. public String run5(){
  7. Person person = toBean(Person.class);
  8. System.out.println(person);
  9. return null;
  10. }

 当前传递中文参数没有乱码风险,原因是:

 

post请求传递参数,并再次传递参数 

 run6.html


  
  1. <form method="post" action="/day04_1/d1">
  2. <input type="hidden" name="method" value="run6"/>
  3. 姓名:<input type="text" name="name" value="张三"/><br/>
  4. 年龄:<input type="text" name="age" value="18"/><br/>
  5. <input type="submit"/>
  6. </form>

Demo1Servlet


  
  1. //浏览器将post请求参数传递过来,请求转发到run7,并将person数据带给run7
  2. public String run6() throws ServletException, IOException {
  3. Person person = toBean(Person.class);
  4. System.out.println(person);
  5. //下面的注释语句,就是请求转发的完整代码
  6. //getRequest().getRequestDispatcher("/d1?method=run7").forward(getRequest(),getResponse());
  7. return "forward:/d1?method=run7";
  8. }
  9. public String run7(){
  10. Person person = toBean(Person.class);
  11. System.out.println("run7"+person);
  12. return null;
  13. }

小结:

由ServletA请求转发到ServletB过程中,使用的是同一个请求信息(行、头、体)

ServletA可以将请求数据请求转发到ServletB

扩展:若在请求转发中,请求参数需要发生变化:


  
  1. //浏览器将post请求参数传递过来,请求转发到run7,并将person数据带给run7
  2. public String run6() throws ServletException, IOException {
  3. Person person = toBean(Person.class);
  4. System.out.println(person);
  5. //下面的注释语句,就是请求转发的完整代码
  6. //getRequest().getRequestDispatcher("/d1?method=run7").forward(getRequest(),getResponse());
  7. return "forward:/d1?method=run7&name=李四";
  8. }
  9. public String run7(){
  10. Person person = toBean(Person.class);
  11. System.out.println("run7"+person);
  12. return null;
  13. }

请求转发过程中,请求体没有发生改变。

请求参数获取中,优先获取请求行,再获取请求体(新请求行参数覆盖了原来的请求参数)

1.2:request域对象

域对象:

相当于一个Map集合,在指定范围内可以进行数据传递和共享

ServletContext

HttpSession

HttpServletRequest---- 作用范围:请求转发之间

PageContext

run8.html


  
  1. <form method="post" action="/day04_1/d1">
  2. <input type="hidden" name="method" value="run8"/>
  3. 姓名:<input type="text" name="name" value="张三"/><br/>
  4. 年龄:<input type="text" name="age" value="18"/><br/>
  5. <input type="submit"/>
  6. </form>

 Demo1Servlet


  
  1. public String run8(){
  2. getRequest().setAttribute("k1","v1");
  3. return "forward:/d1?method=run9";
  4. }
  5. public String run9(){
  6. System.out.println(toBean(Person.class));//请求参数
  7. System.out.println(getRequest().getAttribute("k1"));//request作用域
  8. System.out.println(getRequest().getAttribute("k2"));//request作用域
  9. return null;
  10. }

1.3:小结:请求转发间做数据传递

目标: 熟练进行资源之间的内部跳转

①:在转发时,?参数列表形式进行拼接:

格式:return "forward:/资源路径?k1=v1&k2=v2";

优先级较高,会覆盖原来的同名参数

注意:该形式只能转发 字符串数据

②:在转发前,向request作用域设置键值对。

格式:getRequest().setAttribute("k",v); //value值Object

注意:该形式相当于转发间的map集合,可以转发一切数据

1.4:请求转发访问受保护目录

WEB-INF是受保护目录,里面的资源,浏览器不能直接访问

WEB-INF访问方式就是通过请求转发 跳转进来:


  
  1. public String run10(){
  2. //请求转发到web-inf里 p3.png
  3. return "forward:/WEB-INF/p3.png";
  4. }

请求转发:

return "forward:/WEB-INF/资源路径";

最后:

        如果文章对您有帮助,就拿起小手赶紧给博主点赞💚评论❤️收藏💙 一下吧! 

        愿我们在未来的日子里。熠熠生辉!!!

文章来源: qianxu.blog.csdn.net,作者:爱吃豆的土豆,版权归原作者所有,如需转载,请联系作者。

原文链接:qianxu.blog.csdn.net/article/details/124975248

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。