|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
但是一些大型开发或者是保密型比较高的项目都会用java,原因有2点,一:java是开源的,不怕别人留后门,偷我工具,.net就不一样了,保持微软的一向风格,源代码不公开成绩HTTP应对头
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头。
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)。
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>
net程序员的大部门代码都靠控件拖拽完成的,虽然java也有,但是无论从美观和速度上都没发和.net比。java程序员都是代码完成的,所以java程序员常戏称.net程序员是操作员,呵呵。 |
|