欢迎光临Software MyZone,有问题可留言或到站点论坛发帖,争取第一时间帮忙解决 || 站点论坛:火龙论坛 || 淘宝小店:应小心的易淘屋 【欢迎大家提建设性意见】

spring mvc整合json

欢迎热爱编程的朋友们参与到cocos2d-x编程中,为了给大家提供良好的交流环境,网站以开启QQ群
Software MyZone:66202765(群号,欢迎加入,若满,请加1群)
Software MyZone 1群(2dx):286504621
Software MyZone 2群(山东):204954191
Software MyZone【Java群】:162865493
【加群请写:Software MyZone或者是firedragonpzy】
淘宝店:【应小心的易淘屋】初次开店,大家多多支持……
群论坛:【火龙论坛】正试运营阶段,欢迎大家多提些建设性意见……
群问答:【火龙问答】正试运营阶段,欢迎大家多提些建设性意见……
摘自:http://my.oschina.net/u/724985/blog/101963

我的digitalocean推广链接:https://www.digitalocean.com/?refcode=65dfdb158f1a,Everyone you refer gets $10 in credit,从此链接注册,你将获得10美元。

最近team要开发一个App,负责server端。原本准备是用SSH2框架的,但是感觉struts2还是比较适合用来与jsp结合使用,想了又想决定用spring mvc整合json来做。网上查了很多资料,调试了一整天,终于把调通。在这里分享一下我的经验:

 

  1. 第一步当然创建一个新项目,加入spring啦^-^  貌似现在只有3.0版本以上才支持整合json哦。
  2. 在项目中加入两个json的jar包:jackson-core-asl-x.x.x.jar和jackson-mapper-asl.x.x.x.jar。其中xxx是jar包的版本,网上很多说用1.4.2,但是我加入1.4.2版本后,部署会出错。在请求中会出现ObjectMapper:NoClassDefFoundException的错,仔细查看原来tomcat启动的时候就错了,报的是isFullyTyped:NoSuchMethodError的错误。这个错真心纠结了很久,最后在官网上看到原来是core包里里面一个类没有这个方法。查看jar包,1.4.2真的没有这个方法。仔细查看官网API,尼玛json竟然不是向下兼容的,伤不起….最后看到了1.1版本还是支持的,于是就下载了1.1.2的版本。于是两个jar包就是:jackson-core-asl-1.1.2.jar和jackson-mapper-asl.1.1.2.jar。
  3. 在web.xml添加spring mvc
<context -param>
  	<param -name>contextConfigLocation</param>
                  <param -value>
  		/WEB-INF/classes/applicationContext.xml,
  		/WEB-INF/classes/spring-servlet.xml
  	</param>
  </context>
  <listener>
  	</listener><listener -class>
  		org.springframework.web.context.ContextLoaderListener
  	</listener>
  
  <!-- spring mvc的servlet,处理所有.json请求 -->
  <servlet>
  	</servlet><servlet -name>spring</servlet>
  	<servlet -class>org.springframework.web.servlet.DispatcherServlet</servlet>
  	<init -param>
  		<param -name>contextConfigLocation</param>
  		<param -value>/WEB-INF/classes/spring-servlet.xml</param>
  	</init>
  	<load -on-startup>1</load>
  
  <servlet -mapping>
  	</servlet><servlet -name>spring</servlet>
  	<url -pattern>*.json</url>
  
  1. 编写spring-servlet.xml,配置spring mvc
  2. < ?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:p="http://www.springframework.org/schema/p"
        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.0.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
        <context:annotation -config />
        <!-- Controller 类注解标识 -->
        <context:component -scan base-package="com.gswtek.controller" />
        
        <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
            <property name="mediaTypes">
                <map>
                    <!-- 告诉视图解析器,返回的类型为json格式 -->
                    <entry key="json" value="application/json" />
                </map>
            </property>
            <property name="defaultViews">
                <list>
                    <!-- ModelAndView里的数据变成JSON -->
                    <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
                </list>
            </property>
        </bean>
    </beans>
    
  3. 编写Controller类,返回的ModelAndView会自动将数据转换成json数据
  4. package com.gswtek.controller;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.log4j.Logger;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.portlet.ModelAndView;
    
    import com.gswtek.service.UserService;
    import com.gswtek.service.UserServiceImpl;
    
    @Controller        /注解这个是个Controller
    public class UserController {
    
        public static Logger log = Logger.getLogger(UserController.class);
        @Autowired
        @Qualifier("UserServiceImpl")
        private UserServiceImpl userService;
        
        public void setUserService(UserServiceImpl userService) {
            this.userService = userService;
        }
    
            /*
            * @RequestMapping配置请求地址
            * @RequestParam将请求中的参数注入
            */
             @RequestMapping(value="/register")     public ModelAndView register(@RequestParam("username") String username
                                    ,@RequestParam("password") String password) {
            log.debug("register a new user");
            ModelAndView modelView = new ModelAndView();
            Map<string , Object> modelMap = new HashMap</string><string , Object>();
            boolean status = userService.addUser(username, password);
            /*if(status) {
                modelMap.put("status", true);
            } else {
                modelMap.put("status", false);
            }*/
                    modelMap.put("status",status);//感谢二楼的指正,已修改
                    modelMap.put("date", new Date());
            modelView.addAllObjects(modelMap);
            return modelView;
        }
        
    }
    
  5. service层的代码就不贴了,大家都懂的^-^
  6. 结果:
  7. {"modelAndView":{"empty":false,"reference":false,"viewName":null,"view":null,"modelMap":{"status":true,"date":1358091863067},"model":{"status":true,"date":1358091863067}}}
    
  8. 观察一下,数据冗余有木有!没关系,定义我们自己的数据转换类:
  9. package com.gswtek.util;
    
    import java.util.Map;
    
    import org.springframework.web.portlet.ModelAndView;
    import org.springframework.web.servlet.view.json.MappingJacksonJsonView;
    
    public class MappingJacksonJsonViewExd extends MappingJacksonJsonView {
    
        @Override
        protected Object filterModel(Map</string><string , Object> model) {
            Map< ?, ?> result = (Map< ?, ?>) super.filterModel(model);
            ModelAndView mav =  (ModelAndView) (result.size() != 1 ? result : result.values().iterator().next());
            return mav.getModelMap();
        }
    
    }
    

更改spring-servlet.xml:

<property name="defaultViews">
            <list>
                <!-- ModelAndView里的数据变成JSON -->
                <bean class="com.gswtek.util.MappingJacksonJsonViewExd" />
            </list>
        </property>
  1. 再次布局,测试:
  2. {"status":true,"date":1358092422728}