文章目录
- 一、Servlet 的概述
- 二、Servlet 的入门
- 1. 创建包和类
- 2. 让该类实现 Servlet 接口
- 3. 在 web.xml 中 配置这个类
- 4. 访问 Servlet
- 三、Servlet 的执行流程
- 四、Servlet 的实现关系
- 1. 基本实现关系
- 2. 关系实现的概述
- 3. 在 IDEA 中创建 Servlet
- 五、Servlet 的生命周期
- 1. Servlet 生命周期的概述
- 六、Servlet 的启动时加载
- 1. 用启动时加载 的原因
- 2. 配置完成启动时加载
- 七、Servlet 的访问路径的配置
- 1. Servlet 中的 `` 的配置方式
- 2. 访问的优先级
- 八、ServletConfig 对象
- 1. 概述
- 2. 获得 ServletConfig 对象
- 3. ServletConfig 对象的 API
- 九、ServletContext 对象
- 1. ServletContext 对象概述
- 2. ServletContext 对象的作用一:获取 web 项目信息
- 3. ServletContext 对象的作用二:读取 web 项目下文件
- 4. ServletContext 对象的作用三:作为域对象存取数据
- 十、Response 对象
- 1. Response 对象的概述
- 2. Response 对象的 API
- 3. 代码演示例子
- 4. Response 对象响应的中文乱码处理
- 十一、Request 对象
- 1. Request 对象的概述及API
- 2. 代码演示例子
- 3. Request 对象接收表单请求参数
- 3. Request 对象接收表单请求参数中文乱码处理
一、Servlet 的概述
- Servlet 是一个运行在 web 服务器上的小的 java 程序,用于处理从 web 客户端发送的请求,并且对请求作出响应;
- 使用 Servlet:
编写一个 java 类实现 Servlet 的接口;
配置 Servlet;
二、Servlet 的入门
1. 创建包和类
2. 让该类实现 Servlet 接口
这里主要重写了 service 方法;
package ServletDemo1;
import javax.servlet.*;
import java.io.IOException;
/**
* Servlet 的入门程序
*/
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/*
这里主要用这个方法
用来处理客户请求,并对请求作出响应;
*/
@Override
public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
//向页面输出内容
resp.getWriter().println("hello Servlet!!!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
3. 在 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>
<!-- 配置 Servlet 的名称 -->
<servlet-name>HelloServlet</servlet-name>
<!-- 配置 Servlet 的全路径 -->
<servlet-class>ServletDemo1.HelloServlet</servlet-class>
</servlet>
<!-- 配置Servlet 的一个映射-->
<servlet-mapping>
<!-- 配置 Servlet 的名称 -->
<servlet-name>HelloServlet</servlet-name>
<!-- 配置访问路径 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
4. 访问 Servlet
三、Servlet 的执行流程
四、Servlet 的实现关系
1. 基本实现关系
Servlet 接口
|
GenericServlet 类:通用的 Servlet,是一个与协议无关的 Servlet;
|
HttpServlet 类:HTTP 专用的 Servlet;
2. 关系实现的概述
- 通常编写一个 Servlet 都会让这个 Servlet 继承 HttpServlet,重写 service 方法;
- 在 service 方法内部,会根据请求方式不同,执行不同的 doXXX 方法;
(get 请求执行 doGet 方法,post 请求执行 doPost 方法) - 所以 往往继承了 HttpServlet 之后,不需要重写 service 方法,只需要重写 doGet 和 doPost 即可;
- 通常请求要处理的代码都是一致的,所以需要让 doGet 和 doPost 相互调用,可以简化编程;
package ServletDemo2;
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 HelloServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如果是GET请求,就会执行doGet中的代码
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如果是POST请求,就会执行doPost中的代码
resp.getWriter().println("HelloServlet22222222");
}
}
3. 在 IDEA 中创建 Servlet
(可以直接创建 Servlet,不用自己在 web.xml 中配置信息)
五、Servlet 的生命周期
1. Servlet 生命周期的概述
- 生命周期:一个对象从创建到销毁的过程;
- 和生命周期相关的三个方法:
- Servlet 第一次被访问时会被实例化,只要 Servlet 被实例化,init 方法就会执行(init 方法只会执行一次);
- 任何一次从客户端发来的请求,service 方法就会执行(在 service 内部根据不同的请求方式调用不同的 doXxx 方法);
- 当 Servlet 从服务器移除,或者服务器关闭的时候,Servlet 对象会被销毁,里面的 destory 方法就会执行,然后垃圾回收就会将其回收掉;
六、Servlet 的启动时加载
1. 用启动时加载 的原因
- 假设在 init 方法中做了一些耗时的操作,则第一个用户第一次访问这个对象时,等待时间长;
- 所以需要将 Servlet 改为启动时加载;
- 即 让服务器启动时 就创建 Servlet 的对象,这样 之前耗时的操作就会在 服务器启动时花费,用户不需要额外花费时间;
2. 配置完成启动时加载
在 web.xml 中进行配置
七、Servlet 的访问路径的配置
1. Servlet 中的 <url-pattern>
的配置方式
- 完全路径匹配
以/
开始; - 目录匹配
以/
开始,以/*
结束; - 扩展名匹配
不能以 / 开始,是以*
开始
2. 访问的优先级
完全路径匹配 > 目录匹配 > 扩展名匹配
八、ServletConfig 对象
1. 概述
- ServletConfig 用来获得 Servlet 的相关配置的对象;
2. 获得 ServletConfig 对象
getServletConfig()
3. ServletConfig 对象的 API
- 获得 Servlet 的初始化参数
- 获得 ServletContext 对象
- 获得 Servlet 名称
九、ServletContext 对象
1. ServletContext 对象概述
- ServletContext :Servlet 的上下文对象;ServletContext 对象对 Servlet 之前和之后的内容都知道;
- ServletContext 对象 一个 web 项目只有一个;
- 在服务器启动时为每个 web 项目创建一个单独的 ServletContext 对象;
2. ServletContext 对象的作用一:获取 web 项目信息
获取 web 项目信息
- 获取文件的 MIME 类型;
getMimeType()
- 获取 web 请求的工程名;
getContextPath()
- 获取 web 项目的初始化参数;
getInitParameter()
、getInitParameterNames()
3. ServletContext 对象的作用二:读取 web 项目下文件
读取 web 项目下文件
- 之前用 IO 流可以读取文件,现在 获取 web 项目下的文件,使用传统的 IO 流会出现错误;
- 用传统方式写,会出现异常,问题出现在 相对路径;
- 用 ServletContext 读取
- 用 传统方式 和 ServletContext 读取
4. ServletContext 对象的作用三:作为域对象存取数据
作为域对象存取数据
- 存入数据的方法;
setAttribute()
- 获取数据的方法;
getAttribute()
- 移除数据的方法;
removeAttribute()
1. 域对象:指的是将数据存入到域对象中,这个数据就会有一定的作用范围;
2. 域:指的是一定的作用范围;
3. ServletContext 作为域对象的作用范围:整个 web 服务器;
十、Response 对象
1. Response 对象的概述
- B/S 结构的软件,可以通过浏览器访问服务器;
2. Response 对象的 API
(1)关于响应行的方法
-
setStatus(int sc)
设置响应的状态码;
(2)关于响应头的方法
- set 开头的方法:一个 key 对应一个 value情况;
setHeader(String name, String value)
- Add 开头的方法:一个 key 对应多个 value 的情况;
addHeader(String name, String value)
(3)关于响应体的方法
getOutputStream()
getWriter()
(4)其他 API
- 重定向方法;
setRedirect()
- 设置浏览器打开页面时采用的字符集;
setContentType()
- 设置响应字符流的缓冲区字符集;
setCharacterEncoding()
- 服务器想浏览器回写Cookie的方法;
addCookie()
3. 代码演示例子
(1)重定向
- 302 状态码和 Location 响应头结合使用的效果
- 实际开发中可以使用
response.sendRedirect("/web01/ResponseDemo2");
替换重定向两句的写法;
(2)定时刷新
4. Response 对象响应的中文乱码处理
(1)使用字节流处理中文
解决:将中文转成字节数组的时候 和 浏览器默认打开的时候 采用的字符集一致即可。
(2)使用字符流处理中文
解决:设置 response 获得字符流缓冲区的编码 和 设置浏览器默认打开时候 采用的字符集一致即可。
十一、Request 对象
1. Request 对象的概述及API
(1)获得客户机信息
- 获得请求的方式;
getMethod()
- 获得请求路径后提交参数的字符串;
getQueryString()
- 获得请求路径的 URI、URL;
getRequestURI()
,getRequestURL()
- 获得客户机的 IP 地址;
getRemoteAddr()
(2)获得请求头的方法
- 获得一个 key 对应一个 value 的请求头;
getHeader(String name)
- 获得一个 key 对应多个 value 的请求头;
getHeaders(String name)
(3)获得请求参数的方法
- 用来获得提交的参数(一个 name 对应一个 value);
getParameter(String name)
- 用来获得提交的参数(一个 name 对应多个 value);
getParameterValues(String name)
- 用来获得提交的参数(将提交的参数名称和对应的值封装到一个 map 中);
getParameterMap(String name)
(4)Request 作为域对象存取数据的方法
- 向 request 域中存数据;
setAttribute(String name, Object o)
- 从 request 域中获取数据;
getAttribute(String name)
- 从 request 域中移除数据;
removeAttribute(String name)
2. 代码演示例子
3. Request 对象接收表单请求参数
- demo1.html
- RequestDemo2.java
接着上面的代码,用另外一种接收数据的方式:
3. Request 对象接收表单请求参数中文乱码处理
- 页面:
(1)get 方式处理中文乱码
解决:将存入到 request 缓冲区的值以 ISO-8859-1 的方式获取到,以 UTF-8 的方式进行编码。
(2)post 方式处理中文乱码
解决:将 request 缓冲区的编码修改了即可。