20201030冯强

总结:

1 request

2 http请求信息的组成部分

前边我们学习了 http 请求,现在我们来学习请求信息的组成,通过学习请求信息了解浏览器将哪些数

据,按照什么样的格式发送给服务器。

http 请求一共分为三个部分:请求行,请求头,请求体。

2.1 http协议get请求方式:

\1. 创建一个工程,在web文件夹中创建一个1.html,内容为:

启动服务器测试,访问http://localhost:8080/demo/1.html

Title

1

2

3

4

5

6

7

8

9

10

11

12

13get请求方式

post请求方式

数据长度是否有限制

是否包含请求体

数据是否暴露再地址栏

2.2 http协议post请求方式:

\1. http协议post请求方式,填写输入框,并点击提交。请求内容:

2.3 请求行

请求行:POST /demo/1.html HTTP/1.1

POST :请求方式

/demo/1.html :访问路径

HTTP/1.1 :http协议的版本

get和post请求方式的区别?

请求行我们只要可以读懂请求行内容和了解get和post请求方式的区别即可。

2.4 请求头(了解)

Host: localhost:8080 (服务器的域名)

Connection: keep-alive (网络连接是持久的)

Content-Length: 14 (发送数据的大小,单位字节)

Pragma: no-cache (跟Cache-Control: no-cache相同Pragma: no-

cache兼容http 1.0 ,Cache-Control: no- cache是

http 1.1提供的。因此,Pragma: no- cache可以应用到

http 1.0 和http 1.1,而 Cache-Control: no-cache只能

应用于http 1.1)

Cache-Control: no-cache

Origin: http://localhost:8080 (指示了请求来自于哪个站点——服务器名称)

Upgrade-Insecure-Requests: 1 (如果存在更安全的响应,客户端优先选择加密及带有身份验

证的响应)

Content-Type: application/x-www-form-urlencoded (发送数据的媒体类型——发挥作用类

似后缀名:.mp3 .avi)

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36

(KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36 (当前系统和浏览器版本)

1

2

3

4

5

6

7

8

9在这所有的请求头中,比较重要的有两个,这两个需要记住:

2.5 请求体

注意:get请求没有请求体,post请求有请求体

3 request对象的基本概念

3.1 什么是HttpServletRequest

HttpServletRequest 对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的

所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

以下是API文档中的介绍:

javax.servlet.http.HttpServletReuqest 不是相关请求的顶级接口,它继承自父接口

ServletRequest

Sec-Fetch-Mode: navigate (暴露一个请求的模式到服务器。它是一个结构化报头)

Sec-Fetch-User: ?1

Accept:

text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng

,/;q=0.8,application/signed-exchange;v=b3

Sec-Fetch-Site: same-origin

Referer: http://localhost:8080/demo/1.html (上一次请求的地址)

Accept-Encoding: gzip, deflate, br

Accept-Language: zh-CN,zh;q=0.9

Cookie: JSESSIONID=120029B729C42F8174BA6B1086FB41C2

10

11

12

13

14

15

16

17

Referer: http://localhost:8080/demo/1.html

上一次请求的地址

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36

(KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36

当前用户的系统和浏览器版本。

1

2

3

4

username=admin (表单中的内容)

1

public interface HttpServletRequest extends ServletRequest

1通过 Request 对象进行的常用操作:

获取客户端信息

获取请求头信息

获取请求参数

利用请求域传递对象

3.2 request获取请求行信息

3.2.1 请求行的组成元素(通过request获取请求行数据)

在http协议中我已经看到了http协议中请求行的内容——分为请求方式、请求路径、协议版本。在

HttpServletRequest 概述中我们知道浏览器与请求相关的数据封装在 request 中,因此,接下来我

们学习如何使用request对象获取请求行的数据。

3.2.2 常用方法

\1. String getMethod() 获取请求方式的类型

\2. String getRequestURI() 获取请求行中的资源名部分

\3. StringBuffer getRequestURL() 获取客户端发出请求完整URL

注:

uri: 统一资源标识符,用来标识一个资源,资源路径。(相当于身份证)

url: 统一资源定位符,是一种具体的URI,可以用来标识一个资源.并且指明了如何定位一个资

源. (相当于身份证中的地址)

\4. String getProtocol() 获取当前协议的名称和版本

\5. String getRemoteAddr() 获取IP地址

\6. int getLocalPort() 获取端口

3.2.3 示例

\1. 创建 DemoServlet 类,继承 HttpServlet

\2. 在 DemoServlet 中的 doGet 或者 doPost 方法的参数列表,已经包含了 request 对象,调用方法

即可。

\3. 将数据打印在控制台

代码:

public interface ServletRequest

1

package com.itlaobing.demo.servlet;

1

2import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

/**

* @Classname com.itlaobing.demo.servlet.DemoServlet

* @Description TODO()

* @Date 2019/11/14 23:40

* @Author by Administrator

* @Version v1.0

*/

@WebServlet(name = "DemoServlet", urlPatterns = "/demo")

public class DemoServlet extends HttpServlet {

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse

response) throws ServletException, IOException {

doGet(request, response);

}

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse

response) throws ServletException, IOException {

/**

* 1. String getMethod() 获取请求方式的类型

* */

String method = request.getMethod();

System.out.println("获取请求方式的类型: " + method);

/**

* 2. String getRequestURI() 获取请求行中的资源名部分

* */

String requestURI = request.getRequestURI();

System.out.println("获取请求行中的资源名部分:" + requestURI);

/**

* 3. StringBuffer getRequestURL() 获取客户端发出请求完整URL

* */

StringBuffer getRequestURL = request.getRequestURL();

System.out.println("获取客户端发出请求完整URL:" + getRequestURL);

/**

* 4. String getProtocol() 获取当前协议的名称和版本

* */

String getProtocol = request.getProtocol();

System.out.println("获取当前协议的名称和版本:" + getProtocol);

/**

* 5. String getRemoteAddr() 获取IP地址

* */

String getRemoteAddr = request.getRemoteAddr();

System.out.println("获取IP地址:" + getRemoteAddr);

/**

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58启动并访问:http://127.0.0.1:8080/demo/demo

再次访问:http://localhost:8080/demo/demo,结果如下:

观察两次打印的IP地址会发现不一样,因此,注意localhost和127.0.0.1效果一致,但是localhost

默认使用ipv6本机地址——0:0:0:0:0:0:0:1,而127.0.0.1是ipv4的本机地址。

3.3 request获取请求头信息

3.3.1 常用方法

\1. String getHeader(String name) 以String 的形式返回指定请求头的值

\2. Enumeration getHeaderNames() 返回此请求包含的所有头名称的枚举

3.3.2 示例

\1. 创建 DemoServlet2

\2. 在 DemoServlet2 中的 doGet 或者 doPost 方法的参数列表,已经包含了 request 对象。因此,

调用方法即可。

\3. 将结果打印在控制台

* 6. int getLocalPort() 获取端口

* */

int localPort = request.getLocalPort();

System.out.println("获取端口:" + localPort);

}

}

59

60

61

62

63

64

65

66

获取请求方式的类型: GET

获取请求行中的资源名部分:/demo/demo

获取客户端发出请求完整URL:http://127.0.0.1:8080/demo/demo

获取当前协议的名称和版本:HTTP/1.1

获取IP地址:127.0.0.1

获取端口:8080

1

2

3

4

5

6

获取请求方式的类型: GET

获取请求行中的资源名部分:/demo/demo

获取客户端发出请求完整URL:http://localhost:8080/demo/demo

获取当前协议的名称和版本:HTTP/1.1

获取IP地址:0:0:0:0:0:0:0:1

获取端口:8080

1

2

3

4

5

6

package com.itlaobing.demo.servlet;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

1

2

3

4

5

6

7

8启动,并访问:http://localhost:8080/demo/demo2。结果如下:

import java.util.Enumeration;

/**

* @Classname DemoServlet2

* @Description TODO()

* @Date 2019/11/15 16:06

* @Author by Administrator

* @Version v1.0

*/

@WebServlet(name = "DemoServlet2", urlPatterns = "/demo2")

public class DemoServlet2 extends HttpServlet {

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse

response) throws ServletException, IOException {

doGet(request, response);

}

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse

response) throws ServletException, IOException {

/**

* 1. String getHeader(String name) 以 String 的形式返回指定请求头的值

* */

String header = request.getHeader("User-Agent");

System.out.println("getHeader:" + header);

System.out.println();

/**

* 2. Enumeration getHeaderNames() 返回此请求包含的所有头名称的枚举

* */

Enumeration headerNames = request.getHeaderNames();

while (headerNames.hasMoreElements()) {

System.out.println("==========================================");

String name = headerNames.nextElement();

System.out.println("getHeaderNames:" + name);

System.out.println("getHeader:" + request.getHeader(name));

System.out.println("==========================================");

}

}

}

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

