`

Servlet学习笔记之HttpServletResponse详解

 
阅读更多

对于一个Servlet在每次请求访问时,Servlet引擎都会创建一个描述请求消息和一个描述响应消息的对象。其中描述请求消息的对象实现了HttpServletRequest接口,而描述响应消息的对象实现了HttpServletResponse接口。

我们可以使用HttpServletResponse对象产生3种HTTP响应消息:状态行、响应消息头、响应正文。

Servlet引擎在创建了这2个对象之后,就会调用此Servlet对象的service方法来处理各种HHTP请求。

 

一、产生状态响应码

 

状态响应码存在于HTTP相应消息头的第一行,即状态行,如下所示:

HTTP/1.1  200  OK

 状态行分为3部分:HTTP版本、状态代码、状态消息

 

HTTP协议的状态响应码为3位整数,分为5类:

  1. 100~199:表示服务器成功接收请求,但要求客户端继续提交下一次请求才能完成全部处理过程。
  2. 200~299:表示服务端已成功接收请求,并完成了全部处理过程。
  3. 300~399:表示客户端请求的资源已经转移到了别的位置,并向客户端提供一个新的地址,这个地址由HTTP响应消息头的location字段指定。
  4. 400~499:表示客户端的请求有错误。
  5. 500~599:表示服务端出现错误。
设置状态响应码:
1、setStatus(int  sc)
sc表示状态码,它既可以直接使用整数形式,也可以使用在HttpServletResponse中定义的常量。
setStatus方法可以设置任何HTTP响应消息的状态码,并生成相应状态行。
由于响应状态行中的协议版本和状态消息是由服务器决定的,因此只需设置状态响应码就可以了。
2、sendRedirect(String  location)
location指定重定向的URL,该URL既可以是绝对的(http://www.baidu.com),也可以是相对的。
该方法用更快捷的方式来设置响应状态吗302,表示需要客户端重定向URL。
3、sendError
public  void  sendError (int  sc)  throws  IOException
public  void  sendError (int  sc, String  msg)  throws  IOException
 该方法用于发送表示错误消息的状态码(也就是400~599之间的状态码),而且还可以设置状态消息。
二、设置响应消息头
HTTP 响应消息头部实例:

Status:OK - 200 
Date:Sun, 01 Jun 2008 12:35:47 GMT
Server:Apache/2.0.61 (Unix)
Last-Modified:Sun, 01 Jun 2008 12:35:30 GMT
Accept-Ranges:bytes
Content-Length:18616
Cache-Control:max-age=120
Expires:Sun, 01 Jun 2008 12:37:47 GMT
Content-Type:application/xml
Age:2
X-Cache:HIT from 236-41.D07071951.sina.com.cn 
Via:1.0 236-41.D07071951.sina.com.cn:80 (squid/2.6.STABLE13)
Connection:close 
 1、addHeader与setHeader方法
public void addHeader(String name, String value);
public void setHeader(String name, String value);
//name表示字段名,value表示字段值
 注意:
1、如果name所指定的字段名已经存在,setHeader会用value来覆盖旧的字段值,而addHeader会      增加一个同名的字段(HTTP响应消息头允许存在多个同名的字段)。
2、name参数不区分大小写。
2、addIntHeader与setIntHeader方法
response提供了2个专门设置整形字段值的方法,这2个方法的区别与addHeader和setHeader相同。
public void addIntHeader(String name, int value);
public void setIntHeader(String name, int value);
//name表示字段名,value表示字段值
 
3、addDateHeader与setDateHeader方法
response提供了2个专门设置日期字段值的方法,这2个方法的区别与addHeader和setHeader相同。
public void addDateHeader(String name, long date);
public void setDateHeader(String name, long date);
//name表示字段名,date表示字段值
 HTTP响应头中的日期一般为GMT时间格式,这2个方法省去了将字1970年1月1日0时0分0秒开始计算的一个以毫秒为单位的长整形数值转换为GMT时间字符串的麻烦。
4、setContextType
该方法设置Content-Type字段的值。(即设置MIME类型)
public void setContentType(String type)
 如:response.setContentType("text/html;charset=GBK");
5、setCharacterEncoding
public void setCharacterEncoding(String ecode)
 这个方法实际上是设置Content-Type字段的字符集部分。
注意:
在使用这个方法之前,如果Content-Type不存在,则必须先添加Content-Type,否则该方法设置的字符集类型也不会出现在响应消息头上。
6、setContentLength
该方法用于设置相应正文的大小,单位是字节。
Servlet引擎会根据向客户端实际输出的响应正文的大小自动设置Content-Length字段的值。
7、containsHeader
public boolean containsHeader(String name)
 该方法用于检查某个字段是否在响应消息头中存在,如果存在,则返回true,否则返回false。
 
三、产生响应正文
为了向客户端返回响应正文,response提供了2个方法:getWriter()和getOutputStream()。
getWriter方法返回一个字符输出流对象,getOutputStream方法返回一个字节输出流对象。
这2个方法是互斥的,也就是说,调用一个方法后就不能再调用另一个方法。
1、getWriter
public PrintWriter getWriter() throws IOException
 如果响应正文全部是字符文本,并且需要进行编码转换,建议使用gatWriter方法。
从getWriter方法返回的PrintWriter对象不仅能很方便的向客户端返回相应正文,而且还会根据响应消息头的Content-Type所指定的字符编码格式自动转换响应正文(PrintWriter返回的响应正文是编码转换后的文本)。
//示例
response.setContentType("text/html;charser=utf-8");
PrintWriter out = response.getWriter();
out.println("中国");
 注意:
如果不指定相应正文的编码格式,PrintWriter就会按ISO8859-1字符集编码格式进行转换,而ISO8859-1无法对中文进行编码,就会导致乱码。
建议尽量手动关闭PrintWriter对象(虽然Servlet引擎会自动关闭PrintWriter对象)。
 
2、getOutputStream
public ServletOutputStream getOutputStream() throws  IOException;
 如果响应正文是非字符文本的数据或者是不需要进行编码转换的字符文本,建议使用字节输出流的方式返回响应正文。
使用ServletOutputStream返回字符文本:
1、将字符文本的响应正文转换为字节后返回
OutputStream out = response.getOutputStram();
out.write("中国".getBytes());
 如果想用其他的字符编码格式发送响应正文,需要通过getBytes方法获得字符串的相应字符编码格式的字符流。
response.setContentType("text/html;charset=utf-8");
OutputStream out = response.getOutputStream();
out.write("中国".getBytes("utf-8"));
 
2、将字节流转换为OutputStreamWriter后直接输出字符文本。
OutputStream out = response.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(out);
writer.write("中国");
writer.close();//这行必须写,否则无法输出响应正文
 
四、重定向
response.sendRedirect("http://www.baidu.com");
 
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    HttpServletRequest和HttpServletResponse的必备包

    Java中,引入javax.servlet.http.HttpServletRequest和javax.servlet.http.HttpServletResponse包的必备jar包:org.apache.commons.httpclient.jar

    httpServletResponse学习

    httpServletResponse学习笔记

    java HttpServletRequest和HttpServletResponse详解

    主要介绍了java HttpServletRequest和HttpServletResponse详解的相关资料,需要的朋友可以参考下

    servlet2.4doc

    addCookie(Cookie) - Method in interface javax.servlet.http.HttpServletResponse Adds the specified cookie to the response. addDateHeader(String, long) - Method in class javax.servlet....

    javax.servlet 的JAR包

    javax.servlet JAR包,解决找不到 import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; jar包问题

    servlet-api-2.4.jar.zip

    javax.servlet.http.HttpServletResponse javax.servlet.http.HttpSessionListener javax.servlet.ServletContextAttributeEvent javax.servlet.ServletRequestAttributeEvent javax.servlet....

    javax.servlet.jar下载

    javax.servlet.http.HttpServletResponse.class javax.servlet.http.NoBodyResponse.class javax.servlet.http.NoBodyOutputStream.class javax.servlet.http.HttpServletRequestWrapper.class javax.servlet....

    servlet-api.zip

    import javax.servlet.annotation.WebServlet; import javax.servlet.http.*;...import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.ServletException;

    servlet-api.jar

    servlet-api.jar,可以解决程序包javax.servlet.http不存在import javax.servlet.http.HttpServletResponse;问题

    HttpServletResponse

    HttpServletResponse

    Servlet项目实践 实现学生信息系统的全部代码

     按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet 二、Servlet的运行过程 Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:  ①Web服务器首先检查...

    HttpServletResponse对象、HttpServletResponse应用、请求重定向

    HttpServletResponse对象、HttpServletResponse应用、请求重定向

    servlet3.0新特性源代码

    import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; /** * @project servlet3.0 * servlet3.0的文件上传 * @date:2012-5-21 *在创建项目的时候首先添加Tomcat7.x的支持,然后把...

    JSP/Servlet Java面试逻辑题

    1、说一说Servlet的生命周期?★★★★★ 答: servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。 这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。 2、...

    Struts2中Servlet的配置

    HttpServletResponse/HttpServletRequest,像servlet中使用这两个对象一样。 2、使用struts2提供的ActionContext类直接获取Servlet API。 在同一个项目中,如果既用到servlet又用了struts框架,运行项目时可能无法...

    servlet運行原理詳解 自我學習整理

    Servlet體系結構是建立在java多線程機制之上的,它的生命週期是由web容器負責管理的。當user從client端向web服務器發送一個http請求時,服務器就會分配一個線程來服務這個http請求,web容器會檢查是否有與此http url...

    javax.servlet-api

    提供编写servlet时要用到 HttpServletRequest和HttpServletResponse 等对象的

    HttpServletRequest和HttpServletResponse的讲解

    HttpServletRequest和HttpServletResponse的讲解,讲解了用法,案例

Global site tag (gtag.js) - Google Analytics