ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩一区不卡,色视频在线观看福利,亚洲精品欧美http://www.aygfsteel.com/esprit/AZA~AZA~FIGHTING......zh-cnMon, 28 Jul 2025 20:29:07 GMTMon, 28 Jul 2025 20:29:07 GMT60[转]IE与Firefox对CSS解析的区åˆ?/title><link>http://www.aygfsteel.com/esprit/archive/2006/09/21/71099.html</link><dc:creator>esprit</dc:creator><author>esprit</author><pubDate>Thu, 21 Sep 2006 06:49:00 GMT</pubDate><guid>http://www.aygfsteel.com/esprit/archive/2006/09/21/71099.html</guid><wfw:comment>http://www.aygfsteel.com/esprit/comments/71099.html</wfw:comment><comments>http://www.aygfsteel.com/esprit/archive/2006/09/21/71099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/esprit/comments/commentRss/71099.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/esprit/services/trackbacks/71099.html</trackback:ping><description><![CDATA[ <p>1、IE与Firefox下对CSS解析的区åˆ?˜q™æ˜¯æˆ‘在使用中的一些经验,拿出来和大家分äínåQŒå¸Œæœ›å¤§å®¶ç‘ô¾l?/p> <p> <strong>寚w«˜åº¦çš„解析</strong> </p> <p>IEåQšå°†æ ÒŽ®å†…容的高度变化,包括未定义高度的囄¡‰‡å†…容åQŒå³ä½¿å®šä¹‰äº†é«˜åº¦åQŒå½“内容­‘…过高度æ—Óž¼Œž®†ä‹É用实际高度ã€?/p> <p>FirefoxåQšæ²¡æœ‰å®šä¹‰é«˜åº¦æ—¶åQŒå¦‚果内容中包括了图片内容,MF的高度解析是æ ÒŽ®å°åˆ·æ ‡å‡†åQŒè¿™æ ·å°±ä¼šé€ æˆå’Œå®žé™…内定w«˜åº¦ä¸½W¦åˆçš„æƒ…况;当定义了高度,但是内容­‘…过高度æ—Óž¼Œå†…容会超出定义的高度åQŒä½†æ˜¯åŒºåŸŸä‹É用的样式不会变化åQŒé€ æˆæ ·å¼é”™ä½ã€?/p> <p>¾l“论åQšå¤§å®¶åœ¨å¯ä»¥¼‹®å®šå†…容高度的情况下最好定义高度,如果真的没有办法定义高度åQŒæœ€å¥½ä¸ç”¨ä‹Éç”¨è¾¹æ¡†æ ·å¼ï¼Œå¦åˆ™æ ·å¼è‚¯å®šä¼šå‡ºçŽ°æØœä¹±ï¼</p> <p> <strong>img对象altå’Œtitle的解æž?br /></strong>altåQšå½“照片不存在或者load错误时的提示åQ?br />titleåQšç…§ç‰‡çš„tip说明ã€?br />在IE中如果没有定义titleåQŒalt也可以作为imgçš„tip使用åQŒä½†æ˜¯åœ¨MF中,两者完全按照标准中的定义ä‹Éç”?/p> <p>¾l“论åQšå¤§å®¶åœ¨å®šä¹‰img对象æ—Óž¼Œæœ€åŽå°†altå’Œtitle对象都写全,保证在各¿Uæµè§ˆå™¨ä¸­éƒ½èƒ½æ­£å¸æ€‹Éç”?/p> <p> <strong>其他的细节差åˆ?br /></strong>当你在写css的时候,特别是用float: leftåQˆæˆ–rightåQ‰æŽ’列一½Hœå›¾ç‰‡æ—¶åQŒä¼šå‘现在firefox里面正常而IE里面有问题。无è®ÞZ½ ç”¨margin:0,˜q˜æ˜¯border: 0来约束,都无‹¹ŽäºŽäº‹ã€?/p> <p>其实˜q™é‡Œ˜q˜æœ‰å¦å¤–一个问题,ž®±æ˜¯IE对于½Iºæ ¼çš„处理,firefox是忽略的而IE对于块与块之间的½Iºæ ¼æ˜¯å¤„理的。也ž®±æ˜¯è¯´ä¸€ä¸ªdiv¾l“束后要紧接着一个div写,中间不要有回车或者空根{€‚ä¸ç„¶ä¹Ÿè®æ€¼šæœ‰é—®é¢˜ï¼Œæ¯”如3px的偏差,而且˜q™ä¸ªåŽŸå› å¾ˆéš¾å‘çŽ°ã€?/p> <p>非常不走˜qçš„æ˜¯æˆ‘又碰åˆîCº†˜q™æ ·çš„问题,多个img标签˜qžç€åQŒç„¶åŽå®šä¹‰çš„float: leftåQŒå¸Œæœ›è¿™äº›å›¾ç‰‡å¯ä»¥è¿žèµäh¥ã€‚但是结果在firefox里面正常而IE里面昄¡¤ºçš„æ¯ä¸ªimg都相隔了3px。我把标½{¾ä¹‹é—´çš„½Iºæ ¼éƒ½åˆ é™¤éƒ½æ²¡æœ‰ä½œç”¨ã€?/p> <p>后来的解å†Ïx–¹æ³•是在img外面套liåQŒåƈ且对li定义margin: 0åQŒè¿™æ ·å°±è§£å†³äº†IEå’Œfirefox的显½Cºåå·®ã€‚IE对于一些模型的解释会äñ”生很多错误问题,只有多多ž®è¯•才能发现原因ã€?/p> <p> <strong>2、嵌套DIV:父DIV的高度不能根据子DIV自动变化的解å†Ïx–¹æ¡?/strong> <br /><div id="parent"><br /><div id="content"> </div><br /></div></p> <p>当Content内容多时åQŒå³ä½¿parent讄¡½®äº†é«˜åº?00%或auto,在不同浏览器下还是不能完好的自动伸展ã€?解决æ–ÒŽ¡ˆ</p> <p><div id="parent"><br /><div id="content"></div><br /><div style="font: 0px/0px sans-serif;clear: both;display: block"> </div><br /></div></p> <p>åœ¨å±‚çš„æœ€ä¸‹æ–¹äº§ç”Ÿä¸€ä¸ªé«˜åº¦äØ“1的空æ û|¼Œå¯è§£é™¤è¿™ä¸ªé—®é¢?/p> <p> <strong>3、CSS DIV 学习½W”è®°</strong> <br />一、基本上每个区块的div 都要有自å·Þqš„idåQŒæœ¾lä¸åŒåŠŸèƒ½çš„åŒºå—ç”¨åŒä¸€ä¸ªid/class</p> <p>二、每个稍大的区块div 后面都跟一ä¸?lt;!â€?/id â€?gt;标记开始、结æ?/p> <p>三、隐藏文字的又一¿Uæ–¹æ³?TEXT-INDENT: -9999px; LINE-HEIGHT: 0</p> <p>四、åéy妙地处理òq¶åˆ—的两åˆ?<br />1)<br />叛_ˆ—为P, width=44.5%, float=left<br />左列为P.first, border-right: #a7a7a7 1px solid, width=45%<br />2)<br />叛_ˆ—#right, margin-left:50%<br />左列#left, float=left,width=50% border-right:#a7a7a7 1px solid</p> <p>以上两种æ–ÒŽ³•å…³é”®ç‚¹åœ¨äºŽé€‰æ‹©å…¶ä¸­ä¸€ä¸ªäØ“float=left</p> <p>五、随机的切换囄¡‰‡åQ?br />#random {<br />BACKGROUND: url(/rotate.php);<br />}<br />˜q™ä¸ªæ–ÒŽ³•很åéy妙ã€?/p> <p>4、关于div的高度自适应<br />   今天ž®å°¿è®©æˆ‘帮他的页子解决一个问题,ž®±æ˜¯div的高度自适应åQŒä¹Ÿž®±æ˜¯åœ¨ä¸€ä¸ªçˆ¶¾U§div中嵌套一左一右两个子divåQŒå³è¾¹çš„子div内容可无限扩展,è€? 可以使得父çñ”div的高度能被无限拉长,用一般的布局æ–ÒŽ³•åQŒåœ¨IE中可以正¼‹®æµè§ˆï¼Œåœ¨Mozilla中父¾U§div的高度就固定åœ?0px左右åQŒæ— æ³•自适应 高度åQŒheight:auto也不行,怎么办呢。网上参考到一½‹‡èµ„料,要实现自适应高度åQŒdiv层必™åÕd…·æœ‰float属性,于是我开始动手试验, float:left的话åQŒdivž®Þp·‘到页面最左边åŽÖMº†åQŒè¿™å¥½åŠžåQŒæˆ‘在它的外面再套一层divåQŒæŠŠä½ç½®å®šå¥½åQŒé‚£ä¹ˆé‡Œé¢çš„ž®Þq®—float:left也不会被 ¿UÕdŠ¨ä½ç½®äº†ã€?/p> <p>xhtml:<br />===============</p> <p><div id="container_father"><br /> <div id="container"><br />   <div id="panel"> test<br /><br />    test<br /><br />    test<br /><br />     <!â€?id="panel" â€?gt;<br />   </div><br />   <div id="sidebar"><br />    <ul><br />      <li class="current">预安装检æŸ?lt;/li><br />      <li>阅读 PFC 授权协议</li><br />      <li>初始化数据库</li><br />      <li>完成安装</li><br />     </ul><br />     <!â€?id="sidebar" â€?gt;<br />   </div><br />   <!â€?id="container" â€?gt;<br /> </div><br /></div></p> <p>CSS<br />=================<br />#container_father {<br />margin-left: auto;<br />margin-right: auto;<br />padding: 0px;<br />width: 750px;<br />}</p> <p>#container {<br />  width: 750px;<br />  border: 1px solid #cccccc;<br />  padding: 8px;<br />  margin: 0px;<br />  background-color: #F1F3F5;<br />  float: left;<br />}</p> <p>FRom: http://ulean.zg163.net/</p> <p> <strong>5ã€? 深入标准  ~  The IE Doubled Float-Margin Bug(IE双倍æÕQ动边界Bug)</strong> <br />什么发生故障?</p> <p>一 ŒD‰|— é”™çš„代码把一个居左æÕQåŠ?float:left)的元素放¾|®è¿›ä¸€ä¸ªå®¹å™¨ç›’(box)åQŒåƈ在æÕQ动元素上使用了左边界(margin-left)来ä×o它和 容器的左边äñ”生一ŒDµè·¼›…R€‚看èµäh¥ç›¸å½“的简单,对吗åQŸä½†ç›´è‡³å®ƒè¢«åœ¨IE/Winä¸­æµè§ˆäØ“æ­¢ï¼Œåœ¨æµè§ˆå™¨ä¸­å±…å·¦æÕQ动元素的边界长度被神¿U˜åœ°¾˜ÖMº†ä¸€å€ï¼</p> <p>情况应该如何åQ?/p> <p>下面的图释展½CÞZº†ä¸€ä¸ªç®€å•çš„div(茶色的盒å­?包含着一个居左æÕQ动的div(¾l¿è‰²çš„ç›’å­?。æÕQ动元素有一ä¸?00px的左边界åQŒä‹É容器盒与它的左边¾~˜ä¹‹é—´äñ”生了一ä¸?00px的间隙。到现在为止åQŒä¸€ç›´éƒ½˜q˜ä¸é”™ã€?/p> <p>.floatbox {<br />float: left;<br />width: 150px;<br />height: 150px;<br />margin: 5px 0 5px 100px;<br />/*This last value applies the 100px left margin */<br />}</p> <p>陈旧的IE“双倍占据â€?/p> <p>原样的相同代码被在IE/Win中浏览时以些微不同的方式昄¡¤ºåQŒä¸‹é¢çš„å›ùN‡Šå±•示了IE/Win在布局上所做的ã€?/p> <p>˜q™äؓ什么会发生åQŸåˆ«é—®è¿™¿Uå‚»é—®é¢˜åQè¿™ž®±æ˜¯IEåQŒè®°å¾—吗åQŸç¬¦åˆæ ‡å‡†åªæ˜¯ç†æƒ³çš„状况åQŒä¸æŒ‡æœ›å®žçްåQŒè¿™ä¸ªç®€å•的事实正验证了ã€?/p> <p>重点</p> <p>˜q™ä¸ªBug仅当‹¹®åŠ¨è¾¹ç•Œå’ŒæÕQ动元素的方向相同时出现在‹¹®åŠ¨å…ƒç´ å’Œå®¹å™¨ç›’çš„å†…è¾¹ç¼˜ä¹‹é—´åQŒåœ¨˜q™ä¹‹åŽçš„ä»ÀL„æœ‰ç€ç›æ€¼¼è¾¹ç•Œçš„æÕQ动元素不会呈现双倍边界。只有特定的‹¹®åŠ¨è¡Œçš„½W¬ä¸€ä¸ªæÕQ动元素会遭遇˜q™ä¸ªBugã€‚åƒå±…å·¦çš„æƒ…å†µä¸€æ øP¼ŒåŒå€è¾¹ç•ŒåŒæ ïL¥ž¿U˜åœ°æ˜„¡¤ºåœ¨å±…右的相同方式ã€?/p> <p>最后,修复办法åQ?/p> <p>ç›? 到现åœ?04òq?æœ?˜q™ä¸ªBugä¸€ç›´è¢«è®¤äØ“æ˜¯æ— æ³•ä¿®å¤çš„åQŒé€šå¸¸ç”¨æ¥æ›¿ä»£é”™è¯¯çš„边界的控制æ–ÒŽ³•如:一个不可视‹¹®åŠ¨å…ƒç´ çš„å·¦è¾¹è·åQŒè¿žåŒä¸€ä¸ªå†…åµŒçš„ç›’å­ä¸€èµøP¼Œå? 视的盒子装在不可视æÕQ动元素里åQ›æˆ–者ä‹É用技巧仅对IE/Win讑֮šè¾¹ç•Œçš?/2倹{€‚è¿™åŠžæ³•ç”Ÿæ•ˆäº†ï¼Œä½†æ˜¯æ˜¯æØœä¹Þqš„而且搞糟了干净的源代码。不˜q‡çŽ°åœ¨å…¨éƒ¨ç»“æ? 了ã€?/p> <p>Steve Clason发现了一个修复办法,描述在他的Guest Demo里,修复了双倍边界和围绕文字¾~©è¿›Bug。这是一个经典的IEçš„Bug修复办法åQŒä‹É用一个属性来修复影响不相兛_±žæ€§çš„Bugã€?/p> <p>现在如何来做åQ?/p> <p>研究它,½Ž€å•地ž®†{display: inline;}讄¡½®¾l™æÕQ动元素就是全部所需做的åQæ˜¯çš„,听è“v来太½Ž€å•了åQŒä¸æ˜¯å—åQŸä¸˜q‡è¿™æ˜¯çœŸçš„,仅仅一个displayçš?inline"声明已经能够胜ä“Q了ã€?/p> <p>熟悉规则的äh知道‹¹®åŠ¨å…ƒç´ è‡ªåŠ¨è®„¡½®ä¸?block"元素åQŒè€Œä¸½Ž¡ä»–们之前是什么。就如Steve从W3C里指出:</p> <p>9.5.1 Positioning the float: the ‘floatâ€?property</p> <p>"This property specifies whether a box should float to the left, right, or not at all. It may be set for elements that generate boxes that are not absolutely positioned. The values of this property have the following meanings:</p> <p>left<br />The element generates a block box that is floated to the left. Content flows on the right side of the box, starting at the top (subject to the ‘clearâ€?property). The ‘displayâ€?is ignored, unless it has the value ‘noneâ€?</p> <p>right<br />Same as ‘leftâ€? but content flows on the left side of the box, starting at the top.</p> <p>none<br />The box is not floated. "</p> <p>˜q?说明‹¹®åŠ¨å…ƒç´ ä¸Šçš„{display: inline;}会被忽略åQŒäº‹å®žä¸Šæ‰€æœ‰çš„‹¹è§ˆå™¨æ²¡æœ‰å‘ˆçŽîC“Q何改变,包括IE。但是,它不知何故让IE停止ž®†æÕQ动元素的边界¾˜Õd€ã€‚因而,˜q™ä¸ªä¿®å¤åŠžæ³•å¯ä»¥è¢? 直接应用åQŒè€Œæ²¡æœ‰ä“Q何繁琐的隐藏æ–ÒŽ³•。如果将来的一‹Æ¾æµè§ˆå™¨å†›_®šå¯¹è¿™ä¸ªä¿®å¤åŠžæ³•æŠ±æ™ï¼Œåªè¦æŠŠè¿™ä¸ªä¿®å¤è£…å…¥IE独用的Tan Hack里,¾l†èŠ‚å¦‚åŒIE Three Pixel Text-Jog Demoã€?/p> <p>下面是两个ä‹É用了前面相同代码的生动演½Cºï¼Œ½W¬ä¸€ä¸ªç…§å¸¸æ˜¾½CÞZº†IEçš„BugåQŒä¸‹ä¸€ä¸ªå¯¹‹¹®åŠ¨å…ƒç´ ä½¿ç”¨äº?inline"修复ã€?br />.floatbox {<br />float: left;<br />width: 150px;<br />height: 150px;<br />margin: 5px 0 5px 100px;<br />display: inline;<br />}</p> <p> <font color="#ff0000">Update (20060828)åQ?br /></font> <strong>6、空<li></li>解析问题</strong>ã€?/p> <p>在FF下空<li></li>是不被解析的åQŒä¹Ÿž®±æ˜¯è¯ß_¼Œ<li>标签所带的css样式是不被解释的。但是在IE下空<li></li>是一样会被解析的ã€?br />例如我定义如下Css:<br />#sidebar ul li {<br />  list-style-type: none;<br />  list-style-image: none;<br />  margin-bottom: 15px;<br />}</p> <p>而我的sidebar使用了一个空çš?<li></li> 。那么在FF下不被解析,而在IE下会出现15px的空白ã€?/p> <img src ="http://www.aygfsteel.com/esprit/aggbug/71099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/esprit/" target="_blank">esprit</a> 2006-09-21 14:49 <a href="http://www.aygfsteel.com/esprit/archive/2006/09/21/71099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>收藏å¸?常用的一些javascriptž®æŠ€å·?/title><link>http://www.aygfsteel.com/esprit/archive/2006/07/08/57300.html</link><dc:creator>esprit</dc:creator><author>esprit</author><pubDate>Sat, 08 Jul 2006 15:53:00 GMT</pubDate><guid>http://www.aygfsteel.com/esprit/archive/2006/07/08/57300.html</guid><wfw:comment>http://www.aygfsteel.com/esprit/comments/57300.html</wfw:comment><comments>http://www.aygfsteel.com/esprit/archive/2006/07/08/57300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/esprit/comments/commentRss/57300.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/esprit/services/trackbacks/57300.html</trackback:ping><description><![CDATA[事äšg源对象Â?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />event.srcElement.tagName <br />event.srcElement.type <br /><br /></td></tr></tbody></table><br />捕获释放 <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />event.srcElement.setCapture();  <br />event.srcElement.releaseCapture();<br /><br /></td></tr></tbody></table><br />事äšg按键<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />event.keyCode <br />event.shiftKey <br />event.altKey <br />event.ctrlKey <br /><br /></td></tr></tbody></table><br />事äšg˜q”回å€?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />event.returnValue <br /><br /></td></tr></tbody></table><br />鼠标位置 <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />event.x <br />event.y <br /><br /></td></tr></tbody></table><br />½H—体‹zÕdŠ¨å…ƒç´ <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />document.activeElement <br /><br /></td></tr></tbody></table><br />¾l‘定事äšg<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />document.captureEvents(Event.KEYDOWN); <br /><br /></td></tr></tbody></table><br />讉K—®½H—体元素 <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />document.all("txt").focus(); <br />document.all("txt").select(); <br /><br /></td></tr></tbody></table><br />½H—体命ä×o <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />document.execCommand <br /><br /></td></tr></tbody></table><br />½H—体COOKIE <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />document.cookie <br /><br /></td></tr></tbody></table><br />菜单事äšg <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />document.oncontextmenu<br /><br /></td></tr></tbody></table> <br />创徏元素<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />document.createElement("SPAN"); <br /><br /></td></tr></tbody></table><br />æ ÒŽ®é¼ æ ‡èŽ·å¾—å…ƒç´ åQ?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />document.elementFromPoint(event.x,event.y).tagName=="TD <br />document.elementFromPoint(event.x,event.y).appendChild(ms)<br /><br /></td></tr></tbody></table><br />½H—体囄¡‰‡<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />document.images[索引] <br /><br /></td></tr></tbody></table><br />½H—体事äšg¾l‘定 <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />document.onmousedown=scrollwindow; <br /><br /></td></tr></tbody></table><br />元素 <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />document.½H—体.elements[索引]<br /><br /></td></tr></tbody></table> <br /><br />对象¾l‘定事äšg <br /><br /><br />插äšgæ•°ç›®<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />navigator.plugins <br /><br /></td></tr></tbody></table><br />取变量类åž?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />typeof($js_libpath) == "undefined" <br /><br /></td></tr></tbody></table><br />下拉æ¡?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />下拉æ¡?options[索引] <br />下拉æ¡?options.length <br /><br /></td></tr></tbody></table><br />查找对象 <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />document.getElementsByName("r1"); <br />document.getElementById(id); <br /><br /></td></tr></tbody></table><br /><br />定时 <br /><br /><br />UNCODE¾~–码 <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />escape() ,unescape <br /><br /></td></tr></tbody></table><br />父对象Â?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />obj.parentElement(dhtml) <br />obj.parentNode(dom)<br /><br /></td></tr></tbody></table><br />交换表的è¡?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />TableID.moveRow(2,1) <br /><br /></td></tr></tbody></table><br />替换CSS <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />document.all.csss.href = "a.css"; <br /><br /></td></tr></tbody></table><br />òq¶æŽ’昄¡¤ºÂ <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />display:inline<br /><br /></td></tr></tbody></table> <br />隐藏焦点 <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />hidefocus=true <br /><br /></td></tr></tbody></table><br />æ ÒŽ®å®½åº¦æ¢è¡Œ<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />style="word-break:break-all"<br /><br /></td></tr></tbody></table> <br />自动åˆäh–°Â <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br /><meta HTTP-EQUIV="refresh" CONTENT="8;URL=http://c98.yeah.net"><br /><br /></td></tr></tbody></table> <br />½Ž€å•é‚®ä»?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br /><a href="mailto:aaa@bbb.com?subject=ccc&body=xxxyyy"> <br /><br /></td></tr></tbody></table><br />快速è{åˆîC½¾|®Â?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />obj.scrollIntoView(true)<br /><br /></td></tr></tbody></table> <br />é”?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br /><a name="first"> <br /><a href="#first">anchors</a> <br /><br /></td></tr></tbody></table><br />¾|‘页传递参æ•?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />location.search();<br /><br /></td></tr></tbody></table><br />可编è¾?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />obj.contenteditable=true <br /><br /></td></tr></tbody></table><br />执行菜单命ä×o<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />obj.execCommand <br /><br /></td></tr></tbody></table><br />双字节字½W¦Â?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />/[^\x00-\xff]/ <br /><br /></td></tr></tbody></table><br />汉字 <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />/[\u4e00-\u9fa5]/ <br /><br /></td></tr></tbody></table><br />让英文字½W¦ä¸²­‘…出表格宽度自动换行<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />word-wrap: break-word; word-break: break-all; <br /><br /></td></tr></tbody></table><br />透明背景<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br /><IFRAME src="1.htm" width=300 height=180 allowtransparency></iframe> <br /><br /></td></tr></tbody></table><br />获得style内容<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />obj.style.cssText <br /><br /></td></tr></tbody></table><br />HTML标签<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />document.documentElement.innerHTML <br /><br /></td></tr></tbody></table><br />½W¬ä¸€ä¸ªstyle标签<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />document.styleSheets[0] <br /><br /></td></tr></tbody></table><br />style标签里的½W¬ä¸€ä¸ªæ ·å¼?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />document.styleSheets[0].rules[0] <br /><br /></td></tr></tbody></table><br />防止点击½Iºé“¾æŽ¥æ—¶åQŒé¡µé¢å¾€å¾€é‡ç½®åˆ°é¡µé¦–端ã€?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br /><a href="javascript:function()">word</a> <br /><br /></td></tr></tbody></table><br />上一¾|‘页æº?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />asp: <br />request.servervariables("HTTP_REFERER") <br />javascript: <br />document.referrer <br /><br /></td></tr></tbody></table><br />释放内存<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />CollectGarbage();<br /><br /></td></tr></tbody></table><br />¼›æ­¢å³é”®Â <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />document.oncontextmenu = function() { return false;} <br /><br /></td></tr></tbody></table><br />¼›æ­¢ä¿å­˜Â <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br /><noscript><iframe src="*.htm"></iframe></noscript><br /><br /></td></tr></tbody></table><br />¼›æ­¢é€‰å–<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br /><body oncontextmenu="return false" ondragstart="return false" onselectstart ="return false" onselect="document.selection.empty()" oncopy="document.selection.empty()" onbeforecopy="return false"onmouseup="document.selection.empty()> <br /><br /></td></tr></tbody></table><br />¼›æ­¢¾_˜è„“<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br /><input type=text onpaste="return false"> <br /><br /></td></tr></tbody></table><br />地址栏图标Â?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br /><link rel="Shortcut Icon" href="favicon.ico"><br /><br />favicon.ico 名字最好不å?6*16çš?6è‰?放虚拟目录根目录下Â?br />收藏栏图标Â?br /><br /><link rel="Bookmark" href="favicon.ico"> <br /><br /></td></tr></tbody></table><br /><br />查看源码<br /><br /><br />关闭输入æ³?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br /><input style="ime-mode:disabled"> <br /><br /></td></tr></tbody></table><br />自动全é€?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br /><input type=text name=text1 value="123" onfocus="this.select()"> <br /><br /></td></tr></tbody></table><br />ENTER键可以让光标¿UÕdˆ°ä¸‹ä¸€ä¸ªè¾“入框<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br /><input onkeydown="if(event.keyCode==13)event.keyCode=9"><br /><br /></td></tr></tbody></table><br />文本框的默认å€?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br /><input type=text value="123" onfocus="alert(this.defaultValue)"> <br /><br /></td></tr></tbody></table><br />title换行<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />obj.title = "123&#13sdfs&#32" <br /><br /></td></tr></tbody></table><br />获得旉™—´æ‰€ä»£è¡¨çš„å¾®¿U’Â?br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />var n1 = new Date("2004-10-10".replace(/-/g, "\/")).getTime() <br /><br /></td></tr></tbody></table><br />½H—口是否关闭 <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />win.closed <br /><br /></td></tr></tbody></table><br />checkbox扁åã^<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br /><input type=checkbox style="position: absolute; clip:rect(5px 15px 15px 5px)"> <br /><br /></td></tr></tbody></table><br />获取选中内容 <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />document.selection.createRange().duplicate().text<br /><br /></td></tr></tbody></table><br />自动完成功能<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br /><input  type=text  autocomplete=on>打开该功èƒãq Â?br /><input  type=text  autocomplete=off>关闭该功èƒãq?br /><br /></td></tr></tbody></table><br />½H—口最大化 <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br /><body onload="window.resizeTo(window.screen.width - 4,window.screen.height-50);window.moveTo(-4,-4)"> <br /><br /></td></tr></tbody></table><br />无关闭按钮IE<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />window.open("aa.htm", "meizz", "fullscreen=7"); <br /><br /></td></tr></tbody></table><br />¾lŸä¸€¾~–码/解码<br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"> <br />alert(decodeURIComponent(encodeURIComponent("http://你好.com?as= hehe"))) <br />encodeURIComponentå¯?:"ã€?/"ã€?;" 和Â??"也编码Â?br /><br /></td></tr></tbody></table><br /><br />表格行指½C?br /><br /><br />//各种ž®ºå¯¸Â <br /><br /><table cellspacing="1" width="100%" bgcolor="#cccccc" border="0"><tbody><tr><td bgcolor="#efefef"><br />s  +=  "\r\n¾|‘页可见区域宽:"+  document.body.clientWidth;   <br />s  +=  "\r\n¾|‘页可见区域高:"+  document.body.clientHeight;   <br />s  +=  "\r\n¾|‘页可见区域高:"+  document.body.offsetWeight  +"  (包括边线的宽)";   <br />s  +=  "\r\n¾|‘页可见区域高:"+  document.body.offsetHeight  +"  (包括边线的宽)";   <br />s  +=  "\r\n¾|‘页正文全文宽:"+  document.body.scrollWidth;   <br />s  +=  "\r\n¾|‘页正文全文高:"+  document.body.scrollHeight;   <br />s  +=  "\r\n¾|‘页被卷åŽÈš„高:"+  document.body.scrollTop;   <br />s  +=  "\r\n¾|‘页被卷åŽÈš„左:"+  document.body.scrollLeft;   <br />s  +=  "\r\n¾|‘页正文部分上:"+  window.screenTop;   <br />s  +=  "\r\n¾|‘页正文部分左:"+  window.screenLeft;   <br />s  +=  "\r\n屏幕分èöL率的高:"+  window.screen.height;   <br />s  +=  "\r\n屏幕分èöL率的宽:"+  window.screen.width;   <br />s  +=  "\r\n屏幕可用工作区高度:"+  window.screen.availHeight;   <br />s  +=  "\r\n屏幕可用工作区宽度:"+  window.screen.availWidth; <br /><br /></td></tr></tbody></table><br /><img src ="http://www.aygfsteel.com/esprit/aggbug/57300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/esprit/" target="_blank">esprit</a> 2006-07-08 23:53 <a href="http://www.aygfsteel.com/esprit/archive/2006/07/08/57300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Javascriptçš„IEå’ŒFirefox兼容性汇¾~?/title><link>http://www.aygfsteel.com/esprit/archive/2006/07/08/57298.html</link><dc:creator>esprit</dc:creator><author>esprit</author><pubDate>Sat, 08 Jul 2006 15:50:00 GMT</pubDate><guid>http://www.aygfsteel.com/esprit/archive/2006/07/08/57298.html</guid><wfw:comment>http://www.aygfsteel.com/esprit/comments/57298.html</wfw:comment><comments>http://www.aygfsteel.com/esprit/archive/2006/07/08/57298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/esprit/comments/commentRss/57298.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/esprit/services/trackbacks/57298.html</trackback:ping><description><![CDATA[以下以 IE 代替 Internet ExploreråQŒä»¥Â MF 代替 Mozzila Firefox<br /><br /><b>1. document.form.item 问题</b><br />(1)现有问题åQ?br />现有代码中存在许多 document.formName.item("itemName") ˜q™æ ·çš„语句,不能在 MF 下运è¡?br />(2)解决æ–ÒŽ³•åQ?br />改用 document.formName.elements["elementName"]<br />(3)其它<br />参见 2<br /><br /><b>2. 集合¾cÕd¯¹è±¡é—®é¢?/b><br />(1)现有问题åQ?br />现有代码中许多集合类对象取用时ä‹É用Â?)åQŒIE 能接受,MF 不能ã€?br />(2)解决æ–ÒŽ³•åQ?br />改用 []Â ä½œäØ“ä¸‹æ ‡˜qç®—。如åQšdocument.forms("formName")Â æ”¹äØ“Â document.forms["formName"]ã€?br />又如åQšdocument.getElementsByName("inputName")(1)Â æ”¹äØ“Â document.getElementsByName("inputName")[1]<br /><br /><b>3. window.event</b><br />(1)现有问题åQ?br />使用 window.event 无法在 MF 上运è¡?br />(2)解决æ–ÒŽ³•åQ?br />MF 的 event 只能在事件发生的现场使用åQŒæ­¤é—®é¢˜æš‚无法解冟뀂可以这样变通:<br />原代ç ?可在IE中运è¡?åQ?br /><input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit()"/><br />...<br /><script language="javascript"><br />function gotoSubmit() {<br />...<br />alert(window.event); // use window.event<br />...<br />}<br /></script><br /><br />æ–îC»£ç ?可在IEå’ŒMF中运è¡?åQ?br /><input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit(event)"/><br />...<br /><script language="javascript"><br />function gotoSubmit(evt) {<br />evt = evt ? evt : (window.event ? window.event : null);<br />...<br />alert(evt); // use evt<br />...<br />}<br /></script><br />此外åQŒå¦‚果新代码中第一行不改,与老代码一æ ïLš„è¯?åê gotoSubmit 调用没有¾l™å‚æ•?åQŒåˆ™ä»ç„¶åªèƒ½åœ¨IE中运行,但不会出错。所以,˜q™ç§æ–ÒŽ¡ˆÂ tpl 部分仍与老代码兼宏V€?br /><br /><b>4. HTML 对象的 idÂ ä½œäØ“å¯¹è±¡åçš„é—®é¢˜</b><br />(1)现有问题<br />在 IE 中,HTML 对象的 IDÂ å¯ä»¥ä½œäØ“Â document 的下属对象变量名直接使用。在 MF 中不能ã€?br />(2)解决æ–ÒŽ³•<br />用 getElementById("idName") 代替 idNameÂ ä½œäØ“å¯¹è±¡å˜é‡ä½¿ç”¨ã€?br /><br /><b>5. 用idName字符串取得对象的问题</b><br />(1)现有问题<br />在IE中,利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象åQŒåœ¨MF 中不能ã€?br />(2)解决æ–ÒŽ³•<br />用 getElementById(idName) 代替 eval(idName)ã€?br /><br /><b>6. 变量名与某 HTML 对象 id 相同的问é¢?/b><br />(1)现有问题<br />在 MFÂ ä¸­ï¼Œå› äØ“å¯¹è±¡Â id 不作为 HTML 对象的名¿UŽÍ¼Œæ‰€ä»¥å¯ä»¥ä‹É用与 HTML 对象 id 相同的变量名åQŒIE 中不能ã€?br />(2)解决æ–ÒŽ³•<br />在声明变量时åQŒä¸€å¾‹åŠ ä¸ŠÂ var åQŒä»¥é¿å…æ­§ä¹‰åQŒè¿™æ ·åœ¨Â IE 中亦可正常运行ã€?br />此外åQŒæœ€å¥½ä¸è¦å–与 HTML 对象 id 相同的变量名åQŒä»¥å‡å°‘错误ã€?br />(3)其它<br />参见 问题4<br /><br /><b>7. event.x 与 event.y 问题</b><br />(1)现有问题<br />在IE 中,event 对象有 x, y 属性,MF中没有ã€?br />(2)解决æ–ÒŽ³•<br />在MF中,与event.x ½{‰æ•ˆçš„æ˜¯Â event.pageX。但event.pageX IE中没有ã€?br />故采用 event.clientX 代替 event.x。在IE 中也有这个变量ã€?br />event.clientX 与 event.pageX 有微妙的差别åQˆå½“整个™åµé¢æœ‰æ»šåŠ¨æ¡çš„æ—¶å€™ï¼‰åQŒä¸˜q‡å¤§å¤šæ•°æ—¶å€™æ˜¯½{‰æ•ˆçš„ã€?br /><br />å¦‚æžœè¦å®Œå…¨ä¸€æ øP¼Œå¯ä»¥½Eéº»çƒ¦äº›åQ?br />mX = event.x ? event.x : event.pageX;<br />然后用 mX 代替 event.x<br />(3)其它<br />event.layerX 在 IE 与 MF 中都有,具体意义有无差别ž®šæœªè¯•验ã€?br /><br /><b>8. 关于frame</b><br />(1)现有问题<br />在 IE中 可以用window.testFrame取得该frameåQŒmf中不è¡?br />(2)解决æ–ÒŽ³•<br />在frameçš„ä‹É用方面mfå’Œie的最主要的区别是åQ?br />如果在frame标签中书写了以下属性:<br /><frame src="xx.htm" id="frameId" name="frameName" /><br />那么ie可以通过id或者name讉K—®˜q™ä¸ªframe对应的window对象<br />而mf只可以通过name来访问这个frame对应的window对象<br />例如如果上述frame标签写在最上层的window里面的htm里面åQŒé‚£ä¹ˆå¯ä»¥è¿™æ ¯‚®¿é—?br />ieåQšÂ window.top.frameId或者window.top.frameName来访问这个window对象<br />mfåQšÂ åªèƒ½è¿™æ ·window.top.frameName来访问这个window对象<br /><br />另外åQŒåœ¨mfå’Œie中都可以使用window.top.document.getElementById("frameId")来访问frame标签<br />òq¶ä¸”可以通过window.top.document.getElementById("testFrame").src = ‘xx.htm’来切换frame的内å®?br />也都可以通过window.top.frameName.location = ‘xx.htm’来切换frame的内å®?br />关于frameå’Œwindow的描˜q°å¯ä»¥å‚见bbs的‘window与frame’文ç«?br />以及/test/js/test_frame/目录下面的测è¯?br />----adun 2004.12.09修改<br /><br /><b>9. 在mf中,自己定义的属性必™å»getAttribute()取得</b><br /><br /><b>10.在mf中没有 parentElement parement.children 而用parentNode parentNode.childNodes</b><br />childNodes的下标的含义在IEå’ŒMF中不同,MF使用DOM规范åQŒchildNodes中会插入½Iºç™½æ–‡æœ¬èŠ‚ç‚¹ã€?br />一般可以通过node.getElementsByTagName()来回避这个问题ã€?br />当html中节点缺失时åQŒIEå’ŒMF对parentNode的解释不同,例如<br /><form><br /><table><br /><input/><br /></table><br /></form><br />MF中input.parentNodeçš„å€égØ“form, 而IE中input.parentNodeçš„å€égØ“½Iø™Š‚ç‚?br /><br />MF中节ç‚ÒŽ²¡æœ‰removeNodeæ–ÒŽ³•åQŒå¿…™åÖM‹É用如下方法 node.parentNode.removeChild(node)<br /><br /><b>11.const 问题</b><br />(1)现有问题:<br />在 IE 中不能ä‹É用 const 关键字。如 const constVar = 32; 在IE中这是语法错误ã€?br />(2)解决æ–ÒŽ³•:<br />不ä‹É用 const åQŒä»¥Â var 代替ã€?br /><br /><b>12. body 对象</b><br />MFçš„body在body标签没有被浏览器完全è¯Õd…¥ä¹‹å‰ž®±å­˜åœ¨ï¼Œè€ŒIE则必™åÕdœ¨body完全被读入之后才存在<br /><br /><b>13. url encoding</b><br />在js中如果书写urlž®Þq›´æŽ¥å†™&不要å†?amp;amp;例如var url = ‘xx.jsp?objectName=xx&amp;objectEvent=xxxâ€?<br />frm.action = url那么很有可能url不会被正常显½CÞZ»¥è‡³äºŽå‚数没有正确的传到服务器<br />一般会服务器报错参数没有找åˆ?br />当然如果是在tplä¸­ä¾‹å¤–ï¼Œå› äØ“tpl中符合xml规范åQŒè¦æ±?amp;书写ä¸?amp;amp;<br />一般MF无法识别js中的&amp;<br /><br /><b>14. nodeName 和 tagName 问题</b><br />(1)现有问题åQ?br />在MF中,所有节点均有 nodeName å€û|¼Œä½†Â textNode 没有 tagName 倹{€‚在 IE 中,nodeName 的ä‹É用好è±?br />有问题(具体情况没有‹¹‹è¯•åQŒä½†æˆ‘çš„IE已经æ­ÖMº†å¥½å‡ ‹Æ¡ï¼‰ã€?br />(2)解决æ–ÒŽ³•åQ?br />使用 tagNameåQŒä½†åº”检‹¹‹å…¶æ˜¯å¦ä¸ºç©ºã€?br /><br /><b>15. 元素属æ€?/b><br />IE下 input.typeå±žæ€§äØ“åªè¯»åQŒä½†æ˜¯MF下可以修æ”?br /><img src ="http://www.aygfsteel.com/esprit/aggbug/57298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/esprit/" target="_blank">esprit</a> 2006-07-08 23:50 <a href="http://www.aygfsteel.com/esprit/archive/2006/07/08/57298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Session详解【è{è½½ã€?/title><link>http://www.aygfsteel.com/esprit/archive/2006/03/17/35817.html</link><dc:creator>esprit</dc:creator><author>esprit</author><pubDate>Fri, 17 Mar 2006 05:43:00 GMT</pubDate><guid>http://www.aygfsteel.com/esprit/archive/2006/03/17/35817.html</guid><wfw:comment>http://www.aygfsteel.com/esprit/comments/35817.html</wfw:comment><comments>http://www.aygfsteel.com/esprit/archive/2006/03/17/35817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/esprit/comments/commentRss/35817.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/esprit/services/trackbacks/35817.html</trackback:ping><description><![CDATA[作者:郎云鹏(dev2dev ID: hippiewolfåQ?br /><br />摘要åQšè™½ç„¶session机制在web应用½E‹åºä¸­è¢«é‡‡ç”¨å·²ç»å¾ˆé•¿æ—‰™—´äº†ï¼Œä½†æ˜¯ä»ç„¶æœ‰å¾ˆå¤šäh不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论sessionçš„å·¥ä½œæœºåˆ¶åÆˆä¸”å¯¹åœ¨Java web application中应用session机制时常见的问题作出解答ã€?br /><br />目录åQ?br />一、术语session<br />二、HTTP协议与状态保æŒ?br />三、理解cookie机制<br />四、理解session机制<br />五、理解javax.servlet.http.HttpSession<br />六、HttpSession常见问题<br />七、跨应用½E‹åºçš„sessionå…׃ín<br />八、æ€È»“<br />参考文æ¡?br /><br />一、术语session<br />在我的经验里åQŒsession˜q™ä¸ªè¯è¢«æ»¥ç”¨çš„程度大概仅‹Æ¡äºŽtransactionåQŒæ›´åŠ æœ‰­‘£çš„æ˜¯transaction与session在某些语境下的含义是相同的ã€?br /><br />sessionåQŒä¸­æ–‡ç»å¸¸ç¿»è¯‘äØ“ä¼šè¯åQŒå…¶æœ¬æ¥çš„含义是指有始有¾lˆçš„一¾pÕdˆ—动作/消息åQŒæ¯”如打电话时从拿è“v电话拨号到挂断电话这中间的一¾pÕdˆ—˜q‡ç¨‹å¯ä»¥¿UîC¹‹ä¸ÞZ¸€ä¸?session。有时候我们可以看到这æ ïLš„话“在一个浏览器会话期间åQ?..”,˜q™é‡Œçš„会话一词用的就是其本义åQŒæ˜¯æŒ‡ä»Žä¸€ä¸ªæµè§ˆå™¨½H—口打开到关闭这个期é—?â‘ ã€‚æœ€æ··äØ•çš„æ˜¯â€œç”¨æˆøP¼ˆå®¢æˆ·ç«¯ï¼‰åœ¨ä¸€‹Æ¡ä¼šè¯æœŸé—´â€è¿™æ ·ä¸€å¥è¯åQŒå®ƒå¯èƒ½æŒ‡ç”¨æˆïLš„一¾pÕdˆ—动作åQˆä¸€èˆ¬æƒ…况下是同某个具体目的相关的一¾pÕdˆ—动作åQŒæ¯”如从ç™Õd½•åˆ°é€‰è´­å•†å“åˆ°ç»“è´¦ç™»å‡ø™¿™æ ·ä¸€ä¸ªç½‘上购物的˜q‡ç¨‹åQŒæœ‰æ—¶å€™ä¹Ÿè¢«ç§°ä¸ÞZ¸€ä¸ªtransactionåQ‰ï¼Œç„¶è€Œæœ‰æ—¶å€™ä¹Ÿå¯èƒ½ä»…仅是指一‹Æ¡è¿žæŽ¥ï¼Œä¹Ÿæœ‰å¯èƒ½æ˜¯æŒ‡å«ä¹‰â‘ ï¼Œå…¶ä¸­çš„差别只能靠上下文来推断②ã€?br /><br />然而当session一词与¾|‘络协议相关联时åQŒå®ƒåˆå¾€å¾€éšå«äº†â€œé¢å‘连接”和/或“保持状态”这样两个含义, “面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到å¯ÒŽ–¹æŽ¥äº†ç”µè¯é€šä¿¡æ‰èƒ½å¼€å§‹ï¼Œä¸Žæ­¤ç›¸å¯¹çš„æ˜¯å†™ä¿¡åQŒåœ¨ä½ æŠŠä¿¡å‘出去的时候你òq¶ä¸èƒ½ç¡®è®¤å¯¹æ–¹çš„地址是否正确åQŒé€šä¿¡æ¸ é“不一定能建立åQŒä½†å¯¹å‘ä¿¡äh来说åQŒé€šä¿¡å·²ç»å¼€å§‹äº†ã€‚“保持状态”则是指通信的一方能够把一¾pÕdˆ—的消息关联è“v来,使得消息之间可以互相依赖åQŒæ¯”如一个服务员能够认出再次光äÍçš„è€é¡¾å®¢åÆˆä¸”è®°å¾—ä¸Š‹Æ¡è¿™ä¸ªé¡¾å®¢è¿˜‹Æ åº—里一块钱。这一¾cȝš„例子有“一个TCP session”或è€?“一个POP3 session”③ã€?br /><br />而到了web服务器蓬勃发展的时代åQŒsession在web开发语境下的语义又有了新的扩展åQŒå®ƒçš„含义是指一¾cȝ”¨æ¥åœ¨å®¢æˆ·ç«¯ä¸ŽæœåŠ¡å™¨ä¹‹é—´ä¿æŒçŠ¶æ€çš„è§£å†³æ–ÒŽ¡ˆâ‘£ã€‚有时候session也用来指˜q™ç§è§£å†³æ–ÒŽ¡ˆçš„存储结构,如“把xxx保存在session 里”⑤。由于各¿Uç”¨äºŽweb开发的语言在一定程度上都提供了对这¿Uè§£å†Ïx–¹æ¡ˆçš„æ”¯æŒåQŒæ‰€ä»¥åœ¨æŸç§ç‰¹å®šè¯­è¨€çš„语境下åQŒsession也被用来指代该语­a€çš„è§£å†Ïx–¹æ¡ˆï¼Œæ¯”如¾lå¸¸æŠŠJava里提供的javax.servlet.http.HttpSession½Ž€¿UîCØ“sessionâ‘¥ã€?br /><br />鉴于˜q™ç§æ··äؕ已不可改变,本文中session一词的˜qç”¨ä¹Ÿä¼šæ ÒŽ®ä¸Šä¸‹æ–‡æœ‰ä¸åŒçš„含义,请大家注意分辨ã€?br />在本文中åQŒä‹É用中文“浏览器会话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表辑֐«ä¹‰â‘¤åQŒä‹É用具体的“HttpSession”来表达含义â‘?br /><br />二、HTTP协议与状态保æŒ?br />HTTP 协议本èín是无状态的åQŒè¿™ä¸ŽHTTP协议本来的目的是相符的,客户端只需要简单的向服务器è¯äh±‚下蝲某些文äšgåQŒæ— è®ºæ˜¯å®¢æˆ·ç«¯è¿˜æ˜¯æœåŠ¡å™¨éƒ½æ²¡æœ‰å¿…è¦çºªå½•å½¼æ­¤è¿‡åŽÈš„è¡ŒäØ“åQŒæ¯ä¸€‹Æ¡è¯·æ±‚之间都是独立的åQŒå¥½æ¯”一个顾客和一个自动售货机或者一个普通的åQˆéžä¼šå‘˜åˆÓž¼‰å¤§å–åœÞZ¹‹é—´çš„关系一栗÷€?br /><br />然而聪明(或者贪心?åQ‰çš„äºÞZ»¬å¾ˆå¿«å‘现如果能够提供一些按需生成的动态信息会使web变得更加有用åQŒå°±åƒç»™æœ‰çº¿ç”µè§†åŠ ä¸Šç‚ÒŽ’­åŠŸèƒ½ä¸€æ —÷€‚è¿™¿Uéœ€æ±‚一斚w¢˜q«ä‹ÉHTML逐步æ·ÕdŠ äº†è¡¨å•ã€è„šæœ¬ã€DOM½{‰å®¢æˆïL«¯è¡ŒäØ“åQŒå¦ä¸€æ–šw¢åœ¨æœåŠ¡å™¨ç«¯åˆ™å‡ºçŽ°äº†CGI规范以响应客æˆïL«¯çš„åŠ¨æ€è¯·æ±‚ï¼Œä½œäØ“ä¼ è¾“è½½ä½“çš„HTTP协议也添加了文äšg上蝲ã€?cookie˜q™äº›ç‰ÒŽ€§ã€‚其中cookieçš„ä½œç”¨å°±æ˜¯äØ“äº†è§£å†³HTTP协议无状态的¾~ºé™·æ‰€ä½œå‡ºçš„努力。至于后来出现的session机制则是又一¿Uåœ¨å®¢æˆ·ç«¯ä¸ŽæœåŠ¡å™¨ä¹‹é—´ä¿æŒçŠ¶æ€çš„è§£å†³æ–ÒŽ¡ˆã€?br /><br />让我们用几个例子来描˜qîC¸€ä¸‹cookieå’Œsession机制之间的区别与联系。笔者曾¾lå¸¸åŽÈš„一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠åQŒç„¶è€Œä¸€‹Æ¡æ€§æ¶ˆè´?杯咖啡的æœÞZ¼šå¾®ä¹Žå…¶å¾®åQŒè¿™æ—¶å°±éœ€è¦æŸ¿Uæ–¹å¼æ¥¾Uªå½•某位™å‘Ö®¢çš„æ¶ˆè´ÒŽ•°é‡ã€‚想象一下其实也无外乎下面的几种æ–ÒŽ¡ˆåQ?br />1、该店的店员很厉宻I¼Œèƒ½è®°ä½æ¯ä½é¡¾å®¢çš„æ¶ˆè´¹æ•°é‡åQŒåªè¦é¡¾å®¢ä¸€èµ°è¿›å’–啡店,店员ž®ÞqŸ¥é“该怎么对待了。这¿Uåšæ³•就是协议本íw«æ”¯æŒçŠ¶æ€ã€?br />2、发¾l™é¡¾å®¢ä¸€å¼ å¡ç‰‡ï¼Œä¸Šé¢è®°å½•着消费的数量,一般还有个有效期限。每‹Æ¡æ¶ˆè´ÒŽ—¶åQŒå¦‚果顾客出½Cø™¿™å¼ å¡ç‰‡ï¼Œåˆ™æ­¤‹Æ¡æ¶ˆè´¹å°±ä¼šä¸Žä»¥å‰æˆ–以后的消费相联¾p»è“v来。这¿Uåšæ³•就是在客户端保持状态ã€?br />3、发¾l™é¡¾å®¢ä¸€å¼ ä¼šå‘˜å¡åQŒé™¤äº†å¡å·ä¹‹å¤–什么信息也不纪录,每次消费æ—Óž¼Œå¦‚æžœ™å‘Ö®¢å‡ºç¤ºè¯¥å¡ç‰‡ï¼Œåˆ™åº—员在店里的纪录本上找到这个卡号对应的¾Uªå½•æ·ÕdŠ ä¸€äº›æ¶ˆè´¹ä¿¡æ¯ã€‚è¿™¿Uåšæ³•就是在服务器端保持状态ã€?br /><br />ç”׃ºŽHTTP协议是无状态的åQŒè€Œå‡ºäºŽç§¿Uè€ƒè™‘ä¹Ÿä¸å¸Œæœ›ä½¿ä¹‹æˆäØ“æœ‰çŠ¶æ€çš„åQŒå› æ­¤ï¼ŒåŽé¢ä¸¤ç§æ–ÒŽ¡ˆž®±æˆä¸ºçŽ°å®žçš„é€‰æ‹©ã€‚å…·ä½“æ¥è¯´cookie机制采用的是在客æˆïL«¯ä¿æŒçŠ¶æ€çš„æ–ÒŽ¡ˆåQŒè€Œsession机制采用的是在服务器端保持状态的æ–ÒŽ¡ˆã€‚同时我们也看到åQŒç”±äºŽé‡‡ç”¨æœåŠ¡å™¨ç«¯ä¿æŒçŠ¶æ€çš„æ–ÒŽ¡ˆåœ¨å®¢æˆïL«¯ä¹Ÿéœ€è¦ä¿å­˜ä¸€ä¸ªæ ‡è¯†ï¼Œæ‰€ä»¥session机制可能需要借助于cookie机制来达åˆîC¿å­˜æ ‡è¯†çš„目的åQŒä½†å®žé™…上它˜q˜æœ‰å…¶ä»–选择ã€?br /><br />三、理解cookie机制 <br />cookie机制的基本原理就如上面的例子一æ ïL®€å•,但是˜q˜æœ‰å‡ ä¸ªé—®é¢˜éœ€è¦è§£å†»I¼šâ€œä¼šå‘˜å¡â€å¦‚何分发;“会员卡”的内容åQ›ä»¥åŠå®¢æˆ·å¦‚何ä‹É用“会员卡”ã€?br /><br />正统的cookie分发是通过扩展HTTP协议来实现的åQŒæœåŠ¡å™¨é€šè¿‡åœ¨HTTP的响应头中加上一行特ŒDŠçš„æŒ‡ç¤ºä»¥æ½Cºæµè§ˆå™¨æŒ‰ç…§æŒ‡ç¤ºç”Ÿæˆç›¸åº”çš„cookie。然而纯¾_¹çš„客户端脚本如JavaScript或者VBScript也可以生成cookieã€?br /><br />而cookie çš„ä‹É用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器‹‚€æŸ¥æ‰€æœ‰å­˜å‚¨çš„cookieåQŒå¦‚果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置åQŒåˆ™æŠŠè¯¥cookie附在è¯äh±‚资源的HTTPè¯äh±‚头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示åQŒå¦‚果某家分店还发行了自å·Þqš„会员卡,那么˜q›è¿™å®¶åº—的时候除了要出示麦当劳的会员卡,˜q˜è¦å‡ºç¤º˜q™å®¶åº—的会员卡ã€?br /><br />cookie的内容主要包括:名字åQŒå€û|¼Œ˜q‡æœŸæ—‰™—´åQŒèµ\径和域ã€?br />其中域可以指定某一个域比如.google.comåQŒç›¸å½“于æ€Õdº—招牌åQŒæ¯”如宝‹zå…¬å¸ï¼Œä¹Ÿå¯ä»¥æŒ‡å®šä¸€ä¸ªåŸŸä¸‹çš„具体某台机器比如www.google.com或者froogle.google.comåQŒå¯ä»¥ç”¨é£˜æŸ”来做比ã€?br />路径ž®±æ˜¯è·Ÿåœ¨åŸŸååŽé¢çš„URL路径åQŒæ¯”å¦?或è€?foo½{‰ç­‰åQŒå¯ä»¥ç”¨æŸé£˜æŸ”专柜做比ã€?br />路径与域合在一起就构成了cookie的作用范围ã€?br />如果不设¾|®è¿‡æœŸæ—¶é—ß_¼Œåˆ™è¡¨½Cø™¿™ä¸ªcookie的生命期为浏览器会话期间åQŒåªè¦å…³é—­æµè§ˆå™¨½H—口åQŒcookiež®±æ¶ˆå¤×ƒº†ã€‚è¿™¿Uç”Ÿå‘½æœŸä¸ºæµè§ˆå™¨ä¼šè¯æœŸçš„ cookie被称ä¸ÞZ¼šè¯cookie。会话cookie一般不存储在硬盘上而是保存在内存里åQŒå½“ç„¶è¿™¿Uè¡Œä¸ºåƈ不是规范规定的。如果设¾|®äº†˜q‡æœŸæ—‰™—´åQŒæµè§ˆå™¨ž®×ƒ¼šæŠŠcookie保存到硬盘上åQŒå…³é—­åŽå†æ¬¡æ‰“å¼€‹¹è§ˆå™¨ï¼Œ˜q™äº›cookie仍然有效直到­‘…过讑֮šçš„过期时间ã€?br /><br />存储在硬盘上的cookie 可以在不同的‹¹è§ˆå™¨è¿›½E‹é—´å…׃ínåQŒæ¯”如两个IE½H—口。而对于保存在内存里的cookieåQŒä¸åŒçš„‹¹è§ˆå™¨æœ‰ä¸åŒçš„处理方式。对于IEåQŒåœ¨ä¸€ä¸ªæ‰“开的窗口上æŒ?Ctrl-NåQˆæˆ–者从文äšg菜单åQ‰æ‰“开的窗口可以与原窗口共享,而ä‹É用其他方式新开的IE˜q›ç¨‹åˆ™ä¸èƒ½å…±äº«å·²¾læ‰“开的窗口的内存cookieåQ›å¯¹äº?Mozilla Firefox0.8åQŒæ‰€æœ‰çš„˜q›ç¨‹å’Œæ ‡½{ùN¡µéƒ½å¯ä»¥å…±äº«åŒæ ïLš„cookie。一般来说是用javascriptçš„window.open打开的窗口会与原½H—口å…׃ín内存cookie。浏览器对于会话cookie的这¿Uåªè®¤cookie不认人的处理方式¾lå¸¸¾l™é‡‡ç”¨session机制的web应用½E‹åºå¼€å‘者造成很大的困扰ã€?br /><br />下面ž®±æ˜¯ä¸€ä¸ªgoolge讄¡½®cookie的响应头的例å­?br />HTTP/1.1 302 Found<br />Location: http://www.google.com/intl/zh-CN/<br />Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com<br />Content-Type: text/html<br /><img height="293" alt="image002.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image002.jpg" width="408" border="0" /><br />˜q™æ˜¯ä½¿ç”¨HTTPLook˜q™ä¸ªHTTP Sniffer软äšg来俘èŽïLš„HTTP通讯¾Uªå½•的一部分<br /><img height="344" alt="image004.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image004.jpg" width="432" border="0" /><br />‹¹è§ˆå™¨åœ¨å†æ¬¡è®‰K—®goolge的资源时自动向外发送cookie<br /><img height="305" alt="image006.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image006.jpg" width="421" border="0" /><br />使用Firefox可以很容易的观察现有的cookieçš„å€?br />使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理ã€?br /><img height="248" alt="image008.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image008.jpg" width="324" border="0" /><br />IE也可以设¾|®åœ¨æŽ¥å—cookie前询é—?br /><img height="249" alt="image010.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image010.jpg" width="239" border="0" /><br />˜q™æ˜¯ä¸€ä¸ªè¯¢é—®æŽ¥å—cookie的对话框ã€?br />四、理解session机制<br />session机制是一¿UæœåŠ¡å™¨ç«¯çš„æœºåˆ¶åQŒæœåŠ¡å™¨ä½¿ç”¨ä¸€¿Uç±»ä¼égºŽæ•£åˆ—表的¾l“æž„åQˆä¹Ÿå¯èƒ½ž®±æ˜¯ä½¿ç”¨æ•£åˆ—表)来保存信息ã€?br /><br />å½“ç¨‹åºéœ€è¦äØ“æŸä¸ªå®¢æˆ·ç«¯çš„è¯äh±‚创徏一个session的时候,服务器首先检查这个客æˆïL«¯çš„请求里是否已包含了一个session标识 - ¿UîCØ“ session idåQŒå¦‚果已包含一个session id则说明以前已¾läؓ此客æˆïL«¯åˆ›å¾˜q‡sessionåQŒæœåС噍ž®±æŒ‰ç…§session id把这ä¸?session‹‚€ç´¢å‡ºæ¥ä‹É用(如果‹‚€ç´¢ä¸åˆŽÍ¼Œå¯èƒ½ä¼šæ–°å»ÞZ¸€ä¸ªï¼‰åQŒå¦‚果客æˆïL«¯è¯äh±‚不包含session idåQŒåˆ™ä¸ºæ­¤å®¢æˆ·ç«¯åˆ›å»ÞZ¸€ä¸ªsessionòq¶ä¸”生成一个与此session相关联的session idåQŒsession id的值应该是一个既不会重复åQŒåˆä¸å®¹æ˜“被扑ֈ°è§„律以仿造的字符ä¸ÔŒ¼Œ˜q™ä¸ª session idž®†è¢«åœ¨æœ¬‹Æ¡å“åº”中˜q”回¾l™å®¢æˆïL«¯ä¿å­˜ã€?br /><br />保存˜q™ä¸ªsession id的方式可以采用cookieåQŒè¿™æ ·åœ¨äº¤äº’˜q‡ç¨‹ä¸­æµè§ˆå™¨å¯ä»¥è‡ªåŠ¨çš„æŒ‰ç…§è§„åˆ™æŠŠ˜q™ä¸ªæ ‡è¯†å‘挥¾l™æœåŠ¡å™¨ã€‚ä¸€èˆ¬è¿™ä¸ªcookie的名字都是类ä¼égºŽSEEESIONIDåQŒè€Œã€‚比如weblogic对于web应用½E‹åºç”Ÿæˆçš„cookieåQŒJSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764åQŒå®ƒçš„名字就æ˜?JSESSIONIDã€?br /><br />ç”׃ºŽcookie可以被äh为的¼›æ­¢åQŒå¿…™åÀLœ‰å…¶ä»–机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一¿UæŠ€æœ¯å«åšURL重写åQŒå°±æ˜¯æŠŠsession id直接附加在URL路径的后面,附加方式也有两种åQŒä¸€¿Uæ˜¯ä½œäØ“URL路径的附加信息,表现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764<br />另一¿Uæ˜¯ä½œäؓ查询字符串附加在URL后面åQŒè¡¨çްåÅžå¼äØ“http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764<br />˜q™ä¸¤¿Uæ–¹å¼å¯¹äºŽç”¨æˆäh¥è¯´æ˜¯æ²¡æœ‰åŒºåˆ«çš„,只是服务器在解析的时候处理的方式不同åQŒé‡‡ç”¨ç¬¬ä¸€¿Uæ–¹å¼ä¹Ÿæœ‰åˆ©äºŽæŠŠsession id的信息和正常½E‹åºå‚数区分开来ã€?br />ä¸ÞZº†åœ¨æ•´ä¸ªäº¤äº’过½E‹ä¸­å§‹ç»ˆä¿æŒçŠ¶æ€ï¼Œž®±å¿…™åÕdœ¨æ¯ä¸ªå®¢æˆ·ç«¯å¯èƒ½è¯·æ±‚的路径后面都包含这个session idã€?br /><br />另一¿UæŠ€æœ¯å«åšè¡¨å•隐藏字ŒDüc€‚就是服务器会自动修改表单,æ·ÕdŠ ä¸€ä¸ªéšè—å­—ŒDµï¼Œä»¥ä¾¿åœ¨è¡¨å•提交时能够把session id传递回服务器。比如下面的表单<br /><form name="testform" action="/xxx"><br /><input type="text"><br /></form><br />在被传递给客户端之前将被改写成<br /><form name="testform" action="/xxx"><br /><input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"><br /><input type="text"><br /></form><br />˜q™ç§æŠ€æœ¯çŽ°åœ¨å·²è¾ƒå°‘åº”ç”¨åQŒç¬”者接触过的很古老的iPlanet6(SunONE应用服务器的前èín)ž®×ƒ‹É用了˜q™ç§æŠ€æœ¯ã€?br />实际上这¿UæŠ€æœ¯å¯ä»¥ç®€å•的用对action应用URL重写来代æ›Ñ€?br /><br />在谈论session机制的时候,常常听到˜q™æ ·ä¸€¿Uè¯¯è§£â€œåªè¦å…³é—­æµè§ˆå™¨åQŒsessionž®±æ¶ˆå¤×ƒº†â€ã€‚其实可以想象一下会员卡的例子,除非™å‘Ö®¢ä¸ÕdŠ¨å¯¹åº—å®¶æå‡ºé”€å¡ï¼Œå¦åˆ™åº—å®¶¾lå¯¹ä¸ä¼šè½ÀL˜“删除™å‘Ö®¢çš„资料。对session来说也是一æ ïLš„åQŒé™¤éžç¨‹åºé€šçŸ¥æœåŠ¡å™¨åˆ é™¤ä¸€ä¸ªsessionåQŒå¦åˆ™æœåŠ¡å™¨ä¼šä¸€ç›´ä¿ç•™ï¼Œ½E‹åºä¸€èˆ¬éƒ½æ˜¯åœ¨ç”¨æˆ·åšlog off的时候发个指令去删除session。然而浏览器从来不会ä¸ÕdŠ¨åœ¨å…³é—­ä¹‹å‰é€šçŸ¥æœåŠ¡å™¨å®ƒž®†è¦å…³é—­åQŒå› æ­¤æœåС噍æ ÒŽœ¬ä¸ä¼šæœ‰æœºä¼šçŸ¥é“浏览器已经关闭åQŒä¹‹æ‰€ä»¥ä¼šæœ‰è¿™¿Ué”™è§‰ï¼Œæ˜¯å¤§éƒ¨åˆ†session机制都ä‹É用会话cookie来保存session idåQŒè€Œå…³é—­æµè§ˆå™¨åŽè¿™ä¸?session idž®±æ¶ˆå¤×ƒº†åQŒå†‹Æ¡è¿žæŽ¥æœåŠ¡å™¨æ—¶ä¹Ÿž®±æ— æ³•找到原来的session。如果服务器讄¡½®çš„cookie被保存到¼‹¬ç›˜ä¸Šï¼Œæˆ–者ä‹É用某¿Uæ‰‹ŒD‰|”¹å†™æµè§ˆå™¨å‘出的HTTPè¯äh±‚å¤ß_¼ŒæŠŠåŽŸæ¥çš„session id发送给服务器,则再‹Æ¡æ‰“å¼€‹¹è§ˆå™¨ä»ç„¶èƒ½å¤Ÿæ‰¾åˆ°åŽŸæ¥çš„sessionã€?br /><br />æ°æ°æ˜¯ç”±äºŽå…³é—­æµè§ˆå™¨ä¸ä¼šå¯ÆD‡´session被删除,˜q«ä‹ÉæœåŠ¡å™¨äØ“seesion讄¡½®äº†ä¸€ä¸ªå¤±æ•ˆæ—¶é—ß_¼Œå½“距¼›Õd®¢æˆïL«¯ä¸Šä¸€‹Æ¡ä‹É用session的时间超˜q‡è¿™ä¸ªå¤±æ•ˆæ—¶é—´æ—¶åQŒæœåС噍ž®±å¯ä»¥è®¤ä¸ºå®¢æˆïL«¯å·²ç»åœæ­¢äº†æ´»åŠ¨ï¼Œæ‰ä¼šæŠŠsession删除以节省存储空间ã€?br /><br />五、理解javax.servlet.http.HttpSession<br />HttpSession是Javaòq›_°å¯¹sessionæœºåˆ¶çš„å®žçŽ°è§„èŒƒï¼Œå› äØ“å®ƒä»…ä»…æ˜¯ä¸ªæŽ¥å£ï¼Œå…·ä½“åˆ°æ¯ä¸ªweb应用服务器的提供商,除了对规范支持之外,仍然会有一些规范里没有规定的细微差异。这里我们以BEAçš„Weblogic Server8.1ä½œäØ“ä¾‹å­æ¥æ¼”½Cºã€?br /><br />首先åQŒWeblogic Server提供了一¾pÕdˆ—的参数来控制它的HttpSession的实玎ͼŒåŒ…括使用cookie的开关选项åQŒä‹É用URL重写的开关选项åQŒsession持久化的讄¡½®åQŒsession失效旉™—´çš„设¾|®ï¼Œä»¥åŠé’ˆå¯¹cookie的各¿Uè®¾¾|®ï¼Œæ¯”如讄¡½®cookie的名字、èµ\径、域åQ?cookie的生存时间等ã€?br /><br />一般情况下åQŒsession都是存储在内存里åQŒå½“服务器进½E‹è¢«åœæ­¢æˆ–者重启的时候,内存里的session也会被清½Iºï¼Œå¦‚果讄¡½®äº†session的持久化ç‰ÒŽ€§ï¼ŒæœåŠ¡å™¨å°±ä¼šæŠŠsession保存到硬盘上åQŒå½“服务器进½E‹é‡æ–°å¯åŠ¨æˆ–˜q™äº›ä¿¡æ¯ž®†èƒ½å¤Ÿè¢«å†æ¬¡ä½¿ç”¨åQ?Weblogic Server支持的持久性方式包括文件、数据库、客æˆïL«¯cookie保存和复制ã€?br /><br />å¤åˆ¶ä¸¥æ ¼è¯´æ¥ä¸ç®—æŒä¹…åŒ–ä¿å­˜ï¼Œå› äØ“session实际上还是保存在内存里,不过同样的信息被复制到各个cluster内的服务器进½E‹ä¸­åQŒè¿™æ ·å³ä½¿æŸä¸ªæœåС噍˜q›ç¨‹åœæ­¢å·¥ä½œä¹Ÿä»ç„¶å¯ä»¥ä»Žå…¶ä»–˜q›ç¨‹ä¸­å–å¾—sessionã€?br /><br />cookie生存旉™—´çš„设¾|®åˆ™ä¼šåª„响浏览器生成的cookie是否是一个会话cookie。默认是使用会话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解ã€?br /><br />cookieçš„èµ\径对于web应用½E‹åºæ¥è¯´æ˜¯ä¸€ä¸ªéžå¸”R‡è¦çš„选项åQŒWeblogic Server对这个选项的默认处理方式ä‹É得它与其他服务器有明昄¡š„区别。后面我们会专题讨论ã€?br /><br />关于session的设¾|®å‚考[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869<br /><br />六、HttpSession常见问题<br />åQˆåœ¨æœ¬å°èЂ䏭sessionçš„å«ä¹‰äØ“â‘¤å’Œâ‘¥çš„æ··åˆåQ?br /><br /><br />1、session在何时被创徏<br />一个常见的误解是以为session在有客户端访问时ž®Þp¢«åˆ›å¾åQŒç„¶è€Œäº‹å®žæ˜¯ç›´åˆ°æŸserver端程序调ç”?HttpServletRequest.getSession(true)˜q™æ ·çš„语句时才被创徏åQŒæ³¨æ„å¦‚æžœJSP没有昄¡¤ºçš„ä‹É用Â?lt;% @page session="false"%> 关闭sessionåQŒåˆ™JSPæ–‡äšg在编译成Servlet时将会自动加上这样一条语å?HttpSession session = HttpServletRequest.getSession(true);˜q™ä¹Ÿæ˜¯JSP中隐含的 session对象的来历ã€?br /><br />ç”׃ºŽsession会消耗内存资源,因此åQŒå¦‚果不打算使用sessionåQŒåº”该在所有的JSP中关闭它ã€?br /><br />2、session何时被删é™?br />¾l¼åˆå‰é¢çš„讨论,session在下列情况下被删除a.½E‹åºè°ƒç”¨HttpSession.invalidate();或b.距离上一‹Æ¡æ”¶åˆ°å®¢æˆïL«¯å‘送的session idæ—‰™—´é—´éš”­‘…过了session的超时设¾|?或c.服务器进½E‹è¢«åœæ­¢åQˆéžæŒä¹…sessionåQ?br /><br />3、如何做到在‹¹è§ˆå™¨å…³é—­æ—¶åˆ é™¤session<br />严格的讲åQŒåšä¸åˆ°˜q™ä¸€ç‚V€‚可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进½E‹è¿™äº›éžå¸¸è§„手段仍然无能为力ã€?br /><br />4、有个HttpSessionListener是怎么回事<br />ä½ å¯ä»¥åˆ›å»ø™¿™æ ïLš„listeneråŽÈ›‘控session的创建和销毁事ä»Óž¼Œä½¿å¾—在发生这æ ïLš„事äšg时你可以做一些相应的工作。注意是session的创建和销毁动作触发listeneråQŒè€Œä¸æ˜¯ç›¸åã€‚类似的与HttpSession有关的listener˜q˜æœ‰ HttpSessionBindingListeneråQŒHttpSessionActivationListenerå’?HttpSessionAttributeListenerã€?br /><br />5、存攑֜¨session中的对象必须是可序列化的å?br />ä¸æ˜¯å¿…éœ€çš„ã€‚è¦æ±‚å¯¹è±¡å¯åºåˆ—åŒ–åªæ˜¯äØ“äº†session能够在集¾Ÿ¤ä¸­è¢«å¤åˆ¶æˆ–者能够持久保存或者在必要时server能够暂时把session交换出内存。在 Weblogic Serverçš„session中放¾|®ä¸€ä¸ªä¸å¯åºåˆ—化的对象在控制åîC¸Šä¼šæ”¶åˆîC¸€ä¸ªè­¦å‘Šã€‚我所用过的某个iPlanet版本如果 session中有不可序列化的对象åQŒåœ¨session销毁时会有一个ExceptionåQŒå¾ˆå¥‡æ€ªã€?br /><br />6、如何才能正¼‹®çš„应付客户端禁止cookie的可能æ€?br />å¯Òމ€æœ‰çš„URL使用URL重写åQŒåŒ…括超链接åQŒformçš„actionåQŒå’Œé‡å®šå‘çš„URLåQŒå…·ä½“做法参见[6]<br />http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770<br /><br />7、开两个‹¹è§ˆå™¨çª—口访问应用程序会使用同一个session˜q˜æ˜¯ä¸åŒçš„session<br />参见½W¬ä¸‰ž®èЂ坹cookie的讨论,对session来说是只认id不认人,因此不同的浏览器åQŒä¸åŒçš„½H—口打开方式以及不同的cookie存储方式都会对这个问题的½{”案有媄响ã€?br /><br />8、如何防止用æˆäh‰“开两个‹¹è§ˆå™¨çª—口操作导致的sessionæ··äØ•<br />˜q™ä¸ªé—®é¢˜ä¸Žé˜²æ­¢è¡¨å•多‹Æ¡æäº¤æ˜¯¾cÖM¼¼çš„,可以通过讄¡½®å®¢æˆ·ç«¯çš„令牌来解冟뀂就是在服务器每‹Æ¡ç”Ÿæˆä¸€ä¸ªä¸åŒçš„id˜q”回¾l™å®¢æˆïL«¯åQŒåŒæ—¶ä¿å­˜åœ¨session里,客户端提交表单时必须把这个id也返回服务器åQŒç¨‹åºé¦–先比较返回的id与保存在session里的值是否一è‡ß_¼Œå¦‚果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表½Cºå±‚模式的部分。需要注意的是对于ä‹É用javascript window.open打开的窗口,一般不讄¡½®˜q™ä¸ªidåQŒæˆ–者ä‹É用单独的idåQŒä»¥é˜²ä¸»½H—口无法操作åQŒå¾è®®ä¸è¦å†window.open打开的窗口里做修æ”ÒŽ“ä½œï¼Œ˜q™æ ·ž®±å¯ä»¥ä¸ç”¨è®¾¾|®ã€?br /><br />9ã€äØ“ä»€ä¹ˆåœ¨Weblogic Server中改变session的值后要重新调用一‹Æ¡session.setValue<br />做这个动作主要是ä¸ÞZº†åœ¨é›†¾Ÿ¤çŽ¯å¢ƒä¸­æç¤ºWeblogic Server session中的值发生了改变åQŒéœ€è¦å‘其他服务器进½E‹å¤åˆ¶æ–°çš„session倹{€?br /><br />10ã€äØ“ä»€ä¹ˆsession不见äº?br />排除session正常失效的因素之外,服务器本íw«çš„可能性应该是微乎其微的,虽然½W”者在iPlanet6SP1加若òq²è¡¥ä¸çš„Solaris版本上倒也遇到˜q‡ï¼›‹¹è§ˆå™¨æ’件的可能性次之,½W”者也遇到˜q?721插äšg造成的问题;理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题ã€?br />出现˜q™ä¸€é—®é¢˜çš„大部分原因都是½E‹åºçš„é”™è¯¯ï¼Œæœ€å¸¸è§çš„å°±æ˜¯åœ¨ä¸€ä¸ªåº”ç”¨ç¨‹åºä¸­åŽ»è®¿é—®å¦å¤–ä¸€ä¸ªåº”ç”¨ç¨‹åºã€‚æˆ‘ä»¬åœ¨ä¸‹ä¸€èŠ‚è®¨è®ø™¿™ä¸ªé—®é¢˜ã€?br /><br />七、跨应用½E‹åºçš„sessionå…׃ín<br /><br />常常有这æ ïLš„æƒ…况åQŒä¸€ä¸ªå¤§™å¹ç›®è¢«åˆ†å‰²æˆè‹¥å¹²ž®é¡¹ç›®å¼€å‘,ä¸ÞZº†èƒ½å¤Ÿäº’不òq²æ‰°åQŒè¦æ±‚每个小™å¹ç›®ä½œäؓ一个单独的web应用½E‹åºå¼€å‘,可是åˆîCº†æœ€åŽçªç„¶å‘现某几个ž®é¡¹ç›®ä¹‹é—´éœ€è¦å…±äº«ä¸€äº›ä¿¡æ¯ï¼Œæˆ–者想使用session来实现SSO(single sign on)åQŒåœ¨session中保存login的用户信息,最自然的要求是应用½E‹åºé—´èƒ½å¤Ÿè®¿é—®å½¼æ­¤çš„sessionã€?br /><br />然而按照Servlet规范åQŒsession的作用范围应该仅仅限于当前应用程序下åQŒä¸åŒçš„应用½E‹åºä¹‹é—´æ˜¯ä¸èƒ½å¤Ÿäº’相讉K—®å¯ÒŽ–¹çš„session的。各个应用服务器从实际效果上都遵守了˜q™ä¸€è§„范åQŒä½†æ˜¯å®žçŽ°çš„¾l†èŠ‚å´å¯èƒ½å„æœ‰ä¸åŒï¼Œå› æ­¤è§£å†³è·¨åº”ç”¨ç¨‹åºsessionå…׃ín的方法也各不相同ã€?br /><br />首先来看一下Tomcat是如何实现web应用½E‹åºä¹‹é—´session的隔¼›Èš„åQŒä»Ž Tomcat讄¡½®çš„cookie路径来看åQŒå®ƒå¯¹ä¸åŒçš„应用½E‹åºè®„¡½®çš„cookie路径是不同的åQŒè¿™æ ·ä¸åŒçš„应用½E‹åºæ‰€ç”¨çš„session id是不同的åQŒå› æ­¤å³ä½¿åœ¨åŒä¸€ä¸ªæµè§ˆå™¨½H—口里访问不同的应用½E‹åºåQŒå‘送给服务器的session id也可以是不同的ã€?br /><br /><img height="219" alt="image012.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image012.jpg" width="288" border="0" /><img height="215" alt="image014.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image014.jpg" width="257" border="0" /><br />  <br /><br />æ ÒŽ®˜q™ä¸ªç‰ÒŽ€§ï¼Œæˆ‘们可以推测Tomcat中session的内存结构大致如下ã€?br /><br /><img height="278" alt="image016.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image016.jpg" width="444" border="0" /><br /> <br /><br />½W”者以前用˜q‡çš„iPlanet也采用的是同æ ïLš„æ–¹å¼åQŒä¼°è®¡SunONE与iPlanet之间不会有太大的差别。对于这¿Uæ–¹å¼çš„æœåŠ¡å™¨ï¼Œè§£å†³çš„æ€èµ\很简单,实际实行èµäh¥ä¹Ÿä¸éš¾ã€‚要么让所有的应用½E‹åºå…׃ín一个session idåQŒè¦ä¹ˆè®©åº”用½E‹åºèƒ½å¤ŸèŽ·å¾—å…¶ä»–åº”ç”¨½E‹åºçš„session idã€?br /><br />iPlanet中有一¿Uå¾ˆ½Ž€å•çš„æ–ÒŽ³•来实现共享一个session idåQŒé‚£ž®±æ˜¯æŠŠå„个应用程序的cookie路径都设ä¸?åQˆå®žé™…上应该æ˜?NASAppåQŒå¯¹äºŽåº”用程序来讲它的作用相当于根)ã€?br /><session-info><br /><path>/NASApp</path><br /></session-info><br /><br />需要注意的是,操作å…׃ínçš„session应该遵åó@一些编½E‹çº¦å®šï¼Œæ¯”如在session attribute名字的前面加上应用程序的前缀åQŒä‹Éå¾?setAttribute("name", "neo")变成setAttribute("app1.name", "neo")åQŒä»¥é˜²æ­¢å‘½å½Iºé—´å†²çªåQŒå¯¼è‡´äº’相覆盖ã€?br /><br /><br />在Tomcat中则没有˜q™ä¹ˆæ–¹ä¾¿çš„选择。在Tomcat版本3上,我们˜q˜å¯ä»¥æœ‰ä¸€äº›æ‰‹ŒD‰|¥å…׃ínsession。对于版æœ?以上的TomcatåQŒç›®å‰ç¬”者尚未发现简单的办法。只能借助于第三方的力量,比如使用文äšg、数据库、JMS或者客æˆïL«¯cookieåQŒURL参数或者隐藏字ŒD늭‰æ‰‹æ®µã€?br /><br />我们再看一下Weblogic Server是如何处理sessionçš„ã€?br /><br /><br />  <img height="208" alt="image018.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image018.jpg" width="288" border="0" /><img height="207" alt="image020.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image020.jpg" width="269" border="0" /><br /><br />从截屏画面上可以看到Weblogic Serverå¯Òމ€æœ‰çš„应用½E‹åºè®„¡½®çš„cookieçš„èµ\径都æ˜?åQŒè¿™æ˜¯ä¸æ˜¯æ„å‘³ç€åœ¨Weblogic Server中默认的ž®±å¯ä»¥å…±äº«session了呢åQŸç„¶è€Œä¸€ä¸ªå°å®žéªŒå›_¯è¯æ˜Žå³ä‹É不同的应用程序ä‹É用的是同一个sessionåQŒå„个应用程序仍然只能访问自己所讄¡½®çš„那些属性。这说明Weblogic Server中的session的内存结构可能如ä¸?br /><br /><img height="290" alt="image022.jpg" src="http://www.aygfsteel.com/images/blogjava_net/esprit/image022.jpg" width="420" border="0" /><br /> <br /><br />对于˜q™æ ·ä¸€¿Uç»“构,åœ?session机制本èín上来解决sessionå…׃ín的问题应该是不可能的了。除了借助于第三方的力量,比如使用文äšg、数据库、JMS或者客æˆïL«¯ cookieåQŒURL参数或者隐藏字ŒD늭‰æ‰‹æ®µåQŒè¿˜æœ‰ä¸€¿Uè¾ƒä¸ºæ–¹ä¾¿çš„做法åQŒå°±æ˜¯æŠŠä¸€ä¸ªåº”用程序的session攑ֈ°ServletContext中,˜q™æ ·å¦å¤–一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下,<br /><br />应用½E‹åºA<br />context.setAttribute("appA", session); <br /><br />应用½E‹åºB<br />contextA = context.getContext("/appA");<br />HttpSession sessionA = (HttpSession)contextA.getAttribute("appA"); <br /><br />值得注意的是˜q™ç§ç”¨æ³•不可¿UÀL¤åQŒå› ä¸ºæ ¹æ®ServletContextçš„JavaDocåQŒåº”用服务器可以处于安全的原因对于context.getContext("/appA");˜q”回½Iºå€û|¼Œä»¥ä¸Šåšæ³•在Weblogic Server 8.1中通过ã€?br /><br />那么Weblogic Serverä¸ÞZ»€ä¹ˆè¦æŠŠæ‰€æœ‰çš„应用½E‹åºçš„cookie路径都设ä¸?å‘¢ï¼ŸåŽŸæ¥æ˜¯äØ“äº†SSOåQŒå‡¡æ˜¯å…±äº«è¿™ä¸ªsession的应用程序都可以å…׃ín认证的信息。一个简单的实验ž®±å¯ä»¥è¯æ˜Žè¿™ä¸€ç‚¹ï¼Œä¿®æ”¹é¦–å…ˆç™Õd½•的那个应用程序的描述½W¦weblogic.xmlåQŒæŠŠcookie路径修改ä¸?appA 讉K—®å¦å¤–一个应用程序会重新要求ç™Õd½•åQŒå³ä½¿æ˜¯åè¿‡æ¥ï¼Œå…ˆè®¿é—®cookie路径ä¸?的应用程序,再访问修改过路径的这个,虽然不再提示ç™Õd½•åQŒä½†æ˜¯ç™»å½•的用户信息也会丢失。注意做˜q™ä¸ªå®žéªŒæ—¶è®¤è¯æ–¹å¼åº”该ä‹É用FORMåQŒå› ä¸ºæµè§ˆå™¨å’Œweb服务器对basic认证方式有其他的处理方式åQŒç¬¬äºŒæ¬¡è¯äh±‚的认证不是通过 session来实现的。具体请参看[7] secion 14.8 AuthorizationåQŒä½ å¯ä»¥ä¿®æ”¹æ‰€é™„çš„½CÞZ¾‹½E‹åºæ¥åš˜q™äº›è¯•验ã€?br /><br />八、æ€È»“<br />session机制本èínòq¶ä¸å¤æ‚åQŒç„¶è€Œå…¶å®žçŽ°å’Œé…¾|®ä¸Šçš„灵‹zÀL€§å´ä½¿å¾—具体情况复杂多变。这也要求我们不能把仅仅某一‹Æ¡çš„¾léªŒæˆ–者某一个浏览器åQŒæœåŠ¡å™¨çš„ç»éªŒå½“ä½œæ™®éé€‚ç”¨çš„ç»éªŒï¼Œè€Œæ˜¯å§‹ç»ˆéœ€è¦å…·ä½“æƒ…å†µå…·ä½“åˆ†æžã€?br /><br />关于作者:<br />郎云鹏(dev2dev ID: hippiewolfåQ‰ï¼Œè½¯äšg工程师,从事J2EEå¼€å?br />电子邮äšgåQšlangyunpeng@yahoo.com.cn<br />地址åQšå¤§˜qžèÊYä»¶å›­è·?1åïL§‘技大厦A座大˜qžåšæ¶µå’¨è¯¢æœåŠ¡æœ‰é™å…¬å?br /><br />参考文档:<br />[1] Preliminary Specification http://wp.netscape.com/newsref/std/cookie_spec.html<br />[2] RFC2109 http://www.rfc-editor.org/rfc/rfc2109.txt<br />[3] RFC2965 http://www.rfc-editor.org/rfc/rfc2965.txt<br />[4] The Unofficial Cookie FAQ http://www.cookiecentral.com/faq/<br />[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869<br />[6] http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770<br />[7] RFC2616 <a >http://www.rfc-editor.org/rfc/rfc2616.txt</a><br /><img src ="http://www.aygfsteel.com/esprit/aggbug/35817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/esprit/" target="_blank">esprit</a> 2006-03-17 13:43 <a href="http://www.aygfsteel.com/esprit/archive/2006/03/17/35817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下EclipseåQŒMyeclipse安装http://www.aygfsteel.com/esprit/archive/2006/01/19/28628.htmlespritespritThu, 19 Jan 2006 03:03:00 GMThttp://www.aygfsteel.com/esprit/archive/2006/01/19/28628.htmlhttp://www.aygfsteel.com/esprit/comments/28628.htmlhttp://www.aygfsteel.com/esprit/archive/2006/01/19/28628.html#Feedback2http://www.aygfsteel.com/esprit/comments/commentRss/28628.htmlhttp://www.aygfsteel.com/esprit/services/trackbacks/28628.html我这è¾ÒŽ˜¯ç”¨çš„æ˜¯eclipse3.1 + Myeclipse4.0ã€?BR>
下蝲必要的èÊYä»Óž¼š
      eclipse-SDK-3.1-linux-gtk.tar.gzåQ?A >http://download.eclipse.org/eclipse/downloads/drops/R-3.1-200506271435/index.php
   EnterpriseWorkbenchInstaller_4.0GA_E3.1.binåQ?A >http://downloads.myeclipseide.com/downloads/products/eworkbench/4.0GA/EnterpriseWorkbenchInstaller_4.0GA_E3.1.bin
   myeclipse_4_0_keygen.exeåQ?A >http://www.matrix.org.cn/resource/upload/content/2005_09_02_094042_poSETmYBSq.rar

