`

HttpServletResponse

阅读更多

HttpServletResponse
Web服务器会送给Web客户端的HTTP响应信息分为三部分:状态行、响应信息头、消息正文(实体内容)。ServletResponse作用是用于创建响应信息。
HttpServletResponse是ServletResponse的HTTP封装,用于封装HTTP响应信息,允许操作HTTP协议相关数据,包括响应头和状态码,支持Cookies和Session跟踪,定义一系列描述HTTP状态码的常量。

3.1    响应状态行
3.1.1    状态码常量
HttpServletResponse中声明了一批以SC_XXX为标识的状态码常量,例如:
SC_NOT_FOUND        对应状态码    404
SC_MOVED_TEMPORARILY        302等
3.1.2    setStatus
可以使用setStatus()方法设置HTTP响应信息状态码,并产生响应状态行。通常情况下Servlet不用调用HttpServletResponsesetStatus()方法来指定状态代码和产生响应状态行。
3.1.3    setError
setError()用于发送表示错误信息的状态码(比如404)到客户端,并清除缓冲区的内容。

3.2    构建响应信息头
ServletResponse中定义了若干产生HTTP响应信息头字段的方法。
3.2.1    addHeader/setHeader
用于设置HTTP响应消息的各种头字段。

Java代码 复制代码
  1. public void addHeader(String name,String value);   
  2. public void setHeader(String name,String value);  
public void addHeader(String name,String value);
public void setHeader(String name,String value);

 


3.2.2    addIntHeader/setIntHeader
用于设置HTTP响应信息中包含整数值的响应头的方法。

Java代码 复制代码
  1. public void addIntHeader(String name,int value);   
  2. public void setIntHeader(String name,int value);  
public void addIntHeader(String name,int value);
public void setIntHeader(String name,int value);

 



3.2.3    addDateHeader/setDateHeader
用于设置HTTP响应信息中包含日期值的响应头的方法。

Java代码 复制代码
  1. public void addDateHeader(String name,long date);   
  2. public void setDateHeader(String name,long value);  
public void addDateHeader(String name,long date);
public void setDateHeader(String name,long value);

 



3.2.4    setContentLength
用于设置响应信息的实体内容的大小,单位为字节。通常情况下不用设置setContentLength大小,Servlet引擎会自动设置Content-Length头字段。
3.2.5    setContentType
用于设置Servlet输出内容的MIME类型。
jpeg图像数据    则MIME为image/jpeg
xml格式数据则MIME为text/xml
Servlet引擎默认的输出类型为text/plain,普通文本类型,为网页类型为text/html。
在MIME类型后面还可以指定字符集类型:text/html;charset=GB2312
3.2.6    setCharacterEncoding
是Servlet API 2.4新增方法,用于设置输出内容的MIME声明中的字符集编码。对于HTTP来说就是设置Content-Type中的字符集编码部分。
3.2.7    setLocale
用于设置响应信息的本地化信息,对HTTP来说,他将设置Content-Language和Content-Type中的字符集编码部分。
在web.xml文件中可以通过设置locale-encoding-mapping-list元素来设置各种Locale和字符集编码之间的映射关系。

Xml代码 复制代码
  1. <locale-encoding-mapping-list>  
  2.     <locale-encoding-mapping>  
  3.         <locale>zh_CN</locale>  
  4.         <encoding>GB2312</encoding>  
  5.     </locale-encoding-mapping>  
  6. </locale-encoding-mapping-list>  
    <locale-encoding-mapping-list>
        <locale-encoding-mapping>
            <locale>zh_CN</locale>
            <encoding>GB2312</encoding>
        </locale-encoding-mapping>
    </locale-encoding-mapping-list>

 



3.2.8    Servlet中文乱码
可以通过设置HttpservletResponse的setCharacterEncoding()、setContentType()、setLocale()方法解决中文呢输出问题。

Java代码 复制代码
  1. resp.setCharacterEncoding("GB2312");   
  2. resp.setContentType("text/html;charset=GB2312");   
  3. resp.setLocale(Locale.CHINESE);   
  4. PrintWriter out = resp.getWriter();   
  5. out.println("<s>中文乱码处理</s>");  
resp.setCharacterEncoding("GB2312");
resp.setContentType("text/html;charset=GB2312");
resp.setLocale(Locale.CHINESE);
PrintWriter out = resp.getWriter();
out.println("<s>中文乱码处理</s>");

 



3.2.9    定期刷新网页

Java代码 复制代码
  1. resp.setHeader("Refresh""2");   
  2. resp.getWriter().println(new Date());  
resp.setHeader("Refresh", "2");
resp.getWriter().println(new Date());

 



3.2.10    禁止浏览器缓存当前文档内容

Java代码 复制代码
  1. resp.setDateHeader("Expires"0);   
  2. resp.setHeader("Cache-Control""no-cache");   
  3. resp.setHeader("Pragma""no-cache");  
resp.setDateHeader("Expires", 0);
resp.setHeader("Cache-Control", "no-cache");
resp.setHeader("Pragma", "no-cache");

 

注可以使用meta标签代替上面代码:

Html代码 复制代码
  1. <head>  
  2. <meta http-equiv="Expires" content="0"/>  
  3. <meta http-equiv="Cache-Control"  content="no-cache"/>  
  4. <meta http-equiv="Pragma"  content="no-cache"/>  
  5. </head>  
<head>
<meta http-equiv="Expires" content="0"/>
<meta http-equiv="Cache-Control"  content="no-cache"/>
<meta http-equiv="Pragma"  content="no-cache"/>
</head>

 



3.3    创建响应正文
ServletResponse时Servlet程序与Servlet引擎进行通信的接口,Servlet通过ServletResponse对象将响应正文传递给Servlet引擎,再由Servlet引擎将响应正文输出到客户端。

3.3.1    getOutputStream/getWriter
Servlet可以选择按照字节流或字符流形式输出正文分别对应的是getOutputStream和getWriter方法,输出对象分别为ServletOutputStream和PrintWriter。
PrintWriter输出字符文本内容时,内部会将字符串转换为某种字符集编码的字节数组后再进行输出,省去了开发人员从字符串到字符数组的转换。因此PrintWriter较ServletOutputStream更常用。但是当比如下载这种情况使用时就需要ServletOutputStream的字节流。
3.3.2    实现动态文件内容下载

Java代码 复制代码
  1. resp.setContentType("application/x-msdownload");   
  2. resp.setHeader("Content-Disposition""attachmeng;filename=test.txt");   
  3. ServletOutputStream outstream = resp.getOutputStream();   
  4. outstream.write("IBM".getBytes());   
  5. outstream.close();  
resp.setContentType("application/x-msdownload");
resp.setHeader("Content-Disposition", "attachmeng;filename=test.txt");
ServletOutputStream outstream = resp.getOutputStream();
outstream.write("IBM".getBytes());
outstream.close();

 




3.4    重定向于请求转发
在Servlet中需要调用另外资源来对浏览器的请求进行响应,在Servlet中提供2中方法:
1、    RequestDispatcher.forward()
2、    HttpServletResponse.setRedirect()

3.4.1    RequestDispatcher
RequestDispatcher实例是由Servlet引擎创建,用于包装一个要被其他资源调用的资源(Servlet、HTML、JSP等)。
Forward:将请求转发到RequestDispatcher对象封装的资源。
Include:将RequestDispatcher封装的资源作为当前响应内容的一部分包含起来。
在ServletContext接口中定义了获取RequestDispatcher对象的方法:getRequestDispatcher、getNamedDispatcher。
3.4.1.1    Include方法
RequestDispatcher.incude用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程服务器的服务器端包含功能。

Java代码 复制代码
  1. IncludingServlet   
  2. response.setContentType("text/html;charset=GB2312");   
  3. PrintWriter out = response.getWriter();   
  4. String china = "中国";   
  5. RequestDispatcher rd = getServletContext().getRequestDispatcher(   
  6. "/servlet/IncludedServlet?nation=" + china);// 包含IncludedServlet   
  7. rd.include(request, response);   
  8.   
  9. IncludedServlet   
  10. PrintWriter out = response.getWriter();   
  11. out.println("parameter:" + request.getParameter("nation") + "<br>");  
IncludingServlet
response.setContentType("text/html;charset=GB2312");
PrintWriter out = response.getWriter();
String china = "中国";
RequestDispatcher rd = getServletContext().getRequestDispatcher(
"/servlet/IncludedServlet?nation=" + china);// 包含IncludedServlet
rd.include(request, response);

IncludedServlet
PrintWriter out = response.getWriter();
out.println("parameter:" + request.getParameter("nation") + "<br>");

 



注:被包含的Servlet程序不能改变响应信息的状态码和响应头,如果里面包含这样的语句将被忽略。
3.4.1.2    Forward方法
Forward用于将请求转发到RequestDispatcher对象封装的资源,Servlet程序在调用该方法进行转发之前可以对请求进行前期预处理。Forward方法时MVC框架的核心方法,控制器使用该方法跳转视图组建Viewer。
1、    跳转到HTML

Java代码 复制代码
  1. getServletContext().getRequestDispatcher(   
  2.                 "/demo/forward.html");   
  3. rd.forward(request, response);  
getServletContext().getRequestDispatcher(
                "/demo/forward.html");
rd.forward(request, response);

 


2、    跳转到Servlet

Java代码 复制代码
  1. String china = "中国";   
  2. RequestDispatcher rd = getServletContext().getRequestDispatcher(   
  3. "/ForwardedServlet?nation=?"  
  4. + URLEncoder.encode(china, "GB2312"));   
  5. rd.forward(request, response);   
  6.   
  7. response.setContentType("text/html;charset=GB2312");   
  8. PrintWriter out = response.getWriter();   
  9. out.println("<a href='ForwardedServlet'>访问自己</a><br>");   
  10. out.println("URI:" + request.getRequestURI() + "<br>");   
  11. out.println("QueryString:" + request.getQueryString() + "<br>");   
  12. out.println("URL:" + request.getRequestURL() + "<br>");   
  13. String nation = request.getParameter("nation");   
  14. nation = new String(nation.getBytes("ISO8859-1"), "GB2312");// 字符串转码   
  15. out.println("paramsters nation:" + nation);  
String china = "中国";
RequestDispatcher rd = getServletContext().getRequestDispatcher(
"/ForwardedServlet?nation=?"
+ URLEncoder.encode(china, "GB2312"));
rd.forward(request, response);

response.setContentType("text/html;charset=GB2312");
PrintWriter out = response.getWriter();
out.println("<a href='ForwardedServlet'>访问自己</a><br>");
out.println("URI:" + request.getRequestURI() + "<br>");
out.println("QueryString:" + request.getQueryString() + "<br>");
out.println("URL:" + request.getRequestURL() + "<br>");
String nation = request.getParameter("nation");
nation = new String(nation.getBytes("ISO8859-1"), "GB2312");// 字符串转码
out.println("paramsters nation:" + nation);

 



3.4.1.3    sendRedirect方法
sendRedirect方法用于生成302响应码和Location响应头,从而通知客户端重新访问Location响应头指定的URL。

Java代码 复制代码
  1. public void sendRedirect(String location)   
  2.   
  3. response.sendRedirect(request.getContextPath()+"/demo/redirect.html")  
public void sendRedirect(String location)

response.sendRedirect(request.getContextPath()+"/demo/redirect.html")

 



3.4.1.4    Forward/sendRedirect异同
1、    RequestDispatcher.forward方法只能将请求转发给同一个Web应用中的组件;HttpServletResponse.sendRedirect可以定向到应用程序外的其他资源。
2、    RequestDispatcher.forward方法重定向后URL不会改变;HttpservletResponse.sendRedirect方法的URL会改变。
3、    RequestDispatcher.forward方法在服务器端内部将请求转发给另一个资源,浏览器只知道发出请求并得到相应结果,并不知在服务器内部发生的转发行为。
HttpservletResponse.sendRedirect对浏览器的请求直接作出响应,响应的结果告诉浏览器重新发出对另外一个URL的访问请求。
4、    RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request、response对象,它们属于同一个访问请求和相应过程;HttpservletResponse.sendRedirect方法调用者和被调用者使用各自的request、response对象,它们属于两个独立的访问请求和相应过程。
5、    RequestDispatcher.forward适用于一次请求响应过程由Web程序内部的多个资源来协同完成,需要在同一个Web程序内部资源之间跳转,使用HttpServletRequest.setAttribute方法将预处理结果传递给下一个资源。
HttpservletResponse.sendRedirect适用于不同Web程序之间的重定向。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics