仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 682|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网页编程之JSP 设置HTTP应对头

[复制链接]
跳转到指定楼层
楼主
发表于 2015-1-18 11:34:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
JAVA学习必须明确这是一项投资,对于大多数的人来说,学习JAVA是为了就业,还有就是刚走向工作位置的朋友想尽快赶上工作的节奏。js8.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>


在1995年5月23日以“Java”的名称正式发布了。
分手快乐 该用户已被删除
沙发
发表于 2015-1-21 10:15:00 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
变相怪杰 该用户已被删除
板凳
发表于 2015-1-28 08:09:47 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
再现理想 该用户已被删除
地板
发表于 2015-2-2 13:32:06 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
金色的骷髅 该用户已被删除
5#
发表于 2015-2-2 16:50:04 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
蒙在股里 该用户已被删除
6#
发表于 2015-2-6 00:11:45 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
海妖 该用户已被删除
7#
发表于 2015-2-9 03:15:55 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
冷月葬花魂 该用户已被删除
8#
发表于 2015-2-26 19:49:12 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
再见西城 该用户已被删除
9#
发表于 2015-3-6 04:40:08 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
乐观 该用户已被删除
10#
发表于 2015-3-7 22:00:57 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
若天明 该用户已被删除
11#
发表于 2015-3-8 11:31:46 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
飘灵儿 该用户已被删除
12#
发表于 2015-3-14 13:28:13 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
飘飘悠悠 该用户已被删除
13#
发表于 2015-3-15 22:22:45 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
不帅 该用户已被删除
14#
发表于 2015-3-18 07:05:56 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
admin 该用户已被删除
15#
发表于 2015-3-19 03:38:43 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
莫相离 该用户已被删除
16#
发表于 2015-3-24 07:48:57 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
小女巫 该用户已被删除
17#
发表于 2015-3-24 07:52:08 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
愤怒的大鸟 该用户已被删除
18#
发表于 2015-4-6 17:33:59 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
小魔女 该用户已被删除
19#
发表于 2015-4-12 03:52:19 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
活着的死人 该用户已被删除
20#
发表于 2015-4-12 16:56:34 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 08:05

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表