`
阅读更多

在spring  MVC中如何获取请求体呢?

在spring MVC中如何获取请求要素呢?

通过如下方法:

/**
	 * Compatible with GET and POST
	 * 
	 * @param request
	 * @return : <code>String</code>
	 * @throws IOException
	 */
	public static String getRequestQueryStr(HttpServletRequest request,
			String charEncoding) throws IOException {
		String submitMehtod = request.getMethod();
		if (submitMehtod.equalsIgnoreCase("post")) {
			byte[] bytes = getRequestPostBytes(request);
			String charEncoding2 = request.getCharacterEncoding();// charset
			System.out.println("[getRequestQueryStr]charEncoding:"
					+ charEncoding2);
			System.out.println("[getRequestQueryStr]Content-Type:"
					+ request.getHeader(Constant2.REQUEST_HEADER_CONTENT_TYPE));

			if(ValueWidget.isNullOrEmpty(charEncoding)){
				charEncoding=SystemHWUtil.CHARSET_UTF;
			}
			return new String(bytes, charEncoding);
		} else {// form method :Get
			return request.getQueryString();
		}
	}

 对GET请求的参数是没有问题的,但是对于POST请求获取不到为什么呢?

因为spring MVC已经获取了一遍request的stream,所以再次获取时是为空的,(这是输入流的特性,可以查查官网API),所以我获取到request 的InputStream之后调用reset,但是报错,不支持reset操作.

怎么办呢?

在spring MVC 的控制器中使用@RequestBody 注解,作用是获取请求体,格式是字节数组,见代码

@ResponseBody
	@RequestMapping(value = "/jsonStub", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)
	public String json(Model model, HttpSession session,@RequestBody byte[]bytes,
			HttpServletRequest request, String callback) throws IOException {
		Map map=WebServletUtil.parseRequest(request, null);
		if(ValueWidget.isNullOrEmpty(map)){
			String postStr=new String(bytes,SystemHWUtil.CURR_ENCODING);//username=huangwei&password=123
			System.out.println("postStr:"+postStr);//username=%E9%BB%84%E5%A8%81&password=123
			postStr=URLDecoder.decode(postStr,SystemHWUtil.CURR_ENCODING);//{"username":"黄威","password":"123"}
			map=WebServletUtil.parseRequestStr(postStr, true);
		}
		String content = HWUtils.getJsonP(map, callback);
		return content;
	}

 

@RequestBody后紧跟的参数将被注入请求体的字节数组(spring mVC帮我们完成的).

注意:request.getInputStream() 读取一次之后,再次读取就读取不到

上述代码依赖的方法:

/***
	 * Get request query string, form method : post
	 * 
	 * @param request
	 * @return byte[]
	 * @throws IOException
	 */
	public static byte[] getRequestPostBytes(HttpServletRequest request)
			throws IOException {
		int contentLength = request.getContentLength();
		/*当无请求参数时,request.getContentLength()返回-1 */
		if(contentLength<0){
			return null;
		}
		byte buffer[] = new byte[contentLength];
		for (int i = 0; i < contentLength;) {

			int readlen = request.getInputStream().read(buffer, i,
					contentLength - i);
			if (readlen == -1) {
				break;
			}
			i += readlen;
		}
		return buffer;
	}

	/***
	 * Get request query string, form method : post
	 * 
	 * @param request
	 * @return
	 * @throws IOException
	 */
	public static String getRequestPostStr(HttpServletRequest request)
			throws IOException {
		byte buffer[] = getRequestPostBytes(request);
		String charEncoding = request.getCharacterEncoding();
		if (charEncoding == null) {
			charEncoding = "UTF-8";
		}
		return new String(buffer, charEncoding);
	}

 

参考:http://json20080301.iteye.com/blog/1874074?utm_source=tuicool

0
2
分享到:
评论

相关推荐

    SPRING MVC 的请求参数获取的几种方法

    SPRING MVC 框架中,获取请求参数是非常重要的一步,下面将介绍 SPRING MVC 中获取请求参数的几种方法。 1. 使用 @PathVariable 注解获取路径中传递参数 在 SPRING MVC 中,可以使用 @PathVariable 注解获取路径中...

    Spring MVC请求参数与响应结果全局加密和解密详解

    在这种情况下,我们需要兼容这两种ContentType提交方式的请求体。 在响应结果中,我们同样需要对响应结果进行加密。为了简单起见,我们可以采用同样的AES对称秘钥为"throwable"进行加密。 在Spring MVC中,我们...

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

    十七、Spring MVC如何取得Spring管理的bean:阐述了如何在Spring MVC中获取Spring容器管理的Bean,以便进行业务处理。 十八、Spring MVC多视图控制器:解释了如何配置和使用Spring MVC的多视图控制器来处理不同的...

    spring mvc 拦截器获取请求数据信息.rar

    本压缩包“spring mvc 拦截器获取请求数据信息.rar”提供了关于如何在Spring MVC中使用拦截器来获取和处理请求数据的示例代码。 首先,我们来理解一下Spring MVC中的拦截器是如何工作的。拦截器是基于Java的动态...

    spring mvc 4.0

    8. **异步处理**:Spring MVC 4.0引入了异步请求处理,通过@ControllerAdvice和@Async注解,可以实现后台任务的异步执行,提高响应速度。 9. **多Part文件上传**:支持多文件上传,利用MultipartFile接口处理上传...

    Spring MVC使用Demo

    在Spring MVC中,Controller处理用户的请求,Model存储数据,而View负责渲染结果。 创建Spring MVC项目的第一步通常是设置开发环境。这通常包括安装Java Development Kit (JDK)、配置IDE(如IntelliJ IDEA或Eclipse...

    SpringMVCDemo:Spring MVC 框架知识案例

    3.Spring MVC 请求参数的获取案例 4.Spring MVC 域对象共享数据案例 5.Spring MVC @ModelAttribute 注解案例 6.Spring MVC 国际化案例 7.Spring MVC 请求转发与请求重定向案例 8.Spring MVC 下载 Excel 文档的需求...

    Spring mvc 教程

    - **消息转换器**:用于处理不同类型的请求体和响应体。 - **使用 MVC Java 编程进行高级定制**:通过 Java 配置类来定制 Spring MVC 的行为。 - **使用 MVC 命名空间进行高级定制**:XML 配置文件中的命名空间可以...

    将spring mobile集成到spring mvc

    在现代Web开发中,Spring框架是Java领域中最受欢迎的全栈解决方案之一,而Spring MVC作为其一部分,提供了强大的MVC(Model-View-Controller)架构支持。Spring Mobile是Spring框架的扩展,专为移动设备优化,它使得...

    最全的Spring MVC注解例子,异步请求,错误处理

    在这个“最全的Spring MVC注解例子”中,我们将深入探讨Spring MVC的核心注解,以及如何实现异步请求处理和错误管理。 1. **Spring MVC核心注解** - `@Controller`:标记一个类为处理HTTP请求的控制器。这是Spring...

    精通Spring MVC4

    @RequestParam用于获取URL查询参数,@PathVariable用于处理RESTful风格的URL,@RequestBody用于接收JSON或XML格式的请求体。 4. **视图解析:ViewResolver** 视图解析器如InternalResourceViewResolver负责根据...

    spring-MVC.zip_Java spring mvc_spring mvc_spring mvc

    6. **注解驱动开发**:Spring MVC支持使用注解来简化配置,如@RequestMapping用于映射请求,@RequestParam用于获取请求参数,@PathVariable用于处理URL路径变量。 7. ** ModelAndView**:这个类是用来存储模型数据...

    spring mvc restful service

    通过`@RequestParam`注解,可以从URL查询参数或请求体中获取字符串。 - **JSON**:Spring MVC使用Jackson库来序列化和反序列化JSON数据。`@RequestBody`用于将请求体中的JSON数据转换为Java对象,而`@ResponseBody`...

    Spring mvc5.0.3 所有jar包

    7. **参数绑定**: Spring MVC可以自动将请求参数绑定到Controller方法的参数上,无需手动获取。支持的参数类型包括基本类型、复杂对象、数组和集合。 8. **数据验证**: 通过集成JSR-303/JSR-349(Bean Validation)...

    Spring MVC 4.2.4.RELEASE 中文文档

    **Spring MVC 4.2.4.RELEASE 中文文档** Spring MVC是Spring框架的一个核心组件,专注于构建Web应用程序。它提供了模型-视图-控制器(MVC)架构,帮助开发者组织和分离应用的业务逻辑、数据处理以及用户界面。...

    spring mvc mybatis 整合源码,带数据库脚本,带详细注释

    - Spring MVC是基于Model-View-Controller(MVC)设计模式的Web应用框架,提供了一种组织和处理请求的机制。 - 它的核心组件包括DispatcherServlet、HandlerMapping、HandlerAdapter、ModelAndView和ViewResolver...

    Spring mvc 国际化

    3. 使用RequestContext的getMessage方法:在Spring MVC的Controller中,可以使用RequestContext的getMessage方法来获取对应的国际化文本。例如,在Controller中可以根据当前用户的语言设置,获取"welcome"对应的文本...

    Spring MVC简单例子

    Spring MVC提供了`@RequestParam`注解来获取请求参数。 5. **数据持久层整合Hibernate3**:使用Hibernate3作为ORM(对象关系映射)工具,简化数据库操作。这可能涉及到实体类、配置文件、SessionFactory的创建,...

    spring mvc 3_demo

    Spring MVC是Spring框架的一个核心模块,专门用于处理Web应用程序的请求和响应。在这个"Spring MVC 3_demo"中,我们重点探讨的是使用注解来实现Spring MVC 3的应用。注解在Spring MVC中扮演着重要角色,它们简化了...

Global site tag (gtag.js) - Google Analytics