- 浏览: 261559 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
zhagener:
package com.huawei.qyq.impl;imp ...
EasyMock使用说明 -
LetCode:
将String转换成InputStream -
Mr_kimilo:
MyEclipse6.5安装的时候出现问题: JS Test ...
javascript测试工具: JsTestDriver -
jersey109:
我同意楼下的,SQLException和IOException ...
check exception和uncheck exception -
jersey109:
楼主,你不说CODE,我觉得你对RuntimeExceptio ...
check exception和uncheck exception
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);
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);
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);
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>
<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>");
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");
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>
<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();
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>");
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);
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);
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")
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程序之间的重定向。
发表评论
-
tomcat源码—redirect和forward的实现
2009-12-29 13:24 1368网上已经有很多关于redirect和forward区别的文章, ... -
深入浅出URL编码
2009-12-24 14:18 927一、问题: 编码问题是JAVA初学者在web开发 ... -
给servlet写单元测试的总结
2009-11-11 10:05 914servlet的测试一般来说需要容器的支持,不是像通常的jav ... -
JAVA程序通过后台登陆网站,获取Session,然后再POST Http Request添加数据
2009-11-04 16:18 2927* 1,在HTTP的WEB应用中, 应用客户端和服务器之间的状 ... -
使用HttpURLConnection类(利用sessionId保持会话)
2009-11-04 16:15 2692TestServlet.java package nj. ... -
jsessionid传递方式对session实现机制
2009-11-04 16:12 4404<script type="text/j ... -
Servlet中web请求的编码
2009-10-23 16:13 752Servlet中Web请求的编码是一个很伤脑筋的问题。使用多个 ... -
Servlet,Filter的url-pattern详解
2009-10-12 13:54 1910Servlet的url匹配以 ... -
使用HttpURLConnection访问web页面
2009-10-10 15:48 1507URLConnection类给应用程序和web资源之间架设起了 ...
相关推荐
`HttpServletResponse`是Servlet API中的核心接口,它用于封装服务器向客户端发送的响应信息,如状态码、响应头和响应体。 首先,让我们深入理解Spring AOP。AOP的核心概念包括切面(Aspect)、通知(Advice)、...
在Java Web开发中,`HttpServletResponse`对象是Servlet API中的核心组件之一,它扮演着响应客户端请求的关键角色。本文将深入探讨`HttpServletResponse`对象的使用、应用以及请求重定向的相关知识点。 一、...
在Java web开发中,HTTPServletResponse是用于服务器向客户端发送响应的重要接口。当涉及到文件下载时,我们通常会利用HTTP响应的输出流将文件内容发送到客户端。以下将详细讲解如何使用HttpServletResponse返回流...
`HttpServletRequest`和`HttpServletResponse`是两个核心的Servlet接口,它们是服务器与客户端之间交互的关键组件。下面我们将深入探讨这两个接口的功能、用法及实际应用案例。 `HttpServletRequest`接口代表了来自...
Java中,引入javax.servlet.http.HttpServletRequest和javax.servlet.http.HttpServletResponse包的必备jar包:org.apache.commons.httpclient.jar
httpServletResponse 学习笔记 HttpServletResponse 是 Servlet API 中的一个接口,用于封装 HTTP 响应消息,允许操控 HTTP 协议相关数据,包括响应头和状态码,支持 cookie 和 session 跟踪。本文将详细介绍 ...
在Java Web开发中,`HttpServletResponse`对象是Servlet API中的核心组件之一,它扮演着服务器向客户端发送响应的重要角色。本篇文章将深入探讨`HttpServletResponse`对象的应用,以及请求重定向与请求转发的区别。 ...
### 自学HttpServletResponse #### 一、概述 `HttpServletResponse`是Java Web开发中的一个重要接口,它继承自`ServletResponse`接口,并提供了与HTTP协议相关的多种方法。这些方法主要用于设置HTTP响应的状态码、...
在Java Web开发中,`HttpServletRequest`和`HttpServletResponse`是两个至关重要的接口,它们是Java Servlet API的核心组成部分,用于处理客户端(通常是Web浏览器)与服务器之间的HTTP通信。这两个接口提供了丰富的...
JavaWeb开发技术-HttpServletResponse对象 JavaWeb开发技术中,HttpServletResponse对象是Servlet容器提供的一个对象,用于向客户端发送响应信息。在每次Servlet请求时,Web服务器都会创建一个HttpServletResponse...
### Struts2教程:获得HttpServletResponse对象 在深入探讨如何在Struts2框架中获取`HttpServletResponse`对象之前,我们先来简要回顾一下Struts2框架的基本概念及其与传统Struts1.x的区别。 #### Struts2框架简介...
在Java Web应用开发中,HttpServletRequest和HttpServletResponse是两个核心的接口,它们扮演着至关重要的角色。这两个接口是Java Servlet API的一部分,为开发人员提供了处理HTTP请求和构造HTTP响应的丰富功能。...
【HttpServletRequest与HttpServletResponse详解】 在Java Web开发中,HttpServletRequest和HttpServletResponse是Servlet API中的核心接口,它们分别代表了客户端的HTTP请求和服务器的HTTP响应。每次客户端向Web...
这是很好的HttpServletResponse HttpServletRequest.加强.ppt,实际例子,值得收藏!
在Servlet API中,`HttpServletResponse`和`HttpServletRequest`接口扮演着至关重要的角色。 `HttpServletResponse`接口是用来封装HTTP响应消息的,它扩展了`ServletResponse`接口。在处理HTTP响应时,我们主要关注...
下面是对HttpServletRequest和HttpServletResponse的方法总结: HttpServletRequest: 1. getScheme():返回请求的计划,如http、https或ftp。 2. getServerName():返回被发送请求的服务器的主机名。 3. ...
在进行Java Web开发时,理解HttpServletRequest和HttpServletResponse的工作原理和使用方法至关重要,这有助于你有效地处理客户端和服务器之间的交互,提供正确的服务和反馈。这两个接口的熟练掌握是成为专业Java ...