本文共 3343 字,大约阅读时间需要 11 分钟。
使用HttpServletResponse可以对浏览器进行响应。大部分情况下,可以使用setContentType()设置响应类型,使用getWriter()取得PrintWriter对象,而后使用PrintWriter对象的println()等方法输出HTML内容。
还可以进一步使用setHeader()、addHeader()等方法进行响应标头的设置,或者是使用sendRedirect()、sendError()方法,对客户端要求重定向网页,或是传送错误消息状态。也可以使用getOutputStream()取得ServletOutputStream,直接使用串流对象对浏览器进行字节数据的响应。
当浏览器收到响应时,必须知道如何处理响应的数据,这个信息来自于HTTP响应的content-type标头,该标头的设置值为MIME(Multipurpose Internet Mail Extentions)类型,常见的设置有text/html、application/pdf、application/jar、application/x-zip、image/jpeg等。
setContentType()会自动设置content-type响应标头,只要指定MIME类型就可以了,必要时可以附加一个编码规格,容器会使用指定的字符编码来作为响应对象处理编码的方式(默认是ISO-8859-1)。响应对象处理编码的方式亦可以使用setCharacterEncoding()来设置,使用getCharacterEncoding()则可以取得代表编码方式的字符串。
setContentType()可以自动设置content-type的标头。如果要自行设置响应标头,则可以使用setHeader()、addHeader()等方法。语句:
response.setContentType("text/html;charset=utf-8");
等同于以下的程序:
response.setHeader("content-type", "text/html;charset=utf-8");response.setCharacterEncoding("utf-8");
如果标头名称相同,后续的setHeader()设置值会覆盖先前的设置值,如果打算在一个标头上附加值,则应使用addHeader()方法。
另外还有setIntHeader()、setDateHeader()、addIntHeader()、addDateHeader()等方法,方便以对应的类型来设置标头值。RequestDispatcher的forward()方法会将请求转发至指定的URL,这个动作是在Web容器中进行的,浏览器并不会知道请求被转发,地址栏不会有变化。
使用HttpServletResponse的sendRedirect()可以要求浏览器重新请求另一个URL,又称为重定向,使用时可指定绝对URL或相对URL。这个方法会在回应中设置HTTP状态吗301以及Location标头,浏览器接到这个标头后,会重新使用GET方法请求所指定的URL,因此在地址栏上会有URL的更改。如果再处理请求的过程中发现一些错误,而你有想要发送服务器默认的状态与错误消息,则可以使用sendError()方法。例如,如果根据请求参数必须返回的数据根本不存在,则可以执行如下语句送出错误消息。
response.sendError(HttpServletResponse.SC_NOT_FOUND);
SC_NOT_FOUND会令服务器响应404状态码。如果想使用自定义的消息来替换默认的消息正文,则可以使用sendError()的另一个版本。
response.sendError(HttpServletResponse.SC_NOT_FOUND, "笔记文件");
sendRedirect()和sendError()方法必须在响应未确认输出前执行,否则会提示IllegalStateException。
对浏览器进行字节输出时可以使用HttpServletResponse的getOutputStream()方法取得ServletOutputStream实例,它是OutputStream的子类。
一个简单地例子如下,用户输入正确的密码时可以取得所提供的PDF电子书。
ebook.html:Insert title here
Ebook.java
import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/ebook.do")public class Ebook extends HttpServlet{ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String password = request.getParameter("password"); if (password.compareTo("123") == 0) { response.setContentType("application/pdf"); InputStream in = this.getServletContext().getResourceAsStream("WEB-INF/libsvm.pdf"); OutputStream out = response.getOutputStream(); int len = -1; byte[] buffer = new byte[1024]; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); } in.close(); out.close(); } else { response.sendError(HttpServletResponse.SC_NOT_FOUND, "密码错误"); } }}
getServletContext()可以取得ServletContext对象,这个对象代表当前的Web应用程序;getResourceAsStream()方法可以以流方式读取文件。
需要注意的是,在同一个请求周期中,HttpServletResponse的getWriter()与getOutputStream()只能择一使用,否则会提示IllegalStateException。
转载地址:http://mcbva.baihongyu.com/