Microsoft PowerPoint - 06-Response-Headers-Chinese.ppt

Save this PDF as:
 WORD  PNG  TXT  JPG

Size: px
Start display at page:

Download "Microsoft PowerPoint - 06-Response-Headers-Chinese.ppt"

Transcription

1 2004 Marty Hall 服务器响应的生成 : HTTP 响应报头 JSP, Servlet, & Struts Training Courses: Available in US, China, Taiwan, HK, and Worldwide 2 JSP and Servlet Books from Sun Press: Available in English, Chinese (simplified and traditional script), and 12 other languages 议程 HTTP 响应的格式 设置响应报头 响应报头适用于什么用途 构建 Excel 电子表格 动态生成 JPEG 图像 向浏览器发送增量更新 3 JSP/servlet/Struts/JSF training:

2 HTTP 请求 / 响应 请求 响应 GET /servlet/somename HTTP/1.1 Host:... Header2: HeaderN: (Blank Line) HTTP/ OK Content-Type: text/html Header2: HeaderN:... (Blank Line) <!DOCTYPE...> <HTML> <HEAD>...</HEAD> <BODY>... </BODY></HTML> 4 JSP/servlet/Struts/JSF training: 任意响应报头的设置 public void setheader(string headername, String headervalue) 设定任意的报头 public void setdateheader(string name, long millisecs) 将自 1970 年以来的毫秒数转换成 GMT 格式日期字符串 public void setintheader(string name, int headervalue) 可以省去在调用 setheader 之前将 int 转换成字符串的麻烦 addheader, adddateheader, addintheader 增加新报头, 而非替换已有的报头 5 JSP/servlet/Struts/JSF training:

3 普通响应报头的设置 setcontenttype 设定 Content-Type 报头 servlet 几乎总会用到这个报头 参见常见 MIME 类型的表格 setcontentlength 设定 Content-Length 报头 用于持续性 HTTP 连接 参见 Connection 请求报头 addcookie 为 Set-Cookie 报头增加一个值 参见介绍 cookie 的部分 sendredirect 设定 Location 报头 ( 以及改变状态代码 ) 6 JSP/servlet/Struts/JSF training: 常见 MIME 类型 类型 含意 application/msword Microsoft Word document application/octet-stream Unrecognized or binary data application/pdf Acrobat (.pdf) file application/postscript PostScript file application/vnd.ms-excel Excel spreadsheet application/vnd.ms-powerpoint Powerpoint presentation application/x-gzip Gzip archive application/x-java-archive JAR file application/x-java-vm Java bytecode (.class) file application/zip Zip archive audio/basic Sound file in.au or.snd format audio/x-aiff AIFF sound file audio/x-wav Microsoft Windows sound file audio/midi MIDI sound file text/css HTML cascading style sheet text/html HTML document text/plain Plain text text/xml XML document image/gif GIF image image/jpeg JPEG image image/png PNG image image/tiff TIFF image video/mpeg MPEG video clip video/quicktime QuickTime video clip 7 JSP/servlet/Struts/JSF training:

4 常见 HTTP 1.1 响应报头 Cache-Control (1.1) 和 Pragma (1.0) no-cache 值阻止浏览器缓存页面 Content-Disposition 通过这个报头, 可以请求浏览器询问用户将响应存储到磁盘上给定名称的文件中 Content-Disposition: attachment; filename=file-name Content-Encoding 文档的编码方式 参见之前压缩的例子 Content-Length 响应中的字节数 参见前面幻灯片中的 setcontentlength 使用 ByteArrayOutputStream 在发送文档前对文档进行缓冲, 这样才能够确定数据的大小 参见有关 Connection 请求报头的讨论 8 JSP/servlet/Struts/JSF training: 常见 HTTP 1.1 响应报头 ( 续 ) Content-Type 返回文档时所采用的 MIME 类型 使用 setcontenttype 设置这个报头 Expires 特定的一段时间, 这段时间后应该将文档认作是过期, 不应该再继续缓存 使用 setdateheader 设置这个报头 Last-Modified 文档最后被改动的时间 不要直接设置这个报头 ; 而应该提供 getlastmodified 方法 参见书中的博彩数字的例子 ( 第 3 章 ) 9 JSP/servlet/Struts/JSF training:

5 常见 HTTP 1.1 响应报头 ( 续 ) Location 浏览器应该重新连接到的 URL 不要直接设置这个报头, 而要使用 sendredirect 进行设定 Refresh 多少秒后浏览器应该重新载入页面 同时还可以包括应该连接到的 URL 参见后面的例子 Set-Cookie 浏览器应该记下来的 cookie 不要直接设置这个报头 ; 而应该使用 addcookie 参见下一节 WWW-Authenticate 授权的类型和范围需要在 Authorization 报头中给出 参见 More Servlets & JSP 中有关安全的章节 10 JSP/servlet/Struts/JSF training: 构建 Excel 电子表格 public class ApplesAndOranges extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype ("application/vnd.ms-excel"); PrintWriter out = response.getwriter(); out.println("\tq1\tq2\tq3\tq4\ttotal"); out.println ("Apples\t78\t87\t92\t29\t=SUM(B2:E2)"); out.println ("Oranges\t77\t86\t93\t30\t=SUM(B3:E3)"); 11 JSP/servlet/Struts/JSF training:

