一、注解开发方式中与JSON交互
1.1 使用@ResponseBody返回JSON数据
如果方法的返回值由@ResponseBody修饰,并且返回值类型不是基本类型和String,会按照JSON格式返回。如果返回值类型是基本类型或者String,直接返回值。如
@Controller
public class Hello4Controller {
@RequestMapping("/hello4")
public @ResponseBody
User hello4(@RequestParam(defaultValue = "没有名字的二狗",required = true) String name){
return new User(name,"123456",name.hashCode());
}
}
class User {
private String name;
private String password;
private int id;
public User(String name, String password, int id) {
this.name = name;
this.password = password;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
返回示例,password字段没有getter方法,所以没有显示。
1.2 使用@RequestBody解析JSON数据
如果方法参数被@RequestBody,会把请求参数中对应的json字符串解析成对象
1.3 406错误
在pom文件中需要引入以下jackson依赖,否则会出现406错误
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.8</version>
</dependency>
406错误:
二、注解开发中的参数邦定
2.1 什么是参数邦定
所谓参数邦定,就是把请求中的请求数据邦定到方法中。举个例子,如果访问的请求为http://localhost:8080/hello4?name=张五侠,而处理这个请求的处理器Handler的处理方法为
@Controller
public class Hello4Controller {
@RequestMapping("/hello4")
public @ResponseBody String hello4(String name){//这个方法中的name被自动赋值为“张五侠”
return "Hello "+name+"!";
}
}
方法的参数name被自动赋值为"张五侠",这个过程被称为参数邦定。
2.2 普通参数邦定
A. 如果方法的形参中包含以下类型。默认赋值。
- HttpServletRequest
- HttpServletResponse
- HttpSession
- Model/ModelMap
B. 如果方法中包含基本类型参数或者String,并且参数名称与URL请求的参数名称一致,自动邦定。
C. 如果形参被@RequestParam注解,自动邦定,@RequestParam中包含四个参数
- name String类型,指定从URL的那个参数名邦定
- required boolean类型,是否必需,默认true
- defaultValue String类型,默认值,如果设置了默认值则required无效
- value String类型,与name一样
D.类类型的参数邦定. 如果类类型中的字段名与URL中某个参数的参数名一致,自动帮定。
2.3 自定义参数邦定
某些类型的参数邦定SpringMVC是无法实现的,例如时间Date的邦定。因为SpringMVC无法知道URL中的Date字符串是什么格式的,这就需要我们自定义参数邦定。
所有的参数邦定器都必需实现Converter接口。例如定义一个String转Date的参数邦定器
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateConverter implements Converter<String,Date> {
public Date convert(String s) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
try {
return format.parse(s);
} catch (ParseException e) {
throw new RuntimeException("这日期不对啊");
}
}
}
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" >
<property name="converters">
<set>
<bean class="com.example.DateConverter"/>
</set>
</property>
</bean>