可以使用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 }
Pet.java
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>
form.html
运行结果:
三、使用sendRedirect()、sendError()
可以使用HttpServletResponse的sendRedirect()方法要求浏览器重新请求一个URL,如response.sendRedirect("http://openhome.cc");
如果在处理请求过程中,发现了一些错误,而你想要传送服务器默认的状态与错误信息,可以使用sendError()方法。如
response.sendError(HttpServletResponse.SC_NOT_FOUND);//会响应404状态码
当神已无能为力,那便是魔渡众生