`
javaest
  • 浏览: 61328 次
  • 性别: 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());
   }
}

其实这样也不麻烦。

相关推荐

    spring mvc+ajax

    当用户发起请求时,Spring MVC的DispatcherServlet会拦截这个请求,然后根据请求信息找到对应的HandlerMapping,进一步调用相应的Controller处理业务逻辑。Controller处理完后,会返回一个ModelAndView对象,包含着...

    Spring + Hibernate + Spring mvc +Ajax 整合

    Spring、Hibernate、Spring MVC 和 Ajax 是四个在Java Web开发中广泛应用的技术框架,它们共同构建了一个高效、灵活且功能丰富的后端系统。以下是对这些技术及其整合应用的详细说明: Spring框架是一个全面的企业级...

    spring3 mvc 用 jquery ajax 交互

    总结,结合Spring MVC的Controller和jQuery的AJAX功能,开发者可以构建出更加动态、响应式的Web应用。这种交互方式使得前端可以灵活地与后端进行数据交换,而无需每次都刷新整个页面,提升了用户体验。在实际开发中...

    Spring MVC 教程快速入门 深入分析

    十五、Spring MVC处理ajax请求:讲解了如何在Spring MVC中处理异步JavaScript和XML(AJAX)请求,包括配置和控制器中的代码实现。 十六、Spring MVC关于写几个配置文件的说明:介绍了在Spring MVC项目中需要配置...

    Spring MVC与Ajax交互源码

    例如,当用户在前端进行某些操作,如提交表单,我们可以使用Ajax发送POST请求到Spring MVC的Controller,Controller处理业务逻辑后,将结果以JSON或其他格式返回。JavaScript接收到响应后,可以在前端动态更新页面,...

    spring mvc 整合包

    在这个"spring mvc 整合包"中,我们很可能会找到一系列与Spring MVC相关的库和配置文件,以便于快速搭建开发环境。 1. **MVC架构**:MVC是一种设计模式,将业务逻辑、数据和用户界面分离。在Spring MVC中,...

    spring第11章--ajax,上传下载,拦截器.rar_spring mvc_spring 下载_spring 使用ajax

    - **Spring MVC的Ajax响应**:返回的数据通常用@ResponseBody注解包裹,以便Spring MVC可以将其转换为JSON或其他格式,供前端JavaScript处理。 2. **文件上传**: - **MultipartFile接口**:Spring MVC提供...

    mvc-ajax.rar_spring mvc

    在IT行业中,Spring MVC是一个广泛使用的Java Web框架,它为构建高效、模块化的Web应用程序提供了强大的支持。在本示例中,“mvc-ajax.rar_spring mvc”是一个包含使用Ajax技术与Spring MVC集成实现账号添加功能的...

    spring mvc + ibatis + Oracle + ajax 轻量级架构搭建及详解

    Spring MVC的核心组件包括DispatcherServlet、HandlerMapping、Controller、ViewResolver等,它们协同工作以完成请求的处理流程。 接着,我们来看iBATIS。iBATIS提供了一种将SQL语句与Java代码分离的方法,使得...

    Spring MVC Helloword代码

    Spring MVC 是一个基于Java的...随着你对Spring MVC的深入学习,你可以了解到更多高级特性,如数据验证、国际化、异常处理、Ajax支持、RESTful API设计等。这只是一个起点,Spring MVC的强大功能等待着你去探索和利用。

    spring mvc+ajax 文件上传

    - 在Spring MVC的Controller中,定义一个处理文件上传的@RequestMapping注解的方法。这个方法通常会接受一个MultipartFile类型的参数,Spring MVC框架会自动处理上传的文件。 - 为了处理`multipart/form-data`类型...

    jQuery Spring MVC

    1. **Ajax通信**:Spring MVC 提供了`@ResponseBody`和`@RestController`注解,可以将后端处理的结果直接转换为JSON或XML格式返回给前端。jQuery 的`$.ajax()`或`$.get()`、`$.post()`方法可以发送Ajax请求,接收并...

    spring mvc

    Spring MVC 支持异步请求处理,可以轻松地处理 AJAX 请求。通常会使用 `@ResponseBody` 注解来返回 JSON 或 XML 数据格式。 #### 十六、Spring MVC 配置文件说明 Spring MVC 支持多个配置文件,每个配置文件可以...

    Spring MVC异步模式

    在Spring MVC框架中,异步模式允许我们处理耗时的操作,如大数据处理、长时间的网络请求等,而不阻塞主线程。这种方式提高了系统的响应速度,改善了用户体验。本篇文章将深入探讨Spring MVC中的异步处理机制,以及...

    Spring MVC Cookbook(PACKT,2016).pdf

    1. **Spring MVC基本概念**:首先,了解Spring MVC的基本架构,包括DispatcherServlet、Controller、Model、View和ViewResolver等组件的角色和交互方式。 2. **配置Spring MVC**:学习如何通过XML或Java配置来设置...

    spring mvc 简单demo

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为构建RESTful应用程序提供了强大的支持。这个简单的Demo将向我们展示如何使用Spring MVC创建一个基本的Web应用。在这个过程中,我们将涉及控制器、视图解析器、...

    spring mvc上传文件

    在本文中,我们将深入探讨如何使用Spring MVC框架与Ajax技术结合来实现文件上传的功能。Spring MVC是Spring框架的一部分,提供了...随着对Spring MVC和Ajax理解的深入,你可以根据实际需求进行更复杂的功能定制和优化。

    Spring MVC不能直接接收list类型参数的问题

    对于基于 Java 的 Spring MVC 框架而言,处理这种交互通常需要理解如何正确地接收前端发送的数据。本文探讨的是一个常见的问题——Spring MVC 无法直接接收 List 类型参数。 #### 问题描述 当前端使用 jQuery 向...

Global site tag (gtag.js) - Google Analytics