JAVA教程之关于 HTTP应对头的成绩 tshhgd 请看
但是一些大型开发或者是保密型比较高的项目都会用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程序员是操作员,呵呵。 J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言 一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。 是一种为 Internet发展的计算机语言 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。 J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 是一种使用者不需花费很多时间学习的语言 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
页:
[1]