`

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程序之间的重定向。

分享到:
评论

相关推荐

    Spring3.0.5扩展支持AOP获取HttpServletResponse

    `HttpServletResponse`是Servlet API中的核心接口,它用于封装服务器向客户端发送的响应信息,如状态码、响应头和响应体。 首先,让我们深入理解Spring AOP。AOP的核心概念包括切面(Aspect)、通知(Advice)、...

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

    在Java Web开发中,`HttpServletResponse`对象是Servlet API中的核心组件之一,它扮演着响应客户端请求的关键角色。本文将深入探讨`HttpServletResponse`对象的使用、应用以及请求重定向的相关知识点。 一、...

    java httpServletResponse返回流进行 下载 - 姐呵呵博客专栏 - CSDN博客1

    在Java web开发中,HTTPServletResponse是用于服务器向客户端发送响应的重要接口。当涉及到文件下载时,我们通常会利用HTTP响应的输出流将文件内容发送到客户端。以下将详细讲解如何使用HttpServletResponse返回流...

    HttpServletRequest和HttpServletResponse的讲解

    `HttpServletRequest`和`HttpServletResponse`是两个核心的Servlet接口,它们是服务器与客户端之间交互的关键组件。下面我们将深入探讨这两个接口的功能、用法及实际应用案例。 `HttpServletRequest`接口代表了来自...

    HttpServletRequest和HttpServletResponse的必备包

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

    httpServletResponse学习

    httpServletResponse 学习笔记 HttpServletResponse 是 Servlet API 中的一个接口,用于封装 HTTP 响应消息,允许操控 HTTP 协议相关数据,包括响应头和状态码,支持 cookie 和 session 跟踪。本文将详细介绍 ...

    HttpServletResponse对象的应用

    在Java Web开发中,`HttpServletResponse`对象是Servlet API中的核心组件之一,它扮演着服务器向客户端发送响应的重要角色。本篇文章将深入探讨`HttpServletResponse`对象的应用,以及请求重定向与请求转发的区别。 ...

    自学HttpServletResponse

    ### 自学HttpServletResponse #### 一、概述 `HttpServletResponse`是Java Web开发中的一个重要接口,它继承自`ServletResponse`接口,并提供了与HTTP协议相关的多种方法。这些方法主要用于设置HTTP响应的状态码、...

    HttpServletRequest源码 HttpServletResponse源码

    在Java Web开发中,`HttpServletRequest`和`HttpServletResponse`是两个至关重要的接口,它们是Java Servlet API的核心组成部分,用于处理客户端(通常是Web浏览器)与服务器之间的HTTP通信。这两个接口提供了丰富的...

    JavaWeb开发技术-HttpServletResponse对象.pptx

    JavaWeb开发技术-HttpServletResponse对象 JavaWeb开发技术中,HttpServletResponse对象是Servlet容器提供的一个对象,用于向客户端发送响应信息。在每次Servlet请求时,Web服务器都会创建一个HttpServletResponse...

    Struts2教程:获得HttpServletResponse对象

    ### Struts2教程:获得HttpServletResponse对象 在深入探讨如何在Struts2框架中获取`HttpServletResponse`对象之前,我们先来简要回顾一下Struts2框架的基本概念及其与传统Struts1.x的区别。 #### Struts2框架简介...

    深入解析Java Web中的HttpServletRequest与HttpServletResponse

    在Java Web应用开发中,HttpServletRequest和HttpServletResponse是两个核心的接口,它们扮演着至关重要的角色。这两个接口是Java Servlet API的一部分,为开发人员提供了处理HTTP请求和构造HTTP响应的丰富功能。...

    HttpServletRequest与HttpServletResponse的实现类.docx

    【HttpServletRequest与HttpServletResponse详解】 在Java Web开发中,HttpServletRequest和HttpServletResponse是Servlet API中的核心接口,它们分别代表了客户端的HTTP请求和服务器的HTTP响应。每次客户端向Web...

    HttpServletResponse and HttpServletRequest

    这是很好的HttpServletResponse HttpServletRequest.加强.ppt,实际例子,值得收藏!

    Java Web程序设计入门课件-HttpServletResponse和HttpServletRequest.pptx

    在Servlet API中,`HttpServletResponse`和`HttpServletRequest`接口扮演着至关重要的角色。 `HttpServletResponse`接口是用来封装HTTP响应消息的,它扩展了`ServletResponse`接口。在处理HTTP响应时,我们主要关注...

    HttpServletRequest-response方法总结

    下面是对HttpServletRequest和HttpServletResponse的方法总结: HttpServletRequest: 1. getScheme():返回请求的计划,如http、https或ftp。 2. getServerName():返回被发送请求的服务器的主机名。 3. ...

    java HttpServletRequest和HttpServletResponse详解

    在进行Java Web开发时,理解HttpServletRequest和HttpServletResponse的工作原理和使用方法至关重要,这有助于你有效地处理客户端和服务器之间的交互,提供正确的服务和反馈。这两个接口的熟练掌握是成为专业Java ...

Global site tag (gtag.js) - Google Analytics