getHeader:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36

(KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36

getHeaderNames:host

getHeader:localhost:8080

getHeaderNames:connection

1

2

3

4

5

6

7

83.3.3 案例:使用referer 实现防盗链

3.3.3.1 案例需求

什么是盗链?如图所示:

getHeader:keep-alive

getHeaderNames:cache-control

getHeader:max-age=0

getHeaderNames:upgrade-insecure-requests

getHeader:1

getHeaderNames:user-agent

getHeader:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36

(KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36

getHeaderNames:sec-fetch-mode

getHeader:navigate

getHeaderNames:sec-fetch-user

getHeader:?1

getHeaderNames:accept

getHeader:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,

image/apng,/;q=0.8,application/signed-exchange;v=b3

getHeaderNames:sec-fetch-site

getHeader:none

getHeaderNames:accept-encoding

getHeader:gzip, deflate, br

getHeaderNames:accept-language

getHeader:zh-CN,zh;q=0.9

getHeaderNames:cookie

getHeader:JSESSIONID=3C884CC7E3EDF9FB1F84D8EE3B286D64

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51如何防止盗链?

答:在上图中用户一共发送两次请求,第一次访问正规服务器中的 download.jsp 页面,

第二次访问盗链者服务器中的 download.jsp 页面,二个 download.jsp 页面虽然内容相同,但来源不

相同。

如果 download.jsp 中的请求,来源于盗链者服务器,我们就显示不可以下载;

如果 download.jsp 中的请求,来源于正规服务器,我们就显示可以下载;

3.3.3.2 预期结果

两次请求同一个域名,显示可以下载

两次请求不同域名,显示无法下载

3.3.3.3 案例分析

\1. 创建一个 DownloadServlet ,继承 HttpServlet 。

\2. 使用 request 对象的 getHeader 方法获取 referer 请求头信息。

\3. 通过 referer 判断请求的来源地址,判断是否与当前项目统一。

3.3.3.4 实现

\1. servlet演示代码:

package com.itlaobing.demo.servlet;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.io.PrintWriter;

/**

* @Classname DownloadServlet

* @Description 使用referer实现防盗链 用户->download.jsp->DownloadServlet

* @Date 2019/11/14 23:55

* @Author by Administrator

* @Version v1.0

*/

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

\172. download.jsp 代码:

\3. 测试1:

@WebServlet(name = "DownloadServlet", urlPatterns = "/downloadServlet")

public class DownloadServlet extends HttpServlet {

@Override

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

this.doGet(request, response);

}

@Override

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

//处理响应中文乱码

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

//获取输出流 往页面上写内容

PrintWriter writer = response.getWriter();

//获取请求头referer

String referer = request.getHeader("referer");

//如果请求头referer存在,且请求来源于正规服务器的download.jsp页面的话

if (referer != null &&

referer.equals("http://127.0.0.1:8080/demo/download.jsp")) {

//没有盗链,在浏览器中显示可以下载

writer.write("可以下载");

} else {

//请求来源于盗链者服务器的download.jsp页面的话

writer.write("这是盗链,不可以下载");

}

writer.flush();

writer.close();

}

}

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

<%–

Created by IntelliJ IDEA.

User: Administrator

Date: 2019/11/15

Time: 16:20

To change this template use File | Settings | File Templates.

–%>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

Title

下载

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18第一次访问正规服务器中的 download.jsp 页面,并发出下载请求,正规服务器中的

DownloadServlet 通过验证 referer 的来源是否合理,这次下载请求来源合理,所以显示“可以

下载”。

测试2:

第二次直接访问的 downloadServlet 页面,发出下载请求,正规服务器中的 DownloadServlet 通

过验证 referer 的来源是否合理,这次下载请求来源不合理, 所以显示“这是盗链,不可以下载”。

3.4 获取请求参数

学习完了对请求行和请求头的内容,最后一部分就是请求体了,在请求体中,包含的是用户通过浏览

器发送的请求参数,因此,我们主要学习的就是获取请求参数的方法。

3.4.1 常用方法

\1. String getParameter(String name) 根据表单的name属性 获取对应的值

\2. String[] getParameterValues(String name) 获取name相同的所有value 例如复选框。

\3. Map getParameterMap() 参数名作为key,参数值作为value,封装到map中。

3.4.2 2.4.2 示例

\1. 在 web 文件夹下创建 get_param.html

