SpringWebMVC基础组件与请求处理流程详解
立即解锁
发布时间: 2025-08-19 02:32:45 阅读量: 3 订阅数: 11 


Spring框架下的Java开发实践与进阶
### Spring Web MVC 基础组件与请求处理流程详解
#### 1. Spring Web MVC 基础概述
在使用 Spring Web MVC 实现 Web 应用程序时,涉及构建和设置控制器、提供视图以及在视图中显示数据等操作。这些操作通过 `DispatcherServlet` 与 `ApplicationContext` 结合在一起。`DispatcherServlet` 是服务器的网关,负责管理基于 HTTP 的请求 - 响应处理工作流。而 `WebApplicationContext` 是一种特殊的上下文,它与 `DispatcherServlet` 集成,管理所有与 Web 相关的组件,如控制器、视图、URL 映射和拦截器等。
#### 2. DispatcherServlet
`org.springframework.web.servlet.DispatcherServlet` 是 Spring MVC 应用程序所有请求的主要入口点。和其他 Servlet 一样,必须在 `web.xml` 文件中声明它,这样外部应用程序才能通过 HTTP 协议访问它。该 Servlet 可以进行配置,其初始化参数如下表所示:
| 参数 | 描述 | 默认值 |
| --- | --- | --- |
| contextClass | 要使用的 `WebApplicationContext` 类型 | `XmlWebApplicationContext` |
| namespace | 要使用的 `WebApplicationContext` 的命名空间 | `[name of servlet]-servlet` |
| contextConfigLocation | 覆盖查找 `WebApplicationContext` 位置默认值的参数 | `/WEB-INF/[namespace].xml` |
| publishContext | 是否将 `ApplicationContext` 发布到 `ServletContext` 中(使其他 Servlet 可以使用) | `true` |
每个在 Spring Web 应用程序中定义的 `DispatcherServlet` 都有一个关联的 `WebApplicationContext`。默认情况下,其命名空间包含 Servlet 的名称,并且其作用域仅限于映射到该 Servlet 的请求。为了在一个应用程序的多个 Servlet 之间共享通用功能,`DispatcherServlet` 在初始化时会检查其配置,查找由 `ContextLoaderListener` 或 `ContextLoaderServlet` 初始化的普通 `ApplicationContext`。如果找到这样的上下文,它将成为特定于该 Servlet 的 `WebApplicationContext` 的父上下文。
以下是在 `web.xml` 文件中声明 `DispatcherServlet` 的示例:
```xml
<servlet>
<servlet-name>sample</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
```
若要修改 `DispatcherServlet` 的行为,可以在 Servlet 声明中包含 `init-param`,例如:
```xml
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/ctx/controllers.xml /WEB-INF/ctx/utils.xml</param-value>
</init-param>
```
接下来,需要告诉 Servlet 容器将希望由 Spring Web 应用程序处理的请求定向到 `DispatcherServlet`。通常会将一系列文件扩展名映射到 `DispatcherServlet`,示例如下:
```xml
<servlet-mapping>
<servlet-name>sample</servlet-name>
<url-pattern>*.view</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>sample</servlet-name>
<url-pattern>/secure/*.edit</url-pattern>
</servlet-mapping>
```
需要注意的是,Spring 和 Servlet API 都不强制要求在 URL 中使用特定的扩展名或模式,你可以自由使用任何喜欢的 URL。为了避免向潜在的黑客透露所使用的技术,建议避免暴露 `.jsp`、`.asp` 或 `.do` 等扩展名,若没有合适的扩展名,可以考虑使用 `.html`。
在声明并可能修改 `DispatcherServlet` 后,`web.xml` 文件的配置就完成了。接下来,需要创建一个包含控制器和其他可能的 Web 相关组件(如视图解析器、异常处理程序和区域解析器)的 `WebApplicationContext`。
#### 3. WebApplicationContext
`WebApplicationContext` 包含所有负责使逻辑对用户可用的 Web 相关 Bean。它由 `DispatcherServlet` 初始化,默认情况下是 `org.springframework.web.context.support.XmlWebApplicationContext` 类的实例。`WebApplicationContext` 是 `ApplicationContext` 的子上下文,`ApplicationContext` 包含中间层服务,如事务服务层对象、数据源和数据访问对象等。
`XmlWebApplicationContext` 被 `DispatcherServlet` 用于模拟 Web 应用程序的工作流。`DispatcherServlet` 会检查 `WebApplicationContext` 中一些特殊 Bean 的声明,这些 Bean 用于执行工作流,部分 Bean 有默认值,部分需要自己提供。以下是一些重要的 Bean 及其功能:
- **HandlerMapping**:负责确定将请求分发到哪
0
0
复制全文
相关推荐










