Servlet应用---HttpServletRequest的应用
一.获取请求消息中的实体内容getInputStream和getReader方法
1.getInputStream方法是字节的输入流对象,返回的是一个代表实体内容的实体对象。类型为javax.servlet.ServletInputStream
2.getReader方法是返回的是一个BufferedReader的对象,返回的BufferedReader对象将实体内容中的字节数据按照请求消息中指定的字符集编码转换成文本字符串
注:在调用getRader方法之前,可以调用setCharacterEncoding方法指定其返回的BufferedReader对象所使用的字符集编码。
3.实例是文件上传-----------读取实体内容的举例
第一步:在html文档中写一个表单
<form method="post" action="testInput" name="form1" enctype="multipart/form-data">
请输入第一个参数:<input type="text" name="param1"/><br/>
<!-- 上传文件 -->
<input type="file" name="f1"/>
//提交
<input type="submit" name="ok" value="submit"/>
</form>
注:enctype="multipart/form-data"是来确保匿名上载文件的正确编码.
第二步:
第一种:
// 获取字符的输入流对象
BufferedReader br = request.getReader();
FileWriter fw = new FileWriter(“d:/ouc.txt”);
// 把读取到的字符放到数组里来保存
char[] arr = new char[1024];
// 并读取出来显示
while (br.read(arr) != -1) {
读取的字符数组从控制台输出或输入到一个指定的文件中
System.out.println(new String(arr, 0, arr.length));
//fw.write(arr);
}
fw.close();
第二种:
// 获取字符的输入流对象
BufferedReader br = request.getReader();
//通过上下文对象获取它的对象
ServletContext context = this.getServletContext();
//获取指定文件的真实路径
String filename = context.getRealPath("/out.txt");
//输出流把读取到的内容写到文件中去
FileWriter fw = new FileWriter(filename);
// 把读取到的字符放到数组里来保存
char[] arr = new char[1024];
// 并读取出来显示
while (br.read(arr) != -1) {
读取的字符数组从控制台输出或输入到一个指定的文件中
System.out.println(new String(arr, 0, arr.length));
//fw.write(arr);
}
fw.close();
二.请求参数中中文的读取问题
学习的原因:解决乱码的原因
1、 了解中文字符的URL编码
对Java中的某个字符串进行URL编码,其实是在对它的某种字符集编码(非Unicode码)数据进行URL编码,而Java中的字符串是以Unicode字符集编码存在的,所以,在对Java中的字符串进行URL编码时,必须指定是对这个字符串的哪种非Unicode的字符集编码进行URL编码。
浏览器对请求参数中的字符的某种字符进行的编码是URL编码
2、浏览器解析的步骤:
中(从文本框中输入的) ------utf-8的字符集是E4B8AD -----à 服务器会对它进行URL编码(%E4%B8%AD)----à 在解码后成为字节数组,按照某种字符编码进行解码, 编译之后的字符发送给Web服务器
3、 出现乱码的解决办法:
getParameter方法的中文问题
(1)getParameter等方法在读取的参数信息时,需要进行URL解码。
(2)对于HTTP请求消息的请求行中的URL地址后的参数,getParameter等方法进行URL解码时所采用的字符集编码在Servlet规范中没有明确规定Tomcat中的ServletRequest对象的getParameter等方法默认采用ISO8859-1字符集编码进行URL解码,因此无法返回正确的中文参数信息 。
(3)对于POST方式下的“application/x-www-form-urlencoded”编码格式的实体内容,getParameter等方法以ServletRequest对象的getCharacterEncoding()方法返回的字符 集编码对其进行URL解码。
(4)getCharacterEncoding()方法的返回值通常为null,对于这种情况,ServletRequest对象的getParameter等方法将使用默认的ISO8859-1字符集编码对实体内容中的参数进行URL解码,因此也将无法返回正确的中文参数信息。
(5)ServletRequest接口中定义了一个setCharacterEncoding方法来设置请求消息中的实体内容的字符集编码名称,getParameter方法将以该方法设置的字符集编码对实体 内容进行URL解码。
(6)setCharauanycterEncoding方法设置的是请求消息中的实体内容的字符集编码名称,它只影响getParameter方法对POST方式下的“application/x-www-form-urlencoded”编码格式的实体内容进行URL解码的结果,而不能影响getParameter方法对HTTP请求消息的请求行中的URL地址后的参数进行URL解码的结果。
注:Web服务器从请求消息中把每一个参数名和参数值分离出来的每一个参数名和参数值也会针对某种字符集编码进行URL解码
字符的编码方式是对实体内容的设置
4、 乱码出现的原因有几种情况
(1) 是在html文档中有设置字符编码的,
(2) 是在request中设置编码字符集
request.setCharacterEncoding("utf-8");
(3)是在request中设置编码字符集,
response.setContentType("text/html;charset=utf-8");
(4)在提交方式不同的时候,比如是用get方法提交的话,在控制台窗口就可能输出乱码,可以再service中修改为:
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" useBodyEncodingForURL="true"/>