Spring MVC 基础
文章目录
一、Spring MVC 导引
1、MVC设计模式
Model: 模型数据,业务逻辑。
View: 呈现模型,与用户进行交互。
Controller: 负责接收并处理请求,响应客户端。
2、Spring MVC
Spring MVC 是 Spring 框架的一个后续产品,和 Spring 框架可以很好的结合使用,不需要整合。
- SpringMVC核心组件
- DispatcherServlet: 前置控制器
- Handler: 处理器,完成具体业务逻辑
- HandlerMapping: 将请求映射到Handler
- HandlerInterceptor: 处理器拦截器
- HandlerExecutionChain: 处理器执行链
- HandlerAdapter: 处理器适配器
- ModelAndView: 装载模型数据和视图信息
- ViewResolver: 视图解析器
- SpringMVC实现流程
- 客户端请求被 DispatcherServlet 接收
- DispatcherServlet 将请求映射到 Handler
- 生成 Handler 以及 HandlerInterceptor
- 返回 HandlerExecutionChain(Handler + HandlerInterceptor)
- DispatcherServlet 通过 HandlerAdapter 执行 Handler
- 返回一个 ModelAndView
- DispatcherServlet 通过 ViewResolver 进行解析
- 返回填充了模型数据的 View,响应给客户端
二、基于 Xml 的 Spring MVC 实现
1、Spring MVC 的使用
- 大部分组件由框架提供,开发者只需通过配置(注解)进行关联
- 只需手动编写 Handler,View 即可。
2、基于XML配置的实现
- Spring MVC 基础配置
- XML 配置 Controller,HandlerMapping 组件映射
- XML 配置 ViewResolver 组件映射
- web.xml 中配置前置控制器 DispatcherServlet
<!-- 前置控制器 DispatcherServlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定 springmvc.xml 的路径 -->
<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>
- Spring MVC 配置 springmvc_config.xml
<!-- 配置:将bean的name作为url进行查找 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<!-- 配置: 映射"/test" 关联 Handle -->
<bean name="/test" class="com.moc.handler.MyHandler"/>
<!-- 配置:处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<!-- 配置: 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 为视图名称加上统一的前缀和后缀,test ==> /test.jsp -->
<!-- 配置前缀 -->
<property name="prefix" value="/"/>
<!-- 配置后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
- 自定义类实现 Controller 接口
// 处理单一请求的Controller接口实现类
public class MyHandler implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
// 创建 装载模型数据和逻辑视图 的对象
ModelAndView modelAndView = new ModelAndView();
// 添加模型数据 key--value (会自动放入request域中,value可以是任意POJO对象)
modelAndView.addObject("name", "Tom");
// 设置逻辑视图名称,视图解析器会根据名字解析到具体的视图页面
modelAndView.setViewName("test");
return modelAndView;
}
}
- 具体视图页面 test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${name}
</body>
</html>
三、基于注解方式的Spring MVC 实现
1、实现步骤
- SpringMVC基础配置
- Controller,HandlerMapping 通过注解进行映射
- XML 配置 ViewResolver 组件映射
-
web.xml 中配置前置控制器 DispatcherServlet
和 xml 配置方式一样,可以在 web.xml 另外加上 过滤器配置解决中文乱码,和 default Servlet 映射防止前置控制器拦截静态资源。
<!-- 过滤器处理中文乱码(需放在前置控制器之前) -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 设置访问静态资源 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
- Spring MVC 配置 springmvc_config.xml
<!-- 指定包开启注解扫描 -->
<context:component-scan base-package="com.moc.handler"/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 将 show 配置成 /test.jsp -->
<!-- 配置前缀 -->
<property name="prefix" value="/"/>
<!-- 配置后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
- 通过注解实现映射 Handler
// 基于注解实现Spring MVC 的 Handler
@Controller
public class AnnotationHandler {
// 方式1: ModelAndView 完成数据的传递,视图的解析
@RequestMapping("/modelAndViewTest")
public ModelAndView modelAndView() {
// 装载模型数据和逻辑视图
ModelAndView modelAndView = new ModelAndView();
// 添加模型数据 key--value (会自动放入request域中)
modelAndView.addObject("name", "Alice");
// 添加逻辑视图
modelAndView.setViewName("show");
return modelAndView;
}
// 方式2: Model 传值 ,String进行视图解析
@RequestMapping("/ModelTest")
public String ModelTest(Model model) {
// 填充模型数据
model.addAttribute("name", "Jerry");
// 设置逻辑视图
return "show";
}
// 方式3: Map 传值 ,String进行视图解析
@RequestMapping("/MapTest")
public String MapTest(Map<String, String> map) {
// 填充模型数据
map.put("name", "Rose");
// 设置逻辑视图
return "show";
}
}