ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>av播放在线,亚洲精品一二,亚洲精品免费视频http://www.aygfsteel.com/wml/category/12663.htmlzh-cnTue, 27 Feb 2007 12:07:43 GMTTue, 27 Feb 2007 12:07:43 GMT60- JSP 2.0 ç‰ÒŽ(gu¨©)€?/title><link>http://www.aygfsteel.com/wml/articles/59379.html</link><dc:creator>wml</dc:creator><author>wml</author><pubDate>Fri, 21 Jul 2006 03:08:00 GMT</pubDate><guid>http://www.aygfsteel.com/wml/articles/59379.html</guid><description><![CDATA[
<p align="left">期待已久的日å峞®†åˆ°æ? 最新版<a >JavaServer Pages (JSP)</a>2.0规范å›_°†å’Œå…¶ä»–çš„J2EE 1.4一åŒå‘布。新的JSP版本有一个新的飞跃,采用了新的方å¼ï¼š(x¨¬)ç”׃ºŽæ–°çš„è¯è¨€è¡¨è¾¾å¼ï¼ˆExpression LanguageåQŒä»¥ä¸‹ç®€¿UîCØ“(f¨´)ELåQ‰å’ŒJSPæ ‡å‡†æ ‡ç¾åº“(JSP Standard Tag Library ,以下½Ž€¿UîCØ“(f¨´)JSTLåQ‰è¿™ä¸¤ç§æ–°çš„æ–¹å¼åQŒåœ¨™åµé¢ä¸ä¸éœ€è¦ç”¨java,对于开å‘一般的应用æ¥è¯´åQŒé‡ç”¨ä»£ç å˜å¾—æ›´åŠ å®¹æ˜“ã€‚æ›´å…·ä½“æ¥è¯´åQŒJSP 2.0带æ¥äº†ä»¥ä¸‹çš„优点åQ?/p>
<ul>
<li>首次被JSTL 1.0引入的EL现在被åˆòq¶åˆ°JSP规范ä¸ï¼Œž®±åƒåº”用template textä¸€æ ·åœ°ä½¿ç”¨æ‰€æœ‰çš„æ ‡å‡†çš„å’Œå®šåˆ¶çš„ç»„ä»¶ã€?
</li>
<li>æ–°çš„ELå·²ç»è¢«æ‰©å±•,具备一个函数调用机åˆÓž¼ŒJSTL1.1æ•´åˆäº†ä¸€¾pÕdˆ—¾l常需è¦ä‹É用的函数ã€?
</li>
<li>æ–°å¢žåŠ çš„å˜é‡å’Œservlet è§„èŒƒå®šä¹‰çš„é”™è¯¯å¤„ç†æœºåˆ¶è¢«æ›´å¥½åœ°ç»„¾l‡è“væ¥ã€‚é€šè¿‡æ–°å¢žåŠ çš„å˜é‡åQŒJSP error pages 现在å¯ä»¥æä¾›æ›´å¤šçš„错误信æ¯ã€?
</li>
<li>å®¹å™¨å› äØ“(f¨´)æ›´åŠ ä¸¥æ ¼çš„è¯æ³•检查å¯ä»¥æ›´å®ÒŽ(gu¨©)˜“地找出å‘生的错误ã€?
</li>
<li>所有的J2EE 1.4规范åQˆåŒ…括JSP 2.0 å’?Servlet 2.4åQ‰ï¼Œä¸ÞZº†å£°æ˜Žéƒ¨çÖv的规则æ˜q°è€Œåº”用了XML schema。这æ ïL(f¨¥ng)š„å¥½å¤„ä¹‹ä¸€æ˜¯ä½ çŽ°åœ¨å¯ä»¥é€šè¿‡ä»ÖM½•™åºåºåˆ—出web.xmlæ–‡äšgä¸çš„æè¿°ã€‚JSP 2.0ä¹Ÿå¢žåŠ äº†ä¸€äº›æ–°çš„é…¾|®é€‰é¡¹ç”¨äºŽéƒ¨çÖvæè¿°åQŒå…è®?d¨¡ng)R€šè¿‡å…¨å±€çš„é…¾|®æ¥ä»£æ›¿åŸÞZºŽæ¯é¡µçš„é…¾|®ã€?
</li>
<li>ç”׃ºŽæ›´å…·ä¼¸ç¾ƒæ€§çš„规则和新的自定义action elementåQŒçŽ°åœ¨å°±åƒç¼–写XMLæ–‡äšgä¸€æ øP¼Œ¾~–写JSP™åµé¢å˜å¾—æ›´åŠ å®ÒŽ(gu¨©)˜“ã€?
</li>
<li>å®šåˆ¶çš„æ ‡½{‘Öº“现在å¯ä»¥å¼€å‘æˆä¸€¾pÕdˆ—çš„æ ‡½{¾æ–‡ä»Óž¼ˆå…ähœ‰JSPå…ƒç´ çš„æ–‡æœ¬æ–‡ä»Óž¼‰åQŒæ ‡½{‘Ö¤„ç†å™¨å¯ä»¥ä½¿ç”¨æ–°çš„ã€ç®€åŒ–çš„æ ‡ç¾å¤„ç†å™¨çš„API。与æ¤åŒæ—Óž¼Œæ–°è§„èŒƒåŠ å…¥äº†ä¸€äº›æ–°çš„ç‰¹æ€§ï¼Œæ¯”å¦‚åQ𿔝æŒåœ¨jsp™åµé¢ä¸Šæ˜¾½CºåЍæ€å±žæ€§åˆ—è¡¨å’Œå¯æ‰§è¡Œç‰‡æ–属性ã€?</li>
</ul>
<p align="left">在众多的书ç±ä¸ï¼Œ˜q™æ˜¯å¤´ä¸€ä¸ªè®²è§£JSP 2.0æ–°ç‰¹æ€§çš„æ–‡ç« ã€‚åœ¨˜q™ä¸€éƒ¨åˆ†åQŒæˆ‘们将看到和EL相关的信æ¯ï¼Œå…¶ä»–的新ç‰ÒŽ(gu¨©)€§ç•™åˆ°åŽé¢ã€‚在˜q™é‡Œæˆ‘å‡å®šè¯»è€…å·²¾l熟æ‚(zh¨¨n)‰JSP 1.2åQŒè€Œä¸”臛_°‘å¬è¯´˜q‡JSTLã€?/p>
<p align="left">ä½ å¯èƒ½å¯¹˜q™æœ¬½W¬ä¸‰ç‰ˆçš„《JavaServer Pages》感兴趣。这本书ä¸ï¼Œæˆ‘å°½å¯èƒ½åœ¨ç»†èŠ‚ä¸Šè®²è¿°æ‰€æœ‰çš„å†…å®¹åQŒè€Œä¸”òq¶ä¸è®¤äØ“(f¨´)ä½ å¯¹JSP或者JSTL了解一切。这本书预计åœ?003òq?2æœ?出版åQŒä½†æ˜¯ä½ 现在å¯ä»¥åœ?a >http://www.amazon.com</a>ã€Barnes&NobleåQŒæˆ–者其他在¾U¿ä¹¦åº—预订ã€?/p>
<p align="left">
<strong>EL(</strong>
<strong>The Expression Language</strong>
<strong>)</strong>
<strong>
</strong>
</p>
<p align="left">如果˜q‡åŽ»ä½¿ç”¨˜q‡JSTLåQŒé‚£ä¹ˆä½ å¯èƒ½å·²ç»ç†Ÿæ?zh¨¨n)‰äº†EL。EL在JSTL 1.0规范ä¸è¢«å¼•å…¥åQŒç”¨æ¥åœ¨˜q行期间对Java表达å¼ä¸action element属性赋值æä¾›å¦ä¸€¿U选择。当JSTL ELå·²ç»éžå¸¸˜q…速的‹¹è¡Œèµäh¥æƒ…况下,˜q˜æ˜¯å˜åœ¨ä¸€ä¸ªé—®é¢˜ï¼š(x¨¬) JSTL EL 表达å¼ä»…ä»…å¯ä»¥ä¸ŽJSTLå’Œcustom action一起ä‹Éç”¨ï¼Œæ€Žæ ·æ‰èƒ½ä½¿ç”¨éžæ ‡å‡†API对ELè¡¨è¾¾å¼æ±‚å€û|¼Ÿ</p>
<p align="left">JSP 2.0ä¸?JSP容器自己å¯ä»¥ç†è§£EL表达å¼ã€‚è¿™ä½¿ä½ åœ¨æ‰€æœ‰è¿‡åŽÕdªèƒ½åº”用Java表达å¼çš„地方应用ELè¡¨è¾¾å¼æˆä¸ºå¯èƒ½ï¼Œæ¯”如åQšæ ‡å‡†å’Œå®šåˆ¶action的属性å€û|¼Œæ¨¡æ¿æ–‡æœ¬ã€?/p>
<p align="left">在我们看具体的例åå‰åQŒè®©æˆ‘们更进一æ¥çš„看看什么是EL。EL是从JavaScriptä¸èŽ·å¾—å¯å‘的一¿Uè¯a€åQŒXPath(一¿U用æ¥è®¿é—®XML文档的è¯a€)åQŒä½†æ˜¯EL在对å˜é‡çš„null值和执行更多数殾cÕdž‹çš„自动类型è{æ¢çš„处ç†ä¸Šæ›´åР宽æ¾ã€‚这些新ç‰ÒŽ(gu¨©)€§å¯¹äºŽweb应用éžå¸¸é‡è¦åQŒåœ¨˜q™äº›åº”用ä¸è¾“入通常通过html表å•çš„request parameteræ¥å¾—åˆ°ã€‚è¿™äº›å‚æ•°å¯èƒ½ä»…仅在æŸäº›è¯äh±‚下æ‰èƒ½ä½“现出æ¥ï¼Œè€Œä¸”‹¹è§ˆå™¨ç»å¸¸å°†request parameterä½œäØ“(f¨´)文本å‘é€ï¼Œç„¶è€Œåº”用程åºç»å¸”Rœ€è¦æŠŠä»–ä»¬ä½œäØ“(f¨´)æ•°å—¾cÕdž‹ã€å¸ƒ?y¨u)®”(d¨¡ng)类型(true 或è€?falseåQ‰æ¥ä½¿ç”¨ã€‚通过ELåQŒä½ æ ÒŽ(gu¨©)œ¬ž®±å¾ˆž®‘需è¦å…³å¿ƒç¼ºž®‘æŸäº›å‚数的值或者类型è{æ¢ã€?/p>
<p align="left">一个EL表达å¼åŒ…å«å˜é‡å’Œæ“作½W¦ã€‚ä“Q何å˜å‚¨åœ¨æŸä¸ªJSP作用范围(如:(x¨¬)pageã€?requestã€sessionã€application)çš„beanèƒ½è¢«ä½œäØ“(f¨´)一个ELå˜é‡æ¥ä‹É用。å¦å¤–,EL支æŒä»¥ä¸‹é¢„定义的å˜é‡åQ?/p>
<table cellspacing="0" cellpadding="0" border="1">
<tbody>
<tr>
<td>
<p align="center">
<strong>å˜é‡åç§°</strong>
</p>
</td>
<td>
<p align="center">
<strong>说明</strong>
</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">pageScope</p>
</td>
<td>
<p align="left">ä¸€ä¸ªåŒ…å«æ‰€æœ‰page scope范围的å˜é‡é›†å?(a java.util.Map)</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">requestScope</p>
</td>
<td>
<p align="left">ä¸€ä¸ªåŒ…å«æ‰€æœ‰request scope范围的å˜é‡é›†å?(a java.util.Map)</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">sessionScope</p>
</td>
<td>
<p align="left">ä¸€ä¸ªåŒ…å«æ‰€æœ‰session scope范围的å˜é‡é›†å?(a java.util.Map)</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">applicationScope</p>
</td>
<td>
<p align="left">ä¸€ä¸ªåŒ…å«æ‰€æœ‰application scope范围的å˜é‡é›†å?(a java.util.Map)</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">param</p>
</td>
<td>
<p align="left">ä¸€ä¸ªåŒ…å«æ‰€æœ‰è¯·æ±‚傿•°çš„é›†åˆ (a java.util.Map)åQŒé€šè¿‡æ¯ä¸ªå‚数对应一个String值的方å¼èµ‹å€?/p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">paramValues</p>
</td>
<td>
<p align="left">ä¸€ä¸ªåŒ…å«æ‰€æœ‰è¯·æ±‚傿•°çš„é›†åˆ (a java.util.Map)åQŒé€šè¿‡æ¯ä¸ªå‚数对应一个String数组的方å¼èµ‹å€?/p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">header</p>
</td>
<td>
<p align="left">ä¸€ä¸ªåŒ…å«æ‰€æœ‰è¯·æ±‚的头信æ¯çš„集åˆåQ?(a java.util.Map) ,通过æ¯ä¸ªå¤´ä¿¡æ¯å¯¹åº”一个String值的方å¼èµ‹å€?/p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">headerValues</p>
</td>
<td>
<p align="left">ä¸€ä¸ªåŒ…å«æ‰€æœ‰è¯·æ±‚的头信æ¯çš„é›†åˆ (a java.util.Map) åQŒé€šè¿‡æ¯ä¸ªå¤´ä¿¡æ¯çš„值都ä¿å˜åœ¨ä¸€ä¸ªString数组的方å¼èµ‹å€?/p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">cookie</p>
</td>
<td>
<p align="left">ä¸€ä¸ªåŒ…å«æ‰€æœ‰è¯·æ±‚çš„ cookieé›†åˆ (a java.util.Map)åQ?  通过æ¯ä¸€ä¸ªcookieåQˆjavax.servlet.http.CookieåQ‰å¯¹åº”一个cookie值的方å¼èµ‹å€?/p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">initParam</p>
</td>
<td>
<p align="left">ä¸€ä¸ªåŒ…å«æ‰€æœ‰åº”用程åºåˆå§‹åŒ–傿•°çš„集å?a java.util.Map) åQŒé€šè¿‡æ¯ä¸ªå‚数分别对应一个String值的方å¼èµ‹å€?/p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">pageContext</p>
</td>
<td>
<p align="left">一个javax.servlet.jsp.PageContext¾cÈš„实例, ç”¨æ¥æä¾›è®‰K—®ä¸åŒçš„请求数æ?/p>
</td>
</tr>
</tbody>
</table>
<p align="left">æ“作½W¦æ˜qîCº†ä½ 对å˜é‡æ‰€æœŸæœ›çš„æ“ä½œã€‚å¦‚æžœä½ ä¹‹å‰æ›„¡»ä½¿ç”¨˜q‡ä“Q何编½E‹è¯a€çš„è¯åQŒåœ¨EL表达å¼ä¸æ‰€ä½¿ç”¨çš„æ“ä½œç¬¦å¯¹ä½ æ¥è¯´å¯èƒ½çœ‹è“væ¥å¾ˆç†Ÿæ?zh¨¨n)‰ã€‚å› ä¸ºå®ƒä»¬å’Œé‚£äº›åœ¨å¤§å¤šæ•°è¯è¨€ä¸æ‰€æ”¯æŒçš„æ“ä½œç¬¦ä¸€æ —÷€?/p>
<table cellspacing="0" cellpadding="0" border="1">
<tbody>
<tr>
<td>
<p align="center">
<strong>Operator</strong>
</p>
</td>
<td>
<p align="center">
<strong>Description</strong>
</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">.</p>
</td>
<td>
<p align="left">讉K—®ä¸€ä¸ªbean属性或è€?Map entry</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">[]</p>
</td>
<td>
<p align="left">讉K—®ä¸€ä¸ªæ•°¾l„或者链表元ç´?/p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">()</p>
</td>
<td>
<p align="left">对å表达å¼åˆ†¾l„ï¼Œç”¨æ¥æ”¹å˜èµ‹å€¼é¡ºåº?/p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">? :</p>
</td>
<td>
<p align="left">æ¡äšgè¯å¥åQŒæ¯”å¦? <em>æ¡äšg</em> ? <em>ifTrue</em> : <em>ifFalse</em>.如果æ¡äšg为真åQŒè¡¨è¾‘Ö¼å€égØ“(f¨´)å‰è€…,å之为åŽè€?/p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">+</p>
</td>
<td>
<p align="left">数妘qç®—½W¦ï¼ŒåŠ æ“ä½?/p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">-</p>
</td>
<td>
<p align="left">数妘qç®—½W¦ï¼Œå‡æ“作或者对一个值å–å?/p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">*</p>
</td>
<td>
<p align="left">数妘qç®—½W¦ï¼Œä¹˜æ“ä½?/p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">/ or div</p>
</td>
<td>
<p align="left">数妘qç®—½W¦ï¼Œé™¤æ“ä½?/p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">% or mod</p>
</td>
<td>
<p align="left">数妘qç®—½W¦ï¼Œæ¨¡æ“ä½?å–ä½™)</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">== or eq</p>
</td>
<td>
<p align="left">逻辑˜qç®—½W¦ï¼Œåˆ¤æ–½W¦å·å·¦å³ä¸¤ç«¯æ˜¯å¦ç›¸ç‰åQŒå¦‚果相½{‰è¿”回trueåQŒå¦åˆ™è¿”回false</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">!= or ne</p>
</td>
<td>
<p align="left">逻辑˜qç®—½W¦ï¼Œåˆ¤æ–½W¦å·å·¦å³ä¸¤ç«¯æ˜¯å¦ä¸ç›¸½{‰ï¼Œå¦‚æžœä¸ç›¸½{‰è¿”回trueåQŒå¦åˆ™è¿”回false</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">< or lt</p>
</td>
<td>
<p align="left">逻辑˜qç®—½W¦ï¼Œåˆ¤æ–½W¦å·å·¦è¾¹æ˜¯å¦ž®äºŽåŒ™¾¹åQŒå¦‚æžœå°äºŽè¿”回trueåQŒå¦åˆ™è¿”回false</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">> or gt</p>
</td>
<td>
<p align="left">逻辑˜qç®—½W¦ï¼Œåˆ¤æ–½W¦å·å·¦è¾¹æ˜¯å¦å¤§äºŽåŒ™¾¹åQŒå¦‚果大于返回trueåQŒå¦åˆ™è¿”回false</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left"><= or le</p>
</td>
<td>
<p align="left">逻辑˜qç®—½W¦ï¼Œåˆ¤æ–½W¦å·å·¦è¾¹æ˜¯å¦ž®äºŽæˆ–者ç‰äºŽå³è¾¹ï¼Œå¦‚æžœž®äºŽæˆ–者ç‰äºŽè¿”回trueåQŒå¦åˆ™è¿”回false</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">>= or ge</p>
</td>
<td>
<p align="left">逻辑˜qç®—½W¦ï¼Œåˆ¤æ–½W¦å·å·¦è¾¹æ˜¯å¦å¤§äºŽæˆ–者ç‰äºŽå³è¾¹ï¼Œå¦‚果大于或者ç‰äºŽè¿”回trueåQŒå¦åˆ™è¿”回false</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">&& or and</p>
</td>
<td>
<p align="left">逻辑˜qç®—½W¦ï¼Œä¸Žæ“作赋。如果左å³ä¸¤è¾¹åŒä¸ºtrue˜q”回trueåQŒå¦åˆ™è¿”回false</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">|| or or</p>
</td>
<td>
<p align="left">逻辑˜qç®—½W¦ï¼Œæˆ–æ“作赋。如果左å³ä¸¤è¾ÒŽ(gu¨©)œ‰ä»ÖM½•ä¸€è¾¹äØ“(f¨´)true˜q”回trueåQŒå¦åˆ™è¿”回false</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">! or not</p>
</td>
<td>
<p align="left">逻辑˜qç®—½W¦ï¼Œéžæ“作赋。如果对trueå–è¿½Ž—è¿”å›žfalseåQŒå¦åˆ™è¿”回true</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">empty</p>
</td>
<td>
<p align="left">用æ¥å¯¹ä¸€ä¸ªç©ºå˜é‡å€ÆD¿›è¡Œåˆ¤æ–? nullã€ä¸€ä¸ªç©ºStringã€ç©ºæ•°ç»„ã€?½IºMapã€æ²¡æœ‰æ¡ç›®çš„Collection集åˆ</p>
</td>
</tr>
<tr>
<td valign="top">
<p align="left">
<em>func</em>(<em>args</em>)</p>
</td>
<td>
<p align="left">调用æ–ÒŽ(gu¨©)³•, <em>func</em>是方法ååQ?em>args</em>æ˜¯å‚æ•ŽÍ¼Œå¯ä»¥æ²¡æœ‰åQŒæˆ–者有一个ã€å¤šä¸ªå‚æ•?傿•°é—´ç”¨é€—å·éš”å¼€</p>
</td>
</tr>
</tbody>
</table>
<p align="left">一个EL表达å¼å¯ä»¥åŒ…å«ï¼š(x¨¬)æ•°å—ã€æ–‡æœ¬ï¼ˆåœ¨å•引巿ˆ–者åŒå¼•å·ä¹‹é—´åQ‰ã€å¸ƒ?y¨u)®”(d¨¡ng)倹{€null倹{€?/p>
<p align="left">å› äØ“(f¨´)一个EL表达å¼å¯ä»¥å‡ºçŽ°åœ¨é™æ€æ–‡æœ¬å‡ºçŽ°çš„åœ°æ–¹åQŒå› æ¤ä½ 必须告诉JSP容器它应该被当作一个ELè¡¨è¾¾å¼æ¥å¤„ç†ã€‚ä½ å¯ä»¥é€šè¿‡ä½¿ç”¨å®šç•Œ½W¦æ¥åšåˆ°˜q™ä¸€ç‚V€‚一个ELè¡¨è¾¾å¼æ€ÀL˜¯ä»¥â€?{ }â€æ¥æ ‡è®°åQˆä¸€ä¸ªâ€?â€ç¬¦å·å’Œä¸€ä¸ªå·¦èŠ±æ‹¬å?åŒ™Š±æ‹¬å·åQ‰ã€‚这里有一个EL表达å¼ï¼Œå®ƒå°†ä¸€ä¸ªå‘½å䨓(f¨´)amountçš„å˜é‡åŠ 5åQ?/p>
<p align="left">${amount + 5}</p>
<p align="left">å¦‚æžœä½ æƒ³è¦å°†5åŠ åˆ°ä¸€ä¸ªbeançš„property上,å¯ä»¥ä½¿ç”¨property讉K—®æ“作½W¦ï¼š(x¨¬)</p>
<p align="left">${order.amount + 5}</p>
<p align="left">在当å‰è¿™ä¸ªæŒ‡å®šçš„bean或者collection集åˆä¸ï¼ŒProperty讉K—®æ“作½W¦ï¼ˆä¸€ä¸ªâ€?“符åøP¼‰å‘Šè¯‰ELåŽÕd¯»æ‰‘Öå—䨓(f¨´)amountçš„propertyã€?/p>
<p align="left">${order['amount'] + 5}</p>
<p align="left">在[]之间的值必™åÀL˜¯ä¸€ä¸ªpropertyçš„åå—(ž®±åƒä¸Šé¢çš„例åä¸é‚£æ ·åQ‰æˆ–者是一个ä¿å˜propertyåå—çš„å˜é‡ï¼ˆæˆ–者是一个完整的ELå表辑ּåQ‰ã€?/p>
<p align="left">EL表达å¼å¯ä»¥è¢«ç”¨æ¥èµ‹å€¼ç»™ä»ÖM½•æ ‡å‡†çš„æˆ–è€…å®šåˆ¶çš„JSPè¡ŒäØ“(f¨´)属性(action attributeåQ‰ï¼Œ˜q™äº›è¡ŒäØ“(f¨´)å±žæ€§è¢«æ ‡è®°ä¸ºå¯ä»¥æŽ¥å—动æ€å€û|¼ˆæˆ–者请求期间的属性å€û|¼Œž®Þp±¡å®ƒè¢«æ£å¼è°ƒç”¨ä¸€æ øP¼‰åQ?/p>
<p align="left"><c:out value="${order.amount + 5}"/></p>
<p align="left">在JSP 2.0之å‰åQŒä½ ä¸å¾—ä¸ä‹É用Java表达å¼åŽ»¾l™ä¸€ä¸ªå±žæ€§åЍæ€èµ‹å€¹{€‚在˜q‡åŽ»çš„å¾ˆå¤šå¹´ä¸ï¼Œ˜q™å·²¾læˆä¸ø™¯æ³•æØœä¹Þqš„ä¸€ä¸ªæ™®éæ ¹æºã€?/p>
<p align="left">最åŽï¼ŒEL表达å¼å¯ä»¥åœ¨™åµé¢ä¸å’Œæ¨¡æ¿ç›´æŽ¥æ··åˆä½¿ç”¨ã€‚å½“ä½ ç”ŸæˆHTMLòq¶ä¸”需è¦è®¾¾|®ä¸€ä¸ªåЍæ€å€¼ç»™ä¸€ä¸ªå±žæ€§çš„æ—¶å€™ï¼Œ˜q™éžå¸¸æ–¹ä¾¿ï¼š(x¨¬)</p>
<p align="left"><input name="firstName" value="${customer.firstName}"></p>
<p align="left">JSP 1.2ä¸ï¼Œä½ ä¸å¾—ä¸ä½¿ç”¨JSTLçš?lt;c:out>æ¥å®žçŽ°åŒæ ïL(f¨¥ng)š„事情åQŒæœ€åŽæŠŠå„ç§ä¸åŒ¾cÕdž‹çš„å…ƒç´ æØœåˆè“væ¥ï¼Œ˜q™å¯¼è‡´ç¨‹åºç†è§£è“væ¥éžå¸¸çš„å›°éš¾åQ?/p>
<p align="left"><input name="firstName" </p>
<p align="left">value="<c:out value="${customer.firstName}"/>" ></p>
<p align="left">Â </p>
<h3>æ–°JSTL 1.1 Tag Library æ ‡è¯†½W?/h3>
<p>JSTL1.1å‘布的是一个刾U§çš„版本åQŒä¸»è¦ç›®çš„æ˜¯ç”¨æ¥æ•´åˆJSTLå’ŒJSP2.0 。最明显的å˜åŒ–是JSTL1.0 “åªç”Ÿå‡½æ•°åº“â€ï¼ˆä¸€¾l„åº“ç”¨æ¥æŽ¥å—EL表达å¼ï¼Œå¦å¤–一¾l„ç”¨æ¥æŽ¥å—JAVA表达å¼ï¼‰åQŒè€Œå®ƒä»¬å·²¾l被一¾l„æ—¢å¯ä»¥ç”¨äºŽEL表达å¼ä¹Ÿå¯ä»¥ç”¨äºŽJAVA表达å¼çš„函数库所代替ã€?/p>
<p>在JSTL 1.1ä¸ä‹Éç”¨ä»¥ä¸‹æ ‡è¯†ç¬¦:</p>
<table cellspacing="0" cellpadding="0" border="1">
<tbody>
<tr>
<td>
<p align="center">
<strong>�/strong>
<strong>
</strong>
</p>
</td>
<td>
<p align="center">
<strong>URI</strong>
<strong>
</strong>
</p>
</td>
<td>
<p align="center">
<strong>å‰ç¼€</strong>
<strong>
</strong>
</p>
</td>
</tr>
<tr>
<td>
<p>Core</p>
</td>
<td>
<p>
<em>http://java.sun.com/jsp/jstl/core</em>
</p>
</td>
<td>
<p>c</p>
</td>
</tr>
<tr>
<td>
<p>XML processing</p>
</td>
<td>
<p>
<em>http://java.sun.com/jsp/jstl/xml</em>
</p>
</td>
<td>
<p>x</p>
</td>
</tr>
<tr>
<td>
<p>I18N formatting</p>
</td>
<td>
<p>
<em>http://java.sun.com/jsp/jstl/fmt</em>
</p>
</td>
<td>
<p>fmt</p>
</td>
</tr>
<tr>
<td>
<p>Database access</p>
</td>
<td>
<p>
<em>http://java.sun.com/jsp/jstl/sql</em>
</p>
</td>
<td>
<p>sql</p>
</td>
</tr>
<tr>
<td>
<p>Functions</p>
</td>
<td>
<p>
<em>http://java.sun.com/jsp/jstl/functions</em>
</p>
</td>
<td>
<p>fn</p>
</td>
</tr>
</tbody>
</table>
<p>å¦‚æžœä½ æ›¾¾lä‹É用过JSTL1.0åQŒä½ å¯èƒ½ä¼?x¨¬)注æ„åˆ°æ–°çš„æ ‡è¯†½W¦å’Œæ—§çš„ELåº“æ ‡è¯•ç¬¦ä¸€æ¨¡ä¸€æ øP¼Œé™¤äº†åŠ å…¥äº†â€?jsp pathâ€?elementã€‚ä½ ä¹Ÿå¯èƒ½æ³¨æ„到在JSTL1.1䏿œ‰ä¸€ä¸ªåº“åQŒåŒ…å«äº†EL的函数。我们ç¨åŽå°±ä¼?x¨¬)看到ã€?/p>
<h3>一个新的ELæ“作½W?/h3>
<p>在JSP™åµé¢ä¸ä¸€ä¸ªéžå¸¸æ™®é的需求就是:(x¨¬)当æŸä¸ªæ¡ä»¶äØ“(f¨´)真时åQŒè¦åœ¨ç½‘™åµä¸åŒ…å«ä¸€äº›æ–‡å—。在JSP1.2å’ŒJSTL1.1ä¸ï¼Œç”¨å…·æœ‰ä»£è¡¨æ€§çš„<c:if>æ¥å®žçŽŽÍ¼Œä½†æ˜¯˜q™æ ·åšéžå¸¸ç¹ç。JSP2.0å¢žåŠ äº†ä¸€ä¸ªæ–°çš„æ¡ä»¶æ“作符用于ELåQŒä»¥æ›´åŠ ä¼˜é›…çš„æ–¹å¼æ¥å¤„熘q™æ ·çš„æƒ…å†üc(di¨£n)€‚这个æ¡ä»¶æ“作符å˜åœ¨äºŽå¾ˆå¤šç¼–½E‹è¯a€ä¸ï¼ˆæ¯”如åQšJava,C,JavaScriptåQ?å› æ¤ä½ å¯èƒ½ä»¥å‰å°±è§è¿‡å®ƒã€‚它判æ–一个布?y¨u)®”(d¨¡ng)çš„æ¡äšgåQŒå½“æ¡äšgä¸ºçœŸæˆ–è€…å‡æ—Óž¼Œåˆ†åˆ«å–ä¸åŒçš„¾l“æžœã€?/p>
<p>一个能清楚说明它如何工作的例ååQ?/p>
<p><select name="artist"><br /><option value="1" ${param.artist == 1 ? 'selected' : ''}><br />Vesica Pisces<br /><option value="2" ${param.artist == 2 ? 'selected' : ''}><br />Cortical Control<br /><option value="3" ${param.artist == 3 ? 'selected' : ''}><br />Vida Vierra<br /></select> </p>
<p>在这里,我ä‹É用了EL表达å¼å’Œæ¡äšgæ“作½W¦æ¥é€‰æ‹©æ˜¯å¦åŒ…å« html ä¸çš„ “selectedâ€å±žæ€§ï¼Œåªæœ‰½W¦åˆæ¡äšgçš?“optionâ€?æ‰è¢«æ·ÕdŠ â€œselectedâ€?属性。如果æ¡ä»Óž¼ˆparam.artist==1åQ‰äØ“(f¨´)真时åQŒå‰é¢çš„“selectedâ€?æ‰è¢«æ·ÕdŠ åˆ°ç½‘™åµä¸åQ›å¦åˆ™å°±æ·ÕdŠ åŽé¢çš„(在这里是½Iºå—½W¦ä¸² ‘’)到页é¢ä¸ã€?/p>
<h3>EL函数</h3>
<p>当EL从JSTL规范ä¸ç§»åˆ°JSP规范ä¸ï¼Œå®ƒä‹É用了一个如何进行函数调用的技巧。这个ELå‡½æ•°è¯æ³•éžå¸¸½Ž€å•:(x¨¬)æ–ÒŽ(gu¨©)³•å,紧接ç€åœ¨åœ†æ‹¬å·ä¸æœ‰ä¸€¾l„傿•ŽÍ¼š(x¨¬)</p><%@ taglib prefix="fn"<br />uri="http://java.sun.com/jsp/jstl/functions" %><br />${fn:length(myCollection)}
<p>˜q™æ˜¯ä¸€ä¸ªå±žäºŽæ ‡½{‘Öº“ä¸çš„函数,òq¶ä¸”函数åå—在页é¢ä¸æ‰€åŒ…å«çš„剾~€è¦æŒ‡å®štaglib库。在˜q™ä¸ªä¾‹åä¸ï¼Œæˆ‘ä‹É用了å‰ç¼€fn,˜q™æ˜¯JSTL function库默认的å‰ç¼€ã€?/p><p>æ ‡ç¾åº“æ˜q°ç¬¦åQˆTag Library Descriptor,TLDåQ‰å°†å‡½æ•°åç§°æ˜ å°„åˆîC¸€ä¸ªç”±JAVAå®žçŽ°çš„é™æ€æ–¹æ³•ä¸åQ?/p><function><br /><description><br />Returns the number of items in a collection or the number of characters in a string.<br /></description><br /><name>length</name><br /><function-class><br />org.apache.taglibs.standard.functions.Functions<br /></function-class><br /><function-signature><br />int length(java.lang.Object)<br /></function-signature><br /></function>
<p>在这里最有趣的elementæ˜?lt;function-signature>。它包å«ä¸€ä¸ªå‡½æ•°è¿”回类型的声明åQŒé™æ€çš„æ–ÒŽ(gu¨©)³•çš„åå—,在圆括å·ä¸å£°æ˜Žè¯¥æ–ÒŽ(gu¨©)³•æ‰€æœ‰å‚æ•°çš„¾cÕdž‹åQˆå¯ä»¥æ²¡æœ‰å‚数或者有多个åQŒå‚数间用逗å·é—´éš”å¼€åQ‰ã€‚è¿”å›žå€¼ç±»åž‹å’Œå‚æ•°¾cÕdž‹å¿…须是java的原始类型(ObjectåQ‰æˆ–è€…æ˜¯å…¶ä»–åˆæ³•¾cÕdž‹ã€?/p><p>˜q™ä¸ªé™æ€æ–¹æ³?length()在Jakarta Taglibsæ ‡å‡†åº“ä¸ç”¨ç±»ä¼égºŽä¸‹é¢çš„代ç 实现的åQ?/p>public static int length(Object obj)<br />throws JspTagException {<br />if (obj == null)<br />return 0;<br />if (obj instanceof String)<br />return ((String)obj).length();<br />if (obj instanceof Collection)<br />return ((Collection)obj).size();<br />if (obj instanceof Map)<br />return ((Map)obj).size();
<p>int count = 0;<br />if (obj instanceof Iterator) {<br />Iterator iter = (Iterator) obj;<br />count = 0;<br />while (iter.hasNext()) {<br />count++;<br />iter.next();<br />}<br />return count;<br />}<br />if (obj instanceof Enumeration) {<br />Enumeration enum = (Enumeration) obj;<br />count = 0;<br />while (enum.hasMoreElements()) {<br />count++;<br />enum.nextElement();<br />}<br />return count;<br />}<br />try {<br />count = Array.getLength(obj);<br />return count;<br />} catch (IllegalArgumentException ex) {}<br />throw new JspTagException("Unsupported type"));<br />}</p><p>ž®±åƒä½ æ‰€çœ‹åˆ°çš„ï¼Œåœ¨é‚£é‡Œæ²¡æœ‰ä»€ä¹ˆå‡ºå¥‡çš„åœ°æ–¹ã€‚å®ƒæ˜¯ä¸€ä¸ªå¸¸è§„çš„é™æ€æ–¹æ³•,˜q™ä¸ªå‡½æ•°ä¸é€šè¿‡å¯¹è¿è¡ŒæœŸä¸çš„傿•°¾cÕdˆ«çš„判æ–,扑ևºå‚数的长度ã€?/p><p>除了在这个方法ä¸ä½¿ç”¨çš„length()æ–ÒŽ(gu¨©)³•åQŒJSTL1.1æ ‡ç¾åº“还包å«äº†è®¸å¤šå…¶å®ƒç»å¸æ€‹É用的函数åQ?/p><table cellspacing="0" cellpadding="0" border="1"><tbody><tr><td><p align="center"><strong>函数</strong><strong></strong></p></td><td><p align="center"><strong>æè¿°</strong><strong></strong></p></td></tr><tr><td valign="top"><p>fn:contains(string, substring)</p></td><td><p>å¦‚æžœå‚æ•°stringä¸åŒ…å«å‚æ•°substringåQŒè¿”回true</p></td></tr><tr><td valign="top"><p>fn:containsIgnoreCase(string, substring)</p></td><td><p>å¦‚æžœå‚æ•°stringä¸åŒ…å«å‚æ•°substringåQˆå¿½ç•¥å¤§ž®å†™åQ‰ï¼Œ˜q”回true</p></td></tr><tr><td valign="top"><p>fn:endsWith(string, suffix)</p></td><td><p>å¦‚æžœå‚æ•° string 以傿•°suffix¾l“å°¾åQŒè¿”回true</p></td></tr><tr><td valign="top"><p>fn:escapeXml(string)</p></td><td><p>ž®†æœ‰ç‰ÒŽ(gu¨©)®Šæ„义的XML (å’ŒHTML)转æ¢ä¸ºå¯¹åº”çš„XML character entity codeåQŒåƈ˜q”回</p></td></tr><tr><td valign="top"><p>fn:indexOf(string, substring)</p></td><td><p>˜q”å›žå‚æ•°substringåœ¨å‚æ•°stringä¸ç¬¬ä¸€‹Æ¡å‡ºçŽ°çš„ä½ç½®</p></td></tr><tr><td valign="top"><p>fn:join(array, separator)</p></td><td><p>ž®†ä¸€ä¸ªç»™å®šçš„æ•°ç»„array用给定的间隔½W¦separatorä¸²åœ¨ä¸€èµøP¼Œ¾l„æˆä¸€ä¸ªæ–°çš„å—½W¦ä¸²òq¶è¿”回ã€?/p></td></tr><tr><td valign="top"><p>fn:length(item)</p></td><td><p>˜q”å›žå‚æ•°itemä¸åŒ…å«å…ƒç´ 的数é‡ã€‚傿•°Item¾cÕdž‹æ˜¯æ•°¾l„ã€collection或者String。如果是String¾cÕdž‹,˜q”回值是Stringä¸çš„å—符数ã€?/p></td></tr><tr><td valign="top"><p>fn:replace(string, before, after)</p></td><td valign="top"><p>˜q”回一个Stringå¯¹è±¡ã€‚ç”¨å‚æ•°afterå—符串替æ¢å‚æ•°string䏿‰€æœ‰å‡ºçް傿•°beforeå—符串的地方åQŒåƈ˜q”回替æ¢åŽçš„¾l“æžœ</p></td></tr><tr><td valign="top"><p>fn:split(string, separator)</p></td><td><p>˜q”回一个数¾l„ï¼Œä»¥å‚æ•°separator ä¸ºåˆ†å‰²ç¬¦åˆ†å‰²å‚æ•°stringåQŒåˆ†å‰²åŽçš„æ¯ä¸€éƒ¨åˆ†ž®±æ˜¯æ•°ç»„的一个元ç´?/p></td></tr><tr><td valign="top"><p>fn:startsWith(string, prefix)</p></td><td><p>å¦‚æžœå‚æ•°string以傿•°prefixå¼€å¤ß_(d¨¢)¼Œ˜q”回true</p></td></tr><tr><td valign="top"><p>fn:substring(string, begin, end)</p></td><td><p>˜q”å›žå‚æ•°string部分å—符ä¸? ä»Žå‚æ•°beginå¼€å§‹åˆ°å‚æ•°endä½ç½®åQŒåŒ…括endä½ç½®çš„å—½W?/p></td></tr><tr><td valign="top"><p>fn:substringAfter(string, substring)</p></td><td><p>˜q”å›žå‚æ•°substringåœ¨å‚æ•°stringä¸åŽé¢çš„那一部分å—符ä¸?/p></td></tr><tr><td valign="top"><p>fn:substringBefore(string, substring)</p></td><td><p>˜q”å›žå‚æ•°substringåœ¨å‚æ•°stringä¸å‰é¢çš„那一部分å—符ä¸?/p></td></tr><tr><td valign="top"><p>fn:toLowerCase(string)</p></td><td><p>ž®†å‚æ•°string所有的å—符å˜äØ“(f¨´)ž®å†™åQŒåƈž®†å…¶˜q”回</p></td></tr><tr><td valign="top"><p>fn:toUpperCase(string)</p></td><td><p>ž®†å‚æ•°string所有的å—符å˜äØ“(f¨´)大写åQŒåƈž®†å…¶˜q”回</p></td></tr><tr><td valign="top"><p>fn:trim(string)</p></td><td><p>åŽ»é™¤å‚æ•°string 首尾的空æ û|¼Œòq¶å°†å…¶è¿”å›?/p></td></tr></tbody></table><h3>¾l“æŸè¯ï¼š(x¨¬)</h3><p>在这½‹‡æ–‡ç« ä¸åQŒæˆ‘从EL讲到JSTL1.1规范ã€EL新特色和JSTL 1.1函数库。接下æ¥çš„部分我ž®†è¦å‘Šè¯‰ä½ :(x¨¬)关于JSP error-page的改˜q›å’Œå¢žå¼ºåQ?jsp:id 属性带æ¥çš„益处åQ›æ–°çš„é…¾|®å±žæ€§æ˜q°ç¬¦åQ›JSP2.0如何使JSPæ“作XMLå˜å¾—æ›´åŠ å®ÒŽ(gu¨©)˜“åQ›è‡ªå®šä¹‰æ ‡ç¾åº“的新特性ã€?/p><p>å¦‚æžœä½ æƒ³è¦å°è¯•JSP2.0的新ç‰ÒŽ(gu¨©)€§ï¼Œæˆ‘å¾è®®ä½ 使用Apache Tomcat 5。它是最早实çŽîCº†JSP新规范的容器之一。在公布最¾lˆç‰ˆæœ¬çš„JSP 2.0规范之å‰åQŒä¸€ä¸ªè¢«æ ‡è®°ä¸ºâ€œstableâ€ç‰ˆæœ¬çš„Tomcat是ä¸èƒ½è¢«å‘布的。但是最新的beta版已¾l被è¯å®žæ˜¯éžå¸¸ç¨³å®šçš„åQŒä¸è¦ç†ä¼?x¨¬)betaç‰ˆçš„æ ‡è®°ã€‚Tomcat 5åœ?a >the Jakarta Project site</a>å¯ä»¥ä¸‹è²ã€?/p><img src ="http://www.aygfsteel.com/wml/aggbug/59379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wml/" target="_blank">wml</a> 2006-07-21 11:08 <a href="http://www.aygfsteel.com/wml/articles/59379.html#Feedback" target="_blank" style="text-decoration:none;">å‘表评论</a></div>]]></description></item><item><title>转:(x¨¬)Javascript--æ–‡äšgæ“作http://www.aygfsteel.com/wml/articles/58033.htmlwmlwmlThu, 13 Jul 2006 09:49:00 GMThttp://www.aygfsteel.com/wml/articles/58033.html
一ã€åŠŸèƒ½å®žçŽ°æ ¸å¿ƒï¼š(x¨¬)FileSystemObject 对象
è¦åœ¨javascriptä¸å®žçŽ°æ–‡ä»¶æ“作功能,主覞®±æ˜¯ä¾é FileSystemobject对象ã€?br />二ã€FileSystemObject¾~–程
使用FileSystemObject 对象˜q›è¡Œ¾~–程很简å•,一般覾l过如下的æ¥éª¤ï¼š(x¨¬) 创å¾FileSystemObject对象ã€åº”用相å…Ïx–¹æ³•ã€è®¿é—®å¯¹è±¡ç›¸å…›_±žæ€?ã€?
åQˆä¸€åQ‰åˆ›å»ºFileSystemObject对象
创å¾FileSystemObject对象的代ç åªè¦?行:(x¨¬)
var fso = new ActiveXObject("Scripting.FileSystemObject");
ä¸Šè¿°ä»£ç æ‰§è¡ŒåŽï¼Œfsož®±æˆä¸ÞZ¸€ä¸ªFileSystemObject对象实例ã€?
åQˆäºŒåQ‰åº”用相å…Ïx–¹æ³?
创å¾å¯¹è±¡å®žä¾‹åŽï¼Œž®±å¯ä»¥ä‹É用对象的相关æ–ÒŽ(gu¨©)³•了。比如,使用CreateTextFileæ–ÒŽ(gu¨©)³•创å¾ä¸€ä¸ªæ–‡æœ¬æ–‡ä»Óž¼š(x¨¬)
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f1 = fso.createtextfile("c:\\myjstest.txt",true");
åQˆä¸‰åQ‰è®¿é—®å¯¹è±¡ç›¸å…›_±žæ€?
è¦è®¿é—®å¯¹è±¡çš„相关属性,首先è¦å¾ç«‹æŒ‡å‘å¯¹è±¡çš„å¥æŸ„åQŒè¿™ž®Þp¦é€šè¿‡get¾pÕdˆ—æ–ÒŽ(gu¨©)³•实现åQšGetDrive负责获å–驱动器信æ¯ï¼ŒGetFolderè´Ÿè´£èŽ·å–æ–‡äšg夹信æ¯ï¼ŒGetFileè´Ÿè´£èŽ·å–æ–‡äšgä¿¡æ¯ã€‚比如,指å‘下é¢çš„代ç åŽåQŒf1ž®±æˆä¸ºæŒ‡å‘文件c:\test.txtçš„å¥æŸ„:(x¨¬)
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f1 = fso.GetFile("c:\\myjstest.txt");
ç„¶åŽåQŒä‹É用f1讉K—®å¯¹è±¡çš„相兛_±žæ€§ã€‚比如:(x¨¬)
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f1 = fso.GetFile("c:\\myjstest.txt");
alert("File last modified: " + f1.DateLastModified);
æ‰§è¡Œä¸Šé¢æœ€åŽä¸€å¥åŽåQŒå°†æ˜„¡¤ºc:\myjstest.txt的最åŽä¿®æ”ÒŽ(gu¨©)—¥æœŸå±žæ€§å€¹{€?
但有一点请注æ„åQšå¯¹äºŽä‹É用createæ–ÒŽ(gu¨©)³•建立的对象,ž®×ƒ¸å¿…å†ä½¿ç”¨getæ–ÒŽ(gu¨©)³•获å–å¯¹è±¡å¥æŸ„了,˜q™æ—¶ç›´æŽ¥ä½¿ç”¨createæ–ÒŽ(gu¨©)³•å»ºç«‹çš„å¥æŸ„å¿U°å°±å¯ä»¥åQ?
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f1 = fso.createtextfile("c:\\myjstest.txt",true");
alert("File last modified: " + f1.DateLastModified);
ä¸‰ã€æ“作驱动器åQˆDrivesåQ?
使用FileSystemObject对象æ¥ç¼–½E‹æ“作驱动器åQˆDrivesåQ‰å’Œæ–‡äšg夹(F(tu¨¢n)oldersåQ‰å¾ˆå®ÒŽ(gu¨©)˜“åQŒè¿™ž®Þp±¡åœ¨Windowsæ–‡äšg‹¹è§ˆå™¨ä¸å¯ÒŽ(gu¨©)–‡ä»¶è¿›è¡Œäº¤äº’æ“ä½œä¸€æ øP¼Œæ¯”如åQšæ‹·è´ã€ç§»åŠ¨æ–‡ä»¶å¤¹åQŒèŽ·å–æ–‡ä»¶å¤¹çš„属性ã€?
åQˆä¸€åQ‰Drives对象属æ€?
Drive对象负责攉™›†¾pÈ»Ÿä¸çš„ç‰©ç†æˆ–逻辑驱动器资æºå†…容,它具有如下属性:(x¨¬)
l TotalSizeåQšä»¥å—节åQˆbyteåQ‰äØ“(f¨´)å•ä½è®¡ç®—的驱动器大å°ã€?
l AvailableSpace或FreeSpaceåQšä»¥å—节åQˆbyteåQ‰äØ“(f¨´)å•ä½è®¡ç®—的驱动器å¯ç”¨½Iºé—´ã€?
l DriveLetteråQšé©±åЍ噍嗿¯ã€?
l DriveTypeåQšé©±åЍ噍¾cÕdž‹åQŒå–å€égØ“(f¨´)åQšremovableåQˆç§»åŠ¨ä»‹è´¨ï¼‰ã€fixedåQˆå›ºå®šä»‹è´¨ï¼‰ã€networkåQˆç½‘¾lœèµ„æºï¼‰ã€CD-ROM或者RAM盘ã€?
l SerialNumberåQšé©±åŠ¨å™¨çš„ç³»åˆ—ç ã€?
l FileSystemåQšæ‰€åœ¨é©±åŠ¨å™¨çš„æ–‡ä»¶ç³»¾lŸç±»åž‹ï¼Œå–å€égØ“(f¨´)FATã€FAT32å’ŒNTFSã€?
l IsReadyåQšé©±åŠ¨å™¨æ˜¯å¦å¯ç”¨ã€?
l ShareNameåQšå…±äº«å¿U°ã€?
l VolumeNameåQšå·æ ‡å¿U°ã€?
l Pathå’ŒRootFolderåQšé©±åŠ¨å™¨çš„èµ\å¾„æˆ–è€…æ ¹ç›®å½•åç§°ã€?
åQˆäºŒåQ‰Drive对象æ“作例程
下é¢çš„例½E‹æ˜¾½Cºé©±åЍ噍Cçš„å·æ ‡ã€æ€Õd®¹é‡å’Œå¯ç”¨½Iºé—´½{‰ä¿¡æ¯ï¼š(x¨¬)
var fso, drv, s ="";
fso = new ActiveXObject("Scripting.FileSystemObject");
drv = fso.GetDrive(fso.GetDriveName("c:\\"));
s += "Drive C:" + " - ";
s += drv.VolumeName + "\n";
s += "Total Space: " + drv.TotalSize / 1024;
s += " Kb" + "\n";
s += "Free Space: " + drv.FreeSpace / 1024;
s += " Kb" + "\n";
alert(s);
å››ã€æ“作文件夹åQˆF(tu¨¢n)oldersåQ?
涉åŠ(qi¨¢ng)到文件夹的æ“作包括创建ã€ç§»åЍã€åˆ 除以å?qi¨¢ng)获å–相兛_±žæ€§ã€?
Folder对象æ“作例程 :
下é¢çš„例½E‹å°†¾lƒä¹ (f¨¤n)获å–父文件夹åç§°ã€åˆ›å»ºæ–‡ä»¶å¤¹ã€åˆ 除文件夹ã€åˆ¤æ–是å¦äØ“(f¨´)æ ¹ç›®å½•ç‰æ“作åQ?
var fso, fldr, s = "";
// 创å¾FileSystemObject对象实例
fso = new ActiveXObject("Scripting.FileSystemObject");
// 获å–Drive 对象
fldr = fso.GetFolder("c:\\");
// 昄¡¤ºçˆ¶ç›®å½•å¿U?
alert("Parent folder name is: " + fldr + "\n");
// 昄¡¤ºæ‰€åœ¨driveåç§°
alert("Contained on drive " + fldr.Drive + "\n");
// åˆ¤æ–æ˜¯å¦ä¸ºæ ¹ç›®å½•
if (fldr.IsRootFolder)
alert("This is the root folder.");
else
alert("This folder isn't a root folder.");
alert("\n\n");
// åˆ›å¾æ–°æ–‡ä»¶å¤¹
fso.CreateFolder ("C:\\Bogus");
alert("Created folder C:\\Bogus" + "\n");
// 昄¡¤ºæ–‡äšg夹基¼‹€åç§°åQŒä¸åŒ…å«è·¯å¾„å?
alert("Basename = " + fso.GetBaseName("c:\\bogus") + "\n");
// åˆ é™¤åˆ›å¾çš„æ–‡ä»¶å¤¹
fso.DeleteFolder ("C:\\Bogus");
alert("Deleted folder C:\\Bogus" + "\n");
äº”ã€æ“作文ä»Óž¼ˆF(tu¨¢n)ilesåQ?
å¯ÒŽ(gu¨©)–‡ä»¶è¿›è¡Œçš„æ“ä½œè¦æ¯”以上介ç»çš„驱动器åQˆDriveåQ‰å’Œæ–‡äšg夹(F(tu¨¢n)olderåQ‰æ“ä½œå¤æ‚些åQŒåŸºæœ¬ä¸Šåˆ†äØ“(f¨´)以下两个¾cÕdˆ«åQšå¯¹æ–‡äšgçš„åˆ›å»ºã€æ‹·è´ã€ç§»åЍã€åˆ 除æ“作和å¯ÒŽ(gu¨©)–‡ä»¶å†…容的创å¾ã€æ·»åŠ ã€åˆ 除和è¯Õd–æ“作。下é¢åˆ†åˆ«è¯¦¾l†ä»‹¾lã€?
åQˆä¸€åQ‰åˆ›å»ºæ–‡ä»?
一共有3¿U方法å¯ç”¨äºŽåˆ›å¾ä¸€ä¸ªç©ºæ–‡æœ¬æ–‡äšgåQŒè¿™¿U文件有时候也å«åšæ–‡æœ¬‹¹ï¼ˆtext streamåQ‰ã€?
½W¬ä¸€¿U是使用CreateTextFileæ–ÒŽ(gu¨©)³•。代ç 如下:(x¨¬)
var fso, f1;
fso = new ActiveXObject("Scripting.FileSystemObject");
f1 = fso.CreateTextFile("c:\\testfile.txt", true);
½W¬äºŒ¿U是使用OpenTextFileæ–ÒŽ(gu¨©)³•åQŒåƈæ·ÕdŠ ä¸ŠForWriting属性,ForWritingçš„å€égØ“(f¨´)2。代ç 如下:(x¨¬)
var fso, ts;
var ForWriting= 2;
fso = new ActiveXObject("Scripting.FileSystemObject");
ts = fso.OpenTextFile("c:\\test.txt", ForWriting, true);
½W¬ä¸‰¿U是使用OpenAsTextStreamæ–ÒŽ(gu¨©)³•åQŒåŒæ ¯‚¦è®„¡½®å¥½ForWriting属性。代ç 如下:(x¨¬)
var fso, f1, ts;
var ForWriting = 2;
fso = new ActiveXObject("Scripting.FileSystemObject");
fso.CreateTextFile ("c:\\test1.txt");
f1 = fso.GetFile("c:\\test1.txt");
ts = f1.OpenAsTextStream(ForWriting, true);
åQˆäºŒåQ‰æ·»åŠ æ•°æ®åˆ°æ–‡äšg
当文件被创å¾åŽï¼Œä¸€èˆ¬è¦æŒ‰ç…§â€œæ‰“开文äšgåQ?gt;填写数æ®åQ?gt;关闿–‡äšgâ€çš„æ¥éª¤å®žçŽ°æ·ÕdŠ æ•°æ®åˆ°æ–‡ä»¶çš„目的ã€?
打开文äšgå¯ä‹É用FileSystemObject对象的OpenTextFileæ–ÒŽ(gu¨©)³•åQŒæˆ–者ä‹É用File对象的OpenAsTextStreamæ–ÒŽ(gu¨©)³•ã€?
填写数æ®è¦ä‹É用到TextStream对象的Writeã€WriteLine或者WriteBlankLinesæ–ÒŽ(gu¨©)³•ã€‚åœ¨åŒæ˜¯å®žçŽ°å†™å…¥æ•°æ®çš„功能下åQŒè¿™3者的区别在于åQšWriteæ–ÒŽ(gu¨©)³•ä¸åœ¨å†™å…¥æ•°æ®æœ«å°¾æ·ÕdŠ æ–°æ¢è¡Œç¬¦åQŒW(xu¨¦)riteLineæ–ÒŽ(gu¨©)³•è¦åœ¨æœ€åŽæ·»åŠ ä¸€ä¸ªæ–°æ¢è¡Œ½W¦ï¼Œè€ŒW(xu¨¦)riteBlankLinesåˆ™å¢žåŠ ä¸€ä¸ªæˆ–è€…å¤šä¸ªç©ºè¡Œã€?
关闿–‡äšgå¯ä‹É用TextStream对象的Closeæ–ÒŽ(gu¨©)³•ã€?
åQˆä¸‰åQ‰åˆ›å»ºæ–‡ä»¶åŠ(qi¨¢ng)æ·ÕdŠ æ•°æ®ä¾‹ç¨‹
下é¢çš„代ç å°†åˆ›å¾æ–‡äšgã€æ·»åŠ æ•°æ®ã€å…³é—æ–‡ä»¶å‡ ä¸ªæ¥éª¤ç»“åˆè“væ¥è¿›è¡Œåº”用:(x¨¬)
var fso, tf;
fso = new ActiveXObject("Scripting.FileSystemObject");
// åˆ›å¾æ–°æ–‡ä»?
tf = fso.CreateTextFile("c:\\testfile.txt", true);
// 填写数æ®åQŒåÆˆå¢žåŠ æ¢è¡Œ½W?
tf.WriteLine("Testing 1, 2, 3.") ;
// å¢žåŠ 3个空è¡?
tf.WriteBlankLines(3) ;
// 填写一行,ä¸å¸¦æ¢è¡Œ½W?
tf.Write ("This is a test.");
// 关闿–‡äšg
tf.Close();
åQˆå››åQ‰è¯»å–文件内å®?
从文本文件ä¸è¯Õd–æ•°æ®è¦ä‹É用TextStream对象的Readã€ReadLine或ReadAll æ–ÒŽ(gu¨©)³•。Readæ–ÒŽ(gu¨©)³•用于è¯Õd–æ–‡äšg䏿Œ‡å®šæ•°é‡çš„å—符åQ›ReadLineæ–ÒŽ(gu¨©)³•è¯Õd–一整行åQŒä½†ä¸åŒ…括æ¢è¡Œç¬¦åQ›ReadAllæ–ÒŽ(gu¨©)³•åˆ™è¯»å–æ–‡æœ¬æ–‡ä»¶çš„æ•´ä¸ªå†…容。读å–çš„å†…å®¹å˜æ”¾äºŽå—½W¦ä¸²å˜é‡ä¸ï¼Œç”¨äºŽæ˜„¡¤ºã€åˆ†æžã€‚在使用Read或ReadLineæ–ÒŽ(gu¨©)³•è¯Õd–æ–‡äšg内容æ—Óž¼Œå¦‚æžœè¦èŸ©˜q‡ä¸€äº›éƒ¨åˆ†ï¼Œž®Þp¦ç”¨åˆ°Skip或SkipLineæ–ÒŽ(gu¨©)³•ã€?
下é¢çš„ä»£ç æ¼”½Cºæ‰“开文äšgã€å¡«å†™æ•°æ®ï¼Œç„¶åŽè¯Õd–æ•°æ®åQ?
var fso, f1, ts, s;
var ForReading = 1;
fso = new ActiveXObject("Scripting.FileSystemObject");
// åˆ›å¾æ–‡äšg
f1 = fso.CreateTextFile("c:\\testfile.txt", true);
// 填写一行数æ?
f1.WriteLine("Hello World");
f1.WriteBlankLines(1);
// 关闿–‡äšg
f1.Close();
// 打开文äšg
ts = fso.OpenTextFile("c:\\testfile.txt", ForReading);
// è¯Õd–æ–‡äšg一行内容到å—符ä¸?
s = ts.ReadLine();
// 昄¡¤ºå—符串信æ?
alert("File contents = '" + s + "'");
// 关闿–‡äšg
ts.Close();
åQˆäº”åQ‰ç§»åŠ¨ã€æ‹·è´å’Œåˆ 除文äšg
å¯¹äºŽä»¥ä¸Šä¸‰ç§æ–‡äšgæ“作åQŒjavascript儿œ‰ä¸¤ç§å¯¹åº”的方法:(x¨¬)File.Move æˆ?FileSystemObject.MoveFile用于¿UÕdŠ¨æ–‡äšgåQ›File.Copy æˆ?FileSystemObject.CopyFile用于拯‚´æ–‡äšgåQ›File.Delete æˆ?FileSystemObject.DeleteFileç”¨äºŽåˆ é™¤æ–‡äšgã€?
下é¢çš„ä»£ç æ¼”½Cºåœ¨é©±åЍ噍Cçš„æ ¹ç›®å½•ä¸‹åˆ›å»ÞZ¸€ä¸ªæ–‡æœ¬æ–‡ä»Óž¼Œå¡«å†™ä¸€äº›å†…容,然厞®†æ–‡ä»¶ç§»åŠ¨åˆ°\tmp目录下,å†åœ¨ç›®å½•\temp下é¢å»ºç«‹ä¸€ä¸ªæ–‡ä»¶æ‹·è´ï¼Œæœ€åŽåˆ 除这两个目录的文ä»Óž¼š(x¨¬)
var fso, f1, f2, s;
fso = new ActiveXObject("Scripting.FileSystemObject");
f1 = fso.CreateTextFile("c:\\testfile.txt", true);
// 写一�
f1.Write("This is a test.");
// 关闿–‡äšg
f1.Close();
// 获å–C:\æ ¹ç›®å½•ä¸‹çš„æ–‡ä»¶å¥æŸ?
f2 = fso.GetFile("c:\\testfile.txt");
// ¿UÕdŠ¨æ–‡äšg到\tmp目录ä¸?
f2.Move ("c:\\tmp\\testfile.txt");
// 拯‚´æ–‡äšg到\temp目录ä¸?
f2.Copy ("c:\\temp\\testfile.txt");
// èŽ·å–æ–‡äšg奿Ÿ„
f2 = fso.GetFile("c:\\tmp\\testfile.txt");
f3 = fso.GetFile("c:\\temp\\testfile.txt");
// åˆ é™¤æ–‡äšg
f2.Delete();
f3.Delete();
å…ã€ç»“ è¯?
通过以上对FileSystemObject的儿U对象ã€å±žæ€§å’Œæ–ÒŽ(gu¨©)³•的介¾lå’Œ½CÞZ¾‹åQŒç›¸ä¿¡ä½ å·²ç»å¯¹å¦‚何ä‹É用javascriptè¯è¨€åœ¨é¡µé¢ä¸æ“ä½œé©±åŠ¨å™¨ã€æ–‡ä»¶å’Œæ–‡äšgå¤ÒŽ(gu¨©)œ‰äº†æ¸…晰的认识。但是上˜q°æå?qi¨¢ng)的例程都éžå¸¸ç®€å•,è¦å…¨é¢ã€çµ‹zÕdœ°æŽŒæ¡javascriptæ–‡äšgæ“作技术,˜q˜éœ€è¦å¤§é‡çš„实践¾lƒä¹ (f¨¤n)。而且˜q˜æœ‰ä¸€ç‚ÒŽ(gu¨©)醒大å®Óž¼Œç”׃ºŽæ¶‰åŠ(qi¨¢ng)到在‹¹è§ˆå™¨ä¸˜q›è¡Œæ–‡äšgè¯Õd†™˜q™æ ·çš„高¾U§æ“作,对于默认的æµè§ˆå™¨å®‰å…¨¾U§åˆ«è€Œè¨€åQŒåœ¨ä»£ç ˜q行å‰éƒ½ä¼?x¨¬)æœ‰ä¸€ä¸ªä¿¡æ¯æ½Cºï¼Œ˜q™ç‚¹è¯·åœ¨å®žé™…çŽ¯å¢ƒä¸æ½Cø™®¿é—®è€…注æ„ã€?

]]> - 转:(x¨¬)session机制http://www.aygfsteel.com/wml/articles/55999.htmlwmlwmlFri, 30 Jun 2006 09:16:00 GMThttp://www.aygfsteel.com/wml/articles/55999.html
目录åQ?br />ä¸€ã€æœ¯è¯session
二ã€HTTPå议与状æ€ä¿æŒ?br />三ã€ç†è§£cookie机制
å››ã€ç†è§£session机制
五ã€ç†è§£javax.servlet.http.HttpSession
å…ã€HttpSession常è§é—®é¢˜
七ã€è·¨åº”用½E‹åºçš„sessionå…׃ín
å…«ã€æ€È»“
å‚考文æ¡?br />
ä¸€ã€æœ¯è¯session
在我的ç»éªŒé‡ŒåQŒsession˜q™ä¸ªè¯è¢«æ»¥ç”¨çš„程度大概仅‹Æ¡äºŽtransactionåQŒæ›´åŠ æœ‰‘£çš„æ˜¯transaction与session在æŸäº›è¯å¢ƒä¸‹çš„å«ä¹‰æ˜¯ç›¸åŒçš„ã€?br />
sessionåQŒä¸æ–‡ç»å¸¸ç¿»è¯‘䨓(f¨´)ä¼?x¨¬)è¯åQŒå…¶æœ¬æ¥çš„å«ä¹‰æ˜¯æŒ‡æœ‰å§‹æœ‰¾lˆçš„一¾pÕdˆ—动作/消æ¯åQŒæ¯”如打ç”?sh¨´)è¯æ—¶ä»Žæ‹¿è“vç”?sh¨´)è¯æ‹¨å·åˆ°æŒ‚æ–ç”?sh¨´)è¯è¿™ä¸é—´çš„一¾pÕdˆ—˜q‡ç¨‹å¯ä»¥¿UîC¹‹ä¸ÞZ¸€ä¸ªÂ session。有时候我们å¯ä»¥çœ‹åˆ°è¿™æ ïL(f¨¥ng)š„è¯â€œåœ¨ä¸€ä¸ªæµè§ˆå™¨ä¼?x¨¬)è¯æœŸé—´åQ?..â€ï¼Œ˜q™é‡Œçš„会(x¨¬)è¯ä¸€è¯ç”¨çš„就是其本义åQŒæ˜¯æŒ‡ä»Žä¸€ä¸ªæµè§ˆå™¨½H—壿‰“开到关é—这个期闾b â‘ ã€‚æœ€æ··äØ•çš„æ˜¯â€œç”¨æˆøP¼ˆå®¢æˆ·ç«¯ï¼‰åœ¨ä¸€‹Æ¡ä¼š(x¨¬)è¯æœŸé—´â€è¿™æ ·ä¸€å¥è¯åQŒå®ƒå¯èƒ½æŒ‡ç”¨æˆïL(f¨¥ng)š„一¾pÕdˆ—动作åQˆä¸€èˆ¬æƒ…å†µä¸‹æ˜¯åŒæŸä¸ªå…·ä½“目的相关的一¾pÕdˆ—动作åQŒæ¯”如从ç™Õd½•到选è´å•†å“åˆ°ç»“è´¦ç™»å‡ø™¿™æ ·ä¸€ä¸ªç½‘上è´ç‰©çš„˜q‡ç¨‹åQŒæœ‰æ—¶å€™ä¹Ÿè¢«ç§°ä¸ÞZ¸€ä¸ªtransactionåQ‰ï¼Œç„¶è€Œæœ‰æ—¶å€™ä¹Ÿå¯èƒ½ä»…仅是指一‹Æ¡è¿žæŽ¥ï¼Œä¹Ÿæœ‰å¯èƒ½æ˜¯æŒ‡å«ä¹‰â‘ ,其ä¸çš„差别åªèƒ½é ä¸Šä¸‹æ–‡æ¥æŽ¨æ–â‘¡ã€?br />
然而当session一è¯ä¸Ž¾|‘络åè®®ç›¸å…³è”æ—¶åQŒå®ƒåˆå¾€å¾€éšå«äº†â€œé¢å‘连接â€å’Œ/æˆ–â€œä¿æŒçжæ€â€è¿™æ ·ä¸¤ä¸ªå«ä¹‰ï¼ŒÂ “é¢å‘è¿žæŽ¥â€æŒ‡çš„æ˜¯åœ¨é€šä¿¡åŒæ–¹åœ¨é€šä¿¡ä¹‹å‰è¦å…ˆå»ºç«‹ä¸€ä¸ªé€šä¿¡çš„æ¸ é“,比如打电(sh¨´)è¯ï¼Œç›´åˆ°å¯ÒŽ(gu¨©)–¹æŽ¥äº†ç”?sh¨´)è¯é€šä¿¡æ‰èƒ½å¼€å§‹ï¼Œä¸Žæ¤ç›¸å¯¹çš„æ˜¯å†™ä¿¡åQŒåœ¨ä½ 把信å‘å‡ºåŽ»çš„æ—¶å€™ä½ òq¶ä¸èƒ½ç¡®è®¤å¯¹æ–¹çš„åœ°å€æ˜¯å¦æ£ç¡®åQŒé€šä¿¡æ¸ é“ä¸ä¸€å®šèƒ½å»ºç«‹åQŒä½†å¯¹å‘ä¿¡ähæ¥è¯´åQŒé€šä¿¡å·²ç»å¼€å§‹äº†ã€‚â€œä¿æŒçжæ€â€åˆ™æ˜¯æŒ‡é€šä¿¡çš„一方能够把一¾pÕdˆ—的消æ¯å…³è”è“væ¥ï¼Œä½¿å¾—消æ¯ä¹‹é—´å¯ä»¥äº’相ä¾èµ–åQŒæ¯”如一个æœåŠ¡å‘˜èƒ½å¤Ÿè®¤å‡ºå†æ¬¡å…‰äÍ(f¨´)çš„è€é¡¾å®¢åƈ且记得上‹Æ¡è¿™ä¸ªé¡¾å®¢è¿˜?g¨°u)Æ åº—é‡Œä¸€å—钱。这一¾cÈš„ä¾‹åæœ‰â€œä¸€ä¸ªTCP sessionâ€æˆ–者 “一个POP3 sessionâ€â‘¢ã€?br />
而到了webæœåŠ¡å™¨è“¬å‹ƒå‘展的时代åQŒsession在webå¼€å‘è¯å¢ƒä¸‹çš„è¯ä¹‰åˆæœ‰äº†æ–°çš„æ‰©å±•åQŒå®ƒçš„å«ä¹‰æ˜¯æŒ‡ä¸€¾cÈ”¨æ¥åœ¨å®¢æˆ·ç«¯ä¸ŽæœåŠ¡å™¨ä¹‹é—´ä¿æŒçжæ€çš„解决æ–ÒŽ(gu¨©)¡ˆâ‘£ã€‚有时候sessionä¹Ÿç”¨æ¥æŒ‡˜q™ç§è§£å†³æ–ÒŽ(gu¨©)¡ˆçš„å˜å‚¨ç»“构,如“把xxxä¿å˜åœ¨session 里â€â‘¤ã€‚由于儿U用于webå¼€å‘çš„è¯è¨€åœ¨ä¸€å®šç¨‹åº¦ä¸Šéƒ½æä¾›äº†å¯¹è¿™¿Uè§£å†Ïx–¹æ¡ˆçš„æ”¯æŒåQŒæ‰€ä»¥åœ¨æŸç§ç‰¹å®šè¯è¨€çš„è¯å¢ƒä¸‹åQŒsessionä¹Ÿè¢«ç”¨æ¥æŒ‡ä»£è¯¥è¯a€çš„è§£å†Ïx–¹æ¡ˆï¼Œæ¯”如¾l常把Java里æä¾›çš„javax.servlet.http.HttpSession½Ž€¿UîCØ“(f¨´)sessionâ‘¥ã€?br />
鉴于˜q™ç§æ··äؕ已ä¸å¯æ”¹å˜ï¼Œæœ¬æ–‡ä¸session一è¯çš„˜q用也会(x¨¬)æ ÒŽ(gu¨©)®ä¸Šä¸‹æ–‡æœ‰ä¸åŒçš„å«ä¹‰ï¼Œè¯·å¤§å®¶æ³¨æ„分辨ã€?br />在本文ä¸åQŒä‹Éç”¨ä¸æ–‡â€œæµè§ˆå™¨ä¼?x¨¬)è¯æœŸé—´â€æ¥è¡¨è¾¾å«ä¹‰â‘ ,使用“sessionæœºåˆ¶â€æ¥è¡¨è¾¾å«ä¹‰â‘£ï¼Œä½¿ç”¨â€œsessionâ€è¡¨è¾‘֫义⑤åQŒä‹É用具体的“HttpSessionâ€æ¥è¡¨è¾¾å«ä¹‰â‘?br />
二ã€HTTPå议与状æ€ä¿æŒ?br />HTTP å议本èínæ˜¯æ— çŠ¶æ€çš„åQŒè¿™ä¸ŽHTTPå议本æ¥çš„目的是相符的,客户端åªéœ€è¦ç®€å•çš„å‘æœåС噍è¯äh±‚ä¸‹è²æŸäº›æ–‡äšgåQŒæ— 论是客户端还是æœåŠ¡å™¨éƒ½æ²¡æœ‰å¿…è¦çºªå½•å½¼æ¤è¿‡åŽÈš„è¡ŒäØ“(f¨´)åQŒæ¯ä¸€‹Æ¡è¯·æ±‚之间都是独立的åQŒå¥½æ¯”一个顾客和一个自动售货机或者一个普通的åQˆéžä¼?x¨¬)员åˆÓž¼‰å¤§å–åœÞZ¹‹é—´çš„å…³ç³»ä¸€æ —÷€?br />
ç„¶è€Œèªæ˜Žï¼ˆæˆ–者贪心?åQ‰çš„äºÞZ»¬å¾ˆå¿«å‘现如果能够æä¾›ä¸€äº›æŒ‰éœ€ç”Ÿæˆçš„动æ€ä¿¡æ¯ä¼š(x¨¬)使webå˜å¾—æ›´åŠ æœ‰ç”¨åQŒå°±åƒç»™æœ‰çº¿ç”?sh¨´)è§†åŠ ä¸Šç‚Ò?gu¨©)’åŠŸèƒ½ä¸€æ —÷€‚è¿™¿U需求一斚w¢˜q«ä‹ÉHTML逿¥æ·ÕdŠ äº†è¡¨å•ã€è„šæœ¬ã€DOM½{‰å®¢æˆïL(f¨¥ng)«¯è¡ŒäØ“(f¨´)åQŒå¦ä¸€æ–šw¢åœ¨æœåŠ¡å™¨ç«¯åˆ™å‡ºçŽ°äº†CGI规范以å“应客æˆïL(f¨¥ng)«¯çš„动æ€è¯·æ±‚ï¼Œä½œäØ“(f¨´)ä¼ è¾“è½½ä½“çš„HTTPåè®®ä¹Ÿæ·»åŠ äº†æ–‡äšg上è²ã€Â cookie˜q™äº›ç‰ÒŽ(gu¨©)€§ã€‚å…¶ä¸cookieçš„ä½œç”¨å°±æ˜¯äØ“(f¨´)了解决HTTPåè®®æ— çŠ¶æ€çš„¾~ºé™·æ‰€ä½œå‡ºçš„åŠªåŠ›ã€‚è‡³äºŽåŽæ¥å‡ºçŽ°çš„session机制则是åˆä¸€¿U在客户端与æœåŠ¡å™¨ä¹‹é—´ä¿æŒçжæ€çš„解决æ–ÒŽ(gu¨©)¡ˆã€?br />
è®©æˆ‘ä»¬ç”¨å‡ ä¸ªä¾‹åæ¥æ˜qîC¸€ä¸‹cookieå’Œsession机制之间的区别与è”系。笔者曾¾l常åŽÈš„一家咖啡店有å–5æ¯å’–å•¡å…è´¹èµ ä¸€æ¯å’–å•¡çš„ä¼˜æƒ åQŒç„¶è€Œä¸€‹Æ¡æ€§æ¶ˆè´?æ¯å’–å•¡çš„æœÞZ¼š(x¨¬)微乎其微åQŒè¿™æ—¶å°±éœ€è¦æŸ¿Uæ–¹å¼æ¥¾Uªå½•æŸä½™å‘Ö®¢çš„æ¶ˆè´ÒŽ(gu¨©)•°é‡ã€‚æƒ³è±¡ä¸€ä¸‹å…¶å®žä¹Ÿæ— å¤–ä¹Žä¸‹é¢çš„å‡ ç§æ–ÒŽ(gu¨©)¡ˆåQ?br />1ã€è¯¥åº—的店员很厉宻I¼Œèƒ½è®°ä½æ¯ä½é¡¾å®¢çš„æ¶ˆè´¹æ•°é‡åQŒåªè¦é¡¾å®¢ä¸€èµ°è¿›å’–啡店,店员ž®ÞqŸ¥é“该怎么对待了。这¿Uåšæ³•就是å议本íw«æ”¯æŒçжæ€ã€?br />2ã€å‘¾l™é¡¾å®¢ä¸€å¼ å¡ç‰‡ï¼Œä¸Šé¢è®°å½•ç€æ¶ˆè´¹çš„æ•°é‡ï¼Œä¸€èˆ¬è¿˜æœ‰ä¸ªæœ‰æ•ˆæœŸé™ã€‚毋ơ消è´ÒŽ(gu¨©)—¶åQŒå¦‚果顾客出½Cø™¿™å¼ å¡ç‰‡ï¼Œåˆ™æ¤‹Æ¡æ¶ˆè´¹å°±ä¼?x¨¬)ä¸Žä»¥å‰æˆ–以åŽçš„æ¶ˆè´¹ç›¸è”¾p»è“væ¥ã€‚è¿™¿Uåšæ³•å°±æ˜¯åœ¨å®¢æˆ·ç«¯ä¿æŒçжæ€ã€?br />3ã€å‘¾l™é¡¾å®¢ä¸€å¼ 会(x¨¬)员å¡åQŒé™¤äº†å¡å·ä¹‹å¤–什么信æ¯ä¹Ÿä¸çºªå½•ï¼Œæ¯æ¬¡æ¶ˆè´¹æ—Óž¼Œå¦‚æžœ™å‘Ö®¢å‡ºç¤ºè¯¥å¡ç‰‡ï¼Œåˆ™åº—员在店里的纪录本上找到这个å¡å·å¯¹åº”çš„¾Uªå½•æ·ÕdŠ ä¸€äº›æ¶ˆè´¹ä¿¡æ¯ã€‚è¿™¿Uåšæ³•就是在æœåŠ¡å™¨ç«¯ä¿æŒçжæ€ã€?br />
ç”׃ºŽHTTPåè®®æ˜¯æ— çŠ¶æ€çš„åQŒè€Œå‡ºäºŽç§¿U考虑也ä¸å¸Œæœ›ä½¿ä¹‹æˆäØ“(f¨´)有状æ€çš„åQŒå› æ¤ï¼ŒåŽé¢ä¸¤ç§æ–ÒŽ(gu¨©)¡ˆž®±æˆä¸ºçŽ°å®žçš„é€‰æ‹©ã€‚å…·ä½“æ¥è¯´cookie机制采用的是在客æˆïL(f¨¥ng)«¯ä¿æŒçжæ€çš„æ–ÒŽ(gu¨©)¡ˆåQŒè€Œsession机制采用的是在æœåŠ¡å™¨ç«¯ä¿æŒçжæ€çš„æ–ÒŽ(gu¨©)¡ˆã€‚åŒæ—¶æˆ‘们也看到åQŒç”±äºŽé‡‡ç”¨æœåŠ¡å™¨ç«¯ä¿æŒçжæ€çš„æ–ÒŽ(gu¨©)¡ˆåœ¨å®¢æˆïL(f¨¥ng)«¯ä¹Ÿéœ€è¦ä¿å˜ä¸€ä¸ªæ ‡è¯†ï¼Œæ‰€ä»¥session机制å¯èƒ½éœ€è¦å€ŸåŠ©äºŽcookie机制æ¥è¾¾åˆîC¿å˜æ ‡è¯†çš„目的åQŒä½†å®žé™…上它˜q˜æœ‰å…¶ä»–选择ã€?br />
三ã€ç†è§£cookie机制Â
cookie机制的基本原ç†å°±å¦‚上é¢çš„例å一æ ïL(f¨¥ng)®€å•,但是˜q˜æœ‰å‡ 个问题需è¦è§£å†»I¼š(x¨¬)“会(x¨¬)员å¡â€å¦‚何分å‘;“会(x¨¬)员å¡â€çš„内容åQ›ä»¥å?qi¨¢ng)客户如何ä‹É用“会(x¨¬)员å¡â€ã€?br />
æ£ç»Ÿçš„cookieåˆ†å‘æ˜¯é€šè¿‡æ‰©å±•HTTPåè®®æ¥å®žçŽ°çš„åQŒæœåŠ¡å™¨é€šè¿‡åœ¨HTTPçš„å“应头ä¸åŠ ä¸Šä¸€è¡Œç‰¹ŒDŠçš„æŒ‡ç¤ºä»¥æ½Cºæµè§ˆå™¨æŒ‰ç…§æŒ‡ç¤ºç”Ÿæˆç›¸åº”çš„cookie。然而纯¾_¹çš„客户端脚本如JavaScript或者VBScript也å¯ä»¥ç”Ÿæˆcookieã€?br />
而cookie 的ä‹É用是由æµè§ˆå™¨æŒ‰ç…§ä¸€å®šçš„原则在åŽå°è‡ªåЍå‘é€ç»™æœåŠ¡å™¨çš„ã€‚æµè§ˆå™¨‹‚€(g¨¨)查所有å˜å‚¨çš„cookieåQŒå¦‚æžœæŸä¸ªcookie所声明的作用范围大于ç‰äºŽå°†è¦è¯·æ±‚çš„èµ„æºæ‰€åœ¨çš„ä½ç½®åQŒåˆ™æŠŠè¯¥cookie附在è¯äh±‚资æºçš„HTTPè¯äh±‚头上å‘é€ç»™æœåŠ¡å™¨ã€‚æ„æ€æ˜¯éº¦å½“劳的ä¼?x¨¬)员å¡åªèƒ½åœ¨éº¦å½“劳的店里出示åQŒå¦‚æžœæŸå®¶åˆ†åº—还å‘行了自å·Þqš„ä¼?x¨¬)员å¡ï¼Œé‚£ä¹ˆ˜q›è¿™å®¶åº—的时候除了è¦å‡ºç¤ºéº¦å½“劳的ä¼?x¨¬)员å¡ï¼Œ˜q˜è¦å‡ºç¤º˜q™å®¶åº—çš„ä¼?x¨¬)员å¡ã€?br />
cookie的内容主è¦åŒ…括:(x¨¬)åå—åQŒå€û|¼Œ˜q‡æœŸæ—‰™—´åQŒèµ\径和域ã€?br />å…¶ä¸åŸŸå¯ä»¥æŒ‡å®šæŸä¸€ä¸ªåŸŸæ¯”如.google.comåQŒç›¸å½“于æ€Õdº—招牌åQŒæ¯”如宋zå…¬å¸ï¼Œä¹Ÿå¯ä»¥æŒ‡å®šä¸€ä¸ªåŸŸä¸‹çš„具体æŸå°æœºå™¨æ¯”如www.google.com或者f(xi¨¦)roogle.google.comåQŒå¯ä»¥ç”¨é£˜æŸ”æ¥å𿝔ã€?br />路径ž®±æ˜¯è·Ÿåœ¨åŸŸååŽé¢çš„URL路径åQŒæ¯”å¦?或è€?foo½{‰ç‰åQŒå¯ä»¥ç”¨æŸé£˜æŸ”ä¸“æŸœåšæ¯”ã€?br />路径与域åˆåœ¨ä¸€èµ·å°±æž„æˆäº†cookie的作用范围ã€?br />如果ä¸è®¾¾|®è¿‡æœŸæ—¶é—ß_(d¨¢)¼Œåˆ™è¡¨½Cø™¿™ä¸ªcookie的生命期为æµè§ˆå™¨ä¼?x¨¬)è¯æœŸé—´åQŒåªè¦å…³é—æµè§ˆå™¨½H—å£åQŒcookiež®±æ¶ˆå¤×ƒº†ã€‚è¿™¿U生命期为æµè§ˆå™¨ä¼?x¨¬)è¯æœŸçš„ cookie被称ä¸ÞZ¼š(x¨¬)è¯cookie。会(x¨¬)è¯cookie一般ä¸å˜å‚¨åœ¨ç¡¬ç›˜ä¸Šè€Œæ˜¯ä¿å˜åœ¨å†…å˜é‡ŒåQŒå½“ç„¶è¿™¿Uè¡Œä¸ºåÆˆä¸æ˜¯è§„范规定的。如果设¾|®äº†˜q‡æœŸæ—‰™—´åQŒæµè§ˆå™¨ž®×ƒ¼š(x¨¬)把cookieä¿å˜åˆ°ç¡¬ç›˜ä¸ŠåQŒå…³é—åŽå†æ¬¡æ‰“å¼€‹¹è§ˆå™¨ï¼Œ˜q™äº›cookieä»ç„¶æœ‰æ•ˆç›´åˆ°‘…过讑֮šçš„过期时间ã€?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(f¨¥ng)š„cookie。一般æ¥è¯´æ˜¯ç”¨javascriptçš„window.open打开的窗å£ä¼š(x¨¬)与原½H—å£å…׃ín内å˜cookie。æµè§ˆå™¨å¯¹äºŽä¼?x¨¬)è¯cookie的这¿Uåªè®¤cookieä¸è®¤äººçš„å¤„ç†æ–¹å¼¾l常¾l™é‡‡ç”¨session机制的web应用½E‹åºå¼€å‘è€…é€ æˆå¾ˆå¤§çš„困扰ã€?br />
下颞®±æ˜¯ä¸€ä¸ªgoolge讄¡½®cookieçš„å“应头的例å?br />HTTP/1.1 302 Found
Location:Â http://www.google.com/intl/zh-CN/
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
Content-Type:Â text/html
˜q™æ˜¯ä½¿ç”¨HTTPLook˜q™ä¸ªHTTP Sniffer软äšgæ¥ä¿˜èŽïL(f¨¥ng)š„HTTP通讯¾Uªå½•的一部分
‹¹è§ˆå™¨åœ¨å†æ¬¡è®‰K—®goolgeçš„èµ„æºæ—¶è‡ªåЍå‘外å‘é€cookie
使用Firefoxå¯ä»¥å¾ˆå®¹æ˜“的观察现有的cookieçš„å€?br />使用HTTPLooké…åˆF(tu¨¢n)irefoxå¯ä»¥å¾ˆå®¹æ˜“çš„ç†è§£cookie的工作原ç†ã€?br />
IE也å¯ä»¥è®¾¾|®åœ¨æŽ¥å—cookieå‰è¯¢é—?br />
˜q™æ˜¯ä¸€ä¸ªè¯¢é—®æŽ¥å—cookieçš„å¯¹è¯æ¡†ã€?br />
å››ã€ç†è§£session机制
session机制是一¿UæœåŠ¡å™¨ç«¯çš„æœºåˆ¶åQŒæœåŠ¡å™¨ä½¿ç”¨ä¸€¿Uç±»ä¼égºŽæ•£åˆ—表的¾l“æž„åQˆä¹Ÿå¯èƒ½ž®±æ˜¯ä½¿ç”¨æ•£åˆ—表)æ¥ä¿å˜ä¿¡æ¯ã€?br />
当程åºéœ€è¦äØ“(f¨´)æŸä¸ªå®¢æˆ·ç«¯çš„è¯äh±‚创å¾ä¸€ä¸ªsession的时候,æœåŠ¡å™¨é¦–å…ˆæ£€æŸ¥è¿™ä¸ªå®¢æˆïL(f¨¥ng)«¯çš„请求里是å¦å·²åŒ…å«äº†ä¸€ä¸ªsessionæ ‡è¯†Â - ¿UîCØ“(f¨´) session idåQŒå¦‚果已包å«ä¸€ä¸ªsession id则说明以å‰å·²¾l䨓(f¨´)æ¤å®¢æˆïL(f¨¥ng)«¯åˆ›å¾˜q‡sessionåQŒæœåС噍ž®±æŒ‰ç…§session id把这个 session‹‚€(g¨¨)索出æ¥ä‹É用(如果‹‚€(g¨¨)ç´¢ä¸åˆŽÍ¼Œå¯èƒ½ä¼?x¨¬)æ–°å»ÞZ¸€ä¸ªï¼‰åQŒå¦‚果客æˆïL(f¨¥ng)«¯è¯äh±‚ä¸åŒ…å«session idåQŒåˆ™ä¸ºæ¤å®¢æˆ·ç«¯åˆ›å»ÞZ¸€ä¸ªsessionòq¶ä¸”生æˆä¸€ä¸ªä¸Žæ¤session相关è”çš„session idåQŒsession id的值应该是一个既ä¸ä¼š(x¨¬)é‡å¤åQŒåˆä¸å®¹æ˜“被扑ֈ°è§„å¾‹ä»¥ä»¿é€ çš„å—符ä¸ÔŒ¼Œ˜q™ä¸ªÂ session idž®†è¢«åœ¨æœ¬‹Æ¡å“应丘q”回¾l™å®¢æˆïL(f¨¥ng)«¯ä¿å˜ã€?br />
ä¿å˜˜q™ä¸ªsession id的方å¼å¯ä»¥é‡‡ç”¨cookieåQŒè¿™æ ·åœ¨äº¤äº’˜q‡ç¨‹ä¸æµè§ˆå™¨å¯ä»¥è‡ªåŠ¨çš„æŒ‰ç…§è§„åˆ™æŠŠ˜q™ä¸ªæ ‡è¯†å‘挥¾l™æœåŠ¡å™¨ã€‚ä¸€èˆ¬è¿™ä¸ªcookieçš„åå—都是类ä¼égºŽSEEESIONIDåQŒè€Œã€‚比如weblogic对于web应用½E‹åºç”Ÿæˆçš„cookieåQŒJSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764åQŒå®ƒçš„åå—就是 JSESSIONIDã€?br />
ç”׃ºŽcookieå¯ä»¥è¢«äh为的¼›æ¢åQŒå¿…™åÀLœ‰å…¶ä»–机制以便在cookieè¢«ç¦æ¢æ—¶ä»ç„¶èƒ½å¤ŸæŠŠsession idä¼ é€’å›žæœåŠ¡å™¨ã€‚ç»å¸¸è¢«ä½¿ç”¨çš„一¿U技术å«åšURLé‡å†™åQŒå°±æ˜¯æŠŠsession idç›´æŽ¥é™„åŠ åœ¨URL路径的åŽé¢ï¼Œé™„åŠ æ–¹å¼ä¹Ÿæœ‰ä¸¤ç§åQŒä¸€¿Uæ˜¯ä½œäØ“(f¨´)URLè·¯å¾„çš„é™„åŠ ä¿¡æ¯ï¼Œè¡¨çް形å¼ä¸?a href="http://...../xxx;jsessionid=">http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
å¦ä¸€¿Uæ˜¯ä½œäØ“(f¨´)查询å—ç¬¦ä¸²é™„åŠ åœ¨URLåŽé¢åQŒè¡¨çްåÅžå¼äØ“(f¨´)http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
˜q™ä¸¤¿Uæ–¹å¼å¯¹äºŽç”¨æˆäh¥è¯´æ˜¯æ²¡æœ‰åŒºåˆ«çš„ï¼Œåªæ˜¯æœåŠ¡å™¨åœ¨è§£æžçš„æ—¶å€™å¤„ç†çš„æ–¹å¼ä¸åŒåQŒé‡‡ç”¨ç¬¬ä¸€¿Uæ–¹å¼ä¹Ÿæœ‰åˆ©äºŽæŠŠsession id的信æ¯å’Œæ£å¸¸½E‹åºå‚数区分开æ¥ã€?br />ä¸ÞZº†åœ¨æ•´ä¸ªäº¤äº’过½E‹ä¸å§‹ç»ˆä¿æŒçжæ€ï¼Œž®±å¿…™åÕdœ¨æ¯ä¸ªå®¢æˆ·ç«¯å¯èƒ½è¯·æ±‚的路径åŽé¢éƒ½åŒ…å«è¿™ä¸ªsession idã€?br />
å¦ä¸€¿U技术å«åšè¡¨å•éšè—å—ŒDüc(di¨£n)€‚就是æœåС噍ä¼?x¨¬)自动修改表å•,æ·ÕdŠ ä¸€ä¸ªéšè—å—ŒDµï¼Œä»¥ä¾¿åœ¨è¡¨å•æäº¤æ—¶èƒ½å¤ŸæŠŠsession idä¼ é€’å›žæœåŠ¡å™¨ã€‚æ¯”å¦‚ä¸‹é¢çš„表å•
http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869
å…ã€HttpSession常è§é—®é¢˜
åQˆåœ¨æœ¬å°èŠ‚ä¸sessionçš„å«ä¹‰äØ“(f¨´)⑤和⑥的混åˆåQ?br />
1ã€session在何时被创å¾
一个常è§çš„误解是以为session在有客户端访问时ž®Þp¢«åˆ›å¾åQŒç„¶è€Œäº‹å®žæ˜¯ç›´åˆ°æŸserver端程åºè°ƒç”¨Â HttpServletRequest.getSession(true)˜q™æ ·çš„è¯å¥æ—¶æ‰è¢«åˆ›å¾åQŒæ³¨æ„如果JSP没有昄¡¤ºçš„ä‹É用Â?!--page session="false--> 关é—sessionåQŒåˆ™JSPæ–‡äšg在编译æˆServletæ—¶å°†ä¼?x¨¬)è‡ªåŠ¨åŠ ä¸Šè¿™æ ·ä¸€æ¡è¯å¥Â HttpSession session = HttpServletRequest.getSession(true);˜q™ä¹Ÿæ˜¯JSPä¸éšå«çš„ session对象的æ¥åކã€?br />
ç”׃ºŽsessionä¼?x¨¬)消耗内å˜èµ„æºï¼Œå› æ¤åQŒå¦‚æžœä¸æ‰“算使用sessionåQŒåº”该在所有的JSPä¸å…³é—它ã€?br />
2ã€sessionä½•æ—¶è¢«åˆ é™?br />¾l¼åˆå‰é¢çš„讨论,sessionåœ¨ä¸‹åˆ—æƒ…å†µä¸‹è¢«åˆ é™¤a.½E‹åºè°ƒç”¨HttpSession.invalidate();或b.è·ç¦»ä¸Šä¸€‹Æ¡æ”¶åˆ°å®¢æˆïL(f¨¥ng)«¯å‘é€çš„session idæ—‰™—´é—´éš”‘…è¿‡äº†session的超时设¾|?或c.æœåŠ¡å™¨è¿›½E‹è¢«åœæ¢åQˆéžæŒä¹…sessionåQ?br />
3ã€å¦‚何åšåˆ°åœ¨‹¹è§ˆå™¨å…³é—æ—¶åˆ é™¤session
ä¸¥æ ¼çš„è®²åQŒåšä¸åˆ°˜q™ä¸€ç‚V€‚å¯ä»¥åšä¸€ç‚¹åŠªåŠ›çš„åŠžæ³•æ˜¯åœ¨æ‰€æœ‰çš„å®¢æˆ·ç«¯é¡µé¢é‡Œä½¿ç”¨javascript代ç window.oncoloseæ¥ç›‘视æµè§ˆå™¨çš„å…³é—动作,然åŽå‘æœåС噍å‘é€ä¸€ä¸ªè¯·æ±‚æ¥åˆ 除session。但是对于æµè§ˆå™¨å´©æºƒæˆ–è€…å¼ºè¡Œæ€æ»è¿›½E‹è¿™äº›éžå¸¸è§„手段ä»ç„¶æ— 能为力ã€?br />
4ã€æœ‰ä¸ªHttpSessionListener是怎么回事
ä½ å¯ä»¥åˆ›å»ø™¿™æ ïL(f¨¥ng)š„listeneråŽÈ›‘控session的创建和销æ¯äº‹ä»Óž¼Œä½¿å¾—在å‘生这æ ïL(f¨¥ng)š„事äšgæ—¶ä½ å¯ä»¥åšä¸€äº›ç›¸åº”çš„å·¥ä½œã€‚æ³¨æ„æ˜¯session的创建和销æ¯åŠ¨ä½œè§¦å‘listeneråQŒè€Œä¸æ˜¯ç›¸å。类似的与HttpSession有关的listener˜q˜æœ‰Â HttpSessionBindingListeneråQŒHttpSessionActivationListener和 HttpSessionAttributeListenerã€?br />
5ã€å˜æ”‘Öœ¨sessionä¸çš„对象必须是å¯åºåˆ—化的å?br />䏿˜¯å¿…éœ€çš„ã€‚è¦æ±‚对象å¯åºåˆ—åŒ–åªæ˜¯äØ“(f¨´)了session能够在集¾Ÿ¤ä¸è¢«å¤åˆ¶æˆ–者能够æŒä¹…ä¿å˜æˆ–è€…åœ¨å¿…è¦æ—¶server能够暂时把session交æ¢å‡ºå†…å˜ã€‚在 Weblogic Serverçš„session䏿”¾¾|®ä¸€ä¸ªä¸å¯åºåˆ—化的对象在控制åîC¸Šä¼?x¨¬)æ”¶åˆîC¸€ä¸ªè¦å‘Šã€‚我所用过的æŸä¸ªiPlanet版本如果 session䏿œ‰ä¸å¯åºåˆ—化的对象åQŒåœ¨sessioné”€æ¯æ—¶ä¼?x¨¬)有一个ExceptionåQŒå¾ˆå¥‡æ€ªã€?br />
6ã€å¦‚何æ‰èƒ½æ£¼‹®çš„åº”ä»˜å®¢æˆ·ç«¯ç¦æ¢cookieçš„å¯èƒ½æ€?br />å¯ÒŽ(gu¨©)‰€æœ‰çš„URL使用URLé‡å†™åQŒåŒ…括超链接åQŒformçš„actionåQŒå’Œé‡å®šå‘çš„URLåQŒå…·ä½“åšæ³•å‚è§[6]
http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770
7ã€å¼€ä¸¤ä¸ª‹¹è§ˆå™¨çª—å£è®¿é—®åº”用程åºä¼š(x¨¬)使用åŒä¸€ä¸ªsession˜q˜æ˜¯ä¸åŒçš„session
å‚è§½W¬ä¸‰ž®èЂ坹cookie的讨论,对sessionæ¥è¯´æ˜¯åªè®¤idä¸è®¤äººï¼Œå› æ¤ä¸åŒçš„æµè§ˆå™¨åQŒä¸åŒçš„½H—壿‰“开方å¼ä»¥åŠ(qi¨¢ng)ä¸åŒçš„cookieå˜å‚¨æ–¹å¼éƒ½ä¼š(x¨¬)对这个问题的½{”案有媄å“ã€?br />
8ã€å¦‚何防æ¢ç”¨æˆäh‰“开两个‹¹è§ˆå™¨çª—壿“作导致的sessionæ··äØ•
˜q™ä¸ªé—®é¢˜ä¸Žé˜²æ¢è¡¨å•多‹Æ¡æäº¤æ˜¯¾cÖM¼¼çš„,å¯ä»¥é€šè¿‡è®„¡½®å®¢æˆ·ç«¯çš„令牌æ¥è§£å†Ÿë€‚就是在æœåŠ¡å™¨æ¯‹Æ¡ç”Ÿæˆä¸€ä¸ªä¸åŒçš„id˜q”回¾l™å®¢æˆïL(f¨¥ng)«¯åQŒåŒæ—¶ä¿å˜åœ¨session里,客户端æäº¤è¡¨å•时必须把这个id也返回æœåС噍åQŒç¨‹åºé¦–先比较返回的id与ä¿å˜åœ¨session里的值是å¦ä¸€è‡ß_(d¨¢)¼Œå¦‚æžœä¸ä¸€è‡´åˆ™è¯´æ˜Žæœ¬æ¬¡æ“作已ç»è¢«æäº¤è¿‡äº†ã€‚å¯ä»¥å‚看《J2EEæ ¸å¿ƒæ¨¡å¼ã€‹å…³äºŽè¡¨½Cºå±‚模å¼çš„éƒ¨åˆ†ã€‚éœ€è¦æ³¨æ„的是对于ä‹É用javascript window.open打开的窗å£ï¼Œä¸€èˆ¬ä¸è®„¡½®˜q™ä¸ªidåQŒæˆ–者ä‹É用å•独的idåQŒä»¥é˜²ä¸»½H—壿— 法æ“作åQŒå¾è®®ä¸è¦å†window.open打开的窗å£é‡Œåšä¿®æ”ÒŽ(gu¨©)“作,˜q™æ ·ž®±å¯ä»¥ä¸ç”¨è®¾¾|®ã€?br />
9ã€äØ“(f¨´)什么在Weblogic Server䏿”¹å˜session的值åŽè¦é‡æ–°è°ƒç”¨ä¸€‹Æ¡session.setValue
åšè¿™ä¸ªåŠ¨ä½œä¸»è¦æ˜¯ä¸ÞZº†åœ¨é›†¾Ÿ¤çŽ¯å¢ƒä¸æç¤ºWeblogic Server sessionä¸çš„值å‘生了改å˜åQŒéœ€è¦å‘å…¶ä»–æœåŠ¡å™¨è¿›½E‹å¤åˆ¶æ–°çš„session倹{€?br />
10ã€äØ“(f¨´)什么sessionä¸è§äº?br />排除sessionæ£å¸¸å¤±æ•ˆçš„å› ç´ ä¹‹å¤–ï¼ŒæœåŠ¡å™¨æœ¬íw«çš„å¯èƒ½æ€§åº”该是微乎其微的,虽然½W”者在iPlanet6SP1åŠ è‹¥òq²è¡¥ä¸çš„Solaris版本上倒也é‡åˆ°˜q‡ï¼›‹¹è§ˆå™¨æ’ä»¶çš„å¯èƒ½æ€§æ¬¡ä¹‹ï¼Œ½W”者也é‡åˆ°˜q?721æ’äšgé€ æˆçš„问题;ç†è®ºä¸Šé˜²ç«å¢™æˆ–è€…ä»£ç†æœåŠ¡å™¨åœ¨cookie处ç†ä¸Šä¹Ÿæœ‰å¯èƒ½ä¼š(x¨¬)出现问题ã€?br />出现˜q™ä¸€é—®é¢˜çš„å¤§éƒ¨åˆ†åŽŸå› éƒ½æ˜¯½E‹åºçš„错误,最常è§çš„就是在一个应用程åºä¸åŽ»è®¿é—®å¦å¤–一个应用程åºã€‚æˆ‘ä»¬åœ¨ä¸‹ä¸€èŠ‚è®¨è®ø™¿™ä¸ªé—®é¢˜ã€?br />
七ã€è·¨åº”用½E‹åºçš„sessionå…׃ín
常常有这æ ïL(f¨¥ng)š„æƒ…况åQŒä¸€ä¸ªå¤§™å¹ç›®è¢«åˆ†å‰²æˆè‹¥å¹²ž®é¡¹ç›®å¼€å‘,ä¸ÞZº†èƒ½å¤Ÿäº’ä¸òq²æ‰°åQŒè¦æ±‚æ¯ä¸ªå°™å¹ç›®ä½œäØ“(f¨´)一个å•独的web应用½E‹åºå¼€å‘ï¼Œå¯æ˜¯åˆîCº†æœ€åŽçªç„¶å‘现æŸå‡ 个ž®é¡¹ç›®ä¹‹é—´éœ€è¦å…±äº«ä¸€äº›ä¿¡æ¯ï¼Œæˆ–者想使用sessionæ¥å®žçްSSO(single sign on)åQŒåœ¨sessionä¸ä¿å˜login的用户信æ¯ï¼Œæœ€è‡ªç„¶çš„è¦æ±‚是应用½E‹åºé—´èƒ½å¤Ÿè®¿é—®å½¼æ¤çš„sessionã€?br />
然而按照Servlet规范åQŒsession的作用范围应该仅仅é™äºŽå½“å‰åº”用程åºä¸‹åQŒä¸åŒçš„应用½E‹åºä¹‹é—´æ˜¯ä¸èƒ½å¤Ÿäº’相讉K—®å¯ÒŽ(gu¨©)–¹çš„session的。å„个应用æœåŠ¡å™¨ä»Žå®žé™…æ•ˆæžœä¸Šéƒ½éµå®ˆäº†˜q™ä¸€è§„范åQŒä½†æ˜¯å®žçŽ°çš„¾l†èŠ‚å´å¯èƒ½å„有ä¸åŒï¼Œå› æ¤è§£å†³è·¨åº”用程åºsessionå…׃ín的方法也å„ä¸ç›¸åŒã€?br />
首先æ¥çœ‹ä¸€ä¸‹Tomcat是如何实现web应用½E‹åºä¹‹é—´session的隔¼›Èš„åQŒä»ŽÂ Tomcat讄¡½®çš„cookie路径æ¥çœ‹åQŒå®ƒå¯¹ä¸åŒçš„应用½E‹åºè®„¡½®çš„cookie路径是ä¸åŒçš„åQŒè¿™æ ·ä¸åŒçš„应用½E‹åºæ‰€ç”¨çš„session id是ä¸åŒçš„åQŒå› æ¤å³ä½¿åœ¨åŒä¸€ä¸ªæµè§ˆå™¨½H—å£é‡Œè®¿é—®ä¸åŒçš„应用½E‹åºåQŒå‘é€ç»™æœåŠ¡å™¨çš„session id也å¯ä»¥æ˜¯ä¸åŒçš„ã€?br />
æ ÒŽ(gu¨©)®˜q™ä¸ªç‰ÒŽ(gu¨©)€§ï¼Œæˆ‘们å¯ä»¥æŽ¨æµ‹Tomcatä¸session的内å˜ç»“构大致如下ã€?br />
½W”者以å‰ç”¨˜q‡çš„iPlanetä¹Ÿé‡‡ç”¨çš„æ˜¯åŒæ ïL(f¨¥ng)š„æ–¹å¼åQŒä¼°è®¡SunONE与iPlanet之间ä¸ä¼š(x¨¬)有太大的差别。对于这¿Uæ–¹å¼çš„æœåŠ¡å™¨ï¼Œè§£å†³çš„æ€èµ\很简å•,实际实行èµäh¥ä¹Ÿä¸éš¾ã€‚è¦ä¹ˆè®©æ‰€æœ‰çš„应用½E‹åºå…׃ín一个session idåQŒè¦ä¹ˆè®©åº”用½E‹åºèƒ½å¤ŸèŽ·å¾—å…¶ä»–åº”ç”¨½E‹åºçš„session idã€?br />
iPlanet䏿œ‰ä¸€¿U很½Ž€å•çš„æ–ÒŽ(gu¨©)³•æ¥å®žçŽ°å…±äº«ä¸€ä¸ªsession idåQŒé‚£ž®±æ˜¯æŠŠå„个应用程åºçš„cookie路径都设ä¸?åQˆå®žé™…上应该æ˜?NASAppåQŒå¯¹äºŽåº”ç”¨ç¨‹åºæ¥è®²å®ƒçš„ä½œç”¨ç›¸å½“äºŽæ ¹ï¼‰ã€?br />
/NASApp
éœ€è¦æ³¨æ„的是,æ“作å…׃ínçš„session应该éµåó@一些编½E‹çº¦å®šï¼Œæ¯”如在session attributeåå—çš„å‰é¢åŠ ä¸Šåº”ç”¨ç¨‹åºçš„å‰ç¼€åQŒä‹Éå¾—Â setAttribute("name", "neo")å˜æˆsetAttribute("app1.name", "neo")åQŒä»¥é˜²æ¢å‘½å½Iºé—´å†²çªåQŒå¯¼è‡´äº’相覆盖ã€?br />
在Tomcatä¸åˆ™æ²¡æœ‰˜q™ä¹ˆæ–¹ä¾¿çš„选择。在Tomcat版本3上,我们˜q˜å¯ä»¥æœ‰ä¸€äº›æ‰‹ŒD‰|¥å…׃ínsession。对于版æœ?以上的TomcatåQŒç›®å‰ç¬”者尚未å‘现简å•的办法。åªèƒ½å€ŸåŠ©äºŽç¬¬ä¸‰æ–¹çš„åŠ›é‡ï¼Œæ¯”如使用文äšgã€æ•°æ®åº“ã€JMS或者客æˆïL(f¨¥ng)«¯cookieåQŒURL傿•°æˆ–者éšè—å—ŒD늉手段ã€?br />
我们å†çœ‹ä¸€ä¸‹Weblogic Server是如何处ç†sessionçš„ã€?br />
 Â
从截å±ç”»é¢ä¸Šå¯ä»¥çœ‹åˆ°Weblogic Serverå¯ÒŽ(gu¨©)‰€æœ‰çš„应用½E‹åºè®„¡½®çš„cookieçš„èµ\径都æ˜?åQŒè¿™æ˜¯ä¸æ˜¯æ„味ç€åœ¨Weblogic Serverä¸é»˜è®¤çš„ž®±å¯ä»¥å…±äº«session了呢åQŸç„¶è€Œä¸€ä¸ªå°å®žéªŒå›_¯è¯æ˜Žå³ä‹Éä¸åŒçš„应用程åºä‹É用的是åŒä¸€ä¸ªsessionåQŒå„个应用程åºä»ç„¶åªèƒ½è®¿é—®è‡ªå·±æ‰€è®„¡½®çš„那些属性。这说明Weblogic Serverä¸çš„session的内å˜ç»“æž„å¯èƒ½å¦‚ä¸?br />
对于˜q™æ ·ä¸€¿U结构,在 session机制本èín上æ¥è§£å†³sessionå…׃ín的问题应该是ä¸å¯èƒ½çš„了。除了借助于第三方的力é‡ï¼Œæ¯”如使用文äšgã€æ•°æ®åº“ã€JMS或者客æˆïL(f¨¥ng)«¯Â cookieåQŒURL傿•°æˆ–者éšè—å—ŒD늉手段åQŒè¿˜æœ‰ä¸€¿Uè¾ƒä¸ºæ–¹ä¾¿çš„åšæ³•åQŒå°±æ˜¯æŠŠä¸€ä¸ªåº”用程åºçš„session攑ֈ°ServletContextä¸ï¼Œ˜q™æ ·å¦å¤–一个应用程åºå°±å¯ä»¥ä»ŽServletContextä¸å–å¾—å‰ä¸€ä¸ªåº”用程åºçš„引用。示例代ç 如下,
应用½E‹åºA
context.setAttribute("appA", session);Â
应用½E‹åºB
contextAÂ =Â context.getContext("/appA");
HttpSession sessionA = (HttpSession)contextA.getAttribute("appA");Â
值得注æ„的是˜q™ç§ç”¨æ³•ä¸å¯¿UÀL¤åQŒå› ä¸ºæ ¹æ®ServletContextçš„JavaDocåQŒåº”用æœåС噍å¯ä»¥å¤„äºŽå®‰å…¨çš„åŽŸå› å¯¹äºŽcontext.getContext("/appA");˜q”回½Iºå€û|¼Œä»¥ä¸Šåšæ³•åœ¨Weblogic Server 8.1ä¸é€šè¿‡ã€?br />
那么Weblogic Serverä¸ÞZ»€ä¹ˆè¦æŠŠæ‰€æœ‰çš„应用½E‹åºçš„cookie路径都设ä¸?å‘¢ï¼ŸåŽŸæ¥æ˜¯äØ“(f¨´)了SSOåQŒå‡¡æ˜¯å…±äº«è¿™ä¸ªsession的应用程åºéƒ½å¯ä»¥å…׃ín认è¯çš„ä¿¡æ¯ã€‚一个简å•的实验ž®±å¯ä»¥è¯æ˜Žè¿™ä¸€ç‚¹ï¼Œä¿®æ”¹é¦–å…ˆç™Õd½•的那个应用程åºçš„æè¿°½W¦weblogic.xmlåQŒæŠŠcookie路径修改ä¸?appA 讉K—®å¦å¤–一个应用程åºä¼š(x¨¬)釿–°è¦æ±‚ç™Õd½•åQŒå³ä½¿æ˜¯å过æ¥ï¼Œå…ˆè®¿é—®cookie路径ä¸?的应用程åºï¼Œå†è®¿é—®ä¿®æ”¹è¿‡è·¯å¾„的这个,虽然ä¸å†æç¤ºç™Õd½•åQŒä½†æ˜¯ç™»å½•的用户信æ¯ä¹Ÿä¼š(x¨¬)丢失。注æ„嚘q™ä¸ªå®žéªŒæ—¶è®¤è¯æ–¹å¼åº”该ä‹É用FORMåQŒå› 为æµè§ˆå™¨å’ŒwebæœåС噍坹basicè®¤è¯æ–¹å¼æœ‰å…¶ä»–çš„å¤„ç†æ–¹å¼åQŒç¬¬äºŒæ¬¡è¯äh±‚的认è¯ä¸æ˜¯é€šè¿‡Â sessionæ¥å®žçŽ°çš„ã€‚å…·ä½“è¯·å‚看[7] secion 14.8 AuthorizationåQŒä½ å¯ä»¥ä¿®æ”¹æ‰€é™„çš„½CÞZ¾‹½E‹åºæ¥åš˜q™äº›è¯•验ã€?br />
å…«ã€æ€È»“
session机制本èínòq¶ä¸å¤æ‚åQŒç„¶è€Œå…¶å®žçŽ°å’Œé…¾|®ä¸Šçš„絋zÀL€§å´ä½¿å¾—å…·ä½“æƒ…å†µå¤æ‚多å˜ã€‚è¿™ä¹Ÿè¦æ±‚我们ä¸èƒ½æŠŠä»…ä»…æŸä¸€‹Æ¡çš„¾l验或者æŸä¸€ä¸ªæµè§ˆå™¨åQŒæœåŠ¡å™¨çš„ç»éªŒå½“作普é适用的ç»éªŒï¼Œè€Œæ˜¯å§‹ç»ˆéœ€è¦å…·ä½“情况具体分æžã€?br />摘è¦åQšè™½ç„¶session机制在web应用½E‹åºä¸è¢«é‡‡ç”¨å·²ç»å¾ˆé•¿æ—‰™—´äº†ï¼Œä½†æ˜¯ä»ç„¶æœ‰å¾ˆå¤šäh䏿¸…楚session机制的本质,以至ä¸èƒ½æ£ç¡®çš„应用这一技术。本文将详细讨论sessionçš„å·¥ä½œæœºåˆ¶åÆˆä¸”å¯¹åœ¨Java web applicationä¸åº”用session机制时常è§çš„问题作出解ç”ã€?
]]> - 转:(x¨¬)JAVAå—符é›?/title><link>http://www.aygfsteel.com/wml/articles/55985.html</link><dc:creator>wml</dc:creator><author>wml</author><pubDate>Fri, 30 Jun 2006 08:49:00 GMT</pubDate><guid>http://www.aygfsteel.com/wml/articles/55985.html</guid><description><![CDATA[
<p align="left">
<strong>1. 概述</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 22pt">本文主è¦åŒ…æ‹¬ä»¥ä¸‹å‡ ä¸ªæ–šw¢åQšç¼–ç 基本知识,javaåQŒç³»¾lŸèÊYä»Óž¼ŒurlåQŒå·¥å…¯‚ÊYä»¶ç‰ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 22pt">在下é¢çš„æè¿°ä¸ï¼Œž®†ä»¥"䏿–‡"两个å—䨓(f¨´)例,¾l查表å¯ä»¥çŸ¥é“å…¶GB2312¾~–ç æ˜?<u>d6d0 cec4</u>"åQŒUnicode¾~–ç ä¸?<u>4e2d 6587</u>"åQŒUTF¾~–ç ž®±æ˜¯"<u>e4b8ad e69687</u>"。注æ„,˜q™ä¸¤ä¸ªå—没有iso8859-1¾~–ç åQŒä½†å¯ä»¥ç”¨iso8859-1¾~–ç æ?表示"ã€?</p>
<p class="1">
<strong>2. ¾~–ç 基本知识</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">最早的¾~–ç æ˜¯iso8859-1åQŒå’Œascii¾~–ç ç›æ€¼¼ã€‚但ä¸ÞZº†æ–¹ä¾¿è¡¨ç¤ºå„ç§å„æ ·çš„è¯a€åQŒé€æ¸å‡ºçŽ°äº†å¾ˆå¤šæ ‡å‡†ç¼–ç ,é‡è¦çš„æœ‰å¦‚ä¸‹å‡ ä¸ªã€?</p>
<p class="2">
<strong>2.1. iso8859-1</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">属于å•å—节编ç ,最多能表示的嗽W¦èŒƒå›´æ˜¯0-255åQŒåº”用于英文¾pÕdˆ—ã€‚æ¯”å¦‚ï¼Œå—æ¯'a'的编ç 䨓(f¨´)0x61=97ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">很明显,iso8859-1¾~–ç 表示的嗽W¦èŒƒå›´å¾ˆ½H„ï¼Œæ— æ³•è¡¨ç¤ºä¸æ–‡å—符。但是,ç”׃ºŽæ˜¯å•å—节¾~–ç åQŒå’Œè®¡ç®—机最基础的表½Cºå•ä½ä¸€è‡ß_(d¨¢)¼Œæ‰€ä»¥å¾ˆå¤šæ—¶å€™ï¼Œä»æ—§ä½¿ç”¨iso8859-1¾~–ç æ¥è¡¨½Cºã€‚而且在很多å议上åQŒé»˜è®¤ä‹É用该¾~–ç 。比如,虽然"䏿–‡"两个å—ä¸å˜åœ¨iso8859-1¾~–ç åQŒä»¥gb2312¾~–ç ä¸ÞZ¾‹åQŒåº”该是"<u>d6d0 cec4</u>"两个å—符åQŒä‹É用iso8859-1¾~–ç 的时候则ž®†å®ƒæ‹†å¼€ä¸?个å—节æ¥è¡¨ç¤ºåQ?<u>d6 d0 ce c4</u>"åQˆäº‹å®žä¸ŠåQŒåœ¨˜q›è¡Œå˜å‚¨çš„æ—¶å€™ï¼Œä¹Ÿæ˜¯ä»¥å—èŠ‚äØ“(f¨´)å•ä½å¤„ç†çš„)。而如果是UTF¾~–ç åQŒåˆ™æ˜?个å—èŠ?<u>e4 b8 ad e6 96 87</u>"。很明显åQŒè¿™¿U表½Cºæ–¹æ³•还需è¦ä»¥å¦ä¸€¿Uç¼–ç 䨓(f¨´)基础ã€?</p>
<p class="2">
<strong>2.2. GB2312/GBK</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">˜q™å°±æ˜¯æ±‰åçš„å›½æ ‡ç ,专门用æ¥è¡¨ç¤ºæ±‰å—åQŒæ˜¯åŒå—节编ç ï¼Œè€Œè‹±æ–‡å—æ¯å’Œiso8859-1一è‡ß_(d¨¢)¼ˆå…¼å®¹iso8859-1¾~–ç åQ‰ã€‚å…¶ä¸gbk¾~–ç 能够用æ¥åŒæ—¶è¡¨ç¤º¾J体å—å’Œ½Ž€ä½“å—åQŒè€Œgb2312åªèƒ½è¡¨ç¤º½Ž€ä½“å—åQŒgbk是兼容gb2312¾~–ç çš„ã€?</p>
<p class="2">
<strong>2.3. unicode</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">˜q™æ˜¯æœ€¾lŸä¸€çš„ç¼–ç ,å¯ä»¥ç”¨æ¥è¡¨ç¤ºæ‰€æœ‰è¯a€çš„å—½W¦ï¼Œè€Œä¸”是定长åŒå—节åQˆä¹Ÿæœ‰å››å—节的)¾~–ç åQŒåŒ…æ‹¬è‹±æ–‡å—æ¯åœ¨å†…。所以å¯ä»¥è¯´å®ƒæ˜¯ä¸å…¼å®¹iso8859-1¾~–ç 的,也ä¸å…¼å®¹ä»ÖM½•¾~–ç 。丘q‡ï¼Œç›¸å¯¹äºŽiso8859-1¾~–ç æ¥è¯´åQŒuniocode¾~–ç åªæ˜¯åœ¨å‰é¢å¢žåŠ äº†ä¸€ä¸?å—节åQŒæ¯”如嗿¯?a'ä¸?<u>00 61</u>"ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 22pt">需è¦è¯´æ˜Žçš„æ˜¯ï¼Œå®šé•¿¾~–ç 便于计算机处ç†ï¼ˆæ³¨æ„GB2312/GBK䏿˜¯å®šé•¿¾~–ç åQ‰ï¼Œè€Œunicodeåˆå¯ä»¥ç”¨æ¥è¡¨½Cºæ‰€æœ‰å—½W¦ï¼Œæ‰€ä»¥åœ¨å¾ˆå¤šè½¯äšg内部是ä‹É用unicode¾~–ç æ¥å¤„ç†çš„åQŒæ¯”如javaã€?</p>
<p class="2">
<strong>2.4. UTF</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">考虑到unicode¾~–ç ä¸å…¼å®¹iso8859-1¾~–ç åQŒè€Œä¸”å®ÒŽ(gu¨©)˜“å 用更多的空é—ß_(d¨¢)¼š(x¨¬)å› äØ“(f¨´)å¯¹äºŽè‹±æ–‡å—æ¯åQŒunicode也需è¦ä¸¤ä¸ªå—节æ¥è¡¨ç¤ºã€‚所以unicodeä¸ä¾¿äºŽä¼ 输和å˜å‚¨ã€‚å› æ¤è€Œäñ”生了utf¾~–ç åQŒutf¾~–ç 兼容iso8859-1¾~–ç åQŒåŒæ—¶ä¹Ÿå¯ä»¥ç”¨æ¥è¡¨ç¤ºæ‰€æœ‰è¯a€çš„å—½W¦ï¼Œä¸è¿‡åQŒutf¾~–ç æ˜¯ä¸å®šé•¿¾~–ç åQŒæ¯ä¸€ä¸ªå—½W¦çš„长度ä»?-6个å—节丽{‰ã€‚å¦å¤–,utf¾~–ç 自带½Ž€å•çš„æ ¡éªŒåŠŸèƒ½ã€‚ä¸€èˆ¬æ¥è®ÔŒ¼Œè‹±æ–‡å—æ¯éƒ½æ˜¯ç”¨ä¸€ä¸ªå—节表½Cºï¼Œè€Œæ±‰å—ä‹É用三个å—节ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">注æ„åQŒè™½ç„¶è¯´utfæ˜¯äØ“(f¨´)了ä‹É用更ž®‘çš„½Iºé—´è€Œä‹É用的åQŒä½†é‚£åªæ˜¯ç›¸å¯¹äºŽunicode¾~–ç æ¥è¯´åQŒå¦‚果已¾lçŸ¥é“æ˜¯æ±‰å—åQŒåˆ™ä½¿ç”¨GB2312/GBKæ— ç–‘æ˜¯æœ€èŠ‚çœçš„。丘q‡å¦ä¸€æ–šw¢åQŒå€¼å¾—说明的是åQŒè™½ç„¶utf¾~–ç å¯ÒŽ(gu¨©)±‰å—ä‹Éç”?个å—节,但å³ä½¿å¯¹äºŽæ±‰å—网™åµï¼Œutf¾~–ç 也会(x¨¬)比unicode¾~–ç 节çœåQŒå› 为网™åµä¸åŒ…å«äº†å¾ˆå¤šçš„英文å—符ã€?</p>
<p class="1">
<strong>3. java对嗽W¦çš„处ç†</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">在java应用软äšgä¸ï¼Œä¼?x¨¬)有多处涉å?qi¨¢ng)到嗽W¦é›†¾~–ç åQŒæœ‰äº›åœ°æ–šwœ€è¦è¿›è¡Œæ£¼‹®çš„讄¡½®åQŒæœ‰äº›åœ°æ–šwœ€è¦è¿›è¡Œä¸€å®šç¨‹åº¦çš„处ç†ã€?</p>
<p class="2">
<strong>3.1. getBytes(charset)</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">˜q™æ˜¯javaå—符串处ç†çš„ä¸€ä¸ªæ ‡å‡†å‡½æ•ŽÍ¼Œå…¶ä½œç”¨æ˜¯ž®†å—½W¦ä¸²æ‰€è¡¨ç¤ºçš„å—½W¦æŒ‰ç…§charset¾~–ç åQŒåƈ以å—节方å¼è¡¨½Cºã€‚注æ„å—½W¦ä¸²åœ¨java内å˜ä¸æ€ÀL˜¯æŒ‰unicode¾~–ç å˜å‚¨çš„。比å¦?䏿–‡"åQŒæ£å¸¸æƒ…况下åQˆå³æ²¡æœ‰é”™è¯¯çš„æ—¶å€™ï¼‰å˜å‚¨ä¸?<u>4e2d 6587</u>"åQŒå¦‚æžœcharsetä¸?gbk"åQŒåˆ™è¢«ç¼–ç 䨓(f¨´)"<u>d6d0 cec4</u>"åQŒç„¶åŽè¿”回å—èŠ?<u>d6 d0 ce c4</u>"。如果charsetä¸?utf8"åˆ™æœ€åŽæ˜¯"<u>e4 b8 ad e6 96 87</u>"。如果是"iso8859-1"åQŒåˆ™ç”׃ºŽæ— 法¾~–ç åQŒæœ€åŽè¿”å›?"<u>3f 3f</u>"åQˆä¸¤ä¸ªé—®åøP¼‰ã€?</p>
<p class="2">
<strong>3.2. new String(charset)</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">˜q™æ˜¯javaå—符串处ç†çš„å¦ä¸€ä¸ªæ ‡å‡†å‡½æ•ŽÍ¼Œå’Œä¸Šä¸€ä¸ªå‡½æ•°çš„作用相ååQŒå°†å—节数组按照charset¾~–ç ˜q›è¡Œ¾l„åˆè¯†åˆ«åQŒæœ€åŽè{æ¢äØ“(f¨´)unicodeå˜å‚¨ã€‚å‚考上˜q°getBytes的例å,"gbk" å’?utf8"都å¯ä»¥å¾—出棼‹®çš„¾l“æžœ"<u>4e2d 6587</u>"åQŒä½†iso8859-1最åŽå˜æˆäº†"<u>003f 003f</u>"åQˆä¸¤ä¸ªé—®åøP¼‰ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 22pt">å› äØ“(f¨´)utf8å¯ä»¥ç”¨æ¥è¡¨ç¤º/¾~–ç æ‰€æœ‰å—½W¦ï¼Œæ‰€ä»¥new String( str.getBytes( "utf8" ), "utf8" ) === stråQŒå³å®Œå…¨å¯é€†ã€?</p>
<p class="2">
<strong>3.3. setCharacterEncoding()</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">该函数用æ¥è®¾¾|®httpè¯äh±‚或者相应的¾~–ç ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">对于requeståQŒæ˜¯æŒ‡æäº¤å†…容的¾~–ç åQŒæŒ‡å®šåŽå¯ä»¥é€šè¿‡getParameter()则直接获得棼‹®çš„å—符ä¸ÔŒ¼Œå¦‚æžœä¸æŒ‡å®šï¼Œåˆ™é»˜è®¤ä‹É用iso8859-1¾~–ç åQŒéœ€è¦è¿›ä¸€æ¥å¤„ç†ã€‚å‚è§ä¸‹˜q?表å•输入"。值得注æ„的是在执行setCharacterEncoding()之å‰åQŒä¸èƒ½æ‰§è¡Œä“Q何getParameter()。java doc上说明:(x¨¬)This method must be called prior to reading request parameters or reading input using getReader()。而且åQŒè¯¥æŒ‡å®šåªå¯¹POSTæ–ÒŽ(gu¨©)³•有效åQŒå¯¹GETæ–ÒŽ(gu¨©)³•æ— æ•ˆã€‚åˆ†æžåŽŸå› ï¼Œåº”è¯¥æ˜¯åœ¨æ‰§è¡Œ½W¬ä¸€ä¸ªgetParameter()的时候,javaž®†ä¼š(x¨¬)按照¾~–ç åˆ†æžæ‰€æœ‰çš„æäº¤å†…容åQŒè€Œå޾lçš„getParameter()ä¸å†˜q›è¡Œåˆ†æžåQŒæ‰€ä»¥setCharacterEncoding()æ— æ•ˆã€‚è€Œå¯¹äºŽGETæ–ÒŽ(gu¨©)³•æäº¤è¡¨å•是,æäº¤çš„内容在URLä¸ï¼Œä¸€å¼€å§‹å°±å·²ç»æŒ‰ç…§¾~–ç åˆ†æžæ‰€æœ‰çš„æäº¤å†…容åQŒsetCharacterEncoding()自然ž®±æ— 效ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">对于responseåQŒåˆ™æ˜¯æŒ‡å®šè¾“出内容的¾~–ç åQŒåŒæ—Óž¼Œè¯¥è®¾¾|®ä¼š(x¨¬)ä¼ é€’ç»™‹¹è§ˆå™¨ï¼Œå‘Šè¯‰‹¹è§ˆå™¨è¾“出内å®ÒŽ(gu¨©)‰€é‡‡ç”¨çš„ç¼–ç ã€?</p>
<p class="2">
<strong>3.4. 处熘q‡ç¨‹</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">下é¢åˆ†æžä¸¤ä¸ªæœ‰ä»£è¡¨æ€§çš„例ååQŒè¯´æ˜Žjavaå¯¹ç¼–ç æœ‰å…³é—®é¢˜çš„å¤„ç†æ–ÒŽ(gu¨©)³•ã€?</p>
<p class="3">
<strong>3.4.1. 表å•输入</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 22pt">User input<u> *(gbk:d6d0 cec4) </u>browser<u> *(gbk:d6d0 cec4) </u>web server<u> iso8859-1(00d6 00d 000ce 00c4) </u>classåQŒéœ€è¦åœ¨classä¸è¿›è¡Œå¤„ç†ï¼š(x¨¬)getbytes("iso8859-1")ä¸?u>d6 d0 ce c4</u>åQŒnew String("gbk")ä¸?u>d6d0 cec4</u>åQŒå†…å˜ä¸ä»¥unicode¾~–ç åˆ™äØ“(f¨´)<u>4e2d 6587</u>ã€?</p>
<p class="MsoBodyTextIndent" style="MARGIN-LEFT: 43pt; TEXT-INDENT: -21pt; tab-stops: list 43.0pt">
<span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings">l</span> ç”¨æˆ·è¾“å…¥çš„ç¼–ç æ–¹å¼å’Œ™åµé¢æŒ‡å®šçš„ç¼–ç æœ‰å…»I¼Œä¹Ÿå’Œç”¨æˆ·çš„æ“ä½œç³»¾lŸæœ‰å…»I¼Œæ‰€ä»¥æ˜¯ä¸ç¡®å®šçš„åQŒä¸Šä¾‹ä»¥gbkä¸ÞZ¾‹ã€?</p>
<p class="MsoBodyTextIndent" style="MARGIN-LEFT: 43pt; TEXT-INDENT: -21pt; tab-stops: list 43.0pt">
<span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings">l</span> 从browser到web serveråQŒå¯ä»¥åœ¨è¡¨å•䏿Œ‡å®šæäº¤å†…å®ÒŽ(gu¨©)—¶ä½¿ç”¨çš„å—½W¦é›†åQŒå¦åˆ™ä¼š(x¨¬)使用™åµé¢æŒ‡å®šçš„ç¼–ç 。而如果在urlä¸ç›´æŽ¥ç”¨?的方å¼è¾“入傿•ŽÍ¼Œåˆ™å…¶¾~–ç 往往是æ“作系¾lŸæœ¬íw«çš„¾~–ç åQŒå› 䏸™¿™æ—¶å’Œ™åµé¢æ— 关。上˜qîC»æ—§ä»¥gbk¾~–ç ä¸ÞZ¾‹ã€?</p>
<p class="MsoBodyTextIndent" style="MARGIN-LEFT: 43pt; TEXT-INDENT: -21pt; tab-stops: list 43.0pt">
<span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings">l</span> Web server接收到的是å—节æµåQŒé»˜è®¤æ—¶åQˆgetParameteråQ‰ä¼š(x¨¬)以iso8859-1¾~–ç 处ç†ä¹‹ï¼Œ¾l“æžœæ˜¯ä¸æ£ç¡®çš„,所以需è¦è¿›è¡Œå¤„ç†ã€‚但如果预先讄¡½®äº†ç¼–ç (通过request. setCharacterEncoding ()åQ‰ï¼Œåˆ™èƒ½å¤Ÿç›´æŽ¥èŽ·å–到æ£ç¡®çš„结果ã€?</p>
<p class="MsoBodyTextIndent" style="MARGIN-LEFT: 43pt; TEXT-INDENT: -21pt; tab-stops: list 43.0pt">
<span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings">l</span> 在页é¢ä¸æŒ‡å®š¾~–ç æ˜¯ä¸ªå¥½ä¹ (f¨¤n)惯,å¦åˆ™å¯èƒ½å¤±åŽ»æŽ§åˆ¶åQŒæ— 法指定棼‹®çš„¾~–ç ã€?</p>
<p class="3">
<strong>3.4.2. æ–‡äšg¾~–译</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 22pt">å‡è®¾æ–‡äšg是gbk¾~–ç ä¿å˜çš„,而编译有两秾~–ç 选择åQšgbk或者iso8859-1åQŒå‰è€…æ˜¯ä¸æ–‡windows的默认编ç ,åŽè€…是linux的默认编ç ,当然也å¯ä»¥åœ¨¾~–译时指定编ç ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 22pt">Jsp<u> *(gbk:d6d0 cec4) </u>java file<u> *(gbk:d6d0 cec4) </u>compiler read<u> uincode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4) </u>compiler write<u> utf(gbk: e4b8ad e69687; iso8859-1: *) </u>compiled file<u> unicode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4) </u>class。所以用gbk¾~–ç ä¿å˜åQŒè€Œç”¨iso8859-1¾~–è¯‘çš„ç»“æžœæ˜¯ä¸æ£¼‹®çš„ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 22pt">class<u> unicode(4e2d 6587) </u>system.out / jsp.out<u> gbk(d6d0 cec4) </u>os console / browser�</p>
<p class="MsoBodyTextIndent" style="MARGIN-LEFT: 43pt; TEXT-INDENT: -21pt; tab-stops: list 43.0pt">
<span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings">l</span> æ–‡äšgå¯ä»¥ä»¥å¤š¿Uç¼–ç æ–¹å¼ä¿å˜ï¼Œä¸æ–‡windows下,默认为ansi/gbkã€?</p>
<p class="MsoBodyTextIndent" style="MARGIN-LEFT: 43pt; TEXT-INDENT: -21pt; tab-stops: list 43.0pt">
<span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings">l</span> ¾~–è¯‘å™¨è¯»å–æ–‡ä»¶æ—¶åQŒéœ€è¦å¾—到文件的¾~–ç åQŒå¦‚果未指定åQŒåˆ™ä½¿ç”¨¾pÈ»Ÿé»˜è®¤¾~–ç 。一般classæ–‡äšgåQŒæ˜¯ä»¥ç³»¾lŸé»˜è®¤ç¼–ç ä¿å˜çš„åQŒæ‰€ä»¥ç¼–译ä¸ä¼?x¨¬)出问题åQŒä½†å¯¹äºŽjspæ–‡äšgåQŒå¦‚æžœåœ¨ä¸æ–‡windows下编辑ä¿å˜ï¼Œè€Œéƒ¨¾|²åœ¨è‹±æ–‡linux下è¿è¡?¾~–译åQŒåˆ™ä¼?x¨¬)出现问题。所以需è¦åœ¨jspæ–‡äšgä¸ç”¨pageEncoding指定¾~–ç ã€?</p>
<p class="MsoBodyTextIndent" style="MARGIN-LEFT: 43pt; TEXT-INDENT: -21pt; tab-stops: list 43.0pt">
<span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings">l</span> Java¾~–译的时候会(x¨¬)è½¬æ¢æˆç»Ÿä¸€çš„unicode¾~–ç 处ç†åQŒæœ€åŽä¿å˜çš„æ—¶å€™å†è½¬æ¢ä¸ºutf¾~–ç ã€?</p>
<p class="MsoBodyTextIndent" style="MARGIN-LEFT: 43pt; TEXT-INDENT: -21pt; tab-stops: list 43.0pt">
<span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings">l</span> 当系¾lŸè¾“出嗽W¦çš„æ—¶å€™ï¼Œä¼?x¨¬)按指定¾~–ç 输出åQŒå¯¹äºŽä¸æ–‡windows下,System.outž®†ä‹É用gbk¾~–ç åQŒè€Œå¯¹äºŽresponseåQˆæµè§ˆå™¨åQ‰ï¼Œåˆ™ä‹É用jspæ–‡äšg头指定的contentTypeåQŒæˆ–者å¯ä»¥ç›´æŽ¥äØ“(f¨´)response指定¾~–ç ã€‚åŒæ—Óž¼Œä¼?x¨¬)告诉browser¾|‘页的编ç 。如果未指定åQŒåˆ™ä¼?x¨¬)ä‹É用iso8859-1¾~–ç ã€‚å¯¹äºŽä¸æ–‡ï¼Œåº”该为browser指定输出å—符串的¾~–ç ã€?</p>
<p class="MsoBodyTextIndent" style="MARGIN-LEFT: 43pt; TEXT-INDENT: -21pt; tab-stops: list 43.0pt">
<span style="FONT-SIZE: 11pt; FONT-FAMILY: Wingdings">l</span> browser昄¡¤º¾|‘页的时候,首先使用response䏿Œ‡å®šçš„¾~–ç åQˆjspæ–‡äšg头指定的contentType最¾lˆä¹Ÿåæ˜ åœ¨response上)åQŒå¦‚果未指定åQŒåˆ™ä¼?x¨¬)ä‹É用网™åµä¸meta™åÒŽ(gu¨©)Œ‡å®šä¸çš„contentTypeã€?</p>
<p class="2">
<strong>3.5. å‡ å¤„è®„¡½®</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">对于web应用½E‹åºåQŒå’Œ¾~–ç æœ‰å…³çš„设¾|®æˆ–者函数如下ã€?</p>
<p class="3">
<strong>3.5.1. jsp¾~–译</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">指定文äšgçš„å˜å‚¨ç¼–ç ,很明显,该设¾|®åº”该置于文件的开头。例如:(x¨¬)<%@page pageEncoding="GBK"%>。å¦å¤–,对于一般classæ–‡äšgåQŒå¯ä»¥åœ¨¾~–译的时候指定编ç ã€?</p>
<p class="3">
<strong>3.5.2. jsp输出</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">指定文äšg输出到browser是ä‹É用的¾~–ç åQŒè¯¥è®„¡½®ä¹Ÿåº”该置于文件的开头。例如:(x¨¬)<%@ page contentType="text/html; charset= GBK" %>。该讄¡½®å’Œresponse.setCharacterEncoding("GBK")½{‰æ•ˆã€?</p>
<p class="3">
<strong>3.5.3. meta讄¡½®</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">指定¾|‘页使用的编ç ,该设¾|®å¯¹é™æ€ç½‘™åµå°¤å…¶æœ‰ä½œç”¨ã€‚å› ä¸ºé™æ€ç½‘™å‰|— 法采用jsp的设¾|®ï¼Œè€Œä¸”ä¹Ÿæ— æ³•æ‰§è¡Œresponse.setCharacterEncoding()。例如:(x¨¬)<META http-equiv="Content-Type" content="text/html; charset=GBK" /> </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">å¦‚æžœåŒæ—¶é‡‡ç”¨äº†jsp输出和meta讄¡½®ä¸¤ç§¾~–ç æŒ‡å®šæ–¹å¼åQŒåˆ™jspæŒ‡å®šçš„ä¼˜å…ˆã€‚å› ä¸ºjsp指定的直接体现在responseä¸ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">éœ€è¦æ³¨æ„的是,apache有一个设¾|®å¯ä»¥ç»™æ— ç¼–ç æŒ‡å®šçš„¾|‘页指定¾~–ç åQŒè¯¥æŒ‡å®š½{‰åŒäºŽjspçš„ç¼–ç æŒ‡å®šæ–¹å¼ï¼Œæ‰€ä»¥ä¼š(x¨¬)è¦†ç›–é™æ€ç½‘™åµä¸çš„meta指定。所以有人å¾è®®å…³é—该讄¡½®ã€?</p>
<p class="3">
<strong>3.5.4. form讄¡½®</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">当æµè§ˆå™¨æäº¤è¡¨å•的时候,å¯ä»¥æŒ‡å®šç›¸åº”的编ç 。例如:(x¨¬)<form accept-charset= "gb2312">。一般ä¸å¿…ä¸ä½¿ç”¨è¯¥è®¾¾|®ï¼Œ‹¹è§ˆå™¨ä¼š(x¨¬)直接使用¾|‘页的编ç ã€?</p>
<p class="1">
<strong>4. ¾pÈ»Ÿè½¯äšg</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">下é¢è®¨è®ºå‡ 个相关的系¾lŸèÊYä»¶ã€?</p>
<p class="2">
<strong>4.1. mysqlæ•°æ®åº?/strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 22pt">å¾ˆæ˜Žæ˜¾ï¼Œè¦æ”¯æŒå¤šè¯è¨€åQŒåº”该将数æ®åº“çš„¾~–ç 讄¡½®æˆutf或者unicodeåQŒè€Œutf更适åˆä¸Žå˜å‚¨ã€‚ä½†æ˜¯ï¼Œå¦‚æžœä¸æ–‡æ•°æ®ä¸åŒ…å«çš„è‹±æ–‡å—æ¯å¾ˆå°‘åQŒå…¶å®žunicodeæ›´äØ“(f¨´)适åˆã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 22pt">æ•°æ®åº“çš„¾~–ç å¯ä»¥é€šè¿‡mysql的酾|®æ–‡ä»¶è®¾¾|®ï¼Œä¾‹å¦‚default-character-set=utf8。还å¯ä»¥åœ¨æ•°æ®åº“链接URLä¸è®¾¾|®ï¼Œä¾‹å¦‚åQ?useUnicode=true&characterEncoding=UTF-8。注æ„è¿™ä¸¤è€…åº”è¯¥ä¿æŒä¸€è‡ß_(d¨¢)¼Œåœ¨æ–°çš„sql版本里,在数æ®åº“链接URL里å¯ä»¥ä¸˜q›è¡Œè®„¡½®åQŒä½†ä¹Ÿä¸èƒ½æ˜¯é”™è¯¯çš„设¾|®ã€?</p>
<p class="2">
<strong>4.2. apache</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">appacheå’Œç¼–ç æœ‰å…³çš„é…置在httpd.confä¸ï¼Œä¾‹å¦‚AddDefaultCharset UTF-8ã€‚å¦‚å‰æ‰€˜qŽÍ¼Œè¯¥åŠŸèƒ½ä¼š(x¨¬)ž®†æ‰€æœ‰é™æ€é¡µé¢çš„¾~–ç 讄¡½®ä¸ºUTF-8åQŒæœ€å¥½å…³é—该功能ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">å¦å¤–åQŒapache˜q˜æœ‰å•ç‹¬çš„æ¨¡å—æ¥å¤„熾|‘页å“应å¤ß_(d¨¢)¼Œå…¶ä¸ä¹Ÿå¯èƒ½å¯¹¾~–ç ˜q›è¡Œè®„¡½®ã€?</p>
<p class="2">
<strong>4.3. linux默认¾~–ç </strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">˜q™é‡Œæ‰€è¯´çš„linux默认¾~–ç åQŒæ˜¯æŒ‡è¿è¡Œæ—¶çš„环境å˜é‡ã€‚两个é‡è¦çš„环境å˜é‡æ˜¯LC_ALLå’ŒLANGåQŒé»˜è®¤ç¼–ç 会(x¨¬)å½±å“到java URLEncodeçš„è¡Œä¸ºï¼Œä¸‹é¢æœ‰æ˜q°ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">廸™®®éƒ½è®¾¾|®äØ“(f¨´)"zh_CN.UTF-8"ã€?</p>
<p class="2">
<strong>4.4. 其它</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">ä¸ÞZº†æ”¯æŒä¸æ–‡æ–‡äšgå,linuxåœ¨åŠ è½½ç£ç›˜æ—¶åº”该指定å—符集,例如åQšmount /dev/hda5 /mnt/hda5/ -t ntfs -o iocharset=gb2312ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">å¦å¤–åQŒå¦‚剿‰€˜qŽÍ¼Œä½¿ç”¨GETæ–ÒŽ(gu¨©)³•æäº¤çš„ä¿¡æ¯ä¸æ”¯æŒrequest.setCharacterEncoding()åQŒä½†å¯ä»¥é€šè¿‡tomcat的酾|®æ–‡ä»¶æŒ‡å®šå—½W¦é›†åQŒåœ¨tomcatçš„server.xmlæ–‡äšgä¸ï¼Œå½¢å¦‚åQ?lt;Connector ... URIEncoding="GBK"/>。这¿U方法将¾lŸä¸€è®„¡½®æ‰€æœ‰è¯·æ±‚,而ä¸èƒ½é’ˆå¯¹å…·ä½“页é¢è¿›è¡Œè®¾¾|®ï¼Œä¹Ÿä¸ä¸€å®šå’Œbrowser使用的编ç 相åŒï¼Œæ‰€ä»¥æœ‰æ—¶å€™åÆˆä¸æ˜¯æ‰€æœŸæœ›çš„ã€?</p>
<p class="1">
<strong>5. URL地å€</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">URL地å€ä¸å«æœ‰ä¸æ–‡å—½W¦æ˜¯å¾ˆéº»çƒ¦çš„åQŒå‰é¢æ˜q°è¿‡ä½¿ç”¨GETæ–ÒŽ(gu¨©)³•æäº¤è¡¨å•的情况,使用GETæ–ÒŽ(gu¨©)³•æ—Óž¼Œå‚æ•°ž®±æ˜¯åŒ…å«åœ¨URLä¸ã€?</p>
<p class="2">
<strong>5.1. URL¾~–ç </strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">对于URLä¸çš„一些特ŒDŠå—½W¦ï¼Œ‹¹è§ˆå™¨ä¼š(x¨¬)自动˜q›è¡Œ¾~–ç 。这些嗽W¦é™¤äº?/?&"½{‰å¤–åQŒè¿˜åŒ…括unicodeå—符åQŒæ¯”如汉å。这时的¾~–ç æ¯”较ç‰ÒŽ(gu¨©)®Šã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">IE有一个选项"æ€ÀL˜¯ä½¿ç”¨UTF-8å‘é€URL"åQŒå½“该选项有效æ—Óž¼ŒIEž®†ä¼š(x¨¬)对特ŒDŠå—½W¦è¿›è¡ŒUTF-8¾~–ç åQŒåŒæ—¶è¿›è¡ŒURL¾~–ç ã€‚å¦‚æžœæ”¹é€‰é¡¹æ— æ•ˆåQŒåˆ™ä½¿ç”¨é»˜è®¤¾~–ç "GBK"åQŒåƈ且丘q›è¡ŒURL¾~–ç 。但是,对于URLåŽé¢çš„傿•ŽÍ¼Œåˆ™æ€ÀL˜¯ä¸è¿›è¡Œç¼–ç ,相当于UTF-8é€‰é¡¹æ— æ•ˆã€‚æ¯”å¦?䏿–‡.html?a=䏿–‡"åQŒå½“UTF-8选项有效æ—Óž¼Œž®†å‘é€é“¾æŽ?%<u>e4%b8%ad%e6%96%87.html?a=\x4e\x2d\x65\x87</u>"åQ›è€ŒUTF-8é€‰é¡¹æ— æ•ˆæ—Óž¼Œž®†å‘é€é“¾æŽ?<u>\x4e\x2d\x65\x87.html?a=\x4e\x2d\x65\x87</u>"。注æ„åŽè€…å‰é¢çš„"䏿–‡"两个å—åªæœ?个å—节,而å‰è€…å´æœ?8个å—节,˜q™ä¸»è¦æ—¶URL¾~–ç çš„åŽŸå› ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 22pt">当web serveråQˆtomcatåQ‰æŽ¥æ”¶åˆ°è¯¥é“¾æŽ¥æ—¶åQŒå°†ä¼?x¨¬)进行URLè§£ç åQŒå³åŽÀLމ"%"åQŒåŒæ—¶æŒ‰ç…§ISO8859-1¾~–ç åQˆä¸Šé¢å·²¾læ˜qŽÍ¼Œå¯ä»¥ä½¿ç”¨URLEncodingæ¥è®¾¾|®æˆå…¶å®ƒ¾~–ç åQ‰è¯†åˆ«ã€‚上˜qîC¾‹åçš„¾l“果分别æ˜?<u>\ue4\ub8\uad\ue6\u96\u87.html?a=\u4e\u2d\u65\u87</u>"å’?<u>\u4e\u2d\u65\u87.html?a=\u4e\u2d\u65\u87</u>"åQŒæ³¨æ„å‰è€…å‰é¢çš„"䏿–‡"ä¸¤ä¸ªå—æ¢å¤æˆäº?个嗽W¦ã€‚这里用"\u"åQŒè¡¨½Cºæ˜¯unicodeã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 22pt">所以,ç”׃ºŽå®¢æˆ·ç«¯è®¾¾|®çš„ä¸åŒåQŒç›¸åŒçš„链接åQŒåœ¨æœåŠ¡å™¨ä¸Šå¾—åˆ°äº†ä¸åŒç»“果。这个问题丞®‘äh都é‡åˆŽÍ¼Œå´æ²¡æœ‰å¾ˆå¥½çš„解决办法。所以有的网站会(x¨¬)廸™®®ç”¨æˆ·ž®è¯•å…³é—UTF-8选项。丘q‡ï¼Œä¸‹é¢ä¼?x¨¬)æ˜qîC¸€ä¸ªæ›´å¥½çš„处ç†åŠžæ³•ã€?</p>
<p class="2">
<strong>5.2. rewrite</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">熟æ?zh¨¨n)‰çš„äh都知é“,apache有一个功能强大的rewrite模å—åQŒè¿™é‡Œä¸æè¿°å…¶åŠŸèƒ½ã€‚éœ€è¦è¯´æ˜Žçš„æ˜¯è¯¥æ¨¡å—ä¼?x¨¬)自动将URLè§£ç åQˆåŽ»é™?åQ‰ï¼Œå›_®Œæˆä¸Š˜q°web serveråQˆtomcatåQ‰çš„部分功能。有相关文档介ç»è¯´å¯ä»¥ä‹É用[NE]傿•°æ¥å…³é—该功能åQŒä½†æˆ‘è¯•éªŒåÆˆæœªæˆåŠŸï¼Œå¯èƒ½æ˜¯å› 为版本(我ä‹É用的是apache 2.0.54åQ‰é—®é¢˜ã€‚å¦å¤–ï¼Œå½“å‚æ•îC¸å«æœ‰"?& "½{‰ç¬¦åïL(f¨¥ng)š„æ—¶å€™ï¼Œè¯¥åŠŸèƒ½å°†å¯ÆD‡´¾pÈ»Ÿå¾—ä¸åˆ°æ£å¸¸ç»“æžœã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">rewrite本èínä¼ég¹Žå®Œå…¨æ˜¯é‡‡ç”¨å—节处ç†çš„æ–¹å¼åQŒè€Œä¸è€ƒè™‘å—符串的¾~–ç åQŒæ‰€ä»¥ä¸ä¼?x¨¬)带æ¥ç¼–ç 问题ã€?</p>
<p class="2">
<strong>5.3. URLEncode.encode()</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">˜q™æ˜¯Java本èínæä¾›å¯¹çš„URL¾~–ç 函数åQŒå®Œæˆçš„工作和上˜q°UTF-8选项有效时æµè§ˆå™¨æ‰€åšçš„å·¥ä½œç›æ€¼¼ã€‚值得说明的是åQŒjavaå·²ç»ä¸èµžæˆä¸æŒ‡å®š¾~–ç æ¥ä‹É用该æ–ÒŽ(gu¨©)³•åQˆdeprecatedåQ‰ã€‚åº”è¯¥åœ¨ä½¿ç”¨çš„æ—¶å€™å¢žåŠ ç¼–ç æŒ‡å®šã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">当䏿Œ‡å®š¾~–ç 的时候,该方法ä‹É用系¾lŸé»˜è®¤ç¼–ç ,˜q™ä¼š(x¨¬)坯D‡´è½¯äšg˜q行¾l“果得丼‹®å®šã€‚比如对äº?䏿–‡"åQŒå½“¾pÈ»Ÿé»˜è®¤¾~–ç ä¸?gb2312"æ—Óž¼Œ¾l“æžœæ˜?%<u>4e%2d%65%87</u>"åQŒè€Œé»˜è®¤ç¼–ç 䨓(f¨´)"UTF-8"åQŒç»“æžœå´æ˜?%<u>e4%b8%ad%e6%96%87</u>"åQŒå޾l程åºå°†éš¾ä»¥å¤„ç†ã€‚å¦å¤–,˜q™å„¿è¯´çš„¾pÈ»Ÿé»˜è®¤¾~–ç æ˜¯ç”±˜q行tomcat时的环境å˜é‡LC_ALLå’ŒLANG½{‰å†³å®šçš„åQŒæ›¾¾l出现过tomcaté‡å¯åŽå°±å‡ºçްä¹Þq çš„é—®é¢˜ï¼Œæœ€åŽæ‰éƒé—·çš„å‘çŽ°æ˜¯å› äØ“(f¨´)修改修改了这两个环境å˜é‡ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">廸™®®¾lŸä¸€æŒ‡å®šä¸?UTF-8"¾~–ç åQŒå¯èƒ½éœ€è¦ä¿®æ”¹ç›¸åº”çš„½E‹åºã€?</p>
<p class="2">
<strong>5.4. 一个解å†Ïx–¹æ¡?/strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">上é¢è¯´è“v˜q‡ï¼Œå› 䨓(f¨´)‹¹è§ˆå™¨è®¾¾|®çš„ä¸åŒåQŒå¯¹äºŽåŒä¸€ä¸ªé“¾æŽ¥ï¼Œweb server收到的是ä¸åŒå†…容åQŒè€ŒèÊYä»¶ç³»¾lŸæœ‰æ— 法知铘q™ä¸é—´çš„区别åQŒæ‰€ä»¥è¿™ä¸€å议目剘q˜å˜åœ¨ç¼ºé™—÷€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">针对具体问题åQŒä¸åº”è¯¥ä¾¥å¹¸è®¤äØ“(f¨´)所有客æˆïL(f¨¥ng)š„IE讄¡½®éƒ½æ˜¯UTF-8有效的,也ä¸åº”该¾_—æš´çš„å¾è®®ç”¨æˆ·ä¿®æ”¹IE讄¡½®åQŒè¦çŸ¥é“åQŒç”¨æˆ·ä¸å¯èƒ½åŽ»è®°ä½æ¯ä¸€ä¸ªweb server的设¾|®ã€‚所以,接下æ¥çš„解决办法ž®±åªèƒ½æ˜¯è®©è‡ªå·Þqš„½E‹åºå¤šä¸€ç‚ÒŽ(gu¨©)™ºèƒ½ï¼š(x¨¬)æ ÒŽ(gu¨©)®å†…容æ¥åˆ†æžç¼–ç æ˜¯å¦UTF-8ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">比较òq¸è¿çš„æ˜¯UTF-8¾~–ç 相当有规律,所以å¯ä»¥é€šè¿‡åˆ†æžä¼ 输˜q‡æ¥çš„链接内容,æ¥åˆ¤æ–æ˜¯å¦æ˜¯æ£ç¡®çš„UTF-8å—符åQŒå¦‚果是åQŒåˆ™ä»¥UTF-8处ç†ä¹‹ï¼Œå¦‚æžœä¸æ˜¯åQŒåˆ™ä½¿ç”¨å®¢æˆ·é»˜è®¤¾~–ç åQˆæ¯”å¦?GBK"åQ‰ï¼Œä¸‹é¢æ˜¯ä¸€ä¸ªåˆ¤æ–是å¦UTF-8的例åï¼Œå¦‚æžœä½ äº†è§£ç›¸åº”è§„å¾‹ï¼Œž®±å®¹æ˜“ç†è§£ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">public static boolean isValidUtf8(byte[] b,int aMaxCount){ </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">Â Â Â Â Â Â int lLen=b.length,lCharCount=0; </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">Â Â Â Â Â Â for(int i=0;i<lLen && lCharCount<aMaxCount;++lCharCount){ </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">Â Â Â Â Â Â Â Â Â Â Â Â Â byte lByte=b[i++];//to fast operation, ++ now, ready for the following for(;;) </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">Â Â Â Â Â Â Â Â Â Â Â Â Â if(lByte>=0) continue;//>=0 is normal ascii </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">Â Â Â Â Â Â Â Â Â Â Â Â Â if(lByte<(byte)0xc0 || lByte>(byte)0xfd) return false; </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">Â Â Â Â Â Â Â Â Â Â Â Â Â int lCount=lByte>(byte)0xfc?5:lByte>(byte)0xf8?4 </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â :lByte>(byte)0xf0?3:lByte>(byte)0xe0?2:1; </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">Â Â Â Â Â Â Â Â Â Â Â Â Â if(i+lCount>lLen) return false; </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">Â Â Â Â Â Â Â Â Â Â Â Â Â for(int j=0;j<lCount;++j,++i) if(b[i]>=(byte)0xc0) return false; </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">Â Â Â Â Â Â } </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">Â Â Â Â Â Â return true; </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">} </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">相应圎ͼŒä¸€ä¸ªä‹É用上˜q°æ–¹æ³•的例å如下åQ?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">public static String getUrlParam(String aStr,String aDefaultCharset) </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">throws UnsupportedEncodingException{ </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">Â Â Â Â Â Â if(aStr==null) return null; </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">Â Â Â Â Â Â byte[] lBytes=aStr.getBytes("ISO-8859-1"); </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">Â Â Â Â Â Â return new String(lBytes,StringUtil.isValidUtf8(lBytes)?"utf8":aDefaultCharset); </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">} </p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">ä¸è¿‡åQŒè¯¥æ–ÒŽ(gu¨©)³•也å˜åœ¨ç¼ºé™øP¼Œå¦‚下两方é¢ï¼š(x¨¬) </p>
<p class="MsoBodyTextIndent" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; tab-stops: list 42.0pt">
<span style="FONT-FAMILY: Wingdings">l</span> 没有包括对用户默认编ç 的识别åQŒè¿™å¯ä»¥æ ÒŽ(gu¨©)®è¯äh±‚ä¿¡æ¯çš„è¯a€æ¥åˆ¤æ–,但ä¸ä¸€å®šæ£¼‹®ï¼Œå› 䨓(f¨´)我们有时候也ä¼?x¨¬)输入一些韩文,或者其他文å—ã€?</p>
<p class="MsoBodyTextIndent" style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; tab-stops: list 42.0pt">
<span style="FONT-FAMILY: Wingdings">l</span> å¯èƒ½ä¼?x¨¬)错误判æ–UTF-8å—符åQŒä¸€ä¸ªä¾‹å是"å¦ä¹ (f¨¤n)"两个å—,其GBK¾~–ç æ˜? <u>\xd1\xa7\xcf\xb0</u>"åQŒå¦‚æžœä‹É用上˜q°isValidUtf8æ–ÒŽ(gu¨©)³•判æ–åQŒå°†˜q”回true。å¯ä»¥è€ƒè™‘ä½¿ç”¨æ›´ä¸¥æ ¼çš„åˆ¤æ–æ–ÒŽ(gu¨©)³•åQŒä¸˜q‡ä¼°è®¡æ•ˆæžœä¸å¤§ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">有一个例åå¯ä»¥è¯æ˜Žgoogle也é‡åˆîCº†ä¸Šè¿°é—®é¢˜åQŒè€Œä¸”也采用了和上˜q°ç›¸ä¼¼çš„å¤„ç†æ–ÒŽ(gu¨©)³•åQŒæ¯”å¦‚ï¼Œå¦‚æžœåœ¨åœ°å€æ ä¸è¾“å…¥"<a ><font color="#002c99">http://www.google.com/search?hl=zh-CN&newwindow=1&q=å¦ä¹ (f¨¤n)</font></a>"åQŒgooglež®†æ— 法棼‹®è¯†åˆ«ï¼Œè€Œå…¶ä»–汉å—一般能够æ£å¸¸è¯†åˆ«ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">最åŽï¼Œåº”该补充说明一下,如果ä¸ä‹É用rewrite规则åQŒæˆ–è€…é€šè¿‡è¡¨å•æäº¤æ•°æ®åQŒå…¶å®žåƈä¸ä¸€å®šä¼š(x¨¬)é‡åˆ°ä¸Šè¿°é—®é¢˜åQŒå› 䏸™¿™æ—¶å¯ä»¥åœ¨æäº¤æ•°æ®æ—¶æŒ‡å®šå¸Œæœ›çš„¾~–ç 。å¦å¤–ï¼Œä¸æ–‡æ–‡äšgå确实会(x¨¬)带æ¥é—®é¢˜åQŒåº”该è°}æ…Žä‹É用ã€?</p>
<p class="1">
<strong>6. 其它</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">ä¸‹é¢æè¿°ä¸€äº›å’Œ¾~–ç æœ‰å…³çš„其他问题ã€?</p>
<p class="2">
<strong>6.1. SecureCRT</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">除了‹¹è§ˆå™¨å’ŒæŽ§åˆ¶åîC¸Ž¾~–ç æœ‰å…³å¤–,一些客æˆïL(f¨¥ng)«¯ä¹Ÿå¾ˆæœ‰å…³¾p…R€‚比如在使用SecureCRT˜qžæŽ¥linuxæ—Óž¼Œåº”该让SecureCRT的显½Cºç¼–ç (ä¸åŒçš„sessionåQŒå¯ä»¥æœ‰ä¸åŒçš„ç¼–ç 设¾|®ï¼‰å’Œlinux的编ç 环境å˜é‡ä¿æŒä¸€è‡´ã€‚å¦åˆ™çœ‹åˆ°çš„一些帮助信æ¯ï¼Œž®±å¯èƒ½æ˜¯ä¹Þq ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">å¦å¤–åQŒmysql有自å·Þqš„¾~–ç 讄¡½®åQŒä¹Ÿåº”è¯¥ä¿æŒå’ŒSecureCRT的显½Cºç¼–ç 一致。å¦åˆ™é€šè¿‡SecureCRT执行sqlè¯å¥çš„æ—¶å€™ï¼Œå¯èƒ½æ— 法处ç†ä¸æ–‡å—符åQŒæŸ¥è¯¢ç»“果也ä¼?x¨¬)出çŽîCØ•ç ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">对于Utf-8æ–‡äšgåQŒå¾ˆå¤šç¼–辑器åQˆæ¯”如记事本åQ‰ä¼š(x¨¬)åœ¨æ–‡ä»¶å¼€å¤´å¢žåŠ ä¸‰ä¸ªä¸å¯è§çš„æ ‡å¿—å—èŠ‚ï¼Œå¦‚æžœä½œäØ“(f¨´)mysql的输入文ä»Óž¼Œåˆ™å¿…™å»è¦åŽÀLމ˜q™ä¸‰ä¸ªå—½W¦ã€‚(用linuxçš„viä¿å˜å¯ä»¥åŽÀLމ˜q™ä¸‰ä¸ªå—½W¦ï¼‰ã€‚一个有‘£çš„çŽ°è±¡æ˜¯ï¼Œåœ¨ä¸æ–‡windows下,创å¾ä¸€ä¸ªæ–°txtæ–‡äšgåQŒç”¨è®îCº‹æœ¬æ‰“å¼€åQŒè¾“å…?˜qžé€?两个å—,ä¿å˜åQŒå†æ‰“å¼€åQŒä½ ä¼?x¨¬)å‘çŽîC¸¤ä¸ªå—没了åQŒåªç•™ä¸‹ä¸€ä¸ªå°é»‘点ã€?</p>
<p class="2">
<strong>6.2. ˜q‡æ×o(h¨´)å™?/strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">如果需è¦ç»Ÿä¸€è®„¡½®¾~–ç åQŒåˆ™é€šè¿‡filter˜q›è¡Œè®„¡½®æ˜¯ä¸ªä¸é”™çš„选择。在filter classä¸ï¼Œå¯ä»¥¾lŸä¸€ä¸ºéœ€è¦çš„è¯äh±‚或者回应设¾|®ç¼–ç 。å‚åŠ ä¸Š˜q°setCharacterEncoding()。这个类apache已绾l™å‡ºäº†å¯ä»¥ç›´æŽ¥ä‹É用的例åSetCharacterEncodingFilterã€?</p>
<p class="2">
<strong>6.3. POSTå’ŒGET</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">很明显,以POSTæäº¤ä¿¡æ¯æ—Óž¼ŒURL有更好的å¯è¯»æ€§ï¼Œè€Œä¸”å¯ä»¥æ–¹ä¾¿çš„ä‹É用setCharacterEncoding()æ¥å¤„ç†å—½W¦é›†é—®é¢˜ã€‚但GETæ–ÒŽ(gu¨©)³•å½¢æˆçš„URL能够更容易表辄¡½‘™å늚„实际内容åQŒä¹Ÿèƒ½å¤Ÿç”¨äºŽæ”¶è—ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">从统一的角度考虑问题åQŒå¾è®®é‡‡ç”¨GETæ–ÒŽ(gu¨©)³•åQŒè¿™è¦æ±‚在程åºä¸è޷得傿•°æ˜¯è¿›è¡Œç‰¹ŒDŠå¤„ç†ï¼Œè€Œæ— 法ä‹É用setCharacterEncoding()的便利,如果ä¸è€ƒè™‘rewriteåQŒå°±ä¸å˜åœ¨IEçš„UTF-8问题åQŒå¯ä»¥è€ƒè™‘通过讄¡½®URIEncodingæ¥æ–¹ä¾¿èŽ·å–URLä¸çš„傿•°ã€?</p>
<p class="2">
<strong>6.4. ½Ž€¾J体¾~–ç 转æ¢</strong>
</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">GBKåŒæ—¶åŒ…å«½Ž€ä½“å’Œ¾J体¾~–ç åQŒä¹Ÿž®±æ˜¯è¯´åŒä¸€ä¸ªå—åQŒç”±äºŽç¼–ç ä¸åŒï¼Œåœ¨GBK¾~–ç 下属于两个å—。有时候,ä¸ÞZº†æ£ç¡®å–得完整的结果,应该ž®†ç¹ä½“å’Œ½Ž€ä½“进行统一。å¯ä»¥è€ƒè™‘ž®†UTFã€GBKä¸çš„æ‰€æœ‰ç¹ä½“å—åQŒè{æ¢äØ“(f¨´)相应的简体å—åQŒBIG5¾~–ç 的数æ®ï¼Œä¹Ÿåº”该è{化æˆç›¸åº”的简体å—。当ç„Óž¼Œä»æ—§ä»¥UTF¾~–ç å˜å‚¨ã€?</p>
<p class="MsoBodyTextIndent" style="TEXT-INDENT: 21pt">例如åQŒå¯¹äº?è¯è¨€ 語言"åQŒç”¨UTF表示ä¸?<u>\x</u><u>E8\xAF\xAD\xE8\xA8\x80 \xE8\xAA\x9E\xE8\xA8\x80</u>"åQŒè¿›è¡Œç®€¾J体¾~–ç 转æ¢åŽåº”该是两个相åŒçš?"<u>\x</u><u>E8\xAF\xAD\xE8\xA8\x80></u>"ã€?</p>
<img src ="http://www.aygfsteel.com/wml/aggbug/55985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wml/" target="_blank">wml</a> 2006-06-30 16:49 <a href="http://www.aygfsteel.com/wml/articles/55985.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>