??xml version="1.0" encoding="utf-8" standalone="yes"?>国产成A人亚洲精V品无码性色,亚洲av纯肉无码精品动漫,亚洲最大成人网色香蕉http://www.tkk7.com/ltc603/category/14745.html<font size="3">学无止境</font> <br> <script type="text/javascript" src="http://wujunlove.googlepages.com/bigstaticeyes.js"></script>zh-cnWed, 28 Feb 2007 06:23:08 GMTWed, 28 Feb 2007 06:23:08 GMT60CSS全攻略-?/title><link>http://www.tkk7.com/ltc603/archive/2006/10/25/77265.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Wed, 25 Oct 2006 11:11:00 GMT</pubDate><guid>http://www.tkk7.com/ltc603/archive/2006/10/25/77265.html</guid><wfw:comment>http://www.tkk7.com/ltc603/comments/77265.html</wfw:comment><comments>http://www.tkk7.com/ltc603/archive/2006/10/25/77265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ltc603/comments/commentRss/77265.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ltc603/services/trackbacks/77265.html</trackback:ping><description><![CDATA[ <div style="MARGIN-TOP: 5px; MARGIN-LEFT: 15px"> <b>关键?</b>   转脓     </div> <div style="MARGIN-TOP: 10px; MARGIN-LEFT: 15px"> <table width="100%"> <tbody> <tr> <td> <p>CSS全称Cascading Style Sheet。层叠式样式表。从三年前就开始用CSS了,但一直以来都看了它。CSS的出现其实是一ơ革命,它试囑ְ|站的内容与表现分开?<br />一、CSS的四U实现方式: <br />1.内嵌式:</p> <p>2.外链式:</p> <p>3.导入?/p> <p>3.属性式Q?<br />?CSS的定义: <br />选择对象{属?:?;属?:?;属?:?;属性n:值n……} <br />如: <br />td{font-size:12px;color:#FFFF00} <br />.myname{font-size:12px;color:#FFFF00} <br />a:hover{font-size:12px;color:#FFFF00;text-decoration: underline;} <br />?四种选择对象 <br />1.HTML selector (TagName) <br />2.class selector (.NAME) <br />3.ID selector (#IDname) <br />4.Ҏ对象 (a:hover a:link a:visited a:active) <br />1.HTML selector <br />HTML selector是HTML的置标符Q如QDIV、TD、H1。HTML selector的作用范围是应用了该样式的所有页面中的所有该|标W?<br />例: <br />td <br />{ color: #FF0000; <br />} <br />--> <br />注意Q在中没有应用什么,其中文字自动变红艌Ӏ?<br />2.class selector <br />定义class selector需要往其名U其加一个点?”。如?classname”。class selector的作用范围是所有包含“class="classname"”的|标W?<br />例: <br />.fontRed <br />{ color: #FF0000; <br />} --> <br />注意Q在W二个中没有“class="fontRed"”,所以文字没有变U色?<br />3.ID selector <br />定义ID selector需要往其名U其加一个点?”。如?IDname”。ID selector的作用范围是所有包含“ID="classname"”的|标W?<br />例:</p> <p>#fontRed <br />{ color: #FF0000; <br />} --> <br />注意Q在W二个中没有“ID="fontRed"”,所以文字没有变U色?<br />4.Ҏ对象 <br />Ҏ对象包括四种Q是针对链接对象讄? <br />a:hover 鼠标UM时的链?<br />a:link 常规Q非讉K链?<br />a:visited 讉Kq的链?<br />a:active 鼠标点击时的链?<br />Ҏ对象的作用范围是所有置标符Q这句话有待商榷Q因Z面很快就有一U方法可以把“所有”两个字推翻Q?<br />例: <br />a:hover <br />{ color: #0000FF; <br />text-decoration: underline; <br />} --> <br />注意下面Q很有用Q!Q?<br />a.classname:hover <br />a#IDname:hover <br />q两U写法,是分别配?classname?IDname使用的。它的作用范围变成了所有包含“class="classname"”或“ID="IDname"”的|标W。这U写法,可以帮助你在同一面中实现多Ua:hover效果Q可以看一下艺|的主页上导航栏文字与普通文章标题在鼠标时的区别?<br />?应用Q?<br />1.|标W 自动应用 <br />2.特制cRclass="NAME" <br />3.ID ID="IDname" <br />4.Ҏ对象 自动应用 <br />?CSS属?<br />CSS的属性有很多Q像上文中用到最多的colorQ表C文字的颜色。background-color表示背景艌Ӏ这个是最主要的,但是因ؓ没有什么难度,参考一下相x册就可以了?/p> <p>注明两点 <br />W一点:css的方式现在一般都采用外部q接Q这个用h方便Q编译v来也方便 <br />W二点:我用的是frontpage2003Q很多css的参数都会自动提C,g好像以前我没有用到过~~dw有的</p> <p>CSS 标签属?属性参?<br />q里列出了目前支持的样式?CSS)标签属性。标有星?*)的标{ֱ性可?Microsoft] Internet Explorer 5 中用。标有两个星?**)的标{ֱ性可?Internet Explorer 5.5 中用。带有两个加?++)的标{ֱ性可?Internet Explorer 6 中用。如果某个标{ֱ性或属性已l提交给万维|协?W3C)但尚未作为标准发布,则标有“已提交”。若某个标签属性或属性既未提交给 W3C 也不是标准,标有“扩展”?/p> <p>CSS 标签属?属?/p> <p>行ؓ属?behavior</p> <p>字体和文本属?direction* </p> <p>direction <br />font <br />font-family <br />font-size <br />font-style <br />font-variant <br />font-weight <br />ime-mode <br />layout-grid <br />layout-grid-char <br />layout-grid-line <br />layout-grid-mode <br />layout-grid-type <br />letter-spacing <br />line-break <br />line-height <br />min-height ++ <br />ruby-align <br />ruby-overhang <br />ruby-position <br />text-align <br />text-autospace <br />text-decoration <br />text-indent <br />text-justify <br />text-kashida-space <br />text-overflow ++ <br />text-transform <br />text-underline-position <br />unicode-bidi <br />vertical-align <br />white-space** <br />word-break <br />word-spacing ++(?Macintosh 版本 4.0 中可? <br />word-wrap <br />writing-mode</p> <p>颜色和背景属?background-attachment <br />background-color <br />background-image <br />background-position <br />background-position-x <br />background-position-y <br />background-repeat <br />color </p> <p>版面属?border <br />border-bottom <br />border-bottom-color <br />border-bottom-style <br />border-bottom-width <br />border-collapse* <br />border-color <br />border-left <br />border-left-color <br />border-left-style <br />border-left-width <br />border-right <br />border-right-color <br />border-right-style <br />border-right-width <br />border-style <br />border-top <br />border-top-color <br />border-top-style <br />border-top-width <br />border-width <br />clear <br />float <br />layout-flow <br />margin <br />margin-bottom <br />margin-left <br />margin-right <br />margin-top <br />padding <br />padding-bottom <br />padding-left <br />padding-right <br />padding-top <br />scrollbar-3dlight-color <br />scrollbar-arrow-color <br />scrollbar-base-color <br />scrollbar-darkshadow-color <br />scrollbar-face-color <br />scrollbar-highlight-color <br />scrollbar-shadow-color <br />table-layout* <br />zoom</p> <p>分类属?display </p> <p>list-style <br />list-style-image <br />list-style-position <br />list-style-type </p> <p>定位属?bottom* </p> <p>clip <br />height <br />left <br />overflow <br />overflow-x <br />overflow-y <br />position <br />right* <br />top <br />visibility <br />width <br />z-index </p> <p>打印属?page** </p> <p>pageBreakAfter <br />pageBreakBefore</p> <p>滤镜属?filter</p> <p>伪类和其它属?:active </p> <p>@charset <br />cursor <br />:first-letter** <br />:first-line** <br />@font-face <br />:hover <br />@import <br />!important <br />:link <br />@media* <br />@page** <br />:visited <br />有关表格Ҏ的css语法整理</p> <p>我们知道Dreamweaver在表格制作方面做得非常出Ԍ但是在某些时候还是必ȝ合css才能辑ֈ一些特定效果,下面我们先把有关表格Ҏ的css语法整理出来Q然后另外介l怎样用css化表格的边框?/p> <p>  有关表格Ҏ的css语法</p> <p>  具体内容包括Q上Ҏ宽度、右Ҏ宽度、下Ҏ宽度、左Ҏ宽度、边框宽度、边框颜艌Ӏ边框样式、上Ҏ、下Ҏ、左Ҏ、右Ҏ、边框、宽度、高度、有x{?/p> <p>   1.上边框宽?/p> <p>  语法: border-top-width: <?gt;</p> <p>  允许? thin | medium | thick | <长度></p> <p>  初始? medium</p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  上边框宽度属性用于指定一个元素上Ҏ的宽度。值可以是三个关键字其中的一个,都不受字体大或长度的媄响,可以用于实现成比例的宽度。不允许使用负倹{也可以用在上边框、边框的宽度或边框的属性略写?/p> <p>  2.双框宽?/p> <p>  语法: border-right-width: <?gt;</p> <p>  允许? thin | medium | thick | <长度></p> <p>  初始? medium</p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  双框宽度属性用于指定元素的双框的宽度。值可以是三个关键字其中的一个,都不受字体大或长度的媄响,可以用于实现成比例的宽度。不允许使用负倹{也可以用在双框、边框的宽度或边框的属性略写?/p> <p>   3.下边框宽?/p> <p>  语法: border-bottom-width: <?gt;</p> <p>  允许? thin | medium | thick | <长度></p> <p>  初始? medium</p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  下边框宽度属性用于指定元素的下边框的宽度。值可以是三个关键字其中的一个,都不受字体大或长度的媄响,可以用于实现成比例的宽度。不允许使用负倹{也可以用在下边框、边框的宽度或边框的属性略写?/p> <p>   4.左边框宽?/p> <p>  语法: border-left-width: <?gt;</p> <p>  允许? thin | medium | thick | <长度></p> <p>  初始? medium</p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  左边框宽度属性用于指定元素的左边框的宽度。值可以是三个关键字其中的一个,都不受字体大或长度的媄响,可以用于实现成比例的宽度。不允许使用负倹{也可以用在左边框、边框的宽度或边框的属性略写?/p> <p>  5.Ҏ宽度</p> <p>  语法: border-width: <?gt;</p> <p>  允许? [ thin | medium | thick | <长度> ]{1,4}</p> <p>  初始? 未定?/p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  Ҏ宽度属性用一到四个值来讄元素的边界,值是一个关键字或长度。不允许使用负值长度。如果四个值都l出了,它们分别应用于上、右、下和左Ҏ的式栗如果给Z个|它将被运用到各边上。如果两个或三个值给ZQ省略了的g对边相等?q个属性是上边框宽度、右Ҏ宽度、下Ҏ宽度和左Ҏ宽度属性的略写。也可以使用略写的边框属性?/p> <p>  6.Ҏ颜色</p> <p>  语法: border-color: <?gt;</p> <p>  允许? <颜色>{1,4}</p> <p>  初始? 颜色属性的?/p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  Ҏ颜色属性设|一个元素的Ҏ颜色。可以用一到四个关键字。如果四个值都l出了,它们分别应用于上、右、下和左Ҏ的式栗如果给Z个|它将被运用到各边上。如果两个或三个值给ZQ省略了的g对边相等。也可以使用略写的边框属性?/p> <p>  7.Ҏ样式</p> <p>  语法: border-style: <?gt;</p> <p>  允许? [ none | dotted | dashed | solid | double | groove | ridge | inset | outset ]{1,4}</p> <p>  初始? none</p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  Ҏ样式属性用于设|一个元素边框的样式。这个属性必ȝ于指定可见的Ҏ。可以用一到四个关键字。如果四个值都l出了,它们分别应用于上、右、下和左Ҏ的式栗如果给Z个|它将被运用到各边上。如果两个或三个值给ZQ省略了的g对边相等。也可以使用略写的边框属性?/p> <p>  noneQ无样式Q?<br />  dottedQ点U; <br />  dashedQ虚U; <br />  solidQ实U; <br />  doubleQ双U; <br />  grooveQ槽U; <br />  ridgeQ脊U; <br />  insetQ内凹; <br />  outsetQ外凸?<br />8.上边?/p> <p>  语法: border-top: <?gt;</p> <p>  允许? <上边框宽?gt; || <Ҏ式样> || <颜色></p> <p>  初始? 未定?/p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  上边框属性是一个用于设|一个元素上Ҏ的宽度、式样和颜色的略写。注意只能给Z个边框式栗也可以使用略写的边框属性?/p> <p>  9.双?/p> <p>  语法: border-right: <?gt;</p> <p>  允许? <双框宽?gt; || <Ҏ式样> || <颜色></p> <p>  初始? 未定?/p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  双框属性是一个用于设|一个元素右Ҏ的宽度、式栗和颜色的略写。注意只能给Z个边框式栗也可以使用略写的边框属性。   </p> <p>  10.下边?/p> <p>  语法: border-bottom: <?gt;</p> <p>  允许? <下边框宽?gt; || <Ҏ式样> || <颜色></p> <p>  初始? 未定?/p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  下边框属性是一个用于设|一个元素的下边框的宽度、式样和颜色的略写。注意只能给Z个边框式栗也可以使用略写的边框属性?/p> <p>  11.左边?/p> <p>  语法: border-left: <?gt;</p> <p>  允许? <左边框宽?gt; || <Ҏ式样> || <颜色></p> <p>  初始? 未定?/p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  左边框属性是一个用于设|一个元素左Ҏ的宽度、式样和颜色的略写。注意只能给Z个边框式栗也可以使用略写的边框属性?/p> <p>   12.Ҏ</p> <p>  语法: border: <?gt;</p> <p>  允许? <Ҏ宽度> || <Ҏ式样> || <颜色></p> <p>  初始? 未定?/p> <p>  适用? 所有对?/p> <p>  向下兼容: ?/p> <p>  Ҏ属性是一个用于设|一个元素边框的宽度、式样和颜色的略写?/p> <p>  Ҏ声明的例子包括:</p> <p>  H2 { border: groove 3em } <br />  A:link { border: solid blue } <br />  A:visited { border: thin dotted #800080 } <br />  A:active { border: thick double red }</p> <p>  Ҏ属性只能设|四U边框;只能l出一l边框的宽度和式栗ؓ了给Z个元素的四种Ҏ的不同的||页制作者必ȝ一个或更多的属性,如:上边框、右Ҏ、下Ҏ、左Ҏ、边框颜艌Ӏ边框宽度、边框式栗上Ҏ宽度、右Ҏ宽度、下Ҏ宽度或左Ҏ宽度?</p> <p>  13.宽度</p> <p>  语法: width: <?gt;</p> <p>  允许? <长度> | <癑ֈ?gt; | auto</p> <p>  初始? auto</p> <p>  适用? 块和替换元?/p> <p>  向下兼容: ?/p> <p>  宽度属性的初始gؓ“auto”,即ؓ该元素的原有宽度(有就是元素自q宽度)。百分比参考上U元素的宽度。不允许使用负的长度倹{?/p> <p>  14.高度</p> <p>  语法: height: <?gt;</p> <p>  允许? <长度> | auto</p> <p>  初始? auto</p> <p>  适用? 块和替换元?/p> <p>  向下兼容: ?/p> <p>  高度属性的初始gؓ“auto”,即ؓ该元素的原有高度(有就是元素自q高度Q?。百分比参考上U元素的宽度。不允许使用负的长度倹{?/p> <p>  15.有关标签</p> <p>  tableQ表格标{,Ҏ个表格样式的定义要放在table中; <br />  tdQ单元格标签Q对单元格样式的定义要放在td中?</p> <p>css滤镜</p> <p>随着|页设计技术的发展Qh们已l不满于原有的一些HTML标记Q而是希望能够为页面添加一些多媒体属性,例如滤镜的和渐变的效果。CSS技术的飞快发展使这些需求成Z现实。从现在开始我要ؓ大家介绍一个新的CSS扩展部分QCSS滤镜属性(Filter Properties)。用这U技术可以把可视化的滤镜和{换效果添加到一个标准的HTML元素上,例如囄、文本容器、以及其他一些对象。对于o镜和渐变效果Q前者是基础Q因为后者就是o镜效果的不断变化和演C更ѝ当滤镜和渐变效果结合到一个基本的SCRIPT程序中后,|页设计者就可以拥有一个徏立动态交互文档的强大工具。也是CSS FILTER+ SCRIPTQ?q就说明惌建立动态的文档q要一些SCRIPT Q脚本语aQ的基础?<br />可视化o镜属性只能用在HTML控g元素上。所谓的HTMLI间元素是它们在页面上定义了一个矩形空_览器的H口可以昄q些I间。下面列ZHTML合法的控件和它们的说明?/p> <p>备注Q可惜只有IE4.0以上支持Q如果是别的览器,那就.......</p> <p>元素 说明 <br />BODY |页文档的主体元素,所有的可见范围都在<BODY>元素?<br />BUTTON 表单域的按钮Q可以有“发?submit)”、“重|?reset)”等形式 <br />DIV 定义了网上的一个区域,q个区域的高度、宽度或者绝对位|都是以知的 <br />IMG 囄元素Q通过指定“src"属性来指定囄的来?<br />INPUT 输入表单?<br />MARQUEE Ud字幕效果 <br />SPAN 定义了网上的一个区域,q个区域的高度、宽度或者绝对位|都是以知的 <br />TABLE 表格 <br />TD 表格数据单元?<br />TEXTAREA 文本区域 <br />TFOOT 多行输入文本?<br />TH 表格标题单元?<br />THEAD 表格标题 <br />TR 表格?</p> <p> </p> <p>IE4.0以上支持的o镜属性表</p> <p>滤镜效果 描述 <br />Alpha 讄透明?<br />Blru 建立模糊效果 <br />Chroma 把指定的颜色讄为透明 <br />DropShadow 建立一U偏Uȝp轮廓Q即投射阴媄 <br />FlipH 水^反{ <br />FlipV 垂直反{ <br />Glow 为对象的外边界增加光?<br />Grayscale 降低囄的彩色度 <br />Invert 色彩、饱和度以及亮度值完全反转徏立底片效?<br />Light 在一个对象上q行灯光投媄 <br />Mask Z个对象徏立透明?<br />Shadow 建立一个对象的Z轮廓Q即阴媄效果 <br />Wave 在X轴和Y轴方向利用正弦LUҎ乱图?<br />Xray 只显C对象的轮廓 </p> <p>1、Alpha 滤镜 <br /></p> <p>语法Q{FILTERQALPHA(opacity=opacity,finishopacity=finishopacity,style=style,startx=startx, <br />starty=starty,finishx=finishx,finishy=finishy)}</p> <p>"Alpha"属性是把一个目标元素与背景混合。设计者可以指定数值来控制混合的程度。这U“与背景混合”通俗地说是一个元素的透明度。通过指定坐标Q可以指定点、线、面的透明度。他们的参数含义分别如下Q?<br />“opacity"代表透明度水准。默认的范围是从0 ?100Q他们其实是癑ֈ比的形式。也是_0代表完全透明Q?00代表完全不透明。”finishopacity"是一个可选参敎ͼ如果惌讄渐变的透明效果Q就可以使用他们来指定结束时的透明度。范围也? ?100。“style" 参数指定了透明区域的Ş状特征。其?代表l一形状?代表UŞ?代表攑ְ状?代表长方形。”STARTX“和”STARTY“代表渐变透明效果的开始X和Y坐标。”FINISHX“和”FINISHY“代表渐变透明效果l束X和Y 的坐标?/p> <p>效果如下Q?/p> <p>2、Blur 滤镜</p> <p>语法Q对于HTMLQ{ilter:blur(add=add,direction=direction,strength=strength)} <br />对于Script语言Q?[oblurfilter=] object.filters.blur <br />用手指在一q尚未干透的油画上迅速划q时Q画面就会变得模p。”Blur"是产生同样的模p效果?<br />“ADD”参数是一个布判断“TRUEQ默认)”或者“FALSE”。它指定囄是否被改变成印象z模糊效果。模p效果是按顺旉的方向进行的Q“DIRECTION”参数用来设|模p的方向。其?度代表垂直向上,然后?5度ؓ一个单位。它的默认值是向左?70度。“STRENGTH“值只能用整数来指定Q她代表有多像素的宽度受到模p媄响。默认是5个。对于网上的字体,如果讄他的模糊”ADD=1“,那么q些字体的效果会非常好看的。如下: <br />filter:blur(add=ture,direction=135,strength=10Q?/p> <p>3、FlipH, FlipV 滤镜</p> <p>语法Q{filter:filph} ,{filter:filpv} 分别是水q_转和垂直反{Q具体如下:</p> <p>4、Chroma 滤镜</p> <p>语法Q{filter:chroma(color=color)} <br />使用”Chroma"属性可以设|一个对象中指定的颜色ؓ透明Ԍ参数COLOR卌透明的颜艌Ӏ下面是兰色文字Q然后用Chroma 滤镜qo掉兰Ԍ成了下面的样子?<br />filter:chroma(color=blue)</p> <p>滴水檐坊</p> <p>5、DropShadow 滤镜</p> <p>语法Q{filter:dropshadow(color=color,offx=ofx,offy=offy,positive=positive)}</p> <p>“DropShaow"֐思义是d对象的阴影效果。其工作原理是徏立一个偏U量Q加上较深?Color"代表投射阴媄的颜Ԍ"offx"?offy"分别是X方向和Y方向阴媄的饿偏移量?Positive"参数是一个布|如果为“TRUEQ非0Q”,那么׃ؓM的非透明像素建立可见的投影。如果ؓ“FASLEQ?Q”,那么׃ؓ透明的像素部分徏立透明效果</p> <p>6、Glow 滤镜</p> <p>语法Q{filter:glow(color=color,strength)} <br />当对一个对象?glow"属性后Q这个对象的边缘׃产生cM发光的效果。“COLOR”是指定发光的颜Ԍ“STRENGTH”则是强度的表现Q可以从1?55之间的Q何整数来指定q个力度?<br />filter:glow(color=red,strength=10) 后的效果 </p> <p>7、Gray ,Invert,Xray 滤镜</p> <p>语法Q{filter:gray} ,{filter:invert},{filter:xray}</p> <p>Gray滤镜是把一张图片变成灰度图QInvert滤镜是把对象的可视化属性全部翻转,包括色彩、饱和度、和亮度|Xray滤镜是让对象反映出它的轮廓ƈ把这些轮廓加亮,也就是所谓的“X”光片?/p> <p>效果如下Q?/p> <p>、Light 滤镜</p> <p>语法QFilter{light}</p> <p>q个属性模拟光源的投射效果。一旦ؓ对象定义了“LIGHT"滤镜属性,那么可以调用它的“方?Method)"来设|或者改变属性。“LIGHT"可用的方法有Q?/p> <p>AddAmbient 加入包围的光?<br />AddCone 加入锥Ş光源 <br />AddPoint 加入点光?<br />Changcolor 改变光的颜色 <br />Changstrength 改变光源的强?<br />Clear 清除所有的光源 <br />MoveLight Ud光源 <br />可以定义光源的虚拟位|,以及通过调整X轴和Y轴的数值来控制光源焦点的位|,q可以调整光源的形式Q点光源或者锥形光源)指定光源是否模糊边界、光源的颜色、亮度等属性。如果动态的讄光源Q可能回产生一些意想不到的效果。后面几会有具体范例?/p> <p>9、Mask 滤镜</p> <p>语法Q{filter:mask(color=color)}</p> <p>使用"MASK"属性可以ؓ对象建立一个覆盖于表面的膜Q其效果p戴者有色眼镜看物体一栗?/p> <p>10、Shadow 滤镜</p> <p>语法Q{filter:shadow(color=color,direction=direction)}</p> <p>利用“Shadow”属性可以在指定的方向徏立物体的投媄QCOLOR是投pQDIRECTION是设|投q方向。其?度代表垂直向上,然后?5度ؓ一个单位。它的默认值是向左?70度?/p> <p>filter:shadow(color=red,direction=225) <br />filter:shadow(color=blue,direction=225) <br />filter:shadow(color=gray,direction=225) <br />效果分别如下Q?/p> <p>11、Wave 滤镜 语法Q{filter:wave(add=add,freq=freq,lightstrength=strength,phase=phase,strength=strength)} <br />"wave" 属性把对象按垂直的波Ş样式打ؕ。默认是“TRUEQ非0Q”, <br />“ADD”表C是否要把对象按照L形样式打乱,</p> <p>“FREQ”是波纹的频率,也就是指定在对象上一共需要生多个完整的LU,</p> <p>“LIGHTSTRENGTH”参数可以对于LU增强光q效果Q范?----100Q?/p> <p>“PHASE”参数用来设|正弦L的偏U量?/p> <p>“STRENGTH”代表振q大?/p> </td> </tr> </tbody> </table> </div> <img src ="http://www.tkk7.com/ltc603/aggbug/77265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ltc603/" target="_blank">阿成</a> 2006-10-25 19:11 <a href="http://www.tkk7.com/ltc603/archive/2006/10/25/77265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>contentType ?pageEncodinghttp://www.tkk7.com/ltc603/archive/2006/09/05/67729.html阿成阿成Tue, 05 Sep 2006 01:37:00 GMThttp://www.tkk7.com/ltc603/archive/2006/09/05/67729.htmlhttp://www.tkk7.com/ltc603/comments/67729.htmlhttp://www.tkk7.com/ltc603/archive/2006/09/05/67729.html#Feedback0http://www.tkk7.com/ltc603/comments/commentRss/67729.htmlhttp://www.tkk7.com/ltc603/services/trackbacks/67729.htmlContentType属性指定了MIMEcd和JSP面回应时的字符~码方式。MIMEcd的默认值是“text/html? 字符~码方式的默认值是“ISO-8859-1? MIMEcd和字W编码方式由分号隔开