安装EclipseåQ?BR>
   å…¶å®žå®‰è£…Eclipse˜q˜æ˜¯è›®ç®€å•çš„åQŒæˆ‘˜q™è¾¹ž®†å…¶è§£åŽ‹åˆ?usr/java目录ä¸?BR>   [root@esprit java]tar -zxvf /PATH/eclipse-SDK-3.1-linux-gtk.tar.gz
   ˜q™é‡ŒPATH是你存放eclipse-SDK-3.1-linux-gtk.tar.gz的目录,解压后,åœ?usr/java目录下就有了eclipse˜q™ä¸ªç›®å½•
   æŽ¥ä¸‹æ¥ï¼Œæˆ‘来为eclipse创徏一个图形界面快速启动项åQˆç±»ä¼égºŽwindows下的桌面快捷方式åQ‰ï¼Œå›_‡»å›‘ÖŞ界面——〉选择"新徏启动å™?New Launcher)"——〉名¿UŽÍ¼ˆNameåQ‰è¾“å…¥Eclipse——〉命令(CommandåQ‰é€‰æ‹©Eclipse解压目录/usr/java/eclipse——〉图标(IconåQ‰å¯ä»¥é€‰æ‹©Eclipse的图标——〉点å‡È¡®å®šå®Œæˆï¼Œç„¶åŽä½ å°±å¯ä»¥åŒå‡»å›‘ÖŞ界面中的快速启动来启动你的eclipse了,当然也可以在shell下执行eclipse根目录下的执行文件来启动eclipseåQ?BR>   eclipse启动后还需要一些必要的配置åQŒè¿™é‡Œå°±ä¸è®²äº?

安装MyeclipseåQ?BR>
   ä¸‹é¢æ¥å®‰è£…MyeclipseåQŒMyeclipse的安装跟windows下的安装òq¶æ— å¤šå¤§åŒºåˆ«
   shell下执è¡?SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">EnterpriseWorkbenchInstaller_4.0GA_E3.1.binæ–‡äšgåQ?BR>   [root@esprit java]# ./PATH/EnterpriseWorkbenchInstaller_4.0GA_E3.1.bin
   æŒ‰å›žè½¦åŽå®ƒä¼šå…ˆæ£€‹¹‹ä½ ¾pȝ»Ÿä¸­çš„环境åQŒå¾…‹‚€‹¹‹å®Œæ¯•,正常的话会出现Myeclipse安装画面åQŒè¿™ä¸‹æ¥çš„æ“ä½œè·Ÿwindows下的操作是一æ ïLš„åQŒè¿™é‡Œé¢ä¼šå…ˆè®©ä½ é€‰æ‹©eclipse的安装目录,我这里就æ˜?usr/java/eclipseåQŒç„¶åŽå†é€‰æ‹©å®‰è£…目录åQŒè¾“å…?usr/java/myeclipseåQŒç„¶åŽä¸€è·¯nextž®Þp¡Œäº?^_^
   å®‰è£…完成后,启动eclipseåQŒç‚¹å‡»èœå•项Help——〉Software Updates——〉Manager Configuration
   åœ¨æ‰“开的窗口中可以看到已经有myeclipse在那里了
   æŽ¥ç€æˆ‘们来运行myeclipse_4_0_keygen.exeåQŒè¿™ä¸ªæˆ‘是在windows下执行的åQŒå¾—到注册码后,eclipse中选择Myeclipse——〉Update SubscriptionåQŒå¼¹å‡ºçš„½H—口中输入刚才得到的注册码确定,完成注册åQ?BR>
配置TomcatåQ?BR>
   eclipse中选择window——〉preferencesåQŒåœ¨å¼¹å‡ºçš„窗口选择Myeclipse——〉Application Servers——〉Tomcat5
接着在Tomcat server˜q™é‡Œé€‰æ‹©"Enable",下面Tomcat Home Directory选择你tomcat安装的目录,然后右下角的Apply应用åQŒç¡®å®šé€€å‡ºï¼åQˆlinux˜q˜ä¸å¤ªç†ŸåQŒå°±ä¸æˆªå›¾äº† åQ?BR>
到这里,Java 开发的环境½Ž—是搭徏完了åQŒå¯ä»¥åšä½ æƒ³åšäº†åQ?IMG height=19 src="http://www.aygfsteel.com/Emoticons/teeth_smile.gif" width=19 border=0>
   


esprit 2006-01-19 11:03 发表评论
]]>
Linux下TomcatåQŒMysql安装http://www.aygfsteel.com/esprit/archive/2006/01/18/28536.htmlespritespritWed, 18 Jan 2006 09:35:00 GMThttp://www.aygfsteel.com/esprit/archive/2006/01/18/28536.htmlhttp://www.aygfsteel.com/esprit/comments/28536.htmlhttp://www.aygfsteel.com/esprit/archive/2006/01/18/28536.html#Feedback1http://www.aygfsteel.com/esprit/comments/commentRss/28536.htmlhttp://www.aygfsteel.com/esprit/services/trackbacks/28536.html
1.下蝲相关软äšgåQ?BR>      jakarta-tomcat-5.0.28.tar.gz:http://mirror.vmmatrix.net/apache/tomcat/tomcat-5/v5.0.28/bin/jakarta-tomcat-5.0.28.tar.gz
   mysql-standard-5.0.18-linux-i686-glibc23.tar.gz:http://dev.mysql.com/downloads/mysql/5.0.html
   æˆ‘下载的都是源码包,所以解压到指定目录卛_¯
