文章目录
- 目标:
- 一、Servlet请求处理
- 1.Request请求对象
- 2.Response响应对象
- 二、请求处理流程
- 相关
目标:
通过前面几篇文章,我们能够创建并且成功运行一个简单的Servlet程序,完成浏览器和服务器的简单交互。
但是呢,我们写的Servlet代码时没有对浏览器的请求进行任何处理的。这篇我们会了解导如何使用Sevlet进行浏览器的请求处理。同时我们还会学习到两个对象Request和Response。
注意:Request 和 Response 对象的更多常用方法,和其他类的常用方法,请下载tomcat的中文文档进行查看学习。英文还不错的可以查看tomcat官网的文档。
一、Servlet请求处理
- 问:
浏览器发送请求到服务器,会遵循HTTP协议将请求数据发送给服务器。
那么问题来了,服务接受到的请求数据该怎么处理呢? - 解决:
服务器接收到浏览器的请求后,就会创建一个Request对象专门的存储这一次请求的请求数据(来一个请求创一个Request对象)。
服务器在调用Servlet时,会将请求来时创建且存储请求数据的Request对象作为实参传递给Servlet的方法,比如:service 方法、doGet()方法。
上面一段解释:服务器在调用指定的 Servlet 进行请求处理的时候,会给 Servlet 的方法传递两个实参 request 和 response(类型分别是HttpServletRequest、HttpServletResponse)。
其中 Request对象 中封存了请求相关的请求数据,而 Response 则是用来进行响应的一个对象。
1.Request请求对象
Request对象获取客户端请求的信息:
我的Servlet访问地址:http://localhost:8080/TestServlet?username=张三
示例代码:
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8"); // 设置请求时的字符编码
// 1.获取请求头数据
String scheme = req.getScheme(); // 获取请求协议
String method = req.getMethod(); // 获取请求方式
StringBuffer requestURL = req.getRequestURL(); // 获取请求URL
String requestURI = req.getRequestURI(); // 获取请求URI
System.out.println("请求协议:" + scheme + "\n请求方式:" + method + "\n请求URL:" + requestURL + "\n请求URI:" + requestURI + "\n");
// 2.获取请求行数据
Enumeration<String> headerNames = req.getHeaderNames(); // 返回所有的本请求消息包含的头名字的集合。
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement(); // 获取headerNames中元素
String header = req.getHeader(name); // 返回指定的作为字符串请求消息头的值
System.out.println(name + ":" + header);
}
// 3.获取用户请求数据
String username = req.getParameter("username"); // 获取用户请求数据
username = new String(username.getBytes("iso8859-1"), "utf-8"); // 请求参数乱码了需要编码一下
System.out.println("\n" + username);
}
}
2.Response响应对象
在使用 Request 对象获取了请求数据并进行处理后,处理的结果如何显示到浏览器中呢?
此时就用到了Response响应对象,响应给浏览器
我的Servlet访问地址还是这个:http://localhost:8080/TestServlet?username=张三
示例代码:
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应编码格式,返回html
resp.setHeader("content-type", "text/html;charset=utf-8");
resp.setHeader("my-key", "my-value"); // 设置一个自定义的键和值
// 设置响应状态
// resp.sendError(404, "这是我自己设置的一个响应错误404,页面找不到");
// 设置响应实体
resp.getWriter().write("<p>我返回了一个html文本,并在<strong>p标签<strong>中写了一段话一段文字<p>"); // 获取输出流,并在输出流中写入HTML代码
}
}
示例代码2:响应一个登录页面(等我们后面学习了JSP后就不会这样写html代码了)
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应编码格式,返回html
resp.setHeader("content-type", "text/html;charset=utf-8");
// 下面是即将响应的html代码(等后面学JSP后就不会这样写了)
StringBuilder html = new StringBuilder();
html.append("<html>")
.append("<body>")
.append("<h1>登录页面</h1>")
.append("<form method=\"get\" action=\"/TestServlet\">") // 引号需要使用 \ 转换
.append("用户名:<input type=\"text\" name=\"username\"><br>")
.append("密码:<input type=\"text\" name=\"password\"><br>")
.append("<input type=\"submit\" value=\"登录\">")
.append("</form>")
.append("</body>")
.append("</html>");
// 设置响应实体
resp.getWriter().write(html.toString());; // 获取输出流,并在输出流中写入HTML代码
}
}
上面示例代码2返回的页面长这样:
二、请求处理流程
- 设置请求编码格式
- 设置响应编码格式
- 获取请求信息
- 处理请求信息
- 响应处理结果
示例代码:
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置请求编码格式
req.setCharacterEncoding("utf-8");
// 设置响应编码格式
resp.setHeader("content-type", "text/html;charset=utf-8");
// 获取请求信息
String username = req.getParameter("username"); // 获取用户请求数据
// 处理请求信息
username = new String(username.getBytes("iso8859-1"), "utf-8"); // 字符编码转换成utf-8,默认中文是iso8859-1格式
username = username + ",你好!"; // 给获取到的用户请求添加个你好
// 响应处理结果
resp.getWriter().write(username);
}
}
页面: