2004 Marty Hall 服务器响应的生成 : HTTP 状态代码 JSP, Servlet, & Struts Training Courses: http://courses.coreservlets.com Available in US, China, Taiwan, HK, and Worldwide 2 JSP and Servlet Books from Sun Press: http://www.coreservlets.com Available in English, Chinese (simplified and traditional script), and 12 other languages 议程 HTTP 响应的格式 如何设置状态代码 状态代码适用于什么用途 处理重定向和错误页面的快捷方法 一个 servlet: 根据浏览器的不同将用户重定向到不同页面 各种搜索引擎的一个前端 3 JSP/servlet/Stuts/JSF training: http://www.coreservlets.com
HTTP 请求 / 响应 请求 响应 GET /servlet/somename HTTP/1.1 Host:... Header2:...... HeaderN: (Blank Line) HTTP/1.1 200 OK Content-Type: text/html Header2:...... HeaderN:... (Blank Line) <!DOCTYPE...> <HTML> <HEAD>...</HEAD> <BODY>... </BODY></HTML> 4 JSP/servlet/Stuts/JSF training: http://www.coreservlets.com 状态代码的设定 response.setstatus(int statuscode) 代码要是一个常量, 不能是显式的整型数 这些常量定义在 HttpServletResponse 中 名字来源于标准消息 例如 :SC_OK,SC_NOT_FOUND 等 response.senderror(int code, String message) 将消息包装进小的 HTML 文档 response.sendredirect(string url) 将状态代码设为 302 还要设置 Location 响应报头 5 JSP/servlet/Stuts/JSF training: http://www.coreservlets.com
常见 HTTP 1.1 状态代码 200 (OK) 一切正常 ; 随后是文档 servlet 的默认值 204 (No Content) 浏览器应该依旧显示之前的文档 301 (Moved Permanently) 所请求的文档已经被永久性地移到其他地方 ( 在 Location 中标示出来 ) 浏览器自动跳转到新的位置 6 JSP/servlet/Stuts/JSF training: http://www.coreservlets.com 常见 HTTP 1.1 状态代码 ( 续 ) 302 (Found) 所请求的文档被临时性地移往它处 ( 在 Location 报头中标示 ) 浏览器自动跳转到新的位置 在设定这个报头时,servlet 应该使用 sendredirect, 而非 setstatus 参见示例 401 (Unauthorized) 浏览器试图在没有提供恰当的授权报头的情况下, 访问受密码保护的页面 404 (Not Found) 不存在该页面 servlet 应该使用 senderror 来发送这个报头 问题 :Internet Explorer 和小型的 (< 512KB) 错误页面 默认地,IE 忽略错误页面 可以到这个地方进行试验 :http://www.plinko.net/404/ 7 JSP/servlet/Stuts/JSF training: http://www.coreservlets.com
将用户重定向到浏览器相关页面的 servlet public class WrongDestination extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { String useragent = request.getheader("user-agent"); if ((useragent!= null) && (useragent.indexof("msie")!= -1)) { response.sendredirect("http://home.netscape.com"); else { response.sendredirect("http://www.microsoft.com"); 8 JSP/servlet/Stuts/JSF training: http://www.coreservlets.com 将用户重定向到浏览器相关页面的 servlet 9 JSP/servlet/Stuts/JSF training: http://www.coreservlets.com
各种搜索引擎的一个前端 public class SearchEngines extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { String searchstring = request.getparameter("searchstring"); if ((searchstring == null) (searchstring.length() == 0)) { reportproblem(response, "Missing search string"); return; searchstring = URLEncoder.encode(searchString); String searchenginename = request.getparameter("searchengine"); if ((searchenginename == null) (searchenginename.length() == 0)) { reportproblem(response, "Missing search engine name"); return; 10 JSP/servlet/Stuts/JSF training: http://www.coreservlets.com 各种搜索引擎的一个前端 ( 续 ) String searchurl = SearchUtilities.makeURL(searchEngineName, searchstring); if (searchurl!= null) { response.sendredirect(searchurl); else { reportproblem(response, "Unrecognized search engine"); private void reportproblem(httpservletresponse response, String message) throws IOException { response.senderror(response.sc_not_found, message); 11 JSP/servlet/Stuts/JSF training: http://www.coreservlets.com
各种搜索引擎的一个前端 ( 续 ) public class SearchSpec { /** Builds a URL for the results page by * simply concatenating the base URL * (http://...?somevar=") with the * URL-encoded search string (jsp+training). */ public String makeurl(string searchstring) { return(baseurl + searchstring); 12 JSP/servlet/Stuts/JSF training: http://www.coreservlets.com 搜索引擎的前端 :HTML 表单 13 JSP/servlet/Stuts/JSF training: http://www.coreservlets.com
搜索引擎的前端 : 合法数据的结果 14 JSP/servlet/Stuts/JSF training: http://www.coreservlets.com 搜索引擎的前端 : 无效数据的结果 15 JSP/servlet/Stuts/JSF training: http://www.coreservlets.com
小结 许多 servlet 任务只能通过使用 HTTP 状态代码来完成 状态代码的设置 : 一般地, 通过 response.setstatus 进行设置 特殊情况 (302 和 404), 用 response.sendredirect 和 response.senderror 进行设置 最为重要的状态代码 200 ( 默认 ) 302 ( 转发 ; 用 sendredirect 设定 ) 401 ( 需要密码 ) 404 ( 未找到, 用 senderror 设定 ) 16 JSP/servlet/Stuts/JSF training: http://www.coreservlets.com 2004 Marty Hall 问题? JSP, Servlet, & Struts Training Courses: http://courses.coreservlets.com Available in US, China, Taiwan, HK, and Worldwide 17 JSP and Servlet Books from Sun Press: http://www.coreservlets.com Available in English, Chinese (simplified and traditional script), and 12 other languages