2.先来安装mysqlåQ?BR>   [root@esprit local]# groupadd mysql               #æ·ÕdŠ ä¸€ä¸ªç”¨æˆïL»„mysql
   [root@esprit local]# useradd -g mysql mysql      #æ·ÕdŠ ä¸€ä¸ªç”¨æˆ·mysql到组mysql
   [root@esprit local]# tar -zxvf /PATH/mysql-standard-5.0.18-linux-i686-glibc23.tar.gz    #˜q™é‡Œçš„PATH是你的mysql包放¾|®çš„目录åQŒæˆ‘˜q™é‡Œè§£åŽ‹åˆ?usr/local目录ä¸?BR>   [root@esprit local]# ln -s mysql-standard-5.0.18-linux-i686-glibc23 mysql      #创徏一个文仉™“¾æŽ?BR>   [root@esprit local]# cd mysql
   [root@esprit mysql]# scripts/mysql_install_db --user=mysql            #初始化数据库åQˆåˆ›å»ºæ•°æ®åº“和表åQ?BR>   ä¿®æ”¹æ–‡äšg的所有者:   
   [root@esprit mysql]# chown -R root .
   [root@esprit mysql]# chown -R mysql data
   [root@esprit mysql]# chgrp -R mysql .
   æŽ¥ä¸‹æ¥æˆ‘们可以启动mysql了:
   [root@esprit mysql]# bin/mysqld_safe --user=mysql &
   å¯åŠ¨åŽæˆ‘ä»¬å¯ä»¥ä‹É用mysql -u root -p ç™Õd…¥åQŒé»˜è®¤å¯†ç äØ“½I?BR>   å¯ä»¥é€šè¿‡mysqladmin -u root -p password æ–°å¯†ç æ¥ä¿®æ”¹å¯†ç 
   å¥½äº†åQŒmysql的安装就到这里!
