开发者社区> hjzgg> 正文

SpringMVC那点事

简介:
+关注继续查看

v一、SpringMVC返回json数据的三种方式

1、第一种方式是spring2时代的产物,也就是每个json视图controller配置一个Jsoniew。

  如:<bean id="defaultJsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/> 

  或者<bean id="defaultJsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>

  同样要用jackson的jar包。

2、第二种使用JSON工具将对象序列化成json,常用工具Jackson,fastjson,gson。

3、第三种利用spring mvc3的注解@ResponseBody,然后使用spring mvc的默认配置就可以返回json了。

  即return Object 会自动转换成JSON对象。

v二、springMVC对于controller处理方法返回值的可选类型

1.ModelAndView

复制代码
@RequestMapping(method=RequestMethod.GET)
    public ModelAndView index(){
        ModelAndView modelAndView = new ModelAndView("/user/index");//指定viewName
        modelAndView.addObject("xxx", "xxx");
        return modelAndView;
    }

@RequestMapping(method=RequestMethod.GET)
    public ModelAndView index(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("xxx", "xxx");
        modelAndView.setViewName("/user/index");//指定viewName
        return modelAndView;
    }
复制代码

  对于ModelAndView构造函数可以指定返回页面的名称,也可以通过setViewName方法来设置所需要跳转的页面;

2.Model

  一个模型对象,主要包含spring封装好的model和modelMap,以及java.util.Map,当没有视图返回的时候视图名称将由requestToViewNameTranslator决定;

3.ModelMap

待续

4.Map

复制代码
@RequestMapping(method=RequestMethod.GET)
    public Map<String, String> index(){
        Map<String, String> map = new HashMap<String, String>();
        map.put("1", "1");
        //map.put相当于request.setAttribute方法
        return map;
    }
复制代码

   响应的view应该也是该请求的view。等同于void返回。

5.View

  这个时候如果在渲染页面的过程中模型的话,就会给处理器方法定义一个模型参数,然后在方法体里面往模型中添加值。

6.String

  对于String的返回类型,笔者是配合Model来使用的。

复制代码
@RequestMapping(method = RequestMethod.GET)
    public String index(Model model) {
        String retVal = "user/index";
        List<User> users = userService.getUsers();
        model.addAttribute("users", users);
 
        return retVal;
    }
复制代码

  或者通过配合@ResponseBody来将内容或者对象作为HTTP响应正文返回(适合做即时校验);

@RequestMapping(value = "/valid", method = RequestMethod.GET)
   @ResponseBody
   public String valid(@RequestParam(value = "userId", required = false) Integer userId,
            @RequestParam(value = "logName") String strLogName) {
        return String.valueOf(!userService.isLogNameExist(strLogName, userId));     
    }

  返回字符串表示一个视图名称,这个时候如果需要在渲染视图的过程中需要模型的话,就可以给处理器添加一个模型参数,然后在方法体往模型添加值就可以了。如果返回的是对象则会产生一个默认的视图,然后将返回的对象直接解析成JSON,默认视图+JSON生成正文返回。

7.Void

  当返回类型为Void的时候,则响应的视图页面为对应着的访问地址

复制代码
@Controller
@RequestMapping(value="/type")
public class TypeController extends AbstractBaseController{
    @RequestMapping(method=RequestMethod.GET)
    public void index(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("xxx", "xxx");
    }
}
复制代码

  返回的结果页面还是:/type

  这个时候我们一般是将返回结果写在了HttpServletResponse 中了,如果没写的话,spring就会利用RequestToViewNameTranslator 来返回一个对应的视图名称。如果这个时候需要模型的话,处理方法和返回字符串的情况是相同的。

v三、Jackson json 处理全大写或不规范的JSON

  通过对API的研究可以通过@JsonProperty以及@JsonAutoDetect来实现。

  具体参考:http://energykey.iteye.com/blog/2146445

ALL 
          This pseudo-type indicates that all of real types are included
CREATOR 
          Creators are constructors and (static) factory methods used to construct POJO instances for deserialization
FIELD 
          Field refers to fields of regular Java objects.
