文章目录
1. SpringMVC概述
- 一种轻量级的、基于MVC的Web层应用框架。偏前端而不是基于业务逻辑层,Spring框架的一个后续产品。是目前最主流的MVC 框架之一
- SpringMVC 3.0 后全面超越 Struts2,成为最优秀的 MVC 框架。
- Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任何接口。
- 支持 REST 风格的 URL 请求。 Restful
- 采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。
1.1 SpringMVC应用范围
-
天生与Spring框架集成,如:(IOC,AOP)
- 进行更简洁的Web层开发
- 支持灵活的URL到
页面控制器的映射
- 非常容易与其他视图技术集成,如:Velocity、FreeMarker等等
-
因为模型数据不存放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用)
-
非常灵活的数据验证、格式化和数据绑定机制、能使用任何对象进行数据绑定,不必实现特定框架的API
- 更加简单、强大的异常处理
- 对静态资源的支持
- 支持灵活的本地化、主题等解析。
1.2 SpringMVC的使用
- 将Web层进行了职责解耦,
基于请求-响应模型
- 常用主要组件
- ①
DispatcherServlet
:前端控制器(核心控制器)- ②
Controller
:处理器 /页面控制器,做的是MVC中的C的事情,但控制逻辑转移到前端控制器了,用于对请求进行处理- ③
HandlerMapping
:请求映射到处理器,找谁来处理,如果映射成功返回一个HandlerExecutionChain对象
(包含一个Handler处理器(页面控制器)
对象、多个HandlerInterceptor拦截器对象
)- ④
View Resolver
: 视图解析器,找谁来处理返回的页面。把逻辑视图解析为具体的View,进行这种策略模式,很容易更换其他视图技术;
- 如
InternalResourceViewResolver
将逻辑视图名映射为JSP视图- ⑤ LocalResolver:本地化、国际化
- ⑥ MultipartResolver:文件上传解析器
- ⑦ HandlerExceptionResolver:异常处理器
1.3 SpringMVC需要的环境
需要的jar包:
- spring-aop-4.0.0.RELEASE.jar
- spring-beans-4.0.0.RELEASE.jar
- spring-context-4.0.0.RELEASE.jar
- spring-core-4.0.0.RELEASE.jar
- spring-expression-4.0.0.RELEASE.jar
- commons-logging-1.1.3.jar
- spring-web-4.0.0.RELEASE.jar
- spring-webmvc-4.0.0.RELEASE.jar
1.4 SpringMVC流程
第一步:引入依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<target>1.8</target>
<source>1.8</source>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
第二步: 添加web.xml
在web.xml中配置 DispatcherServlet (
前端控制器--SpringMVC核心控制器
) ,加载配置文件springMVC.xml
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--
请求方式的过滤器
restful请求方式,因为form表单无法提交put,delete的请求方式
使用post模拟put和delete请求
-->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置SpringMVC核心控制器:前端控制器 -->
<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>
<!--
load-on-startup : 如果不配置,默认情况加是第一次访问的时候,创建当前的servlet对象
load-on-startup :1 越小越先加载。
在tomcat容器启动的时候加载当前的DispatcherServlet对象。
-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--
/* 匹配所有的请求
*.do 匹配所有以 .do 结尾的请求
/user/add 全匹配
/ 类似与 /* 但是不拦截 .jsp结尾的文件
-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
第三步:添加SpringMVC.xml
加入 SpringMVC 的配置文件:springmvc.xml (读取要扫描的包 和
配置视图解析器InternalResourceViewResolver
)会做如下的解析:
- 通过
prefix + returnValue + suffix
这样的方式得到实际的物理视图, 然后做转发操作.
/WEB-INF/views/success.jsp
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描的包-->
<context:component-scan base-package="cn.justweb"></context:component-scan>
<!-- 配置映射解析器InternalResourceViewResolver :如何将控制器返回的结果字符串,转换为一个物理的视图文件-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
第四步:创建入口页面index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
<h1>首页</h1>
<form action="/users/justweb" method="get">
<input type="submit" value="get请求">
</form>
<form action="/users/justweb" method="post">
<input type="submit" value="post请求">
</form>
<%-- 默认get请求 find --%>
<form action="/users/justweb" method="post">
<input type="hidden" value="put" name="_method">
<input type="submit" value="put请求">
</form>
<form action="/users/justweb" method="post">
<input type="hidden" value="delete" name="_method">
<input type="submit" value="delete请求">
</form>
</body>
</html>
第五步:业务控制器
/**
* @RequestMapping写到类上面,
* 那么它的路径是所有方法的前置路径
* */
@Controller
@RequestMapping("/user")
public class HelloWorldController {
@RequestMapping(value = "/justweb" )
public String hello(){
return "success";
}
}
第六步:成功的页面
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>跳转成功</title>
</head>
<body>
<h1>访问成功</h1>
</body>
</html>
1.5 具体步骤
-
客户端点击链接发送http://localhost:8080/users/justweb
-
来到tomcat服务器
-
Springmvc的DispatcherServlet (前端控制器)收到所有的请求。
-
由DispatcherServlet 前端控制器查询一个或多个HandlerMapping,找到处理请求的Controller
-
DispatcherServlet将请求提交到 Controller(也称为Handler)
-
Controller调用业务逻辑处理后,返回ModelAndView
-
DispatcherServlet查询一个或多个ViewResoler视图解析器(
InternalResourceViewResolver
根据方法的返回值以后,进行拼接得到完整的页面地址),找到ModelAndView指定的视图。 -
视图负责将结果显示到客户端。