`
wangtong40
  • 浏览: 249061 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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不用调用HttpServletResponse的setStatus()方法来指定状态代码和产生响应状态行。
3.1.3    setError
setError()用于发送表示错误信息的状态码(比如404)到客户端,并清除缓冲区的内容。

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

public void addHeader(String name,String value);
public void setHeader(String name,String value);
 


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

public void addIntHeader(String name,int value);
public void setIntHeader(String name,int value);
 



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

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和字符集编码之间的映射关系。

    <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()方法解决中文呢输出问题。

resp.setCharacterEncoding("GB2312");
resp.setContentType("text/html;charset=GB2312");
resp.setLocale(Locale.CHINESE);
PrintWriter out = resp.getWriter();
out.println("<s>中文乱码处理</s>");
 



3.2.9    定期刷新网页

resp.setHeader("Refresh", "2");
resp.getWriter().println(new Date());
 



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

resp.setDateHeader("Expires", 0);
resp.setHeader("Cache-Control", "no-cache");
resp.setHeader("Pragma", "no-cache");
 

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

<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    实现动态文件内容下载

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对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程服务器的服务器端包含功能。

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

getServletContext().getRequestDispatcher(
                "/demo/forward.html");
rd.forward(request, response);
 


2、    跳转到Servlet

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。

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