视图
视图是用户看到并与之交互的界面. 对老式的 web 应用程序来说, 视图就是由 https://baike.baidu.com/item/html 元素组成的界面, 在新式的 Web 应用程序中, https://baike.baidu.com/item/HTML 依旧在视图中扮演着重要的角色, 但一些新的技术已层出不穷, 它们包括 Adobe Flash https://baike.baidu.com/item/Adobe Flash 和像 https://baike.baidu.com/item/XHTML , https://baike.baidu.com/item/XML / https://baike.baidu.com/item/XSL , https://baike.baidu.com/item/WML 等一些标识语言和
MVC 好处是它能为应用程序处理很多不同的视图 https://baike.baidu.com/item/视图 . 在视图中其实没有真正的处理发生, 不管这些数据是联机存储的还是一个雇员列表, 作为视图来讲, 它只是作为一种输出数据并允许用户操纵的方式.
模型
模型表示企业数据和业务规则. 在 MVC 的三个部件中, 模型拥有最多的处理任务. 例如它可能用像 https://baike.baidu.com/item/EJB s 和 ColdFusion Components 这样的构件对象来处理数据库, 被模型返回的数据是中立的, 就是说模型与数据格式无关, 这样一个模型能为多个视图提供数据, 由于应用于模型的代码只需写一次就可以被多个视图重用, 所以减少了代码的重复性.
控制器
控制器接受用户的输入并调用模型和视图去完成用户的需求, 所以当单击 Web 页面中的超链接和发送 HTML 表单 https://baike.baidu.com/item/HTML表单 时, 控制器本身不输出任何东西和做任何处理. 它只是接收请求并决定调用哪个模型构件去处理请求, 然后再确定用哪个视图来显示返回的数据.
Spring MVC
特点
(1)清晰地角色划分. Spring MVC 在 Model,View 和 Controller 方面提供了一个非常清晰的角色划分.
(2)灵活的配置功能. 因为 Spring 的核心是 IoC, 同样在实现 MVC 上, 也可以把各种类当作 Bean 来通过 XML 进行配置.
(3)提供了大量的控制器接口和实现类. 开发者可以使用 Spring 提供的控制器实现类, 也可以自己实现控制器接口.
(4)真正做到了与 View 层的无关. 它不会强制开发者使用 JSP, 也可以根据项目需求使用 Velocity,XSLT 等技术, 使用起来更加灵活.
(5)国际化支持.
(6)面向接口编程.
(7)Spring 提供了 Web 应用开发的一整套流程, 不仅仅是 MVC, 它们之间可以很方便地结合一起.
工作流程
(1)首先用户发送请求 -->DispatcherServlet, 前端控制器收到请求后自己不进行处理, 而是委托给其他的解析器进行处理, 作为统一访问点, 进行全局的流程控制;
(2)DispatcherServlet-->HandlerMapping, 映射处理器将会把请求映射为 HandlerExecutionChain 对象 (包含一个 Handler 处理器(页面控制器) 对象, 多个 HandlerInterceptor 拦截器)对象;
(3)DispatcherServlet-->HandlerAdapter, 处理器适配器将会把处理器包装为适配器, 从而支持多种类型的处理器, 即适配器设计模式的应用, 从而很容易支持很多类型的处理器;
(4)HandlerAdapter-->调用处理器相应功能处理方法, 并返回一个 ModelAndView 对象(包含模型数据, 逻辑视图名);
(5)ModelAndView 对象(Model 部分是业务对象返回的模型数据, View 部分为逻辑视图名)--> ViewResolver, 视图解析器将把逻辑视图名解析为具体的 View;
(6)View-->渲染, View 会根据传进来的 Model 模型数据进行渲染, 此处的 Model 实际是一个 Map 数据结构;
(7)返回控制权给 DispatcherServlet, 由 DispatcherServlet 返回响应给用户, 到此一个流程结束.
核心类与接口:
DispatcherServlet -- 前置控制器
HandlerMapping 接口 -- 处理请求的映射
HandlerMapping 接口的实现类:
SimpleUrlHandlerMapping 通过配置文件, 把一个 URL 映射到 Controller
DefaultAnnotationHandlerMapping 通过注解, 把一个 URL 映射到 Controller 类上
HandlerAdapter 接口 -- 处理请求的映射
AnnotationMethodHandlerAdapter 类, 通过注解, 把一个 URL 映射到 Controller 类的方法上
Controller 接口 -- 控制器
由于我们使用了 @Controller 注解, 添加了 @Controller 注解注解的类就可以担任控制器 (Action) 的职责,
所以我们并没有用到这个接口.
HandlerInterceptor 接口 -- 拦截器
无图, 我们自己实现这个接口, 来完成拦截的器的工作.
ViewResolver 接口的实现类
UrlBasedViewResolver 类 通过配置文件, 把一个视图名交给到一个 View 来处理
InternalResourceViewResolver 类, 比上面的类, 加入了 JSTL 的支持
View 接口
JstlView 类
LocalResolver 接口
HandlerExceptionResolver 接口 -- 异常处理
SimpleMappingExceptionResolver 实现类
ModelAndView 类
无图.
使用 Spring MVC
配置 DispatcherServlet
DispatcherServlet 是一个 Servlet, 所以可以配置多个 DispatcherServlet.
DispatcherServlet 是前置控制器, 配置在 web.xml 文件中的. 拦截匹配的请求, Servlet 拦截匹配规则要自已定义, 把拦截下来的请求, 依据某某规则分发到目标 Controller(我们写的 Action)来处理.
- web.xml:
- <servlet>
- <servlet-name>DispatcherServlet</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:springmvc-servlet.xml</param-value>
- </init-param>
- </servlet>
- <servlet-mapping>
- <servlet-name>DispatcherServlet</servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping>
这里主要有点需要注意:
(1)classpath:springmvc-servlet.xml 用于加载类路径下的 springmvc 配置文件, 文件名可以自定义. 如果不定义 < init-param > 标签则默认加载配置文件的路径是 WEB-INF 下.
- (2)
- <url-pattern>/</url-pattern > 表示所有请求都会被过滤.
- springmvc-servlet.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc.xsd">
- <!-- 默认的注解映射的支持 -->
- <mvc:annotation-driven />
- <!-- 静态资源加载 -->
- <mvc:resources location="/statics/" mapping="/statics/**" />
- <!-- 扫包 -->
- <context:component-scan base-package="cn.xxxx.controller"/>
- <!-- 视图解析器 -->
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/jsp/"/>
- <property name="suffix" value=".jsp"/>
- </bean>
- <!-- 全局异常处理 -->
- <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
- <property name="exceptionMappings">
- <props>
- <prop key="cn.xxxx.exception.LoginException">error</prop>
- </props>
- </property>
- </bean>
- </beans>
- <context:component-scan/> 扫描指定的包中的类上的注解, 常用的注解有:
@Controller 声明 Action 组件
@Service 声明 Service 组件 @Service("myMovieLister")
@Repository 声明 Dao 组件
@Component 泛指组件, 当不好归类时.
@RequestMapping("/menu") 请求映射
@Resource 用于注入,( j2ee 提供的 ) 默认按名称装配,@Resource(name="beanName")
@Autowired 用于注入,(srping 提供的) 默认按类型装配
@Transactional( rollbackFor={Exception.class}) 事务管理
@ResponseBody
@Scope("prototype") 设定 bean 的作用域
<mvc:annotation-driven /> 是一种简写形式, 完全可以手动配置替代这种简写形式, 简写形式可以让初学都快速应用默认配置方案.<mvc:annotation-driven /> 会自动注册 DefaultAnnotationHandlerMapping 与 AnnotationMethodHandlerAdapter 两个 bean, 是 spring MVC 为 @Controllers 分发请求所必须的.
并提供了: 数据绑定支持,@NumberFormatannotation 支持,@DateTimeFormat 支持,@Valid 支持, 读写 XML 的支持(JAXB), 读写 JSON 的支持(Jackson).
本文部分取自网络: http://elf8848.iteye.com/blog/875830
来源: https://www.cnblogs.com/xiaotie666/p/9347372.html