@File
2019-12-09T01:25:52.000000Z
字数 9774
阅读 154
java
<!-- spring-mvc集成包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!-- fastjson包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
<!-- 跨域请求 -->
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>1.3.2</version>
</dependency>
<?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 https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--开启springmvc 的注解-->
<context:component-scan base-package="com.lidaye.ssm"/>
<!-- 设置配置方案 -->
<mvc:annotation-driven>
<!-- 消息转化器 -->
<mvc:message-converters register-defaults="false">
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<!-- 加入支持的媒体类型:返回contentType -->
<property name="supportedMediaTypes">
<list>
<!-- 这里顺序不能反,一定先写text/html,不然IE下会出现下载提示 -->
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
<property name="fastJsonConfig">
<bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
<property name="features">
<list>
<value>AllowArbitraryCommas</value>
<value>AllowUnQuotedFieldNames</value>
<value>DisableCircularReferenceDetect</value>
</list>
</property>
<!--配置特定的日期格式-->
<property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
</beans>
<bean id="mappingJacksonHttpMessageConverter"class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<mvc:default-servlet-handler/>
<!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="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<display-name>Archetype Created Web Application</display-name>
<!-- 网上解释:自动装配ApplicationContext.xml的配置信息(暂时不理解) -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 加载spring 相关配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*</param-value>
</context-param>
<!-- 配置 DispatcherServlet -->
<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:spring-mvc.xml</param-value>
</init-param>
<!-- 启动顺序 值越小优先级越高 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置映射 -->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 编码过滤 -->
<filter>
<filter-name>encoding</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>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置首页 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
<init-param>
<param-name>cors.allowOrigin</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.supportedMethods</param-name>
<param-value>GET, POST, HEAD, PUT, DELETE</param-value>
</init-param>
<init-param>
<param-name>cors.supportedHeaders</param-name>
<param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value>
</init-param>
<init-param>
<param-name>cors.exposedHeaders</param-name>
<param-value>Set-Cookie</param-value>
</init-param>
<init-param>
<param-name>cors.supportsCredentials</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
@RestController
注册数据接口类
// 方法一
@RestController
public class HelloController{}
// 方法二
@Controller
@ResponseBody
public class HelloController{}
@RequestMapping
限制请求信息name: 指定映射器名称
value: 指定映射地址
method: 请求类型
params: 请求参数
headers: 头部参数
consumes: 接收的内容格式:Content-type
produces: 响应的内容格式:Content-type
@RestController
public class HelloController {
// 定义请求信息
@RequestMapping("/lidaye")
public String lidaye(){
return "hello";
}
}
@GetMapping
get 请求(简化@RequestMapping)@PostMapping
post 请求(简化@RequestMapping)@PutMapping
put 请求(简化@RequestMapping)@DeleteMapping
delete请求(简化@RequestMapping)@ModelAttribute
所有请求接收前执行的方法value: 定义一个参数,值为返回值
binding: 数据绑定,默认true
// 定义一个预执行方法,并声明一个name参数
@ModelAttribute("name")
public String lidaye(){
return "李大爷";
}
// 接收请求方法通过 @ModelAttribute 获取name参数
@GetMapping
public String getMethod(@ModelAttribute("name") String name){}
@PathVariable
动态路由{}
定义 value: 指定参数名,默认是当前修饰的参数名
required: 参数是否必须存在,默认true(必须存在)
@RestController
public class HelloController {
// 定义请求信息
@RequestMapping("/hellow/{type}/{page}")
public String hello(@PathVariable String type,@PathVariable int page){
return "hello";
}
}
@RequestParam
声明参数value: 参数名
required: 参数是否必须存在,默认true(必须存在)
defaultValue: 参数默认值
@RestController
public class HelloController {
@GetMapping("/lidaye")
public String hello(@RequestParam("user_name") String name){
return name;
}
}
@SessionAttribute
获取session中的数据value: session中的key
required: 参数是否必须存在,默认true(必须存在)
@CookieValue
获取cookie中的数据value: cookie中的key
required: 参数是否必须存在,默认true(必须存在)
defaultValue: 默认值
@RestController
public class HelloController {
@GetMapping("/lidaye")
public String hello(Lidaye ldy){
return ldy;
}
}
@ResponseBody
方法/类声明为响应接口
// 不使用 @RestController 注册
@Controller
public class HelloController {
// 声明为响应接口
@ResponseBody
@GetMapping("/lidaye")
public String hello(){
return "hello";
}
}
@RequestBody
获取完整请求体的内容
@RestController
public class HelloController {
@PostMapping("/lidaye")
// required 默认为true 必须有内容
public String hello(@RequestBody(required = false) String body){
return body;
}
}
@ModelAndView
@RestControllerAdvice
统一响应处理ResponseBodyAdvice
value:
basePackageClasses:
assignableTypes:
annotations:
@RestControllerAdvice
public class ControllerResult implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter methodParameter, Class aClass) {
// methodParameter: 方法对象
// aClass: http信息转换器类(默认jackson)
// 返回 true 才会执行 beforeBodyWrite()
return !methodParameter.getMethod().getReturnType().equals(Void.TYPE);
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
// o: 返回值
// methodParameter: 方法对象
// mediaType: mediaType 媒体类型(json等...)
// aClass: http信息转换器类(默认jackson)
// serverHttpRequest: 请求对象
// serverHttpResponse: 响应对象
// 最终响应内容
return null;
}
}
@ExceptionHandler
全局异常捕获@RestControllerAdvice
内value: 错误类(数组)
@ExceptionHandler(Exception.class)
public Result baseException(){
return
}
@DateTimeFormat
修改日期格式
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date date;
@JSONField
属性序列化设置ordinal: 序列化的顺序
name: json中的参数名
format: 日期格式
serialize: 是否要序列化,默认true
deserialize: 是否解析,默认true
serialzeFeatures:
parseFeatures:
label:
jsonDirect: 默认false
serializeUsing:
deserializeUsing:
alternateNames:
unwrapped: 默认false
@JSONField(ordinal = 2) // 修改顺序
@JSONField(name = "user_id") // 修改序列化后的键名
private Integer id;
@JSONField(ordinal = 1)
private String name;
/**
* 结果:{"name":"xxx","user_id":1}
*/
@JsonProperty
熟悉序列化设置
value: json中的参数名
required:
index:
defaultValue:
access:
@JsonProperty("isShow") // 设置序列化参数名
private boolean show; // 不要把 boolean 类型字段名命名为 is 前缀
redirect:
重定向@ResponseBody
等...)
@Controller
public class ModelViewController {
@RequestMapping("/redirect")
public String redirect() {
// 站内重定向
return "redirect:/model";
// 站内重定向带参数
// return "redirect:/user/change/?uid=1"
// 站外重定向
// return "redirect:https://www.baidu.com";
// 站外重定向带参数 后面用户名
// return "redirect:https://api.github.com/users/zhangwei725"
// 站外重定向带参数2
// return "https://api.github.com/users/zhangwei725/repos?page=1&per_page=10"
}
}
forward:
转发@ResponseBody
等...)
@Controller
public class ModelViewController {
@RequestMapping("/forward")
public String testForward(Model model) {
model.addAttribute("key", "转发");
return "forward:index";
}
}
HandlerInterceptor
接口
<mvc:interceptors >
<mvc:interceptor>
<interceptor下面定义的mapping和exclude-mapping都是可以有多个的>
<!-- /user/* -->
<mvc:mapping path="/admin/**" />
<mvc:exclude-mapping path="/account/login" /><!-- 不拦截 -->
<bean class="com.vip.mvc.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>