前言

  • HandlerMapping的继承体系

  • HandlerAdapter的继承体系

手动配置映射器和解析器、适配器

编写配置文件

1
2
3
4
5
6
7
8
9
10
11
12
<bean id="/login.action" class="controller.LoginController"></bean>
<!-- HandlerMapping:映射解析器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>

<!-- HandlerAdapter:处理适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>

<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>

controller编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class LoginController implements Controller{

@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
ModelAndView modelAndView = new ModelAndView("wel");
modelAndView.addObject("msg","hello world!");
return modelAndView;
}
}

测试页面

1
2
3
4
5
6
7
8
9
10
11
12
13
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>login</title>
</head>
<body>
<!--
HandlerMapping,HandlerAdapter
都会对应到Spring中具体的实例
-->
<a href="login.action">登录</a>
</body>
</html>

测试结果


可以看到页面跳转成功并且数据也读取到了

SpringMVC上下文加载顺序


SpringMVC小结

SpringMVC优势

🤞 清晰的角色划分:前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器(Validator)、命令对象(Command 请求参数绑定到的对象叫命令对象)、表单对象(Form Object 提供给表单展示和提交到的对象叫表单对象
🤞 分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要
🤞 由于命令对象就是一个POJO,无需继续框架特定API,可以使用命令对象直接作为业务对象
🤞 和Spring其他框架无缝集成,是其他web框架所不具备的
🤞 可适配,通过HandlerAdapter可以支持任意的类作为处理器
🤞 可定制性,HandlerMapping、ViewResolver等能够非常简单的定制
🤞 功能强大的数据验证、格式化、绑定机制
🤞 利用Spring提供的Mock对象能够非常简单的进行web层单元测试
🤞 本地化、主题的解析的支持,使我们更容易进行国际化和主题切换
🤞 强大的JSP标签库,使JSP编写更容易
🤞 ……还有不如RESTful风格的支持、简单的文件上传、约定大于配置的契约式编程支持、基于注解的零配置支持等等

自由度和扩展性

☘️ 编写任意的HandlerMapping实现类,依据任何策略来决定一个web请求到HandlerExecutionChain对象的生成
☘️ 自定义拦截器,我们可以在一个请求被真正处理之前、请求被处理但还没输出到响应中、请求已经被输出到响应之后这三个时间点去做任何我们想要做的事情,比如日志等
☘️ HandlerAdapter:可以提供自己的实现类来处理Handler对象

ps:因作者能力有限,有错误的地方请见谅

  • 喜欢这篇文章的话可以用快捷键 Ctrl + D 来收藏本页
× 请我吃糖~
打赏二维码