Servlet基本知识
Servlet基本知识
Servlet基本概念
Servlet的定义:
- Servlet 是 Java 技术中用于扩展服务器功能的组件。它是一个运行在 Web 服务器上的 Java 程序,能够处理客户端(通常是浏览器)的请求并生成动态内容。
- 它是 Java EE(Java Platform, Enterprise Edition)规范的一部分,通常运行在支持 Java 的 Web 服务器(如 Apache Tomcat、Jetty 等)中
- 像xxx.html文件为静态资源,Servlet为动态资源
- Servlet:运行在 Web 容器中,负责处理具体的业务逻辑。
- Web 容器接收客户端请求并将其转发给对应的 Servlet。
- Servlet 处理请求并生成响应,Web 容器将响应返回给客户端。
Servlet的作用
- 处理 HTTP 请求:接收客户端发送的 HTTP 请求(如 GET、POST 等)。
- 生成动态响应:根据请求内容生成动态的 HTML、JSON、XML 等响应。
- 管理会话状态:通过
HttpSession对象跟踪用户会话(如用户登录状态)。 - 与数据库交互:通过 JDBC 或其他持久化技术与数据库交互。
- 文件上传和下载:处理客户端上传的文件或提供文件下载功能。
Servlet 的生命周期
Servlet 的生命周期由 Web 容器(如 Tomcat)管理,分为以下四个阶段:
1. 加载和实例化
-
当 Servlet 容器启动或首次接收到针对该 Servlet 的请求时,容器会加载 Servlet 类并创建其实例
-
调用 Servlet 的无参构造函数创建 Servlet 实例
-
Servlet 是单例的,容器只会创建一个实例
-
由于是单实例,会引发线程安全问题,尽量不去修改使用的变量
-
如果配置了
<load-on-startup>,Servlet 会在容器启动时立即加载和实例化-
可以通过设置整数值来指定多个 Servlet 的加载顺序,值越小优先级越高
-
默认的web.xml文件中已经将值占用到5,建议从6往后写
-
<servlet> <servlet-name>ServletName</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> <load-on-startup>优先级值</load-on-startup> </servlet> -
@WebServlet( urlPatterns = "/initServlet", loadOnStartup = 1 )
-
-
2. 初始化(Initialization)
- 在 Servlet 实例化(构造完毕)后,容器会调用
init(ServletConfig config)方法进行初始化 init()方法只执行一次,通常用于加载配置或初始化资源(如数据库连接)。- 可以通过
@WebInitParam注解或web.xml配置文件传递初始化参数。 - 如果初始化失败,Servlet 会被容器标记为不可用
3. 处理请求(Service)
- 每次客户端请求时,Web 容器会调用
service()方法。 service()方法根据请求类型(GET、POST 等)调用相应的doGet()、doPost()等方法。- 这些方法是开发者需要实现的核心逻辑。
4. 销毁(Destruction)
- 当 Servlet 被卸载或 Web 容器关闭时,容器会调用
destroy()方法。 destroy()方法用于释放资源(如关闭数据库连接、清理内存)。
Servlet Context
ServletContext是 Java Servlet 规范中的一个核心接口,它代表了整个 Web 应用程序的上下文环境。- 每个 Web 应用在 Servlet 容器(如 Tomcat)中运行时,都会有一个唯一的
ServletContext实例。通过ServletContext,开发者可以访问 Web 应用的全局信息、共享资源以及配置参数 - 由于每个项目只有一个Servlet Context,所以需要在改项目的web.xml文件中配置Servlet Context
获取ServletContext
-
通过 ServletConfig获取
-
@Override public void init(ServletConfig config) throws ServletException { ServletContext context = config.getServletContext(); }
-
-
直接通过HttpServlet的对象进行获取(调用GenericServlet的方法)
-
ServletContext context = this.getServletContext(); //或者 ServletContext context = getServletContext();
-
-
通过 HttpServletRequest对象获取
-
ServletContext context = request.getServletContext();
-
配置和获取全局参数
-
在 web.xml 中配置全局初始化参数:
-
<context-param> <param-name>appName</param-name> <param-value>MyWebApp</param-value> </context-param>
-
-
getInitParameter(String name)方法获取参数值-
String appName = context.getInitParameter("appName"); System.out.println("Application Name: " + appName);
-
-
使用
getInitParameterNames()方法获取所有参数名。-
Enumeration<String> paramNames = context.getInitParameterNames(); while (paramNames.hasMoreElements()) { String name = paramNames.nextElement(); String value = context.getInitParameter(name); System.out.println(name + ": " + value); }
-
代码中设置全局参数
-
使用
setAttribute(String name, Object value)方法设置数据 -
使用
getAttribute(String name)方法获取数据 -
使用
removeAttribute(String name)方法移除共享数据 -
context.setAttribute("userCount", 100); Integer userCount = (Integer) context.getAttribute("userCount"); System.out.println("User Count: " + userCount); context.removeAttribute("userCount");
访问资源
- 使用
getRealPath(String path)方法获取资源的真实路径。- 用于将相对路径(相对于 Web 应用的根目录)转换为服务器文件系统上的绝对路径。
- 使用
getResourceAsStream(String path)方法读取资源文件。 - 使用
getContextPath();获取该项目的上下文路径既访问路径- 部署在 Servlet 容器(如 Tomcat)中的 Web 应用的名称通常和访问路径不一致
- 比如访问路径为/spring,该方法返回/spring,参数不会影响该访问路径的获取
- 真实路径中所携带的是Web 应用的名称(例如Spring_Tomcat_war_exploded)
default Servlet
-
在 Tomcat 中,
<load-on-startup>值为1的defaultServlet 是一个特殊的 Servlet,它的作用是处理静态资源(如 HTML、CSS、JS、图片等)的请求。它是 Tomcat 默认提供的一个核心 Servlet,负责处理那些没有映射到其他 Servlet 的请求 -
default Servlet将静态资源封装到response对象中返回(设置好响应头、响应长度等相关信息后)
-
处理静态资源:
- 当客户端请求一个静态资源(如
/index.html、/styles.css等)时,如果没有其他 Servlet 映射到该请求路径,Tomcat 会使用defaultServlet 来处理该请求。 defaultServlet 会从应用的webroot(通常是WEB-INF之外的目录)中查找并返回请求的静态文件。
- 当客户端请求一个静态资源(如
-
处理目录列表
- 如果请求的是一个目录路径(如
/images/),且目录中没有默认文件(如index.html),defaultServlet 可以配置为返回目录列表(需在web.xml中启用目录列表功能)
- 如果请求的是一个目录路径(如
-
处理默认文件
- 如果请求的是一个目录路径,
defaultServlet 会尝试返回该目录下的默认文件(如index.html、index.jsp等)。
- 如果请求的是一个目录路径,
-
处理 404 错误
- 如果请求的资源不存在,
defaultServlet 会返回 404 错误。
- 如果请求的资源不存在,
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
listings:
- 如果设置为
true,当请求的是一个目录且没有默认文件时,defaultServlet 会返回目录列表。 - 默认值为
false,表示禁用目录列表。
debug:
- 设置调试级别,用于输出调试信息。
- 默认值为
0,表示不输出调试信息。
Servlet 的核心类和接口
Servlet 的核心类和接口定义在 javax.servlet 和 javax.servlet.http 包中,主要包括:
1. javax.servlet.Servlet 接口
-
定义了 Servlet 的生命周期方法:
init()、service()、destroy()。 -
所有 Servlet 类都必须实现这个接口。
-
这个接口下还有getServletConfig方法用来获取ServletConfig,该对象存储用户声明的初始化信息
-
每个Servlet中有自己独立的ServletConfig对象
-
在Servlet接口下的GenericServlet实现类中实现封装
-
ServletConfig getServletConfig(); -
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> <init-param> <param-name>param1</param-name> <param-value>value1</param-value> </init-param> <init-param> <param-name>param2</param-name> <param-value>value2</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> -
@WebServlet( urlPatterns = "/myServlet", initParams = { @WebInitParam(name = "param1", value = "value1"), @WebInitParam(name = "param2", value = "value2") }, loadOnStartup = 1 ) -
@Override public void init() { // 获取初始参数 param1 = getServletConfig().getInitParameter("param1"); param2 = getServletConfig().getInitParameter("param2"); System.out.println("param1: " + param1); System.out.println("param2: " + param2); }
-
2. javax.servlet.http.HttpServlet 类
- 是
Servlet接口的实现类,专门用于处理 HTTP 请求。 - 提供了
doGet()、doPost()、doPut()、doDelete()等方法,开发者可以重写这些方法以处理不同类型的 HTTP 请求。- Tomcat默认调用servlet的service方法
- 该实现类重写了service方法,根据请求的方法类型调用相应的do方法,do方法的默认实现是响应405页面,可以在自定义servlet中通过重写这些do方法来调用自定义的逻辑。
- 不推荐直接重写service方法,因为父类的service方法中还有响应的其他判断逻辑
3. javax.servlet.ServletRequest 和 javax.servlet.ServletResponse
- 用于封装请求和响应信息。
ServletRequest提供客户端请求的数据(如参数、头信息)。ServletResponse用于向客户端发送响应。
4. javax.servlet.http.HttpServletRequest 和 javax.servlet.http.HttpServletResponse
- 是
ServletRequest和ServletResponse的子接口,专门用于处理 HTTP 协议的请求和响应。 - 提供了 HTTP 特定的方法,如
getHeader()、getMethod()、setStatus()等。
5. javax.servlet.http.HttpSession
- 用于管理用户会话状态。
- 可以在多个请求之间存储用户数据(如用户登录信息)。
HttpServletRequest
在 Tomcat(或其他符合 Java Servlet 规范的 Web 容器)中,客户端发送的 HTTP 请求信息会被封装在 HttpServletRequest 对象中。HttpServletRequest 是 Java Servlet API 中的一个接口,它提供了访问 HTTP 请求信息的方法
HttpServletRequest 的作用
HttpServletRequest对象用于封装客户端发送的 HTTP 请求信息,包括:- 请求方法(GET、POST 等)。
- 请求头信息。
- 请求参数(URL 参数或表单数据)。
- 客户端信息(如 IP 地址、浏览器类型)。
- 会话信息(如
HttpSession)。
HttpServletRequest 提供了许多方法,用于获取请求的详细信息。
1. 获取请求信息
String getMethod():返回请求的 HTTP 方法(如 GET、POST)。String getRequestURI():返回请求的 URI(不包括协议、主机和端口)。String getQueryString():返回请求的查询字符串(URL 中?后面的部分)。String getProtocol():返回请求的协议和版本(如 HTTP/1.1)。
2. 获取请求头信息
String getHeader(String name):返回指定名称的请求头值。Enumeration<String> getHeaderNames():返回所有请求头的名称。
3. 获取请求参数
String getParameter(String name):返回指定名称的请求参数值。Map<String, String[]> getParameterMap():返回所有请求参数的键值对。Enumeration<String> getParameterNames():返回所有请求参数的名称。
4. 获取客户端信息
String getRemoteAddr():返回客户端的 IP 地址。String getRemoteHost():返回客户端的主机名。int getRemotePort():返回客户端的端口号。
5. 获取会话信息
HttpSession getSession():返回与当前请求关联的会话对象。如果会话不存在,则创建一个新的会话。HttpSession getSession(boolean create):返回与当前请求关联的会话对象。如果create为false且会话不存在,则返回null。
6. 获取其他信息
String getServletPath():返回请求的 Servlet 路径。String getContextPath():返回请求的上下文路径(Web 应用的根路径)。Cookie[] getCookies():返回客户端发送的所有 Cookie。RequestDispatcher getRequestDispatcher(String path):请求转发- **
RequestDispatcher接口的forward(ServletRequest request, ServletResponse response)**:请求转发
HttpServletRequest 的工作流程
- 客户端发送请求:浏览器或其他客户端发送 HTTP 请求到服务器。
- Tomcat 接收请求:Tomcat 解析 HTTP 请求并将其封装为
HttpServletRequest对象。 - Servlet 处理请求:Tomcat 将
HttpServletRequest对象传递给对应的 Servlet,Servlet 通过该对象获取请求信息并处理。 - 生成响应:Servlet 根据请求信息生成响应,并通过
HttpServletResponse对象返回给客户端。
HttpServletResponse
在 Tomcat(或其他符合 Java Servlet 规范的 Web 容器)中,服务器生成的 HTTP 响应信息会被封装在 HttpServletResponse 对象中。HttpServletResponse 是 Java Servlet API 中的一个接口,它提供了设置 HTTP 响应信息的方法。
HttpServletResponse 的作用
HttpServletResponse对象用于封装服务器生成的 HTTP 响应信息,包括:- 响应状态码(如 200、404)。
- 响应头信息(如
Content-Type、Set-Cookie)。 - 响应体内容(如 HTML、JSON、文件)。
- 重定向和错误处理。
HttpServletResponse 的主要方法
1. 设置响应状态
void setStatus(int status):设置响应的状态码(如 200、404)。void sendError(int status):发送错误状态码,并清空响应缓冲区。void sendError(int status, String message):发送错误状态码和错误信息。
2. 设置响应头信息
void setHeader(String name, String value):设置指定名称的响应头。void addHeader(String name, String value):添加指定名称的响应头(允许多个值)。void setContentType(String type):设置响应内容的 MIME 类型(如text/html、application/json)。void setCharacterEncoding(String encoding):设置响应内容的字符编码(如UTF-8)。
3. 设置响应体内容
PrintWriter getWriter():返回一个PrintWriter对象,用于向客户端发送文本数据。ServletOutputStream getOutputStream():返回一个ServletOutputStream对象,用于向客户端发送二进制数据。
4. 重定向
void sendRedirect(String location):将客户端重定向到指定的 URL。
5. 其他方法
void addCookie(Cookie cookie):向客户端添加一个 Cookie。void setContentLength(int length):设置响应内容的长度。void setBufferSize(int size):设置响应缓冲区的大小。
HttpServletResponse 的工作流程
- Servlet 处理请求:Servlet 根据
HttpServletRequest对象处理客户端请求。 - 设置响应信息:Servlet 通过
HttpServletResponse对象设置响应状态码、头信息和内容。 - Tomcat 发送响应:Tomcat 将
HttpServletResponse对象中的信息转换为 HTTP 响应并发送给客户端。

浙公网安备 33010602011771号