3.安装TomcatåQ?BR>   [root@esprit java]# tar -zxvf /PATH/jakarta-tomcat-5.0.28.tar.gz      #同样˜q™é‡Œçš„PATH是你tomcat包放¾|®çš„目录åQŒæˆ‘˜q™é‡Œè§£åŽ‹åˆ?usr/java目录ä¸?BR>   [root@esprit java]# ln -s jakarta-tomcat-5.0.28 tomcat                #同样创徏一个文仉™“¾æŽ?BR>   æŽ¥ä¸‹æ¥é…¾|®CATALINA_HOME:   
   [root@esprit java]# vi /etc/profile
   åœ¨æ–‡ä»¶å°¾æ·ÕdŠ  
   CATALINA_HOME=/usr/java/tomcat
   export CATALINA_HOME
   :wq 保存退å‡?BR>   é‡æ–°å¯åЍ¾pȝ»Ÿä½‰K…¾|®ç”Ÿæ•?BR>   æŽ¥ç€ž®±å¯ä»¥å¯åЍtomcatäº?nbsp;  
   [root@esprit tomcat]# bin/startup.sh
   æ­£å¸¸çš„话会看到shell下输出:
   Using CATALINA_BASE:   /usr/java/tomcat
   Using CATALINA_HOME:   /usr/java/tomcat
   Using CATALINA_TMPDIR: /usr/java/tomcat/temp
   Using JAVA_HOME:       /usr/java/jdk1.5.0_06
   ç„¶åŽåœ¨æµè§ˆå™¨ä¸­è¾“入:http://localhost:8080 ž®×ƒ¼šå‡ºçްtomcat‹Æ¢è¿Ž™åµé¢ ^_^
   å‡å¦‚发生了错误你可以察看/logs/catalina.out˜q™ä¸ªæ–‡äšgåQ?BR>4.½Ž¡ç†tomcat
   [root@esprit tomcat]# vi conf/tomcat-users.xml
   åœ?lt;tomcat-users>å’?lt;/tomcat-users>之间加入åQ?BR>   <user username="admin" password="admin" roles="admin,manager"/>
   ˜q™æ ·‹¹è§ˆå™¨ä¸­è¾“å…¥:http://localhost:8080/admin ç™Õd…¥åŽå°±å¯ä»¥æ¥ç®¡ç†äº†
   è¾“å…¥http://localhost:8080/manager/html 来管理你的工½E‹é¡¹ç›®äº†


