目录
1. 前言
springMVC就是类似于Struts2的mvc框架,属于SpringFrameWork的后续产品
1.1 SpringMVC与struts2比较
对比项目 | SrpingMVC | Struts2 | 优势 |
---|---|---|---|
国内市场情况 | 有大量用户,一般新项目启动都会选用springmvc | 有部分老用户,老项目组,由于习惯了,一直在使用。 | 国内情况,springmvc的使用率已经超过Struts2 |
框架入口 | 基于servlet | 基于filter | 本质上没太大优势之分,只是配置方式不一样 |
框架设计思想 | 控制器基于方法级别的拦截,处理器设计为单实例 | 控制器基于类级别的拦截, 处理器设计为多实例 | 由于设计本身原因,造成了Struts2,通常来讲只能设计为多实例模式,相比于springmvc设计为单实例模式,Struts2会消耗更多的服务器内存。 |
参数传递 | 参数通过方法入参传递 | 参数通过类的成员变量传递 | Struts2通过成员变量传递参数,导致了参数线程不安全,有可能引发并发的问题。 |
与spring整合 | 与spring同一家公司,可以与spring无缝整合 | 需要整合包 | Springmvc可以更轻松与spring整合 |
1.2 hello world
1.2.1 控制层
新建一个普通的java类,加上注解
@Controller
public class HelloMvc {
@RequestMapping("/hello")
public ModelAndView helloMvc(){
System.out.println("hello mcv");
ModelAndView mv = new ModelAndView();
// 设置模型数据,用于传递到jsp
mv.addObject("msg", "hello mvc");
// 设置视图名称
mv.setViewName("/WEB-INF/jsp/hello.jsp");
return mv;
}
}
注意:
1. ModelAndView为MVC提供的一个模型视图器,可以用于设置模型数据与视图名称
2. 控制层只需要将ModelAndView对象返回即可
2.1.2 SpringMVC配置文件
springmvc.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 配置controller扫描包 -->
<context:component-scan base-package="com.bjc.mvc.controller" />
</beans>
2.1.3 web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<!-- 配置核心控制器 -->
<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.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern> <!--会拦截URL中带“/”的请求。-->
</servlet-mapping>
</web-app>
2.1.4 访问
http://localhost:8080/01-SpringMVC/hello.action 即可访问
注意:因为web.xml中配置的url-pattern为*.action,所以,hello后缀名必须为.action才行
1.3 hello程序的执行顺序
1. 输入url地址http://localhost:8080/01-SpringMVC/hello.action 发送请求
2. 请求到web.xml中查找*.action的拦截配置<servlet-mapping> ,找到对应的<servlet-name>
3. 根据<servlet-name>找到处理器<servlet>下的核心控制器DispatcherServlet
4. 然后在核心控制下找到初始化的参数配置<init-param>,将springmvc.xml配置文件加载
5. 加载springmvc.xml配置文件,发现其配置了一个包扫描器
6. 扫描对应包下的注解,得到controller
7. 根据请求连接找到@RequestMapping绑定的请求路径,执行逻辑代码。
8. 执行完成,返回模型视图ModelAndView
2. springmvc架构
2.1 框架默认加载组件
我们没有做任何配置,就可以使用SpringMVC,是因为框架已经为我们默认配置并加载了SpringMVC的组件了。
SpringMVC默认加载/org/springframework/web/servlet/DispatcherServlet.properties
处理器映射器:
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
处理器适配器:
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
视图解析器:
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
2.2 框架执行流程
1. 用户发送url请求
2. 请求交给前端控制器DispatcherServlet
3. DispatcherServlet收到请求调用处理器映射器HandlerMapping
4. HandlerMapping根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
5. DispatcherServlet通过处理器适配器HandlerAdapter调用处理器,执行处理器(Controller,也叫作后端处理器)
6. Controller执行完成返回视图解析器ModelAndView
7. HandlerAdapter将处理器COntroller执行结果ModelAndView返回给DispatcherServlet
8. DispatcherServlet在将ModelAndView传给视图解析器ViewResolver
9. ViewResolver解析后返回具体的View对象
10. 然后DispatcherServlet对View进行渲染视图(即将模型数据填充到视图中)
10.最后DispatcherServlet将渲染好的视图响应给用户。
图解:
3 springmvc的常用组件说明
SpringMVC有三大组件:处理器映射器、处理器适配器、视图解析器。
3.1 前端控制器DispatcherServlet
用户请求到达前端控制器,它就相当于MVC模式中的C,DispatcherServlet是整个流程控制的中心,由它调用其他组件处理用户的请求,DispatcherServlet的存在降低了组件间的耦合性。
3.2 处理器映射器HandlerMapping
3.2.1 介绍
HandlerMapping负责根据用户请求url找到Handler处理器,springmvc提供了不同的映射器实现不同的映射方式。例如:配置文件方式、接口实现方式、注解方式等。
3.2.2 配置方式
我们可以通过配置bean的方式来配置HandlerMapping
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>
3.3 处理器Handler
Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理,由于Handler涉及具体的用户业务请求,所以一般情况下需要程序员根据业务需求开发Handler也即Controller层
3.4 处理器适配器HandlerAdapter
3.4.1 介绍
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。即处理器适配器可以实例化Controller并调用对应的方法。
3.4.2 配置
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean>
3.5 视图解析器ViewResolver
ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成view视图对象,最后对view进行渲染将处理结果通过页面展示给用户。
3.6 视图View
SpringMVC提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们通常用的视图就是jsp。
一般情况下,需要通过页面标签或页面模板技术将模型数据通过页面展示给用户,需要我们根据业务需求开发具体的页面。
注意:
1. 在springMVC中的各个组件,处理器映射器、处理器适配器、视图解析器称之为SpringMVC的三大组件
2. 需要我们自己开发的组件有Handler、view
3. 处理器映射器与处理器适配器是成套使用的。
4. 组件扫描器
使用组件扫描器省去了在spring容器配置每个Controller类的繁琐,使用
<context:component-scan base-package="com.bjc.mvc.controller" />
自动扫描标记@Controller的控制器类。
注意:多个包之间用逗号“ , ”分隔。
5. 注解驱动
直接配置处理器映射器和处理器适配器比较麻烦,可以使用注解驱动来加载。SpringMVC中使用<mvc:annotation-driven />自动加载RequestMappingHandlerMapping和RequestMappingAdapter。配置注解驱动相当于同时使用最新的处理器映射器与处理器适配器,同时注解驱动对json数据响应提供支持。
可以在SpringMVC.xml配置文件中使用<mvc:annotation-driven />来代替注解处理器和适配器的配置
<mvc:annotation-driven />
6. 视图解析器
在默认配置中有视图解析器的配置
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
打开org.springframework.web.servlet.view.InternalResourceViewResolver类,通过其父类,我们发现其父类有一些比较有意思的属性,比方说prefix(前缀),suffix(后缀),由此我们可以得到视图解析器的配置
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
7. SpringMVC的web.xml的配置
7.1 配置核心过滤器
<!-- 配置核心控制器 -->
<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.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern> <!--会拦截URL中带“/”的请求。-->
</servlet-mapping>
7.2 字符串编码配置
<!-- 解决post请求乱码 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 设置编码为UTF-8 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>