getInputStream 方法用于返回的一个代表实体内容的输入流对象,其类型为javax.servlet.ServletInputStream。

getReader方法用于返回的一个代表实体内容的BufferedReader对象,返回的BufferedReader对象将实体内容中的字节数据按照请求消息中指定的字符集编码转换成文本字符串。

在调用getReader方法之前,可以调用ServletRequest的setCharacterEncoding方法指定其返回的BufferedReader对象所使用的字符集编码。

使用ServletInputStream对象读取文本格式的实体内容

分析文件上传的请求消息结构

ServletInputStream sis = request.getInputStream();

String filePath = getServletContext().getRealPath("/body.out");

FileOutputStream fos = new FileOutputStream(filePath);

byte[] buf = new byte[1024];

int len = sis.read(buf,0,1024);

while(len != -1)

{

fos.write(buf,0,len);

len = sis.read(buf,0,1024);

}

fos.close();

sis.close();

存储在ServletRequest对象中的对象称之为请求域属性,属于同一个请求的多个处理模块之间可以通过请求域属性来传递对象数据。

与请求域属性相关的方法:

setAttribute方法

getAttribute方法

removeAttribute方法

getAttributeNames方法

请求域属性的典型应用

MVC设计模式将一次请求的响应过程分成三个功能模块(一般称之为层)来协同完成,这三个模块分别是Model(模型层)、View(视图层)、Controller(控制层)。

Model是可作为JavaBean使用的业务对象;View是负责创建显示界面的JSP页面;Controller通常是一个接收用户请求的Servlet程序,它根据请求创建相应的model对象和调用model对象的业务方法,最后再选择一个View去创建网页文档内容并回送给客户端。

Controller调用RequestDispatcher.forward方法将请求转发给作为View的JSP页面,同时将Model对象作为请求域属性传递过去,作为View的JSP页面再从请求域中检索出Model对象。

getParameter方法的中文问题

getParameter等方法在读取的参数信息时,需要进行URL解码。

对于HTTP请求消息的请求行中的URL地址后的参数,getParameter等方法进行URL解码时所采用的字符集编码在Servlet规范中没有明确规定Tomcat中的ServletRequest对象的getParameter等方法默认采用ISO8859-1字符集编码进行URL解码,因此无法返回正确的中文参数信息 。

对于POST方式下的“application/x-www-form-urlencoded”编码格式的实体内容,getParameter等方法以ServletRequest对象的getCharacterEncoding()方法返回的字符集编码对其进行URL解码。

getCharacterEncoding()方法的返回值通常为null,对于这种情况,ServletRequest对象的getParameter等方法将使用默认的ISO8859-1字符集编码对实体内容中的参数进行URL解码,因此也将无法返回正确的中文参数信息。

ServletRequest接口中定义了一个setCharacterEncoding方法来设置请求消息中的实体内容的字符集编码名称,getParameter方法将以该方法设置的字符集编码对实体内容进行URL解码。

setCharacterEncoding方法设置的是请求消息中的实体内容的字符集编码名称,它只影响getParameter方法对POST方式下的“application/x-www-form-urlencoded”编码格式的实体内容进行URL解码的结果,而不能影响getParameter方法对HTTP请求消息的请求行中的URL地址后的参数进行URL解码的结果。

一些参考经验

如果提交FORM表单的页面与处理表单请求的Servlet程序都是由同一个人或同一个项目组开发的,那么只要在处理表单提交的Servlet程序中将传递给setCharacterEncoding方法的字符集编码设置为该表单所在页面的字符集编码即可。

如果Servlet程序可以接收来自多个其他站点的FORM表单提交的数据,而每个其他站点的页面所采用的字符集编码可能各不一样,要想让Servlet程序知道FORM表单内容的字符集编码,可以在FORM表单中增加一个隐藏字段来传递当前FORM内容的字符集编码名称。

只要超链接、FORM表单的action属性设置、请求转发和重定向的URL等任何一种请求路径中要包含参数,就必须对参数部分进行URL编码。对参数进行URL编码时所选择的字符集编码应尽量与当前页面的字符集编码保持一致,也可以用一个参数来指定URL编码内容的字符集编码名称。

所有标准的浏览器和客户机终端都支持UTF-8编码,如果WEB服务器要能兼容处理各个国家和地区版本的浏览器所传递的FORM表单信息,网页文档应当使用UTF-8编码格式。

