跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Spring DispatcherServlet
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:Spring DispatcherServlet}} '''Spring DispatcherServlet''' 是 [[Spring Framework]] 中用于处理 [[HTTP]] 请求的核心组件,它作为前端控制器(Front Controller)负责将请求分发给相应的处理器(如 [[Controller]] 类),并协调视图渲染、异常处理等流程。本文将详细介绍其工作原理、配置方法及实际应用。 == 概述 == DispatcherServlet 是 [[Java Servlet API]] 的扩展,实现了 `javax.servlet.http.HttpServlet` 接口。它是 Spring Web MVC 的入口点,负责以下核心任务: * 接收所有传入的 HTTP 请求 * 通过 [[HandlerMapping]] 确定请求对应的处理器(Controller) * 通过 [[HandlerAdapter]] 调用处理器方法 * 使用 [[ViewResolver]] 解析视图 * 处理异常并通过 [[HandlerExceptionResolver]] 返回错误响应 <mermaid> flowchart TD A[HTTP Request] --> B[DispatcherServlet] B --> C{HandlerMapping} C --> D[Controller] D --> E[ModelAndView] E --> F{ViewResolver} F --> G[View] G --> H[HTTP Response] </mermaid> == 配置 DispatcherServlet == === 通过 web.xml 配置 === 传统方式在 `web.xml` 中声明 Servlet: <syntaxhighlight lang="xml"> <web-app> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-mvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> </syntaxhighlight> === 通过 Java 配置 === Spring 3.1+ 支持纯 Java 配置: <syntaxhighlight lang="java"> public class MyWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(AppConfig.class); DispatcherServlet servlet = new DispatcherServlet(context); ServletRegistration.Dynamic registration = container.addServlet("dispatcher", servlet); registration.setLoadOnStartup(1); registration.addMapping("/"); } } </syntaxhighlight> == 请求处理流程 == DispatcherServlet 处理请求的完整流程如下(可通过 `org.springframework.web.servlet.DispatcherServlet` 的 `doDispatch()` 方法查看源码实现): 1. 接收 HTTP 请求 2. 查找适用的 [[HandlerMapping]] 3. 通过 [[HandlerAdapter]] 执行处理器方法 4. 处理返回的 [[ModelAndView]] 或响应体 5. 解析视图(如需要) 6. 渲染视图并返回响应 数学表示请求映射关系: <math> f: R \rightarrow H \text{ where } R \text{ is request}, H \text{ is handler} </math> == 核心组件交互 == DispatcherServlet 依赖多个协作组件: {| class="wikitable" |+ 关键组件及其作用 ! 组件 !! 职责 |- | [[HandlerMapping]] || 确定请求对应的处理器 |- | [[HandlerAdapter]] || 执行处理器方法 |- | [[ViewResolver]] || 将逻辑视图名解析为实际视图 |- | [[HandlerExceptionResolver]] || 处理控制器抛出的异常 |- | [[LocaleResolver]] || 解析客户端区域设置 |} == 实际案例 == === 基本控制器示例 === <syntaxhighlight lang="java"> @Controller public class HomeController { @GetMapping("/greet") public String greet(Model model) { model.addAttribute("message", "Hello, Spring MVC!"); return "welcome"; // 视图名 } } </syntaxhighlight> 对应的视图文件 `welcome.jsp`: <syntaxhighlight lang="jsp"> <%@ page contentType="text/html;charset=UTF-8" %> <html> <head><title>Greeting</title></head> <body> <h1>${message}</h1> </body> </html> </syntaxhighlight> 访问 `/greet` 的输出: {{Code|output=<html> <head><title>Greeting</title></head> <body> <h1>Hello, Spring MVC!</h1> </body> </html>}} === REST 控制器示例 === <syntaxhighlight lang="java"> @RestController @RequestMapping("/api") public class UserController { @GetMapping("/users/{id}") public ResponseEntity<User> getUser(@PathVariable Long id) { User user = userService.findById(id); return ResponseEntity.ok(user); } } </syntaxhighlight> == 高级主题 == === 自定义 DispatcherServlet === 可通过继承扩展默认行为: <syntaxhighlight lang="java"> public class CustomDispatcherServlet extends DispatcherServlet { @Override protected void doDispatch(HttpServletRequest request, HttpServletResponse response) { // 前置处理 super.doDispatch(request, response); // 后置处理 } } </syntaxhighlight> === 异步请求处理 === Spring MVC 支持异步请求处理: <syntaxhighlight lang="java"> @GetMapping("/async") public Callable<String> asyncProcessing() { return () -> { Thread.sleep(2000); // 模拟长时间任务 return "async-result"; }; } </syntaxhighlight> == 常见问题 == {{Warning|1=若遇到 404 错误,检查: * 是否正确配置了 `@Controller` 或 `@RestController` * 请求路径是否匹配 `@RequestMapping` 值 * 是否扫描到控制器所在的包}} {{Tip|使用 `spring.mvc.log-request-details=true` 可启用详细请求日志}} == 性能考量 == * 默认情况下,DispatcherServlet 是线程安全的 * 避免在控制器中维护状态 * 对于高并发场景,考虑: * 使用异步处理 * 优化视图解析 * 缓存静态资源 == 参见 == * [[Spring MVC]] * [[Servlet API]] * [[RESTful Web Services]] [[Category:Spring Framework]] [[Category:Web 开发]] [[Category:后端框架]] [[Category:Spring]] [[Category:Spring Web开发]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Code
(
编辑
)
模板:Mbox
(
编辑
)
模板:Tip
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)