1、Spring MVC 简介
什么是Spring MVC?
- MVC框架,它解决WEB开发中常见的问题(参数接收、页面跳转 、文件上传、表单验证、国际化、等等),而且使用简单,与Spring无缝集成。(替代servlet层)
- Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架 (更安全,性能更好,更简单)。
- 支持 RESTful风格的 URL 请求 。
- 采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。
MVC模型:是一种架构型的模式,本身不引入新功能,只是帮助我们将开发的结构组织的更加合理,使展示与模型分离、流程控制逻辑、业务逻辑调用与展示逻辑分离------>责任分离。
2、Spring MVC 执行流程
2.1 SpringMVC流程:
01、用户发送出请求到前端控制器DispatcherServlet。
02、DispatcherServlet收到请求调用HandlerMapping(处理器映射器)。
03、HandlerMapping找到具体的控制器(可查找xml配置或注解配置),生成处理器对象的执行链(如果有),再一起返回给DispatcherServlet。
04、DispatcherServlet调用HandlerAdapter(处理器适配器)。
05、HandlerAdapter经过适配调用具体的处理器(controller)。
06、Controller执行完成返回ModelAndView对象。
07、HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
08、DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)。
09、ViewReslover解析后返回具体View(视图)。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。
2.2 涉及组件分析:(1、4、6)
1、前端控制器DispatcherServlet(需要配置),由框架提供,在web.xml中配置。
作用:接收请求,响应结果,相当于转发器,中央处理器。
2、处理器映射器HandlerMapping(不需要程序员开发),由框架提供。
作用:根据请求的url查找Handler(处理器/Controller),可以通过XML和注解方式来映射。
3、处理器适配器HandlerAdapter(不需要程序员开发),由框架提供。
作用:按照特定规则(HandlerAdapter要求的规则)去执行Controller。
4、控制器Controller(需要工程师开发---->Handler处理器)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler。
作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器。
5、视图解析器ViewResolver(不需要程序员开发),由框架提供
作用:进行视图解析,把逻辑视图名解析成真正的物理视图。
SpringMVC框架支持多种View视图技术,包括:jstlView、freemarkerView、pdfView等。
6、视图View(需要工程师开发)
作用:把数据展现给用户的页面
View是一个接口,实现类支持不同的View技术(jsp、freemarker、pdf等)
3、Spring MVC 基础配置—>xml实现
3.1 添加依赖
- 添加Spring的核心包
spring-core-x.x.x.RELEASE.jar
spring-beans-x.x.x.RELEASE.jar
spring-context-x.x.x.RELEASE.jar (导入此依赖,其他依赖会自动导入)
spring-expression-x.x.x.RELEASE.jar
spring-aop-x.x.x.RELEASE.jar - 添加SpringMVC的核心包
spring-web-x.x.x.RELEASE.jar spring 对web项目的支持
spring-webmvc-x.x.x.RELEASE.jar spring mvc核心包。 - 添加jstl核心包、servlet-api包
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
<!--spring依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${project.spring.version}</version>
</dependency>
<!--SpringMVC依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${project.spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${project.spring.version}</version>
</dependency>
<!--Spring MVC底层是基于servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp页面需要用到jstl标签库-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--Json依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
3.2 配置前端控制器:DispatcherServlet
Front Controller模式要求在WEB应用系统的前端(Front)设置一个入口控制器(Controller),所有的request请求都被发往该控制器统一处理,处理所有请求共同的操作。MVC框架: 都得先配置前端控制器.
(1)在web.xml配置文件中配置前端控制器(及编码过滤器);
(2)关联springMVC的配置文件SpringMVC.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!--web.xml中配置SpringMVC的前端控制器,拦截所有请求-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联springMVC的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringMVC.xml</param-value>
</init-param>
<!--tomcat服务器启动时,完成控制器初始化,正整数即可-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--配置前端控制器的映射文件-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--/代表拦截所有静态资源页面,可在mvc.xml中配置放行所有静态资源(SpringMVC无法处理静态页面),
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--web.xml中配置SpringMVC的编码过滤器 -->
<filter>
<filter-name>characterEncodingFilter</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>
<!--设置request、response作用域强制使用此编码格式-->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!--配置过滤器映射文件-->
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
3.3 开发和配置控制器(Handler处理器):
在SpringMVC配置文件中,配置控制器;当浏览器输入http://localhost:8080/test01时,就会执行TestContro01类
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置控制器-->
<bean name="/test01" class="com.project.SpringMVC01.controller_xml.TestContro01"/>
<!--放行静态资源页面-->
<mvc:default-servlet-handler/>
<!--配置视图解析器,页面路径过于复杂,配置前缀和后缀-->
<!--<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/******"/>
<property name="suffix" value=".jsp"/>
</bean>-->
</beans>
3.4 创建Contro类
创建一个Controller类TestContro01,用于处理浏览器请求。
4、Spring MVC 基础配置—>注解实现
4.1 修改SpringMVC配置文件
需要配置IoC注解解析器 和 SPringMVC注解解析器
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- =========================注解方式=================================== -->
<!-- 配置IoC注解解析器 -->
<context:component-scan base-package="com.project.SpringMVC01"/>
<!--配置SPringMVC注解解析器-->
<mvc:annotation-driven/>
<!--配置视图解析器,页面路径过于复杂,配置前缀和后缀-->
<!--<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/******"/>
<property name="suffix" value=".jsp"/>
</bean>-->
<!--放行静态资源页面-->
<mvc:default-servlet-handler/>
</beans>
4.2 修改Contro类
@Controller //IoC注解
@RequestMapping("/test") //mvc注解,在类上加注解是为了防止多个类命名冲突,访问方式为http:localhost:8080/test/run
public class TestContro02 {
//@RequestMapping(value = "/test/run",method = RequestMethod.POST) 可以指定请求方式
@RequestMapping("/run") //设置Controller方法的访问URL,不能重名.
public ModelAndView run(){
ModelAndView mv = new ModelAndView();
/*设置数据*/
mv.addObject("info","天王");
/*跳转页面*/
mv.setViewName("/index.jsp");
/*必须返回modelandview对象*/
return mv;
}
}
1.使用注解开发SpringMVC必须首先要配置mvc的注解解析器和IoC的注解解析器
2.@RequestMapping注解用于指定对应的url请求路径,value的值表示路径,路径通常以"/“开头,”/“可以省略.
3.@RequestMapping可以标注在类中,用于窄化请求映射.此时访问资源的路径为:”/类的路径/方法的路径"
4.@RequestMapping可以添加method属性,用于限定请求请求后台资源的方法.