在 Java Servlet 规范中,多个 Servlet 之间的请求分发是通过 URL 映射来实现的。每个 Servlet 都在 web 应用的部署描述符文件(web.xml
)或通过注解(@WebServlet
)定义了其 URL 映射。当 HTTP 请求到达服务器时,服务器根据请求的 URL 和配置的映射规则,将请求分发到相应的 Servlet。
URL 映射规则
-
部署描述符文件(
web.xml
):- 在
web.xml
文件中,可以为每个 Servlet 定义一个或多个 URL 映射。 web.xml
中的映射规则如下所示:<servlet> <servlet-name>ExampleServlet</servlet-name> <servlet-class>com.example.ExampleServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ExampleServlet</servlet-name> <url-pattern>/example</url-pattern> </servlet-mapping>
- 在
-
注解方式:
- 使用
@WebServlet
注解可以直接在 Servlet 类中定义 URL 映射。 - 注解的使用方式如下:
import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @WebServlet("/example") public class ExampleServlet extends HttpServlet { // Servlet implementation }
- 使用
URL 映射的类型
URL 映射主要有三种类型:
- 精确匹配:完整的 URL 匹配。
- 例如
/example
映射到ExampleServlet
。
- 例如
- 前缀匹配:以特定前缀开头的 URL。
- 例如
/api/*
映射到ApiServlet
,匹配/api/foo
、/api/bar
等。
- 例如
- 后缀匹配:以特定后缀结尾的 URL。
- 例如
*.jsp
映射到JspServlet
,匹配/index.jsp
、/about.jsp
等。
- 例如
请求分发的工作流程
当一个 HTTP 请求到达服务器时,服务器根据以下步骤确定将请求分发到哪个 Servlet:
- 解析请求 URL:服务器解析请求的 URL,获取路径部分。
- 匹配映射规则:
- 服务器首先尝试精确匹配。
- 如果没有找到精确匹配,服务器会尝试前缀匹配。
- 如果前缀匹配也没有结果,服务器会尝试后缀匹配。
- 选择 Servlet:根据匹配结果,服务器选择相应的 Servlet 并将请求分发给它处理。
- 处理请求:Servlet 接收请求,执行相应的业务逻辑,并生成响应。
例子
假设有如下配置的 web.xml
:
<web-app>
<servlet>
<servlet-name>HomeServlet</servlet-name>
<servlet-class>com.example.HomeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HomeServlet</servlet-name>
<url-pattern>/home</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ApiServlet</servlet-name>
<servlet-class>com.example.ApiServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ApiServlet</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>JspServlet</servlet-name>
<servlet-class>com.example.JspServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JspServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
</web-app>
- 请求
/home
:精确匹配到HomeServlet
。 - 请求
/api/users
:前缀匹配到ApiServlet
。 - 请求
/contact.jsp
:后缀匹配到JspServlet
。
注解方式的例子
@WebServlet("/home")
public class HomeServlet extends HttpServlet {
// Implementation
}
@WebServlet("/api/*")
public class ApiServlet extends HttpServlet {
// Implementation
}
@WebServlet("*.jsp")
public class JspServlet extends HttpServlet {
// Implementation
}
- 请求
/home
:精确匹配到HomeServlet
。 - 请求
/api/products
:前缀匹配到ApiServlet
。 - 请求
/help.jsp
:后缀匹配到JspServlet
。
通过这些映射机制,服务器能够根据请求的 URL 将请求分发到适当的 Servlet 进行处理。