目录
一、HttpServletRequest 接口
1. 概述
HttpServletRequest 接口继承自 ServletRequest 接口,其主要作用是封装 HTTP 请求消息。由于 HTTP 请求消息分为请求行、请求头和请求体三部分。因此,在 HttpServletRequest 接口中定义了获取请求行、请求头和请求体的相关方法。
注:
- HttpServletRequest接口来自于 Servlet 规范中,在 Tomcat 中存在于 servlet-api.jar 这个包下
- HttpServletRequest接口实现类由 Http 服务器负责提供
- HttpServletRequest接口负责子 doGet/doPost 方法运行时读取Http请求协议包信息
- 开发人员习惯于将 HttpServletRequest 接口
2. 作用
由于 HttpServletRequest 接口中定义了获取请求行、请求头和请求体中相关方法,所以我们可以利用 HttpServletRequest 可以完成
- 读取Http请求协议中请求行的相关信息
- 读取保存在Http请求协议包中请求头或请求体中请求参数信息
- 代替浏览器向Http服务器申请资源文件调用
3. request对象
我们发现 Servlet 接口实现类中,重写其doGet()与doPost()方法时,形参为request与response,分别代表请求与响应对象,通过调用对象下的方法,我们可以获取Http协议包中的相关信息。
request对象常用的方法有:
方法 | 作用 |
---|---|
getRequestURL() | 获取URL |
getRequestURI() | 获取URI |
getRemoteAddr() | 返回发出请求的客户机的IP地址 |
getRemoteHost() | 返回发出请求的客户机的完整主机名 |
getRemotePort() | 返回客户机所使用的网络端口号 |
getLocalAddr() | 返回WEB服务器的IP地址 |
getLocalName() | 返回WEB服务器的主机名 |
getHeader() | 获取请求头 |
getParameter() | 获取请求参数 |
getAttribute() | 返回指定属性值 |
getCookies() | 返回客户端发送的Cookie |
getSession() | 返回和客户端相关的session |
getParameterValues() | 返回请求中的参数值 |
getCharacterEncoding() | 返回字符编码方式 |
getParameterNames() | 返回请求中所有参数名字 |
getProtocol | 获取请求所使用的协议名称 |
getServerPath() | 返回请求文件路径 |
getInputStream() | 返回请求的输入流中的数据 |
4. 实例
设计一个程序,获取Http网络协议包中请求行中相关信息,以及请求头和请求体中的参数信息
1.在之前的项目中,新建一个module,起名为HttpSevletRequest
2.给这个module添加Web Application框架,在Web-INF目录下配置lib,并给External Libraries 配置Tomcat jar包,前两步详情请见上一篇文章
3.配置好了之后,我们在src下,创建controller包(MVC规范),在包下,新建Servlet
4.给新建的Servlet类起名为MyServlet,同时要勾选下图中划红线的部分(默认勾选)
5.创建完之后,我们发现Servlet框架自动生成,同时我们看下方划红线的部分,这是一个注解,有了这个注解,我们就不必在web.xml文件中导入类,value可以认为是给这个Servlet接口实现类起别名
6.接下来,我们给项目配置Tocat启动按钮
7.将Tomcat按钮与MyServlet文件关联起来,同时起名叫myWeb
8.查询Http网络协议包中请求行相关信息,在doGet与doPost方法中加入如下代码(源码放于最后)
9.在web目录下新建html文件(网页的位置别建错了)
10.在html文件中写入一个请求方式为get和一个请求方式为post的表单,action中要用"/项目名/目标文件名"的形式
11.要完成对于两种请求方式中请求参数的查询,需要写入以下代码(注意requst.getParameter()方法的使用)
12.当然,我们配置的Tomcat启动按钮中,别忘了打开资源更新选项
13.启动Tomcat,打开myWeb站下的MyWebPage.html网页
14.先验证以get请求方式提交,输入内容如下
15.切回终端,输出如下内容
16.接着验证以post方式提交表单
17.输出内容如下
源码如下
package controller;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet(name = "MyServlet", value = "/MyServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = request.getRequestURL().toString();//读取请求行中url信息
String method = request.getMethod();//读取请求行中method
/*
* URI: 资源文件精准定位地址,在请求行并没有URI这个属性。
* 实际上URL中截取一个字符串,这个字符串格式"/网站名/资源文件名"
* URI用于让Http服务器对被访问的资源文件进行定位
*/
String uri = request.getRequestURI();//在URL中截取了一段字符串,substring()
System.out.println(url);
System.out.println(method);
System.out.println(uri);
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String)paramNames.nextElement();
String value = request.getParameter(paramName);
System.out.println("请求参数名:" + paramName + " 请求参数值:" + value);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = request.getRequestURL().toString();//读取请求行中url信息
String method = request.getMethod();//读取请求行中method
String uri = request.getRequestURI();//在URL中截取了一段字符串,substring()
System.out.println(url);
System.out.println(method);
System.out.println(uri);
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username:" + username + " password:" + password);
}
}
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>MyWebPage</title>
</head>
<body>
<form action="/myWeb/MyServlet" method="get">
<input type="text" name="username"/>
<input type="text" name="password"/>
<input type="submit">以get请求方式提交
</form>
<form action="/myWeb/MyServlet" method="post">
<input type="text" name="username"/>
<input type="text" name="password"/>
<input type="submit">以post请求方式提交
</form>
</body>
</html>
要注意:
我们在查看POST请求参数时,可能会发现出现乱码。这是因为浏览器以POST方式发送请求,请求参数保存在请求体中,在Http请求协议包到达Http服务器之后,第一件事就是进行解码请求体二进制内容由当前请求对象(request)负责解码。request默认使用[ISO-8859-1]字符集,一个东欧语系字符集。此时如果请求体参数内容是中文,将无法解码只能得到乱码。
要想解决此问题,只需要调用request下的setCharacterEncoding(“utf-8”)方法,设置解码字符集为utf-8即可
二、HttpServletResponse 接口
1. 概述
HttpServletResponse 接口继承自 ServletResponse 接口,主要用于封装 HTTP 响应消息。
(1)HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
(2)HttpServletResponse接口实现类由Http服务器负责提供
(3)HttpServletResponse接口负责将doGet/doPost方法执行结果写入到响应体交给浏览器
(4)开发人员习惯于将HttpServletResponse接口修饰的对象称为响应对象
2. 作用
(1) 将执行结果以二进制形式写入到响应体
(2) 设置响应头中[content-type]属性值,从而控制浏览器使用。对应编译器将响应体二进制数据编译为文字,图片,视频,命令等
(3) 设置响应头中 location 属性,将一个请求地址赋值给location。从而控制浏览器向指定服务器发送请求。
3. response对象
response对象常用方法有:
方法 | 功能 |
---|---|
addCookie() | 将指定的Cookie加入到当前响应中 |
addHeader(String name, String value) | 将指定的名字和值加入到相应头信息中 |
sendError(int sc) | 使用指定状态码发送一个错误到客户端 |
sendRedirect(String location) | 发送一个临时响应到客户端 |
setContentType(String ContentType) | 设置浏览器对响应体二进制数据的解析方式 |
setStatus(int sc) | 给当前响应设置状态码 |
getWriter() | 向Tomcat索要输出流,此输出流将字符文本内容全部输出 |
getOutputStream() | 同为输出流,输出的是二进制格式 |
4. 实例
编写一段程序,将Java代码中的字符串输出到网站中,且保证输出的中文不乱码,格式按照HTML解析器解析。
通过response对象向Tomcat服务器获取输出流的方式为
PrintWriter out = response.getWriter();
将字符串输出到网站中的方式为
String str = "hello wordl";
PrintWriter out = response.getWriter();
out.print(str)
设置字符集和解码器的方式为
response.setContentType("text/html;charset=utf-8");
该程序完整代码为:
package controller;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "MyServlet", value = "/MyServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String res = "Hello World";
char ch = 'a';
String res1 = "Java<br/>Mysql<br/>HTML<br/>";
String res2 = "面向对象<br/>数据库<br/>网页<br/>";
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print(res);
out.print(ch);
out.print(res1);
out.print(res2);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
效果如图
三、请求对象和相应对象生命周期
1.在Http服务器接收到浏览器发送的Http请求协议包后,自动为当前的Http请求协议包生成一个请求对象和一个响应对象
2.在Http服务器调用doGet/doPost方法时,负责将请求对象和响应对象作为实参传递方法中,确保doGet/doPost正确执行
3.在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的请求对象和响应对象销毁
4.请求对象和响应对象生命周期贯穿一次请求的处理过程中,相当于服务端的代言人