日期:2014-05-16  浏览次数:20368 次

Ext和springMVC结合实现json数据传输
第一种方式,使用springMVC内置的json支持
1.首先导入jackson的两个包jackson-core-lgpl-1.2.1.jar和jackson-mapper-lgpl-1.2.1.jar,后面附上了这两个包,可以下载。
2.配置springMVC的配置文件
<!--<mvc:annotation-driven/> -->
	<!-- 这样配置的目地是了支持json数据的转换 -->
	<bean
		class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
	<bean
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
                   <util:list id="beanList"> 
                     <ref bean="mappingJacksonHttpMessageConverter"/> 
                   </util:list> 
		</property>
	</bean>
	<bean id="mappingJacksonHttpMessageConverter"
		class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>text/html;charset=UTF-8</value>
			</list>
		</property>
	</bean>

3.前台Ext请求数据
var schemaEnNameStore = new Ext.data.Store({
		proxy : new Ext.data.HttpProxy({
					url : '/ext_project/metaTable.action?method=querySchemaEnName',
					type : 'ajax'
				}),
		reader : new Ext.data.JsonReader({
					root : 'root',
					type : 'json'
				}, [{
							name : 'schemaEnName',mapping:'param'
						}]),
		autoLoad : false
	});

4.后台controller处理并返回数据
@RequestMapping(params = "method=querySchemaEnName")
	@ResponseBody
	public Object handleQuerySchemaEnName() {
		try {
			List<ParamDto> schemaEnNameList = metaTableService.querySchemaEnNameTotal();
			Map<String,Object> map = new HashMap();
			map.put("root", schemaEnNameList);
			map.put("success", true);
			return map;
			 
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}


第二中方式,比较简单和原始

1.前台请求数据
var tableEnNameStore = new Ext.data.JsonStore({
				url : '/ext_project/metaTable.action?method=queryTableEnName',
				root : 'root',
				fields : [{
							name : 'tableEnName',mapping:'param'
						}],
				autoLoad : false
			})

2.后台处理并返回,使用JSONObject

@RequestMapping(params = "method=queryTableEnName")
	public void handleQueryTableEnName(HttpServletRequest req,HttpServletResponse response){
		try{
			String schemaEnName = req.getParameter("schemaEnName");
			List<String> list = metaTableService.queryTableEnNameBySchEnName(schemaEnName);
			List<ParamDto> tableEnNameList = new ArrayList();
			Iterator iterator = list.iterator();
			while(iterator.hasNext()){
				ParamDto pDto  = new ParamDto();
				pDto.setParam((String)iterator.next());
				tableEnNameList.add(pDto);
			}
			Map<String,Object> map = new HashMap();
			map.put("root",tableEnNameList);
			map.put("success", true);
			JSONObject obj = JSONObject.fromObject(map);
			PrintWriter writer = response.getWriter();
			writer.print(obj.toString());
		}catch(Exception e){
			e.printStackTrace();
		}
	}

第三种方式
    springMVC的MappingJacksonJsonView借助Jackson框架的ObjectMapper将模型数据转换为JSON格式输出,由于MappingJacksonJsonView也是一个bean,可以通过BeanNameViewResolver进行解析,因此须在配置文件中配置:
bean id="userListJson" calss="org.springframework.web.servlet.view.json.MappingJacksonJsonView" p:renderedAttributes="userList"/>

默认情况下,MappingJacksonJsoView会将所有的数据都输出为json,这显然是不合适的,你可以通过renderedAttributes指定模型中哪些属性需要输出。
    在controller中添加一个返回userListJson的逻辑视图的方法:
   
@requestMapping()
public String **(ModelMap map){
List<User> list = new ArrayList<User>();
map.addAttribute("userList",list);
return "userListJson"
}
    

这是我个人比较喜欢使用的几种方式,当然还有其他的很多方式,大家可以自己查查资料