|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
比如模式、敏捷方法什么的,这些思想好,但是实施的人没有理解而且没有正确运用这些知识导致了开发周期的延长。比如说对象,通过getName()方法不能获取对象的名字。js|servlet8.1HTTP应对头概述
Web服务器的HTTP应对一样平常由以下几项组成:一个形态行,一个或多个应对头,一个空行,内容文档。设置HTTP应对头常常和设置形态行中的形态代码分离起来。比方,有好几个暗示“文档地位已改动”的形态代码都陪伴着一个Location头,而401(Unauthorized)形态代码则必需陪伴一个WWW-Authenticate头。
但是,即便在没有设置特别寄义的形态代码时,指定应对头也是很有效的。应对头能够用来完成:设置Cookie,指定修正日期,唆使扫瞄器依照指定的距离革新页面,声明文档的长度以便当用耐久HTTP毗连,……等等很多其他义务。
设置应对头最经常使用的办法是HttpServletResponse的setHeader,该办法有两个参数,分离暗示应对头的名字和值。和设置形态代码类似,设置应对头应当在发送任何文档内容之行进行。
setDateHeader办法和setIntHeadr办法专门用来设置包括日期和整数值的应对头,前者制止了把Java工夫转换为GMT工夫字符串的贫苦,后者则制止了把整数转换为字符串的贫苦。
HttpServletResponse还供应了很多设置罕见应对头的烦琐办法,以下所示:
setContentType:设置Content-Type头。年夜多半Servlet都要用到这个办法。
setContentLength:设置Content-Length头。关于撑持耐久HTTP毗连的扫瞄器来讲,这个函数是很有效的。
addCookie:设置一个Cookie(ServletAPI中没有setCookie办法,由于应对常常包括多个Set-Cookie头)。
别的,如上节先容,sendRedirect办法设置形态代码302时也会设置Location头。
8.2罕见应对头及其寄义
有关HTTP头具体和完全的申明,请拜见http://www.w3.org/Protocols/标准。
应对头申明
Allow服务器撑持哪些哀求办法(如GET、POST等)。
Content-Encoding文档的编码(Encode)办法。只要在解码以后才能够失掉Content-Type头指定的内容范例。使用gzip紧缩文档可以明显地削减HTML文档的下载工夫。Java的GZIPOutputStream能够很便利地举行gzip紧缩,但只要Unix上的Netscape和Windows上的IE4、IE5才撑持它。因而,Servlet应当经由过程检察Accept-Encoding头(即request.getHeader("Accept-Encoding"))反省扫瞄器是不是撑持gzip,为撑持gzip的扫瞄器前往经gzip紧缩的HTML页面,为其他扫瞄器前往一般页面。
Content-Length暗示内容长度。只要当扫瞄器利用耐久HTTP毗连时才必要这个数据。假如你想要使用耐久毗连的上风,能够把输入文档写进ByteArrayOutputStram,完成后检察其巨细,然后把该值放进Content-Length头,最初经由过程byteArrayStream.writeTo(response.getOutputStream()发送内容。
Content-Type暗示前面的文档属于甚么MIME范例。Servlet默许为text/plain,但一般必要显式地指定为text/html。因为常常要设置Content-Type,因而HttpServletResponse供应了一个公用的办法setContentTyep。
Date以后的GMT工夫。你能够用setDateHeader来设置这个头以免转换工夫格局的贫苦。
Expires应当在甚么时分以为文档已过时,从而不再缓存它?
Last-Modified文档的最初修改工夫。客户能够经由过程If-Modified-Since哀求头供应一个日期,该哀求将被视为一个前提GET,只要修改工夫迟于指准时间的文档才会前往,不然前往一个304(NotModified)形态。Last-Modified也可用setDateHeader办法来设置。
Location暗示客户应该到那里往提取文档。Location一般不是间接设置的,而是经由过程HttpServletResponse的sendRedirect办法,该办法同时设置形态代码为302。
Refresh暗示扫瞄器应当在几工夫以后革新文档,以秒计。除革新以后文档以外,你还能够经由过程setHeader("Refresh","5;URL=http://host/path")让扫瞄器读取指定的页面。
注重这类功效一般是经由过程设置HTML页面HEAD区的<METAHTTP-EQUIV="Refresh"CONTENT="5;URL=http://host/path">完成,这是由于,主动革新或重定向关于那些不克不及利用CGI或Servlet的HTML编写者非常主要。可是,关于Servlet来讲,间接设置Refresh头加倍便利。
注重Refresh的意义是“N秒以后革新本页面或会见指定页面”,而不是“每隔N秒革新本页面或会见指定页面”。因而,一连革新请求每次都发送一个Refresh头,而发送204形态代码则能够制止扫瞄器持续革新,不论是利用Refresh头仍是<METAHTTP-EQUIV="Refresh"...>。
注重Refresh头不属于HTTP1.1正式标准的一部分,而是一个扩大,但Netscape和IE都撑持它。
Server服务器名字。Servlet一样平常不设置这个值,而是由Web服务器本人设置。
Set-Cookie设置和页面联系关系的Cookie。Servlet不该利用response.setHeader("Set-Cookie",...),而是应利用HttpServletResponse供应的公用办法addCookie。拜见下文有关Cookie设置的会商。
WWW-Authenticate客户应当在Authorization头中供应甚么范例的受权信息?在包括401(Unauthorized)形态行的应对中这个头是必须的。比方,response.setHeader("WWW-Authenticate","BASICrealm=\"executives\"")。
注重Servlet一样平常不举行这方面的处置,而是让Web服务器的专门机制来把持受暗码回护页面的会见(比方.htaccess)。
8.3实例:内容改动时主动革新页面
上面这个Servlet用来盘算年夜素数。由于盘算十分年夜的数字(比方500位)大概要花很多工夫,以是Servlet将当即前往已找到的了局,同时在背景持续盘算。背景盘算利用一个优先级较低的线程以免过量地影响Web服务器的功能。假如盘算还没有完成,Servlet经由过程发送Refresh头唆使扫瞄器在几秒以后持续哀求新的内容。
注重,本例除申明HTTP应对头的用途以外,还显现了Servlet的别的两个很有代价的功效。起首,它标明Servlet可以处置多个并发的毗连,每一个都有本人的线程。Servlet保护了一份已有素数盘算哀求的Vector表,经由过程查找素数个数(素数列表的长度)和数字个数(每一个素数的长度)将以后哀求和已有哀求相婚配,把一切这些哀求同步到这个列表上。第二,本例证实,在Servlet中保持哀求之间的形态信息长短常简单的。保持形态信息在传统的CGI编程中是一件很贫苦的事变。因为保持了形态信息,扫瞄器可以在革新页面时会见到正在举行的盘算历程,同时也使得Servlet可以保留一个有关比来哀求了局的列表,当一个新的哀求指定了和比来哀求不异的参数时能够当即前往了局。
PrimeNumbers.java
注重,该Servlet要用到后面给出的ServletUtilities.java。别的还要用到:PrimeList.java,用于在背景线程中创立一个素数的Vector;Primes.java,用于随机天生BigInteger范例的年夜数字,反省它们是不是是素数。(此处略往PrimeList.java和Primes.java的代码。)
packagehall;
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.util.*;
publicclassPrimeNumbersextendsHttpServlet{
privatestaticVectorprimeListVector=newVector();
privatestaticintmaxPrimeLists=30;
publicvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,IOException{
intnumPrimes=ServletUtilities.getIntParameter(request,"numPrimes",50);
intnumDigits=ServletUtilities.getIntParameter(request,"numDigits",120);
PrimeListprimeList=findPrimeList(primeListVector,numPrimes,numDigits);
if(primeList==null){
primeList=newPrimeList(numPrimes,numDigits,true);
synchronized(primeListVector){
if(primeListVector.size()>=maxPrimeLists)
primeListVector.removeElementAt(0);
primeListVector.addElement(primeList);
}
}
VectorcurrentPrimes=primeList.getPrimes();
intnumCurrentPrimes=currentPrimes.size();
intnumPrimesRemaining=(numPrimes-numCurrentPrimes);
booleanisLastResult=(numPrimesRemaining==0);
if(!isLastResult){
response.setHeader("Refresh","5");
}
response.setContentType("text/html");
PrintWriterout=response.getWriter();
Stringtitle="Some"+numDigits+"-DigitPrimeNumbers";
out.println(ServletUtilities.headWithTitle(title)+
"<BODYBGCOLOR=\"#FDF5E6\">\n"+
"<H2ALIGN=CENTER>"+title+"</H2>\n"+
"<H3>Primesfoundwith"+numDigits+
"ormoredigits:"+numCurrentPrimes+".</H3>");
if(isLastResult)
out.println("<B>Donesearching.</B>");
else
out.println("<B>Stilllookingfor"+numPrimesRemaining+
"more<BLINK>...</BLINK></B>");
out.println("<OL>");
for(inti=0;i<numCurrentPrimes;i++){
out.println("<LI>"+currentPrimes.elementAt(i));
}
out.println("</OL>");
out.println("</BODY></HTML>");
}
publicvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
//反省是不是存在同范例哀求(已完成,大概正在盘算)。
//如存在,则前往现有了局而不是启动新的背景线程。
privatePrimeListfindPrimeList(VectorprimeListVector,
intnumPrimes,
intnumDigits){
synchronized(primeListVector){
for(inti=0;i<primeListVector.size();i++){
PrimeListprimes=(PrimeList)primeListVector.elementAt(i);
if((numPrimes==primes.numPrimes())&&
(numDigits==primes.numDigits()))
return(primes);
}
return(null);
}
}
}
PrimeNumbers.html
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">
<HTML>
<HEAD>
<TITLE>年夜素数盘算</TITLE>
</HEAD>
<CENTER>
<BODYBGCOLOR="#FDF5E6">
<FORMACTION="/servlet/hall.PrimeNumbers">
<B>要盘算几个素数:</B>
<INPUTTYPE="TEXT"NAME="numPrimes"VALUE=25SIZE=4><BR>
<B>每一个素数的位数:</B>
<INPUTTYPE="TEXT"NAME="numDigits"VALUE=150SIZE=3><BR>
<INPUTTYPE="SUBMIT"VALUE="入手下手盘算">
</FORM>
</CENTER>
</BODY>
</HTML>
还有就是总有人问我到底该学习什么语言,什么语言有前途,那么我的回答是不论是C,C++,java,.net,ruby,asp或是其他语言都可以学,编程的关键不是语言,而是思想。 |
|