\2. 创建 GetParameterServlet ,继承 HttpServlet

Title

用户名:

爱 好:足球

篮球

1

2

3

4

5

6

7

8

9

10

11

12

13

14

\153. 在 GetParameterServlet 中的 doGet 和 doPost 方法的参数列表,已经包含了 request 对象,调

用相应方法即可。

代码:

启动 tomcat 并访问:http://localhost:8080/demo/get_param.html,输入数据并提交

package cn.itcast.web;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.util.Map;

@WebServlet(name = "GetParameterServlet",urlPatterns = "/getParam")

public class GetParameterServlet extends HttpServlet {

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

doGet(request,response);

}

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

/**

* 1. String getParameter(String name)

根据表单的name属性 获取对应的值

* */

String username = request.getParameter("username");

System.out.println(username);

/**

* 2. String[] getParameterValues(String name)

获取name相同的所有value 例如复选框。

* */

String[] hobbies = request.getParameterValues("hobby");

for (String hobby : hobbies) {

System.out.println(hobby);

}

/**

* 3. Map getParameterMap()

参数名作为key,参数值作为value,封装到map中。

* */

Map map = request.getParameterMap();

for (String key : map.keySet()) {

for (String s : map.get(key)) {

System.out.println(s);

}

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44结果如下:

3.4.3 乱码解决

3.4.3.1 请求参数乱码的由来

我们在输入一些中文数据提交给服务器的时候,服务器解析显示出来的一堆无意义的字符,就是乱码。

乱码产生的原因之前已经学习过,是因为读取和输出时使用的编码不一样导致的。

在 Html 中,我们设置的编码格式为 ,而 tomcat 创建的 request 对象在解

析浏览器请求时使用的是 iso-8859-1 编码表进行解码,所以导致乱码。解决方案就是在 servlet 获取

到 request 后按照正确的编码解码。

有乱码那么必须处理乱码,不同的请求方式处理乱码操作不同。

3.4.3.2 方法

3.4.3.3 实例

\1. 修改 GetParameterServlet

\2. 在 GetParameterServlet 的 doPost 或者 doGet 方法中第一行,调用 setCharacterEncoding 方

法设置编码

\3. 然后获取请求参数

注意:获取请求参数之后,调用setCharacterEncoding方法无效

添加代码:

3.4.4 案例:使用BeanUtils封装表单提交的数据到javaBean对象中

admin

basketball

admin

basketball

1

2

3

4

void setCharacterEncoding(String env) //设置请求体的编码

1

//处理请求乱码

request.setCharacterEncoding("utf-8");

1

23.4.4.1 案例需求

现在我们已经可以使用request对象来获取请求参数,但是,如果参数过多,我们就需要将数据封装

到对象。

以前封装数据的时候,实体类有多少个字段,我们就需要手动编码调用多少次setXXX方法,因此,我们

需要BeanUtils来解决这个问题。

3.4.4.2 预期效果

使用BeanUtils,完成数据的封装到实体类。

3.4.4.3 案例分析

\1. 设置一个登录页面准备提交表单数据(username、password)

\2. 导入 BeanUtils 相关jar包

\3. 创建 Servlet 获取请求参数

\4. 调用 BeanUtils.populate 方法封装数据

3.4.4.4 实现

\1. 准备 login.html 页面

\2. 在web目录下创建WEB-INF\lib文件夹,导入 BeanUtils 相关jar包

\3. 关联jar包到项目

Title

用户名
密码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

commons-beanutils-1.9.3.jar

commons-collections-3.2.2.jar

commons-logging-1.2.jar

1

2

3选择 lib 文件夹

点击OK,完成关联。

\4. 创建实体类 UserModel (要到 lombok jar包)

package com.itlaobing.demo.model;

import lombok.Data;

/**

* @Classname UserModel

* @Description TODO()

* @Date 2019/11/15 14:56

* @Author by Administrator

* @Version v1.0

*/

@Data

public class UserModel {

private int id;

private String username;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

\185. servlet 代码:封装表单数据到 UserModel 对象

private String userPass;

}

19

20

21

22

package com.itlaobing.demo.servlet;

import com.itlaobing.demo.model.UserModel;

import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.util.Map;

/**

* @Classname LoginServlet

* @Description TODO()

* @Date 2019/11/15 15:03

* @Author by Administrator

* @Version v1.0

*/

@WebServlet(name = "LoginServlet",urlPatterns = "/login")

public class LoginServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse

resp) throws ServletException, IOException {

doPost(req, resp);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse

resp) throws ServletException, IOException {

//设置编码

req.setCharacterEncoding("utf-8");

//获取请求参数

Map map = req.getParameterMap();

//创建要封装数据的对象

UserModel user = new UserModel();

//封装前数据

System.out.println(user);

try {

//封装数据

BeanUtils.populate(user, map);

} catch (Exception e) {

e.printStackTrace();

}

//封装后数据

System.out.println(user);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48结果如下:

3.5 request的其他方法

3.5.1 获取上下文路径(工程名字)

String getContextPath() 获取上下文路径(工程名字)

代码:

输出结果:

}

