响应HttpServletResponse
可以使用HttpServletResponse来对浏览器进行响应,大部分情况下,会使用setContentType()设置响应类型,使用getWriter()取得PrintWriter对象,而后使用PrintWriter的println()等方法输出。
一、设置响应标头、缓冲区
使用setHeader()、addHeader()来设置响应标头,setHeader()设置标头名称与值。如果标头是整数,可以使用setIntHeader()、addIntHeader()方法。所有的标头设置都必须在响应确认Commit之前。
容器可以对响应进行缓冲,getBufferSize()、setBuffferSize()、isCommitted()、reset()、resetBuffer()、flushBuffer()等。setBufferSize()必须在getWriter()之前调用。isCommitted用来查看是否响应确认。reset()重置,会连设置的标头一起重置。但是resetBuffer()会重置响应内容,不会重置标头。flushbuffer()会清除flush所有的缓冲区中已设置的响应信息至客户端。
HttpServletResponse对象若被容器关闭,则必须清除所有的响应内容,响应对象被关闭的时机点有以下几种:
1、Servlet的service()方法已经结束,响应的内容长度超过HttpServletResponse的setContentLength()所设置的长度。
2、调用了sendRedirect()方法
3、调用了sendError()方法
4、调用了AsyncContext的complete()方法。
二、使用getWriter()输出字符
如果要对浏览器输出HTML,会通过getWriter()取得PrintWriter对象,然后制定字符串进行输出。例如:
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
在没有设置任何编码之前,使用的字符编码默认是ISO-8859-1。如果输出中文,会出现乱码。浏览器如果有发送Accept-Language标头,可以用getLocale()来取得一个Locale对象,代表客户端可以接受的语系。response.setLocale(Locale.TAIWAN);也可以使用response.setCharacterEncoding("UTF-8");或者resposne.setContentType("text/html;charset=UTF-8");
例1:示范了如何在用户名称上加上超链接并设置mailto:与所发送的电子邮件,如果用户直接点击链接,就会打开默认的邮件程序。
1 package cc.openhome; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.WebServlet; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 /** 13 * Servlet implementation class Pet 14 */ 15 @WebServlet("/pet") 16 public class Pet extends HttpServlet { 17 private static final long serialVersionUID = 1L; 18 19 /** 20 * @see HttpServlet#HttpServlet() 21 */ 22 public Pet() { 23 super(); 24 // TODO Auto-generated constructor stub 25 } 26 27 /** 28 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 29 */ 30 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 31 // TODO Auto-generated method stub 32 } 33 34 /** 35 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 36 */ 37 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 38 // TODO Auto-generated method stub 39 request.setCharacterEncoding("UTF-8"); 40 response.setContentType("text/html; charset=UTF-8"); 41 PrintWriter out=response.getWriter(); 42 out.println("<html>"); 43 out.println("<head>"); 44 out.println("<title>感谢填写</title>"); 45 out.println("</head>"); 46 out.println("<body>"); 47 out.println("联系人:<a href='mailto:"+request.getParameter("email")+"'>"+request.getParameter("user")+"</a>"); 48 out.println("<br>喜欢的宠物类型"); 49 out.println("<ul>"); 50 for(String type:request.getParameterValues("type")){ 51 out.println("<li>"+type+"</li>"); 52 } 53 out.println("</ul>"); 54 out.println("</body>"); 55 out.println("</html>"); 56 out.close(); 57 } 58 59 }
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="Text/html; charset=UTF-8"> 5 <title>Insert title here</title> 6 </head> 7 <body> 8 <form action="pet" method="post"> 9 姓名:<input type="text" name="user" value=""><br> 10 邮件:<input type="text" name="email" value=""><br> 11 你最喜欢的 宠物:<br> 12 <select name="type" size="6" multiple="true"> 13 <option value="猫">猫</option> 14 <option value="狗">狗</option> 15 <option value="鱼">鱼</option> 16 <option value="鸟">鸟</option> 17 </select><br> 18 <input type="submit" value="送出"/> 19 </form> 20 </body> 21 </html>
运行结果:
三、使用sendRedirect()、sendError()
可以使用HttpServletResponse的sendRedirect()方法要求浏览器重新请求一个URL,如response.sendRedirect("http://openhome.cc");
如果在处理请求过程中,发现了一些错误,而你想要传送服务器默认的状态与错误信息,可以使用sendError()方法。如
response.sendError(HttpServletResponse.SC_NOT_FOUND);//会响应404状态码