好了åQŒå…ˆè¯´è¿™ä¹ˆå¤šäº†ï¼å˜¿å˜¿â€”â€?BR>
   


esprit 2006-01-18 17:35 发表评论
]]>
Linux下jdk的安è£?/title><link>http://www.aygfsteel.com/esprit/archive/2006/01/18/28489.html</link><dc:creator>esprit</dc:creator><author>esprit</author><pubDate>Wed, 18 Jan 2006 07:05:00 GMT</pubDate><guid>http://www.aygfsteel.com/esprit/archive/2006/01/18/28489.html</guid><wfw:comment>http://www.aygfsteel.com/esprit/comments/28489.html</wfw:comment><comments>http://www.aygfsteel.com/esprit/archive/2006/01/18/28489.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/esprit/comments/commentRss/28489.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/esprit/services/trackbacks/28489.html</trackback:ping><description><![CDATA[ <p>˜q™ä¸¤å¤©é—²ç€æ²¡äº‹åQŒå°±ç”¨VMware装了个LinuxåQˆRedHat9.0åQ‰çŽ©çŽ©ï¼ŒçŽ°è®°å½•linux下java环境的配¾|?br /><br />1.下蝲åQ?font face="Simsun"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">jdk-1_5_0_06-linux-i586-rpm.bin<br />   地址åQ?a >http://java.sun.com/j2se/1.5.0/download.jsp</a><br /></span></font><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">2.¾l™æ–‡ä»¶åŠ ä¸Šå¯æ‰§è¡Œæƒé™<br />   [root@esprit java]# chmod +x <span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">jdk-1_5_0_06-linux-i586-rpm.bin<br />3.执行<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">jdk-1_5_0_06-linux-i586-rpm.bin<br /></span></span>   [root@esprit java]# ./<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">jdk-1_5_0_06-linux-i586-rpm.bin<br />   执行后生æˆ?span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">jdk-1_5_0_06-linux-i586-rpm<br />4.安装<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">jdk-1_5_0_06-linux-i586-rpm<br /></span></span></span>   [root@esprit java]# rpm -ivh <span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun; mso-fareast-language: JA; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">jdk-1_5_0_06-linux-i586-rpm</span><br style="mso-special-character: line-break" />   ˜q™é‡Œæˆ‘jdk安装åœ?usr/java目录ä¸?br />5.配置环境变量<br />   环境变量配置有三¿Uæ–¹æ³•(分别是:修改/etc/profileæ–‡äšgåQŒä¿®æ”¹ç”¨æˆïL›®å½•下çš?bashrcæ–‡äšgåQŒç›´æŽ¥åœ¨shell下修改)<br />˜q™é‡Œæˆ‘只讲我用到的修æ”?etc/profileæ–‡äšg<br />   [root@esprit java]# vi /etc/profile<br />   打开文äšg后,æŒ?I 键,在文件后æ·ÕdŠ åQ?br /></span></p> <p> </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #000000">JAVA_HOME</span> <span style="COLOR: #000000">=/</span> <span style="COLOR: #000000">usr</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">java</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">jdk1.</span> <span style="COLOR: #000000">5</span> <span style="COLOR: #000000">.0_06<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />PATH</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">$JAVA_HOME</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">bin:$PATH<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />CLASSPATH</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">.:$JAVA_HOME</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">lib</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">tools.jar:$JAVA_HOME</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">lib</span> <span style="COLOR: #000000">/</span> <span style="COLOR: #000000">dt.jar<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />export JAVA_HOME PATH CLASSPATH<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span> </div> <p>   按esc é”?br />   输入:wq 保存退出ã€?br />   重新ç™Õd…¥<br />6.‹¹‹è¯•配置环境<br />   写个½Ž€å•çš„HelloWorld来测试一ä¸?br />   [root@esprit java]# vi HelloWorld.java<br />   文äšg中输入:   </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <img id="Codehighlighter1_23_125_Open_Image" onclick="this.style.display='none'; Codehighlighter1_23_125_Open_Text.style.display='none'; Codehighlighter1_23_125_Closed_Image.style.display='inline'; Codehighlighter1_23_125_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_23_125_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_23_125_Closed_Text.style.display='none'; Codehighlighter1_23_125_Open_Image.style.display='inline'; Codehighlighter1_23_125_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000"> HelloWorld</span> <span id="Codehighlighter1_23_125_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_23_125_Open_Text"> <span style="COLOR: #000000">{<br /><img id="Codehighlighter1_66_123_Open_Image" onclick="this.style.display='none'; Codehighlighter1_66_123_Open_Text.style.display='none'; Codehighlighter1_66_123_Closed_Image.style.display='inline'; Codehighlighter1_66_123_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_66_123_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_66_123_Closed_Text.style.display='none'; Codehighlighter1_66_123_Open_Image.style.display='inline'; Codehighlighter1_66_123_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />   </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000"> main(String args[])</span> <span id="Codehighlighter1_66_123_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_66_123_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />      System.out.println(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">Hello World in Linux!!</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />   }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> </span> </div> <p>   :wq 保存退å‡?br />   [root@esprit java]# javac HelloWorld.java<br />   没有错误åQŒæŽ¥ç€<br />   [root@esprit java]# java HelloWorld<br />   shell下输å‡?<font size="2">Hello World in Linux!!<br /></font>   成功了!^_^<br />   </p> <img src ="http://www.aygfsteel.com/esprit/aggbug/28489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/esprit/" target="_blank">esprit</a> 2006-01-18 15:05 <a href="http://www.aygfsteel.com/esprit/archive/2006/01/18/28489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">ÍÁÄ¬ÌØ×óÆì</a>| <a href="http://" target="_blank">µÂ°²ÏØ</a>| <a href="http://" target="_blank">½ºÄÏÊÐ</a>| <a href="http://" target="_blank">ïö¹éÏØ</a>| <a href="http://" target="_blank">¶«·½ÊÐ</a>| <a href="http://" target="_blank">Íû¶¼ÏØ</a>| <a href="http://" target="_blank">ÂåÔúÏØ</a>| <a href="http://" target="_blank">ºÓÎ÷Çø</a>| <a href="http://" target="_blank">Îä¹¦ÏØ</a>| <a href="http://" target="_blank">ÒÀÀ¼ÏØ</a>| <a href="http://" target="_blank">ÃáÄþÏØ</a>| <a href="http://" target="_blank">·îÏÍÇø</a>| <a href="http://" target="_blank">С½ðÏØ</a>| <a href="http://" target="_blank">»Æ´óÏÉÇø</a>| <a href="http://" target="_blank">°¢À­¶ûÊÐ</a>| <a href="http://" target="_blank">ÍÁÄ¬ÌØ×óÆì</a>| <a href="http://" target="_blank">´óÆÒÏØ</a>| <a href="http://" target="_blank">ºáÉ½ÏØ</a>| <a href="http://" target="_blank">¸ÊËàÊ¡</a>| <a href="http://" target="_blank">ãò¶¨ÏØ</a>| <a href="http://" target="_blank">¼ÎÓø¹ØÊÐ</a>| <a href="http://" target="_blank">ÆÕÀ¼µêÊÐ</a>| <a href="http://" target="_blank">ÏæÌ¶ÊÐ</a>| <a href="http://" target="_blank">áéÖÝÊÐ</a>| <a href="http://" target="_blank">¹ãÎ÷</a>| <a href="http://" target="_blank">ÀëµºÇø</a>| <a href="http://" target="_blank">ÒËÁ¼ÏØ</a>| <a href="http://" target="_blank">Ñ®ÒØÏØ</a>| <a href="http://" target="_blank">°²ÑôÏØ</a>| <a href="http://" target="_blank">¶¨Ô¶ÏØ</a>| <a href="http://" target="_blank">ÐÐÌÆÏØ</a>| <a href="http://" target="_blank">ÁÙÔóÏØ</a>| <a href="http://" target="_blank">±õÖÝÊÐ</a>| <a href="http://" target="_blank">µ÷±øÉ½ÊÐ</a>| <a href="http://" target="_blank">¿Æ¼¼</a>| <a href="http://" target="_blank">ʲÚúÊÐ</a>| <a href="http://" target="_blank">ÎåºÓÏØ</a>| <a href="http://" target="_blank">ÔæÑôÊÐ</a>| <a href="http://" target="_blank">ÉÌÄÏÏØ</a>| <a href="http://" target="_blank">¸ßÐÛÏØ</a>| <a href="http://" 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>