# springMVC 介绍
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。 SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring3.0 的发布,全面超越 Struts2,成为最优秀的 MVC 框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持 RESTful 编程风格的请求。
# springMVC IDEA快速入门步骤
- 1.MAVEN和Tomcat安装环境配置(略)
- 2.新建MAVEN项目

- 3.pom文件添加依赖包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.0</version>
</dependency>
</dependencies>
- 4.配置web.xml的ContextLoaderListener
- 4.1 添加src/main/resources/applicationContext.xml spring容器文件
- 4.2 web.xml配置spring监听器使得启动tomcat自动加载applicationContext.xml文件
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <!--默认会自动加载 默认变量contextConfigLocation 中的classpath:applicationContext.xml --> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> - 5.配置web.xml的DispatcherServlet
- 5.1 web.xml配置DispatcherServlet,加载spring-mvc配置文件
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--加载springmvc配置文件-->
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--启动tomcat自启动-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- 5.2 添加src/main/resources/spring-mvc.xml 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: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="it.web.controller"/>
</beans>
6.配置tomcat

7.controller测试代码
# src/main/java/it/web/controller/indexController.java
@Controller
public class indexController {
@RequestMapping("/index")
@ResponseBody
public String index(){
System.out.println("index Controller running");
return "hello world";
}
}
# springMVC 获得ServletContext
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
ServletContext servletContext = webApplicationContext.getServletContext();
# springMVC 请求参数处理
- 请求参数和形参对应(如果请求参数和行参不一致则需要配合@RequestParam使用)
请求参数(GET): http://host/?name=zhangsan&age=12
POST: name=zhangsan&age=12
public String test(String name, int age){
System.out.println(name);
System.out.println(age);
return "";
}
当请求参数和函数行参不一致时需要配合@RequestParam使用:
@RequestMapping("/test3")
@ResponseBody
public String test3(@RequestParam(value = "name",defaultValue = "abc") String username){
System.out.println(username);
return username;
}
- 业务方法的POJO参数的属性名与请求参数的name一致(参数值会自动映射匹配,转换为java对象)
请求参数(GET): http://host/?username=zhangsan&age=12&sex=女
POST: username=zhangsan&age=12&sex=女
@RequestMapping("/userinfo")
@ResponseBody
public String getUSerinfo(Userinfo userinfo){
System.out.println(userinfo);
return "abbbbb";
}
- 接受json格式数据(需pom.xml添加jackson依赖,并且配@RequestBody,参数会自动转换为对应的对象形式,List/Map都支持)
请求数据:[{
"name": "zhangsan",
"sex": "男",
"age": 11,
"id": 1
}, ......
]
@RequestMapping("/index")
@ResponseBody
public String getUsers(@RequestBody List<Userinfo> userinfos){
System.out.println(userinfos);
return "abc";
}
- 获取请求头
@RequestMapping("/index")
@ResponseBody
public String getHeader(@RequestHeader(name = "User-Agent") String header){
System.out.println(header);
return header;
}
# 配置全局乱码过滤器(应用)
当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。
<!--配置全局过滤的filter-->
<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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
# springMVC 响应数据
页面跳转
回写字符串
目前都是前后端分离的web架构,这里的跳转意义不大,暂时不详细归纳总结
回显普通字符串
@RequestMapping("/returnStr") //url注解
@ResponseBody //表示响应字符串回显而不是跳转
public String returnString(){
return "hello springMVC"; //这里的return表示回显字符串信息
}
回显JSON字符串
1.pom.xml添加jackson的坐标(jackson-core/jackson-databind/jackson-annotations)
2.springmvc.xml中配置jackson处理响应数据
<mvc:annotation-driven/>//需额外配置mvc的:xmlns:mvc="http://www.springframework.org/schema/mvc" ......3.测试
@RequestMapping("/pojo")
@ResponseBody
public Userinfo test2(){
ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();
WebApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(servletContext);
UserinfoDaoImpl bean = app.getBean(UserinfoDaoImpl.class);
Userinfo userinfoOne = bean.getUserinfoOne(1);
return userinfoOne; //直接返回对象即可,列表,数组都可。
}
# springMVC 拦截器
这里以登陆拦截作为演示
①创建拦截器类实现HandlerInterceptor接口
public class interceptorFirst implements HandlerInterceptor {
// preHandle方法是在controller方法执行之前被调用,return true表示往下执行控制器,return false表示拦截不往下执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object user = session.getAttribute("username");
if (user==null){ //未登陆成功
response.sendError(403,"当前未登陆请先完成登陆后操作");
return false;
}else{
return true;
}
}
//在响应视图前执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
//响应数据之后被执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
拦截器中的方法执行顺序是:preHandler-------目标资源----postHandle---- afterCompletion
②配置拦截器(spring-mvc.xml)
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/> //拦截所有的路径,/** 固定写法2个*
<mvc:exclude-mapping path="/login/index"/> //判处拦截的urlpath
<bean class="it.webapp.interceptor.interceptorFirst"/> //拦截器类路径
</mvc:interceptor>
</mvc:interceptors>
③测试拦截器的拦截效果(略)
# springMVC 异常处理
# springMVC 文件上传
步骤
1.导入pom.xml依赖坐标(commons-io/commons-fileupload)
2.配置spring-mvc.xml的multipartResolver上传文件属性控制
<!-- id是固定值,不能修改 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
</bean>
3.上传controller代码
@RequestMapping("/index")
@ResponseBody
public String FileUpload(MultipartFile file) throws IOException {
String originalFilename = file.getOriginalFilename(); //获取文件名称
file.transferTo(new File("/Users/jeffery.yu/Desktop/"+originalFilename)); //将文件保存到指定位置
return "上传成功!";
}