pageEncoding
pageEncoding 在JSP标准的语法中Q如果pageEncoding属性存在,那么JSP面的字W编码方式就由pageEncoding军_Q否则就由contentType属性中的charset军_Q如果charset也不存在QJSP面的字W编码方式就采用默认的ISO-8859-1?br />

阿成 2006-09-05 09:37 发表评论
]]>
对Servlet的初始化的理?http://www.tkk7.com/ltc603/archive/2006/09/04/67640.html阿成阿成Mon, 04 Sep 2006 09:25:00 GMThttp://www.tkk7.com/ltc603/archive/2006/09/04/67640.htmlhttp://www.tkk7.com/ltc603/comments/67640.htmlhttp://www.tkk7.com/ltc603/archive/2006/09/04/67640.html#Feedback0http://www.tkk7.com/ltc603/comments/commentRss/67640.htmlhttp://www.tkk7.com/ltc603/services/trackbacks/67640.html 版权所有,转蝲请声明出? zhyiwww@163.com

在读我自q认识之前 , 我们先来看一?/span> servet 的结构图 :

servlet.png
以下是我自己的一Ҏ见:

①  Servlet 在初始化的时?/span> , 是通过 init(ServletConfig  config) ?/span> init() 来执行的?/span>

ServletConfig 是一个接口,它怎样传递给他一格对象来q行初始化呢Q其实,是这个对象是?/span> servlet 容器来实例化的,由容器生一?/span> ServletConfig 的实现类的对象,然后传递给 Servlet

l论Q?/span> ServletConfig 由容器实例化

②  我们有些时候可能在 Servlet 初始化时l它一些固定的配置参数Q那么这些参数是怎样传递到 Servlet 呢?

其实Q我们在 web.xml 中给 servlet 配置启动参数Q在容器?/span> servlet q行初始化的时候,会收集你所配置的参敎ͼ记录?/span> ServletConfig 的实现类中,所以你才可以通过 ServletConfig 对象?/span>

    public String getInitParameter(String name); ?/span>

    public Enumeration getInitParameterNames();

Ҏ来取得你已经配置好的参数Q也是_你对 servlet 的配|都已经记录?/span> ServletConfig 对象中了?/span>

l论Q你?/span> Servlet 的配|,?/span> Servlet 的初始化旉由容器来攉q且记录?/span> ServletConfig 的实现类中?/span>

 

③  我们来看一?/span> Servlet 的配|?/span>

  <servlet>

    <servlet-name>index</servlet-name>

    <servlet-class>org.zy.pro.sw.servlet.IndexServlet</servlet-class>

    <init-param>

      <param-name>dbconfig</param-name>

      <param-value>/WEB-INF/dbconfig.xml</param-value>

    </init-param>

  </servlet>

在此Q我们实现对数据库的配置文g的加载?/span>

?/span> Servlet 初始化完成后Q我们可以通过

String  dbconf=this.getServletConfig().getInitParameter("dbconfig")

