目录
1.SpringMVC简介
1.1 入门案例
1.2.bean的加载控制
2.请求与响应
2.1请求映射路径
2.2 接收数据
2.2.1 get 和 post请求发送普通参数
2.2.2 实体类接收参数
2.2.3 数组和集合接收
2.2.4 接收前端的json的数据(集合,pojo)
2.2.5 处理日期
2.3 响应
2.3.1 响应页面
2.3.2 响应JSON
3.REST风格
3.1REST简介
3.2 放行静态资源
4.拦截器
4.1 拦截器概念
4.2 创建拦截器类
创建maven web项目,并建立自己所需要的包(图中三个类下面讲解)
导入依赖,删掉项目自带的web.xml
javax.servlet
javax.servlet-api
3.1.0
provided
org.springframework
spring-webmvc
5.2.10.RELEASE
org.apache.tomcat.maven
tomcat7-maven-plugin
2.1
80
/
创建SpringMVC控制器类
//定义表现层控制器bean
@Controller
public class UserController {
//设置映射路径为/save,即外部访问路径
@RequestMapping("/save")
//设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'info':'springmvc'}";
}
初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean(创建配置文件)
//springmvc配置类,本质上还是一个spring配置类
@Configuration
//开启包扫描
@ComponentScan("com.dai.controller")
public class SpringMvcConfig {
}
初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理请求
//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//加载springmvc配置类,产生springmvc容器(本质还是spring容器)
protected WebApplicationContext createServletApplicationContext() {
//初始化WebApplicationContext对象
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
//加载指定配置类
ctx.register(SpringMvcConfig.class);
return ctx;
}
//设置由springmvc控制器处理的请求映射路径
protected String[] getServletMappings() {
return new String[]{"/"};
}
//加载spring配置类
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
起服务器
运行,在浏览器上请求
为了防止Spring 把属于SpringMVC管理的控制类 纳入到自己内部管理,有以下方法:
@ComponentScan({"com.dai.service","com.dai.dao"})
//设置spring配置类加载bean时的过滤规则,当前要求排除掉表现层对应的bean //excludeFilters属性:设置扫描加载bean时,排除的过滤规则 //type属性:设置排除规则,当前使用按照bean定义时的注解类型进行排除 //classes属性:设置排除的具体注解类,当前设置排除@Controller定义的bean
@ComponentScan(value="com.dai",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class ) )
若使用排除,需要把SpringMvcConfig类上的@Configuration注解去掉,否则又被Spring管理
在初始化web容器的代码里加载Spring容器(两种方式,建议用注释掉的方法)
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
protected WebApplicationContext createRootApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return ctx;
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
//可以简化成以下代码
//web配置类简化开发,仅设置配置类类名即可
//public class ServletContainersInitConfig extends //AbstractAnnotationConfigDispatcherServletInitializer {
// protected Class>[] getRootConfigClasses() {
// return new Class[]{SpringConfig.class};
//}
// protected Class>[] getServletConfigClasses() {
// return new Class[]{SpringMvcConfig.class};
//}
//protected String[] getServletMappings() {
// return new String[]{"/"};
//}
//}
当不同类中有相同的请求路径时,会产生冲突。这时需要请求路径切分
写在类上则每个方法都会加上一级请求路径
若post请求传中文会有乱码问题,在ServletContainersInitConfig中,重写getServletFilters方法;get传中文乱码解决方法稍微复杂,不做讲解
//乱码处理
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
加坐标
com.fasterxml.jackson.core jackson-databind 2.9.0
在配置类上加 @EnableWebMvc
控制器类(前端如何组织JOSN数据格式不是本章内容,不做讲解)
注解里写的格式是前端传来的格式,对应才能接收
@EnableWebMvc功能之一:根据类型匹配对应的类型转换器
REST:表现形式转换
REST风格默认规范:get请求--查询,put请求--修改/更新,post--新增/保存,delete--删除
通过请求方式来分别行为,从而隐藏了接口名以及参数名
新建一个SpringMvcSupport 类,继承WebMvcConfigurationSupport
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
//设置静态资源访问过滤,当前类需要设置为配置类,并被扫描加载
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//当访问/pages/????时候,从/pages目录下查找内容
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
}
}
拦截器是一种动态拦截方法调用的机制,在SringMVC中动态拦截控制器方法的执行
作用
拦截器和过滤器的不同 :
实现HandlerInterceptor 接口,手动重写以下三个方法
@Component
//定义拦截器类,实现HandlerInterceptor接口
//注意当前类必须受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {
@Override
//原始方法调用前执行的内容
//返回值类型可以拦截控制的执行,true放行,false终止
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
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 {
}
}
加入到SpringMVC对应的配置类中,注意要被SpringMVC总配置类扫描到