依赖:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.spring.webmvc</groupId>
<artifactId>spring_mvc</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>spring_mvc Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 文件上传依赖 -->
<!-- https://mvnrepository.com/artifact/commons-fileupload/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.6</version>
</dependency>
<!-- 服务端数据验证依赖 -->
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
<!--json依赖 -->
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.0</version>
</dependency>
</dependencies>
<!-- 配置定义版本插件 -->
<build>
<finalName>spring_mvc</finalName>
<plugins>
<!-- tomcat插件控制 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--端口控制-->
<port>8080</port>
<!--项目路径控制意味着http://localhost:8080/abc-->
<path>/</path>
<!--编码-->
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
<!-- 定义jdk版本插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
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: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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd ">
<!-- 配置扫描包 -->
<context:component-scan base-package="com.self.spring.controller"/>
<!-- 开启springMVC注解的支持,会自动管理加载处理器映射器 和处理器适配器 ;
conversion-service:开启自定义转换器-->
<mvc:annotation-driven conversion-service="formattingConversionServiceFactoryBean" validator="localValidatorFactoryBean"/>
<!-- 静态资源管理配置: 指定资源的映射处理 -->
<!-- <mvc:resources location="/img/" mapping="/img/**"/> -->
<!-- <mvc:resources location="/html/" mapping="/html/**"/> -->
<!-- 配置转换器,用于日期数据的接收 -->
<bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean"
id="formattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.self.spring.utils.DateConvert"/>
</set>
</property>
</bean>
<!-- 配置试图解析器 Internal:内部-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="suffix" value=".jsp"/>
<property name="prefix" value="/"/>
</bean>
<!--文件上传解析器 -->
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
id="multipartResolver">
<property name="maxUploadSize">
<value>52428800</value>
</property>
</bean>
<!-- 配置验证框架 -->
<bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" id="localValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<property name="validationMessageSource" ref="messageSource"/>
</bean>
<!-- 加载资源文件 -->
<bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
<property name="basenames" value="classpath:spring/validata"/>
<!-- <list>
<value>classpath:spring/validata</value>
</list>
</property> -->
<property name="fileEncodings" value="utf-8"/>
<property name="defaultEncoding" value="utf-8"/>
<property name="cacheSeconds" value="120"/>
</bean>
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.self.spring.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
</beans>
验证信息统一管理文件validata.properties:
empInfo.name.empty="用户账号不能为空"
empInfo.age.empty="用户年龄不能为空"
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>Archetype Created Web Application</display-name>
<!--
配置 字符过滤器 ; 需要注意的是配置的时候,每个 标签都得按照顺序来,要不是会报错无法通过
-->
<filter>
<filter-name>encodingFilter</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>
<init-param>
<!-- 响应编码方式开启 -->
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--必须 注册前端控制器 -->
<servlet>
<servlet-name>spring_mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 关联配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- <param-value>classpath:spring/spring-mvc.xml</param-value> -->
<param-value>classpath:spring/spring-mvc-annotation.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring_mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 静态资源的管理 映射-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
</web-app>
pojo:
package com.self.spring.pojo;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.Length;
import com.self.spring.group.Groups1;
import com.self.spring.group.Groups2;
public class EmpInfo {
@NotNull(message = "ID不能为空。。。",groups = {Groups2.class})
private Integer id;
@NotBlank(message = "{empInfo.name.empty}",groups = {Groups1.class})
@Length(message = "长度为3~6位",max = 6,min = 3)
private String name;
@NotNull(message = "{empInfo.age.empty}",groups = {Groups1.class})
@Max(message = "最大120",value = 120)
@Min(message = "最小不能小于0",value = 0)
private Integer age;
public EmpInfo() {
super();
}
public EmpInfo(@NotNull(message = "ID不能为空。。。", groups = Groups2.class) Integer id,
@NotBlank(message = "{empInfo.name.empty}", groups = Groups1.class) @Length(message = "长度为3~6位", max = 6, min = 3) String name,
@NotNull(message = "{empInfo.age.empty}", groups = Groups1.class) @Max(message = "最大120", value = 120) @Min(message = "最小不能小于0", value = 0) Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "EmpInfo [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
自定义拦截器:
package com.self.spring.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor{
/**自定义控制器执行之前执行的
*
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandle......");
return true;
}
/**自定义控制器执行之后执行的
* 在返回modelandview之前执行
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle......");
}
/**自定义控制器执行之后执行的
* 在返回modelandview之后执行,做一些回收操作
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion......");
}
}
contorller:
package com.self.spring.controller;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.self.spring.group.Groups1;
import com.self.spring.group.Groups2;
import com.self.spring.pojo.EmpInfo;
/** 数据验证框架的使用
*
* @ClassName:EmpInfoController
* @Description:TODO
* @author guanjun.zhou
* @data: 2021-1-418:39:38
*/
@RequestMapping(value = "/emp")
@Controller
@RestController
public class EmpInfoController {
/* 必须添加注解@Validated 和类BindingResult 才能起到作用
*
*/
@RequestMapping(value = "/add" ,method = RequestMethod.POST)
public String add(@Validated(Groups1.class) EmpInfo empInfo,BindingResult result,Model model) {
System.out.println("save.....");
List<ObjectError> allErrors=result.getAllErrors();
for (ObjectError error : allErrors) {
System.out.println(error.getDefaultMessage());
}
// System.out.println("-----------"+result.getFieldError());
return "index";
}
@RequestMapping(value = "/update" ,method = RequestMethod.POST)
public String update(@Validated(Groups2.class) EmpInfo empInfo,BindingResult result,Model model) {
System.out.println("update.....");
List<ObjectError> allErrors=result.getAllErrors();
for (ObjectError error : allErrors) {
System.out.println(error.getDefaultMessage());
}
return "index";
}
/** 响应json格式的List<EmpInfo>数据给前端
*
* @Title: query
* @Description: TODO(描述这个方法的作用)
* @param: @return
* @return: List<EmpInfo>
* @throws
*/
@RequestMapping(value = "/query")
@ResponseBody
public List<EmpInfo> query() {
System.out.println("query.....");
return Arrays.asList(new EmpInfo(1,"zhnagsan", 20),new EmpInfo(2,"wangba", 10),new EmpInfo(3,"qiuzi", 30));
}
/** 接收json格式的数据,自动装配在empInfo中
*
* @Title: save
* @Description: TODO(描述这个方法的作用)
* @param: @param empInfo
* @param: @return
* @return: String
* @throws
*/
@RequestMapping(value = "/save",method = RequestMethod.POST)
public String save(@RequestBody EmpInfo empInfo) {
System.out.println("query....."+empInfo);
return "index";
}
/** restful风格
*
* @Title: fun1
* @Description: TODO(描述这个方法的作用)
* @param: @param id
* @param: @param name
* @param: @return
* @return: String
* @throws
*/
@GetMapping("/fun1/{id}/{name}")
public ResponseEntity<List<EmpInfo>> fun1(@PathVariable Integer id,@PathVariable String name) {
System.out.println("query....."+id+"--"+name);
List<EmpInfo> empInfos=new ArrayList<>();
empInfos.add(new EmpInfo(1,"zhnagsan1", 20));
empInfos.add(new EmpInfo(2,"zhnagsan2", 20));
empInfos.add(new EmpInfo(3,"zhnagsan3", 20));
return new ResponseEntity<>(empInfos,HttpStatus.OK);
}
}
jsp:
<%-- isELIgnored 开启el表达式的支持 --%>
<%@ page contentType="text/html; charset=utf-8" language="java" isELIgnored="false" %>
<html>
<head>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
function fun1(){
var classpath=$(".classpath").val();
$.ajax({
type:"post",
url:classpath+"/emp/query",
contentType:"application/json",//以json的格式把数据提交到后台
data:JSON.stringify({"name":"zhangsan","password":"123456","age":12}),//如果后台接受json格式的数据必须要用stringify
dataType:"json",
success:function(data){
console.log(data);//查看接收到的数据类型
alert("success:"+data.length);
//遍历接收到的object数据
for(var i=0;i<data.length;i++){
alert("success:"+data[i].id+";"+data[i].name+";"+data[i].age);
}
},
error:function(data){
alert("error:"+data);
}
});
}
</script>
</head>
<body>
<h2>Hello World!</h2>
<input class="classpath" type="hidden" value="${pageContext.request.contextPath}"/>
<form action="${pageContext.request.contextPath}/emp/fun1" method="GET" ><br>
用户名:<input type="text" name="name"/><br>
年龄:<input type="text" name="age"/><br>
<input type="submit" value="提交"/>
${model}
</form>
<input type="button" value="提交json数据" onclick="fun1();"/>
</body>
</html>