SpringMVC_study

SpringMVC的学习

sublime使用

sublime真是编辑器之神,安装install package,然后安装插件 pretty json cmd+ctrl+j格式化json数据。

SpringMVC流程图

mvc简易模型图

mvc1

mvc框架结构

mvc2

mvc2

springmvc相关内容

springmvc的使用步骤

  1. 配置web.xml:
    配置前端控制器:tomcat启动时初始化、指定springmvc的配置文件的位置
  2. 编写springmvc的配置文件:
    开启包扫描
    配置视图解析器:指定如果去查找视图
  3. 编写自定义处理器
    将处理器装配到容器中
    编写请求的url映射关系:@RequestMapping(“xxx”):来映射要执行的方法
    在@RequestMapping(“xxx”)下编写方法处理具体的业务逻辑,返回一个ModelAndView,其中可以封装视图名称和数据。

RequestMapping映射请求

  • 标准URL映射
  • Ant风格的映射:*(0个或多个字符)、?(单个字符)、**(0个或多个路径)
  • Rest风格的映射:占位符
  • 限定请求方法的映射:get、post、put、delete
  • 限定参数的映射:限定哪些请求参数可以访问

使用json

响应json数据

@ResponseBody:
当一个处理请求的方法标记为@ResponseBody时,表示该方法需要输出其他视图(json、xml),springmvc会通过默认的json转化器转化输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 将list集合响应成json数据
* @return
*/
@RequestMapping(value="show28")
@ResponseBody//将数据响应成json格式的数据
public List test28() {
List list = new ArrayList();
for(int i = 0;i< 20;i++) {
User user = new User();
user.setId(i+1L);
user.setUsername("zhangsan"+i);
user.setName("张三"+i);
user.setAge(18);
list.add(user);
}
return list;
}

在使用jackson转换json数据时需要消息转换器HttpMessageConverter的支持,该消息转换器默认并没有开启。

在配置文件中注册注解驱动:配置该标签后会自动注册消息转换器。

1
2


使用pojo接收json数据

@RequestBody:接收一个json并且转换成一个对象。
接收一个json数据并反序列化为一个user对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
/**

 * 将提交的json格式的数据封装到user对象中
* @RequestBody():自动将json数据序列化成一个user对象
* @param model
* @param user
* @return
*/
@RequestMapping(value="show29")
public String test29(Model model,@RequestBody User
user) {
model.addAttribute("msg", user);
return "hello";
}
解决中文乱码问题

原因:使用的消息转换器换成了StringHttpMessageConverter,
该转换器中使用的默认的编码为ISO_8859_1:

解决方案:
修改消息转换器中的编码集

将注解驱动修改如下:

  1. 设置String的消息转换器
  2. 该消息转换器中有一个构造函数可以设置编码集,因此只要直接赋值即可。
1
2
3
4
5
6
7
8








@RestController

有时如果在一个Contoller中所有的方法都是用来响应json格式数据的,那么如果有多个方法,就需要在多个方法上使用@ResponseBody,这样太麻烦,springmvc提供了一个@RestController,将该注解使用在Controller类上,那么该controller中的所有方法都默认是响应json格式的数据了。

文件上传

步骤一:添加依赖
1
2
3
4
5
6


commons-fileupload
commons-fileupload
1.3.1

步骤二:配置文件上传解析器

需要在springmvc的配置文件中配置一个文件上传解析器(在spring-web包下),并且设置其解析器的某些参数,如上传文件大小和编码集等。

在springmvc-servlet.xml中配置:
注意:必须配置id属性,并且名称固定为multipartResolver,否则无法使用.

1
2
3
4
5
6
7







步骤三:Controller方法

注意:存放文件的目录upload需要先行创建好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 文件上传
* 需要通过MultipartFile类型来接收上传数据
*
* @throws Exception
* @throws IllegalStateException
*/
@RequestMapping("show31")
public String test31(Model model,@RequestParam("file")MultipartFile file) throws Exception{

if (file!=null) {
//将文件存储到指定路径
file.transferTo(new File("d://upload//"+file.getOriginalFilename()));
}
model.addAttribute("msg", "上传成功!");
return "hello";
}

转发及重定向(forward、redirect)

返回值为字符串时,默认为视图名称。当返回值字符串是以”forward:”或者”redirect:”开头,则会被认为是转发或者重定向。
使用方式如下:
转发:forward:/hello/show.do(绝对路径)或者forward:show.do(相对路径)
重定向:redirect:/hello/show.do(绝对路径)或者redirect:show.do(相对路径)
/:表示绝对路径,指的是localhost:8080/springmvc(项目名称可以省略)
不带/:表示相对路径,相对于当前请求的路径
如果当前请求是:localhost:8080/springmvc(项目名称可以省略)/hello/show32
那么不带/:表示localhost:8080/springmvc(项目名称可以省略)/hello/

拦截器

HandlerExecutionChain是一个执行链,当请求到达DispatchServlet时,DispatchServlet根据请求路径到HandlerMapping查询具体的Handler,从HandlerMapping返回执行链给DispatcherServlet,其中包含了一个具体的Handler对象和Interceptors(拦截器集合)。

拦截器一般用于对处理器进行预处理和后处理。

应用场景:

1、权限检查:如登录检测,进入处理器前检测用户是否登录,如果没有登陆直接返回到登录页面。

2、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,统计处理器执行使用了多少时间。

springmvc的拦截器接口(HandlerInterceptor)定义了三个方法:

  • preHandle调用Handler之前执行,称为预处理回调方法
    返回值:true表示放行,后续业务逻辑继续执行
    false表示被拦截,后续业务逻辑不再执行,但之前返回true的拦截器的请求完成回调方法会倒叙执行
    
  • postHandle调用Handler之后执行,称为后处理回调方法
  • afterCompletion视图渲染完成之后执行,可以称为请求完成回调方法
拦截器的执行过程

intercepter1

intercepter2

拦截器的配置过程:

编写自定义拦截器实现HandlerInterceptor
在springmvc-servlet.xml中注册自定义拦截器

配置自定义拦截器
1
2
3
4
5
6
7
8








配置乱码过滤器

POST
1
2
3
4
5
6
7
8
9
10
11
12
13


characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter

encoding
utf-8



characterEncodingFilter
/*

GET
1
2
3
4
5
6
7
8
9
10
11
12
13



org.apache.tomcat.maven
tomcat7-maven-plugin

8080
/

utf-8



-------------本文结束感谢您的阅读-------------