黑马程序员技术交流社区
标题:
[石家庄校区]Request&Response
[打印本页]
作者:
Black_Y
时间:
2018-5-21 15:45
标题:
[石家庄校区]Request&Response
本帖最后由 小石姐姐 于 2018-5-23 14:45 编辑
Request&Response
`ServletContext中的getResourceAsStream(绝对路径 url)-返回的是一个文件的输入流InputStream方法读取Web工程中的文件
getRealPath(绝对路径 url)方法返回的是磁盘绝对路径
#ServletContext的功能
```
1.读取全局初始化参数
2.获得文件的MIME的类型.
3.作为域对象存取数据(重点)
4.读取web项目下的文件
```
#类加载器(重点掌握)
```
InputStream is = 类.class.getClassLoader().getResourceAsStream("db.properties");
```
#工具类<<通用性,方法重载,>>----编写思想
```
该抽取的抽取,当作一个参数传进来
方法出错了如何处理,是否需要判断...
```
##文件下载的方式
1.超链接下载.直接将文件的路径写到超链接的href中---前提:文件类型,浏览器不支持
2.手动编写代码的方式完成文件的下载(设置两个头和一个流:Content-Type:文件的MIME的类型 Content-Disposition:以下载的方式打开文件 InputStream:文件的输入流)
###处理request接受参数的中文乱码的问题
```
现在无论是get还是post提交中文的时候,都会出现乱码的问题.
post的解决方案:
post的参数在请求体中,直接到达后台的servlet.数据封装到servlet中的request中.request也有一个缓冲区.request的缓冲区也是ISO-8859-1编码.
设置request的缓冲区的编码.
request.setCharacterEncoding("UTF-8");--一定要在接收参数之前设置编码就OK.
get的解决方案:
1.修改tomcat的字符集的编码.(不推荐)
2.使用URLEncoder和URLDecoder进行编码和解码的操作
3.使用String的构造方法:
String(byte[] bytes,String charsetName)
通过使用指定的charset解码指定的byte数组,构造一个新的String.
```
#处理response乱码
```
使用字节流输入中文:
*有没有乱码?为什么?
**不一定?.
***解决:
****设置中文转成字节数组取出的时候的编码
****设置浏览器默认打开的时候编码
//设置浏览器默认打开的时候采用的字符集编码
response.setHeader("Content-Type","text/html;charset=UTF-8");
//设置中文转成字节数组的时候取出的编码
response.getOutputStrea().write("中文".getBytes("UTF-8"));
```
```
使用字符流输出中文:
*有没有乱码?为什么呢?
**一定会乱码.字符流输出的时候会有缓冲区
***response的字符流的缓冲区的默认的编码是ISO-8859-1 (老外发明的) ,这个编码根本不支持中文.
解决:
*设置response的字符流的缓冲区的编码.
*设置浏览器默认打开的时候采用的字符集编码.
//设置浏览器默认打开的时候采用的字符集编码
response.setHeader("Content-Type","text/html;charset=UTF-8");
//设置response的字符流的缓冲区的编码.
response.setCharacterEncoding("UTF-8");
response.getWriter().println("中文");
response.setContentType("text/html;charset=UTF-8");
```
#request的常用API
```
功能一.获得与客户机相关的信息
getMethod():返回请求方式
获得路径
getRequestURI()
getRequestURL()
获得IP地址
getRemoteAddr()
动态获得工程名
getContextPath()
```
```
功能二.获得页面提交的参数
```
```
功能三.作为域对象存取数据
```
#Request作为域对象存取数据
```
setAttribute(String name,String value);
Object getAttribute(String name);
request域对象的作用范围
一次请求的范围
创建:客户端向服务器端发送了一次请求以后,服务器就会创建一个request的对象
销毁:当服务器端对这次请求做出响应之后request域对象就会被销毁
```
#重定向和转发的区别(redirect和forward的区别)
```
一.重定向的地址栏会发生变化,转发的地址栏不变.
二.重定向两次请求两次响应,转发一次请求一次响应.
三.重定向路径需要加工程名,转发的路径不需要加工程名.
四.重定向可以跳转到任意网站,转发只能在服务器内部进行转发.
```
#乱码问题总结
###request请求时候的乱码
```
将请求的参数呈现在浏览器页面
get请求方式 String(byte[] bytes,String charsetName)通过使用指定的charset解码指定的byte数组,构造一个新的String.
post请求方式 request.setCharacterEncoding("UTF-8");--一定要在接收参数之前设置编码就OK.
```
###response响应时候的乱码
```
字节流输出方式:
//设置浏览器默认打开的时候采用的字符集编码
response.setHeader("Content-Type","text/html;charset=UTF-8");
//设置中文转成字节数组的时候取出的编码
response.getOutputStrea().write("中文".getBytes("UTF-8"));
字符流输出方式
//设置浏览器默认打开的时候采用的字符集编码
response.setHeader("Content-Type","text/html;charset=UTF-8");
//设置response的字符流的缓冲区的编码.
response.setContentType("text/html;charset=UTF-8");
```
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2