GETTER 
          Getters are methods used to get a POJO field value for serialization, or, under certain conditions also for de-serialization.
IS_GETTER 
          "Is getters" are getter-like methods that are named "isXxx" (instead of "getXxx" for getters) and return boolean value (either primitive, or Boolean).
NONE 
          This pseudo-type indicates that none of real types is included
SETTER 
          Setters are methods used to set a POJO value for deserialization.

v四、SpringMVC接收JSON对象

  我做的是将form的数据转成json数据,然后发送到后台,后台是SpringMVC。

  SpringMVC

复制代码
<mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <!-- 将StringHttpMessageConverter的默认编码设为UTF-8 -->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8" />
            </bean>
            <!-- 将Jackson2HttpMessageConverter的默认格式化输出设为true -->
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="prettyPrint" value="true"/>
            </bean>            
          </mvc:message-converters>
    </mvc:annotation-driven>
复制代码

  注意:这两个Converter很是重要,他们可以帮助我们将Json数据转换成java对象。

 

  Controler

复制代码
@Controller
@RequestMapping(value="/hjzgg/message")
public class MessageDemo {
    @RequestMapping(method = RequestMethod.POST)
    public @ResponseBody String sendMessage(@RequestBody MyAddress myAddress, HttpServletRequest request){
        return "hjzgg";
    }
}
复制代码

 

  js

复制代码
function sendMessage(){
      var formData = $("#messageForm").serializeArray(); //自动将form表单封装成json
      console.log(JSON.stringify(formData));
     $.ajax({ 
        type:"POST", 
        url:"hjzgg/message", 
        dataType:"json",      
        contentType:"application/json",               
        data:JSON.stringify(formData), 
        success:function(response){ 
            alert(response);
         },
         error:function(response){
             alert(response);
         }
        }); 
}
复制代码

 

  开始的时候总是出现 400 (Bad Request)这个错误,  出现这个错误的原因一般最常见的就是后台的实体类bean与前台穿过的类型不匹配。然后我打印了一下上述方式生成的json,发现数据格式竟然是这样子的:

[{"name":"phoneNumber","value":""},{"name":"eMail","value":""},{"name":"appId","value":""},{"name":"title","value":""},{"name":"content","value":""},{"name":"isMailtTemplate","value":"false"}]

  相信如果不仔细看的话,还以为是对的。仔细一看,怎么表单的name属性和value属性怎么出现在这个Json对象里了。这怎么能成功的和后台交互呢?

  于是改了一下,js如下:

复制代码
function serializeJson(){
    var serializeObj={};  
    var array=$("#messageForm").serializeArray();
    $(array).each(function(){  
        if(serializeObj[this.name]){  
            if($.isArray(serializeObj[this.name])){  
                serializeObj[this.name].push(this.value);  
            }else{  
                serializeObj[this.name]=[serializeObj[this.name],this.value];  
            }  
        }else{  
            serializeObj[this.name]=this.value;   
        }  
    });  
    return serializeObj;  
}

function sendMessage(){
     var formData = serializeJson();
      console.log(JSON.stringify(formData));
     $.ajax({ 
        type:"POST", 
        url:"hjzgg/message", 
        dataType:"json",      
        contentType:"application/json",               
        data:JSON.stringify(formData), 
        success:function(response){ 
            alert(JSON.stringify(response));
         },
         error:function(response){
             alert(JSON.stringify(response));
         }
        }); 
}
复制代码

  最终打印的数据:

  {"phoneNumber":"","eMail":"","appId":"","title":"","content":"fsdfsd","isMailtTemplate":"false"}

  这才是正解啊。

 

 

v五、 fastjson 中的 SimplePropertyPreFilter(JSON的字段过滤)

http://blog.csdn.net/yongjiandan/article/details/8308793

Iterable<BaseEtype> baseEtypes = baseEtypeService.getBaseEtypes(enumId);
SimplePropertyPreFilter filter = new SimplePropertyPreFilter(BaseEtype.class);
filter.getExcludes().add("baseEnum");
String index = JSON.toJSONString(baseEtypes, filter);

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
19821 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
29204 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
13584 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
22541 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
16480 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20716 0
+关注
316
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载