仓酷云 发表于 2015-1-18 11:34:06

JAVA网页设计JSP HTTP应对形态

有了这样一个呼声:让java代替C语言成为基本语言。这些足以说明java简单易学的这个优点。其次,java的功能强大,前面我也提到了,EJB3.0的推出使java成为了大型项目的首选。js7.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功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。

不帅 发表于 2015-1-21 10:14:43

是一种使用者不需花费很多时间学习的语言

爱飞 发表于 2015-1-30 14:47:53

其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。

灵魂腐蚀 发表于 2015-2-6 13:28:56

Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台

仓酷云 发表于 2015-2-16 06:48:48

设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧

简单生活 发表于 2015-2-16 07:53:56

是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言

柔情似水 发表于 2015-2-19 04:35:57

是一种将安全性(Security)列为第一优先考虑的语言

乐观 发表于 2015-2-27 10:58:36

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

金色的骷髅 发表于 2015-3-4 03:47:37

是一种为 Internet发展的计算机语言

再见西城 发表于 2015-3-8 01:03:33

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

只想知道 发表于 2015-3-9 13:11:31

你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。

山那边是海 发表于 2015-3-10 12:49:45

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

小女巫 发表于 2015-3-15 00:27:33

是一种使用者不需花费很多时间学习的语言

小魔女 发表于 2015-3-15 13:25:53

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

再现理想 发表于 2015-3-17 16:10:31

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

小妖女 发表于 2015-3-19 03:38:43

是一种将安全性(Security)列为第一优先考虑的语言

因胸联盟 发表于 2015-3-26 21:14:35

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?

admin 发表于 2015-3-26 22:02:00

让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。

变相怪杰 发表于 2015-4-6 17:33:59

是一种为 Internet发展的计算机语言

若相依 发表于 2015-4-10 09:36:05

是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
页: [1] 2
查看完整版本: JAVA网页设计JSP HTTP应对形态