Spring MVC框架
是一个遵守 MVC设计模式的框架。
MVC, Model, View, Control 三者的简称,其中,Model指的数据层【DAO+entity】, View指的是视图【html/css/js, JSP, Thymeleaf, Velocity, FreeMarker】,Control 指的是控制层【Servlet】.
mvc 的框架有很多,比较有名的有:
- Struts1.x
- Struts2.x -- 以前很流行
- Spring MVC -- 现在很流行, 得益于SPRING框架的技术生态
- ...
Spring MVC是一款非常优秀的MVC框架,它提供如下功能:
- 有一个非常强大的前置控制器,本质上是一个 Servlet
- 有强大的配置能力,包含请求到控制器的映射
- 提供了很多辅助性的功能,比如:
- 模型和视图 的封装
- Bean Validation
- 文件上传和下载
- 对json的支持
- 自动封装请求参数,并转换成你想的任何对象,直接以参数传递进来。
- 提供编码过滤器
Spring MVC框架的搭建
- 准备一个基于maven的web项目结构
- 加入SpringMVC 相关的依赖【spring-webmvc】
- 在
web.xml
中添加 SpringMVC的配置 - 如果采用注解配置的话,需要添加一个 WebMvcConfig.java
- 添加控制器,写一个JAVA类,打上
@Controller
注解,并且在方法上面添加@RequestMapping
- 默认情况下,控制器方法的返回值被会SPRING MVC解析成 jsp 的名字,如果添加了
@ResponseBody
的话,则SPRING MVC框架会把方法的返回值当做响应体的内容,响应给客户端。
Spring MVC 的前置控制器 [DispatcherServlet]
这个前置控制器,我们叫做大C,而我们自己开发的控制器叫小 C。
这个类中所做的事情况非常复杂,后面随着学习的深入再来慢慢理解。
大C 的匹配模式
-
扩展名匹配
在
web.xml
中 的, 使用 *.xxx 做为匹配的规则,它的优点是 静态资源不会被大C拦截,缺点是不支持· RESTFUL
的URL风格 -
通配
在
web.xml
中 的, 使用 / 做为匹配的规则,它的优点是完全支持 RESTFUL
的URL风格,缺点是会拦截一些静态的资源。所以,我们要把这些静态资源注册到静态资源的处理器中。注:
默认情况,所有的.jsp 文件是不会被 大C拦截的。
添加静态资源的处理器
1.容器层面的处理方式
通过容器自带的默认Servlet,来处理这些静态资源,如下:
<!-- 由容器提供的一个默认Servlet,请求过来后,先经过这个Servlet 注:不同的容器,这个默认的名字是不一样的。 --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping>
2. Spring MVC框架的处理方式
-
2.1 通过XML的配置来解决
<mvc:default-servlet-handler/>
-
2.2 通过XML的配置来解决,但不是利用 容器自带的默认Servlet来处理,而是基于spring mvc提供的功能。
<!-- 以下的配置是基于SpringMVC内置的静态资源处理器 mapping是映射的请求uri location是静态资源真正的位置 --> <mvc:resources mapping="/css/**" location="/css/"/> <mvc:resources mapping="/images/**" location="/images/"/> <mvc:resources mapping="/js/**" location="/js/"/> <!-- 当然,我们可以把这些静态资源放在一个叫 static 的目录下,然后,只需要映射这一个目录即可 -->
-
2.3 在配置中,重写父类的
addResourceHandlers
方法,并指定静态资源请求和映射位置,如下:@Configuration //这是一个配置类 @ComponentScan({"com.hcedu.springmvc.controller"}) //指定扫描的包及其子包 @EnableWebMvc //启动WEB MVC 功能 (和 AOP, DT 一样,默认都是禁用的) public class WebMvcConfig extends WebMvcConfigurerAdapter { //继承WebMvc配置适配器类 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { //添加静态资源的映射 registry.addResourceHandler("/static/**") .addResourceLocations("/static/"); } }