Springmvc + FastJson

首先是applicationContext.xml中的相关配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                        http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.2.xsd">
    <context:component-scan base-package="com.jadyer"/>

    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
                <property name="features">
                    <array>
                        <value>WriteMapNullValue</value>
                        <value>WriteNullStringAsEmpty</value>
                    </array>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!-- fastjson-1.1.41与SpringMVC整合 -->
    <!-- 
    1)若按照jackson和SpringMVC的整合方式,应按照下面的写法,但测试发现这样会报告"HTTP Status 406"
      The resource identified by this request is only capable of generating responses
      with characteristics not acceptable according to the request "accept" headers.
    2)测试通过的整合方式为上面那样在mvc:annotation-driven里面进行注册
    3)supportedMediaTypes增加[text/html;charset=UTF-8]值,是为了兼容IE6
      否则[application/json]值在IE6中会导致弹出对话框询问是否保存文件,而firefox等高级浏览器会正常打印json字符串
    4)若像下面这样给supportedMediaTypes属性赋两个值[text/html;charset=UTF-8]和[application/json],则[application/json]是无效的
      因为此时应答给浏览器(或者说请求方)的Content-Type头信息都是[text/html;charset=UTF-8],所以给它一个值就行了
      如果给supportedMediaTypes的值为[application/json],则应答给浏览器的Content-Type头信息就是[application/json;charset=UTF-8]
    5)关于features属性,不是serializerFeature,而是features,详见FastJsonHttpMessageConverter.java
      它是用来控制json序列化输出时的一些额外属性,比如说该字段是否输出、输出时key使用单引号还是双引号、key不使用任何引号等等
      QuoteFieldNames----------输出key时是否使用双引号,默认为true
      WriteMapNullValue--------是否输出值为null的字段,默认为false
      WriteNullNumberAsZero----数值字段如果为null,输出为0,而非null
      WriteNullListAsEmpty-----List字段如果为null,输出为[],而非null
      WriteNullStringAsEmpty---字符类型字段如果为null,输出为"",而非null
      WriteNullBooleanAsFalse--Boolean字段如果为null,输出为false,而非null
    6)通常在网上搜到的fastjson和springMVC整合的例子中都像下面注释的代码那样给了两个属性WriteMapNullValue和QuoteFieldNames
      这就表示为json解析器设置QuoteFieldNames和WriteMapNullValue的值为true,即输出时key使用双引号,同时也输出值为null的字段
    7)输出时某字段为String类型,且值为null,此时若需要其输出,且输出值为空字符串,则需同时赋值WriteMapNullValue和WriteNullStringAsEmpty
      经测试,若只赋值WriteNullStringAsEmpty,则不会输出该字段..加上WriteMapNullValue属性后,便输出了,且输出值不是null,而是预期的空字符串
     -->
    <!-- 
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/html;charset=UTF-8</value>
                            <value>application/json</value>
                        </list>
                    </property>
                    <property name="serializerFeature">
                        <array>
                            <value>QuoteFieldNames</value>
                            <value>WriteMapNullValue</value>
                        </array>
                    </property>
                </bean>
            </list>
        </property>
    </bean>
     -->
    <!-- 
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                    <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
                </bean>
            </list>
        </property>
    </bean>
     -->
</beans>
接着是SpringMVC中的Controller
package com.jadyer.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSON;
import com.jadyer.model.LoginResult;

@Controller
@RequestMapping(value="/account")
public class AccountController {
    @Resource
    private AccountService accountService;

//  @RequestMapping(value="/login")
//  public String login(String username, String password, HttpServletResponse response) throws IOException{
//      response.setContentType("text/plain; charset=UTF-8");
//      response.setHeader("Cache-Control", "no-cache");
//      response.setHeader("Pragma", "no-cache");
//      response.setDateHeader("Expires", 0);
//      PrintWriter out = response.getWriter();
//      out.write(JSON.toJSONString(accountService.login(username, password)));
//      out.flush();
//      out.close();
//      return null;
//  }
    @ResponseBody
    @RequestMapping(value="/login")
    public LoginResult login(String username, String password){
        LoginResult result = new LoginResult();
        //验签过程暂略....
        result = accountService.login(username, password);
        return result;
    }
}
最后是login()方法的应答实体类LoginResult.java

package com.jadyer.model;

public class LoginResult {
    private String respCode; //应答码
    private String respDesc; //应答描述
    private String userId;   //用户编号
    private String username; //用户名
    private String mobileNo; //用户手机号
    private String integral; //用户拥有的积分
    /*-- 对应的setter和getter略 --*/
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值