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

简介: 本篇介绍了:请求转发的使用以及语法格式讲解,避免中文乱码的方式讲解,request域对象讲解,请求转发间做数据传递讲解,请求转发访问受保护目录

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程序

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>Demo1Servlet</servlet-name>
        <servlet-class>com.czxy.demo1.servlet.Demo1Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Demo1Servlet</servlet-name>
        <url-pattern>/d1</url-pattern>
    </servlet-mapping>
</web-app>

image.gif

Demo1Servlet:

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

image.gif

小结:

forward:/资源路径

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

Servlet之间的跳转

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

image.gif

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

Servlet之间的跳转,传递参数

Person:  name   age

public class Person implements Serializable {
    private String id;
    private String name;
    private String age;
    //get/set/无参/有参/toString 自行创建
}

image.gif

Servlet

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

image.gif

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

image.gif编辑 

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

image.gif编辑

run6.html

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

image.gif

Demo1Servlet

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

image.gif

小结:

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

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

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

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

image.gif

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

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

1.2:request域对象

域对象:

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

ServletContext

HttpSession

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

PageContext

image.gif编辑

run8.html

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

image.gif

Demo1Servlet

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

image.gif

image.gif编辑

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

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

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

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

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

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

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

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

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

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

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

image.gif编辑

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

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

image.gif

请求转发:

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

image.gif编辑

最后:

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

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

相关文章
|
3月前
|
存储 开发框架 JSON
在 Python 中,如何处理 Web 请求和响应?
【2月更文挑战第26天】【2月更文挑战第90篇】在 Python 中,如何处理 Web 请求和响应?
79 0
|
9月前
[Web程序设计]实验: 请求与响应
[Web程序设计]实验: 请求与响应
|
4天前
|
开发框架 缓存 .NET
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
|
2月前
|
JSON 前端开发 Java
一文读Web开发 之接口后端接口、类与前端请求、拦截器编写
一文读Web开发 之接口后端接口、类与前端请求、拦截器编写
49 6
|
2月前
|
运维 Java 测试技术
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
31 3
|
3月前
|
前端开发 数据库 Python
使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
【1月更文挑战第13天】使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
204 7
|
3月前
|
存储 网络协议 Linux
《网络是怎么样连接的》读书笔记 - WEB服务端请求和响应(五)
《网络是怎么样连接的》读书笔记 - WEB服务端请求和响应(五)
54 0
|
2月前
|
XML 前端开发 JavaScript
后端请求响应和分层解耦web开发的三层架构
后端请求响应和分层解耦web开发的三层架构
26 0
|
3月前
|
JSON JavaScript 中间件
使用 Node.js 开发一个简单的 web 服务器响应 HTTP get 请求
使用 Node.js 开发一个简单的 web 服务器响应 HTTP get 请求
|
3月前
|
JSON JavaScript API
使用 Node.js 开发一个简单的 web 服务器响应 HTTP post 请求
使用 Node.js 开发一个简单的 web 服务器响应 HTTP post 请求