`
javaest
  • 浏览: 60805 次
  • 性别: Icon_minigender_1
  • 来自: 长春
文章分类
社区版块
存档分类
最新评论

扩展Spring MVC 用以支持Controller对Ajax的处理

    博客分类:
  • JAVA
阅读更多
Spring Mvc中没有特别针对于Ajax请求的处理Controller.但是AbstractController和
SimpleFormController也是可以针对Ajax的请求给与相应的.但显得有一点点的不自然.
	@Override
	protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object cmd,
			BindException ex) {
		String userId=request.getParamater("userId");
                  Map userInfoMap=userDao.getUserBaseInfo(userId);
                  JSONObject object = new JSONObject();
                  object.put("userInfoMap",userInfoMap);
		response.setContentType("text/Xml;charset=gbk");
		PrintWriter out = null;
		try {
			out = response.getWriter();
		         out.println(object.toString());
		         
		}
		catch (IOException ex1) {
			ex1.printStackTrace();
		}finally{
                            out.close();
                   }
		return null;
	}

说明一下我向客户端页面response的是一个JSon对象,选择JSon这种数据格式的两个原因是:

  1. 体积小可降低流量.
  2. Js端解码十分方便,Js对JSon格式数据有原生的支持.

使用Spring Mvc原有的SimpleFormController,从上边的例子上看是可以实现的,但是每次都要写"将JSonObject写入流,关流的代码.很累,很麻纺."
所以,扩展了两个新的Controller,以简化对Ajax请求的处理.
JSONObjectAbstractController 用于简单的从request.getParamater参数的情况.
JSONObjectAbstractController 的原代码:
package com.javaest.ext.spring.mvc.controller;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public abstract class JSONObjectAbstractController extends AbstractController {

	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		JSONObject jsonObject = handleAjaxRequestInternal(request, response);
		response.setContentType("text/Xml;charset=gbk");
		PrintWriter out = null;
		try {
			out = response.getWriter();
			out.println(jsonObject.toString());
		}
		catch (IOException ex1) {
			ex1.printStackTrace();
		}
		finally {
			out.close();
		}

		return null;
	}

	protected abstract JSONObject handleAjaxRequestInternal(HttpServletRequest httpServletRequest,
			HttpServletResponse httpServletResponse) throws Exception;

}

JSONObjectSimpleFormController 用于自动将请求参数绑定到Command对象的情况.
JSONObjectSimpleFormController 的代码:
package com.javaest.ext.spring.mvc.controller;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;

public abstract class JSONObjectSimpleFormController extends SimpleFormController {

	@Override
	protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object cmd,
			BindException ex) {
		JSONObject object = onAjaxSubmit(request, response, cmd, ex);

		response.setContentType("text/Xml;charset=gbk");
		PrintWriter out = null;
		try {
			out = response.getWriter();
			out.println(object.toString());
		}
		catch (IOException ex1) {
			ex1.printStackTrace();
		}
		finally {
			out.close();
		}

		return null;
	}

	public abstract JSONObject onAjaxSubmit(HttpServletRequest request, HttpServletResponse response, Object cmd,
			BindException ex);

}


以下就是我为了支持Ajax请求的处理所扩展的SpringMvc Controller.
作者来自长春,一直在基于J2EE架构开发税务方面的应用.







分享到:
评论
21 楼 ccitkao 2008-09-08  
我们这的方法是直接扩展view.controller只负责获得数据,具体是jsp还是ajax都让view去决定.这样controller的耦合度就更低了.
20 楼 javaest 2008-08-07  
dakulaliu
的写法也不错。
我认为扩展出JSonController和JSonView的方法都是可以的,但JSonController这种方法不用在SPRINGMVC中加视图的配置了。
19 楼 dakulaliu 2008-08-07  
stworthy 写道
谢谢,我现在知道怎么做了,大体有二种方法,一是定义一个json view,二是按照Saro说的方法。
另外,在处理控制映射上,是http://www.sf.net/index.do?method=testIt的形式好些,还是http://www.sf.net/index/testIt.do的形式好些。目前大家是使用那种形式多些?


其实不需要单独实现一个controller,而只需要定义一个JsonView class就可以,当然SourceForge里面好像有人已经提交了一个JsonView的实现,你可以拿过来用的"http://sourceforge.net/project/showfiles.php?group_id=171425&abmode=1".

在Controller里面代码和一般的Controller代码没什么区别:
	@RequestMapping("/login_ajax.do")
	public String handleAjaxLogin(Model model) {
		model.addAttribute(JsonFieldNaming.PARA_UNLOGIN, Boolean.TRUE);
		return "jsonView";
	}


View Config in views.properties:
jsonView.(class)=net.sf.json.spring.web.servlet.view.JsonView
jsonView.contentType=application/json;charset=UTF-8


18 楼 stworthy 2008-08-05  
觉得扩展写个JsonView,然后在控制器中直接返回这个JsonView,似乎更好些。
17 楼 former 2008-08-04  
<p>我们的做法: <br/>spring2.5的Controller</p>
<p> </p>
<pre name='code' class='java'>@Controller
@RequestMapping("/agentAccount.do")
public class AgentAccountController extends AbstractController{
@RequestMapping(params = "method=preValidate", method = RequestMethod.POST)
public void preValidate(CrmAgentAccount agentAccount, BindingResult results, HttpServletResponse response)
throws IOException
{
new AgentAccountValidator(agentAccount, results).validate();
ajaxOutput(response, convert2JSONString(results.getAllErrors()));
}
}</pre>
<p> </p>
<p>父类中的2个方法处理ajax输出:</p>
<pre name='code' class='java'> protected String convert2JSONString(Object object)
{
JSONArray jsonObject = JSONArray.fromObject(object);
return jsonObject.toString();
}
protected void ajaxOutput(HttpServletResponse response, String outputString) throws IOException
{
response.setContentType("text/html; charset=GBK");
response.getWriter().write(outputString);
response.getWriter().flush();
}</pre>
<p> </p>
16 楼 javaest 2008-08-04  
可以基于这种方式任意扩展,现在我们在搞Flex,所以我也扩展了支持Flex HttpService的Controller。
15 楼 shuai45 2008-07-30  
个人感觉ajax(js+xml)在action中或者controller中等控制其中处理,即使处理的在完美,终究还要占据一定的代码量.这些代码量包括xml文件的输出和xml节点的输出.楼主的方法很不错.(因为这个问题,我换成了dwr)
14 楼 Saro 2008-07-30  
<div class='quote_title'>stworthy 写道</div>
<div class='quote_div'>
<div class='quote_title'>Saro 写道</div>
<div class='quote_div'>楼主封装的不错。<br/><br/>@Controller<br/>public class DemoController {<br/><br/>   @RequestMapping("list_data.do")<br/>   public void list_data(Writer writer){<br/>       JSONObject obj = new JSONObject();<br/>       //........<br/>       writer.write(obj.toString());<br/>   }<br/>}<br/><br/>其实这样也不麻烦。<br/></div>
<p> </p>
<p>writer直接输出JSON串,是否需要设置encoding,按照UTF-8编码后的输出在浏览器上是乱码,不知有何解决方法,当然每次输出前都设置encoding是个办法,但太麻烦了。</p>
</div>
<p> </p>
<p>用过滤器,spring有现成得。</p>
13 楼 stworthy 2008-07-25  
<div class='quote_title'>Saro 写道</div>
<div class='quote_div'>楼主封装的不错。<br/><br/>@Controller<br/>public class DemoController {<br/><br/>   @RequestMapping("list_data.do")<br/>   public void list_data(Writer writer){<br/>       JSONObject obj = new JSONObject();<br/>       //........<br/>       writer.write(obj.toString());<br/>   }<br/>}<br/><br/>其实这样也不麻烦。<br/></div>
<p> </p>
<p>writer直接输出JSON串,是否需要设置encoding,按照UTF-8编码后的输出在浏览器上是乱码,不知有何解决方法,当然每次输出前都设置encoding是个办法,但太麻烦了。</p>
12 楼 javaest 2008-07-25  
格局千秋啊.
11 楼 stworthy 2008-07-25  
谢谢,我现在知道怎么做了,大体有二种方法,一是定义一个json view,二是按照Saro说的方法。
另外,在处理控制映射上,是http://www.sf.net/index.do?method=testIt的形式好些,还是http://www.sf.net/index/testIt.do的形式好些。目前大家是使用那种形式多些?
10 楼 javaest 2008-07-25  
引用

stworthy 2008-07-15
如果想做成类似MultiActionController一样的AJAX支持,不知在SPRING中如何实现。即一个Controller,多个Action都是支持AJAX,都能返回JSON串的。

这是可以的,但你需要在这个基础之上继续扩展,明确一下你需要根据什么分发指定的方法.
是根据URL,还是request中的一个参数?很好扩展的.
9 楼 stworthy 2008-07-15  
如果想做成类似MultiActionController一样的AJAX支持,不知在SPRING中如何实现。即一个Controller,多个Action都是支持AJAX,都能返回JSON串的。
8 楼 kidd3166 2008-07-09  
引用
引用
[/b][b][/i][i][i][/i]
7 楼 ysy861 2008-05-12  
    
6 楼 raychl 2008-05-01  
Pdf、excel都有对应的view来做处理,是不是也可以为Json写一个专门处理Json的view呢?
5 楼 javaest 2008-04-29  
1456996541 10 小时前
不知道Spring的MVC可以与JS直接通信么?

JS直接通信?通信是指什么?是直接调用返回的Json对象?


4 楼 laiseeme 2008-04-29  
也可以在视图解析器里面writer.write(obj.toString());
3 楼 1456996541 2008-04-29  
不知道Spring的MVC可以与JS直接通信么?
2 楼 Saro 2008-04-28  
楼主封装的不错。

@Controller
public class DemoController {

   @RequestMapping("list_data.do")
   public void list_data(Writer writer){
       JSONObject obj = new JSONObject();
       //........
       writer.write(obj.toString());
   }
}

其实这样也不麻烦。

相关推荐

    Pro Spring MVC With Web Flow

    Spring MVC is a modern web application framework built upon the Spring Framework, and Spring Web Flow is a project that complements Spring MVC for building reusable web controller modules that ...

    spring mvc利用ajax向controller传递对象的方法示例

    主要给大家介绍了关于spring mvc利用ajax向controller传递对象的相关资料,文中通过示例代码将步骤介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来跟着小编一起学习学习吧。

    精通Spring.MVC

    Spring MVC is a modern web application framework built upon the Spring Framework, and Spring Web Flow is a project that complements Spring MVC for building reusable web controller modules that ...

    spring_MVC源码

    弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,...

    spring mvc 使用jquery 传json值给Controller时需要解决的问题

    NULL 博文链接:https://effort0829.iteye.com/blog/2111511

    spring-mvc-controller

    Spring MVC 控制器 使用 Spring MVC 的控制器层进行迭代的不同方式。 通过表格请求。 通过ajax请求。 通过 bean 进行参数化。 Bean 验证

    Picker:Spring MVC +Hibernate

    Picker的后台使用Spring MVC+hibernate+mysql,实现添加书籍,提问、做笔记,上传附件、照片,关注用户、关注问题,私信、好友动态,好友圈等功能。下面是功能交互图:#package介绍Controller层 .controller: 提供了...

    Spring MVC中Ajax实现二级联动的简单实例

    后台Controller: @RequestMapping(/faultType) @ResponseBody public Map&lt;String&gt; faultType(int id,HttpServletRequest request)throws IOException { String ReturnMessage = ; //获取所有子类故障类型 List...

    springboot+dubbo分布式架构,提供分布式缓存、分布式锁、分布式Session、读写分离

    MVC: 基于spring mvc注解,Rest风格Controller。Exception统一管理。 缓存和Session:注解redis缓存数据,Spring-session和redis实现分布式session同步,重启服务会话不丢失。 数据同步:基于redis的分布式锁。 Web...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发容器 2.5 小结 第二篇 ...

    信息管理系统开发MVC框架源码

    这是一款采用了ext.net+ibatis.net+spring.net(接管controller)技术搭建的开发框架,代码干净,已包含基础的系统功能模块。 可以快速上手开发企业的信息管理系统,也可提供oracle 11g版本框架非常适合二次开发人员...

    简单的SSM.txt

    Springmvc就是spring框架的一个模块,所以它可以和spring框架可以进行无缝整合,它是一个基于mvc设计思想的前端web框架,主要作用就是对前端请求进行处理。他的前端控制器是一个servlet.它的请求拦截是基于方法级别的....

    毕业设计基于ssm框架的购物管理系统源码+数据库

    项目结构描述: 该项目中有五个子模块。 shop-manager模块负责导入该项目所需要的所有依赖包。 shop-web模块负责存放前端代码以及项目的配置文件。 shop-controller模块负责...后台使用spring+spring mvc+mybatis框架。

    SpringBoot视频教程 快速上手

    第三章:SpringBoot之MVC支持 第一节:@RequestMapping配置url映射 第二节:@Controller处理http请求 第三节:@RestController处理ajax请求 第四节:@PathVariable获取url参数 第五节:@RequestParam获取请求参数 第...

    SpringMVC Employee Demo

    driven配置、InitBinder注解、数据的格式化、JSR303数据校验、错误消息的显示及国际化、Ajax返回JSON、使用HttpMessageConverter、国际化_通过超链接切换中英文、文件上传、自定义的拦截器、拦截器的零Xml配置、异常...

    java网上购物系统(毕业设计专用!!)帮导入,帮运行!

    这是一个基于ssm框架的购物系统 适用于即将毕业的计算机专业大学生的毕业项目 本项目用 IDEA 2019 Navicat15 javaJDK1.8 tomcat8.5.76 Maven3.6.1 ...4. 后台使用spring+spring mvc+mybatis框架。

    SpringMVC+Jquery实现Ajax功能

    SpringMVC:是基于Spring的一个子框架(MVC框架),功能强于Spring,这个框架主要是解决咱们Controller这一层的问题。 M:model-模型User V:view-视图jsp C:Controller-控制器servlet jQuery框架:是一个程序员使用...

    智能发票识别系统后台.zip

    Spring MVC + Spring + JDBC搭建后端框架,Controller负责接收请求,Service负责主要业务逻辑,Dao负责数据库访问 算法端用C++编写,java后端通过多线程+socket+TCP与算法端通讯,利用对象锁完成线程调度 利用redis...

    Grails权威指南

     10.2.1 示例a——扩展搜索功能  10.2.2 示例b——显示del.icio.us中的最新数据  10.2.3 测试服务  10.3 使用quartz进行作业调度  10.3.1 简单的作业  10.3.2 cron作业  10.4 作业实战 ...

    基于ssm框架的购物系统+源代码+文档说明

    后台使用spring+spring mvc+mybatis框架。 &lt;项目介绍&gt; 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,...

Global site tag (gtag.js) - Google Analytics