在编写应用程序时应该注意一些隐性的字符编码错误。有些程序在输出时有编码转换错误,在读取输入时返回的字符串也有转换错误,当该程序输出它所读取到的有问题的字符串时,显示的结果可能是正常的中文字符。

摘自 宋利兴的专栏

getInputStream与getReader方法的更多相关文章

  1. getParameter() getInputStream()和getReader() 区别 这三种方法是有冲突的,因为流只能被读一次。

    我们经常用servlet和jsp, 经常用request.getParameter() 来得到数据. request.getParameter()request.getInputStream()req ...

  2. 获取【请求体】数据的3种方式(精)(文末代码) request.getInputStream() request.getInputStream() request.getReader()

    application/x- www-form-urlencoded是Post请求默认的请求体内容类型,也是form表单默认的类型.Servlet API规范中对该类型的请求内容提供了request. ...

  3. getParameter() getInputStream()和getReader() 区别

    我们经常用servlet和jsp, 经常用request.getParameter() 来得到数据. request.getParameter() request.getInputStream() r ...

  4. SERVLET类常用接口及方法

    SERVLET类常用接口及方法 2011-09-09 16:14:43    [size=xx-small]SERVLET类常用接口及方法2007年04月05日 星期四 04:46 P.M.基本类和接 ...

  5. JavaWeb chapter 4 Servlet处理HTTP请求

    1.  GET/POST提交方法: 用户在网页上点击一个超链接:(get) 用户提交在网页上提交表单:(post或者get) 用户在浏览器地址栏输入URL地址并回车(get) 2.  默认情况下都是使 ...

  6. java Servlet接口及应用

    基本类和接口 一.javax.servlet.Servlet接口 servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理 ...

  7. Servlet API中文版

    基本类和接口 一.javax.servlet.Servlet接口 servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理 ...

  8. java Servlet接口及应用(转)

    基本类和接口 一.javax.servlet.Servlet接口 servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理 ...

  9. SpringMVC 控制器默认支持GET和POST两种方式

    在SpringMVC的controller中,@RequestMapping只写路径,不包含RequetMethod.GET和RequetMethod.POST,HttpServletRequest的 ...

随机推荐

  1. yii2

    yii2框架官方说明文档 http://www.yiiframework.com/doc/guide/2.0/zh_cn/caching.page yii2创建您的第一个application应用 h ...

  2. 分享一个漂亮的ProgressBar控件

    codeprject上看到的一个漂亮的ProgressBar控件.是用vb.net开发的. C#直接在工具箱中引用即可. 地址:http://www.codeproject.com/Articles/ ...

  3. xml 与 DataSet 互相转换

    本文转载:http://www.cnblogs.com/30ErLi/archive/2010/09/21/1832694.html XmlDatasetConvert 该类提供了四种方法: 1.将x ...

  4. android常见错误-Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE

    在andorid进行调试的过程中,出现下面的错误: 解决方法: 修改一下应用程序描述符: <manifest xmlns:android="http://schemas.android ...

  5. android 74 下载文本

    页面: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tool ...

  6. 【Debian百科】巨页

    巨页 为什么使用巨页? 当一个进程使用一些内存的时候,CPU就把那部分内存标记成已被该进程使用的.为了提高效率,CPU会按4K字节块(它在很多平台上是默认值)分配内存.这些块被称作页.这些页可以被交换 ...

  7. 学习java随笔第九篇:java异常处理

    在java中的异常处理和c#中的异常处理是一样的都是用try-catch语句. 基本语法如下 try { //此处是可能出现异常的代码 } catch(Exception e) { //此处是如果发生 ...

  8. 自动化构建jenkins配置

    1.安装jdk7+tomcat7 2.下载msi安装文件(我是win7上安装,下载地址 http://Jenkins-ci.org/),文件安装路径选择\tomcat\webapps. 3.安装成功之 ...

  9. 4 C#和Java 的比较

    2007年11月1日    1.访问控制方面:C#有public.internal.protected.private,比java多了个internal,其实它跟java的包访问差不多,interna ...

  10. wamp使用方法【总】

    Apache与php配置:我们把php-5.2.9-Win32.zip解压到C盘根目录下,把文件夹名字改成PHP,这样方便一下. 1. 找到PHP目录下的“php.ini-dist”或者“php.in ...