仓酷云
标题:
JAVA教程之jsp Servlet基本进门进修:设置HTTP应对...
[打印本页]
作者:
老尸
时间:
2015-1-18 11:11
标题:
JAVA教程之jsp Servlet基本进门进修:设置HTTP应对...
比如模式、敏捷方法什么的,这些思想好,但是实施的人没有理解而且没有正确运用这些知识导致了开发周期的延长。比如说对象,通过getName()方法不能获取对象的名字。js|servlet
8.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或是其他语言都可以学,编程的关键不是语言,而是思想。
作者:
admin
时间:
2015-1-20 16:19
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.ckuyun.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
作者:
若相依
时间:
2015-1-21 11:33
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
作者:
分手快乐
时间:
2015-1-23 17:57
Java 编程语言的风格十分接近C、C++语言。
作者:
第二个灵魂
时间:
2015-1-23 19:58
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
作者:
柔情似水
时间:
2015-1-31 19:43
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
作者:
老尸
时间:
2015-2-6 19:27
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
作者:
简单生活
时间:
2015-2-8 22:40
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
作者:
小妖女
时间:
2015-2-13 14:20
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
作者:
再现理想
时间:
2015-3-3 22:38
是一种使用者不需花费很多时间学习的语言
作者:
飘灵儿
时间:
2015-3-11 13:50
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
作者:
谁可相欹
时间:
2015-3-18 15:09
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
作者:
金色的骷髅
时间:
2015-3-26 00:44
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2