|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
但是对于JAVA技术类的学习,我觉得大课堂反而会影响自身独立思考的过程,因为上课的时候,老师讲课的速度很快为了不遗漏要点,通常会仔细的听,js|servlet7.1形态代码概述 Web服务器呼应扫瞄器或其他客户程序的哀求时,其应对一样平常由以下几个部分构成:一个形态行,几个应对头,一个空行,内容文档。上面是一个最复杂的应对:
HTTP/1.1200OK
Content-Type:text/plain
HelloWorld
形态行包括HTTP版本、形态代码、与形态代码对应的冗长申明信息。在年夜多半情形下,除Content-Type以外的一切应对头都是可选的。但Content-Type是必须的,它形貌的是前面文档的MIME范例。固然年夜多半应对都包括一个文档,但也有一些不包括,比方对HEAD哀求的应对永久不会附带文档。有很多形态代码实践上用来标识一次失利的哀求,这些应对也不包括文档(或只包括一个冗长的毛病信息申明)。
Servlet能够使用形态代码来完成很多功效。比方,能够把用户重定向到另外一个网站;能够唆使出前面的文档是图片、PDF文件或HTML文件;能够告知用户必需供应暗码才干会见文档;等等。这一部分我们将详细会商各类形态代码的寄义和使用这些代码能够做些甚么。
7.2设置形态代码
如前所述,HTTP应对形态行包括HTTP版本、形态代码和对应的形态信息。因为形态信息间接和形态代码相干,而HTTP版本又由服务器断定,因而必要Servlet设置的只要一个形态代码。
Servlet设置形态代码一样平常利用HttpServletResponse的setStatus办法。setStatus办法的参数是一个整数(即形态代码),不外为了使得代码具有更好的可读性,能够用HttpServletResponse中界说的常量来制止间接利用整数。这些常量依据HTTP1.1中的尺度形态信息定名,一切的名字都加上了SC前缀(StatusCode的缩写)并年夜写,同时把空格转换成了下划线。也就是说,与形态代码404对应的形态信息是“NotFound”,则HttpServletResponse中的对应常量名字为SC_NOT_FOUND。但有两个破例:和形态代码302对应的常量依据HTTP1.0定名,而307没有对应的常量。
设置形态代码并不是老是意味着不要再前往文档。比方,固然年夜多半服务器前往404应对时会输入复杂的“FileNotFound”信息,但Servlet也能够定制这个应对。不外,定制应对时应该在经由过程PrintWriter发送任何内容之前先挪用response.setStatus。
固然设置形态代码一样平常利用的是response.setStauts(int)办法,但为了复杂起见,HttpServletResponse为两种罕见的情况供应了公用办法:sendError办法天生一个404应对,同时天生一个冗长的HTML毛病信息文档;sendRedirect办法天生一个302应对,同时在Location头中唆使新文档的URL。
7.3HTTP1.1形态代码及其寄义
下表显现了罕见的HTTP1.1形态代码和它们对应的形态信息和寄义。
应该审慎地利用那些只要HTTP1.1撑持的形态代码,由于很多扫瞄器还只可以撑持HTTP1.0。假如你利用了HTTP1.1独有的形态代码,最好可以反省一下哀求的HTTP版本号(经由过程HttpServletRequest的getProtocol办法)。形态代码形态信息寄义
100Continue初始的哀求已承受,客户应该持续发送哀求的其他部分。(HTTP1.1新)
101SwitchingProtocols服务器将服从客户的哀求转换到别的一种协定(HTTP1.1新)
200OK统统一般,对GET和POST哀求的应对文档跟在前面。假如不必setStatus设置形态代码,Servlet默许利用202形态代码。
201Created服务器已创立了文档,Location头给出了它的URL。
202Accepted已承受哀求,但处置还没有完成。
203Non-AuthoritativeInformation文档已一般地前往,但一些应对头大概不准确,由于利用的是文档的拷贝(HTTP1.1新)。
204NoContent没有新文档,扫瞄器应当持续显现本来的文档。假如用户按期地革新页面,而Servlet能够断定用户文档充足新,这个形态代码是很有效的。
205ResetContent没有新的内容,但扫瞄器应当重置它所显现的内容。用来强迫扫瞄器扫除表单输出内容(HTTP1.1新)。
206PartialContent客户发送了一个带有Range头的GET哀求,服务器完成了它(HTTP1.1新)。
300MultipleChoices客户哀求的文档能够在多个地位找到,这些地位已在前往的文档内列出。假如服务器要提出优先选择,则应当在Location应对头指明。
301MovedPermanently客户哀求的文档在其他中央,新的URL在Location头中给出,扫瞄器应当主动地会见新的URL。
302Found相似于301,但新的URL应当被视为一时性的替换,而不是永世性的。注重,在HTTP1.0中对应的形态信息是“MovedTemporatily”,而HttpServletResponse中响应的常量是SC_MOVED_TEMPORARILY,而不是SC_FOUND。
呈现该形态代码时,扫瞄器可以主动会见新的URL,因而它是一个很有效的形态代码。为此,Servlet供应了一个公用的办法,即sendRedirect。利用response.sendRedirect(url)比利用response.setStatus(response.SC_MOVED_TEMPORARILY)和response.setHeader("Location",url)更好。这是由于:
起首,代码加倍简便。
第二,利用sendRedirect,Servlet会主动机关一个包括新链接的页面(用于那些不克不及主动重定向的老式扫瞄器)。
最初,sendRedirect可以处置绝对URL,主动把它们转换成相对URL。
注重这个形态代码偶然候能够和301交换利用。比方,假如扫瞄器毛病地哀求http://host/~user(短少了前面的斜杠),有的服务器前往301,有的则前往302。
严厉地说,我们只能假定只要当本来的哀求是GET时扫瞄器才会主动重定向。请拜见307。
303SeeOther相似于301/302,分歧的地方在于,假如本来的哀求是POST,Location头指定的重定向方针文档应当经由过程GET提取(HTTP1.1新)。
304NotModified客户端有缓冲的文档并收回了一个前提性的哀求(通常为供应If-Modified-Since头暗示客户只想比指定日期更新的文档)。服务器告知客户,本来缓冲的文档还能够持续利用。
305UseProxy客户哀求的文档应当经由过程Location头所指明的代办署理服务器提取(HTTP1.1新)。
307TemporaryRedirect和302(Found)不异。很多扫瞄器会毛病地呼应302应对举行重定向,即便本来的哀求是POST,即便它实践上只能在POST哀求的应对是303时才干重定向。因为这个缘故原由,HTTP1.1新增了307,以便加倍扫除区域分几个形态代码:当呈现303应对时,扫瞄器能够跟从重定向的GET和POST哀求;假如是307应对,则扫瞄器只能跟从对GET哀求的重定向。
注重,HttpServletResponse中没无为该形态代码供应响应的常量。(HTTP1.1新)
400BadRequest哀求呈现语法毛病。
401Unauthorized客户试图未经受权会见受暗码回护的页面。应对中会包括一个WWW-Authenticate头,扫瞄器据此显现用户名字/暗码对话框,然后在填写符合的Authorization头后再次收回哀求。
403Forbidden资本不成用。服务器了解客户的哀求,但回绝处置它。一般因为服务器上文件或目次的权限设置招致。
404NotFound没法找到指定地位的资本。这也是一个经常使用的应对,HttpServletResponse专门供应了响应的办法:sendError(message)。
405MethodNotAllowed哀求办法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资本不合用。(HTTP1.1新)
406NotAcceptable指定的资本已找到,但它的MIME范例和客户在Accpet头中所指定的不兼容(HTTP1.1新)。
407ProxyAuthenticationRequired相似于401,暗示客户必需先经由代办署理服务器的受权。(HTTP1.1新)
408RequestTimeout在服务器允许的守候工夫内,客户一向没有收回任何哀求。客户能够在今后反复统一哀求。(HTTP1.1新)
409Conflict一般和PUT哀求有关。因为哀求和资本确当前形态相抵触,因而哀求不克不及乐成。(HTTP1.1新)
410Gone所哀求的文档已不再可用,并且服务器不晓得应当重定向到哪个地点。它和404的分歧在于,前往407暗示文档永世地分开了指定的地位,而404暗示因为未知的缘故原由文档不成用。(HTTP1.1新)
411LengthRequired服务器不克不及处置哀求,除非客户发送一个Content-Length头。(HTTP1.1新)
412PreconditionFailed哀求头中指定的一些条件前提失利(HTTP1.1新)。
413RequestEntityTooLarge方针文档的巨细凌驾服务器以后乐意处置的巨细。假如服务器以为本人可以稍后再处置该哀求,则应当供应一个Retry-After头(HTTP1.1新)。
414RequestURITooLongURI太长(HTTP1.1新)。
416RequestedRangeNotSatisfiable服务器不克不及满意客户在哀求中指定的Range头。(HTTP1.1新)
500InternalServerError服务器碰到了料想不到的情形,不克不及完成客户的哀求。
501NotImplemented服务器不撑持完成哀求所必要的功效。比方,客户收回了一个服务器不撑持的PUT哀求。
502BadGateway服务器作为网关大概代办署理时,为了完成哀求会见下一个服务器,但该服务器前往了不法的应对。
503ServiceUnavailable服务器因为保护大概负载太重未能应对。比方,Servlet大概在数据库毗连池已满的情形下前往503。服务器前往503时能够供应一个Retry-After头。
504GatewayTimeout由作为代办署理或网关的服务器利用,暗示不克不及实时地从远程服务器取得应对。(HTTP1.1新)
505HTTPVersionNotSupported服务器不撑持哀求中所指明的HTTP版本。(HTTP1.1新)
7.4实例:会见多个搜刮引擎
上面这个例子用到了除200以外的别的两个罕见形态代码:302和404。302经由过程sendRedirect办法设置,404经由过程sendError办法设置。
在这个例子中,起首呈现的HTML表单用来选择搜刮引擎、搜刮字符串、每页显现的搜刮了局数目。表单提交后,Servlet提取这三个变量,依照所选择的搜刮引擎的请求机关出包括这些变量的URL,然后把用户重定向到这个URL。假如用户不克不及准确地选择搜刮引擎,大概使用其他表单发送了一个不熟悉的搜刮引擎名字,则前往一个提醒搜刮引擎找不到的404页面。
SearchEngines.java
注重:这个Servlet要用到前面给出的SearchSpec类,SearchSpec的功效是机关合适分歧搜刮引擎的URL。
packagehall;
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.net.*;
publicclassSearchEnginesextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,IOException{
//getParameter主动解码URL编码的查询字符串。因为我们
//要把查询字符串发送给另外一个服务器,因而再次利用
//URLEncoder举行URL编码
StringsearchString=
URLEncoder.encode(request.getParameter("searchString"));
StringnumResults=
request.getParameter("numResults");
StringsearchEngine=
request.getParameter("searchEngine");
SearchSpec[]commonSpecs=SearchSpec.getCommonSpecs();
for(inti=0;i<commonSpecs.length;i++){
SearchSpecsearchSpec=commonSpecs;
if(searchSpec.getName().equals(searchEngine)){
Stringurl=
response.encodeURL(searchSpec.makeURL(searchString,
numResults));
response.sendRedirect(url);
return;
}
}
response.sendError(response.SC_NOT_FOUND,
"Norecognizedsearchenginespecified.");
}
publicvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
SearchSpec.java
packagehall;
classSearchSpec{
privateStringname,baseURL,numResultsSuffix;
privatestaticSearchSpec[]commonSpecs=
{newSearchSpec("google",
"http://www.google.com/search?q=",
"&num="),
newSearchSpec("infoseek",
"http://infoseek.go.com/Titles?qt=",
"&nh="),
newSearchSpec("lycos",
"http://lycospro.lycos.com/cgi-bin/pursuit?query=",
"&maxhits="),
newSearchSpec("hotbot",
"http://www.hotbot.com/?MT=",
"&DC=")
};
publicSearchSpec(Stringname,
StringbaseURL,
StringnumResultsSuffix){
this.name=name;
this.baseURL=baseURL;
this.numResultsSuffix=numResultsSuffix;
}
publicStringmakeURL(StringsearchString,StringnumResults){
return(baseURL+searchString+numResultsSuffix+numResults);
}
publicStringgetName(){
return(name);
}
publicstaticSearchSpec[]getCommonSpecs(){
return(commonSpecs);
}
}
SearchEngines.html
上面是挪用上述Servlet的HTML表单。
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">
<HTML>
<HEAD>
<TITLE>会见多个搜刮引擎</TITLE>
</HEAD>
<BODYBGCOLOR="#FDF5E6">
<FORMACTION="/servlet/hall.SearchEngines">
<CENTER>
搜刮关头字:
<INPUTTYPE="TEXT"NAME="searchString"><BR>
每页显现几个查询了局:
<INPUTTYPE="TEXT"NAME="numResults"
VALUE=10SIZE=3><BR>
<INPUTTYPE="RADIO"NAME="searchEngine"
VALUE="google">
Google|
<INPUTTYPE="RADIO"NAME="searchEngine"
VALUE="infoseek">
Infoseek|
<INPUTTYPE="RADIO"NAME="searchEngine"
VALUE="lycos">
Lycos|
<INPUTTYPE="RADIO"NAME="searchEngine"
VALUE="hotbot">
HotBot
<BR>
<INPUTTYPE="SUBMIT"VALUE="Search">
</CENTER>
</FORM>
</BODY>
</HTML>
最后我再次声明,我并没有说不看好java,实际上我对java很乐观的,毕竟她正在不断改进中,我相信她总有一天会和.net并驾齐驱的 |
|