文档章节

spring mvc整合json

iuKa
 iuKa
发布于 2013/01/13 23:59
字数 903
阅读 25974
收藏 55

    最近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-name>
                      <param-value>
      		/WEB-INF/classes/applicationContext.xml,
      		/WEB-INF/classes/spring-servlet.xml
      	</param-value>
      </context-param>
      <listener>
      	<listener-class>
      		org.springframework.web.context.ContextLoaderListener
      	</listener-class>
      </listener>
      <!-- spring mvc的servlet,处理所有.json请求 -->
      <servlet>
      	<servlet-name>spring</servlet-name>
      	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      	<init-param>
      		<param-name>contextConfigLocation</param-name>
      		<param-value>/WEB-INF/classes/spring-servlet.xml</param-value>
      	</init-param>
      	<load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
      	<servlet-name>spring</servlet-name>
      	<url-pattern>*.json</url-pattern>
      </servlet-mapping>
  4. 编写spring-servlet.xml,配置spring mvc
    <?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>
  5. 编写Controller类,返回的ModelAndView会自动将数据转换成json数据
    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, 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;
    	}
    	
    }
  6. service层的代码就不贴了,大家都懂的^-^
  7. 部署测试,测试的地址是http://localhost:8080/spring_mvc/register.json?username=kevin&password=hahahah浏览器中返回数据是
    {"modelAndView":{"empty":false,"reference":false,"viewName":null,"view":null,"modelMap":{"status":true,"date":1358091863067},"model":{"status":true,"date":1358091863067}}}
    ok,成功!确实是json数据。
  8. 观察一下,数据冗余有木有!没关系,定义我们自己的数据转换类:
    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, 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>

  9. 再次布局,测试:
    {"status":true,"date":1358092422728}
    ok,这次数据就比较简洁了。

   

     到此整个例子就结束了。这是我第一次穿写博客,貌似废话有点多,欢迎大家拍砖,哈哈~只是想把自己的经验与大家分享一下,希望初学者能少走弯路。明天还要上班,Good night everyone!^-^


© 著作权归作者所有

共有 人打赏支持
iuKa
粉丝 12
博文 11
码字总数 9266
作品 0
杭州
程序员
私信 提问
加载中

评论(11)

最代码
最代码
请参考代码:SpringMVC整合JSON、XML视图,下载地址:http://www.zuidaima.com/share/1751862737554432.htm
黄威
黄威
Map root = new HashMap();
      String view = execute(root);
      ModelAndView modelAndView =new ModelAndView(new MappingJacksonJsonView(), root);
      
      return modelAndView;
倔强的土豆
倔强的土豆
不错
改个昵称
改个昵称

引用来自“iuKa”的评论

引用来自“大毅”的评论

对了 我目前也是这样干的,但是作为服务器安全这一层是怎么把握的了?

额,我现在已经不做服务器后端了,所以了解的不深入。听我老大说,一般也就是防止Sql注入,检查参数的合法性,以及对一些未知来源的请求过滤

好的,谢谢你了
iuKa
iuKa

引用来自“大毅”的评论

对了 我目前也是这样干的,但是作为服务器安全这一层是怎么把握的了?

额,我现在已经不做服务器后端了,所以了解的不深入。听我老大说,一般也就是防止Sql注入,检查参数的合法性,以及对一些未知来源的请求过滤
改个昵称
改个昵称
对了 我目前也是这样干的,但是作为服务器安全这一层是怎么把握的了?
iuKa
iuKa

引用来自“linapex”的评论

{"status":true,"date":1358092422728} 其中 date 如何转换成yyyy-MM-dd HH🇲🇲ss

直接用SImpleDateFormat吧
linapex
linapex
{"status":true,"date":1358092422728} 其中 date 如何转换成yyyy-MM-dd HH🇲🇲ss
iuKa
iuKa

引用来自“lsr”的评论

modelMap.put("status", status)不好么?还要判断下?

哈哈,是啊,都没发现,汗...Thx!
西北核弹头
西北核弹头
modelMap.put("status", status)不好么?还要判断下?
Spring4+SpringMVC+MyBatis整合思路

本文主要简单讲解框架整合的思路。 1、Spring框架的搭建 这个很简单,只需要web容器中注册org.springframework.web.context.ContextLoaderListener,并指定spring加载配置文件,那么spring容...

Java团长17
2018/07/11
0
0
SpringFramework4系列之整合Resteasy

对于和jboss as7的集成不需要做任何工作,jboss默认集成了resteasy,只需要对业务pojo做一些jax-rs的注解标注即可。 对于非Jboss的Servlet容器 Spring和resteasy集成,主要有三种方式, 运行...

Garrry
2015/07/21
0
0
Spring4 + Spring MVC + MyBatis 整合思路

原文出处:斯武丶风晴 1、Spring框架的搭建 这个很简单,只需要web容器中注册org.springframework.web.context.ContextLoaderListener,并指定spring加载配置文件,那么spring容器搭建完成。...

斯武丶风晴
2017/09/21
0
0
最新SpringMVC框架搭建入门教程

Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。 Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。 Spring MVC的易用性、功能强大等优点已经被越来越多的...

2846613430
2016/04/06
78
0
mybitis懒加载Could not write JSON:No serializer...

spring mvc(spring boot) 整合Mybatis且开启懒加载,直接返回对象就会出现 除了关闭全局懒加载外,解决办法有3个 1.关闭该查询的懒加载 fetchType="eager" <collection ... fetchType="eager......

HeyS1
2018/06/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

python中类方法和静态方法区别

面相对象程序设计中,类方法和静态方法是经常用到的两个术语。 逻辑上讲:类方法是只能由类名调用;静态方法可以由类名或对象名进行调用。 在C++中,静态方法与类方法逻辑上是等价的,只有一...

xiangyunyan
今天
9
0
Hibernate SQLite方言

以下代码有参考过github上国外某位大佬的,在发文的最新稳定版Hibernate上是可用的,有时间再仔细分析一下 import org.hibernate.dialect.Dialect;import org.hibernate.dialect.function.S...

CHONGCHEN
今天
4
0
CentOS 7 MariaDB搭建主从服务器

本文编写环境为CentOS7。确保关闭SELinux,关闭防火墙或者防打开指定端口。具体信息如下 #master[root@promote ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [r...

白豆腐徐长卿
今天
11
0
介绍python中运算符优先级

下面这个表给出Python的运算符优先级,从最低的优先级(最松散地结合)到最高的优先级(最紧密地结合)。这意味着在一个表达式中,Python会首先计算表中较下面的运算符,然后在计算列在表上部...

问题终结者
今天
4
0
Spring Boot 2.x基础教程:快速入门

简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot来让...

程序猿DD
昨天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部