DispathcerServlet采用其他的url-pattern 此时,所有的访问handler的路径都要以action结尾
<servlet> <servlet-name>ozl_mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:mvc.xml</param-value> </init-param> <!--可选配置,不写就是懒汉式加载,写了就是饿汉式加载--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ozl_mvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>DispathcerServlet的url-pattern依然采用"/",但要追加配置
<!-- 额外增加一个handler,且requestMapping:"/**"可以匹配所有的请求, 但是优先级最低,所以如果其他所有的handler都匹配不上,请求会转向"/**", 恰好这个handler是处理静态资源的处理方式:将请求转会到tomcat中default的Servlet requestMapping:"/**" /xx/xx或者/x就是所有路径 --> <mvc:default-servlet-handler/>@ResponseBody 将handler的返回值,转换成json(jackson),并将json响应给客户端
@Controller @RequestMapping("/json") public class JsonController { @RequestMapping("/test1") @ResponseBody public User test1(){ System.out.println("test1"); User user = new User(1,"李四"); return user; } @RequestMapping(value = "/test2",produces = "text/html;charset=utf-8") @ResponseBody public String test2(){ System.out.println("test2"); return "利好";//结果返回 利好 } }@RestController 给该控制类的所有方法即handler都加上@ResponseBody的作用 注意:使用了@RestController可以不用写@Controller,因为@RestController里面已经有了@Controller注解
@RestController @RequestMapping("/json") public class JsonController { @RequestMapping("/test1") // @ResponseBody public User test1(){ System.out.println("test1"); User user = new User(1,"李四"); return user; } @RequestMapping(value = "/test2",produces = "text/html;charset=utf-8") // @ResponseBody public String test2(){ System.out.println("test2"); return "利好"; } @RequestMapping("/test3") public String test3(@RequestBody User user){ System.out.println(user); return "ok"; } }@RequestBody 接收json参数
实体类User
public class User { private Integer id; private String name; private Boolean gender; private Date birth; private String[] hobby; public User(){ } public User(Integer id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", gender=" + gender + ", birth=" + birth + ", hobby=" + Arrays.toString(hobby) + '}'; } public String[] getHobby() { return hobby; } public void setHobby(String[] hobby) { this.hobby = hobby; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Boolean getGender() { return gender; } public void setGender(Boolean gender) { this.gender = gender; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } }JsonController
@RequestMapping("/test3") public String test3(@RequestBody User user){//@RequestBody将请求体中的json数据转换为java对象 System.out.println(user); return "ok"; }下载jquery-2.1.1.js的代码导入进去 json.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <script src="${pageContext.request.contextPath}/js/jquery-2.1.1.js"></script> </head> <body> <input type="button" value="ajax" onclick="send_json();"> <script> function send_json(){ // ajax json var user={id:1,name:"战三"}; var userJson=JSON.stringify(user); $.ajax({ url:"${pageContext.request.contextPath}/json/test3", type:"post", data:userJson, contentType:"application/json", success:function (ret){ alert(ret); } } ) } </script> </body> </html>@JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”)
User
@JsonFormat(pattern = "YYYY-MM-dd HH:mm:ss",timezone = "GMT+8") private Date birth;JsonController
@RequestMapping("/test1") // @ResponseBody public User test1(){ System.out.println("test1"); User user = new User(1,"李四",new Date()); return user; }User
@JsonProperty("id_new") private Integer id;json响应的id属性变成id_new
User
@JsonIgnore private Boolean gender;json响应就不会有gender属性
@JsonInclude(JsonInclude.Include.NON_NULL) null值,属性不输出 元素为空就不会json响应显示
@JsonInclude(JsonInclude.Include.NON_NULL) private List<String> hobby;@JsonInclude(JsonInclude.Include.NON_EMPTY) empty属性不输出(空串,长度为0的集合,null值)
@JsonInclude(JsonInclude.Include.NON_EMPTY) private List<String> hobby;User
@JsonSerialize(using= MySerializer.class) private Double salary=10000.262; //用MySerializer输出 public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; }MySerializer
public class MySerializer extends JsonSerializer<Double> { public void serialize(Double aDouble, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { //将salary的值四舍五入 留两位小数 String number= BigDecimal.valueOf(aDouble).setScale(2,BigDecimal.ROUND_HALF_UP).toString(); //输出四舍五入的值 jsonGenerator.writeNumber(number); } }SpringMVC默认的json处理方案是Jackson,但是FastJson性能更好,可以使用FastJson处理方案
mvc.xml
<!--启动mvc注解驱动--> <mvc:annotation-driven> <!--安装FastJson,转化器--> <mvc:message-converters> <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> <!--声明转换类型:json--> <property name="supportedMediaTypes"> <list> <value>application/json</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>日期格式化:@JSONField(format = “yyyy/MM/dd”) 属性名修改:@JSONField(name=“xxxx”) 忽略属性名:@JSONField(serialize = false) 包含null值:@JSONField(serialzeFeatures = SerializerFeature.WriteNullStringAsEmpty) //null的String输出为""空串 @JSONField(serialzeFeatures = SerializerFeature.WriteMapNullValue) //默认会忽略所有null值,有此注解输出null 自定义序列化: @JSONField(serializeUsing =xxxx.class)
User2
public class User2 { @JSONField(serialize = false) private Integer id; @JSONField(name="Name",serialzeFeatures = SerializerFeature.WriteNullStringAsEmpty) private String name; @JSONField(serialzeFeatures = SerializerFeature.WriteMapNullValue) private String city; @JSONField(format = "yyyy/MM/dd") private Date birth; @JSONField(serializeUsing = MySerializer2.class) private Double salary; public User2(Integer id, String name, String city, Date birth, Double salary) { this.id = id; this.name = name; this.city = city; this.birth = birth; this.salary = salary; } @Override public String toString() { return "User2{" + "id=" + id + ", name='" + name + '\'' + ", city='" + city + '\'' + ", birth=" + birth + ", salary=" + salary + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } }MySerializer2
public class MySerializer2 implements ObjectSerializer { public void write(JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i) throws IOException { Double value=(Double) o;//salary属性值 String text=value+"元";//salary属性值后面添加 元 jsonSerializer.write(text); } }JsonController
@RequestMapping("/test12") // @ResponseBody public User2 test12(){ System.out.println("test12"); User2 user2= new User2(1,"李k","上海",new Date(),1000.22); return user2; }