Spring MVC
导入依赖(pom.xml)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>untitled</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>untitled Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>untitled</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<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">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- context-param在所有的servlet中都能使用,init-param只能在当前的servlet中使用,如果不在当前的servlet中使用,取的值为null -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:bean.xml</param-value>
</init-param>
<!-- 加载顺序 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- /表示网站下的所有请求 springMVC不适用 /* -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 设置编码集 防止中文乱码 -->
<filter>
<filter-name>characterfilter</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>characterfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd ">
<!-- 如果遇到图片,html等静态资源,使用默认的处理器来处理,springMVC框架不过问这些东西 -->
<mvc:default-servlet-handler/>
<!-- 或 <mvc:resources mapping="/css/**" location="/css/"></mvc:resources>-->
<!-- <mvc:resources mapping="/images/**" location="/images/"></mvc:resources>-->
<!-- <mvc:resources mapping="/js/**" location="/js/"></mvc:resources>-->
<!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven/>
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.cyj"/>
<!-- 如果使用短视图名字(命名空间) 需要以下配置 跳转jsp页面-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/pages/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
请求
自定义类型转换器
自定义转换类
public class StringToDateConverter implements Converter<String, Date> {
/**
* 用于把 String 类型转成日期类型 */
@Override
public Date convert(String source) {
DateFormat format = null;
try {
if(StringUtils.isEmpty(source)) {
throw new NullPointerException("请输入要转换的日期");
}
format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse(source);
return date;
}catch (Exception e) {
throw new RuntimeException("输入日期有误");
}
}
}
在bean.xml中配置类型转换器
<!-- 配置类型转换器工厂 -->
<bean id="converterService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<!-- 给工厂注入一个新的类型转换器 -->
<property name="converters">
<array>
<!-- 配置自定义类型转换器 -->
<bean class="com.itheima.web.converter.StringToDateConverter"></bean>
</array>
</property>
</bean>
<!-- 引用自定义类型转换器 -->
<mvc:annotation-driven conversion-service="converterService"></mvc:annotation-driven>
常用注解
@RequestParam
https://www.cnblogs.com/tomingto/p/11377138.html
作用: 把请求中指定名称的参数给控制器中的形参赋值。
属性:
value:请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
@RequestBody
作用:
用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。
get 请求方式不适用。
属性:
required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值 为 false,get 请求得到是 null。
@PathVariable
https://blog.csdn.net/sswqzx/article/details/84194979
作用:
用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。
url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
属性:
value:用于指定 url 中占位符名称。
required:是否必须提供占位符。
@RequestHeader
作用: 用于获取请求消息头。
属性: value:提供消息头名称 required:是否必须有此消息头
注: 在实际开发中一般不怎么用。
@CookieValue
作用: 用于把指定 cookie 名称的值传入控制器方法参数。
属性: value:指定 cookie 的名称。 required:是否必须有此 cookie。
@ModelAttribute
https://blog.csdn.net/qq_41357573/article/details/84339866
- 该Controller类所有方法执行前,先调用此@ModelAttribute方法,可用于注解和方法参数中。
- @ModelAttribute注解用于将请求参数绑定到Model对象
@SessionAttribute
https://blog.csdn.net/abc997995674/article/details/80462450
在多个请求之间共用数据
响应
返回值类型
String型
直接return “success”;即可跳转页面
Void 无返回值
用转发或者重定向跳转页面
ModelAndView类型
ModelAndView mv = new ModelAndView();
mv.addObject(“username”, “张三”); 可以添加值到ModelAndView对象中:
mv.setViewName(“success”); 跳转页面
获取值
在页面上上获取使用的是 ${requestScope.属性名} 取的
转发和重定向(特殊方式)
转发:return “forward:/WEB-INF/pages/success.jsp”;
重定向:return “**redirect:**index.jsp”;
文件上传
导入依赖
<!-- https://mvnrepository.com/artifact/commons-fileupload.wso2/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
index.jsp
<form action="/fileUpload" method="post" enctype="multipart/form-data">
名称:<inputtype="text" name="picname"/><br/>
图片:<inputtype="file" name="uploadFile"/><br/>
<input type="submit"value="上传"/>
</form>
控制器(controller类)
@Controller("fileUploadController")
publicclassFileUploadController {
/*** 文件上传*/
@RequestMapping("/fileUpload")
public String testResponseJson(String picname,MultipartFile uploadFile,
HttpServletRequest request) throwsException{
//定义文件名
String fileName= "";
//1.获取原始文件名
String uploadFileName= uploadFile.getOriginalFilename();
//2.截取文件扩展名
String extendName=uploadFileName.substring(uploadFileName.lastIndexOf(".")+1,
uploadFileName.length());
//3.把文件加上随机数,防止文件重复
String uuid= UUID.randomUUID().toString().replace("-", "").toUpperCase();
//4.判断是否输入了文件名
if(!StringUtils.isEmpty(picname)) {
fileName= uuid+"_"+picname+"."+extendName;
}else{
fileName= uuid+"_"+uploadFileName;
}
System.out.println(fileName);
//2.获取文件路径
ServletContext context= request.getServletContext();
String basePath= context.getRealPath("/uploads");
//3.解决同一文件夹中文件过多问题
String datePath= newSimpleDateFormat("yyyy-MM-dd").format(newDate());
//4.判断路径是否存在
File file= newFile(basePath+"/"+datePath);
if(!file.exists()) {
file.mkdirs();
}
//5.使用MulitpartFile接口中方法,把上传的文件写到指定位置
uploadFile.transferTo(newFile(file,fileName));
return"success";
}
}
配置文件解析器
<!--配置文件上传解析器-->
<bean id="multipartResolver" <!--id的值是固定的-->
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--设置上传文件的最大尺寸为5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
异常处理(过滤器)
自定义异常类(SysException.java继承Exception)
package com.cyj.exception;
//千万要继承Exception类
public class SysException extends Exception{
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public SysException(String message) {
this.message = message;
}
}
controller类
package com.cyj.controller;
import com.cyj.exception.SysException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/exception")
public String exception() throws SysException {
System.out.println("异常执行了");
try {
int i = 10/0;
} catch (Exception e) {
e.printStackTrace();
//通过这里抛出指定异常
throw new SysException(e.getMessage());
}
return "success";
}
}
异常处理器(实现HandlerExceptionResolver类)
package com.cyj.exception;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//拦截异常,并做处理
//实现HandlerExceptionResolver类,重写resolveException方法
public class CustomExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, java.lang.Exception ex) {
ex.printStackTrace();
SysException e = null;
if (ex instanceof SysException){
e = (SysException) ex;
}else {
e = new SysException("请联系管理员");
}
ModelAndView mv = new ModelAndView();
//存入错误的提示信息
mv.addObject("message",e.getMessage());
//跳转页面
mv.setViewName("error");
return mv;
}
}
获取异常信息(error.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${message}
</body>
</html>
配置异常处理器
<bean id="CustomExceptionResolver" class="com.cyj.exception.CustomExceptionResolver"></bean>
拦截器
拦截器原理
自定义拦截器类(实现HandlerInterceptor接口)
/**
* 自定义拦截器1
* @author rt
*/
public class MyInterceptor1 implements HandlerInterceptor{
/**
* controller方法执行前,进行拦截的方法
* return true放行
* return false拦截
* 可以使用转发或者重定向直接跳转到指定的页面。
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler)throws Exception {
System.out.println("拦截器执行了...");
return true;
}
}
配置拦截器
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 哪些方法进行拦截 -->
<mvc:mapping path="/user/*"/>
<!-- 哪些方法不进行拦截
<mvc:exclude-mapping path=""/>
-->
<!-- 注册拦截器对象 -->
<bean class="MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
HandlerInterceptor接口中的方法
- preHandle方法是controller方法执行前拦截的方法
- 可以使用request或者response跳转到指定的页面
- return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
- return false不放行,不会执行controller中的方法。
- postHandle是controller方法执行后执行的方法,在JSP视图执行前。
- 可以使用request或者response跳转到指定的页面
- 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
- postHandle方法是在JSP执行后执行
- request或者response不能再跳转页面了
配置多个拦截器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6dlnZMN-1585744975666)(C:\Users\陈亚杰\Desktop\Spring MVC\拦截器.bmp)]
过滤器和拦截器的区别
过滤器是servlet规范中的一部分,任何java web工程都可以使用。
拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。
过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。
拦截器它是只会拦截访问的控制器方法,如果访问的是jsp,html,css,image或者js是不会进行拦截的。
jstl表达式循环遍历
<c:forEach items="${list}" var="account">
${account.toString()}
</c:forEach>
return false不放行,不会执行controller中的方法。
2. postHandle是controller方法执行后执行的方法,在JSP视图执行前。
- 可以使用request或者response跳转到指定的页面
- 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
- postHandle方法是在JSP执行后执行
- request或者response不能再跳转页面了
配置多个拦截器
[外链图片转存中…(img-L6dlnZMN-1585744975666)]
过滤器和拦截器的区别
过滤器是servlet规范中的一部分,任何java web工程都可以使用。
拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。
过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。
拦截器它是只会拦截访问的控制器方法,如果访问的是jsp,html,css,image或者js是不会进行拦截的。
jstl表达式循环遍历
<c:forEach items="${list}" var="account">
${account.toString()}
</c:forEach>