6 构建 Excel 电子表格 12 JSP/servlet/Struts/JSF training: 处理长时间运行的 servlet 时我们需要下述内容 : 不同请求间存储数据的方式 对于不专门针对任意某个客户的数据, 可以将它存储在 servlet 的字段中 ( 实例变量 ) 对于专属于某个用户的数据, 则要将它存储在 HttpSession 对象中 参见随后有关会话跟踪的课程 对于需要为其他 servlet 或 JSP 页面访问的数据 ( 和用户无关 ), 可将其存储到 ServletContext 中 在响应发送给用户之后, 保持计算继续运行的方法 这项任何比较简单 : 启动一个线程 唯一要注意的是 : 将线程的优先级设为比较低的值, 这样才不会拖慢整个服务器的运行 在更新结果就绪后将它们发送给浏览器的方法 使用 Refresh 报头告诉浏览器, 让它请求更新 13 JSP/servlet/Struts/JSF training:

7 servlet 状态的持续以及页面的自动重载 : 示例 计划 : 生成大质数 ( 比如 150 位数字 ) 的列表 在计算结束之前显示不完全的结果 让新的客户能够使用其他客户已有的结果 演示 Refresh 报头的应用 展示对于 servlet 来说跨请求维护状态是多么容易 在传统的 CGI 中很难做到 同时阐明 servlet 能够处理多个同时发生的连接 每个请求在单独的线程中处理 14 JSP/servlet/Struts/JSF training: 查找公钥密码学使用的质数 public class PrimeNumberServlet extends HttpServlet { private ArrayList primelistcollection = new ArrayList(); private int maxprimelists = 30; public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { int numprimes = ServletUtilities.getIntParameter(request, "numprimes", 50); int numdigits = ServletUtilities.getIntParameter(request, "numdigits", 120); PrimeList primelist = findprimelist(primelistcollection, numprimes, numdigits); 15 JSP/servlet/Struts/JSF training:

8 查找公钥密码学使用的质数 if (primelist == null) { primelist = new PrimeList(numPrimes, numdigits, true); // Multiple servlet request threads share the instance // variables (fields) of PrimeNumbers. So // synchronize all access to servlet fields. synchronized(primelistcollection) { if (primelistcollection.size() >= maxprimelists) primelistcollection.remove(0); primelistcollection.add(primelist); ArrayList currentprimes = primelist.getprimes(); int numcurrentprimes = currentprimes.size(); int numprimesremaining = (numprimes - numcurrentprimes); boolean islastresult = (numprimesremaining == 0); if (!islastresult) { response.setintheader("refresh", 5); 16 JSP/servlet/Struts/JSF training: 查找公钥密码学使用的质数 17 JSP/servlet/Struts/JSF training:

9 查找公钥密码学使用的质数 18 JSP/servlet/Struts/JSF training: 使用 servlet 生成 JPEG 图像 1. 创建一个 BufferedImage 2. 在 BufferedImage 上绘制内容 3. 设置 Content-Type 响应报头 response.setcontenttype("image/jpeg"); 4. 获取输出流 OutputStream out = response.getoutputstream 5. 以 JPEG 格式将 BufferedImage 发送到输出流 try { ImageIO.write(image, "jpg", out); catch(ioexception ioe) { System.err.println("Error writing JPEG file: " + ioe); 19 JSP/servlet/Struts/JSF training:

10 使用 servlet 生成 JPEG 图像 20 JSP/servlet/Struts/JSF training: 使用 servlet 生成 JPEG 图像 21 JSP/servlet/Struts/JSF training:

11 小结 许多 servlet 任务只能通过使用 HTTP 响应报头来完成 响应报头的设置 : 一般地, 使用 response.setheader 进行设定 特殊情况下, 使用 response.setcontenttype, response.setcontentlength,response.addcookie, 和 response.sendredirect 直接设置的一些最重要的响应报头 : Cache-Control 和 Pragma Content-Disposition Content-Encoding Content-Length Expires Refresh WWW-Authenticate 22 JSP/servlet/Struts/JSF training: Marty Hall 问题? JSP, Servlet, & Struts Training Courses: Available in US, China, Taiwan, HK, and Worldwide 23 JSP and Servlet Books from Sun Press: Available in English, Chinese (simplified and traditional script), and 12 other languages