您的位置:首页 > 理论基础 > 计算机网络

HttpServletResponse(响应)对象

2013-07-17 10:34 585 查看
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。
HttpServletResponse对象

    HttpServletResponse对象服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响  应状态码的方法。

头字段(全静态)
1、SC_NOT_FOUND:404
2、SC_MOVED_TEMPORARILY:302
3、SC_NOT_MODIFIED:304
4、SC_TEMPORARY_REDIRECT:307
5、SC_INTERNAL_SERVER_ERROR:500
常用方法:
1、setStatus(int
sc):设置状态码。
2、setHeader(Stringname,String
value):设置头。(将set改为add为加入,不是覆盖)
3、setDateHeader(Stringname,
long date):设置range头。(将set改为add为加入,不是覆盖)
4、setIntHeader(Stringname,
int value):设置整数头。(将set改为add为加入,不是覆盖)
5、getOutputStream:获取字节流。
6、getWriter:获取字符流。

向客户端浏览器输出数据
字节流输出中文
//输出gb2312的数据,没有问题
public void test1(HttpServletResponse response) throws IOException{
String data = "中国";
OutputStream out = response.getOutputStream();
out.write(data.getBytes());
}
//方式一:输出UTF-8的数据,有问题,需要控制浏览器以utf-8打开
public void test2(HttpServletResponse response) throws IOException{
//使用http协议控制浏览器以utf-8打开下面发送的数据
response.setHeader("content-type","text/html;charset=UTF-8");
String data = "中国";
OutputStream out = response.getOutputStream();
out.write(data.getBytes("UTF-8"));
}
//方式二:用<meta>标签模似一个http响应头,控制浏览器以UTF-8打开数据
public void test3(HttpServletResponse response) throws IOException{
response.getOutputStream().write("<meta http-equiv='content-type'content='text/html;charset=UTF-8'>".getBytes());
String data = "中国";
OutputStream out = response.getOutputStream();
out.write(data.getBytes("UTF-8"));
}
字节流输出数字
//输出数字要转成字符串,不然直接就查码表了。
public void test4(HttpServletResponse response) throws IOException{
//虽然用的是utf-8进行编码,可以不用指定浏览器用什么码表解码,因为数字通用
response.getOutputStream().write((120+"").getBytes("UTF-8"));
}
字符流输出中文
public void test1(HttpServletResponse response) throws IOException{
//更改response的码表,通知服务器用UTF-8码表去取response中的数据,然后写给客户机
response.setCharacterEncoding("UTF-8");
//通知浏览器以UTF-8码表打开回送的数据
//response.setHeader("content-type", "text/html;charset=UTF-8");
//以上两步sun公司封装成了一个代码,实际上写这一句就做了上面俩件事
response.setContentType("text/html;charset=UTF-8");
String data = "中国";
PrintWriter writer = response.getWriter();
writer.write(data);
}
练习:实现中文文件名的文件下载
public class ResponseDemo3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.获取需要下载的文件,用ServletContext对象的getRealPath方法(此方法可以获取文件名)
String path = this.getServletContext().getRealPath("/download/日本妞.jpg");
String filename = path.substring(path.lastIndexOf("\\")+1);
//2.通知浏览器以下载方式打开,文件名不要写死,并且下载的中文文件名必须要给过URL编码,用到URLEncoder对象的encode方法来指定
response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(filename, "UTF-8"));
//3.向浏览器写出数据
FileInputStream in = null;
try{
OutputStream out = response.getOutputStream();
in = new FileInputStream(path);
byte buffer[] = new byte[1024];
int len = 0;
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
}finally{
//对于关流,一定要这样进行处理,记得判断流不为空
if(in!=null){
in.close();
}
}
}

控制浏览器定时刷新网页
发送http头(REFRESH)
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data = "中国";
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//方式一设置refresh头(每隔3秒刷新)
response.setHeader("refresh", "3");
//用meta标签实现3秒后刷新到index.jsp 注:代码要写在setContentType之前,否则指定的码表发不过去
response.getWriter().write("<meta http-equiv='refresh' content='3;url=/day06/index.jsp'>");
response.getWriter().write(data);
}


 
请求重定向
    定义:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源。
    细节:请求重定向下,浏览器向服务器发送了2次请求,request和response对象分别有两个,并且浏览          器的地  址栏会发生变化(由于要发送两次请求,用多了重定向服务器压力会很大)。
    用途:它只适合用在一些特定的场景下,例如用户登陆成功后,自动跳转到主页上去。
eg:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//原理为设置302状态码,让服务器找别人,再设置location头,指定跳转的地址
/*response.setStatus(302);
response.setHeader("location", "/day06/index.jsp");*/
//sun公司将以上封装成sendRedirect方法,直接传入要跳转的地址即可
response.sendRedirect("/day06/index.jsp");
}

response注意事项
    1、getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不 
       能再调用另一方法。比如在一个servlet中调用了getWriter方法,然后服务器又跳转到另一个servlet中,此servlet种调用getOutputStream也不行。当调用了会出现500服务器错误
      出现getWriter()has already been called for this response异常
      另外还有一种方式也会抛出此异常,就是在调用了getOutputStream后,又跳转到jsp中,虽然jsp 没有调用getWriter与之冲突,但是服务器会自动调用getWriter方法将jsp写给浏览器,因此又发生了冲突。
    2、Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返    回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。也就是说servlet调用的流对象可以不用关闭,但是自己写出来的流一定要关闭。
 
备注:
web工程中的地址的写法
    只要是写地址,建议大家最好以"/"开头
    1、看这个地址是给服务器用的,还是给浏览器用的。
    2、如果给浏览器用的,/代表网站  (webapps文件夹)
    3、如果给服务器用的,/代表当前web应用
    4、硬盘中的地址用\,网站上的/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息