一、MVC设计模式
二、Spring MVC组件
组件名 | 作用 |
---|---|
DispatcherServlet | 前置控制器 |
Handler | 完成具体业务逻辑的处理器 |
HandlerMapping | 将请求映射到Handler |
HandlerInterceptor | 处理器拦截器 |
HandlerExecutionChain | 处理器执行链 |
HandlerAdapter | 处理器适配器 |
ModelAndView | 装载模型数据和视图信息 |
ViewResolver | 视图解析器 |
三、Spring MVC流程
- 客户端请求被DispatcherServlet接收
- DispatcherServlet将请求映射到Handler
- 生成Handler以及HandlerInterceptor
- 返回HandlerExecutionChain(Handler + HandlerInterceptor)
- DispatcherServlet通过HandlerAdapter执行Handler
- 返回一个ModelAndView
- DispatcherServlet通过ViewResolver进行解析
- 返回填充了模型数据的View,响应给客户端
四、Spring MVC实现
1. 通过XML配置
首先自定义Handler,实现handleRequest方法:
public class MyHeadler implements Controller {
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
// 装载模型数据和逻辑视图
ModelAndView modelAndView = new ModelAndView();
// 添加模型数据
modelAndView.addObject("name", "小明");
// 添加逻辑视图
modelAndView.setViewName("index");
return modelAndView;
}
}
配置Spring MVC配置文件:
<!-- 配置HandlerMapping,将url请求映射到Handler -->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- 配置mapping -->
<property name="mappings">
<props>
<!-- 配置test请求对应的handler -->
<prop key="/test">testHandler</prop>
</props>
</property>
</bean>
<!-- 配置Handler -->
<bean id="testHandler" class="MyHeadler"/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置前缀 -->
<property name="prefix" value="/"></property>
<!-- 配置后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
在web.xml中注册DispatcherServlet,并设置配置文件的路径:
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
最后通过访问/项目名/test
在index页面中展示了数据
2. 通过注解
在例1的基础上,删掉配置文件中的bean管理部分,并开启注解扫描:
<!-- 开启注解扫描 -->
<context:component-scan base-package="anno"/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置前缀 -->
<property name="prefix" value="/"></property>
<!-- 配置后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
自定义Handler类,并添加响应注解
可以用ModelAndView、Model、Map三种方式进行编写:
@Controller
public class MyHandler2 {
@RequestMapping("/test1")
public ModelAndView modelAndViewTest() {
// 创建ModelAndView对象
ModelAndView modelAndView = new ModelAndView();
// 填充模型数据
modelAndView.addObject("name", "小明");
// 设置逻辑视图
modelAndView.setViewName("index");
return modelAndView;
}
@RequestMapping("/test2")
public String modelTest(Model model) {
// 填充模型数据
model.addAttribute("name", "小明");
// 设置逻辑视图
return "index";
}
@RequestMapping("/test3")
public String mapTest(Map<String, String> map) {
// 填充模型数据
map.put("name", "小明");
// 设置逻辑视图
return "index";
}
}
最后通过访问/项目名/test*
( * 代表对应数字)在index页面中展示了数据
附:
- 要使用Spring MVC框架,需要引入spring-webmvc
- 要使用Servlet进行Web开发,需要引入javax.servlet-api