Spring4 MVC 笔记: ControllerClassNameHandlerMapping 实现DispatcherServlet
来源:互联网 发布:java虚拟机 编辑:程序博客网 时间:2024/05/24 05:17
在看Spring4,1 文档时, 发现了 ControllerClassNameHandlerMapping 这个东西, 简单来说, 作用是将 MyController 这样的名字, 自动映射成 /my/** 这样的URL, 于是我就猜想用它是不是就可以省略掉Controller类上的@RequestMapping . 于是一段痛苦的经历开始了. 下面记录一下配置过程中遇到了几个问题和结论.
第一次尝试: 配置
配置方法非常简单:
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
然后一个不带 @RequestMapping的类: (错误示例)
@Controllerpublic class AccountController {public String add() {return "account/hello";}}
和一个 hello.html, 内容任意.
异常现象1. 无法请求ResourceHandler中注册的静态资源文件.
异常现象2. account/hello可以正确返回, 但 account/add 异常: 无法找到模板.
原因及结论
优先级问题:
在其他都使用默认配置的情况下, ControllerClassNameHandlerMapping 和静态资源文件的HandlerMapping的优先级, 都低于 @Controller 对应的RequestHandlerMapping, 而一个不带 @RequestMapping的Controller, 映射成一个空的Url pattern, 将会拦截所有URL.
解决: @Controller 对应的RequestHandlerMapping, 默认优先级 order = 0, 在注册 ControllerClassNameHandlerMapping 和 ResourceHandler时,设置一个小于0 的负数order就可以了.
第二次尝试: handler
在解决了优先级问题后, account/add还是无法请求, 不过这次错误原因就很明显了, 缺少handleRequest函数.
根据Spring文档, 修改的正确示例:
public class AccountController implements Controller {public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {<span style="white-space:pre"></span>// the implementation is not hugely important for this example...}}映射URL : /account* 就是最原始的用法, 一个Controller类只对应一个函数. 处理函数handleRequest的名称, 参数, 返回类型都定死.
显然我们更喜欢DispatchController
第三次改进: dispatch
继续看了下文档, 有提到一个MultiActionController 于是试了一下:
@Controllerpublic class AccountController extends MultiActionController {public String add(HttpServletRequest request, HttpServletResponse response) {return "account/hello";}public String store(HttpServletRequest request, HttpServletResponse response) {return "account/hello";}}
请求 localhost:8080/account/add 成功返回 hello.html
但是MultiActionController 有一个非常让人纠结的地方, 他的Mapping函数是根据参数和返回值来映射的, 就是说方法必须是
public ModeAndView | Map | String method ( HttpServletRequest request, HttpServletResponse response , ... )
返回类型 三选一, 参数前两个定死.
总结:
在第三次的Controller中, 已经可以实现基本的DispatchController功能, 对于以往的类似Struts2的控制层已经足够. 直接通过名称映射, 不需要其他配置和注解, 这一点来说很是方便.
但是如果希望使用@RequestMapping的功能, 例如url参数等, 来实现Restful就不方便了. 毕竟RequestMapping的支持是到函数级别的. 而上面的示例只是到类级别.
- Spring4 MVC 笔记: ControllerClassNameHandlerMapping 实现DispatcherServlet
- Spring MVC ControllerClassNameHandlerMapping example
- Spring MVC ControllerClassNameHandlerMapping example
- Spring4.3.8MVC中文文档-22.2-The DispatcherServlet-前置控制器
- Spring4.x MVC 整合笔记,使用maven
- Spring4.0.6 源码解读-DispatcherServlet
- Spring MVC学习笔记(一) DispatcherServlet分析
- 使用ControllerClassNameHandlerMapping实现SpringMVC的CoC配置
- 使用ControllerClassNameHandlerMapping实现SpringMVC的CoC配置
- 使用ControllerClassNameHandlerMapping实现SpringMVC的CoC配置
- 使用ControllerClassNameHandlerMapping实现SpringMVC的CoC配置
- 使用ControllerClassNameHandlerMapping+MultiActionController实现零配置
- Spring MVC - DispatcherServlet Example
- Spring MVC DispatcherServlet说明
- Spring MVC DispatcherServlet配置
- spring mvc dispatcherServlet
- Spring MVC中的DispatcherServlet
- Spring MVC:DispatcherServlet详解
- 南邮 OJ 1020 层次遍历二叉树
- POJ 1061 扩展欧几里得算法解不定方程
- Ubuntu系统下eclipse配置mapreduce插件常见错误和解决办法汇总
- Effective C++ 笔记
- 截取HTML 文章,补充样式,防止出现样式乱套
- Spring4 MVC 笔记: ControllerClassNameHandlerMapping 实现DispatcherServlet
- dataSource: The name of the property, following JavaBean naming conventions.解决方法
- leetcode 64: Minimum Path Sum
- 优化临时表使用,SQL语句性能提升100倍
- HIHO1176(无向图欧拉路)
- 并查集详解
- 南邮 OJ 1021 二叉树复制和左右子树互换
- Box2D C++教程 第四节:创建测试
- hihocoder 1175 拓扑排序·二(拓扑排序应用)