Servlet的HttpServletResponse对象

我们之前说到过, Web服务器收到一个http请求,会针对每个请求创建一个HttpServletRequest和HttpServletResponse对象,从客户端取数据找HttpServletRequest,而向客户端发送数据需要用到HttpServletResponse对象,我们几天就来收说这个HttpServletResponse。
首先,让我们来看看API文档,了解一下HttpServletResponse对象中有什么属性方法。我们可以从文档中看到,在字段摘要中,HttpServletResponse的字段都是一些HTTP状态码的封装,所以我们很多时候响应状态码,可以直接找HttpServletResponse中的状态码字段,我们只需要了解几个常用的状态码:
[quote]
SC_BAD_REQUEST 状态码400: 代表从客户端发来的请求在语句构成上是错误的。

SC_FORBIDDEN 状态码403: 代表你所发来的请求Server是知道存在的,但是Server拒绝返回给你这样的请求支援,简单的说就是服务器禁止你请求现在所要请求的资源。

SC_NOT_FOUND 状态码:404: 最常见的错误代码,代表所请求的资源不存在。

SC_INTERNAL_SERVER_ERROR 状态码500: 代表Http服务器内部错误,导致了无法正常满足请求,也就是服务器无响应。

SC_SERVICE_UNAVAILABLE 状态码503: 代表当前服务器临时的超负荷了,无法handle这个request。
[/quote]
还有很多状态码,这里就不一一累述了。但是大家要知道,基本上4打头的状态码都是客户端出问题,而5打头的状态码都是服务器端出的问题。
接下来我们来看看他的方法摘要,方法摘要中的方法不多,而我们其实常用到的也只是其中几个:
[quote]
addHeader和setHeader: 这两个方法都是设置响应头的,第一个方法是增加,如果该响应头的name存在,继续增加会增加多个相同name的响应头,而第二个方法在该响应头name存在的情况下,是修改该name下响应头value的内容。而这两个方法在HttpServletResponse中都有增强方法,就是addDateHeader,addIntHeader,setDateHeader,setIntHeader。一看就知道,当要设置的响应头是时间类型的或者Int类型的,可以用这两个方法。

sendRedirect: 该方法用于请求重定向,接收到了一个请求,使用response对象,将该请求重定向到另一个URL去。该方法传入的参数可以接受一个相对路径,而servlet容器必须在发送响应到客户端之前将其转换为绝对路径,如果传入路径以“/”开头,容器会解释这个路径为相对于容器root的路径,而以“/”开头,容器会直接解释为当前请求的URL。
[/quote]

了解完字段和方法,现在我们来谈谈HttpServletResponse的主要响应方式,他可以向客户端发送三种类型的数据:a.响应头b.状态码c.数据
而我们通常可以依靠响应头来控制乱码的问题,比如下面这段代码,他在响应之前设置了一个响应头,该响应头的内容如下,代表我需要浏览器以UTF-8来解码。

response.setHeader("Content-type","text/html;charset=UTF-8");


我们再看一段代码,下面这段代码表示设置response的编码方式是UTF-8,如果没有这段代码,Response对象通常使用默认的ISO8859-1的方式编码,中文就会出现乱码。这段代码和上面那段代码一般是结合在一起中,即设置了Response的编码方式,再设置浏览器的解码方式。

response.setCharacterEncoding("UTF-8");


其实我们可以通过下面这段代码将上面那两段代码整合,也能解决中文乱码问题。下面这段代码内部其实首先就设置了Response编码方式,并且设置了浏览器解码方式。

response.setContentType("text/html;charset=UTF-8");


最后我们再讲一段代码,是用Response对象设置文件下载。

String path = this.getServletContext.getRealPath(“/abc.jpg”);
String fileName = path.subString(path.lastIndexOf(“\\”));
Response.setHeader(“content-disposition”,“attachment;filename=”+URLENcode r.encode(fileName,”UTF-8”));


简单解释一下上面三段代码,第一段是用ServletContext获取到提供下载的文件的RealPath,这里我们要下载的文件放在webRoot目录下,名称叫abc.jpg。
第二段代码是通过截取字符串从全路径中获取到要下载的文件名。
最后一段也是最重要的一段,就是设置响应头,响应头的域不再是content-type了,而是content-disposition,而内容则是“attachment:filename=,这之后拼接了一个我们获得的文件名,但是这个文件名是用了URLENcoder将其编码为UTF-8了的。目的是在如果改文件名是中文,编码为UTF-8才能正常解码找到正确的文件名。至此,我们I实现了一个简单的文件下载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值