49

50

UserModel(id=0, username=null, userPass=null)

UserModel(id=0, username=张三, userPass=123456)

1

2

package com.itlaobing.demo.servlet;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

/**

* @Classname ContextPathServlet

* @Description TODO()

* @Date 2019/11/18 15:59

* @Author by Administrator

* @Version v1.0

*/

@WebServlet("/context")

public class ContextPathServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse

response) throws ServletException, IOException {

doGet(request, response);

}

protected void doGet(HttpServletRequest request, HttpServletResponse

response) throws ServletException, IOException {

//获取上下文路径

String contextPath = request.getContextPath();

System.out.println(contextPath);

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

/demo

13.5.2 作用域。

所谓“作用域”就是“信息共享的范围”,也就是说一个信息能够在多大的范围内有效。也称为域或者存储

范围,有四大存储范围。今天学习request域对象,就是可以在一次请求中的多个servlet之间进行数据

共享.

3.5.2.1 常用方法

void setAttribute(String name, Object o) 设置属性到域中

Object getAttribute(String name) 从域中获取属性值

void removeAttribute(String name) 从域中移除属性

以上三个方法都是操作request中域对象的数据,与请求参数无关

3.5.2.2 示例

\1. 创建 ScopeServlet ,继承 HttpServlet

\2. 调用 request 对象存( setAttribute )取( getAttribute )删( removeAttribute )方法

\3. 在保存和删除方法调用完成之后,都是获取方法获取数据,打印在控制台上

代码

package com.itlaobing.demo.servlet;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

/**

* @Classname ScopeServlet

* @Description TODO()

* @Date 2019/11/18 16:09

* @Author by Administrator

* @Version v1.0

*/

@WebServlet(name = "ScopeServlet", urlPatterns = "/scope")

public class ScopeServlet extends HttpServlet {

@Override

protected void doPost(HttpServletRequest request, HttpServletResponse

response) throws ServletException, IOException {

doGet(request, response);

}

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse

response) throws ServletException, IOException {

//存入数据

request.setAttribute("name", "张三");

//获取数据

String name1 = (String) request.getAttribute("name");

System.out.println(name1);

//移除数据

request.removeAttribute("name");

String name2 = (String) request.getAttribute("name");

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33输出结果:

3.5.3 请求转发

什么是请求转发?请求转发就是对请求进行转发。例如 login.jsp 提交表单给 LoginServlet ,表示

login.jsp 对 LoginServlet 发出了请求。 LoginServlet 验证登录后可以将请求转发给

IndexServlet ,由 IndexServlet 完成对请求的响应。

3.5.3.1 常用方法

RequestDispatcher getRequestDispatcher(String path) 获取请求转发器(request对象方

法)

void forward(ServletRequest request, ServletResponse response) 将请求转发到另一

个资源(servlet)上( RequestDispatcher 对象的方法)

3.5.3.2 示例

步骤:

\1. 先通过请求对象获取转发器

\2. 再调用转发器转发方法,转发请求

代码

\1. DispatcherServlet:

System.out.println(name2);

}

}

34

35

36

37

38

张三

null

1

2

package com.itlaobing.demo.servlet;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

1

2

3

\42. TestServlet:

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

/**

* @Classname DispatcherServlet

* @Description TODO()

* @Date 2019/11/16 16:22

* @Author by Administrator

* @Version v1.0

*/

@WebServlet(name = "DispatcherServlet", urlPatterns = "/dispatcher")

public class DispatcherServlet extends HttpServlet {

@Override

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

doGet(request, response);

}

@Override

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

System.out.println("对用户请求第一次处理");

//设置信息

request.setAttribute("result", "success");

//请求转发

request.getRequestDispatcher("/test").forward(request,

response);

}

}

标签

评论

this is is footer