目录
1.2 HttpServletRequest 类的常用方法-源码结构图
1.3 HttpServletRequest 类-部分方法的代码演示-项目结构
1.3.1 编写Servlet处理器-RequestApiServlet extends HttpServlet
2.1 HttpServletRequest 类-获取请求参数代码演示-项目结构
2.1.1 编写一个Servlet处理器-注意POST请求中请求体的中文乱码问题-UTF-8
3.3.1 编写2个Servlet处理器:Servlet1与Servlet2
3.3.2 在 web.xml 文件中配置servlet处理器的访问路径
3.3.3 前端的一次请求(这一次请求前后, 地址栏中的地址不会发生改变)
7.2 HttpServletResponse 类的常用方法-源码结构图
7.3 HttpServletRepose对象:传递数据给客户端时需要使用到流
7.4 HttpServletRepose对象:如何往客户端传递数据
7.5 HttpServletRepose对象:请求重定向及其特点及其实现方式
7.6 HttpServletRepose对象:请求重定向的代码演示-项目结构
7.6.1 编写Servlet动态资源-ResponseServlet1对象和ResponseServlet2对象
7.6.2 在web.xml文件配置Servlet资源的访问路径
1、HttpServletRequest 类
1.1 HttpServletRequest 类的作用
每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求发来的HTTP协议信息 解析好 封装到Request对象中,然后传递到 service()方法中(调用doGet()或doPost()方法) 供编程人员使用,编程人员通过HttpServletRequest对象,可以获取到请求的所有信息。
1.2 HttpServletRequest 类的常用方法-源码结构图
(1)getRequestURI():获取请求的资源路径
(2)getRequestURL():获取请求的绝对路径
(3)getRemoteHost():获取客户端的IP地址
(4)getHeader():获取请求头
(5)getParameter():获取请求参数
(6)getParameterValues():获取请求参数(多个值时使用)
(7)getMethod():获取请求的方式(GET或POST)
(8)setAttribute(key, value):设置域数据
(9)getAttribute(key):获取域数据
(10)getRequestDispatcher():获取请求转发对象
1.3 HttpServletRequest 类-部分方法代码演示-项目结构
1.3.1 编写Servlet处理器-RequestApiServlet extends HttpServlet
package com.wind.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RequestApiServlet extends HttpServlet {
private static final long serialVersionUID = -8497166361222348250L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet done.");
//(1)getRequestURI():获取请求的资源路径
System.out.println("URI=" + request.getRequestURI());
//(2)getRequestURL():获取请求的绝对路径
System.out.println("URL=" + request.getRequestURL());
//(3)getRemoteHost():获取客户端的IP地址
System.out.println("客户端IP=" + request.getRemoteHost());
//(4)getHeader():获取请求头
System.out.println("Header=" + request.getHeader("User-Agent"));
//(5)getMethod():获取请求的方式(GET或POST)
System.out.println("Method=" + request.getMethod());
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost done.");
}
}
1.3.2 web.xml 配置文件
<?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>RequestApiServlet</servlet-name>
<servlet-class>com.wind.servlet.RequestApiServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RequestApiServlet</servlet-name>
<url-pattern>/requestApiServlet</url-pattern>
</servlet-mapping>
</web-app>
1.3.3 Chrome浏览器发出客户端请求
1.3.4 Tomcat服务器响应
2、如何获取从客户端发送过来的请求参数-表单请求
2.1 HttpServletRequest 类-获取请求参数代码演示-项目结构
2.1.1 编写一个Servlet处理器-注意POST请求中请求体的中文乱码问题-UTF-8
package com.wind.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
/**
* 测试在服务器端获取从客户端发出请求的请求参数。
*/
public class ParameterServlet extends HttpServlet {
private static final long serialVersionUID = -6845943440777584931L;
@Override
public void init() throws ServletException {
super.init();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("==doGet方法执行了==");
if (request != null) {
//获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobby = request.getParameterValues("hobby");
System.out.println("用户名=" + username);
System.out.println("密码" + password);
System.out.println("爱好=" + Arrays.asList(hobby));
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("==doPost方法执行了==");
if (req != null) {
//解决post请求中请求体的中文乱码问题
req.setCharacterEncoding("UTF-8");
//获取请求参数
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby = req.getParameterValues("hobby");
System.out.println("用户名=" + username);
System.out.println("密码" + password);
System.out.println("爱好=" + Arrays.asList(hobby));
}
}
}
2.1.2 在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>ParameterServlet</servlet-name>
<servlet-class>com.wind.servlet.ParameterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ParameterServlet</servlet-name>
<url-pattern>/parameterServlet</url-pattern>
</servlet-mapping>
</web-app>
2.1.3 编写前端页面:from.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/07_servlet/parameterServlet" method="GET">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++
<input type="checkbox" name="hobby" value="Java">Java
<input type="checkbox" name="hobby" value="JS">JavaScript<br/>
<input type="submit">
</form>
</body>
</html>
2.1.4 模拟前端页面请求
http://localhost:8080/07_servlet/parameterServlet?username=111&password=222&hobby=Java&hobby=JS
2.1.5 Tomcat服务器响应结果
3、请求转发
3.1 什么是请求转发
请求转发:是指在服务器接收到客户端的请求之后,从一个Servlet资源跳转到另一个Servlet资源的操作过程,叫做请求转发。
3.2 请求转发的特点
3.3 请求转发代码演示-项目结构
3.3.1 编写2个Servlet处理器:Servlet1与Servlet2
package com.wind.servlet;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Servlet1处理器
*/
public class Servlet1 extends HttpServlet {
private static final long serialVersionUID = 7270974308321925570L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求的参数(查看办事的材料)
String username = request.getParameter("username");
System.out.println("在Servlet1(柜台1)中查看参数(材料):" + username);
//2.给材料盖章
request.setAttribute("key1", "柜台1的章");
//3.获得通向Servlet2的路径(即:请求转发对象)
//注意:参数必须以斜杠打头,斜杠代表 http://localhost:8080/工程名/,对应IDEA代码的web目录
//请求可以转发到WEB-INF目录下,比如:request.getRequestDispatcher("/WEB-INF/from.html");
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet2");
//4.通过得到的路径走向Servlet2(柜台2)
//forward方法将当前资源的request和response转发到该requestDispatcher指定的资源中去,
//从而使得Servlet2中获取到的最初的request和response与Servlet1保持一致
requestDispatcher.forward(request, response);
}
}
package com.wind.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Servlet2处理器
*/
public class Servlet2 extends HttpServlet {
private static final long serialVersionUID = 8273702373386138440L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求的参数(查看办事的材料)
String username = request.getParameter("username");
System.out.println("在Servlet2(柜台2)中查看参数(材料):" + username);
//2.查看是否有柜台1的章
Object key1 = request.getAttribute("key1");
System.out.println("柜台1的章为:" + key1);
//3.处理Servlet2自己的业务
System.out.println("Servlet2处理业务结束。整个请求处理结束了(从前端发起一次请求,到后端由两个Servlet处理器处理业务)。");
}
}
3.3.2 在 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>Servlet1</servlet-name>
<servlet-class>com.wind.servlet.Servlet1</servlet-class>
</servlet>
<servlet>
<servlet-name>Servlet2</servlet-name>
<servlet-class>com.wind.servlet.Servlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet1</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Servlet2</servlet-name>
<url-pattern>/servlet2</url-pattern>
</servlet-mapping>
</web-app>
3.3.3 前端的一次请求(这一次请求前后, 地址栏中的地址不会发生改变)
3.3.4 后端处理这一次请求的结果
可以得出:地址栏的内容不发生变化,但页面自动跳转(访问) 到了请求转发对象Servlet2中,即显示 http://localhost:8080/07_servlet/Servlet2的页面。
4、Base 标签的作用
https://blog.csdn.net/weixin_49343190/article/details/107878144
代码示例:1. 在web目录下创建a文件夹下创建b文件夹下创建c.html
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这是a下的b下的c.html<br/>
<a href="../../index.html">跳到web下的index.html</a>
</body>
代码示例:2. 在web目录下创建index.html
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这是web下的index.html页面<br/>
<a href="a/b/c.html">跳转到a下的b下的c.html</a>
</body>
【分析】当在c.html页面准备点击进行跳转时,浏览器的地址栏是http://localhost:63342/FirstWeb/MyTest/web/a/b/c.html,
跳转到index.html页面时的a标签路径是 …/…/index.html,所有相对路径在跳转时都会参照当前浏览器地址栏中的地址来进行跳转,此时跳转的路径是http://localhost:63342/FirstWeb/MyTest/web/a/b/c.html…/…/index.html,进行抵消之后,剩余的路径是http://localhost:63342/FirstWeb/MyTest/web/index.html,路径正确,跳转成功。
代码示例:1. 在web目录下创建a文件夹下创建b文件夹下创建c.html
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这是a下的b下的c.html<br/>
<a href="../../index.html">跳到web下的index.html</a>
</body>
代码示例:2. 在src下创建此 Forward 类,并在web.xml中配置
public class Forward extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("a/b/c.html").forward(request,response);
}
}
代码示例:3. 在web目录下创建index.html
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
这是web下的index.html页面<br/>
<a href= http://localhost:8080/MyTest/Forward>请求转发:a/b/c.html</a>
</body>
分析:在地址栏输入http://localhost:63342/FirstWeb/MyTest/web/index.html,点击后成功跳转到 http://localhost:8080/MyTest/Forward,此时的页面是
点击之后无法跳转,根据以上原因,要跳转的地址是http://localhost:8080/MyTest/Forward…/…/index.html,抵消之后为http://localhost:8080/…/index.html,这是错误的路径,因此跳转失败。
解决方案如下:base标签 可以设置当前页面中所有相对路径跳转时参照指定的路径来进行跳转,在href属性中设置指定路径。
代码示例:4. 将上述c.html文件修改为如下即可成功跳转
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--base标签写在<title>标签之后-->
<base href="http://localhost:8080/MyTest/a/b/">
</head>
<body>
这是a下的b下的c.html<br/>
<a href="../../index.html">跳到web下的index.html</a>
</body>
注:实际开发中都使用绝对路径,而不简单的使用相对路径。
5、Web中的相对路径与绝对路径
6、Web中的 / 斜杠的含义
7、HttpServletResponse 类
7.1 HttpServletResponse 类的作用
(1)Request 对象:每次只要有HTTP请求进入Tomcat服务器,Tomcat服务器就会把请求发来的HTTP协议信息 解析好 封装到Request对象中,
然后传递到 service()方法中(调用doGet()或doPost()方法) 供编程人员使用,编程人员通过HttpServletRequest对象,可以获取到请求的所有信息。
(2)Response 对象:每次只要有HTTP请求进入Tomcat服务器,Tomcat服务器就会创建一个Response对象传递给Servlet程序。
HttpServletResponse 表示所有响应的信息(HttpServletRequest表示请求发来的信息),可以通过HttpServletResponse对象设置服务器端想要返回给客户端的信息。
7.2 HttpServletResponse 类的常用方法-源码结构图
7.3 HttpServletRepose对象:传递数据给客户端时需要使用到流
两个输出流的说明:
(1)字节流:getOutputStream(); 常用于下载(传递)二进制数据。
(2)字符流:getWriter(); 常用于回传字符串。
(3)注:同一个HttpServletResponse对象,两个流不可同时使用,只可二选一。否则报错,如下图所示:
7.4 HttpServletRepose对象:如何往客户端传递数据
public class ResponseIOServlet extends HttpServlet {
private static final long serialVersionUID = -48758485117522083L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//默认支持的字符集=ISO-8859-1
System.out.println("默认支持的字符集=" + response.getCharacterEncoding());
/**
*
* //1.1设置服务器端使用UTF-8字符集
* response.setCharacterEncoding("UTF-8");
* //1.2通过响应头,设置客户端使用UTF-8字符集
* response.setHeader("Content-type", "text/html; charset=UTF-8");
*/
//1.为了防止中文乱码问题,在获取流对象之前调用此方法,功能:同时设置服务器和客户端使用UTF-8字符集
response.setContentType("text/html; charset=UTF-8");
//2.获取流对象
PrintWriter writer = response.getWriter();
//3.返回给客户端中文数据和英文数据
writer.write("HttpServletResponse return string to chrome...");
writer.write("<br/>");
writer.write("HttpServletResponse return 上海 to chrome...");
}
}
7.5 HttpServletRepose对象:请求重定向及其特点及其实现方式
(1)请求转发:是指在服务器接收到客户端的请求之后,从一个Servlet资源跳转到另一个Servlet资源的操作过程,叫做请求转发。
(2)请求重定向:指的是客户端给服务器发送请求,然后服务器通知客户端去访问自己的新地址(之前的地址可能被废弃),这个过程叫请求重定向。
请求重定向的两种方式:
7.6 HttpServletRepose对象:请求重定向的代码演示-项目结构
7.6.1 编写Servlet动态资源-ResponseServlet1对象和ResponseServlet2对象
package com.wind.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 演示重定向使用的动态资源-ResponseServlet1
*/
public class ResponseServlet1 extends HttpServlet {
private static final long serialVersionUID = 8523638183221949052L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
System.out.println("首先访问到了ResponseServlet1...");
//1.设置响应状态码302
response.setStatus(302);
//2.设置响应头高速客户端新的资源访问地址在哪里
response.setHeader("Location", "http://localhost:8080/07_servlet/responseServlet2");
}
}
package com.wind.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 重定向测试使用的动态资源-ResponseServlet2
*/
public class ResponseServlet2 extends HttpServlet {
private static final long serialVersionUID = -2816601585770886777L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
System.out.println("通过重定向,访问到了ResponseServlet2...");
response.getWriter().write("通过重定向,访问到了ResponseServlet2,它做完了业务操作...");
}
}
7.6.2 在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>ResponseServlet1</servlet-name>
<servlet-class>com.wind.servlet.ResponseServlet1</servlet-class>
</servlet>
<servlet>
<servlet-name>ResponseServlet2</servlet-name>
<servlet-class>com.wind.servlet.ResponseServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ResponseServlet1</servlet-name>
<url-pattern>/responseServlet1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ResponseServlet2</servlet-name>
<url-pattern>/responseServlet2</url-pattern>
</servlet-mapping>
</web-app>