SpringMvc 处理json 国际化 文件上传 拦截器 异常

本文详述了SpringMvc在处理Json、文件上传、使用拦截器以及异常处理方面的实践。讲解了如何利用HttpMessageConverter处理Json,通过@RequestBody和@ResponseBody注解实现数据绑定。接着介绍了文件下载的实现,以及SpringMvc的国际化处理,包括Accept-Language参数和本地化解析器。此外,文章还涵盖了文件上传的配置和表单处理,自定义拦截器的创建及其执行顺序,以及异常处理的各种策略,包括@ExceptionHandler、ResponseStatusExceptionResolver、DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver的使用方法。
摘要由CSDN通过智能技术生成

目录

 

1、处理Json的过程

3、文件上传

4、拦截器

5、异常处理


1、处理Json的过程

核心是转换器HttpMessageConverter<T>

1.1 HttpMessageConverter<T>接口

HttpMessageConverter<T> 是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息

同时,框架内部也为我们准备好了实现类(也允许我们添加第三方实现类,比如我们用json,就需要添加jackson jar包,最后就是json实现类)

使用 HttpMessageConverter<T> 将请求信息转化并绑定到处理方法的入 参中或将响应结果转为对应类型的响应信息,Spring 提供了两种途径(就是我们需要做的事情):

①注解法: 使用 @RequestBody / @ResponseBody   对处理方法进行标注   (普通的回显内容)
②入参法:  使用 HttpEntity<T> / ResponseEntity<T> 作为处理方法的入参或返回值 (一般用于文件下载效果)

    当控制器处理方法使用到 @RequestBody/@ResponseBody或HttpEntity<T>/ResponseEntity<T> 时, Spring 首先根据请求头或响应头的Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的 HttpMessageConverter, 若找不到可用的HttpMessageConverter 将报错

 

案例演示1:ajax技术处理(页面不发生变化,需要通过Js向服务端发送请求)前后端传输Json对象( 使用 @RequestBody / @ResponseBody )

非常简单,只需要在方法上加入@ResponseBody注解

处理JSON具体步骤:

(1)加入jar包

(2)编写目标方法,使其返回JSON对应的对象或集合(不是java类型的,可以被js解析后显示给客户)

(3)在方法上添加@ResponseBody注解

 

回到主页面input.jsp,我们用jQuery来写ajax代码简洁的多。首先就要导入jquery和js,然后写好访问代码

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="scripts/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
	$(function(){
		$("#testJson").click(function(){
			var url = this.href;
			var args = {};
			$.post(url, args, function(data){
				for(var i = 0; i < data.length; i++){
					var id = data[i].id;
					var lastName = data[i].lastName;
					
					alert(id + ": " + lastName);
				}
			});
			return false;
		});
	})
</script>
</head>

<body>
	<a href="emps">List All Employees</a>
	<br><br>
	
	<a href="testJson" id="testJson">Test Json</a>
	<br><br>
</body>

进入服务端,springmvctest.java类  在处理json的方法上,添加一个@ResponseBody属性,就可以返回一个集合,获取employee的所有信息

package com.atguigu.springmvc.test;

@Controller
public class SpringMVCTest {
    @Autowired
	private EmployeeDao employeeDao;

    
    @ResponseBody
	@RequestMapping("/testJson")
	public Collection<Employee> testJson(){
		return employeeDao.getAll(); //employeeDao是类的私有属性,而且注入了内容,因此这里才可以直接用
	}
}

这里有入参,用一个@RequestBody标注,可以告诉SpringMvc该用哪一种转换器处理

package com.atguigu.springmvc.test;

@Controller
public class SpringMVCTest {
    @Autowired
	private EmployeeDao employeeDao;

    
   @ResponseBody
   @RequestMapping("/testHttpMessageConverter")
   public String testHttpMessageConverter(@RequestBody String body){
		System.out.println(body);
		return "helloworld! " + new Date();
	}

}

案例演示2:下载效果(使用HttpEntity<T> / ResponseEntity<T>

进入index.jsp

<a href="testResponseEntity">Test ResponseEntity</a>

然后进入springmvctest.java编写服务端

package com.atguigu.springmvc.test;

@Controller
public class SpringMVCTest {
    @Autowired
	private EmployeeDao employeeDao;

    
    @RequestMapping("/testResponseEntity")
	public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException{
		byte [] body = null;
		ServletContext servletContext = session.getServletContext();
		InputStream in = servletContext.getResourceAsStream("/files/abc.txt");
		body = new byte[in.available()];
		in.read(body);
		
		HttpHeaders headers = new HttpHeaders();
		headers.add("Content-Disposition", "attachment;filename=abc.txt");
		
		HttpStatus statusCode = HttpStatus.OK;
		
		ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body, headers, statusCode);
		return response;
	}


}

点击后,即可直接下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值