来取得我们的配置的参数的倹{?/span>

但是Q我们仅能得C个配|的字符丌Ӏ之后我们可以通过配置文g取得我们的数据库的配|参敎ͼ然后Ҏ据库q行初始化?/span>

其实我们也可以通过传递一个类的名字串Q然后再实例化?/span>

    <init-param>

      <param-name>dbconfig</param-name>

      <param-value>org.zy.util.db.DBUtil</param-value>

    </init-param>

我们先取得配|参敎ͼ

String  dbconf=this.getServletConfig().getInitParameter("dbconfig") Q?/span>

然后通过

Class.forName(dbconf).getInstance();

来实例化对象Q就可以实现Ҏ据库的调用了?/span>

l论Q在 web.xml 中对 Servlet 的初始化Q只能传递字W串cd的数?/span>

④  ServletContext

ServletContext 是负责和 Servlet 的上文和下文交互Q上面和 Servlet 容器交互Q下面和 Servlet 中的h和相应进行交互?/span>

?/span> ServletConfig 中,    

public ServletContext getServletContext(); Ҏ实现取得当前 ServletContext 的对象?/span>

你可能要问, ServletContext 是一个接口,那么你如何取得他的对象呢Q?/span>

其实q个问题?/span> ServletConfig 相同Q都是在 Servlet q行初始化的时候生的对象Q是由容器来初始化的?/span>



阿成 2006-09-04 17:25 发表评论
]]>
[Jsp和Servlet]servlet明教E【{载?/title><link>http://www.tkk7.com/ltc603/archive/2006/09/01/67168.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Fri, 01 Sep 2006 09:20:00 GMT</pubDate><guid>http://www.tkk7.com/ltc603/archive/2006/09/01/67168.html</guid><wfw:comment>http://www.tkk7.com/ltc603/comments/67168.html</wfw:comment><comments>http://www.tkk7.com/ltc603/archive/2006/09/01/67168.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ltc603/comments/commentRss/67168.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ltc603/services/trackbacks/67168.html</trackback:ping><description><![CDATA[ <div>一、Servlet和JSP概述 <br />  ??: 仙h掌工作室 <br />   <br />   <br />     1.1 Java Servlet及其特点 <br />   <br />     Servlet是Java技术对CGI~程的回{。ServletE序在服务器端运行,动态地生成Web面。与传统的CGI和许多其他类似CGI的技术相比,Java Servleth更高的效率,更容易用,功能更强大,h更好的可UL性,更节省投资(更重要的是, ServletE序员收入要比PerlE序员高:-Q: <br />   <br />  高效?<br />   <br />  在传l的CGI中,每个h都要启动一个新的进E,如果CGIE序本n的执行时间较短,启动q程所需要的开销很可能反而超q实际执行时间。而在Servlet中,每个h׃个轻量的JavaU程处理Q而不是重量的操作系l进E)?<br />  在传lCGI中,如果有N个ƈ发的对同一CGIE序的请求,则该CGIE序的代码在内存中重复装载了Nơ;而对于ServletQ处理请求的是N个线E,只需要一份ServletcM码。在性能优化斚wQServlet也比CGI有着更多的选择Q比如缓冲以前的计算l果Q保持数据库q接的活动,{等?<br />   <br />   <br />  方便?<br />   <br />  Servlet提供了大量的实用工具例程Q例如自动地解析和解码HTML表单数据、读取和讄HTTP头、处理Cookie、跟t会话状态等?<br />   <br />   <br />  功能强大?<br />   <br />  在Servlet中,许多使用传统CGIE序很难完成的Q务都可以L地完成。例如,Servlet能够直接和Web服务器交互,而普通的CGIE序不能。Servletq能够在各个E序之间׃n数据Q得数据库q接池之cȝ功能很容易实现?<br />   <br />   <br />  可移植性好?<br />   <br />  Servlet用Java~写QServlet APIh完善的标准。因此,为I-Planet Enterprise Server写的Servlet无需M实质上的改动卛_UL到Apache、Microsoft IIS或者WebStar。几乎所有的L服务器都直接或通过插g支持Servlet?<br />   <br />   <br />  节省投资?<br />   <br />  不仅有许多廉L臛_费的Web服务器可供个人或规模网站用,而且对于现有的服务器Q如果它不支持Servlet的话Q要加上q部分功能也往往是免费的Q或只需要极的投资Q?<br />     1.2 JSP及其特点 <br />   <br />     JavaServer PagesQJSPQ是一U实现普通静态HTML和动态HTML混合~码的技术,有关JSP基础概念的说明请参见《JSP技术简?》?<br />   <br />     许多由CGIE序生成的页面大部分仍旧是静态HTMLQ动态内容只在页面中有限的几个部分出现。但是包括Servlet在内的大多数CGI技术及其变U,L通过E序生成整个面。JSP使得我们可以分别创徏q两个部分。例如,下面是一个简单的JSP面Q?<br />  Q?DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"Q?<br />  QHTMLQ?<br />  QHEADQ<TITLEQ欢q访问网上商店</TITLEQ</HEADQ?<br />  QBODYQ?<br />  QH1Q欢q</H1Q?<br />  QSMALLQ欢q? <br />  Q?-- 首次讉K的用户名字ؓ"New User" --Q?<br />  Q? out.println(Utils.getUserNameFromCookie(request)); %Q?<br />  要设|帐号信息,L?<br />  QA HREF="Account-Settings.html"Q这里</AQ</SMALLQ?<br />  QPQ?<br />  面的其余内宏V? <br />  Q?BODYQ</HTMLQ?<br />   <br />   <br />   <br />     下面是JSP和其他类似或相关技术的一个简单比较: <br />   <br />  JSP和Active Server PagesQASPQ相?<br />   <br />  Microsoft的ASP是一U和JSPcM的技术。JSP和ASP相比h两方面的优点。首先,动态部分用Java~写Q而不是VB Script或其他Microsoft语言Q不仅功能更强大而且更易于用。第二,JSP应用可以UL到其他操作系l和非Microsoft的Web服务器上?<br />   <br />   <br />  JSP和纯Servlet相比 <br />   <br />  JSPq没有增加Q何本质上不能用Servlet实现的功能。但是,在JSP中编写静态HTML更加方便Q不必再?println语句来输出每一行HTML代码。更重要的是Q借助内容和外观的分离Q页面制作中不同性质的Q务可以方便地分开Q比如,由页面设计专家进行HTML设计Q同时留ZServletE序员插入动态内容的I间?<br />   <br />   <br />  JSP和服务器端包含(Server-Side IncludeQSSIQ相?<br />   <br />  SSI是一U受到广泛支持的在静态HTML中引入外部代码的技术。JSP在这斚w的支持更为完善,因ؓ它可以用Servlet而不是独立的E序来生成动态内宏V另外,SSI实际上只用于单的包含Q而不是面向那些能够处理表单数据、访问数据库的“真正的”程序?<br />   <br />   <br />  JSP和JavaScript相比 <br />   <br />  JavaScript能够在客L动态地生成HTML。虽然JavaScript很有用,但它只能处理以客L环境为基的动态信息。除了Cookie之外QHTTP状态和表单提交数据对JavaScript来说都是不可用的。另外,׃是在客户端运行,JavaScript不能讉K服务器端资源Q比如数据库、目录信息等{?<br /> 2.1 安装Servlet和JSP开发工?<br />   <br />     要学习Servlet和JSP开发,首先你必d备一个符合Java Servlet 2.1/2.2和JavaServer Pages1.0/1.1规范的开发环境。Sun提供免费的JavaServer Web Development KitQJSWDKQ,可以?a ><u><font color="#0000ff">http://java.sun.com/products/servlet/</font></u></a> 下蝲?<br />   <br />     安装好JSWDK之后Q你q要告诉javacQ在~译文g的时候到哪里d找Servlet和JSPcRJSWDK安装指南Ҏ有详l说明,但主要就是把servlet.jar和jsp.jar加入CLASSPATH。CLASSPATH是一个指CJava如何LcL件的环境变量Q如果不讄CLASSPATHQJava在当前目录和标准pȝ库中Lc;如果你自p|了CLASSPATHQ不要忘记包含当前目录(卛_CLASSPATH中包含?”)?<br />   <br />     另外Qؓ了避免和其他开发者安装到同一Web服务器上的Servlet产生命名冲突Q最好把自己的Servlet攑օ包里面。此Ӟ把包层次l构中的目录也加入CLASSPATH会带来不方ѝ请参见下文具体说明?<br />   <br />     2.2 安装支持Servlet的Web服务?<br />   <br />     除了开发工具之外,你还要安装一个支持Java Servlet的Web服务器,或者在现有的Web服务器上安装Servlet软g包。如果你使用的是最新的Web服务器或应用服务器,很可能它已经有了所有必需的Y件。请查看Web服务器的文档Q或讉K<a ><u><font color="#0000ff">http://java.sun.com/products/servlet/industry.html</font></u></a> 查看支持Servlet的服务器软g清单?<br />   <br />     虽然最l运行Servlet的往往是商业的服务器Q但是开始学习的时候,用一个能够在台式Zq行的免费系l进行开发和试也够了。下面是几种当前最受欢q的产品?<br />   <br />  Apache Tomcat. <br />   <br />  Tomcat是Servlet 2.2和JSP 1.1规范的官方参考实现。Tomcat既可以单独作为小型Servlet、JSP试服务器,也可以集成到Apache Web服务器。直?000q早期,Tomcatq是唯一的支持Servlet 2.2和JSP 1.1规范的服务器Q但已经有许多其它服务器宣布提供q方面的支持?<br />   <br />  Tomcat和Apache一h免费的。不q,快速、稳定的Apache服务器安装和配置h有点ȝQTomcat也有同样的缺炏V和其他商业UServlet引擎相比Q配|Tomcat的工作量昄要多一炏V具体请参见<a ><u><font color="#800080">http://jakarta.apache.org/</font></u></a> ?<br />   <br />   <br />  JavaServer Web Development Kit (JSWDK). <br />   <br />  JSWDK是Servlet 2.1和JSP 1.0的官方参考实现。把Servlet和JSP应用部v到正式运行它们的服务器之前,JSWDK可以单独作ؓ型的Servlet、JSP试服务器。JSWDK也是免费的,而且h很好的稳定性,但它的安装和配置也较为复杂。具体请参见<a ><u><font color="#0000ff">http://java.sun.com/products/servlet/download.html</font></u></a> ?<br />   <br />   <br />  Allaire JRun. <br />   <br />  JRun是一个Servlet和JSP引擎Q它可以集成到Netscape Enterprise或FastTrack Server、IIS、Microsoft Personal Web Server、版本较低的Apache、O'eilly的WebSite或者StarNine Web STAR。最多支?个ƈ发连接的限制版本是免费的Q商业版本中不存在这个限Ӟ而且增加了远E管理控制台之类的功能。具体请参见<a ><u><font color="#0000ff">http://www.allaire.com/products/jrun/</font></u></a> ?<br />   <br />   <br />  New Atlanta 的ServletExec <br />   <br />  ServletExec是一个快速的Servlet和JSP引擎Q它可以集成到大多数行的Web服务器,支持q_包括Solaris、Windows、MacOS、HP-UX和Linux。ServletExec可以免费下蝲和用,但许多高U功能和理工具只有在购C许可之后才可以用。New Atlantaq提供一个免费的Servlet调试器,该调试器可以在许多流行的Java IDE下工作。具体请参见<a ><u><font color="#0000ff">http://newatlanta.com/</font></u></a> ?<br />   <br />   <br />  Gefion的LiteWebServer (LWS) <br />   <br />  LWS是一个支持Servlet 2.2和JSP 1.1的免费小型Web服务器?Gefionq有一个免费的WAICoolRunner插gQ利用该插g可以为Netscape FastTrack和Enterprise Server增加Servlet 2.2和JSP 1.1支持。具体请参见<a ><u><font color="#0000ff">http://www.gefionsoftware.com/</font></u></a> ?<br />   <br />   <br />  Sun的Java Web Server. <br />   <br />  该服务器全部用Java写成Q而且是首先提供Servlet 2.1和JSP 1.0规范完整支持的Web服务器之一。虽然Sun现在已{向Netscape/I-Planet ServerQ不再发展Java Web ServerQ但它仍旧是一个广受欢q的Servlet、JSP学习q_。要得到免费试用版本Q请讉K<a ><u><font color="#0000ff">http://www.sun.com/software/jwebserver/try/</font></u></a> ?<br />  <br />3.1 Servlet基本l构 <br />   <br />     下面的代码显CZ一个简单Servlet的基本结构。该Servlet处理的是GEThQ所谓的GEThQ如果你不熟悉HTTPQ可以把它看成是当用户在览器地址栏输入URL、点击Web面中的链接、提交没有指定METHOD的表单时览器所发出的请求。Servlet也可以很方便地处理POSTh。POSTh是提交那些指定了METHOD=“POST”的表单时所发出的请求,具体请参见稍后几节的讨论?<br />  import java.io.*; <br />  import javax.servlet.*; <br />  import javax.servlet.http.*; <br />   <br />  public class SomeServlet extends HttpServlet { <br />   public void doGet(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   <br />   // 使用“request”读取和h有关的信息(比如CookiesQ?<br />   // 和表单数?<br />   <br />   // 使用“response”指定HTTP应答状态代码和应答?<br />   // Q比如指定内容类型,讄CookieQ?<br />   <br />   PrintWriter out = response.getWriter(); <br />   // 使用 "out"把应{内容发送到览?<br />   } <br />  } <br />   <br />   <br />   <br />   <br />     如果某个c要成ؓServletQ则它应该从HttpServlet l承Q根据数据是通过GETq是POST发送,覆盖doGet、doPostҎ之一或全部。doGet和doPostҎ都有两个参数Q分别ؓHttpServletRequest cd和HttpServletResponse cd。HttpServletRequest提供讉K有关h的信息的ҎQ例如表单数据、HTTPh头等{。HttpServletResponse除了提供用于指定HTTP应答状态(200Q?04{)、应{头QContent-TypeQSet-Cookie{)的方法之外,最重要的是它提供了一个用于向客户端发送数据的PrintWriter 。对于简单的Servlet来说Q它的大部分工作是通过println语句生成向客L发送的面?<br />   <br />     注意doGet和doPost抛出两个异常Q因此你必须在声明中包含它们。另外,你还必须导入java.io包(要用到PrintWriter{类Q、javax.servlet包(要用到HttpServlet{类Q以及javax.servlet.http包(要用到HttpServletRequestcdHttpServletResponsec)?<br />   <br />     最后,doGet和doPostq两个方法是由serviceҎ调用的,有时你可能需要直接覆盖serviceҎQ比如Servlet要处理GET和POST两种h时?<br />   <br />     3.2 输出U文本的单Servlet <br />   <br />     下面是一个输出纯文本的简单Servlet?<br />   <br />     3.2.1 HelloWorld.java <br />  package hall; <br />   <br />  import java.io.*; <br />  import javax.servlet.*; <br />  import javax.servlet.http.*; <br />   <br />  public class HelloWorld extends HttpServlet { <br />   public void doGet(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   PrintWriter out = response.getWriter(); <br />   out.println("Hello World"); <br />   } <br />  } <br />   <br />   <br />   <br />   <br />     3.2.2 Servlet的编译和安装 <br />   <br />     不同的Web服务器上安装Servlet的具体细节可能不同,请参考Web服务器文档了解更权威的说明。假定用Java Web ServerQJWSQ?.0Q则Servlet应该安装到JWS安装目录的servlets子目录下。在本文中,Z避免同一服务器上不同用户的Servlet命名冲突Q我们把所有Servlet都放入一个独立的包hall中;如果你和其他人共用一个服务器Q而且该服务器没有“虚拟服务器”机制来避免q种命名冲突Q那么最好也使用包。把Servlet攑օ了包hall之后QHelloWorld.java实际上是攑֜servlets目录的hall子目录下?<br />   <br />     大多数其他服务器的配|方法也怼Q除了JWS之外Q本文的Servlet和JSPCZ已经在BEA WebLogic和IBM WebSphere 3.0下经q测试。WebSphereh优秀的虚拟服务器机制Q因此,如果只是Z避免命名冲突的话q一定要用包?<br />   <br />     对于没有使用q包的初学者,下面我们介绍~译包里面的cȝ两种Ҏ?<br />   <br />     一U方法是讄CLASSPATHQ其指向实际存放Servlet的目录的上一U目录(Servletȝ录)Q然后在该目录中按正常的方式~译。例如,如果Servlet的主目录是C:QJavaWebServerQservletsQ包的名字(即主目录下的子目录名字)是hallQ在Windows下,~译q程如下Q?<br />   DOSQ?set CLASSPATH=C:QJavaWebServerQservlets;%CLASSPATH% <br />   DOSQ?cd C:QJavaWebServerQservletsQhall <br />   DOSQ?javac YourServlet.java <br />   <br />   <br />   <br />     W二U编译包里面的Servlet的方法是q入Servletȝ录,执行“javac directoryQYourServlet.java”(WindowsQ或者“javac directory/YourServlet.java”(UnixQ。例如,再次假定Servletȝ录是C:QJavaWebServerQservletsQ包的名字是hallQ在Windows中编译过E如下: <br />   DOSQ?cd C:QJavaWebServerQservlets <br />   DOSQ?javac hallQYourServlet.java <br />   <br />   <br />   <br />     注意在Windows下,大多数JDK 1.1版本的javac要求目录名字后面加反斜杠(Q?。JDK1.2已经Ҏq个问题Q然而由于许多Web服务器仍旧用JDK 1.1Q因此大量的Servlet开发者仍旧在使用JDK 1.1?<br />   <br />     最后,Javacq有一个高U选项用于支持源代码和.class文g的分开攄Q即你可以用javac的?d”选项?class文g安装到Web服务器所要求的目录?<br />   <br />     3.2.3 q行Servlet <br />   <br />     在Java Web Server下,Servlet应该攑ֈJWS安装目录的servlets子目录下Q而调用Servlet的URL?a href="http://host/servlet/ServletName"><u><font color="#0000ff">http://host/servlet/ServletName</font></u></a>。注意子目录的名字是servletsQ带“s”)Q而URL使用的是“servlet”。由于HelloWorld Servlet攑օ包hallQ因此调用它的URL应该?a href="http://host/servlet/hall.HelloWorld"><u><font color="#0000ff">http://host/servlet/hall.HelloWorld</font></u></a>。在其他的服务器上,安装和调用Servlet的方法可能略有不同?<br />   <br />     大多数Web服务器还允许定义Servlet的别名,因此Servlet也可能用<a href="http://host/any-path/any-file.html"><u><font color="#0000ff">http://host/any-path/any-file.html</font></u></a>形式的URL调用。具体如何进行配|完全依赖于服务器类型,请参考服务器文档了解l节?<br />   <br />     3.3 输出HTML的Servlet <br />   <br />     大多数Servlet都输出HTMLQ而不象上例一栯出纯文本。要输出HTMLq有两个额外的步骤要做:告诉览器接下来发送的是HTMLQ修改println语句构造出合法的HTML面?<br />   <br />     W一步通过讄Content-TypeQ内容类型)应答头完成。一般地Q应{头可以通过HttpServletResponse的setHeaderҎ讄Q但׃讄内容cd是一个很频繁的操作,因此Servlet API提供了一个专用的ҎsetContentType。注意设|应{头应该在通过PrintWriter发送内容之前进行。下面是一个实例: <br />   <br />     HelloWWW.java <br />  package hall; <br />   <br />  import java.io.*; <br />  import javax.servlet.*; <br />  import javax.servlet.http.*; <br />   <br />  public class HelloWWW extends HttpServlet { <br />   public void doGet(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   response.setContentType("text/html"); <br />   PrintWriter out = response.getWriter(); <br />   out.println("Q?DOCTYPE HTML PUBLIC Q?-//W3C//DTD HTML 4.0 " + <br />   "Transitional//ENQ?Q\n" + <br />   "QHTMLQ\n" + <br />   "QHEADQ<TITLEQHello WWWQ?TITLEQ</HEADQ\n" + <br />   "QBODYQ\n" + <br />   "QH1QHello WWWQ?H1Q\n" + <br />   "Q?BODYQ</HTMLQ?); <br />   } <br />  } <br />   <br />   <br />   <br />   <br />     3.4 几个HTML工具函数 <br />   <br />     通过println语句输出HTMLq不方便Q根本的解决Ҏ是用JavaServer PagesQJSPQ。然而,对于标准的Servlet来说Q由于Web面中有两个部分QDOCTYPE和HEADQ一般不会改变,因此可以用工具函数来装生成q些内容的代码?<br />   <br />     虽然大多C浏览器都会忽略DOCTYPE行,但严格地说HTML规范是要求有DOCTYPE行的Q它有助于HTML语法查器Ҏ所声明的HTML版本查HTML文档合法性。在许多Web面中,HEAD部分只包含<TITLEQ。虽然许多有l验的编写者都会在HEAD中包含许多META标记和样式声明,但这里只考虑最单的情况?<br />   <br />     下面的JavaҎ只接受页面标题ؓ参数Q然后输出页面的DOCTYPE、HEAD、TITLE部分。清单如下: <br />   <br />     ServletUtilities.java <br />  package hall; <br />   <br />  public class ServletUtilities { <br />   public static final String DOCTYPE = <br />   "Q?DOCTYPE HTML PUBLIC Q?-//W3C//DTD HTML 4.0 Transitional//ENQ?Q?; <br />   <br />   public static String headWithTitle(String title) { <br />   return(DOCTYPE + "Qn" + <br />   "QHTMLQ\n" + <br />   "QHEADQ<TITLEQ? + title + "Q?TITLEQ</HEADQ\n"); <br />   } <br />   <br />   // 其他工具函数的代码在本文后面介绍 <br />  } <br />   <br />   <br />   <br />   <br />     HelloWWW2.java <br />   <br />     下面是应用了ServletUtilities之后重写HelloWWWcd到的HelloWWW2Q?<br />  package hall; <br />   <br />  import java.io.*; <br />  import javax.servlet.*; <br />  import javax.servlet.http.*; <br />   <br />  public class HelloWWW2 extends HttpServlet { <br />   public void doGet(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   response.setContentType("text/html"); <br />   PrintWriter out = response.getWriter(); <br />   out.println(ServletUtilities.headWithTitle("Hello WWW") + <br />   "QBODYQ\n" + <br />   "QH1QHello WWWQ?H1Q\n" + <br />   "Q?BODYQ</HTMLQ?); <br />   } <br />  } <br />4.1 表单数据概述 <br />   <br />     如果你曾l用过Web搜烦引擎Q或者浏览过在线书店、股h根{机信息,或许会留意到一些古怪的URLQ比如“http://host/path?user=Marty+Hall&origin=bwi&dest=lax”。这个URL中位于问号后面的部分Q即“user=Marty+Hall&origin=bwi&dest=lax”,是表单数据Q这是将Web面数据发送给服务器程序的最常用Ҏ。对于GEThQ表单数据附加到URL的问号后面(如上例所C)Q对于POSThQ表单数据用一个单独的行发送给服务器?<br />   <br />     以前Q从q种形式的数据提取出所需要的表单变量是CGI~程中最ȝ的事情之一。首先,GETh和POSTh的数据提取方法不同:对于GEThQ通常要通过QUERY_STRING环境变量提取数据Q对于POSThQ则一般通过标准输入提取数据。第二,E序员必负责在?amp;”符号处截断变量名字-变量值对Q再分离出变量名字({号左边Q和变量|{号双Q。第三,必须对变量D行URL反编码操作。因为发送数据的时候,字母和数字以原来的Ş式发送,但空D转换成加P其他字符被{换成?XX”Ş式,其中XX是十六进制表C的字符ASCIIQ或者ISO Latin-1Q编码倹{例如,如果HTML表单中名为“users”的域gؓ“~hall, ~gates, and ~mcnealy”,则实际向服务器发送的数据为“users=%7Ehall%2C+%7Egates%2C+and+%7Emcnealy”。最后,即第四个D解析表单数据非常困难的原因在于,变量值既可能被省略(如“param1=val1Qparam2=Qparam3=val3”)Q也有可能一个变量拥有一个以上的|卛_一个变量可能出Cơ以上(如“param1=val1Qparam2=val2Qparam1=val3”)?<br />   <br />     Java Servlet的好处之一在于所有上q解析操作都能够自动完成。只需要简单地调用一下HttpServletRequest的getParameterҎ、在调用参数中提供表单变量的名字Q大写敏感Q即可,而且GETh和POSTh的处理方法完全相同?<br />   <br />     getParameterҎ的返回值是一个字W串Q它是参C指定的变量名字第一ơ出现所对应的值经反编码得到得字符Ԍ可以直接使用Q。如果指定的表单变量存在Q但没有|getParameterq回I字W串Q如果指定的表单变量不存在,则返回null。如果表单变量可能对应多个|可以用getParameterValues来取代getParameter。getParameterValues能够q回一个字W串数组?<br />   <br />     最后,虽然在实际应用中Servlet很可能只会用到那些已知名字的表单变量Q但在调试环境中Q获得完整的表单变量名字列表往往是很有用的,利用getParamerterNamesҎ可以方便地实现这一炏VgetParamerterNamesq回的是一个EnumerationQ其中的每一w可以转换用getParameter的字W串?<br />   <br />     4.2 实例Q读取三个表单变?<br />   <br />     下面是一个简单的例子Q它d三个表单变量param1、param2和param3Qƈ以HTML列表的Ş式列出它们的倹{请注意Q虽然在发送应{内容之前必L定应{类型(包括内容cd、状态以及其他HTTP头信息)Q但Servlet对何时读取请求内容却没有什么要求?<br />   <br />     另外Q我们也可以很容易地把Servlet做成既能处理GEThQ也能够处理POSThQ这只需要在doPostҎ中调用doGetҎQ或者覆盖serviceҎQserviceҎ调用doGet、doPost、doHead{方法)。在实际~程中这是一U标准的ҎQ因为它只需要很的额外工作Q却能够增加客户端编码的灉|性?<br />   <br />     如果你习惯用传统的CGIҎQ通过标准输入dPOST数据Q那么在Servlet中也有类似的ҎQ即在HttpServletRequest上调用getReader或者getInputStreamQ但q种ҎҎ通的表单变量来说太麻烦。然而,如果是要上蝲文gQ或者POST数据是通过专门的客L序而不是HTML表单发送,那么p用到q种Ҏ?<br />   <br />     注意用第二种ҎdPOST数据Ӟ不能再用getParameter来读取这些数据?<br />   <br />     ThreeParams.java <br />  package hall; <br />   <br />  import java.io.*; <br />  import javax.servlet.*; <br />  import javax.servlet.http.*; <br />  import java.util.*; <br />   <br />  public class ThreeParams extends HttpServlet { <br />   public void doGet(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   response.setContentType("text/html"); <br />   PrintWriter out = response.getWriter(); <br />   String title = "d三个h参数"; <br />   out.println(ServletUtilities.headWithTitle(title) + <br />   "QBODYQ\n" + <br />   "QH1 ALIGN=CENTERQ? + title + "Q?H1Q\n" + <br />   "QULQ\n" + <br />   " QLIQparam1: " <br />   + request.getParameter("param1") + "Qn" + <br />   " QLIQparam2: " <br />   + request.getParameter("param2") + "Qn" + <br />   " QLIQparam3: " <br />   + request.getParameter("param3") + "Qn" + <br />   "Q?ULQ\n" + <br />   "Q?BODYQ</HTMLQ?); <br />   } <br />   <br />   public void doPost(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   doGet(request, response); <br />   } <br />  } <br />   <br />   <br />   <br />   <br />     4.3 实例Q输出所有的表单数据 <br />   <br />     下面q个例子L表单所发送的所有变量名字,q把它们攑օ表格中,没有值或者有多个值的变量都突出显C?<br />   <br />     首先Q程序通过HttpServletRequest的getParameterNamesҎ得到所有的变量名字QgetParameterNamesq回的是一个Enumeration。接下来Q程序用循环遍历q个EnumerationQ通过hasMoreElements定何时l束循环Q利用nextElement得到Enumeration中的各个V由于nextElementq回的是一个ObjectQ程序把它{换成字符串后再用q个字符串来调用getParameterValues?<br />   <br />     getParameterValuesq回一个字W串数组Q如果这个数l只有一个元素且{于I字W串Q说明这个表单变量没有|Servlet以斜体Ş式输出“No Value”;如果数组元素个数大于1Q说明这个表单变量有多个|Servlet以HTML列表形式输出q些|其他情况下Servlet直接把变量值放入表根{?<br />   <br />     ShowParameters.java <br />   <br />     注意QShowParameters.java用到了前面介l过的ServletUtilities.java?<br />  package hall; <br />   <br />  import java.io.*; <br />  import javax.servlet.*; <br />  import javax.servlet.http.*; <br />  import java.util.*; <br />   <br />  public class ShowParameters extends HttpServlet { <br />   public void doGet(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   response.setContentType("text/html"); <br />   PrintWriter out = response.getWriter(); <br />   String title = "d所有请求参?; <br />   out.println(ServletUtilities.headWithTitle(title) + <br />   "QBODY BGCOLOR=Q?#FDF5E6Q?Q\n" + <br />   "QH1 ALIGN=CENTERQ? + title + "Q?H1Q\n" + <br />   "QTABLE BORDER=1 ALIGN=CENTERQ\n" + <br />   "QTR BGCOLOR=Q?#FFAD00Q?Q\n" + <br />   "QTHQ参数名字<THQ参数?); <br />   Enumeration paramNames = request.getParameterNames(); <br />   while(paramNames.hasMoreElements()) { <br />   String paramName = (String)paramNames.nextElement(); <br />   out.println("QTRQ<TDQ? + paramName + "QnQTDQ?); <br />   String[] paramValues = request.getParameterValues(paramName); <br />   if (paramValues.length == 1) { <br />   String paramValue = paramValues[0]; <br />   if (paramValue.length() == 0) <br />   out.print("QIQNo ValueQ?IQ?); <br />   else <br />   out.print(paramValue); <br />   } else { <br />   out.println("QULQ?); <br />   for(int i=0; iQparamValues.length; i++) { <br />   out.println("QLIQ? + paramValues[i]); <br />   } <br />   out.println("Q?ULQ?); <br />   } <br />   } <br />   out.println("Q?TABLEQ\nQ?BODYQ</HTMLQ?); <br />   } <br />   <br />   public void doPost(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   doGet(request, response); <br />   } <br />  } <br />   <br />   <br />   <br />   <br />     试表单 <br />   <br />     下面是向上述Servlet发送数据的表单PostForm.html。就像所有包含密码输入域的表单一P该表单用POSTҎ发送数据。我们可以看刎ͼ在Servlet中同时实现doGet和doPostq两U方法ؓ表单制作带来了方ѝ?<br />  Q?DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"Q?<br />  QHTMLQ?<br />  QHEADQ?<br />   QTITLEQ示例表单</TITLEQ?<br />  Q?HEADQ?<br />   <br />  QBODY BGCOLOR="#FDF5E6"Q?<br />  QH1 ALIGN="CENTER"Q用POSTҎ发送数据的表单Q?H1Q?<br />   <br />  QFORM ACTION="/servlet/hall.ShowParameters" <br />   METHOD="POST"Q?<br />   Item Number: <br />   QINPUT TYPE="TEXT" NAME="itemNum"Q<BRQ?<br />   Quantity: <br />   QINPUT TYPE="TEXT" NAME="quantity"Q<BRQ?<br />   Price Each: <br />   QINPUT TYPE="TEXT" NAME="price" VALUE="$"Q<BRQ?<br />   QHRQ?<br />   First Name: <br />   QINPUT TYPE="TEXT" NAME="firstName"Q<BRQ?<br />   Last Name: <br />   QINPUT TYPE="TEXT" NAME="lastName"Q<BRQ?<br />   Middle Initial: <br />   QINPUT TYPE="TEXT" NAME="initial"Q<BRQ?<br />   Shipping Address: <br />   QTEXTAREA NAME="address" ROWS=3 COLS=40Q</TEXTAREAQ<BRQ?<br />   Credit Card:QBRQ?<br />   QINPUT TYPE="RADIO" NAME="cardType" <br />   VALUE="Visa"QVisaQBRQ?<br />   QINPUT TYPE="RADIO" NAME="cardType" <br />   VALUE="Master Card"QMaster CardQBRQ?<br />   QINPUT TYPE="RADIO" NAME="cardType" <br />   VALUE="Amex"QAmerican ExpressQBRQ?<br />   QINPUT TYPE="RADIO" NAME="cardType" <br />   VALUE="Discover"QDiscoverQBRQ?<br />   QINPUT TYPE="RADIO" NAME="cardType" <br />   VALUE="Java SmartCard"QJava SmartCardQBRQ?<br />   Credit Card Number: <br />   QINPUT TYPE="PASSWORD" NAME="cardNum"Q<BRQ?<br />   Repeat Credit Card Number: <br />   QINPUT TYPE="PASSWORD" NAME="cardNum"Q<BRQ<BRQ?<br />   QCENTERQ?<br />   QINPUT TYPE="SUBMIT" VALUE="Submit Order"Q?<br />   Q?CENTERQ?<br />  Q?FORMQ?<br />   <br />  Q?BODYQ?<br />  Q?HTMLQ?<br />5.1 HTTPh头概q?<br />   <br />     HTTP客户E序Q例如浏览器Q,向服务器发送请求的时候必L明请求类型(一般是GET或者POSTQ。如有必要,客户E序q可以选择发送其他的h头。大多数h头ƈ不是必需的,但Content-Length除外。对于POSTh来说Content-Length必须出现?<br />   <br />     下面是一些最常见的请求头Q?<br />   <br />  AcceptQ浏览器可接受的MIMEcd?<br />  Accept-CharsetQ浏览器可接受的字符集?<br />  Accept-EncodingQ浏览器能够q行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器q回lgzip~码的HTML面。许多情形下q可以减??0倍的下蝲旉?<br />  Accept-LanguageQ浏览器所希望的语aU类Q当服务器能够提供一U以上的语言版本时要用到?<br />  AuthorizationQ授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中?<br />  ConnectionQ表C是否需要持久连接。如果Servlet看到q里的gؓ“Keep-Alive”,或者看到请求用的是HTTP 1.1QHTTP 1.1默认q行持久q接Q,它就可以利用持久q接的优点,当页面包含多个元素时Q例如AppletQ图片)Q显著地减少下蝲所需要的旉。要实现q一点,Servlet需要在应答中发送一个Content-Length_最单的实现Ҏ是:先把内容写入ByteArrayOutputStreamQ然后在正式写出内容之前计算它的大小?<br />  Content-LengthQ表C求消息正文的长度?<br />  CookieQ这是最重要的请求头信息之一Q参见后面《Cookie处理》一章中的讨论?<br />  FromQ请求发送者的email地址Q由一些特D的Web客户E序使用Q浏览器不会用到它?<br />  HostQ初始URL中的L和端口?<br />  If-Modified-SinceQ只有当所h的内容在指定的日期之后又l过修改才返回它Q否则返?04“Not Modified”应{?<br />  PragmaQ指定“no-cache”DC服务器必须q回一个刷新后的文档,即它是代理服务器而且已经有了面的本地拷贝?<br />  RefererQ包含一个URLQ用户从该URL代表的页面出发访问当前请求的面?<br />  User-AgentQ浏览器cdQ如果Servletq回的内容与览器类型有兛_该值非常有用?<br />  UA-PixelsQUA-ColorQUA-OSQUA-CPUQ由某些版本的IE览器所发送的非标准的h_表示屏幕大小、颜色深度、操作系l和CPUcd?<br />     有关HTTP头完整、详l的说明Q请参见<a ><u><font color="#0000ff">http://www.w3.org/Protocols/</font></u></a> 的HTTP规范?<br />   <br />     5.2 在Servlet中读取请求头 <br />   <br />     在Servlet中读取HTTP头是非常方便的,只需要调用一下HttpServletRequest的getHeaderҎ卛_。如果客戯求中提供了指定的头信息,getHeaderq回对应的字W串Q否则,q回null。部分头信息l常要用刎ͼ它们有专用的讉KҎQgetCookiesҎq回Cookie头的内容Q经解析后存攑֜Cookie对象的数l中Q请参见后面有关Cookie章节的讨论;getAuthType和getRemoteUserҎ分别dAuthorization头中的一部分内容QgetDateHeader和getIntHeaderҎd指定的头Q然后返回日期值或整数倹{?<br />   <br />     除了d指定的头之外Q利用getHeaderNamesq可以得到请求中所有头名字的一个Enumeration对象?<br />   <br />     最后,除了查看h头信息之外,我们q可以从hd令行获得一些信息。getMethodҎq回hҎQ请求方法通常是GET或者POSTQ但也有可能是HEAD、PUT或者DELETE。getRequestURIҎq回URIQURI是URL的从L和端口之后到表单数据之前的那一部分Q。getRequestProtocolq回h命o的第三部分,一般是“HTTP/1.0”或者“HTTP/1.1”?<br />   <br />     5.3 实例Q输出所有的h?<br />   <br />     下面的Servlet实例把所有接收到的请求头和它的g表格的Ş式输出。另外,该Servletq会输出主请求命令的三个部分Q请求方法,URIQ协?版本?<br />   <br />     ShowRequestHeaders.java <br />  package hall; <br />   <br />  import java.io.*; <br />  import javax.servlet.*; <br />  import javax.servlet.http.*; <br />  import java.util.*; <br />   <br />  public class ShowRequestHeaders extends HttpServlet { <br />   public void doGet(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   response.setContentType("text/html"); <br />   PrintWriter out = response.getWriter(); <br />   String title = "昄所有请求头"; <br />   out.println(ServletUtilities.headWithTitle(title) + <br />   "QBODY BGCOLOR=Q?#FDF5E6Q?Q\n" + <br />   "QH1 ALIGN=CENTERQ? + title + "Q?H1Q\n" + <br />   "QBQRequest Method: Q?BQ? + <br />   request.getMethod() + "QBRQ\n" + <br />   "QBQRequest URI: Q?BQ? + <br />   request.getRequestURI() + "QBRQ\n" + <br />   "QBQRequest Protocol: Q?BQ? + <br />   request.getProtocol() + "QBRQ<BRQ\n" + <br />   "QTABLE BORDER=1 ALIGN=CENTERQ\n" + <br />   "QTR BGCOLOR=Q?#FFAD00Q?Q\n" + <br />   "QTHQHeader NameQTHQHeader Value"); <br />   Enumeration headerNames = request.getHeaderNames(); <br />   while(headerNames.hasMoreElements()) { <br />   String headerName = (String)headerNames.nextElement(); <br />   out.println("QTRQ<TDQ? + headerName); <br />   out.println(" QTDQ? + request.getHeader(headerName)); <br />   } <br />   out.println("Q?TABLEQ\nQ?BODYQ</HTMLQ?); <br />   } <br />   <br />   public void doPost(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   doGet(request, response); <br />   } <br />  } <br />6.1 CGI变量概述 <br />   <br />     如果你是从传l的CGI~程转而学习Java ServletQ或许已l习惯了“CGI变量”这一概念。CGI变量汇集了各U有兌求的信息Q?<br />   <br />  部分来自HTTPh命o和请求头Q例如Content-Length_ <br />  部分来自Socket本nQ例如主机的名字和IP地址Q?<br />  也有部分与服务器安装配置有关Q例如URL到实际\径的映射?<br />     6.2 标准CGI变量的Servlet{h表示 <br />   <br />     下表假定request对象是提供给doGet和doPostҎ的HttpServletRequestcd对象?CGI变量 含义 从doGet或doPost讉K <br />  AUTH_TYPE 如果提供了Authorization_q里指定了具体的模式Qbasic或者digestQ?request.getAuthType() <br />  CONTENT_LENGTH 只用于POSThQ表C所发送数据的字节数?严格地讲Q等L表达方式应该是String.valueOf(request.getContentLength())Q返回一个字W串Q。但更常见的是用request.getContentLength()q回含义相同的整数?<br />  CONTENT_TYPE 如果指定的话Q表C后面所跟数据的cd?request.getContentType() <br />  DOCUMENT_ROOT ?a href="http://host/"><u><font color="#0000ff">http://host/</font></u></a>对应的\径?getServletContext().getRealPath("/") <br />  注意低版本Servlet规范中的{h表达方式是request.getRealPath("/")?<br />   <br />  HTTP_XXX_YYY 讉KLHTTP头?request.getHeader("Xxx-Yyy") <br />  PATH_INFO URL中的附加路径信息Q即URL中Servlet路径之后、查询字W串之前的那部分?request.getPathInfo() <br />  PATH_TRANSLATED 映射到服务器实际路径之后的\径信息?request.getPathTranslated() <br />  QUERY_STRING q是字符串Ş式的附加到URL后面的查询字W串Q数据仍旧是URL~码的。在Servlet中很需要用到未l解码的数据Q一般用getParameter讉K各个参数?request.getQueryString() <br />  REMOTE_ADDR 发出h的客h的IP地址?request.getRemoteAddr() <br />  REMOTE_HOST 发出h的客h的完整的域名Q如java.sun.com。如果不能确定该域名Q则q回IP地址?request.getRemoteHost() <br />  REMOTE_USER 如果提供了Authorization_则代表其用户部分。它代表发出h的用L名字?request.getRemoteUser() <br />  REQUEST_METHOD hcd。通常是GET或者POST。但偶尔也会出现HEADQPUTQ?DELETEQOPTIONSQ或?TRACE. request.getMethod() <br />  SCRIPT_NAME URL中调用Servlet的那一部分Q不包含附加路径信息和查询字W串?request.getServletPath() <br />  SERVER_NAME Web服务器名字?request.getServerName() <br />  SERVER_PORT 服务器监听的端口?严格地说Q等仯辑ֺ该是q回字符串的String.valueOf(request.getServerPort())。但l常使用q回整数值的request.getServerPort()?<br />  SERVER_PROTOCOL h命o中的协议名字和版本(即HTTP/1.0或HTTP/1.1Q?request.getProtocol() <br />  SERVER_SOFTWARE Servlet引擎的名字和版本?getServletContext().getServerInfo() <br />   <br />   <br />     6.3 实例Q读取CGI变量 <br />   <br />     下面q个Servlet创徏一个表|昄除了HTTP_XXX_YYY之外的所有CGI变量。HTTP_XXX_YYY是HTTPh头信息,请参见上一节介l?<br />   <br />     ShowCGIVariables.java <br />  package hall; <br />   <br />  import java.io.*; <br />  import javax.servlet.*; <br />  import javax.servlet.http.*; <br />  import java.util.*; <br />   <br />  public class ShowCGIVariables extends HttpServlet { <br />   public void doGet(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   response.setContentType("text/html"); <br />   PrintWriter out = response.getWriter(); <br />   String[][] variables = <br />   { { "AUTH_TYPE", request.getAuthType() }, <br />   { "CONTENT_LENGTH", String.valueOf(request.getContentLength()) }, <br />   { "CONTENT_TYPE", request.getContentType() }, <br />   { "DOCUMENT_ROOT", getServletContext().getRealPath("/") }, <br />   { "PATH_INFO", request.getPathInfo() }, <br />   { "PATH_TRANSLATED", request.getPathTranslated() }, <br />   { "QUERY_STRING", request.getQueryString() }, <br />   { "REMOTE_ADDR", request.getRemoteAddr() }, <br />   { "REMOTE_HOST", request.getRemoteHost() }, <br />   { "REMOTE_USER", request.getRemoteUser() }, <br />   { "REQUEST_METHOD", request.getMethod() }, <br />   { "SCRIPT_NAME", request.getServletPath() }, <br />   { "SERVER_NAME", request.getServerName() }, <br />   { "SERVER_PORT", String.valueOf(request.getServerPort()) }, <br />   { "SERVER_PROTOCOL", request.getProtocol() }, <br />   { "SERVER_SOFTWARE", getServletContext().getServerInfo() } <br />   }; <br />   String title = "昄CGI变量"; <br />   out.println(ServletUtilities.headWithTitle(title) + <br />   "QBODY BGCOLOR=Q?#FDF5E6Q?Q\n" + <br />   "QH1 ALIGN=CENTERQ? + title + "Q?H1Q\n" + <br />   "QTABLE BORDER=1 ALIGN=CENTERQ\n" + <br />   "QTR BGCOLOR=Q?#FFAD00Q?Q\n" + <br />   "QTHQCGI Variable NameQTHQValue"); <br />   for(int i=0; iQvariables.length; i++) { <br />   String varName = variables[i][0]; <br />   String varValue = variables[i][1]; <br />   if (varValue == null) <br />   varValue = "QIQNot specifiedQ?IQ?; <br />   out.println("QTRQ<TDQ? + varName + "QTDQ? + varValue); <br />   } <br />   out.println("Q?TABLEQ</BODYQ</HTMLQ?); <br />   } <br />   <br />   public void doPost(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   doGet(request, response); <br />   } <br />  } <br />7.1 状态代码概q?<br />   <br />     Web服务器响应浏览器或其他客L序的hӞ其应{一般由以下几个部分l成Q一个状态行Q几个应{头Q一个空行,内容文档。下面是一个最单的应答Q?<br />  HTTP/1.1 200 OK <br />  Content-Type: text/plain <br />   <br />  Hello World <br />   <br />   <br />   <br />   <br />     状态行包含HTTP版本、状态代码、与状态代码对应的短说明信息。在大多数情况下Q除了Content-Type之外的所有应{头都是可选的。但Content-Type是必需的,它描q的是后面文档的MIMEcd。虽然大多数应答都包含一个文档,但也有一些不包含Q例如对HEADh的应{永q不会附带文档。有许多状态代码实际上用来标识一ơ失败的hQ这些应{也不包含文档(或只包含一个简短的错误信息说明Q?<br />   <br />     Servlet可以利用状态代码来实现许多功能。例如,可以把用户重定向到另一个网站;可以指示出后面的文档是图片、PDF文g或HTML文gQ可以告诉用户必L供密码才能访问文档;{等。这一部分我们具体讨论各U状态代码的含义以及利用q些代码可以做些什么?<br />   <br />     7.2 讄状态代?<br />   <br />     如前所qͼHTTP应答状态行包含HTTP版本、状态代码和对应的状态信息。由于状态信息直接和状态代码相养I而HTTP版本又由服务器确定,因此需要Servlet讄的只有一个状态代码?<br />   <br />     Servlet讄状态代码一般用HttpServletResponse的setStatusҎ。setStatusҎ的参数是一个整敎ͼ即状态代码)Q不qؓ了得代码具有更好的可读性,可以用HttpServletResponse中定义的帔R来避免直接用整数。这些常量根据HTTP 1.1中的标准状态信息命名,所有的名字都加上了SC前缀QStatus Code的羃写)q大写,同时把空D{换成了下划线。也是_与状态代?04对应的状态信息是“Not Found”,则HttpServletResponse中的对应帔R名字为SC_NOT_FOUND。但有两个例外:和状态代?02对应的常量根据HTTP 1.0命名Q?07没有对应的常量?<br />   <br />     讄状态代码ƈ非L意味着不要再返回文档。例如,虽然大多数服务器q回404应答时会输出单的“File Not Found”信息,但Servlet也可以定制这个应{。不q,定制应答时应当在通过PrintWriter发送Q何内容之前先调用response.setStatus?<br />   <br />     虽然讄状态代码一般用的是response.setStauts(int)ҎQ但Z单v见,HttpServletResponseZU常见的情Ş提供了专用方法:sendErrorҎ生成一?04应答Q同时生成一个简短的HTML错误信息文档QsendRedirectҎ生成一?02应答Q同时在Location头中指示新文档的URL?<br />   <br />     7.3 HTTP 1.1状态代码及其含?<br />   <br />     下表昄了常见的HTTP 1.1状态代码以及它们对应的状态信息和含义?<br />   <br />     应当谨慎C用那些只有HTTP 1.1支持的状态代码,因ؓ许多览器还只能够支持HTTP 1.0。如果你使用了HTTP 1.1Ҏ的状态代码,最好能够检查一下请求的HTTP版本P通过HttpServletRequest的getProtocolҎQ?状态代?状态信?含义 <br />  100 Continue 初始的请求已l接受,客户应当l箋发送请求的其余部分。(HTTP 1.1斎ͼ <br />  101 Switching Protocols 服务器将遵从客户的请求{换到另外一U协议(HTTP 1.1斎ͼ <br />  200 OK 一切正常,对GET和POSTh的应{文档跟在后面。如果不用setStatus讄状态代码,Servlet默认使用202状态代码?<br />  201 Created 服务器已l创Z文档QLocation头给Z它的URL?<br />  202 Accepted 已经接受hQ但处理未完成?<br />  203 Non-Authoritative Information 文档已经正常地返回,但一些应{头可能不正,因ؓ使用的是文档的拷贝(HTTP 1.1斎ͼ?<br />  204 No Content 没有新文档,览器应该l显C原来的文档。如果用户定期地h面Q而Servlet可以定用户文档_斎ͼq个状态代码是很有用的?<br />  205 Reset Content 没有新的内容Q但览器应该重|它所昄的内宏V用来强制浏览器清除表单输入内容QHTTP 1.1斎ͼ?<br />  206 Partial Content 客户发送了一个带有Range头的GEThQ服务器完成了它QHTTP 1.1斎ͼ?<br />  300 Multiple Choices 客户h的文档可以在多个位置扑ֈQ这些位|已l在q回的文档内列出。如果服务器要提Z先选择Q则应该在Location应答头指明?<br />  301 Moved Permanently 客户h的文档在其他地方Q新的URL在Location头中l出Q浏览器应该自动地访问新的URL?<br />  302 Found cM?01Q但新的URL应该被视Z时性的替代Q而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”,而HttpServletResponse中相应的帔R是SC_MOVED_TEMPORARILYQ而不是SC_FOUND?<br />  出现该状态代码时Q浏览器能够自动讉K新的URLQ因此它是一个很有用的状态代码。ؓ此,Servlet提供了一个专用的ҎQ即sendRedirect。用response.sendRedirect(url)比用response.setStatus(response.SC_MOVED_TEMPORARILY)和response.setHeader("Location",url)更好。这是因为: <br />   <br />  首先Q代码更加简z?<br />  W二Q用sendRedirectQServlet会自动构造一个包含新链接的页面(用于那些不能自动重定向的老式览器)?<br />  最后,sendRedirect能够处理相对URLQ自动把它们转换成绝对URL?<br />  注意q个状态代码有时候可以和301替换使用。例如,如果览器错误地h<a href="http://host/~user"><u><font color="#0000ff">http://host/~user</font></u></a>Q缺了后面的斜杠)Q有的服务器q回301Q有的则q回302?<br />   <br />  严格地说Q我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307?<br />   <br />  303 See Other cM?01/302Q不同之处在于,如果原来的请求是POSTQLocation头指定的重定向目标文档应该通过GET提取QHTTP 1.1斎ͼ?<br />  304 Not Modified 客户端有~冲的文档ƈ发出了一个条件性的hQ一般是提供If-Modified-Since头表C客户只x指定日期更新的文档)。服务器告诉客户Q原来缓冲的文档q可以l用?<br />  305 Use Proxy 客户h的文档应该通过Location头所指明的代理服务器提取QHTTP 1.1斎ͼ?<br />  307 Temporary Redirect ?02QFoundQ相同。许多浏览器会错误地响应302应答q行重定向,即原来的请求是POSTQ即使它实际上只能在POSTh的应{是303时才能重定向。由于这个原因,HTTP 1.1新增?07Q以便更加清除地区分几个状态代码:当出?03应答Ӟ览器可以跟随重定向的GET和POSThQ如果是307应答Q则览器只能跟随对GETh的重定向?<br />  注意QHttpServletResponse中没有ؓ该状态代码提供相应的帔R。(HTTP 1.1斎ͼ <br />   <br />  400 Bad Request h出现语法错误?<br />  401 Unauthorized 客户试图未经授权讉K受密码保护的面。应{中会包含一个WWW-Authenticate_览器据此显C用户名?密码对话框,然后在填写合适的Authorization头后再次发出h?<br />  403 Forbidden 资源不可用。服务器理解客户的请求,但拒l处理它。通常׃服务器上文g或目录的权限讄D?<br />  404 Not Found 无法扑ֈ指定位置的资源。这也是一个常用的应答QHttpServletResponse专门提供了相应的ҎQsendError(message)?<br />  405 Method Not Allowed hҎQGET、POST、HEAD、DELETE、PUT、TRACE{)Ҏ定的资源不适用。(HTTP 1.1斎ͼ <br />  406 Not Acceptable 指定的资源已l找刎ͼ但它的MIMEcd和客户在Accpet头中所指定的不兼容QHTTP 1.1斎ͼ?<br />  407 Proxy Authentication Required cM?01Q表C客户必dl过代理服务器的授权。(HTTP 1.1斎ͼ <br />  408 Request Timeout 在服务器许可的等待时间内Q客户一直没有发ZQ何请求。客户可以在以后重复同一h。(HTTP 1.1斎ͼ <br />  409 Conflict 通常和PUTh有关。由于请求和资源的当前状态相冲突Q因此请求不能成功。(HTTP 1.1斎ͼ <br />  410 Gone 所h的文档已l不再可用,而且服务器不知道应该重定向到哪一个地址。它?04的不同在于,q回407表示文档怹地离开了指定的位置Q?04表示׃未知的原因文档不可用。(HTTP 1.1斎ͼ <br />  411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1斎ͼ <br />  412 Precondition Failed h头中指定的一些前提条件失败(HTTP 1.1斎ͼ?<br />  413 Request Entity Too Large 目标文档的大超q服务器当前愿意处理的大。如果服务器认ؓ自己能够E后再处理该hQ则应该提供一个Retry-After_HTTP 1.1斎ͼ?<br />  414 Request URI Too Long URI太长QHTTP 1.1斎ͼ?<br />  416 Requested Range Not Satisfiable 服务器不能满_户在h中指定的Range头。(HTTP 1.1斎ͼ <br />  500 Internal Server Error 服务器遇C意料不到的情况,不能完成客户的请求?<br />  501 Not Implemented 服务器不支持实现h所需要的功能。例如,客户发出了一个服务器不支持的PUTh?<br />  502 Bad Gateway 服务器作为网x者代理时Qؓ了完成请求访问下一个服务器Q但该服务器q回了非法的应答?<br />  503 Service Unavailable 服务器由于维护或者负载过重未能应{。例如,Servlet可能在数据库q接池已满的情况下返?03。服务器q回503时可以提供一个Retry-After头?<br />  504 Gateway Timeout ׃Z理或|关的服务器使用Q表CZ能及时地从远E服务器获得应答。(HTTP 1.1斎ͼ <br />  505 HTTP Version Not Supported 服务器不支持h中所指明的HTTP版本。(HTTP 1.1斎ͼ <br />   <br />   <br />     7.4 实例Q访问多个搜索引?<br />   <br />     下面q个例子用到了除200之外的另外两个常见状态代码:302?04?02通过sendRedirectҎ讄Q?04通过sendErrorҎ讄?<br />   <br />     在这个例子中Q首先出现的HTML表单用来选择搜烦引擎、搜索字W串、每|C的搜烦l果数量。表单提交后QServlet提取q三个变量,按照所选择的搜索引擎的要求构造出包含q些变量的URLQ然后把用户重定向到q个URL。如果用户不能正地选择搜烦引擎Q或者利用其他表单发送了一个不认识的搜索引擎名字,则返回一个提C搜索引擎找不到?04面?<br />   <br />     SearchEngines.java <br />   <br />     注意Q这个Servlet要用到后面给出的SearchSpecc,SearchSpec的功能是构造适合不同搜烦引擎的URL?<br />  package hall; <br />   <br />  import java.io.*; <br />  import javax.servlet.*; <br />  import javax.servlet.http.*; <br />  import java.net.*; <br />   <br />  public class SearchEngines extends HttpServlet { <br />   public void doGet(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   // getParameter自动解码URL~码的查询字W串。由于我?<br />   // 要把查询字符串发送给另一个服务器Q因此再ơ?<br />   // URLEncoderq行URL~码 <br />   String searchString = <br />   URLEncoder.encode(request.getParameter("searchString")); <br />   String numResults = <br />   request.getParameter("numResults"); <br />   String searchEngine = <br />   request.getParameter("searchEngine"); <br />   SearchSpec[] commonSpecs = SearchSpec.getCommonSpecs(); <br />   for(int i=0; iQcommonSpecs.length; i++) { <br />   SearchSpec searchSpec = commonSpecs[i]; <br />   if (searchSpec.getName().equals(searchEngine)) { <br />   String url = <br />   response.encodeURL(searchSpec.makeURL(searchString, <br />   numResults)); <br />   response.sendRedirect(url); <br />   return; <br />   } <br />   } <br />   response.sendError(response.SC_NOT_FOUND, <br />   "No recognized search engine specified."); <br />   } <br />   <br />   public void doPost(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   doGet(request, response); <br />   } <br />  } <br />   <br />   <br />   <br />   <br />     SearchSpec.java <br />  package hall; <br />   <br />  class SearchSpec { <br />   private String name, baseURL, numResultsSuffix; <br />   <br />   private static SearchSpec[] commonSpecs = <br />   { new SearchSpec("google", <br />   "<a ><u><font color="#0000ff">http://www.google.com/search?q</font></u></a>=", <br />   "&num="), <br />   new SearchSpec("infoseek", <br />   "<a ><u><font color="#0000ff">http://infoseek.go.com/Titles?qt</font></u></a>=", <br />   "&nh="), <br />   new SearchSpec("lycos", <br />   "<a ><u><font color="#0000ff">http://lycospro.lycos.com/cgi-bin/pursuit?query</font></u></a>=", <br />   "&maxhits="), <br />   new SearchSpec("hotbot", <br />   "<a ><u><font color="#0000ff">http://www.hotbot.com/?MT</font></u></a>=", <br />   "&DC=") <br />   }; <br />   <br />   public SearchSpec(String name, <br />   String baseURL, <br />   String numResultsSuffix) { <br />   this.name = name; <br />   this.baseURL = baseURL; <br />   this.numResultsSuffix = numResultsSuffix; <br />   } <br />   <br />   public String makeURL(String searchString, String numResults) { <br />   return(baseURL + searchString + numResultsSuffix + numResults); <br />   } <br />   <br />   public String getName() { <br />   return(name); <br />   } <br />   <br />   public static SearchSpec[] getCommonSpecs() { <br />   return(commonSpecs); <br />   } <br />  } <br />   <br />   <br />   <br />   <br />     SearchEngines.html <br />   <br />     下面是调用上qServlet的HTML表单?<br />  Q?DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"Q?<br />  QHTMLQ?<br />  QHEADQ?<br />   QTITLEQ访问多个搜索引擎</TITLEQ?<br />  Q?HEADQ?<br />   <br />  QBODY BGCOLOR="#FDF5E6"Q?<br />   <br />  QFORM ACTION="/servlet/hall.SearchEngines"Q?<br />   QCENTERQ?<br />   搜烦关键? <br />   QINPUT TYPE="TEXT" NAME="searchString"Q<BRQ?<br />   每页昄几个查询l果: <br />   QINPUT TYPE="TEXT" NAME="numResults" <br />   VALUE=10 SIZE=3Q<BRQ?<br />   QINPUT TYPE="RADIO" NAME="searchEngine" <br />   VALUE="google"Q?<br />   Google | <br />   QINPUT TYPE="RADIO" NAME="searchEngine" <br />   VALUE="infoseek"Q?<br />   Infoseek | <br />   QINPUT TYPE="RADIO" NAME="searchEngine" <br />   VALUE="lycos"Q?<br />   Lycos | <br />   QINPUT TYPE="RADIO" NAME="searchEngine" <br />   VALUE="hotbot"Q?<br />   HotBot <br />   QBRQ?<br />   QINPUT TYPE="SUBMIT" VALUE="Search"Q?<br />   Q?CENTERQ?<br />  Q?FORMQ?<br />   <br />  Q?BODYQ?<br />  Q?HTMLQ?<br />8.1 HTTP应答头概q?<br />   <br />     Web服务器的HTTP应答一般由以下几项构成Q一个状态行Q一个或多个应答_一个空行,内容文档。设|HTTP应答头往往和设|状态行中的状态代码结合v来。例如,有好几个表示“文档位|已l改变”的状态代码都伴随着一个Location_?01QUnauthorizedQ状态代码则必须伴随一个WWW-Authenticate头?<br />   <br />     然而,即在没有设|特D含义的状态代码时Q指定应{头也是很有用的。应{头可以用来完成Q设|CookieQ指定修Ҏ期,指示览器按照指定的间隔h面Q声明文档的长度以便利用持久HTTPq接Q……等{许多其他Q务?<br />   <br />     讄应答头最常用的方法是HttpServletResponse的setHeaderQ该Ҏ有两个参敎ͼ分别表示应答头的名字和倹{和讄状态代码相|讄应答头应该在发送Q何文档内容之前进行?<br />   <br />     setDateHeaderҎ和setIntHeadrҎ专门用来讄包含日期和整数值的应答_前者避免了把Java旉转换为GMT旉字符串的ȝQ后者则避免了把整数转换为字W串的麻烦?<br />   <br />     HttpServletResponseq提供了许多讄常见应答头的便方法,如下所C: <br />   <br />  setContentTypeQ设|Content-Type头。大多数Servlet都要用到q个Ҏ?<br />  setContentLengthQ设|Content-Length头。对于支持持久HTTPq接的浏览器来说Q这个函数是很有用的?<br />  addCookieQ设|一个CookieQServlet API中没有setCookieҎQ因为应{往往包含多个Set-Cookie_?<br />  另外Q如上节介绍QsendRedirectҎ讄状态代?02时也会设|Location头?<br />     8.2 常见应答头及其含?<br />   <br />     有关HTTP头详l和完整的说明,请参?a ><u><font color="#0000ff">http://www.w3.org/Protocols/</font></u></a> 规范?<br />   <br />  应答?说明 <br />  Allow 服务器支持哪些请求方法(如GET、POST{)?<br />  Content-Encoding 文档的编码(EncodeQ方法。只有在解码之后才可以得到Content-Type头指定的内容cd。利用gzip压羃文档能够显著地减HTML文档的下载时间。Java的GZIPOutputStream可以很方便地q行gzip压羃Q但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding_即request.getHeader("Accept-Encoding")Q检查浏览器是否支持gzipQؓ支持gzip的浏览器q回lgzip压羃的HTML面Qؓ其他览器返回普通页面?<br />  Content-Length 表示内容长度。只有当览器用持久HTTPq接时才需要这个数据。如果你惌利用持久q接的优势,可以把输出文档写入ByteArrayOutputStramQ完成后查看其大,然后把该值放入Content-Length_最后通过byteArrayStream.writeTo(response.getOutputStream()发送内宏V?<br />  Content-Type 表示后面的文档属于什么MIMEcd。Servlet默认为text/plainQ但通常需要显式地指定为text/html。由于经常要讄Content-TypeQ因此HttpServletResponse提供了一个专用的ҎsetContentTyep?<br />  Date 当前的GMT旉。你可以用setDateHeader来设|这个头以避免{换时间格式的ȝ?<br />  Expires 应该在什么时候认为文档已l过期,从而不再缓存它Q?<br />  Last-Modified 文档的最后改动时间。客户可以通过If-Modified-Sinceh头提供一个日期,该请求将被视Z个条件GETQ只有改动时间迟于指定时间的文档才会q回Q否则返回一?04QNot ModifiedQ状态。Last-Modified也可用setDateHeaderҎ来设|?<br />  Location 表示客户应当到哪里去提取文档。Location通常不是直接讄的,而是通过HttpServletResponse的sendRedirectҎQ该Ҏ同时讄状态代码ؓ302?<br />  Refresh 表示览器应该在多少旉之后h文档Q以U计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器d指定的页面?<br />  注意q种功能通常是通过讄HTML面HEAD区的QMETA HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path"Q实玎ͼq是因ؓQ自动刷新或重定向对于那些不能用CGI或Servlet的HTML~写者十分重要。但是,对于Servlet来说Q直接设|Refresh头更加方ѝ?<br />   <br />  注意Refresh的意义是“NU之后刷新本面或访问指定页面”,而不是“每隔NU刷新本面或访问指定页面”。因此,q箋h要求每次都发送一个Refresh_而发?04状态代码则可以L览器l刷斎ͼ不管是用Refresh头还是<META HTTP-EQUIV="Refresh" ...Q?<br />   <br />  注意Refresh头不属于HTTP 1.1正式规范的一部分Q而是一个扩展,但Netscape和IE都支持它?<br />   <br />  Server 服务器名字。Servlet一般不讄q个|而是由Web服务器自p|?<br />  Set-Cookie 讄和页面关联的Cookie。Servlet不应使用response.setHeader("Set-Cookie", ...)Q而是应用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie讄的讨论?<br />  WWW-Authenticate 客户应该在Authorization头中提供什么类型的授权信息Q在包含401QUnauthorizedQ状态行的应{中q个头是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=Q?executivesQ?")?<br />  注意Servlet一般不q行q方面的处理Q而是让Web服务器的专门机制来控制受密码保护面的访问(例如.htaccessQ?<br />   <br />   <br />   <br />     8.3 实例Q内Ҏ变时自动h面 <br />   <br />     下面q个Servlet用来计算大素数。因非常大的数字(例如500位)可能要花不少旉Q所以Servlet立卌回已l找到的l果Q同时在后台l箋计算。后台计用一个优先较低的线E以避免q多地媄响Web服务器的性能。如果计还没有完成QServlet通过发送Refresh头指C浏览器在几U之后l请求新的内宏V?<br />   <br />     注意Q本例除了说明HTTP应答头的用处之外Q还昄了Servlet的另外两个很有h值的功能。首先,它表明Servlet能够处理多个q发的连接,每个都有自己的线E。Servletl护了一份已有素数计请求的Vector表,通过查找素数个数Q素数列表的长度Q和数字个数Q每个素数的长度Q将当前h和已有请求相匚wQ把所有这些请求同步到q个列表上。第二,本例证明Q在Servlet中维持请求之间的状态信息是非常Ҏ的。维持状态信息在传统的CGI~程中是一件很ȝ的事情。由于维持了状态信息,览器能够在h面时访问到正在q行的计过E,同时也得Servlet能够保存一个有xq请求结果的列表Q当一个新的请求指定了和最q请求相同的参数时可以立卌回结果?<br />   <br />     PrimeNumbers.java <br />   <br />     注意Q该Servlet要用到前面给出的ServletUtilities.java。另外还要用刎ͼPrimeList.javaQ用于在后台U程中创Z个素数的VectorQPrimes.javaQ用于随机生成BigIntegercd的大数字Q检查它们是否是素数。(此处略去PrimeList.java和Primes.java的代码。) <br />  package hall; <br />   <br />  import java.io.*; <br />  import javax.servlet.*; <br />  import javax.servlet.http.*; <br />  import java.util.*; <br />   <br />  public class PrimeNumbers extends HttpServlet { <br />   private static Vector primeListVector = new Vector(); <br />   private static int maxPrimeLists = 30; <br />   <br />   public void doGet(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   int numPrimes = ServletUtilities.getIntParameter(request, "numPrimes", 50); <br />   int numDigits = ServletUtilities.getIntParameter(request, "numDigits", 120); <br />   PrimeList primeList = findPrimeList(primeListVector, numPrimes, numDigits); <br />   if (primeList == null) { <br />   primeList = new PrimeList(numPrimes, numDigits, true); <br />   synchronized(primeListVector) { <br />   if (primeListVector.size() Q? maxPrimeLists) <br />   primeListVector.removeElementAt(0); <br />   primeListVector.addElement(primeList); <br />   } <br />   } <br />   Vector currentPrimes = primeList.getPrimes(); <br />   int numCurrentPrimes = currentPrimes.size(); <br />   int numPrimesRemaining = (numPrimes - numCurrentPrimes); <br />   boolean isLastResult = (numPrimesRemaining == 0); <br />   if (!isLastResult) { <br />   response.setHeader("Refresh", "5"); <br />   } <br />   response.setContentType("text/html"); <br />   PrintWriter out = response.getWriter(); <br />   String title = "Some " + numDigits + "-Digit Prime Numbers"; <br />   out.println(ServletUtilities.headWithTitle(title) + <br />   "QBODY BGCOLOR=Q?#FDF5E6Q?Q\n" + <br />   "QH2 ALIGN=CENTERQ? + title + "Q?H2Q\n" + <br />   "QH3QPrimes found with " + numDigits + <br />   " or more digits: " + numCurrentPrimes + ".Q?H3Q?); <br />   if (isLastResult) <br />   out.println("QBQDone searching.Q?BQ?); <br />   else <br />   out.println("QBQStill looking for " + numPrimesRemaining + <br />   " moreQBLINKQ?..Q?BLINKQ</BQ?); <br />   out.println("QOLQ?); <br />   for(int i=0; iQnumCurrentPrimes; i++) { <br />   out.println(" QLIQ? + currentPrimes.elementAt(i)); <br />   } <br />   out.println("Q?OLQ?); <br />   out.println("Q?BODYQ</HTMLQ?); <br />   } <br />   <br />   public void doPost(HttpServletRequest request, <br />   HttpServletResponse response) <br />   throws ServletException, IOException { <br />   doGet(request, response); <br />   } <br />   <br />   // 查是否存在同cdhQ已l完成,或者正在计)?<br />   // 如存在,则返回现有结果而不是启动新的后台线E?<br />   private PrimeList findPrimeList(Vector primeListVector, <br />   int numPrimes, <br />   int numDigits) { <br />   synchronized(primeListVector) { <br />   for(int i=0; iQprimeListVector.size(); i++) { <br />   PrimeList primes = (PrimeList)primeListVector.elementAt(i); <br />   if ((numPrimes == primes.numPrimes()) && <br />   (numDigits == primes.numDigits())) <br />   return(primes); <br />   } <br />   return(null); <br />   } <br />   } <br />  } <br /></div> <img src ="http://www.tkk7.com/ltc603/aggbug/67168.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ltc603/" target="_blank">阿成</a> 2006-09-01 17:20 <a href="http://www.tkk7.com/ltc603/archive/2006/09/01/67168.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Servlet API说明文档【{载?/title><link>http://www.tkk7.com/ltc603/archive/2006/09/01/67157.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Fri, 01 Sep 2006 09:06:00 GMT</pubDate><guid>http://www.tkk7.com/ltc603/archive/2006/09/01/67157.html</guid><wfw:comment>http://www.tkk7.com/ltc603/comments/67157.html</wfw:comment><comments>http://www.tkk7.com/ltc603/archive/2006/09/01/67157.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ltc603/comments/commentRss/67157.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ltc603/services/trackbacks/67157.html</trackback:ping><description><![CDATA[ <div>Java Servlet API说明文档Q?.1a版)<br />译者前aQ?br />q来在整理有关Servlet资料时发玎ͼ在网上竟然找不到一份中文的Java Servlet API的说明文档,而在有一本有关JSP的书后面附的Java Servlet API说明竟然不全Q而这份文档的2.1a版在1998q的11月䆾已定稿。所以我军_译一份中文的文档Q其中一些与技术关pM大的部分已被略去Q,有兴的读者可以从http: //java.sun.com/products/servlet/2.1/servletspec-2.1.zip下蝲原文阅读?br /><br /><br />Java Servlet API说明文档Q?.1a版)<br />1998q?1?br /><br /><br />l言<br />q是一份关?.1版Java Servlet API的说明文档,作ؓ对这本文档的补充Q你可以?a href="http://java.sun.com/products/servlet/index.html下面下蝲Javadoc格式的文档?><font color="#000000">http://java.sun.com/products/servlet/index.html下面下蝲Javadoc格式的文档?/font></a><br /><br />谁需要读q䆾文档<br />q䆾文档描述了Java Servlet API的最新版?.1版。所以,q本书对于Servlet的开发者及servlet引擎的开发者同样适用?br /><br />Java Servlet API的组?br />Java Servlet API׃个Y件包l成Q一个是对应HTTP的Y件包Q另一个是不对应HTTP的通用的Y件包。这两个软g包的同时存在使得Java Servlet API能够适应来的其他请?响应的协议?br />q䆾文档以及刚才提及的Javadoc格式的文档都描述了这两个软g包,Javadoc格式的文档还描述了你应该如何使用q两个Y件包中的所有方法?br /><br />有关规范<br />你也许对下面的这些Internet规范感兴,q些规范直接媄响到Servlet API的发展和执行。你可以从http: //info.internet.isi.edu/7c/in-notes/rfc/.cache 扑ֈ下面提到的所有这些RFC规范?br />RFC 1738 l一资源定位?URL) <br />RFC 1808 相关l一资源定位?<br />RFC 1945 文本传输协?-HTTP/1.0 <br />RFC 2045 多用途Internet邮g扩展(多用途网际邮件扩充协?MIME))W一部分:Internet信息体格?<br />RFC 2046 多用途Internet邮g扩展(多用途网际邮件扩充协?MIME))W二部分:媒体cd <br />RFC 2047 多用途网际邮件扩充协?MIME)(多用途Internet邮g扩展)W三部分:信息标题扩展用于非ASCII文本 <br />RFC 2048 多用途Internet邮g扩展(多用途网际邮件扩充协?MIME))W四部分: 注册步骤 <br />RFC 2049 多用途Internet邮g扩展(多用途网际邮件扩充协?MIME))W五部分:一致性标准和例子 <br />RFC 2068 文本传输协?-- HTTP/1.1 <br />RFC 2069 一个扩展HTTP:摘要讉K鉴定 <br />RFC 2109 HTTP状态管理机?<br />RFC 2145 HTTP 版本L使用和解?<br />RFC 2324 文本Coffee Pot控制协议 (HTCPCP/1.0)<br />万维|协会(<a ><font color="#000000">http://www.w3.orgQ管理着q些协议的规范和执行?</font></a><br /><br /><br />有关Java Servlets<br />JavaTM servlets 是一个不受^台约束的Java程序,它可以被用来通过多种Ҏ扩充一个Web服务器的功能。你可以把Servlet理解成Server上的 appletsQ它被编译成字节码,q样它就可以被动态地载入q用效地扩展L的处理能力?br />Servlet与applets不同的地ҎQ它不运行在Web览器或其他囑Ş化的用户界面上。Servlet通过servlet引擎q行在Web服务器中Q以执行h和响应,h、响应的典型范例是HTTP协议?br />一个客LE序Q可以是一个Web览器,或者是非其他的可以q接上Internet的程序,它会讉KWeb服务器ƈ发出h。这个请求被q行在Web服务器上的Servlet引擎处理Qƈq回响应到Servlet。Servlet通过HTTP这个响应{发到客户端?br />在功能上QServlet与CGI、NSAPI有点cMQ但是,与他们不同的是:Servlethq_无关性?br /><br />Java Servlet概论<br />Servlet与其他普通的server扩展机制有以下进步:<br />因ؓ它采用了不同的进E处理模式,所以它比CGI更快?br />它用了许多Web服务器都支持的标准的API?br />它承了Java的所有优势,包括易升U以及^台无x?br />它可以调用Java所提供的大量的API的功能模块?br />q䆾文档说明了Java Servlet API的类和接口的Ҏ。有x多的信息Q请参看下面的API说明?br /><br />Servlet的生命周?br />一个Java servleth一个生命周期,q个生命周期定义了一个Servlet如何被蝲入ƈ被初始化Q如何接收请求ƈ作出对请求的响应Q如何被从服务中清除。Servlet的生命周期被javax.servlet.Servletq个接口所定义?br />所有的Java Servlet都会直接地或间接地执行javax.servlet.Servlet接口Q这样它才能在一个Servlet引擎中运行?Servlet引擎是Web 服务器按照Java Servlet API定制的扩展。Servlet引擎提供|络服务Q能够理解MIMEhQƈ提供一个运行Servlet的容器?br />javax.servlet.Servlet接口定义了在Servlet的生命周期中特定旉以及特定序被调用的Ҏ?br /><br />Servlet的解析和载入<br />Servlet引擎解析q蝲入一个ServletQ这个过E可以发生在引擎启动Ӟ需要一个Servletd应请求时Q以及在此之间的M时候?br />Servlet引擎利用Javac蝲入工兯入一个ServletQServlet引擎可以从一个本地的文gpȝ、一个远E的文gpȝ以及|络载入Servlet?br /><br />Servlet的初始化<br />Servlet引擎载入Servlet后,Servlet引擎必须对Servletq行初始化,在这一q程中,你可以读取一些固定存储的数据、初始化JDBC的连接以及徏立与其他资源的连接?br />在初始化q程中,javax.servlet.Servlet接口的init()Ҏ提供了Servlet的初始化信息。这PServlet可以对自p行配|?br />init()Ҏ获得了一个Servlet配置对象QServletConfigQ。这个对象在Servlet引擎中执行,q允许Servlet通过它获处相兛_数。这个对象得Servlet能够讉KServletContext对象?br /><br />Servlet处理h<br />Servlet被初始化之后Q它已经可以处理来自客户端的hQ每一个来自客L的请求都被描q成一个ServletRequest对象QServlet的响应被描述成一个ServletResponse对象?br />当客L发出hӞServlet引擎传递给Servlet一个ServletRequest对象和一个ServletResponse对象Q这两个对象作ؓ参数传递到service()Ҏ中?br />Servlet 也可以执行ServletRequest接口和ServletResponse接口。ServletRequest接口使得Servlet有权使用客户端发出的h。Servlet可以通过ServletInputStream对象dh信息?br />ServletResponse接口允许Servlet建立响应头和状态代码。通过执行q个接口QServlet有权使用ServletOutputStreamcL向客Lq回数据?br /><br />多线E和映射<br />在多U程的环境下QServlet必须能处理许多同时发生的h。例外的情况是这个Servlet执行了SingleThreadModel接口Q如果是那样的话QServlet只能同时处理一个请求?br />Servlet依照Servlet引擎的映来响应客户端的h。一个映对包括一个Servlet实例以及一个Servletq回数据的URLQ例如:HelloServlet with /hello/index.html?br />然而,一个映可能是׃个URL和许多Servlet实例l成Q例如:一个分布式的Servlet引擎可能q行在不止一个的服务器中Q这L话,每一个服务器中都可能有一个Servlet实例Q以qq程的蝲入。作Z个Servlet的开发者,你不能假定一个Servlet只有一个实例?br /><br />Servlet的卸?br />Servlet引擎q不必需保证一个Servlet在Q何时候或在服务开启的M时候都被蝲入。Servlet引擎可以自由的在M时候用或清除一个Servlet。因此,我们不能依赖一个类或实例来存储重要的信息?br />当Servlet引擎军_卸蝲一个ServletӞ例如Q如果这个引擎被关闭或者需要让资源Q,q个引擎必须允许Servlet释放正在使用的资源ƈ存储有关资料。ؓ了完成以上工作,引擎会调用Servlet的destroy()Ҏ?<br />在卸载一个Servlet之前QServlet引擎必须{待所有的service()Ҏ完成或超时结束(Servlet引擎会对时作出定义Q。当一?Servlet被卸载时Q引擎将不能lServlet发送Q何请求。引擎必释放Servletq完成无用存储单元的攉<br /><br />Servlet映射技?br />作ؓ一个Servlet引擎的开发者,你必d于如何映客L的请求到Servlet有大量的适应性。这份说明文档不规定映射如何发生。但是,你必能够自由地q用下面的所有技术:<br /><br />映射一个ServletC个URL<br />例如Q你可以指定一个特D的Servlet它仅被来?feedback/index.html的请求调用?br /><br />映射一个ServletC一个指定的目录名开始的所有URL<br />例如Q你可以映射一个Servlet?catalogQ这h?catalog/?/catalog/garden?/catalog/housewares/index.html的请求都会被映射到这个Servlet。但是来?catalogtwo ?/catalog.html的请求没被映?br /><br />映射一个Servlet到所有以一个特定的字段l尾的所有URL<br />例如Q你可以映射一个来自于所有以in.thtmll尾的请求到一个特定的Servlet?br /><br />映射一个ServletC个特D的URL /servlet/servlet_name?br />例如Q如果你建立了一个名叫listattributes的ServletQ你可以通过使用/servlet/listattributes来访问这个Servlet?br /><br />通过cd调用Servlet<br />例如Q如果Servlet引擎接收了来?servlet/com.foo.servlet.MailServlet的请求,Servlet引擎会蝲入这个com.foo.servlet.MailServletc,建立实例Qƈ通过q个Servlet来处理请求?br /><br />Servlet环境<br />ServletContext 接口定义了一个Servlet环境对象Q这个对象定义了一个在Servlet引擎上的Servlet的视图。通过使用q个对象QServlet可以记录事g、得到资源ƈ得到来自Servlet引擎的类Q例如RequestDispatcher对象Q。一个Servlet只能q行在一个Servlet环境中,但是不同的Servlet可以在Servlet引擎上有不同的视图?br />如果Servlet引擎支持虚拟LQ每个虚拟主机有一个Servlet环境。一个Servlet环境不能在虚拟主Z间共享?br />Servlet引擎能够允许一个Servlet环境有它自己的活动范围?br />例如Q一个Servlet环境是属于bank应用的,它将被映到/bank目录下。在q种情况下,一个对getContextҎ的调用会q回/bank的Servlet环境?br /><br />HTTP会话<br />HTTP是一个没有状态的协议。要建立一个有效的Web服务应用Q你必须能够识别一个连l的来自q端的客h的唯一的请求。随着旉的过去,发展了许多会话跟t的技术,但是使用h都比较麻烦?br />Java Servlet API提供了一个简单的接口Q通过q个接口QServlet引擎可以有效地跟t用L会话?br /><br />建立Session<br />因ؓHTTP是一个请?响应协议Q一个会话在客户机加入之前会被认为是一个新的会话。加入的意思是q回会话跟踪信息到服务器中,指出会话已被建立。在客户端加入之前,我们不能判断下一个客Lh是目前会话的一部分?br />在下面的情况下,Session会被认ؓ是新的Session?br />客户端的Session在此之前q不知道<br />客户端选择不加入SessionQ例如,如果客户端拒l接收来自服务器的cookie<br />作ؓ一个Servlet的开发者,你必d定你的Web应用是否处理客户Z加入或不能加入Session。服务器会在Web服务器或Servlet规定的时间内l持一个Session对象。当Sessionl止Ӟ服务器会释放Session对象以及所有绑定在Session上的对象?br />l定对象到Session?br />如果有助于你处理应用的数据需求,你也讔R要绑定对象到Session中,你可以通过一个唯一的名字绑定Q何的对象到Session中,q时Q你需要?HttpSession对象。Q何绑定到Session上的对象都可以被处理同一会话的Servlet调用?br />有些对象可能需要你知道什么时候会被放|到Session中或从Session中移开。你可以通过使用HttpSessionBindingListener接口获得q些信息。当你的应用存储数据到Session中,或从Session中清除数据,Servlet都会通过HttpSessionBindingListener杳什么类被绑定或被取消绑定。这个接口的Ҏ会通报被绑定或被取消绑定的对象?br /><br />API对象的说?br />q一部分包含了对Java Servlet API的全部类和接口的详细说明。这个说明与Javadoc API差不多,但是q䆾文档提供了更多的信息?br />API包含了两个Y件包Q十二个接口和九个类?br />软g包:javax.servlet <br />所包含的接口:RequestDispatcherQServletQServletConfigQServletContextQServletRequestQServletResponseQSingleThreadModel?br />所包含的类QGenericServletQServletInputStreamQServletOutputStreamQServletExceptionQUnavailableException?br /><br />一、RequestDispatcher接口Q?br />定义Q?br />public interface RequestDispatcher;<br />定义一个对象,从客L接收hQ然后将它发l服务器的可用资源(例如Servlet、CGI、HTML文g、JSP文gQ。Servlet引擎创徏request dispatcher对象Q用于封装由一个特定的URL定义的服务器资源?br />q个接口是专用于装Servlet的,但是一个Servlet引擎可以创徏request dispatcher对象用于装Mcd的资源?br />request dispatcher对象是由Servlet引擎建立的,而不是由Servlet开发者徏立的?br />Ҏ<br />1、forward<br />public void forward(ServletRequest request, ServletReponse response)<br />throws ServletException, IOException;<br />被用来从q个Servlet向其它服务器资源传递请求。当一个Servlet对响应作了初步的处理Qƈ要求其它的对象对此作出响应时Q可以用这个方法?br />当request对象被传递到目标对象Ӟh的URL路径和其他\径参C被调整ؓ反映目标对象的目标URL路径?br />如果已经通过响应q回了一个ServletOutputStream对象或PrintWriter对象Q这个方法将不能使用Q否则,q个Ҏ会抛Z个IllegalStateException?br />2、include<br />public void include(ServletRequest request, ServletResponse response)<br />throws ServletException, IOException<br />用来包括发送给其他服务器资源的响应的内宏V本质上来说Q这个方法反映了服务器端的内宏V?br />h对象传到目标对象后会反映调用h的请求URL路径和\径信息。这个响应对象只能调用这个Servlet的ServletOutputStream对象和PrintWriter对象?br />一个调用include的Servlet不能讄头域Q如果这个Servlet调用了必设|头域的ҎQ例如cookieQ,q个Ҏ不能保证正怋用。作Z个Servlet开发者,你必d善地解决那些可能直接存储头域的方法。例如,即你用会话跟t,Z保证session的正常工作,你必d一个调用include的Servlet之外开始你的session<br /><br />二、Servlet接口?br />定义<br />public interface Servlet<br />q个接口定义了一个ServletQ一个在Web服务器上l承了这个功能的JavacR?br />Ҏ<br />1、init<br />public void init(ServletConfig config) throws ServletException;<br />Servlet引擎会在Servlet实例化之后,|入服务之前_地调用initҎ。在调用serviceҎ之前QinitҎ必须成功退出?br />如果initҎ抛出一个ServletExceptionQ你不能这个Servlet|入服务中,如果initҎ在超时范围内没完成,我们也可以假定这个Servlet是不具备功能的,也不能置入服务中?br />2、service<br />public void service(ServletRequest request, ServletResponse response)<br />throws ServletException, IOException;<br />Servlet引擎调用q个Ҏ以允许Servlet响应h。这个方法在Servlet未成功初始化之前无法调用。在Servlet被初始化之前QServlet引擎能够锁未决的请求?br />在一个Servlet对象被卸载后Q直C个新的Servelt被初始化QServlet引擎不能调用q个Ҏ<br />3、destroy<br />public void destroy();<br />当一个Servlet被从服务中去除时QServlet引擎调用q个Ҏ。在q个对象的serviceҎ所有线E未全部退出或者没被引擎认为发生超时操作时QdestroyҎ不能被调用?br />4、getServletConfig<br />public ServletConfig getServletConfig();<br />q回一个ServletConfig对象Q作Z个Servlet的开发者,你应该通过initҎ存储ServletConfig对象以便q个Ҏ能返回这个对象。ؓ了你的便利,GenericServlet在执行这个接口时Q已l这样做了?br />5、getServletInfo<br />public String getServletInfo();<br />允许Servlet向主机的Servletq行者提供有兛_本n的信息。返回的字符串应该是U文本格式而不应有M标志Q例如HTMLQXML{)?br /><br />三、ServletConfig接口<br />定义<br />public interface ServletConfig<br />q个接口定义了一个对象,通过q个对象QServlet引擎配置一个Servletq且允许Servlet获得一个有兛_的ServletContext接口的说明。每一个ServletConfig对象对应着一个唯一的Servlet?br />Ҏ<br />1、getInitParameter<br />public String getInitParameter(String name);<br />q个Ҏq回一个包含Servlet指定的初始化参数的String。如果这个参C存在Q返加空倹{?br />2、getInitParameterNames<br />public Enumeration getInitParameterNames();<br />q个Ҏq回一个列表String对象Q该对象包括Servlet的所有初始化参数名。如果Servlet没有初始化参敎ͼgetInitParameterNamesq回一个空的列表?br />3、getServletContext<br />public ServletContext getServletContext();<br />q回q个Servlet的ServletContext对象?br /><br />四、ServletContext接口<br />定义<br />public interface ServletContext<br />定义了一个Servlet的环境对象,通过q个对象QServlet引擎向Servlet提供环境信息?br />一个Servlet的环境对象必至与它所ȝ的主机是一一对应的。在一个处理多个虚拟主机的Servlet引擎中(例如Q用了HTTP1.1的主机头域)Q每一个虚拟主机必被视ؓ一个单独的环境。此外,Servlet引擎q可以创建对应于一lServlet的环境对象?br />Ҏ <br />1、getAttribute<br />public Object getAttribute(String name); <br />q回Servlet环境对象中指定的属性对象。如果该属性对象不存在Q返回空倹{这个方法允许访问有兌个Servlet引擎的在该接口的其他Ҏ中尚未提供的附加信息?br />2、getAttributeNames<br />public Enumeration getAttributeNames();<br />q回一个Servlet环境对象中可用的属性名的列表?br />3、getContext<br />public ServletContext getContext(String uripath);<br />q回一个Servlet环境对象Q这个对象包括了特定URI路径的Servlets和资源,如果该\径不存在Q则q回一个空倹{URI路径格式?dir/dir/filename.ext?br />Z安全Q如果通过q个Ҏ讉K一个受限制的Servlet的环境对象,会返回一个空倹{?br />4、getMajorVersion<br />public int getMajorVersion();<br />q回Servlet引擎支持的Servlet API的主版本受例如对?.1版,q个Ҏ会返回一个整??br />5、getMinorVersion<br />public int getMinorVersion();<br />q回Servlet引擎支持的Servlet API的次版本受例如对?.1版,q个Ҏ会返回一个整??br />6、getMimeType<br />public String getMimeType(String file);<br />q回指定文g的MIMEcdQ如果这UMIMEcd未知Q则q回一个空倹{MIMEcd是由Servlet引擎的配|决定的?br />7、getRealPath<br />public String getRealPath(String path);<br />一个符合URL路径格式的指定的虚拟路径的格式是Q?dir/dir/filename.ext。用q个ҎQ可以返回与一个符合该格式的虚拟\径相对应的真实\径的String。这个真实\径的格式应该适合于运行这个Servlet引擎的计机Q包括其相应的\径解析器Q?br />不管是什么原因,如果q一从虚拟\径{换成实际路径的过E不能执行,该方法将会返回一个空倹{?br />8、getResource<br />public URL getResource(String uripath);<br />q回一个URL对象Q该对象反映位于l定的URL地址Q格式:/dir/dir/filename.extQ的Servlet环境对象已知的资源。无?URLStreamHandlers对于讉Kl定的环境是不是必须的,Servlet引擎都必L行。如果给定的路径的Servlet环境没有已知的资源,该方法会q回一个空倹{?br />q个Ҏ和java.lang.Class的getResourceҎ不完全相同?java.lang.Class的getResourceҎ通过装蝲cLL资源。而这个方法允许服务器产生环境变量lQ何资源的MServletQ而不必依赖于装蝲cR特定区域等{?br />9、getResourceAsStream<br />public InputStream getResourceAsStream(String uripath);<br />q回一个InputStream对象Q该对象引用指定的URL的Servlet环境对象的内宏V如果没扑ֈServlet环境变量Q就会返回空|URL路径应该hq种格式Q?dir/dir/filename.ext?br />q个Ҏ是一个通过getResourceҎ获得URL对象的方便的途径。请注意Q当你用这个方法时Qmeta-informationQ例如内定w度、内容类型)会丢失?br />10、getRequestDispatcher<br />public RequestDispatcher getRequestDispatcher(String uripath);<br />如果q个指定的\径下能够扑ֈzd的资?例如一个ServletQJSP面QCGI{等)p回一个特定URL的RequestDispatcher 对象Q否则,p回一个空|Servlet引擎负责用一个request dispatcher对象装目标路径。这?request dispatcher对象可以用来完全h的传送?br />11、getServerInfo<br />public String getServerInfo();<br />q回一个String对象Q该对象臛_包括Servlet引擎的名字和版本受?br />12、log<br />public void log(String msg);<br />public void log(String msg, Throwable t);<br />public void log(Exception exception, String msg); // q种用法被取消<br />写指定的信息C个Servlet环境对象的log文g中。被写入的log文g由Servlet引擎指定Q但是通常q是一个事件log。当q个Ҏ被一个异常调用时Qlog中将包括堆栈跟踪?br />13、setAttribute<br />public void setAttribute(String name, Object o);<br />l予Servlet环境对象中你所指定的对象一个名U?br />14、removeAttribute<br />public void removeAttribute(String name);<br />从指定的Servlet环境对象中删除一个属性?br />注:以下几个Ҏ被取消<br />15、getServlet<br />public Servlet getServlet(String name) throws ServletException;<br />最初用来返回一个指定名U的ServletQ如果没扑ֈp回一个空倹{如果这个Servlet能够q回Q这意味着它已l被初始化,而且已经可以接受 serviceh。这是一个危险的Ҏ。当调用q个ҎӞ可能q不知道Servlet的状态,q就可能D有关服务器状态的问题。而允怸?Servlet讉K其他Servlet的这个方法也同样的危险?br />现在q个Ҏq回一个空|Z保持和以前版本的兼容性,现在q个Ҏq没有被取消。在以后的API版本中,该方法将被取消?br />16、getServletNames<br />public Enumeration getServletNames();<br />最初用来返回一个String对象的列表,该列表表CZ在这个Servlet环境下所有已知的Servlet对象名。这个列表L包含q个Servlet自n?br />Z与上一个方法同L理由Q这也是一个危险的Ҏ?br />现在q个Ҏq回一个空的列表。ؓ了保持和以前版本的兼Ҏ,现在q个Ҏq没有被取消。在以后的API版本中,该方法将被取消?br />17、getServlets<br />public Enumeration getServlets();<br />最初用来返回在q个Servelet环境下所有已知的Servlet对象的列表。这个列表L包含q个Servlet自n?br />Z与getServletҎ同样的理由,q也是一个危险的Ҏ?br />现在q个Ҏq回一个空的列表。ؓ了保持和以前版本的兼Ҏ,现在q个Ҏq没有被取消。在以后的API版本中,该方法将被取消?br /><br />五、ServletRequest接口<br />定义<br />public interface ServletRequest<br />定义一个Servlet引擎产生的对象,通过q个对象QServlet可以获得客户端请求的数据。这个对象通过dh体的数据提供包括参数的名U、值和属性以及输入流的所有数据?br />Ҏ<br />1、getAttribute<br />public Object getAttribute(String name);<br />q回h中指定属性的|如果q个属性不存在Q就q回一个空倹{这个方法允许访问一些不提供l这个接口中其他Ҏ的请求信息以及其他Servlet攄在这个请求对象内的数据?br />2、getAttributeNames<br />public Enumeration getAttributeNames();<br />q回包含在这个请求中的所有属性名的列表?br />3、getCharacterEncoding<br />public String getCharacterEncoding();<br />q回h中输入内容的字符~码cdQ如果没有定义字W编码类型就q回I倹{?br />4、getContentLength<br />public int getContentLength();<br />h内容的长度,如果长度未知p?1?br />5、getContentType<br />public String getContentType();<br />q回h数据体的MIMEcdQ如果类型未知返回空倹{?br />6、getInputStream<br />public ServletInputStream getInputStream() throws IOException;<br />q回一个输入流用来从请求体d二进制数据。如果在此之前已l通过getReaderҎ获得了要d的结果,q个Ҏ会抛Z个IllegalStateException?br />7、getParameter<br />public String getParameter(String name);<br />以一个Stringq回指定的参数的|如果q个参数不存在返回空倹{例如,在一个HTTP Servlet中,q个Ҏ会返回一个指定的查询语句产生的参数的值或一个被提交的表单中的参数倹{如果一个参数名对应着几个参数|q个Ҏ只能q回通过getParameterValuesҎq回的数l中的第一个倹{因此,如果q个参数有(或者可能有Q多个|你只能用getParameterValuesҎ?br />8、getParameterNames<br />public Enumeration getParameterNames();<br />q回所有参数名的String对象列表Q如果没有输入参敎ͼ该方法返回一个空倹{?br />9、getParameterValues<br />public String[] getParameterValues(String name);<br />通过一个String对象的数l返回指定参数的|如果q个参数不存在,该方法返回一个空倹{?br />10、getProtocol<br />public String getProtocol();<br />q回q个h所用的协议Q其形式是协?ȝ本号.ơ版本号。例如对于一个HTTP1.0的请求,该方法返回HTTP/1.0?br />11、getReader<br />public BufferedReader getReader() throws IOException;<br />q个Ҏq回一个buffered reader用来dh体的实体Q其~码方式依照h数据的编码方式。如果这个请求的输入已l被getInputStream调用获得Q这个方法会抛出一个IllegalStateException?br />12、getRemoteAddr<br />public String getRemoteAddr();<br />q回发送请求者的IP地址?br />13、getRemoteHost<br />public String getRemoteHost();<br />q回发送请求者的L名称。如果引擎不能或者选择不解析主机名Qؓ了改善性能Q,q个Ҏ会直接返回IP地址?br />14、getScheme<br />public String getScheme();<br />q回h所使用的URL的模式。例如,对于一个HTTPhQ这个模式就是http?br />15、getServerName<br />public String getServerName();<br />q回接收h的服务器的主机名?br />16、getServerPort<br />public int getServerPort();<br />q回接收h的端口号?br />17、setAttribute<br />public void setAttribute(String name, Object object);<br />q个Ҏ在请求中d一个属性,q个属性可以被其他可以讉Kq个h对象的对象(例如一个嵌套的ServletQ用?br />注:以下Ҏ被取消<br />getRealPath<br />public String getRealPath(String path);<br />q回与虚拟\径相对应的真实\径,如果因ؓ某种原因Q这一q程不能q行Q该Ҏ返回一个空倹{?br />q个Ҏ和ServletContext接口中的getRealPathҎ重复。在2.1版中QServletContext接口阐明一?Servlet所能用的所有的路径的映。该Ҏ执行的结果将会与ServletContext中getRealPathҎ的结果完全一栗?br /><br />六、ServletResponse接口<br />定义<br />public interface ServletResponse<br />定义一个Servlet引擎产生的对象,通过q个对象QServlet对客L的请求作出响应。这个响应应该是一个MIME实体Q可能是一个HTMLc图象数据或其他MIME的格式?br />Ҏ<br />1、getCharacterEncoding<br />public String getCharacterEncoding();<br />q回MIME实体的字W编码。这个字W编码可以是指定的类型,也可以是与请求头域所反映的客L所能接受的字符~码最匚w的类型。在HTTP协议中,q个信息被通过Accept-Charset传送到Servlet引擎?br />有关字符~码和MIME的更多信息请参看RFC 2047?br />2、getOutputStream<br />public ServletOutputStream getOutputStream() throws IOException;<br />q回一个记录二q制的响应数据的输出?br />如果q个响应对象已经调用getWriterQ将会抛出IllegalStateException?br />3、getWriter<br />public PrintWriter getWriter throws IOException;<br />q个Ҏq回一个PringWriter对象用来记录格式化的响应实体。如果要反映使用的字W编码,必须修改响应的MIMEcd。在调用q个Ҏ之前Q必设定响应的contentcd?br />如果没有提供q样的编码类型,会抛Z个UnsupportedEncodingExceptionQ如果这个响应对象已调用getOutputStreamQ会抛出一个getOutputStream?br />4、setContentLength<br />public void setContentLength(int length);<br />讄响应的内容的长度Q这个方法会覆盖以前对内定w度的讑֮?br />Z保证成功地设定响应头的内定w度,在响应被提交到输出流之前必须调用q个Ҏ?br />5、setContentType<br />public void setContentType(String type);<br />q个Ҏ用来讑֮响应的contentcd。这个类型以后可能会在另外的一些情况下被隐式地修改Q这里所说的另外的情况可能当服务器发现有必要的情况下对MIME的字W设|?br />Z保证成功地设定响应头的contentcdQ在响应被提交到输出之前必调用这个方法?br /><br />七、SingleThreadModel接口<br />定义<br />public interface SingleThreadModel;<br />q是一个空接口Q它指定了系l如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的serviceҎ中将不会有两个线E被同时执行?br />Servlet可以通过l持一个各自独立的Servlet实例池,或者通过只让Servlet的service中只有一个线E的Ҏ来实现这个保证?br /><br />八、GenericServletc?br />public abstract class GenericServlet implements Servlet,<br />ServletConfig, Serializable;<br />q个cȝ存在使得~写Servlet更加方便。它提供了一个简单的ҎQ这个方案用来执行有关Servlet生命周期的方法以及在初始化时对ServletConfig对象和ServletContext对象q行说明?br />Ҏ<br />1、destroy<br />public void destroy();<br />在这里destroyҎ不做M其他的工作?br />2、getInitParameter<br />public String getInitParameter(String name);<br />q是一个简便的途径Q它会调用ServletConfig对象的同名的Ҏ?br />3、getInitParameterNames<br />public Enumeration getInitParameterNames();<br />q是一个简便的途径Q它会调用ServletConfig对象的同名的Ҏ?br />4、getServletConfig<br />public ServletConfig getServletConfig();<br />q回一个通过q个cȝinitҎ产生的ServletConfig对象的说明?br />5、getServletContext<br />public ServletContext getServletContext();<br />q是一个简便的途径Q它会调用ServletConfig对象的同名的Ҏ?br />6、getServletInfo<br />public String getServletInfo();<br />q回一个反映Servlet版本的String?br />7、init<br />public void init() throws ServletException;<br />public void init(ServletConfig config) throws ServletException;<br />init(ServletConfig config)Ҏ是一个对q个Servlet的生命周期进行初始化的简便的途径?br />init()Ҏ是用来让你对GenericServletc进行扩充的Q用这个方法时Q你不需要存储config对象Q也不需要调用super.init(config)?br />init(ServletConfig config)Ҏ会存储config对象然后调用init()。如果你重蝲了这个方法,你必调用super.init(config)Q这样GenericServletcȝ其他Ҏ才能正常工作?br />8、log<br />public void log(String msg);<br />public void log(String msg, Throwable cause);<br />通过Servlet content对象Servlet的类名和l定的信息写入log文g中?br />9、service<br />public abstract void service(ServletRequest request, ServletResponse<br />response) throws ServletException, IOException;<br />q是一个抽象的ҎQ当你扩展这个类ӞZ执行|络hQ你必须执行它?br /><br />九、ServletInputStreamc?br />定义<br />public abstract class ServletInputStream extends InputStream<br />q个cd义了一个用来读取客L的请求信息的输入。这是一个Servlet引擎提供的抽象类。一个Servlet通过使用ServletRequest接口获得了对一个ServletInputStream对象的说明?br />q个cȝ子类必须提供一个从InputStream接口d有关信息的方法?br />Ҏ<br />1、readLine<br />public int readLine(byte[] b, int off, int len) throws IOException;<br />从输入流的指定的偏移量开始将指定长度的字节读入到指定的数l中。如果该行所有请求的内容都已被读取,q个d的过E将l束。如果是遇到了新的一行,新的一行的首个字符也将被读入到数组中?br /><br />十、ServletOutputStreamc?br />定义<br />public abstract class ServletOutputStream extends OutputStream<br />q是一个由Servlet引擎使用的抽象类。Servlet通过使用ServletResponse接口的用获得了对一个这U类型的对象的说明。利用这个输出流可以数据返回到客户端?br />q个cȝ子类必须提供一个向OutputStream接口写入有关信息的方法?br />在这个接口中Q当一个刷新或关闭的方法被调用时。所有数据缓冲区的信息将会被发送到客户端,也就是说响应被提交了。请注意Q关闭这U类型的对象时不一定要关闭隐含的socket?br />Ҏ<br />1、print<br />public void print(String s) throws IOException;<br />public void print(boolean b) throws IOException;<br />public void print(char c) throws IOException;<br />public void print(int i) throws IOException;<br />public void print(long l) throws IOException;<br />public void print(float f) throws IOException;<br />public void print(double d) throws IOException;<br />输出变量到输出流?br />2、println<br />public void println() throws IOException;<br />public void println(String s) throws IOException;<br />public void println(boolean b) throws IOException;<br />public void println(char c) throws IOException;<br />public void println(int i) throws IOException;<br />public void println(long l) throws IOException;<br />public void println(float f) throws IOException;<br />public void println(double d) throws IOException;<br />输出变量到输出流中,q增加一个回车换行符<br /><br />十一、ServletExceptionc?br />定义<br />public class ServletException extends Exception<br />当Servlet遇到问题时抛出的一个异常?br />构造函?br />public ServletException();<br />public ServletException(String message);<br />public ServletException(String message, Throwable cause);<br />public ServletException(Throwable cause);<br />构造一个新的ServletExceptionQ如果这个构造函数包括一个Throwable参数Q这个Throwable对象被作ؓ可能抛出q个异常的原因?br />Ҏ<br />1、getRootCause<br />public Throwable getRootCause();<br />如果配置了抛个异常的原因Q这个方法将q回q个原因Q否则返回一个空倹{?br /><br />十二、UnavailableExceptionc?br />定义<br />public class UnavailableException extends ServletException<br />不论一个Servlet是永久地q是临时地无效,都会抛出q个异常。Servlet会记录这个异总及Servlet引擎所要采取的相应措施?br />临时的无效是指Servlet在某一旉׃一个时的问题而不能处理请求。例如,在另一个不同的应用层的服务Q可能是数据库)无法使用。这个问题可能会自行U正或者需要采取其他的U正措施?br />怹的无效是指除非管理员采取措施Q这个Servlet不能处理客L的请求。例如,q个Servlet配置信息丢失或Servlet的状态被破坏?br />Servlet 引擎可以安全地处理包括永久无效在内的q两U异常,但是对时无效的正常处理可以使得Servlet引擎更健壮。特别的Q这时对Servlet的请求只是被LQ或者是被g期)一D|_q显然要比在service自己重新启动前完全拒l请求更为科学?br />构造函?br />public UnavailableException(Servlet servlet, String message);<br />public UnavailableException(int seconds, Servlet servlet, <br />String message);<br />构造一个包含指定的描述信息的新的异常。如果这个构造函数有一个关于秒数的参数Q这给出Servlet发生临时无效后,能够重新处理h的估计时间。如果不包含q个参数Q这意味着q个Servlet怹无效?br />Ҏ<br />1、getServlet<br />public Servlet getServlet();<br />q回报告无效的Servlet。这被Servlet引擎用来识别受到影响的Servlet?br />2、getUnavailableSeconds<br />public int getUnavailableSeconds();<br />q回Servlet预期的无效时_如果q个Servlet是永久无效,q回-1?br />3、isPermanent<br />public boolean isPermanent();<br />如果q个Servlet怹无效Q返回布值trueQ指C必采取一些管理行动以使得q个Servlet可用?br /><br />软g包:javax.servlet.http <br />所包含的接口:HttpServletRequestQHttpServletResponseQHttpSessionQHttpSessionBindingListenerQHttpSessionContext?br />所包含的类QCookieQHttpServletQHttpSessionBindingEventQHttpUtils?br /><br />一、HttpServletRequest接口<br />定义\<br />public interface HttpServletRequest extends ServletRequest;<br />用来处理一个对Servlet的HTTP格式的请求信息?br />Ҏ<br />1、getAuthType<br />public String getAuthType();<br />q回q个h的n份验证模式?br />2、getCookies<br />public Cookie[] getCookies();<br />q回一个数l,该数l包含这个请求中当前的所有cookie。如果这个请求中没有cookieQ返回一个空数组?br />3、getDateHeader<br />public long getDateHeader(String name);<br />q回指定的请求头域的|q个D转换成一个反映自1970-1-1日(GMTQ以来的_到毫U的长整数?br />如果头域不能转换Q抛Z个IllegalArgumentException。如果这个请求头域不存在Q这个方法返?1?br />4、getHeader<br />public String getHeader(String name);<br />q回一个请求头域的倹{(译者注Q与上一个方法不同的是,该方法返回一个字W串Q?br />如果q个h头域不存在,q个Ҏq回-1?br />5、getHeaderNames<br />public Enumeration getHeaderNames();<br />该方法返回一个String对象的列表,该列表反映请求的所有头域名?br />有的引擎可能不允讔R过q种Ҏ讉K头域Q在q种情况下,q个Ҏq回一个空的列表?br />6、getIntHeader<br />public int getIntHeader(String name);<br />q回指定的请求头域的|q个D转换成一个整数?br />如果头域不能转换Q抛Z个IllegalArgumentException。如果这个请求头域不存在Q这个方法返?1?br />7、getMethod<br />public String getMethod();<br />q回q个h使用的HTTPҎQ例如:GET、POST、PUTQ?br />8、getPathInfo<br />public String getPathInfo();<br />q个Ҏq回在这个请求的URL的Servlet路径之后的请求URL的额外的路径信息。如果这个请求URL包括一个查询字W串Q在q回值内不包括q个查询字符丌Ӏ这个\径在q回之前必须l过URL解码。如果在q个h的URL的Servlet路径之后没有路径信息。这个方法返回空倹{?br />9、getPathTranslated<br />public String getPathTranslated();<br />q个Ҏ获得q个h的URL的Servlet路径之后的额外的路径信息Qƈ它转换成一个真实的路径。在q行转换前,q个h的URL必须l过URL解码。如果在q个URL的Servlet路径之后没有附加路径信息。这个方法返回空倹{?br />10、getQueryString<br />public String getQueryString();<br />q回q个hURL所包含的查询字W串。一个查询字串符在一个URL中由一个“?”引出。如果没有查询字W串Q这个方法返回空倹{?br />11、getRemoteUser<br />public String getRemoteUser<br />q回作了h的用户名Q这个信息用来作HTTP用户?br />如果在请求中没有用户名信息,q个Ҏq回I倹{?br />12、getRequestedSessionId<br />public String getRequestedSessionId();<br />q回q个h相应的session id。如果由于某U原因客L提供的session id是无效的Q这个session id与在当前session中的session id不同Q与此同Ӟ徏立一个新的session?br />如果q个h没与一个session兌Q这个方法返回空倹{?br />13、getRequestURI<br />public String getRequestURI();<br />从HTTPh的第一行返回请求的URL中定义被h的资源的部分。如果有一个查询字W串存在Q这个查询字W串不包括在返回值当中。例如,一个请求通过 /catalog/books?id=1q样的URL路径讉KQ这个方法将q回/catalog/books。这个方法的q回值包括了Servlet路径和\径信息?br />如果q个URL路径中的的一部分l过了URL~码Q这个方法的q回值在q回之前必须l过解码?br />14、getServletPath<br />public String getServletPath();<br />q个Ҏq回hURL反映调用Servlet的部分。例如,一个Servlet被映到/catalog/summerq个URL路径Q而一个请求用了/catalog/summer/casualq样的\径。所谓的反映调用Servlet的部分就是指/catalog/summer?br />如果q个Servlet不是通过路径匚w来调用。这个方法将q回一个空倹{?br />15、getSession<br />public HttpSession getSession();<br />public HttpSession getSession(boolean create);<br />q回与这个请求关联的当前的有效的session。如果调用这个方法时没带参数Q那么在没有session与这个请求关联的情况下,会新徏一个session。如果调用这个方法时带入了一个布型的参敎ͼ只有当这个参Cؓ真时Qsession才会被徏立?br />Z保session能够被完全维持。Servlet开发者必d响应被提交之前调用该Ҏ?br />如果带入的参Cؓ假,而且没有session与这个请求关联。这个方法会q回I倹{?br />16、isRequestedSessionIdValid<br />public boolean isRequestedSessionIdValid();<br />q个Ҏ查与此请求关联的session当前是不是有效。如果当前请求中使用的session无效Q它不能通过getSessionҎq回?br />17、isRequestedSessionIdFromCookie<br />public boolean isRequestedSessionIdFromCookie();<br />如果q个h的session id是通过客户端的一个cookie提供的,该方法返回真Q否则返回假?br />18、isRequestedSessionIdFromURL<br />public boolean isRequestedSessionIdFromURL();<br />如果q个h的session id是通过客户端的URL的一部分提供的,该方法返回真Q否则返回假。请注意此方法与isRequestedSessionIdFromUrl在URL的拼写上不同?br />以下Ҏ被取消\<br /><br />19、isRequestedSessionIdFromUrl<br />public boolean isRequestedSessionIdFromUrl();<br />该方法被isRequestedSessionIdFromURL代替?br /><br />二、HttpServletResponse接口<br />定义\<br /><br />public interface HttpServletResponse extends ServletResponse<br />描述一个返回到客户端的HTTP回应。这个接口允许ServletE序员利用HTTP协议规定的头信息?br />成员变量<br />public static final int SC_CONTINUE = 100;<br />public static final int SC_SWITCHING_PROTOCOLS = 101;<br />public static final int SC_OK = 200;<br />public static final int SC_CREATED = 201;<br />public static final int SC_ACCEPTED = 202;<br />public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;<br />public static final int SC_NO_CONTENT = 204;<br />public static final int SC_RESET_CONTENT = 205;<br />public static final int SC_PARTIAL_CONTENT = 206;<br />public static final int SC_MULTIPLE_CHOICES = 300;<br />public static final int SC_MOVED_PERMANENTLY = 301;<br />public static final int SC_MOVED_TEMPORARILY = 302;<br />public static final int SC_SEE_OTHER = 303;<br />public static final int SC_NOT_MODIFIED = 304;<br />public static final int SC_USE_PROXY = 305;<br />public static final int SC_BAD_REQUEST = 400;<br />public static final int SC_UNAUTHORIZED = 401;<br />public static final int SC_PAYMENT_REQUIRED = 402;<br />public static final int SC_FORBIDDEN = 403;<br />public static final int SC_NOT_FOUND = 404;<br />public static final int SC_METHOD_NOT_ALLOWED = 405;<br />public static final int SC_NOT_ACCEPTABLE = 406;<br />public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;<br />public static final int SC_REQUEST_TIMEOUT = 408;<br />public static final int SC_CONFLICT = 409;<br />public static final int SC_GONE = 410;<br />public static final int SC_LENGTH_REQUIRED = 411;<br />public static final int SC_PRECONDITION_FAILED = 412;<br />public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;<br />public static final int SC_REQUEST_URI_TOO_LONG = 414;<br />public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;<br />public static final int SC_INTERNAL_SERVER_ERROR = 500;<br />public static final int SC_NOT_IMPLEMENTED = 501;<br />public static final int SC_BAD_GATEWAY = 502;<br />public static final int SC_SERVICE_UNAVAILABLE = 503;<br />public static final int SC_GATEWAY_TIMEOUT = 504;<br />public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;<br />以上HTTP产状态码是由HTTP/1.1定义的?br />Ҏ<br />1、addCookie<br />public void addCookie(Cookie cookie);<br />在响应中增加一个指定的cookie。可多次调用该方法以定义多个cookie。ؓ了设|适当的头域,该方法应该在响应被提交之前调用?br />2、containsHeader<br />public boolean containsHeader(String name);<br />查是否设|了指定的响应头?br />3、encodeRedirectURL<br />public String encodeRedirectURL(String url);<br />对sendRedirectҎ使用的指定URLq行~码。如果不需要编码,q接返回这个URL。之所以提供这个附加的~码ҎQ是因ؓ?redirect的情况下Q决定是否对URLq行~码的规则和一般情冉|所不同。所l的URL必须是一个绝对URL。相对URL不能被接Ӟ会抛Z?IllegalArgumentException?br />所有提供给sendRedirectҎ的URL都应通过q个Ҏq行Q这h能确保会话跟t能够在所有浏览器中正常运行?br />4、encodeURL<br />public String encodeURL(String url);<br />对包含session ID的URLq行~码。如果不需要编码,q接返回这个URL。Servlet引擎必须提供URL~码ҎQ因为在有些情况下,我们不得不重写URLQ例如,在响应对应的h中包含一个有效的sessionQ但是这个session不能被非URL的(例如cookieQ的手段来维持?br />所有提供给Servlet的URL都应通过q个Ҏq行Q这h能确保会话跟t能够在所有浏览器中正常运行?br />5、sendError<br />public void sendError(int statusCode) throws IOException;<br />public void sendError(int statusCode, String message) throws<br />IOException;<br />用给定的状态码发给客户端一个错误响应。如果提供了一个message参数Q这作为响应体的一部分被发出,否则Q服务器会返回错误代码所对应的标准信息?br />调用q个Ҏ后,响应立即被提交。在调用q个Ҏ后,Servlet不会再有更多的输出?br />6、sendRedirect<br />public void sendRedirect(String location) throws IOException;<br />使用l定的\径,l客L发出一个时{向的响应QSC_MOVED_TEMPORARILYQ。给定的路径必须是绝对URL。相对URL不能被接收Q会抛出一个IllegalArgumentException?br />q个Ҏ必须在响应被提交之前调用。调用这个方法后Q响应立卌提交。在调用q个Ҏ后,Servlet不会再有更多的输出?br />7、setDateHeader<br />public void setDateHeader(String name, long date);<br />用一个给定的名称和日期D|响应头Q这里的日期值应该是反映?970-1-1日(GMTQ以来的_到毫U的长整数。如果响应头已经被设|,新的值将覆盖当前的倹{?br />8、setHeader<br />public void setHeader(String name, String value);<br />用一个给定的名称和域讄响应头。如果响应头已经被设|,新的值将覆盖当前的倹{?br />9、setIntHeader<br />public void setIntHeader(String name, int value);<br />用一个给定的名称和整形D|响应头。如果响应头已经被设|,新的值将覆盖当前的倹{?br />10、setStatus<br />public void setStatus(int statusCode);<br />q个Ҏ讄了响应的状态码Q如果状态码已经被设|,新的值将覆盖当前的倹{?br />以下的几个方法将被取消\<br />11、encodeRedirectUrl<br />public String encodeRedirectUrl(String url);<br />该方法被encodeRedirectURL取代?<br />12、encodeUrl<br />public String encodeUrl(String url);<br />该方法被encodeURL取代?<br />13、setStatus<br />public void setStatus(int statusCode, String message);<br />q个Ҏ讄了响应的状态码Q如果状态码已经被设|,新的值将覆盖当前的倹{如果提供了一个messageQ它也将会被作ؓ响应体的一部分被发送?br /><br />三、HttpSession接口<br />定义\<br />public interface HttpSession<br />q个接口被Servlet引擎用来实现在HTTP客户端和HTTP会话两者的兌。这U关联可能在多外q接和请求中持箋一D늻定的旉。session用来在无状态的HTTP协议下越q多个请求页面来l持状态和识别用户?br />一个session可以通过cookie或重写URL来维持?br />Ҏ<br />1、getCreationTime<br />public long getCreationTime();<br />q回建立session的时_q个旉表示1970-1-1日(GMTQ以来的毫秒数?<br />2、getId<br />public String getId();<br />q回分配l这个session的标识符。一个HTTP session的标识符是一个由服务器来建立和维持的唯一的字W串?br />3、getLastAccessedTime<br />public long getLastAccessedTime();<br />q回客户端最后一ơ发Zq个session有关的请求的旉Q如果这个session是新建立的,q回-1。这个时间表CZؓ?970-1-1日(GMTQ以来的毫秒数?<br />4、getMaxInactiveInterval<br />public int getMaxInactiveInterval();<br />q加一个秒敎ͼq个U数表示客户端在不发求时Qsession被Servlet引擎l持的最长时间。在q个旉之后QServlet引擎可能被Servlet引擎l止。如果这个session不会被终止,q个Ҏq回-1?br />当session无效后再调用q个Ҏ会抛Z个IllegalStateException?br />5、getValue<br />public Object getValue(String name);<br />q回一个以l定的名字绑定到session上的对象。如果不存在q样的绑定,q回I倹{?br />当session无效后再调用q个Ҏ会抛Z个IllegalStateException?br />6、getValueNames<br />public String[] getValueNames();<br />以一个数l返回绑定到session上的所有数据的名称?br />当session无效后再调用q个Ҏ会抛Z个IllegalStateException?br />7、invalidate<br />public void invalidate();<br />q个Ҏ会终止这个session。所有绑定在q个session上的数据都会被清除。ƈ通过HttpSessionBindingListener接口的valueUnboundҎ发出通告?br />8、isNew<br />public boolean isNew();<br />q回一个布g判断q个session是不是新的。如果一个session已经被服务器建立但是q没有收到相应的客户端的hQ这个session被认ؓ是新的。这意味着Q这个客Lq没有加入会话或没有被会话公认。在他发Z一个请求时q不能返回适当的session认证信息?br />当session无效后再调用q个Ҏ会抛Z个IllegalStateException?br />9、putValue<br />public void putValue(String name, Object value);<br />以给定的名字Q绑定给定的对象到session中。已存在的同名的l定会被重置。这时会调用HttpSessionBindingListener接口的valueBoundҎ?br />当session无效后再调用q个Ҏ会抛Z个IllegalStateException?br />10、removeValue<br />public void removeValue(String name);<br />取消l定名字的对象在session上的l定。如果未扑ֈl定名字的绑定的对象Q这个方法什么出不做?q时会调用HttpSessionBindingListener接口的valueUnboundҎ?br />当session无效后再调用q个Ҏ会抛Z个IllegalStateException?br />11、setMaxInactiveInterval<br />public int setMaxInactiveInterval(int interval);<br />讄一个秒敎ͼq个U数表示客户端在不发求时Qsession被Servlet引擎l持的最长时间?br />以下q个Ҏ被取消\<br />12、getSessionContext<br />public HttpSessionContext getSessionContext();<br />q回session在其中得以保持的环境变量。这个方法和其他所有HttpSessionContext的方法一栯取消了?br /><br />四、HttpSessionBindingListener接口<br />定义\<br />public interface HttpSessionBindingListener<br />q个对象被加入到HTTP的session中,执行q个接口会通告有没有什么对象被l定到这个HTTP session中或被从q个HTTP session中取消绑定?br />Ҏ<br />1、valueBound<br />public void valueBound(HttpSessionBindingEvent event);<br />当一个对象被l定到session中,调用此方法。HttpSession.putValueҎ被调用时QServlet引擎应该调用此方法?br />2、valueUnbound<br />public void valueUnbound(HttpSessionBindingEvent event);<br />当一个对象被从session中取消绑定,调用此方法。HttpSession.removeValueҎ被调用时QServlet引擎应该调用此方法?br /><br />五、HttpSessionContext接口<br />定义\<br />此接口将被取消\<br />public interface HttpSessionContext<br />q个对象是与一lHTTP session兌的单一的实体?br />q个接口׃安全的原因被取消Q它出现在目前的版本中仅仅是Z兼容性的原因。这个接口的Ҏ模拟以前的版本的定义返回相应的倹{?br />Ҏ<br />1、getSession<br />public HttpSession getSession(String sessionId);<br />当初用来q回与这个session id相关的session。现在返回空倹{?br />2、getIds<br />public Enumeration getIds();<br />当初用来q回q个环境下所有session id的列表。现在返回空的列表?br /><br />六、Cookiec\<br />定义\<br />public class Cookie implements Cloneable<br />q个cLqC一个cookieQ有关cookie的定义你可以参照Netscape Communications Corporation的说明,也可以参照RFC 2109?br />构造函?br />public Cookie(String name, String value);<br />用一个name-value对定义一个cookie。这个name必须能被HTTP/1.1所接受?br />以字W?开头的name被RFC 2109保留?br />l定的name如果不能被HTTP/1.1所接受Q该Ҏ抛出一个IllegalArgumentException?br />Ҏ<br />1、getComment<br />public String getComment();<br />q回描述q个cookie目的的说明,如果未定义这个说明,q回I倹{?br />2、getDomain<br />public String getDomain();<br />q回q个cookie可以出现的区域,如果未定义区域,q回I倹{?br />3、getMaxAge<br />public int getMaxAge();<br />q个Ҏq回q个cookie指定的最长存zL期。如果未定义q个最长存zL期,该方法返?1?br />4、getName<br />public String getName();<br />该方法返回cookie名?br />5、getPath<br />public String getPath();<br />q回q个cookie有效的所有URL路径的前~Q如果未定义Q返回空倹{?br />6、getSecure<br />public boolean getSecure();<br />如果q个cookie只通过安全通道传输q回真,否则q回假?br />7、getValue<br />public String getValue();<br />该方法返回cookie的倹{?br />8、getVersion<br />public int getVersion();<br />q回cookie的版本。版?由RFC 2109解释。版?由Netscape Communications Corporation的说明解释。新构造的cookie默认使用版本0?br />9、setComment<br />public void setComment(String purpose);<br />如果一个用户将q个cookie提交l另一个用P必须通过q个说明描述q个cookie的目的。版?不支持这个属性?br />10、setDomain<br />public void setDomain(String pattern);<br />q个Ҏ讄cookie的有效域的属性。这个属性指定了cookie可以出现的区域。一个有效域以一个点开_.foo.comQ,q意味着在指定的域名解析pȝ的区域中Q可能是<a ><font color="#000000">http://www.foo.com但不是a.b.foo.com...乇4嫠闚w?/a><br />11、setMaxAge<br />public void setMaxAge(int expiry);<br />q个Ҏ讑֮q个cookie的最长存zL期。在该存zL期之后,cookie会被l目。负数表C个cookie不会生效Q?从客户端删除这个cookie?br />12、setPath<br />public void setPath(String uri);<br />q个Ҏ讄cookie的\径属性。客L只能向以q个l定的\径String开头的路径q回cookie?br />13、setSecure<br />public void setSecure(boolean flag);<br />指出q个cookie只能通过安全通道Q例如HTTPSQ发送。只有当产生q个cookie的服务器使用安全协议发送这个cookie值时才能q样讄?br />14、setValue<br />public void setValue(String newValue);<br />讄q个cookie的|对于二进制数据采用BASE64~码?br />版本0不能使用I格、{}?)?、,、“”??、@、:以及Q?br />15、setVersion<br />public void setVersion(int v);<br />讄cookie的版本号<br /><br />七、HttpServletc\<br />定义\<br />public class HttpServlet extends GenericServlet implements <br />Serializable<br />q是一个抽象类Q用来简化HTTP Servlet写作的过E。它是GenericServletcȝ扩充Q提供了一个处理HTTP协议的框架?br />在这个类中的serviceҎ支持例如GET、POSTq样的标准的HTTPҎ。这一支持q程是通过分配他们到适当的方法(例如doGet、doPostQ来实现的?br />Ҏ<br />1、doDelete<br />protected void doDelete(HttpServletRequest request,<br />HttpServletResponse response) throws ServletException,<br />IOException;<br />被这个类的serviceҎ调用Q用来处理一个HTTP DELETE操作。这个操作允许客Lh从服务器上删除URL。这一操作可能有负面媄响,Ҏ用户p赯仅R?br />q一Ҏ的默认执行结果是q回一个HTTP BAD_REQUEST错误。当你要处理DELETEhӞ你必重载这一Ҏ?br />2、doGet<br />protected void doGet(HttpServletRequest request, <br />HttpServletResponse response) throws ServletException,<br />IOException;<br />被这个类的serviceҎ调用Q用来处理一个HTTP GET操作。这个操作允许客L单地从一个HTTP服务器“获得”资源。对q个Ҏ的重载将自动地支持HEADҎ?br />GET操作应该是安全而且没有负面影响的。这个操作也应该可以安全地重复?br />q一Ҏ的默认执行结果是q回一个HTTP BAD_REQUEST错误?br />3、doHead<br />protected void doHead(HttpServletRequest request,<br />HttpServletResponse response) throws ServletException,<br />IOException;<br />被这个类的serviceҎ调用Q用来处理一个HTTP HEAD操作。默认的情况是,q个操作会按照一个无条g的GETҎ来执行,该操作不向客Lq回M数据Q而仅仅是q回包含内容长度的头信息?br />与GET操作一Pq个操作应该是安全而且没有负面影响的。这个操作也应该可以安全地重复?br />q个Ҏ的默认执行结果是自动处理HTTP HEAD操作Q这个方法不需要被一个子cL行?<br />4、doOptions<br />protected void doOptions(HttpServletRequest request,<br />HttpServletResponse response) throws ServletException,<br />IOException;<br />被这个类的serviceҎ调用Q用来处理一个HTTP OPTION操作。这个操作自动地军_支持哪一UHTTPҎ。例如,一个Servlet写了一个HttpServlet的子cdƈ重蝲了doGetҎQdoOption会返回下面的_<br />Allow: GET,HEAD,TRACE,OPTIONS<br />你一般不需要重载这个方法?br />5、doPost<br />protected void doPost(HttpServletRequest request,<br />HttpServletResponse response) throws ServletException,<br />IOException;<br />被这个类的serviceҎ调用Q用来处理一个HTTP POST操作。这个操作包含请求体的数据,Servlet应该按照他行事?br />q个操作可能有负面媄响。例如更新存储的数据或在U购物?br />q一Ҏ的默认执行结果是q回一个HTTP BAD_REQUEST错误。当你要处理POST操作Ӟ你必dHttpServlet的子cM重蝲q一Ҏ?br />6、doPut<br />protected void doPut(HttpServletRequest request, <br />HttpServletResponse response) throws ServletException,<br />IOException;<br />被这个类的serviceҎ调用Q用来处理一个HTTP PUT操作。这个操作类g通过FTP发送文件?br />q个操作可能有负面媄响。例如更新存储的数据或在U购物?br />q一Ҏ的默认执行结果是q回一个HTTP BAD_REQUEST错误。当你要处理PUT操作Ӟ你必dHttpServlet的子cM重蝲q一Ҏ?br />7、doTrace<br />protected void doTrace(HttpServletRequest request,<br />HttpServletResponse response) throws ServletException,<br />IOException;<br />被这个类的serviceҎ调用Q用来处理一个HTTP TRACE操作。这个操作的默认执行l果是生一个响应,q个响应包含一个反映traceh中发送的所有头域的信息?br />当你开发ServletӞ在多数情况下你需要重载这个方法?br />8、getLastModified<br />protected long getLastModified(HttpServletRequest request);<br />q回q个h实体的最后修Ҏ间。ؓ了支持GET操作Q你必须重蝲q一ҎQ以_地反映最后修改的旉。这有助于览器和代理服务器减装载服务器和网l资源,从而更加有效地工作。返回的数值是?970-1-1日(GMTQ以来的毫秒数?<br />默认的执行结果是q回一个负敎ͼq标志着最后修Ҏ间未知,它也不能被一个有条g的GET操作使用?br />9、service<br />protected void service(HttpServletRequest request,<br />HttpServletResponse response) throws ServletException,<br />IOException;<br />public void service(ServletRequest request, ServletResponse response)<br />throws ServletException, IOException;<br />q是一个Servlet的HTTP-specificҎQ它分配h到这个类的支持这个请求的其他Ҏ?br />当你开发ServletӞ在多数情况下你不必重载这个方法?br /><br />八、HttpSessionBindingEventc\<br />定义\<br />public class HttpSessionBindingEvent extends EventObject<br />q个事g是在监听到HttpSession发生l定和取消绑定的情况时连通HttpSessionBindingListener的。这可能是一个session被终止或被认定无效的l果?br />事g源是HttpSession.putValue或HttpSession.removeValue?br />构造函?br />public HttpSessionBindingEvent(HttpSession session, String name);<br />通过引vq个事g的Session和发生绑定或取消l定的对象名构造一个新的HttpSessionBindingEvent?br />Ҏ<br />1、getName<br />public String getName();<br />q回发生l定和取消绑定的对象的名字?br />2、getSession<br />public HttpSession getSession();<br />q回发生l定和取消绑定的session的名字?br /><br />九、HttpUtilsc\<br />定义\<br />public class HttpUtils<br />攉HTTP Servlet使用的静态的有效的方法?br />Ҏ<br />1、getRequestURL<br />public static StringBuffer getRequestURL(HttpServletRequest<br />request);<br />在服务器上重建客L用来建立h的URL。这个方法反映了不同的协议(例如http和httpsQ和端口Q但不包含查询字W串?br />q个Ҏq回一个StringBuffer而不是一个StringQ这样URL可以被Servlet开发者有效地修改?br />2、parsePostData<br />public static Hashtable parsePostData(int len, <br />ServletInputstream in);<br />解析一个包含MIMEcdapplication/x-www-form-urlencoded的数据的,q创Z个具有关键?数据对的 hash table。这里的关键值是字符Ԍ数据是该字符串所对应的值的列表。一个关键值可以在POST的数据中出现一ơ或多次。这个关键值每出现一ơ,它的相应的值就被加入到hash table中的字符串所对应的值的列表中?br />从POST数据d的数据将l过URL解码Q?被转换为空g十六q制传送的数据Q例?xxQ将被{换成字符?br />当POST数据无效Ӟ该方法抛Z个IllegalArgumentException?br />3、parseQueryString<br />public static Hashtable parseQueryString(String s);<br />解析一个查询字W串Qƈ创徏一个具有关键?数据对的hash table。这里的数据是该字符串所对应的值的列表。一个关键值可以出Cơ或多次。这个关键值每出现一ơ,它的相应的值就被加入到hash table中的字符串所对应的值的列表中?br />从查询字W串d的数据将l过URL解码Q?被转换为空g十六q制传送的数据Q例?xxQ将被{换成字符?br />当查询字W串无效Ӟ该方法抛Z个IllegalArgumentException?br /><br />术语?br />bytecode <br />字节码:由Java~译器和Java解释E序生成的机器代码?br />cookie <br />由Web服务器徏立的数据Q该数据存储在用L计算ZQ提供了一个Web站点跟踪用户的参数ƈ存储在用戯q盘上的方法?br />HTTP <br />文本传输协议。一个请求响应协议用来连接WWW服务器向客户端浏览器传输HTML面?br />输入对?br />一个对象,由ServletInputStreamcd义,被Servlet用来从客Ldh?br />映射<br />由Servlet实例和Servletq回数据的URLl成的一对,例如QHelloServlet?hello/index.html?br />输出对?br />一个对象,由ServletOutputStream classcd义,被Servlet用来向客Lq回数据?br />request dispatcher object <br />由RequestDispatcher接口定义的一个对象,用来从客L接收hQƈ其发送到Web服务器上可用的其他资源(例如Servlet、CGI、HTML文g或JSP文gQ?br />sandboxed servlet <br />在一个安全性约束下q行的Servlet?br />servlet <br />一个小的,hq_无关性的Q没有图形用L面的JavaE序。它可以在许多方面扩充Web服务的功能?br />servlet configuration object <br />ServletConfig接口定义的一个对象,用来配置一个Servlet?br />servlet context object <br />ServletContext接口定义的一个对象。给予Servlet有关Servlet引擎的信息?br />servlet引擎<br />由Web服务器提供商制作的一个环境,可以允许Servlet在具体的Web服务器上q行?br />servleth对象 <br />由ServletRequest接口定义的一个对象,允许Servlet获得用关客户端请求的数据?br />servlet response object <br />由ServletResponse接口定义的一个对象,允许Servlet作出响应?br />servlet runner <br />Java Servlet Developer’s Kit (JSDK)中的sun.servlet.http.HttpServerq程Q它使得Servlet得以q行?br />会话跟踪 <br />在一个Web应用E序中,识别一个从同一个客L发出的连l的唯一的请求的能力?br />SSL <br />加密套接字协议层。一个安全协议,用来在Iternet上的客户端浏览器和服务器交换密钥和加密数据?br />URI <br />l一资源标识。定义一个Internet地址Q它是一个URL的超集?br />URL <br />l一资源路径。这个地址定义了到达一个WWW上的文g的\U,通常由协议前~、域名、目录名和文件名l成?/font></a></div> <img src ="http://www.tkk7.com/ltc603/aggbug/67157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ltc603/" target="_blank">阿成</a> 2006-09-01 17:06 <a href="http://www.tkk7.com/ltc603/archive/2006/09/01/67157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>servlet 相关的Listener应用 作者: colin_ch Q抄自javaeyeQ?/title><link>http://www.tkk7.com/ltc603/archive/2006/09/01/67152.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Fri, 01 Sep 2006 08:55:00 GMT</pubDate><guid>http://www.tkk7.com/ltc603/archive/2006/09/01/67152.html</guid><wfw:comment>http://www.tkk7.com/ltc603/comments/67152.html</wfw:comment><comments>http://www.tkk7.com/ltc603/archive/2006/09/01/67152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ltc603/comments/commentRss/67152.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ltc603/services/trackbacks/67152.html</trackback:ping><description><![CDATA[ <div> <span>从作用域范围来说,Servlet的作用域有ServletContext,HttpSession,ServletRequest. <br /><br />Context范围: <br /><br />ServletContextListener: <br />对一个应用进行全局监听.随应用启动而启?随应用消p消׃要有两个Ҏ: <br />contextDestroyed(ServletContextEvent event) <br />在应用关闭的时候调?<br />contextInitialized(ServletContextEvent event) <br />在应用启动的时候调?<br /><br />q个监听器主要用于一些随着应用启动而要完成的工?也就是很多h说的我想在容?<br />启动的时候干.......... <br />一般来说对"全局变量"初始??<br />public void contextInitialized(ServletContextEvent event){ <br />ServletContex sc = event.getServletContext(); <br />sc.setAttribute(name,value); <br />} <br />以后你就可以在Q何servlet中getServletContext().getAttribute(name); <br />我最喜欢用它来做守护性工?是在contextInitialized(ServletContextEvent event) <br />Ҏ中实C个Timer,然后p应用在每ơ启动的时候让q个Timer工作: <br />public void contextInitialized(ServletContextEvent event){ <br />timer = new Timer(); <br />timer.schedule(new TimerTask(){ <br />public void run(){ <br />//do any things <br />} <br />},0,旉间隔); <br />} <br /><br />有h说Timer只能规定从现在开始的多长旉?每隔多久做一ơ事或在什么时间做 <br />一ơ事,那我惛_每月1h每天12点做一工作如何做? <br />你只要设一个间?然后每次判断一下当时是不是那个旉D就行了?比如每月一号做,那你 <br />旉间隔设ؓ??4时一个@?然后在runҎ中判断当时日期new Date().getDate()==1 <br />p了啊.如果是每天的12?那你旉间隔设ؓ时,然后在run中判断new Date().getHour() <br />==12,再做某事p? <br /><br />ServletContextAttributeListener: <br /><br />q个监听器主要监听ServletContex对象在setAttribute()和removeAttribute()的事?注意 <br />也就是一?全局变量"在被Add(W一ơset),replace(对已有的变量重新赋?和remove的时? <br />分别调用下面三个Ҏ: <br />public void attributeAdded(ServletContextAttributeEvent scab)q个Ҏ不仅可以知道 <br />哪些全局变量被加q来,而且可获取容器在启动时自动设|了哪些context变量: <br /><br />public void attributeAdded(ServletContextAttributeEvent scab){ <br />System.out.println(scab.getName()); <br />} <br />public void attributeRemoved(ServletContextAttributeEvent scab) <br /><br />public void attributeReplaced(ServletContextAttributeEvent scab) <br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />Session范围: <br />HttpSessionListener: <br />q个监听器主要监听一个Session对象被生成和销毁时发生的事?对应有两个方? <br />public void sessionCreated(HttpSessionEvent se) <br /><br />public void sessionDestroyed(HttpSessionEvent se) <br /><br />一般来?一个session对象被create?可以说明有一个新客端q入.可以用来_略l计在线?<br />?注意q不是精的,因ؓq个客户端可能立卛_关闭?但sessionDestroyedҎ却会按一?<br />的策略很久以后才会发? <br /><br />HttpSessionAttributeListener: <br />和ServletContextAttributeListener一?它监听一个session对象的Attribut被Add(一个特?<br />名称的Attribute每一ơ被讄),replace(已有名称的Attribute的D重设)和remove时的事g. <br />对就的有三个Ҏ. <br />public void attributeAdded(HttpSessionBindingEvent se) <br /><br />public void attributeRemoved(HttpSessionBindingEvent se) <br /><br />public void attributeReplaced(HttpSessionBindingEvent se) <br /><br />上面的几个监听器的方?都是在监听应用逻辑中servlet逻辑中发生了什么事,一般的来说. <br />我们只要完成逻辑功能,比如session.setAttribute("aaa","111");我只要把一个名为aaa的变?<br />攑֜session中以便以后我能获取它,我ƈ不关心当session.setAttribute("aaa","111");发生?<br />我还要干什?(当然有些时候要利用?,但对于下面这个监听器,你应该好好发解一? <br /><br />HttpSessionBindingListener: <br />上面的监听器都是作ؓ一个独立的Listener在容器中控制事g?而HttpSessionBindingListener <br />对在一对象中监听该对象的状?实现了该接口的对象如果被作ؓvalue被addC个session中或?<br />session中remove,它就会知道自己已l作Z个session对象或已l从session删除,q对于一些非 <br />UJAVA对象,生命周期长于session的对?以及其它需要释放资源或改变状态的对象非常重要. <br />比如: <br />session.setAttribute("abcd","1111"); <br />以后session.removeAttribute("abcd");因ؓabcd是一个字W中,你从session中remove?它就?<br />自动被垃圑֛收器回收,而如果是一个connection:(只是举例,你千万不要加connection往session <br />中加? <br />session.setAttribute("abcd",conn); <br />以后session.removeAttribute("abcd");q时q个conn被从session中remove?你已l无法获取它 <br />的句?所以你Ҏ没法关闭?而在没有remove之前你根本不知道什么时候要被remove,你又无法 <br />close(),那么q个connection对象死?另外q有一些对象可以在被加入一个session时要锁定 <br />q要被remove时要解锁,应因你在E序中无法判断什么时候被remove(),addq好操作,我可以先加锁 <br />再add,但remove后你就找不到它的句柄了,Ҏ没法解锁,所以这些操作只能在对象自n中实? <br />也就是在对象被add时或remove旉知对象自己回调相应的方? <br /><br />MyConn extends Connection implements HttpSessionBindingListener{ <br />public void valueBound(HttpSessionBindingEvent se){ <br />this.initXXX(); <br />} <br />public void valueUnbound(HttpSessionBindingEvent se){ <br /><br />this.close(); <br />} <br />} <br /><br />session.setAttribute("aaa",new MyConn()); <br />q时如果调用session.removeAttribute("aaa"),则触发valueUnboundҎ,׃自动关闭自己. <br />而其它的需要改变状态的对象了是一?</span> </div> <img src ="http://www.tkk7.com/ltc603/aggbug/67152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ltc603/" target="_blank">阿成</a> 2006-09-01 16:55 <a href="http://www.tkk7.com/ltc603/archive/2006/09/01/67152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP学习l验ȝ【{载?/title><link>http://www.tkk7.com/ltc603/archive/2006/09/01/67151.html</link><dc:creator>阿成</dc:creator><author>阿成</author><pubDate>Fri, 01 Sep 2006 08:53:00 GMT</pubDate><guid>http://www.tkk7.com/ltc603/archive/2006/09/01/67151.html</guid><wfw:comment>http://www.tkk7.com/ltc603/comments/67151.html</wfw:comment><comments>http://www.tkk7.com/ltc603/archive/2006/09/01/67151.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ltc603/comments/commentRss/67151.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ltc603/services/trackbacks/67151.html</trackback:ping><description><![CDATA[ <div class="mgaw240" id="msgcns!6ACF9041B1D020E2!113">一、JSP工作原理 <br /><br />在一个JSP文gW一ơ被hӞJSP引擎把该JSP文g转换成ؓ一个servlet。而这个引擎本w也是一个servletQ在JSWDK或WEBLOGIC中,它就是JspServlet。 JSP引擎先把该JSP文g转换成一个Java源文Ӟ在{换时如果发现jsp文g有Q何语法错误,转换q程中断,q向服务端和客户端输出出错信息;如果转换成功Q JSP引擎用javac把该Java源文件编译成相应的class文g。然后创Z个该SERVLET的实例,该SERVLET的jspInit()Ҏ被执行,jspInit()Ҏ在servlet的生命周期中只被执行一ơ。然后jspService()Ҏ被调用来处理客户端的h。对每一个请求,JSP引擎创徏一个新的线E来处理该请求。如果有多个客户端同时请求该JSP文gQ则JSP引擎会创建多个线E。每个客Lh对应一个线E。以多线E方式执行可大大降低对系l的资源需?提高pȝ的ƈ发量及响应时?但应该注意多U程的编E限Ӟ׃该servlet始终M内存Q所以响应是非常快的。 如?jsp文g被修改了Q服务器根据设|决定是否对该文仉新编译,如果需要重新编译,则将~译l果取代内存中的servletQƈl箋上述处理q程。 虽然JSP效率很高Q但在第一ơ调用时׃需要{换和~译而有一些轻微的延迟。 此外,如果在Q何时候如果由于系l资源不的原因QJSP引擎以某种不确定的方式servlet从内存中Ud。当q种情况发生时jspDestroy()Ҏ首先被调? 然后servlet实例便被标记加入"垃圾攉"处理。 jspInit()及jspDestory()格式如下Q可在jspInit()中进行一些初始化工作,如徏立与数据库的q接Q或建立|络q接Q从配置文g中取一些参数等Q在jspDestory()中释攄应的资源。 ?br /><br /><%! <br />public void jspInit() <br />{ <br />       System.out.println("jspinit");  <br />} <br />  <br />%> <br />  <br /><%! <br />public void jspDestory() <br />{ <br />       System.out.println("jspDestory");  <br />} <br />%> <br /><br />二、服务端的输出缓冲区 <br /><br />~省情况?服务端要输出到客L的内?不直接写到客L,而是先写C个输出缓冲区?只有在下面三中情况下Q才会把该缓冲区的内容输出到客户端上Q?br /><br /><br />该JSP|页已完成信息的输出  <br />输出~冲区已满 ?br />JSP中调用了out.flush()或response.flushbuffer()  <br />输出~冲区的大小可以?或response.setBufferSize()讄,如下Q ?br />讄输出~冲区的大小?KB。或response.setBufferSize(1);  <br />讄输出~冲区的大小?Q即不缓册Ӏ或response.setBufferSize(0);  <br />用response.getBufferSize()或out.getBufferSize()可取的输出缓冲区的大?单位为字? 用response.isCommitted()可检查看服务端是否已数据输出到客户? 如果q回值是TRUE则已数据输出到客户?是FALSE则还没有.  <br /><br />三、服务端输出重定向?br /><br />有以?U方法可以做到输出重定向:  <br /><br />RESPONSE.SETREDERECT("URL") 该方法通过修改HTTP协议的HEADER部分,Ҏ览器下达重定向指令的,使浏览器昄重定向网늚内容. response.sendRedirect("http://localhost:7001/index.html");  <br />下面的方法也能改变HTTP HEADER属性,它的原理和? 是一L.  <br /><%  <br />response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);  <br />String newLocn="/index.html";  <br />response.setHeader("Location",newLocn);  <br />% >  <br />采用<JSP:FORWORD> 该方法是利用服务器端先将数据输出到缓冲区的机?在把~冲区的内容发送到客户端之?原来的不发?改ؓ发送该面的内?如果?lt;JSP:FORWORD>之前有很多输?前面的输出已使缓冲区?自动输出到客户?那么该语句将不v作用,q一点应该特别注? 如下面的例子?1)会输出index.html的内容,2 不会输出index.html的内容,而是输出out.println("@@@@@@@@@@@@@@@@@"); 中的内容,q且在服务端会抛?java.lang.IllegalStateException: Response already committed 异常Q但客户端没有Q何错误输出。 ?br />(1) <br /><%@page buffer="1kb"%> <br />  <br /><% <br />long i=0; <br />  <br />for(i=0;i<10;i++) <br />{ <br />       out.println("@@@@@@@@@@@@@@@@@"); <br />} <br />%> <br />  <br /><jsp:forward page="./index.html" /> <br />  <br />  <br />(2) <br /><%@page buffer="1kb"%> <br />  <br /><% <br />long i=0; <br />  <br />for(i=0;i<600;i++) <br />{                  <br />       out.println("@@@@@@@@@@@@@@@@@"); <br />} <br />%> <br />  <br /><br />说明Q?br />1. Ҏ(1),(2)可以使用变量表示重定向的地址;Ҏ(3)不能使用变量表示重定向的地址。?br />String add="./index.html";  <br /><jsp:forward page= add />  <br />无法重定向到index.html中去  <br /><br />String add=http://localhost:7001/index.html  <br />response.sendRedirect(add);  <br />可以重定向到http://localhost:7001/index.html中去。 ?br /><br />2. 采用Ҏ(1),(2)request中的变量(通过request.setAttribute()保存到request中的?不能在新的页面中采用,采用Ҏ(3)? lg,我们应该采用(1),(2)重定向比较好.  <br /><br /><br />四、JSP中正应用类:  <br /><br />应该把类当成JAVA BEAN来用Q不要在<% %> 中直接? 如下的代?1)l过JSP引擎转化后会变ؓ代码(2): <br />从中可看出如果把一个类在JSP当成JAVA BEAN 使用,JSP会根据它的作用范围把它保存到相应的内部对象中. <br />如作用范围ؓrequest,则把它保存到request对象?q且只在W一ơ调?对象的gؓnull)它时q行实例? 而如果在<% %>中直接创cȝ一个对?则每ơ调用JSP?都要重新创徏该对?会媄响性能.  <br /><br />代码(1) <br /><jsp:useBean id="test" scope="request" class="demo.com.testdemo"> <br /></jsp:useBean> <br />  <br /><% <br />test.print("this is use java bean"); <br />  <br />testdemo td= new testdemo(); <br />td.print("this is use new"); <br />%> <br />  <br /><br /><br />代码(2) <br />demo.com.testdemo test = (demo.com.testdemo)request.getAttribute("test");  <br />if (test == null)  <br />{  <br />       try  <br />       {  <br />                 test = (demo.com.testdemo) java.beans.Beans.instantiate(getClass().getClassLoader(),"demo.com.testdemo");  <br />       }  <br />       catch (Exception _beanException)  <br />       { <br />               throw new weblogic.utils.NestedRuntimeException("cannot instantiate 'demo.com.testdemo'",_beanException);  <br />       }  <br />       request.setAttribute("test", test);  <br />       out.print("\r\n"); <br />}  <br />out.print("\r\n\r\n\r\n"); <br />test.print("this is use java bean");  <br />  <br />testdemo td= new testdemo(); <br />td.print("this is use new"); <br /><br />  <br /><br /><br /><br />五、JSP的调试 ?br /><br />JSP的调试比较麻?特别是当bean是在一个session中存在时Q更加困难。得从好几个面开始往里面走才行。通常是用out.println()或System.out.print()来打一大堆的信息来查问题。如果是用jbuilder做开?它能直接调试JSP.不过更重要的是知道错误生的原因及解x法。下面对一些JSP~程常见错误q行分析。 ?br /><br />(1).java.lang.NullPointerException异常 <br />一般是对一个ؓNULL值的变量q行操作引v?如下面的操作׃抛出 <br />java.lang.NullPointerException <br />String a = null;  <br />a.substring(0,1);  <br />  <br />为避免这U异常最好在对变量操作之前检查看它是否ؓNULL?? <br /><% String ss=Session.getAttribute("NAME")  <br />if isnull(ss)  <br />{  <br /><br />}  <br />else  <br />{  <br /><br />}  <br />%>  <br /><br />(2).JSP是用JAVA写的Q所以它是大写敏感的,用过其他~程语言的h最Ҏ犯这个错误。另外在览器的地址栏中输入的访问JSP的地址也是区分大小写的.如http://localhost:7001/demo/t.jsp与http://localhost:7001/Demo/t.jsp是不一L <br /><br />(3).在jsp中判断字W串要用compareToҎQ不要用==Q因为在java中String变量不是一个简单的变量而是一个类实例Q不同的Ҏ会得刊W不同的l果Q如下所C:  <br /><br />   <br /><br />  String str1="ABCD";  <br />  String str2="ABCD"; (或 String str2="AB"+"CD";   <br />  if (str1==str2)  <br />   out.print("yes");  <br />  else  <br />   out.print("no");  <br />  l果?yes"。 ?br />   <br /><br />  String str1,str2,str3;  <br />  str1="ABCD";  <br />  str2="AB";  <br />  str3=str2+"CD";  <br />  if (str1==str3)  <br />   out.print("yes");  <br />  else  <br />   out.print("no");  <br />  l果?no"。 ?br /><br /><br />String str1=new String("ABCD");  <br />  String str2=new String("ABCD");  <br />  if (str1==str2)  <br />   out.print("yes");  <br />  else  <br />   out.print("no");  <br />  l果?no"。 ?br /><br /><br />String str1=new String("ABCD");  <br />  String str2=new String("ABCD");  <br />  if (str1.compareTo(str2)==0)  <br />   out.print("yes");  <br />  else  <br />   out.print("no");  <br />  l果?yes"。 ?br /><br />(4)防止JSP或SERVLET中的输出被浏览器保存在缓冲区? <br />览器在默认情况下会把浏览过的网保存在~冲Z,在调试时,一般不希望q样.把下面的脚本加入E序?可防止JSP或SERVLET中的输出被浏览器保存在缓冲区中 ?br /><%  <br />response.setHeader("Cache-Control","no-store"); //HTTP 1.1  <br />response.setHeader("Pragma","no-cache"); //HTTP 1.0  <br />response.setDateHeader ("Expires", 0); //prevents caching at the proxy server  <br />%>  <br />在IE中也可通过讄实现Q把/工具/INTERNET选项/常规/讄/的检察所存页面的较新版本,设ؓ每次讉K该页旉? <br /><br /><br />六、COOKIE <br /><br />HTTP COOKIE实质是服务端与在客户端之间传送的普通HTTP?可保存也可不保存在客L盘?如果保存,每一个文件大不过4K的文本文?多个COOKIE可保存到同一个文件中. 如果从编E角度来?在JSP中COOKIE是JAVA提供的一个类.常用的方法如下所表示Q因为客L可能不接受COOKIEQ所以徏议不用它Q改用SESSION{其他方式。 ?br /><br /><br />public class cookie  <br />{  <br />public String getDomain() //q回该COOKIE的有效域  <br />public int getMaxAge() //q回该COOKIE的有效期,单位为秒  <br />public String getName() //q回该COOKIE的名UW?br />public String getPath() //q回该COOKIE的有效\径 ?br />public boolean getSecure() //q回该COOKIE的安全设| ?br />public String getValue() //q回该COOKIE的值 ?br />public void setDomain(java.lang.String pattern) //讄该COOKIE的有效域  <br />public void setMaxAge(int expiry) //讄该COOKIE的有效期,单位为秒  <br />public void setPath(java.lang.String uri) //讄该COOKIE的有效\径 ?br />public void setSecure(boolean flag) //讄该COOKIE的安全设| ?br />public void setValue(java.lang.String newValue) //讄该COOKIE的值 ?br />}  <br />一个COOKIE包含以下五部?  <br /><br />NAME/VALUE?讄该COOKIE的名字及它保存的值 ?br />COOKIE通常和服务器相关,如果域设ؓJAVA.SUN.COM,那么该COOKIE和q个域相?只对该网址起作?当浏览该|址?览器将把该COOKIE的内容发送给服务?COOKIE是作为HTTP HEADER的一部分被发送的Q如果没有设|域,那么COOKIE只和创COOKIE的服务器相关.  <br />路径用于指定服务器上可以使用该COOKIE的文件所在的路径,它只对该|址下的该\径下的应用v作用."/"表示服务器上所有目录都可以使用该COOKIE.  <br />COOKIE都有一个有效期,有效期默认gؓ-1,q表C没有保存该COOKIE,当该览器退出时,该COOKIE立即失效.  <br />安全选项true/false,如果讄为true,那么在服务端与在客户端之间传送该COOKIE的内Ҏ,采用HTTPS协议.  <br />如何查一个客L是否支持COOKIE的方?  <br />用下面的Ҏ写一个COOKIE到客L,q确认成功 ?br />try  <br />{  <br />Cookie c = new Cookie("mycookie","COOKIE TEST");  <br />response.addCookie(c);  <br />}  <br />catch(Exception e)  <br />{  <br />      System.out.println(e);  <br />}  <br /><br /><br />然后在一个新的JSP文g?用下面的Ҏ取客L的COOKIE到cookies? 如果cookies.length ==0,说明该客L的浏览器不支持COOKIE  <br />try  <br />{  <br />Cookie[] cookies = request.getCookies();  <br />if(cookies.length ==0)  <br />{  <br />      System.out.println("not support cookie");  <br />}  <br />}  <br />catch(Exception e)  <br />{  <br />      System.out.println(e);  <br />}  <br /><br /><br /><br />七、JSP和SERVLET的区? <br /><br />SUN首先发展出SERVLETQ其功能比较强劲Q体p设计也很先q,只是Q它输出HTML语句q是采用了老的CGI方式Q是一句一句输出,所以,~写和修改HTML非常不方ѝ 后来SUN推出了类gASP的JSPQ把JAVA代码嵌套到HTML语句中,q样Q就大大化和方便了网늚设计和修攏VASPQPHPQJSP都是嵌套型的SCRIPT语言。 一个分布式pȝ应分Z层:表示?业务逻辑?数据存取?在J2EE体系l构?SERVLET用来写业务逻辑层是很强大的Q但是对于写表示层就很不方便。JSP则主要是Z方便写表C层而设计的。ENTITY BEAN实现数据存取层,SESSION BEAN实现业务逻辑层。如果是单的应用pȝ,可采用JSP+BEANS的结构进行设?JSP中应该仅仅存放与表示层有关的东西Q也是_只放输出HTML|页的部份。而所有的数据计算Q数据分析,数据库联l处理,l统是属于业务逻辑层,应该攑֜JAVA BEANS中。通过JSP调用JAVA BEANSQ实C层的整合。 实际上Q微软的DNA技术,单说Q就是ASP+COM/DCOM技术。与JSP+BEANS完全cMQ所有的表示层由ASP完成Q所有的业务逻辑由COM/DCOM完成。 ؓ什么要采用q些lg技术呢Q因为单U的ASP/JSP语言是非怽效率执行的,如果出现大量用户点击Q纯SCRIPT语言很快到达了他的功能上限Q而组件技术就能大q度提高功能上限Q加快执行速度。另外一斚wQ纯SCRIPT语言表C层和业务逻辑层؜在一P造成修改不方便,q且代码不能重复利用Q采用组件技术就只改lg可以了。 对于复杂的应用Q应该采用ENTITY BEAN实现数据存取层,SESSION BEAN实现业务逻辑层,用JSP来调用SESSION BEANQ由SESSION BEAN调用ENTITY BEAN。即采用JSP+EJB来构Z个复杂的分布式系l。它比JSP+BEANh更高的吞吐量Q可靠性,安全性。综上所qͼ对简单应用,可采用JSP+BAENQ对复杂的应用系l,应采用JSP+EJBQSERVLET变的无轻重。用JSP完全可替代它? <div></div></div> <img src ="http://www.tkk7.com/ltc603/aggbug/67151.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ltc603/" target="_blank">阿成</a> 2006-09-01 16:53 <a href="http://www.tkk7.com/ltc603/archive/2006/09/01/67151.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://139699.com" target="_blank">ɫۺ</a>| <a href="http://saohu533.com" target="_blank">ձһ</a>| <a href="http://taojin5.com" target="_blank">Ѹ</a>| <a href="http://boyipark.com" target="_blank">ѿaƬ߹ۿ</a>| <a href="http://0453wcbyy.com" target="_blank">ò߹ۿƵ</a>| <a href="http://wkk3.com" target="_blank">ԻƵs</a>| <a href="http://gtja1668.com" target="_blank">Ļȫ</a>| <a href="http://zaidongmaixi.com" target="_blank">ϺƷAV߲</a>| <a href="http://yisousou.com" target="_blank">91ʪ</a>| <a href="http://27simnjingmiguan.com" target="_blank">þþþþëƬѲ</a>| <a href="http://mychjp.com" target="_blank">߹ۿwwwƵ</a>| <a href="http://ydxcsh.com" target="_blank">˳Ƶ߹ۿվ</a>| <a href="http://7778tv.com" target="_blank">8xվ߹ۿ</a>| <a href="http://bjhuicui.com" target="_blank">ѹۿɫƵվbd </a>| <a href="http://xxx2222.com" target="_blank">Ʒר߹ۿ</a>| <a href="http://7755ga.com" target="_blank">þþþseɫ͵͵޾Ʒav</a>| <a href="http://tttui.com" target="_blank">޾Ʒ㶮</a>| <a href="http://tj-zhongfa.com" target="_blank">ձVAҹӰԺ</a>| <a href="http://mangaou.com" target="_blank">޹Ʒþ</a>| <a href="http://5s6b.com" target="_blank">һaɫëƬ</a>| <a href="http://szqsnt.com" target="_blank">ĻѿӰ</a>| <a href="http://csl-chinga.com" target="_blank">þþþѿaԿ</a>| <a href="http://www2626cf.com" target="_blank">è˳վ߹ۿ</a>| <a href="http://1408600.com" target="_blank">߹ۿձaƵ</a>| <a href="http://hbjinmaitang.com" target="_blank">ѿƬѲ</a>| <a href="http://5d8f.com" target="_blank">޹Ʒþþž</a>| <a href="http://sdzntg.com" target="_blank">޹ƷVA߹ۿ鶹</a>| <a href="http://33eaa.com" target="_blank">ŮƵ</a>| <a href="http://c2277.com" target="_blank">޾Ʒר</a>| <a href="http://qianmiu.com" target="_blank">aëƬѸƵ</a>| <a href="http://kelingdq.com" target="_blank">ƷڵƵ </a>| <a href="http://dcqzr.com" target="_blank">Ʒպ99޵߷</a>| <a href="http://wwwpaogou123.com" target="_blank">Ļ޾Ʒ</a>| <a href="http://5g5t.com" target="_blank">ѹվ߹ۿͼ</a>| <a href="http://www55nana.com" target="_blank">3pˬִƵ</a>| <a href="http://cn-taoqigui.com" target="_blank">69avѹۿ</a>| <a href="http://zgnyxx.com" target="_blank">Ƭ91Ʒѹۿͬ</a>| <a href="http://popodino.com" target="_blank">ۺɫһ</a>| <a href="http://3589006.com" target="_blank">޹һ</a>| <a href="http://lawelites.com" target="_blank">˳ӰԺ</a>| <a href="http://www-8908.com" target="_blank">Ƶѹۿ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>