Servlet(二)
🍵 Servlet简称Server Applet(即服务器端小程序),是一种基于Java技术的Web组件,运行在服务器端。
1 生命周期
- 生命周期
- Servlet的生命周期就是Servlet从创建到销毁的过程,由Servlet容器管理。
- Servlet生命周期主要分为初始化阶段、运行时阶段、销毁阶段这三个阶段。
- 在javax.servlet.Servlet接口中定义了3个方法:init()、service()、destory()。
- 启动服务,多次访问地址:http://localhost:8080/servletDemo/MyServlet21。
1 | |
2 ServletConfig
- ServletConfig
- 容器初始化Servlet时,会为Servlet创建一个ServletConfig对象并将其作为参数传递给Servlet。
- 一个Web应用中可以存在多个ServletConfig对象,一个Servlet只能对应一个ServletConfig对象。
- 也就是说Servlet的初始化参数仅对当前Servlet有效。
2-1 获取对象
1 | |
2-2 初始化参数
- 初始化参数
- 配置Servlet的初始化参数方式:web.xml、@WebServlet。
- web.xml中可使用一个或多个
<init-param>元素进行配置。 - 通过@WebServlet的initParams属性也可以为Servlet设置初始化参数。
- 启动服务,访问:http://localhost:8080/servletDemo/MyServlet22。
(1) web.xml
1 | |
(2) @WebServlet
1 | |
3 ServletContext
- ServletContext
- 容器启动时,会为每个Web应用创建唯一的ServletContext对象,称其为Servlet上下文。
- ServletContext对象的生命周期从Servlet容器启动时开始,到关闭或应用被卸载时结束。
- Web应用(即webapps下的每个目录都是)中的所有Servlet共享同一个ServletContext对象。
- 不同Servlet之间可以通过ServletContext对象(也被称为Context域对象)来实现数据通讯。
3-1 获取对象
1 | |
3-2 初始化参数
- 初始化参数
- 通过web.xml文件中的
<context-param>元素可以为Web应用设置一些全局的初始化参数。 - 这些参数被称为上下文初始化参数,应用中的所有Servlet都共享同一个上下文初始化参数。
- Web应用的整个生命周期里,上下文初始化参数将一直在且随时可被任意一个Servlet访问。
- Servlet容器启动时,会为容器内每个Web应用创建一个ServletContext对象。
- 并将
<context-param>元素中的上下文初始化参数以键值对形式存入对象中。 - 启动服务器,访问地址:http://localhost:8080/servletDemo/MyServlet23。
- 通过web.xml文件中的
(1) web.xml
1 | |
(2) Servlet类
1 | |
3-3 实现数据通讯
- 实现数据通讯
- 在Servlet中调用ServletContext接口的setAttribute()方法可以创建一些属性。
- 应用中所有Servlet都可以对这些属性进行访问和操作,实现应用内的数据通讯。
- 编写1个统计页面访问量的案例,来演示通过ServletContext对象实现数据通讯。
- 先创建一个MyServlet24的Servlet类,然后创建一个MyServlet25的Servlet类。
- 重启服务,多次访问地址:http://localhost:8080/servletDemo/MyServlet24。
- 最后,再次访问地址链接:http://localhost:8080/servletDemo/MyServlet25。
(1) 自增类
1 | |
(2) 访问类
1 | |
3-4 读取资源文件
- 读取资源文件
- 实际开发中,可能需要读取Web应用中的一些资源文件,如配置文件或日志等。
- 在/servletDemo/src/webapp/WEB-INF/classes目录中创建db.properties文件。
- 创建MyServlet26类,访问:http://localhost:8080/servletDemo/MyServlet26。
(1) db.properties
1 | |
(2) 创建一个新类
1 | |
4 HttpServletRequest
- HttpServletRequest
- 浏览器(客户端)通过HTTP协议访问服务器资源,Servlet主要用来处理HTTP请求。
- HttpServletRequest和HttpServletReponse是Servlet处理HTTP请求流程中的两个重要对象。
- HttpServletRequest用于封装HTTP请求信息,HttpServletReponse用于封装HTTP响应信息。
- Servlet API中定义了一个HttpServletRequest接口,继承自ServletRequest。
- HttpServletRequest对象专门用于封装HTTP的请求消息,简称为request对象。
- HttpServletRequest接口定义了获取请求行、请求头和请求消息体的相关方法。
4-1 获取请求行
- 启动Tomcat,访问:http://localhost:8080/servletDemo/MyServlet27。
1 | |
4-2 获取请求头
- 启动Tomcat,访问:http://localhost:8080/servletDemo/MyServlet28。
1 | |
4-3 获取form表单
- 获取form表单
- 创建/webapp/WebContent/form.html文件,代码如下。
- 启动Tomcat,访问:http://localhost:8080/servletDemo/WebContent/form.html。
- 填写表单内容,提交跳转页面:http://localhost:8080/servletDemo/MyServlet29。
(1) form.html
1 | |
(2) 创建新类
1 | |
4-4 中文乱码问题
- 中文乱码问题
- 获取form表单中,输入中文姓名时可能出现乱码问题。
- GET和POST这两种请求方式都可能产生中文乱码情况。
- POST
- 提交的数据在请求体中所使用的编码格式是UTF-8。
- request对象将数据放到缓冲区时使用ISO-8859-1。
- GET
- 浏览器发送文字时采用的编码格式与页面编码保持一致(UTF-8格式)。
- 若Tomcat未设置字符集,接收URL时默认使用ISO-8859-1导致乱码。
- Tomcat版本8及以上,已成功解决了该方式提交请求中文乱码的问题。
(1) POST
1 | |
(2) GET修改配置
1 | |
(3) GET逆向编解码
1 | |
(4) String构造方法
1 | |
5 HttpServletResponse
- HttpServletResponse
- 在Servlet API中定义了HttpServletResponse接口,继承自ServletResponse。
- HttpServletResponse对象专门用来封装HTTP响应消息,简称为response对象。
- HttpServletResponse定义了向客户端发送响应状态码、响应头、响应体的方法。
5-1 创建Servlet类
- 创建Servlet类
- 启动Tomcat,访问地址:http://localhost:8080/servletDemo/MyServlet30。
- doGet()方法调用run2(),使用字符流输出响应内容到浏览器,再次访问地址。
1 | |
5-2 中文乱码问题
- 中文乱码问题
- response对象向页面输出时有两种方式:字节流、字符流,输出中文时都可能出现乱码。
- 字节流输出
- 是否乱码取决于中文转成字节数组时与浏览器打开时采用的字符集是否一致。
- 如果两者保持一致,则不会出现乱码问题,如果不一致,就会出现乱码问题。
- 字符流输出
- 输出中文一定会乱码,通过字符流输出的内容存放在response缓冲区。
- response缓冲区的默认字符集是ISO-8859-1,该字符集不支持中文。
(1) 字节流输出
1 | |
(2) 字符流输出
1 | |
6 RequestDispatcher接口
- RequestDispatcher接口
- Web应用在处理客户端的请求时,经常需要多个Web资源共同协作才能生成响应结果。
- 但Servlet对象无法直接调用其他service()方法,因此提供请求转发、请求包含两方案。
- 请求转发属于服务器行为,容器接收请求后,Servlet会先对请求做一些预处理。
- 然后再将请求传递给其他的Web资源,来完成包括生成响应在内的其他后续工作。
- javax.servlet包定义了RequestDispatcher接口,用于封装由路径所标识的Web资源。
- RequestDispatcher对象由Servlet容器创建,获取RequestDispatcher对象的方式如下。
ServletContext的getRequestDispatcher(String path):path指定目标资源的路径,必须是绝对路径。ServletRequest的getRequestDispatcher(String path):path指定目标资源的路径,绝对或相对路径。- 绝对路径以符号“/”开头的,表示当前Web应用的根目录,相对路径则是指相对于当前Web资源的路径。
- RequestDispatcher接口提供的方法
include(ServletRequest request, ServletResponse response):将其他资源作为响应包含进来。forward(ServletRequest request, ServletResponse response):将请求转发给另一个Web资源。
6-1 request域对象
- request域对象
- request是Servlet的三大域对象之一,需与请求转发配合使用,才可实现动态资源间的数据传递。
- request域对象 vs Context域对象
- request域对象:与请求转发配合使用实现数据共享。
- Context域对象:独立完成动态资源之间的数据共享。
- request域对象:从客户端向容器发送请求开始,到对这次请求做出响应后结束。
- Context域对象:生命周期从容器启动开始,到关闭或者Web应用被移除时结束。
- request域对象:只对本次请求涉及的Servlet有效,每个Servlet实例都可以有多个request。
- Context域对象:对于整个Web应用的所有Servlet都有效,整个Web应用只有一个Context。
6-2 创建一请求类
1 | |
6-3 创建一转发类
1 | |
6-4 创建login.html
1 | |
7 重定向sendRedirect()
- 重定向sendRedirect()
- 重定向属客户端行为,服务器收到客户端请求后通知浏览器重新向另1个URL发送请求。
- 请求重定向的本质实际是两次HTTP请求,对应了两个request对象和两个response对象。
7-1 创建验证类
1 | |
7-2 创建提交类
1 | |
7-3 创建定向类
1 | |
7-4 创建登录类
1 | |
7-5 register.html
1 | |
Servlet(二)
https://stitch-top.github.io/2025/10/25/java/java06-servlet-er/