ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>福利视频在线,国产一二精品视频,99精品视频精品精品视频http://www.aygfsteel.com/kxbin/category/42063.html创出一片天åœ?/description>zh-cnWed, 21 Mar 2012 22:08:19 GMTWed, 21 Mar 2012 22:08:19 GMT60手工配置tomcat çš„log参数 昄¡¤ºè¯¦ç»†çš„log信息åQˆè{åQ?/title><link>http://www.aygfsteel.com/kxbin/articles/372390.html</link><dc:creator>kxbin</dc:creator><author>kxbin</author><pubDate>Wed, 21 Mar 2012 10:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/kxbin/articles/372390.html</guid><wfw:comment>http://www.aygfsteel.com/kxbin/comments/372390.html</wfw:comment><comments>http://www.aygfsteel.com/kxbin/articles/372390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kxbin/comments/commentRss/372390.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kxbin/services/trackbacks/372390.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed; font-family: Arial; background-color: #ffffff; width: 959px; "><tbody><tr><td style="word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: 18px; "><div class="wmqeeuq" id="blog_text" style="word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 14px; line-height: 20px; overflow-x: hidden; overflow-y: hidden; position: relative !important; border-image: initial; "><p style="line-height: normal; ">开发测试中¾lå¸¸æœ‰tomcat报[严重]的错åQŒä½†æ²¡æœ‰æ˜Žç»†åQŒè¿™¿Uæƒ…况下要手工配¾|®tomcat çš„log参数ã€?/p><p style="line-height: normal; ">昨天部çÖvweb应用åˆ?a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">Tomcat</a>之后,无法成功启动,òq¶ä¸”控制台没有详¾l†çš„错误信息,<br />™å¶å¤šž®×ƒ¸¤è¡Œæ½CÞZ¿¡æ?例如:<br />严重: Error listenerStart<br />严重: Context [/lizongbo] startup failed due to previous errors</p><p style="line-height: normal; ">或è€?/p><p style="line-height: normal; ">严重: Error filterStart<br />org.apache.catalina.core.StandardContext start<br />严重: Context startup failed due to previous errors</p><p style="line-height: normal; ">查找logs目录下的信息,除了˜q™ä¸¤å¥è¯,也没别的辅助内容.<br />¾l™æŸ¥é”™å¸¦æ¥äº†å›°éš¾,在这¿Uæƒ…况下,是因ä¸?a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">Tomcat</a>自èín的默认日志没有将一些错误信息输出到控制台或文äšg,<br />˜q™ä¸ªæ—¶å€™åˆ™éœ€è¦é…¾|?a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">Tomcat</a>自èínçš„log,启用详细的调试日å¿?</p><p style="line-height: normal; ">åœ?a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">Tomcat</a> 5.5å’?a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">Tomcat</a> 6.0中的配置基本一æ ?只是相关文äšg攄¡š„目录有所不同.</p><p style="line-height: normal; ">首先需要准备的文äšgä¸?</p><p style="line-height: normal; ">1.<a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.jar , 下蝲地址 : <a >http://www.apache.org/dist/logging/--escaped_anchor</a>:e0a22b16b97ca8dedb8d5b8c15ffbcaa--/1.2.15/apache-<a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>-1.2.15.zip<br />2.<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">Tomcat</a> 5.5所需çš?commons-logging.jar,下蝲地址: <a >http://www.apache.org/dist/commons/logging/binaries/commons-logging-1.1.zip</a></p><p style="line-height: normal; ">3.<a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>配置文äšg:<br /><a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.properties<br />配置内容ä¸?</p><p style="line-height: normal; "><a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.rootLogger=ERROR,R</p><p style="line-height: normal; "><a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.appender.CONSOLE=org.apache.<a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.ConsoleAppender<br /><a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.appender.CONSOLE.layout=org.apache.<a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.PatternLayout<br /><a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.appender.CONSOLE.layout.ConversionPattern=[%p]%t-%c-%m%n</p><p style="line-height: normal; "><a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.appender.R=org.apache.<a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.RollingFileAppender<br /><a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.appender.R.File=${catalina.home}/logs/lizongbo.log<br /><a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.appender.R.MaxFileSize=10MB<br /><a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.appender.R.MaxBackupIndex=10<br /><a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.appender.R.layout=org.apache.<a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.PatternLayout<br /><a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.appender.R.layout.ConversionPattern=[%p]%t-%c-%m%n</p><p style="line-height: normal; "><a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.logger.org.apache.catalina=INFO,R,CONSOLE</p><p style="line-height: normal; ">#日志¾U§åˆ«ä¸èƒ½å¤ªä½Ž,如果配置为debug的话,输出的日志信息太å¤?坯D‡´<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>启动非常的慢.</p><p style="line-height: normal; ">4.<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">Tomcat</a> 6.0所需的juli替换文äšg:<br /><a >http://www.apache.org/dist/--escaped_anchor</a>:079305423cce36d6691457475e081123--/<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>-6/v6.0.14/bin/extras/<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>-juli-adapters.jar<br /><a >http://www.apache.org/dist/--escaped_anchor</a>:079305423cce36d6691457475e081123--/<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>-6/v6.0.14/bin/extras/<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>-juli.jar</p><p style="line-height: normal; ">在Tomcat6.0ä¸?</p><p style="line-height: normal; ">ž®?a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>-juli-adapters.jar,<a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>-1.2.15.jar,<a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.properties复制到D:\Java\ApacheTomcat6.0.14\lib下面.</p><p style="line-height: normal; ">ž®?a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>-juli.jar复制到D:\Java\apache-<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>-6.0.14\bin\下面.</p><p style="line-height: normal; ">然后启动<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>,ž®±å¯ä»¥åœ¨D:\Java\apache-<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>-6.0.14\logs下看到lizongbo.logäº?</p><p style="line-height: normal; ">åœ?Tomcat5.5ä¸?</p><p style="line-height: normal; ">ž®†commons-logging-1.1.jar,<a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>-1.2.15.jar,复制到D:\Java\apache-<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>-5.5.25\common\lib下面.<br />ž®?a internal_tag"="" title="标签 log4j 下的日志" rel="tag nofollow">log4j</a>.properties复制到D:\Java\apache-<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>-5.5.25\common\classes下面.</p><p style="line-height: normal; ">然后启动<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>,ž®±å¯ä»¥åœ¨D:\Java\apache-<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>-5.5.25\logs下看到lizongbo.logäº?</p><p style="line-height: normal; ">在这个时å€?再通过日志文äšg来分æž?则会发现出现˜q™ç§é”™è¯¯çš„æƒ…况可能有:<br />(以下是我遇到的出错情å†?大多是些低çñ”错误)<br />1.webapps要用到的classeæ–‡äšgæ ÒŽœ¬æ²¡æœ‰å¤åˆ¶åˆ°WEB-INF/classes目录下面<br />(java.lang.NoClassDefFoundError,而这个信息可能默认没输出到控制台,ž®¤å…¶æ˜¯ç”¨äº†springçš?昨天ž®±æ˜¯˜q™ä¸ª¾_—心的低¾U§é”™è¯?<br />2.要用到libæ–‡äšg没有复制å®?¾~ºå°‘lib<br />3.lib下的同一个库的jaræ–‡äšg存在多个不同版本,引è“v版本冲突.<br />4.lib下的jarä¸?a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>版本不相对应(我遇到的问题是web应用在Tomcat5.5上运行正å¸?换到Tomcat6.0上就出错,<br />例如一个用了strutsçš„webappåœ?a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">Tomcat</a> 6上报下面的错è¯?br />“Parse Fatal Error at line 17 column 6: The processing instruction<br />target matching “[xX][mM][lL]” is not allowed” )</p><p style="line-height: normal; ">愿意看英文的可以参考官方网站说æ˜?<br />http://<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>.apache.org/<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>-6.0-doc/logging.html<br />http://<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>.apache.org/<a internal_tag"="" title="标签 Tomcat 下的日志" rel="tag nofollow">tomcat</a>-5.5-doc/logging.html</p></div></td></tr></tbody></table><img src ="http://www.aygfsteel.com/kxbin/aggbug/372390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kxbin/" target="_blank">kxbin</a> 2012-03-21 18:00 <a href="http://www.aygfsteel.com/kxbin/articles/372390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>html中area标签使用 http://www.aygfsteel.com/kxbin/articles/369640.htmlkxbinkxbinThu, 09 Feb 2012 02:24:00 GMThttp://www.aygfsteel.com/kxbin/articles/369640.htmlhttp://www.aygfsteel.com/kxbin/comments/369640.htmlhttp://www.aygfsteel.com/kxbin/articles/369640.html#Feedback0http://www.aygfsteel.com/kxbin/comments/commentRss/369640.htmlhttp://www.aygfsteel.com/kxbin/services/trackbacks/369640.html
<html>
<body>
 <p>è¯ïL‚¹å‡Õd›¾åƒä¸Šçš„æ˜Ÿçƒï¼ŒæŠŠå®ƒä»¬æ”¾å¤§ã€?/span></p>
 <img
src="http://www.w3school.com.cn/i/eg_planets.jpg"
border="0" usemap="#planetmap"
alt="Planets" />
 <map name="planetmap" id="planetmap">
 <area
shape="circle"
coords="180,139,14"
href ="http://www.w3school.com.cn/example/html/venus.html"
target ="_blank"
alt="Venus" />
 <area
shape="circle"
coords="129,161,10"
href ="http://www.w3school.com.cn/example/html/mercur.html"
target ="_blank"
alt="Mercury" />
 <area
shape="rect"
coords="0,0,110,260"
href ="http://www.w3school.com.cn/example/html/sun.html"
target ="_blank"
alt="Sun" />
 </map>
 <p><b>注释åQ?/span></b>img 元素中的 "usemap" 属性引ç”?/span> map 元素中的 "id" æˆ?/span> "name" 属性(æ ÒŽ®‹¹è§ˆå™¨ï¼‰åQŒæ‰€ä»¥æˆ‘们同时向 map 元素æ·ÕdŠ äº?/span> "id" å’?/span> "name" 属性ã€?/span></p>
 </body>
</html>

1.½W¬ä¸€ä¸?/span>area是圆å½?/span>
shape="circle"                      /*说明是圆å½?/span>*/
coords="180,139,14"            /*圆心坐标æ˜?/span>(180,139)åQŒåŠå¾?/span>14*/
2.½W¬äºŒarea个是矩åÅž
shape="rect"                         /*说明是矩å½?/span>*/
coords="0,0,110,260"            /*左上角坐标是(0,0)åQŒå³ä¸‹è§’坐标æ˜?/span>(110,260)/
 æ³¨ã€‚单位是像素åQŒåæ ‡å¯ä»¥æ˜¯è´Ÿå€?/pre>


]]>
web.xml中Servlet Filter的调用顺�转蝲)http://www.aygfsteel.com/kxbin/articles/367378.htmlkxbinkxbinWed, 28 Dec 2011 00:58:00 GMThttp://www.aygfsteel.com/kxbin/articles/367378.htmlhttp://www.aygfsteel.com/kxbin/comments/367378.htmlhttp://www.aygfsteel.com/kxbin/articles/367378.html#Feedback0http://www.aygfsteel.com/kxbin/comments/commentRss/367378.htmlhttp://www.aygfsteel.com/kxbin/services/trackbacks/367378.html

Filter是一个很有用的东西,使用filter可以修改request, response, session, application中的内容�br />
1. javax.servlet.Filter有两个重要的æ–ÒŽ³• 
public void init(FilterConfig config)
public void doFilter(ServletRequest request, ServletResponse response, 

  FilterChain chain)
其中initæ–ÒŽ³•用来作一些初始化的方法,而doFilteræ–ÒŽ³•用来执行真正的过滤操作ã€?br />
2. Filter的部¾|²æ–¹æ³?/span> 
在web.xml中要声明filter元素åQŒåƈ分配需要其处理的urlåQŒå¦‚下:
<filter>
    <filter-name>Filter1</filter-name>
    <filter-class>com.baidu.Filter1</filter-class>
</filter>
<filter>
    <filter-name>Filter2</filter-name>
    <filter-class>com.baidu.Filter2</filter-class>
</filter>
<filter-mapping>
    <filter-name>Filter1</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>Filter2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3. doFilter函数的执行顺åº?/span> 
当某个urlè¯äh±‚匚w…äº†å¤šä¸ªFilteræ—Óž¼Œåº”用服务器将多个Filter¾l„织成FilterChainåQŒè¿™ä¸ªé“¾çš„æ‰§è¡Œé¡ºåºæ˜¯ç”±å…¶<filter-mapping>元素在web.xmlæ–‡äšg中的™åºåºå†›_®šçš„ã€?br />doFilter函数可以˜q‡æ×oè¯äh±‚或者响应,当其˜q‡æ×o完请求后ž®†è°ƒç”¨FilterChainçš„doFilter函数让FilterChain中的下一个Filter来过滤请求。最先过滤请求的Filterž®†æœ€åŽè¿‡æ»¤ç›¸åº”,下面是个½Ž€å•的例子ã€?br />public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException
{
       system.out.println(“filter request here ----”);
        // todo:
       chain.doFilter(request,response);
       system.out.println(“filter response here ----”);
        // todo:

}

4.init函数的执行顺åº?/span> 
    对于不同的应用服务器åQŒFilterçš„init函数的执行时间是不同的,例如åQštomcat会在tomcat启动的时候执行init函数åQŒè€Œweblogic½{‰ä¸€äº›å…¶ä»–的应用服务器则会在该Filter匚w…çš„url被首‹Æ¡è¯·æ±‚的时候加载ã€?br />åQˆä¸‹é¢çš„部分是我通过实验猜想的,不一定正¼‹®ã€‚) 
    对于tomcat而言åQŒtomcat启动时会解析web.xmlæ–‡äšgåQŒç„¶åŽæŒ‰ç…?lt;filter>元素的顺序将各个Filter元素加蝲åˆîC¸€ä¸?HashMap中。解析完成后åQŒä¼šä»ŽHashMap中一个个的拿出Filter元素åQŒä¸²è¡Œçš„æ‰§è¡Œå…¶init函数åQˆè¿™é‡Œçš„æ‰§è¡Œæœ‰å…ˆåŽå…³¾p»ï¼Œæ˜¯åœ¨ä¸€ä¸ªçº¿½E‹ä¸­æ‰?行的åQ‰ã€‚所以在tomcat中定义的多个Filterå…¶init函数的执行顺序就是其在HashMap中的散列™åºåºåQŒå…·ä½“来说与其在web.xmlæ–‡äšgä¸?的定义位¾|®åŠå…¶åå­—有兟ë€?br />    对于HashMap来说åQŒå¦‚果其元素固定不变åQŒåˆ™å…‰™¡ºåºä¹Ÿæ˜¯å›ºå®šä¸å˜çš„åQŒä½†å½“元素个数发生变化时åQŒä¾¿ä¸èƒ½ä¿è¯å…‰™¡ºåºï¼ˆä¾‹å¦‚åQšå½“有两个元素时åQŒA在B的前面,当再加入20个元素的时候Až®×ƒ¸ä¸€å®šåœ¨B的前面了åQ‰ï¼Œæ‰€ä»¥init函数的执行顺序是无法保证的ã€?/div>


]]>
¾|‘站用户单点ç™Õd½•¾pȝ»Ÿè§£å†³æ–ÒŽ¡ˆ(è½?http://www.aygfsteel.com/kxbin/articles/367377.htmlkxbinkxbinWed, 28 Dec 2011 00:53:00 GMThttp://www.aygfsteel.com/kxbin/articles/367377.htmlhttp://www.aygfsteel.com/kxbin/comments/367377.htmlhttp://www.aygfsteel.com/kxbin/articles/367377.html#Feedback0http://www.aygfsteel.com/kxbin/comments/commentRss/367377.htmlhttp://www.aygfsteel.com/kxbin/services/trackbacks/367377.html
¾|‘站用户单点ç™Õd½•¾pȝ»Ÿè§£å†³æ–ÒŽ¡ˆ

1 背景

  在网站徏讄¡š„˜q‡ç¨‹ä¸­ï¼Œå¤šä¸ªåº”用¾pȝ»Ÿä¸€èˆ¬æ˜¯åœ¨ä¸åŒçš„æ—¶æœŸå¼€å‘完成的。各应用¾pȝ»Ÿç”׃ºŽåŠŸèƒ½ä¾§é‡ã€è®¾è®¡æ–¹æ³•å’Œå¼€å‘æŠ€æœ¯æœ‰æ‰€ä¸åŒåQŒä¹Ÿž®±åŞ成了各自独立çš?用户库和用户认证体系。随着¾|‘站的发展,会出现这æ ïLš„用户¾Ÿ¤ä½“åQšä»¥å…¶ä¸­çš„ä¸€ä¸ªç”¨æˆ·äØ“ä¾‹ï¼Œä»–ï¼ˆå¥¹ï¼‰ä½¿ç”¨¾|‘站的多个应用系¾lŸï¼Œä½†åœ¨æ¯ä¸ªåº”用¾pȝ»Ÿä¸­æœ‰ç‹¬ç«‹çš„èÌŽ åøP¼Œæ²¡æœ‰ä¸€ä¸ªæ•´ä½“上的网站用戯‚ÌŽåïLš„æ¦‚念åQŒè¿›å…¥æ¯ä¸€ä¸ªåº”用系¾lŸå‰éƒ½éœ€è¦ä»¥è¯¥åº”用系¾lŸçš„账号来登录。这带给用户不方便的使用感受åQŒç”¨æˆ·ä¼šæƒ»I¼šæ—¢ç„¶æˆ‘ä‹É用的æ˜?同一个网站上的应用,ä¸ÞZ»€ä¹ˆä¸èƒ½åœ¨ä¸€‹Æ¡åœ¨¾|‘站上登录之后不必再¾lè¿‡åº”用¾pȝ»Ÿè®¤è¯ç›´æŽ¥˜q›å…¥åº”用¾pȝ»Ÿå‘¢ï¼Ÿç”¨æˆ·çš„è¦æ±‚æˆ‘ä»¬ç§°ä¹‹äØ“ "单点ç™Õd½•"ã€?/p>
å›?1.1 ¾|‘站用户要求单点ç™Õd½•

 

2 分析

  在多个拥有各自独立的用户体系的应用系¾lŸé—´å®žçŽ°å•ç‚¹ç™Õd½•åQŒæˆ‘们要考虑以下的问题:

  • 单点ç™Õd½•¾pȝ»Ÿçš„实现在各应用系¾lŸéƒ½é‡‡ç”¨B/S模式˜q™ä¸€å‰æä¸‹è¿›è¡Œã€?/li>
  • 需要在各应用系¾lŸé—´¾lŸä¸€ç”¨æˆ·è®¤è¯æ ‡å¿—åQŒç”¨æˆïL™»å½•后可以得到用户令牌åQŒå„应用¾pȝ»Ÿè®¤å¯¾lŸä¸€çš„用户ä×o牌ã€?/li>
  • 用户令牌应当是安全加密的åQŒåƈ且要限定时效期ã€?/li>
  • ç”׃ºŽæ¯ä¸ªåº”用¾pȝ»Ÿéƒ½æœ‰è‡ªå·±çš„用户库åQŒä¸€ä¸ªç”¨æˆ·å¯èƒ½åœ¨ä¸åŒçš„应用系¾lŸä¸­ä½¿ç”¨ä¸åŒçš„èÌŽåøP¼Œå› æ­¤æ¯ä¸ªè¦ä‹É用多个应用系¾lŸçš„用户要设¾|®ä¸€ä¸ªç»Ÿä¸€çš„用戯‚ÌŽå·åÆˆä»¥æ­¤è´¦å·˜q›è¡Œå•点ç™Õd½•åQŒè¯¥è´¦å·ä¸Žè¯¥ç”¨æˆ·åœ¨å„应用¾pȝ»Ÿä¸­çš„一个è̎号åŞ成映ž®„å…³¾p…R€?/li>
  • 各应用系¾lŸå¯èƒ½å±žäºŽä¸åŒçš„域,因此要实现跨域的单点ç™Õd½•ã€?/li>
  • 已经上线˜qè¡Œçš„应用系¾lŸéœ€è¦è¿›è¡Œæ”¹é€ æ¥æ”¯æŒå•点ç™Õd½•åQŒæ­£åœ¨å¼€å‘的应用¾pȝ»Ÿåˆ™å¯ä»¥åœ¨å¼€å‘阶ŒDµå¢žåŠ å¯¹å•ç‚¹ç™Õd½•的支持,但应用系¾lŸä¹‹é—´åº”该是松耦合ã€?/li>
  • ç”׃ºŽå„应用系¾lŸå¾€å¾€éƒ½å·²¾lå¤„于稳定运行期åQŒå•点登录系¾lŸçš„实现应该对各应用¾pȝ»Ÿçš„登录认证体¾pÕd†²å‡ÀLœ€ž®ï¼Œå„应用系¾lŸåŽŸæœ‰çš„ç™Õd½•‹¹ç¨‹ä¾ç„¶å¯ç”¨ã€?/li>
  • 一些应用服务器òq›_°è™½ç„¶æä¾›å¯¹å•点登录的支持åQŒä½†è¦æ±‚应用¾pȝ»Ÿç”¨æˆ·è®¤è¯çš„设计符合其规范åQŒè¿™å¯¹å·²¾lå¤„于运行期的应用系¾lŸæ¥è¯´éš¾ä»¥å®žçްã€?/li>

3 设计

  以下是系¾lŸçš„æ•´ä½“设计¾l“æž„åQ?/p>
å›?3.1 ¾pȝ»Ÿ¾l“æž„å›?/strong>



3.1 单点ç™Õd½•½Ž¡ç†åº”用

  我们首先设计单点ç™Õd½•½Ž¡ç†åº”用åQ?/p>
å›?3.2 单点ç™Õd½•½Ž¡ç†åº”用

 

  用户在其中注册一个单点登录èÌŽåøP¼Œç„¶åŽé’ˆå¯¹æ¯ä¸ªåº”用¾pȝ»Ÿ¾l‘定一个该应用¾pȝ»Ÿä¸­åŽŸæœ‰çš„è´¦å·åQŒåƈ¾l´æŠ¤˜q™äº›æ³¨å†Œå’Œç»‘定信息。绑定的˜q‡ç¨‹éœ€è¦å•点登录管理应用服务器到应用系¾lŸæœåŠ¡å™¨ä¸ŠéªŒè¯ç”¨æˆähä¾›çš„该应用系¾lŸä¸­åŽŸæœ‰è´¦å·å’Œå¯†ç ï¼Œåº”ç”¨æœåŠ¡å™¨å‡ä»¥ç›¸åŒçš„Web Service接口提供该功能支持ã€?/p>

3.2 用户单点ç™Õd½•‹¹ç¨‹

   之后以用户单点登录管理应用和令牌传输识别的标准来实现用户单点ç™Õd½•‹¹ç¨‹ã€?/p>

1、用戯‚®¿é—®åº”用系¾lŸã€?/p>
å›?3.3 用户单点ç™Õd½•‹¹ç¨‹ - 步骤一

 

2、应用系¾lŸå¦‚果检查到用户没有在自å·Þqš„æœåŠ¡å™¨ç™»å½•ï¼Œåˆ™å°†ç”¨æˆ·è¯äh±‚重定向到单点ç™Õd½•服务器上。(使用重定向就可以处理各服务器跨域的情况)

å›?3.4 用户单点ç™Õd½•‹¹ç¨‹ - 步骤äº?/strong>


3、单点登录服务器‹‚€æŸ¥åˆ°ç”¨æˆ·å·²ç»å•点ç™Õd½•åQˆå¦‚果用æˆäh²¡æœ‰å•点登录则要求用户ç™Õd½•åQŒç™»å½•æ ‡å¿—å­˜å‚¨äØ“å®¢æˆ·ç«¯æµè§ˆå™¨çš„CookieåQ‰ï¼Œæ‰‘Öˆ°è¯¥ç”¨æˆ·åœ¨ç›¸åº”应用¾pȝ»Ÿä¸Šç»‘定的账号ã€?/p>
å›?3.5 用户单点ç™Õd½•‹¹ç¨‹ - 步骤ä¸?/strong>

4、单点登录服务器æ ÒŽ®½W¬ä¸‰æ­¥çš„¾l“果生成用户令牌åQŒé‡å®šå‘回应用系¾lŸã€?/p>
å›?3.6 用户单点ç™Õd½•‹¹ç¨‹ - 步骤å›?/strong>

5、应用系¾lŸæŽ¥æ”¶ç»Ÿä¸€æ ¼å¼çš„用户ä×o牌,取得用户在本¾pȝ»Ÿä¸Šçš„ç™Õd½•账号åQŒå°†ç”¨æˆ·åœ¨æœ¬¾pȝ»Ÿä¸ŠçŠ¶æ€ç½®ä¸ºç™»å½•ï¼Œ˜q”回用户è¯äh±‚讉K—®çš„页面ã€?/p>
å›?3.7 用户单点ç™Õd½•‹¹ç¨‹ - 步骤äº?/strong>

 

  如果用户在访问应用系¾lŸä¹‹å‰å·²¾låœ¨å•点ç™Õd½•服务器上ç™Õd½•˜q‡ï¼Œ½W¬äºŒæ­¥åˆ°½W¬å››å¸ƒå¯¹ç”¨æˆ·æ¥è¯´ž®±æ˜¯é€æ˜Žçš„,用户感觉只是向应用系¾lŸå‘å‡ÞZº†è®‰K—®è¯äh±‚åQŒç„¶åŽå¾—åˆîCº†™åµé¢åé¦ˆã€?/p>


4 实现

(ç•?

5 æ€È»“

  本方案设计的用户单点ç™Õd½•¾pȝ»Ÿåšåˆ°äº†ï¼š

  • 真正了实现单点登录、全¾|‘访问,方便用户的ä‹É用过½E‹ã€?/li>
  • 各系¾lŸä¹‹é—´è€¦åˆåº¦ä½ŽåQŒåº”用系¾lŸçš„æ”šw€ ä¸ç ´åå…¶å›ºæœ‰æµ½E‹å’Œ¾l“æž„åQŒæ•´ä¸ªç³»¾lŸçš„实施˜q‡ç¨‹å®‰å…¨òqÏx»‘ã€?/li>
  • ¾lŸä¸€äº†å•点登录服务器到应用服务器的用戯‚®¤è¯ä¿¡æ¯è®¿é—®æ ‡å‡†ï¼Œ¾lŸä¸€äº†ä×o牌安全加密的传输和识别标准,为将来更多应用系¾lŸæä¾›äº†¾lŸä¸€çš„单点登录框架ã€?/li>
  • 整合了过åŽÕdˆ†æ•£åœ¨å„应用系¾lŸä¸­è™½ç„¶æœ‰å†…在关联却难以判别的用户信息资源,为更˜q›ä¸€æ­¥çš„用户个性化服务打下了基¼‹€ã€?/li>


]]>
org.hibernate.exception.GenericJDBCException: Cannot release connectionåQˆè{åQ?/title><link>http://www.aygfsteel.com/kxbin/articles/365940.html</link><dc:creator>kxbin</dc:creator><author>kxbin</author><pubDate>Fri, 09 Dec 2011 01:01:00 GMT</pubDate><guid>http://www.aygfsteel.com/kxbin/articles/365940.html</guid><wfw:comment>http://www.aygfsteel.com/kxbin/comments/365940.html</wfw:comment><comments>http://www.aygfsteel.com/kxbin/articles/365940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kxbin/comments/commentRss/365940.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kxbin/services/trackbacks/365940.html</trackback:ping><description><![CDATA[<div><div style="margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; font: normal normal normal 20px/30px 'Microsoft YaHei'; text-align: left; background-color: #ffffff; "><h3><a title="org.hibernate.exception.GenericJDBCException: Cannot release connection" style="color: #000000; text-decoration: none; ">org.hibernate.exception.GenericJDBCException: Cannot release connection</a></h3></div><div class="wmqeeuq" id="article_content" style="margin-top: 20px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'Courier New', Console, Verdana, å¾®èÊY雅黑; font: normal normal normal 14px/26px Arial; color: #333333; text-align: left; background-color: #ffffff; "><span style="font-family: å¾®èÊY雅黑; "><strong>问题åQ?/strong><br />    ¾pȝ»Ÿé‡‡ç”¨Spring MVC 2.5 + Spring 2.5 + Hibernate 3.2æž¶æž„åQŒå…¶ä¸­æ•°æ®æº˜qžæŽ¥æ± é‡‡ç”¨çš„æ˜¯Apache commons DBCP。问题是˜q™æ ·çš„,¾pȝ»Ÿ˜qè¡Œä¸€ŒD‰|—¶é—´åŽåQˆå¤§è‡´æ¯éš?ž®æ—¶åQ‰ï¼Œè®‰K—®¾pȝ»Ÿä¼šå‡ºçŽ°å¦‚ä¸‹é”™è¯¯ï¼Œå†æ¬¡è®‰K—®æ¢å¤æ­£å¸¸ã€?br /></span><div bg_html"="" style="width: 687px; "><div><div><a title="view plain" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_plain.gif); border-width: initial; border-color: initial; padding-top: 1px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat; ">view plain</a></div></div><ol start="1" style="border-width: initial; border-color: initial; "><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; ">org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.GenericJDBCException: Cannot release connection  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:583)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">Caused by: org.hibernate.exception.GenericJDBCException: Cannot release connection  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.hibernate.jdbc.ConnectionManager.closeConnection(ConnectionManager.java:449)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.hibernate.jdbc.ConnectionManager.cleanup(ConnectionManager.java:379)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.hibernate.jdbc.ConnectionManager.manualDisconnect(ConnectionManager.java:333)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.hibernate.impl.SessionImpl.disconnect(SessionImpl.java:375)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.orm.hibernate3.HibernateTransactionManager.doCleanupAfterCompletion(HibernateTransactionManager.java:744)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:989)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:855)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:800)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:339)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at java.lang.reflect.Method.invoke(Method.java:585)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:421)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:136)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:326)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:313)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">  36 more  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">Caused by: java.sql.SQLException: Already closed.  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:77)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:180)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.closeConnection(LocalDataSourceConnectionProvider.java:96)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "> at org.hibernate.jdbc.ConnectionManager.closeConnection(ConnectionManager.java:445)  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">  62 more  </span></li></ol></div>解决åQ?br /><p>    造成Cannot release connection的原因有很多åQŒè¦å…·ä½“问题具体分析。从异常分析åQŒé€ æˆ˜q™ä¸ªå¼‚常 org.hibernate.exception.GenericJDBCException: Cannot release connection å½’æ ¹¾l“底是Caused by: java.sql.SQLException: Already closed. 卌™¿žæŽ¥å·²å…³é—­ã€‚所以解决的办法ž®Þp¦ä»ŽDBCP的参数配¾|®å…¥æ‰‹ï¼Œè§ä¸‹é¢çš„参数配置propertiesæ–‡äšgã€?/p><p> </p><div bg_html"="" style="width: 687px; "><div><div><a title="view plain" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_plain.gif); border-width: initial; border-color: initial; padding-top: 1px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat; ">view plain</a></div></div><ol start="1" style="border-width: initial; border-color: initial; "><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; ">#### :: Apache DBCP :: ####  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; color: red; ">jdbc.driverClassName</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">oracle</span><span style="border-width: initial; border-color: initial; ">.jdbc.driver.OracleDriver  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; color: blue; ">jdbc</span><span style="border-width: initial; border-color: initial; color: red; ">jdbc.url</span><span style="border-width: initial; border-color: initial; ">=jdbc:oracle:thin:@10.165.153.9:1521:PRDC  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; color: red; ">jdbc.username</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">guser</span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; color: red; ">jdbc.password</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">guser</span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">#初始化连æŽ?nbsp; </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; color: red; ">jdbc.initialSize</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">0</span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">#˜qžæŽ¥æ± çš„æœ€å¤§æ´»åŠ¨ä¸ªæ•?nbsp; </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; color: red; ">jdbc.maxActive</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">20</span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">#没有人用˜qžæŽ¥çš„æ—¶å€™ï¼Œæœ€å¤§é—²¾|®çš„˜qžæŽ¥ä¸ªæ•°ã€?nbsp; </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; color: red; ">jdbc.maxIdle</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">100</span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">#没有人用˜qžæŽ¥çš„æ—¶å€™ï¼Œæœ€ž®é—²¾|®çš„˜qžæŽ¥ä¸ªæ•°ã€?nbsp; </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; color: red; ">jdbc.minIdle</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">0</span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">#­‘…æ—¶½{‰å¾…æ—‰™—´ä»¥æ¯«¿U’äØ“å•ä½  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; color: red; ">jdbc.maxWait</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">10000</span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">#是否自动回收­‘…æ—¶˜qžæŽ¥  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; color: red; ">jdbc.removeAbandoned</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">true</span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">#讄¡½®è¢«é—弃的˜qžæŽ¥çš„超时的旉™—´åQˆä»¥¿U’数为单位)åQŒå³å½“一个连接被遗弃的时间超˜q‡è®¾¾|®çš„æ—‰™—´åQŒåˆ™å®ƒä¼šè‡ªåŠ¨è½¬æ¢æˆå¯åˆ©ç”¨çš„è¿žæŽ¥ã€‚é»˜è®¤çš„­‘…æ—¶æ—‰™—´æ˜?00¿U’ã€?nbsp; </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; color: red; ">jdbc.removeAbandonedTimeout</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">60</span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">#是否在自动回收超时连接的时候打印连接的­‘…时错误  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; color: red; ">jdbc.logAbandoned</span><span style="border-width: initial; border-color: initial; "> = </span><span style="border-width: initial; border-color: initial; color: blue; ">true</span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">#¾l™å‡ºä¸€æ¡ç®€å•çš„sql语句˜q›è¡ŒéªŒè¯  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; color: red; ">jdbc.validationQuery</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">select</span><span style="border-width: initial; border-color: initial; "> 1 from dual  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">#åœ¨å–å‡ø™¿žæŽ¥æ—¶˜q›è¡Œæœ‰æ•ˆéªŒè¯  </span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; color: red; ">jdbc.testOnBorrow</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">true</span><span style="border-width: initial; border-color: initial; ">  </span></span></li></ol></div><span style="font-family: å¾®èÊY雅黑; ">其中标红的两个参数的作用是对池化˜qžæŽ¥˜q›è¡ŒéªŒè¯åQŒThis will ensure that DBCP only hands out good connections to Hibernate. 故加上这两个参数后,˜q™ä¸ªå¼‚常ž®×ƒ¸ä¼šå†å‡ºçŽ°äº†ã€‚åœ¨Spring中指定数据源如下åQ?/span><p> </p><p> </p><div bg_html"="" style="width: 687px; "><div><div><a title="view plain" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_plain.gif); border-width: initial; border-color: initial; padding-top: 1px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat; ">view plain</a></div></div><ol start="1" style="border-width: initial; border-color: initial; "><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; "><span style="border-width: initial; border-color: initial; "><!--  ä½¿ç”¨Apache DBCP連接æ±?nbsp;--></span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">    <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; "><</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">bean</span> <span style="border-width: initial; border-color: initial; color: red; ">id</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"dataSource"</span> <span style="border-width: initial; border-color: initial; color: red; ">class</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"org.apache.commons.dbcp.BasicDataSource"</span> <span style="border-width: initial; border-color: initial; color: red; ">destroy-method</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"close"</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">></span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">        <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; "><</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">property</span> <span style="border-width: initial; border-color: initial; color: red; ">name</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"driverClassName"</span> <span style="border-width: initial; border-color: initial; color: red; ">value</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"${jdbc.driverClassName}"</span> <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">/></span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">        <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; "><</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">property</span> <span style="border-width: initial; border-color: initial; color: red; ">name</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"url"</span> <span style="border-width: initial; border-color: initial; color: red; ">value</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"${jdbc.url}"</span> <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">/></span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">        <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; "><</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">property</span> <span style="border-width: initial; border-color: initial; color: red; ">name</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"username"</span> <span style="border-width: initial; border-color: initial; color: red; ">value</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"${jdbc.username}"</span> <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">/></span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">        <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; "><</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">property</span> <span style="border-width: initial; border-color: initial; color: red; ">name</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"password"</span> <span style="border-width: initial; border-color: initial; color: red; ">value</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"${jdbc.password}"</span> <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">/></span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">        <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; "><</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">property</span> <span style="border-width: initial; border-color: initial; color: red; ">name</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"maxActive"</span> <span style="border-width: initial; border-color: initial; color: red; ">value</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"${jdbc.maxActive}"</span> <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">/></span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">        <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; "><</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">property</span> <span style="border-width: initial; border-color: initial; color: red; ">name</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"maxIdle"</span> <span style="border-width: initial; border-color: initial; color: red; ">value</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"${jdbc.maxIdle}"</span> <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">/></span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">        <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; "><</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">property</span> <span style="border-width: initial; border-color: initial; color: red; ">name</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"maxWait"</span> <span style="border-width: initial; border-color: initial; color: red; ">value</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"${jdbc.maxWait}"</span> <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">/></span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">        <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; "><</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">property</span> <span style="border-width: initial; border-color: initial; color: red; ">name</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"removeAbandoned"</span> <span style="border-width: initial; border-color: initial; color: red; ">value</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"${jdbc.removeAbandoned}"</span> <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">/></span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">        <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; "><</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">property</span> <span style="border-width: initial; border-color: initial; color: red; ">name</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"removeAbandonedTimeout"</span> <span style="border-width: initial; border-color: initial; color: red; ">value</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"${jdbc.removeAbandonedTimeout}"</span> <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">/></span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">        <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; "><</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">property</span> <span style="border-width: initial; border-color: initial; color: red; ">name</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"logAbandoned"</span> <span style="border-width: initial; border-color: initial; color: red; ">value</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"${jdbc.logAbandoned}"</span> <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">/></span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">        <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; "><</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">property</span> <span style="border-width: initial; border-color: initial; color: red; ">name</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"validationQuery"</span> <span style="border-width: initial; border-color: initial; color: red; ">value</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"${jdbc.validationQuery}"</span> <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">/></span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">        <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; "><</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">property</span> <span style="border-width: initial; border-color: initial; color: red; ">name</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"testOnBorrow"</span> <span style="border-width: initial; border-color: initial; color: red; ">value</span><span style="border-width: initial; border-color: initial; ">=</span><span style="border-width: initial; border-color: initial; color: blue; ">"${jdbc.testOnBorrow}"</span> <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">/></span><span style="border-width: initial; border-color: initial; ">  </span></span></li><li style="border-width: initial; border-color: initial; line-height: 18px; "><span style="border-width: initial; border-color: initial; ">    <span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; "></</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">bean</span><span style="border-width: initial; border-color: initial; color: #993300; font-weight: bold; ">></span><span style="border-width: initial; border-color: initial; ">  </span></span></li></ol></div><p> </p></div></div><img src ="http://www.aygfsteel.com/kxbin/aggbug/365940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kxbin/" target="_blank">kxbin</a> 2011-12-09 09:01 <a href="http://www.aygfsteel.com/kxbin/articles/365940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>beanutils,StringUtils½{‰å·¥å…·åŒ…的学ä¹?/title><link>http://www.aygfsteel.com/kxbin/articles/365373.html</link><dc:creator>kxbin</dc:creator><author>kxbin</author><pubDate>Fri, 02 Dec 2011 06:11:00 GMT</pubDate><guid>http://www.aygfsteel.com/kxbin/articles/365373.html</guid><wfw:comment>http://www.aygfsteel.com/kxbin/comments/365373.html</wfw:comment><comments>http://www.aygfsteel.com/kxbin/articles/365373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kxbin/comments/commentRss/365373.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kxbin/services/trackbacks/365373.html</trackback:ping><description><![CDATA[1.beanutils<br />2.StringUtils<img src ="http://www.aygfsteel.com/kxbin/aggbug/365373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kxbin/" target="_blank">kxbin</a> 2011-12-02 14:11 <a href="http://www.aygfsteel.com/kxbin/articles/365373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>saveToken介绍一http://www.aygfsteel.com/kxbin/articles/365348.htmlkxbinkxbinFri, 02 Dec 2011 01:32:00 GMThttp://www.aygfsteel.com/kxbin/articles/365348.htmlhttp://www.aygfsteel.com/kxbin/comments/365348.htmlhttp://www.aygfsteel.com/kxbin/articles/365348.html#Feedback0http://www.aygfsteel.com/kxbin/comments/commentRss/365348.htmlhttp://www.aygfsteel.com/kxbin/services/trackbacks/365348.html
1》防止多‹Æ¡ç‚¹å‡?#8220;提交”,让多‹Æ?#8220;提交”变成只一‹Æ?#8220;提交”
saveToken(rquest)
的目的是™åµé¢ä¸Šçš„æŒ‰é’®åªç›¸åº”一‹Æ¡ï¼Œæ¯”如è¯ß_¼Œåœ¨é¡µé¢ä¸Šæœ‰ä¸ªæ–°å¢žæŒ‰é’®åQŒå¦‚果你˜qžç®‹ç‚¹å‡»æ•°æ¬¡åQŒåŽå°ç¨‹åºå¯èƒ½ä¼šå“åº”n‹Æ¡ï¼ŒåŠ äº†˜q™å¥è¯ï¼Œåœ¨é¡µé?/div>
上自动生成一个hidden变量
2》防止页面重复提�/div>
利用同步令牌åQˆTokenåQ‰æœºåˆ¶æ¥è§£å†³Web应用中重复提交的问题åQŒStruts也给å‡ÞZº†ä¸€ä¸ªå‚考实现ã€?/div>
  基本原理åQšã€€
  服务器端在处理到辄¡š„è¯äh±‚之前åQŒä¼šž®†è¯·æ±‚中包含的ä×o牌å€ég¸Žä¿å­˜åœ¨å½“前用户会话中的ä×oç‰Œå€ÆD¿›è¡Œæ¯”较,看是否匹配。在处理完该è¯äh±‚å?/div>
åQŒä¸”在答复发送给客户端之前,ž®†ä¼šäº§ç”Ÿä¸€ä¸ªæ–°çš„ä×o牌,该ä×o牌除传给客户端以外,也会ž®†ç”¨æˆ·ä¼šè¯ä¸­ä¿å­˜çš„æ—§çš„ä×o牌进行替换。这样如果用
户回退到刚才的提交™åµé¢òq¶å†‹Æ¡æäº¤çš„话,客户端传˜q‡æ¥çš„ä×o牌就和服务器端的令牌不一è‡ß_¼Œä»Žè€Œæœ‰æ•ˆåœ°é˜²æ­¢äº†é‡å¤æäº¤çš„发生。 
  if (isTokenValid(request, true)) {
  
  // 表单不是重复提交
  
  //˜q™é‡Œæ˜¯ä¿å­˜æ•°æ®çš„代码
  
  } else {
  
  //表单重复提交
  
  saveToken(request);
  
  //其它的处理代�/div>
  
  }
 
 
¾|‘ä¸Šä¾‹å­ä¸ø™¯åQ?/div>
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        UserForm userForm = (UserForm)form;
        if(!isTokenValid(request)){         
            saveToken(request);
            userForm.setMessage("重复提交");
            return mapping.findForward("failure");
        }
        else{
            resetToken(request);
        }
        request.setAttribute("user", userForm);
        return mapping.findForward("success");
    }
}
模板¾lå…¸ä¾‹å­åQ?/div>
public ActionForward save(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws BaseException {
  if (!isTokenValid(request)) { // 如果指ä×o无效åQŒåˆ™å±žäºŽé‡å¤æäº¤
   return (new ActionForward(mapping.getInput()));
  } else {
   resetToken(request);
  }
  BaseDao dao = DAOFactory.getDao(getEntityDAOClassName());
  dao.begingTransaction();
  Class cls = dao.getEntityClass();
  try {
   BaseVO vo = (BaseVO) cls.newInstance();
   
   DataTrans.copyProperties(vo, form);
   this.saveEx(mapping, form, request, response, vo);
   dao.save(vo);
   dao.commitTransaction();
  } catch (Exception e) {
   dao.rollback();
   throw new BaseException("保存数据出现异常");
  } finally {
   dao.sessionClose();
  }
  return mapping.findForward("saveSuccess");
 }


]]>saveToken介绍äº?/title><link>http://www.aygfsteel.com/kxbin/articles/365349.html</link><dc:creator>kxbin</dc:creator><author>kxbin</author><pubDate>Fri, 02 Dec 2011 01:32:00 GMT</pubDate><guid>http://www.aygfsteel.com/kxbin/articles/365349.html</guid><wfw:comment>http://www.aygfsteel.com/kxbin/comments/365349.html</wfw:comment><comments>http://www.aygfsteel.com/kxbin/articles/365349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kxbin/comments/commentRss/365349.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kxbin/services/trackbacks/365349.html</trackback:ping><description><![CDATA[<div><pre><span style="font-size:13.5pt; font-family:"Comic Sans MS"">Struts</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">çš?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Token</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQˆä×o牌)机制能够很好的解册™¡¨å•重复提交的问题åQŒåŸºæœ¬åŽŸç†æ˜¯åQšæœåŠ¡å™¨ç«¯åœ¨å¤„ç†åˆ°è¾¾çš„è¯·æ±‚ä¹‹å‰ï¼Œä¼šå°†è¯äh±‚中包含的令牌å€ég¸Žä¿å­˜åœ¨å½“前用户会话中的ä×oç‰Œå€ÆD¿›è¡Œæ¯”较,看是否匹配。在处理完该è¯äh±‚后,且在½{”复发送给客户端之前,ž®†ä¼šäº§ç”Ÿä¸€ä¸ªæ–°çš„ä×o牌,该ä×o牌除传给客户端以外,也会ž®†ç”¨æˆ·ä¼šè¯ä¸­ä¿å­˜çš„æ—§çš„ä×o牌进行替换。这样如果用户回退到刚才的提交™åµé¢òq¶å†‹Æ¡æäº¤çš„话,客户端传˜q‡æ¥çš„ä×o牌就和服务器端的令牌不一è‡ß_¼Œä»Žè€Œæœ‰æ•ˆåœ°é˜²æ­¢äº†é‡å¤æäº¤çš„发生ã€?/span></pre><pre><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">˜q™æ—¶å…¶å®žä¹Ÿå°±æ˜¯ä¸¤ç‚¹ï¼Œ½W¬ä¸€åQšä½ éœ€è¦åœ¨è¯äh±‚中有˜q™ä¸ªä»¤ç‰Œå€û|¼Œè¯äh±‚中的令牌值如何保存,其实ž®±å’Œæˆ‘们òqÏx—¶åœ¨é¡µé¢ä¸­ä¿å­˜ä¸€äº›ä¿¡æ¯æ˜¯ä¸€æ ïLš„åQŒé€šè¿‡éšè—å­—段来保存,保存的åŞ式如åQ?/span> <span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ã€?/span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">〉,˜q™ä¸ª</span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">value</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">æ˜?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">TokenProcessor</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">¾cÖM¸­çš?/span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">generateToken()</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">获得的,是根据当前用æˆïLš„</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">session id</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">和当前时间的</span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">long</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">值来计算的。第二:在客æˆïL«¯æäº¤åŽï¼Œæˆ‘们要根据判断在è¯äh±‚中包含的值是否和服务器的令牌一è‡ß_¼Œå› äؓ服务器每‹Æ¡æäº¤éƒ½ä¼šç”Ÿæˆæ–°çš?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Token</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQŒæ‰€ä»¥ï¼Œå¦‚果是重复提交,客户端的</span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">Token</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">值和服务器端çš?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Token</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">值就会不一致。下面就以在数据库中插入一条数据来说明如何防止重复提交ã€?/span></pre> <p><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åœ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Action</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">中的</span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">add</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">æ–ÒŽ³•中,我们需要将</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Token</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">值明¼‹®çš„要求保存在页面中åQŒåªéœ€å¢žåŠ ä¸€æ¡è¯­å¥ï¼š</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">saveToken(request);</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQŒå¦‚下所½Cºï¼š</span><span style="font-size:13.5pt; font-family:"Comic Sans MS""> <br /> public ActionForward add(ActionMapping mapping, ActionForm form, <br /> HttpServletRequest request, HttpServletResponse response)<br /> //</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">前面的处理省ç•?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> saveToken(request);<br /> return mapping.findForward("add");<br /> }</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åœ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Action</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">çš?/span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">insert</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">æ–ÒŽ³•中,我们æ ÒŽ®è¡¨å•中的</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Token</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">å€ég¸ŽæœåŠ¡å™¨ç«¯çš?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">Token</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">值比较,如下所½Cºï¼š</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> public ActionForward insert(ActionMapping mapping, ActionForm form, <br /> HttpServletRequest request, HttpServletResponse response)<br /> if (isTokenValid(request, true)) {<br /> // </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">表单不是重复提交</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> //</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">˜q™é‡Œæ˜¯ä¿å­˜æ•°æ®çš„代码</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> } else {<br /> //</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">表单重复提交</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> saveToken(request);<br /> //</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">其它的处理代ç ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> }<br /> }</span></p> <pre><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">其实使用èµäh¥å¾ˆç®€å•,举个最½Ž€å•、最需要ä‹É用这个的例子åQ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">一般控刉™‡å¤æäº¤ä¸»è¦æ˜¯ç”¨åœ¨å¯ÒŽ•°æ®åº“操作的控制上åQŒæ¯”如插入、更新、删除等åQŒç”±äºŽæ›´æ–°ã€åˆ é™¤ä¸€èˆ¬éƒ½æ˜¯é€šè¿‡</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">id</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">来操作(例如åQ?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">updateXXXById, removeXXXById</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQ‰ï¼Œæ‰€ä»¥è¿™¾cÀL“ä½œæŽ§åˆ¶çš„æ„ä¹‰ä¸æ˜¯å¾ˆå¤§åQˆä¸æŽ’除个别现象åQ‰ï¼Œé‡å¤æäº¤çš„æŽ§åˆ¶ä¹Ÿž®×ƒ¸»è¦æ˜¯åœ¨æ’入时的控制了ã€?/span></pre><pre><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">先说一下,我们目前所做项目的情况åQ?/span><span style="font-size: 13.5pt;font-family:"Comic Sans MS""><br /> </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">目前的项目是ç”?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Struts</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQ?/span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">Spring</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Ibatis</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQŒé¡µé¢ç”¨</span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">jstl</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Struts</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">复杂</span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">View</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">层,</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Spring</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åœ?/span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">Service</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">层提供事务控åˆÓž¼Œ</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Ibatis</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">是用来代æ›?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">JDBC</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQŒæ‰€æœ‰é¡µé¢çš„讉K—®éƒ½ä¸æ˜¯ç›´æŽ¥è®¿é—?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">jsp</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQŒè€Œæ˜¯è®‰K—®</span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">Structs</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">çš?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Action</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQŒå†ç”?/span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">Action</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">æ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Forward</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åˆîC¸€ä¸?/span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">Jsp</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQŒæ‰€æœ‰é’ˆå¯ÒŽ•°æ®åº“的操作,比如取数据或修改数据åQŒéƒ½æ˜¯åœ¨</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Action</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">里面完成åQŒæ‰€æœ‰çš„</span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">Action</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">一般都¾l§æ‰¿</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">BaseDispatchAction</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQŒè¿™ä¸ªæ˜¯è‡ªå·±å»ºç«‹çš„ç±»åQŒç›®çš„æ˜¯ä¸ºæ‰€æœ‰çš„</span><span style="font-size: 13.5pt;font-family:"Comic Sans MS"">Action</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">做一些统一的控åˆÓž¼Œåœ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Struts</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">层,对于一个功能,我们一般分ä¸ÞZ¸¤ä¸?/span><span style="font-size: 13.5pt;font-family:"Comic Sans MS"">Action</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQŒä¸€ä¸?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Action</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">里的功能是不需要调ç”?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">Struts</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">的验证功能的åQˆå¸¸è§çš„æ–ÒŽ³•名称æœ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">add,edit,remove,view,list</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQ‰ï¼Œå¦ä¸€ä¸ªæ˜¯éœ€è¦è°ƒç”?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">Struts</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">的验证功能的åQˆå¸¸è§çš„æ–ÒŽ³•名称æœ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">insert,update</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQ‰ã€?/span></pre><pre><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ž®±æ‹¿è®ºå›å‘脓来说吧,论坛发脓首先需要蟩转到一个页面,你可以填写帖子的主题和内容,填写完后åQŒå•å‡?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">“</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">提交</span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">”</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQŒè„“子就发表了,所以这里经˜q‡ä¸¤ä¸ªæ­¥éª¤ï¼š</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> 1</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">、è{åˆîC¸€ä¸ªæ–°å¢žçš„™åµé¢åQŒåœ¨</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Action</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">里我们一般称ä¸?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">add</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQŒä¾‹å¦‚:</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> public ActionForward add(ActionMapping mapping, ActionForm form,<br />              HttpServletRequest request, HttpServletResponse response)<br />              throws Exception {<br />          //</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">˜q™ä¸€å¥æ˜¯è¾“出调试信息åQŒè¡¨½CÞZ»£ç æ‰§è¡Œåˆ°˜q™ä¸€ŒDµäº†</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br />          log.debug(":: action - subject add");    <br />      <br />          //your code here</span></pre><pre><span style="font-size:13.5pt;font-family:"Comic Sans MS"">        //</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">˜q™é‡Œä¿å­˜</span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">Token</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">å€?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br />          saveToken(request);<br />         <br />         //</span><span style="font-size: 13.5pt;Comic Sans MS";Comic Sans MS"">è·Œ™{åˆ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">add</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">™åµé¢åQŒåœ¨</span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">Structs-config.xml</span><span style="font-size: 13.5pt;Comic Sans MS";Comic Sans MS"">里面定义åQŒä¾‹å¦‚,跌™{åˆ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">subjectAdd.jsp<br />          return mapping.findForward("add");<br />      }</span></pre><pre><span style="font-size: 13.5pt;font-family:"Comic Sans MS"">2</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">、在填写标题和内容后åQŒé€‰æ‹©</span> <span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">提交</span> <span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQŒä¼šæäº¤åˆ?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">insert</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">æ–ÒŽ³•åQŒåœ¨</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">insert</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">æ–ÒŽ³•里判断,是否重复提交了ã€?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS""><br /> public ActionForward insert(ActionMapping mapping, ActionForm form, <br /> HttpServletRequest request, HttpServletResponse response){<br /> if (isTokenValid(request, true)) {<br /> // </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">表单不是重复提交</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> //</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">˜q™é‡Œæ˜¯ä¿å­˜æ•°æ®çš„代码</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> } else {<br /> //</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">表单重复提交</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> saveToken(request);<br /> //</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">其它的处理代ç ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> }<br /> }</span></pre><pre><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">下面更详¾l†ä¸€ç‚¹ï¼ˆæ³¨æ„åQŒä¸‹é¢æ‰€æœ‰çš„代码使用全角括号åQ‰ï¼š</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> 1</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">、你惛_‘è´´æ—¶åQŒç‚¹å‡?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">“</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">我要发脓</span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">”</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">链接的代码可以里˜q™æ ·çš„:</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ã€?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">html:link action="subject.do?method=add"</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">〉我要发贴ã€?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">/html:link</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ã€?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> subject.do </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">å’?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS""> method </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">˜q™äº›åœ?/span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">struct-config.xml</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">如何定义我就不说了,点击链接后,会执è¡?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">subject.do</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">çš?/span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">add</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">æ–ÒŽ³•åQŒä»£ç å¦‚上面说的åQŒèŸ©è½¬åˆ°</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">subjectAdd.jsp</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">™åµé¢ã€‚页面的代码大概如下åQ?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS""><br /> </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ã€?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">html:form action="subjectForm.do?method=insert"</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ã€?/span><span style="font-size:13.5pt;font-family: "Comic Sans MS""><br />    </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ã€?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">html:text property="title" /</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ã€?/span><span style="font-size:13.5pt;font-family: "Comic Sans MS""><br />    </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ã€?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">html:textarea property="content" /</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ã€?/span><span style="font-size:13.5pt;font-family: "Comic Sans MS""><br />    </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ã€?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">html:submit property="</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">发表</span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">" /</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ã€?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br />    </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ã€?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">html:reset property="</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">重填</span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">" /</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ã€?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ã€?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">html:form</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ã€?/span><span style="font-size:13.5pt;font-family: "Comic Sans MS""><br /> </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">如果你在</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">add</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">æ–ÒŽ³•里加äº?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">“saveToken(request);”</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">˜q™ä¸€å¥ï¼Œé‚£åœ¨</span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">subjectAdd.jsp</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">生成的页面上åQŒä¼šå¤šä¸€ä¸ªéšè—å­—ŒDµï¼Œ¾cÖM¼¼äºŽè¿™æ —÷€?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">〉,</span></pre><pre><span style="font-size:13.5pt; font-family:"Comic Sans MS"">2</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">、点å‡Õd‘表后åQŒè¡¨å•提交到</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">subjectForm.do</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">里的</span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">insert</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">æ–ÒŽ³•后,你在</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">insert</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">æ–ÒŽ³•里要ž®†è¡¨å•的数据插入到数据库中,如果没有˜q›è¡Œé‡å¤æäº¤çš„æŽ§åˆÓž¼Œé‚£ä¹ˆæ¯ç‚¹å‡ÖM¸€‹Æ¡æµè§ˆå™¨çš„刷新按钮,都会在数据库中插入一条相同的记录åQŒå¢žåŠ ä¸‹é¢çš„ä»£ç åQŒä½ ž®±å¯ä»¥æŽ§åˆ¶ç”¨æˆïLš„重复提交了ã€?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> if (isTokenValid(request, true)) {<br /> // </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">表单不是重复提交</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> //</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">˜q™é‡Œæ˜¯ä¿å­˜æ•°æ®çš„代码</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> } else {<br /> //</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">表单重复提交</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> saveToken(request);<br /> //</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">其它的处理代ç ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> }<br /> </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">注意åQŒä½ å¿…é¡»åœ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">add</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">æ–ÒŽ³•里ä‹É用了</span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">saveToken(request)</span><span style="font-size: 13.5pt;Comic Sans MS";Comic Sans MS"">åQŒä½ æ‰èƒ½åœ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">insert</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">里判断,否则åQŒä½ æ¯æ¬¡ä¿å­˜æ“ä½œéƒ½æ˜¯é‡å¤æäº¤ã€?/span><span style="font-size: 13.5pt;font-family:"Comic Sans MS""><br /> </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">è®îC½ä¸€ç‚¹ï¼Œ</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Struts</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">在你每次讉K—®</span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">Action</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">的时候,都会产生一个ä×o牌,保存在你çš?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Session</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">里面åQŒå¦‚果你åœ?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">Action</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">里的函数里面åQŒä‹É用了</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">saveToken(request);</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQŒé‚£ä¹ˆè¿™ä¸ªä×o牌也会保存在˜q™ä¸ª</span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">Action</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">所</span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Forward</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">到的</span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">jsp</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">所生成的静态页面里ã€?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">如果你在ä½?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Action</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">的方法里使用äº?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">isTokenValid</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQŒé‚£ä¹?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Struts</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">会将你从你的</span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">request</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">里面去获取这个ä×o牌å€û|¼Œç„¶åŽå’?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">Session</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">里的令牌值做比较åQŒå¦‚果两者相½{‰ï¼Œž®×ƒ¸æ˜¯é‡å¤æäº¤ï¼Œå¦‚果不相½{‰ï¼Œž®±æ˜¯é‡å¤æäº¤äº†ã€?/span></pre><pre><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">ç”׃ºŽæˆ‘们™å¹ç›®çš„æ‰€æœ?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">Action</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">都是¾l§æ‰¿è‡?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">BaseDispatchAction</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">˜q™ä¸ª¾c»ï¼Œæ‰€ä»¥æˆ‘们基本上都是在这个类里面做了表单重复提交的控åˆÓž¼Œé»˜è®¤æ˜¯æŽ§åˆ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS"">add</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">æ–ÒŽ³•å’?/span><span style="font-size:13.5pt;font-family: "Comic Sans MS"">insert</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">æ–ÒŽ³•åQŒå¦‚果需要控制其它的æ–ÒŽ³•åQŒå°±è‡ªå·±æ‰‹åŠ¨å†™ä¸Šé¢è¿™äº›ä»£ç ï¼Œå¦åˆ™æ˜¯ä¸éœ€è¦æ‰‹å†™çš„åQŒæŽ§åˆ¶çš„代码如下åQ?/span><span style="font-size:13.5pt;font-family:"Comic Sans MS""><br /> public abstract class BaseDispatchAction extends BaseAction {<br /> protected ActionForward perform(ActionMapping mapping, ActionForm form,<br />      HttpServletRequest request, HttpServletResponse response)<br />      throws Exception {<br />          String parameter = mapping.getParameter();<br />          String name = request.getParameter(parameter);<br /> if (null == name) { //</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">如果没有指定</span><span style="font-size:13.5pt;font-family:"Comic Sans MS""> method </span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">åQŒåˆ™é»˜è®¤ä¸?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS""> list<br />              name = "list";<br />          }</span></pre><pre><span style="font-size:13.5pt;font-family:"Comic Sans MS"">         if ("add".equals(name)) {<br />              if ("add".equals(name)) {<br />                  saveToken(request);<br />              }<br />          } else if ("insert".equals(name)) {<br />              if (!isTokenValid(request, true)) {<br />                  resetToken(request);<br />                  saveError(request, new ActionMessage("error.repeatSubmit"));<br />                  log.error("</span><span style="font-size:13.5pt;Comic Sans MS";Comic Sans MS"">重复提交åQ?/span><span style="font-size:13.5pt; font-family:"Comic Sans MS"">");<br />                  return mapping.findForward("error");<br />              }<br />          }<br />          return dispatchMethod2(mapping, form, request, response, name);<br />      }<br /> }</span></pre> <p> </p></div><img src ="http://www.aygfsteel.com/kxbin/aggbug/365349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kxbin/" target="_blank">kxbin</a> 2011-12-02 09:32 <a href="http://www.aygfsteel.com/kxbin/articles/365349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用˜qžæŽ¥æ± è¿žæŽ¥MySQLhttp://www.aygfsteel.com/kxbin/articles/325296.htmlkxbinkxbinMon, 05 Jul 2010 08:15:00 GMThttp://www.aygfsteel.com/kxbin/articles/325296.htmlhttp://www.aygfsteel.com/kxbin/comments/325296.htmlhttp://www.aygfsteel.com/kxbin/articles/325296.html#Feedback0http://www.aygfsteel.com/kxbin/comments/commentRss/325296.htmlhttp://www.aygfsteel.com/kxbin/services/trackbacks/325296.html下面我把配置˜q‡ç¨‹åˆ†æˆä¸‰ä¸ªæ­¥éª¤æ¥å®Œæˆï¼š
½W¬ä¸€æ­¥ï¼šåœ¨ä½ å®‰è£…TomCat的目录下扑ֈ°context.xml配置文äšg。(例如åQšD:\Tomcat 6.0\conf\context.xmlåQ‰ç„¶åŽæ‰“å¼€context.xmlåQŒåœ¨æ ? ½{?lt;context></<context>之间加入以下内容åQ?ä¸ÞZº†å¤§å®¶å®ÒŽ˜“理解åQŒæˆ‘加了较详¾l†çš„æ³¨é‡Š)
<Resource
name="jdbc/course" //数据源名¿UŽÍ¼ˆè‡ªå®šä¹‰ï¼‰åˆ°æ—¶å€™è¦ç”¨åˆ°çš„,所以最好è“v
//个有含义的名字,例如我这个数据源名字åQŒjdbc表示ä¸?/数据库连接有关的åQŒè€Œcourse是我˜q™ä¸ª™å¹ç›®çš„名字ã€?
auth="Container" //˜q™ä¸ªé»˜è®¤ž®±å¥½äº?
type="javax.sql.DataSource" //˜q™ä¸ªä¹Ÿé»˜è®¤å°±å¥½äº†
              driverClassName="com.mysql.jdbc.Driver"http://˜q™é‡Œç”¨åˆ°çš„æ˜¯mysql数据库的驱动包ã€?
              url="jdbc:mysql://localhost/course" //˜q™é‡Œæ˜¯è¿žæŽ¥åˆ°mysql数据库的urlåQŒå…¶ä¸­url="jdbc:mysql://localhost/"是固定的åQŒè€Œcourse是我˜q™ä¸ª //™å¹ç›®çš„æ•°æ®åº“名称åQŒæ‰€ä»¥è¿™é‡Œæ”¹ä¸ÞZ½ ä»¬çš„æ•°æ®åº“名¿U°å°±å¥½äº†ã€?
              username="root"http://登陆数据库的用户名�
     password="birchhua" //登陆数据库的密码
     maxIdle="5"http://˜q™ä¸ªä¹Ÿé»˜è®¤å°±å¥½äº†
              maxWait="5000"http://˜q™ä¸ªä¹Ÿé»˜è®¤å°±å¥½äº†
              maxActive="10"/>//˜q™ä¸ªä¹Ÿé»˜è®¤å°±å¥½äº†

½W¬äºŒæ­¥ï¼šåœ¨ä½ çš„项目WEB-INF目录下找到web.xml配置文äšgåQŒç„¶åŽæ‰“å¼€åQŒåœ¨æ ‡ç­¾<web-app></web- app>之间加入以下内容åQ?
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/course</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
其中åQšDB Connection 是自定义的,而jdbc/course是对应上é?lt;Resource></Resource>标签中的name属性的å€û|¼Œ˜q˜æœ‰ javax.sql.DataSourcež®±å¯¹åº”type属性的å€û|¼Œè€Œæœ€åŽContainer对应的是auth属性的倹{€?

½W¬ä¸‰æ­¥ï¼šä¸Šç½‘下蝲一个叫mysql-connector-java-3.1.10-bin.jarçš„jar包,然后ž®†è¯¥jar包放到TomCat 安装目录下的libæ–‡äšg多w‡Œã€‚(例如åQšD:\Tomcat 6.0\lib\mysql-connector-java-3.1.10-bin.jaråQ‰å®Œæˆè¿™ä¸‰æ­¥ž®±é…¾|®å¥½äº†TomCat数据源了ã€?


<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.sql.DataSource"%>
<%@ page import="javax.naming.InitialContext"%>
<%@ page import="java.sql.*"%>
<html>
<body>
<%
       DataSource ds = null;
       try{
          Context initCtx = new InitialContext();
          Context envCtx = (Context) initCtx.lookup("java:comp/env/");
         //从Context中lookup数据源�br />          ds = (DataSource)envCtx.lookup("jdbc/kxbin");
          if(ds!=null){
            out.println("已经获得DataSource!");
            out.println("<br>");
            Connection conn = ds.getConnection();
            PreparedStatement pstmt = conn.prepareStatement("select * from student");
            ResultSet rs = pstmt.executeQuery();
            while(rs.next()){
                out.println(rs.getString("id"));
                out.println(rs.getString("stuName"));
                out.println(rs.getString("password"));
                out.println("<br/>");
            }
            }
        }catch(Exception ne){
           out.println("出现如下错误åQ?lt;br>");
           out.println(ne);
       } 

%>
</body>
</html>




]]>
JAVA ¾~–码不可不注意的规范http://www.aygfsteel.com/kxbin/articles/313444.htmlkxbinkxbinSat, 20 Feb 2010 05:45:00 GMThttp://www.aygfsteel.com/kxbin/articles/313444.htmlhttp://www.aygfsteel.com/kxbin/comments/313444.htmlhttp://www.aygfsteel.com/kxbin/articles/313444.html#Feedback0http://www.aygfsteel.com/kxbin/comments/commentRss/313444.htmlhttp://www.aygfsteel.com/kxbin/services/trackbacks/313444.html一、规范存在的意义

应用¾~–码规范对于软äšg本èínå’ŒèÊY件开发äh员而言ž®¤äؓ重要åQŒæœ‰ä»¥ä¸‹å‡ ä¸ªåŽŸå› åQ?/p>

1、好的编码规范可以尽可能的减ž®‘一个èÊYä»¶çš„¾l´æŠ¤æˆæœ¬ , òq¶ä¸”几乎没有ä»ÖM½•一个èÊYä»Óž¼Œåœ¨å…¶æ•´ä¸ªç”Ÿå‘½å‘¨æœŸä¸­ï¼Œå‡ç”±æœ€åˆçš„开发äh员来¾l´æŠ¤åQ?/p>

2、好的编码规范可以改善èÊY件的可读性,可以让开发äh员尽快而彻底地理解新的代码åQ?/p>

3、好的编码规范可以最大限度的提高团队开发的合作效率åQ?/p>

4、长期的规范性编码还可以让开发äh员养成好的编码习惯,甚至é”ȝ‚¼å‡ºæ›´åŠ ä¸¥è°¨çš„æ€ç»´åQ?/p>

二、命名规�/p>

1、一般概�/p>

1、尽量ä‹É用完整的英文描述½W?/p>

2、采用适用于相关领域的术语

3、采用大ž®å†™æ··åˆä½¿åå­—可è¯?/p>

4、尽量少用羃写,但如果用了,必须½W¦åˆæ•´ä¸ªå·¥ç¨‹ä¸­çš„¾lŸä¸€å®šä¹‰

5、避免ä‹É用长的名字(ž®äºŽ 15 ä¸ªå­—æ¯äØ“æ­£å¸¸é€‰æ‹©åQ?/p>

6、避免ä‹É用类似的名字åQŒæˆ–者仅仅是大小写不同的名字

7、避免ä‹É用下划线åQˆé™¤é™æ€å¸¸é‡ç­‰åQ?/p>

2、标识符¾cÕdž‹è¯´æ˜Ž

1、包åQ?Package åQ‰çš„命名

Package 的名字应该采用完整的英文描述½W¦ï¼Œéƒ½æ˜¯ç”׃¸€ä¸ªå°å†™å•è¯ç»„æˆã€‚åÆˆä¸”åŒ…åçš„å‰ç¼€æ€ÀL˜¯ä¸€ä¸ªé¡¶¾U§åŸŸåï¼Œ

通常æ˜?com、edu、gov、mil、net、org ½{‰ï¼›
如: com.yjhmily.test

2、类åQ?Class åQ‰çš„命名

¾cÕdåº”该是个一名词åQŒé‡‡ç”¨å¤§ž®å†™æ··åˆçš„æ–¹å¼ï¼Œæ¯ä¸ªå•词的首字母大写。尽量保证类名简‹zè€Œå¯ŒäºŽæ˜q°ã€?/p>

使用完整单词åQŒé¿å…ç¾ƒå†™è¯ ( 除非工程内有¾lŸä¸€¾~©å†™è§„范或该¾~©å†™è¯è¢«æ›´å¹¿æ³›ä‹É用,åƒ?URL åQ?HTML)

如: FileDescription

3、接口( Interface åQ‰çš„命名

基本ä¸?Class 的命名规范类伹{€‚在满èƒö Classd 命名规则的基¼‹€ä¹‹ä¸ŠåQŒä¿è¯å¼€å¤´ç¬¬ä¸€ä¸ªå­—æ¯äØ“ ”I”,

便于与普通的 Class区别开。其实现¾cÕd¿U°å–接口名的½W¬äºŒä¸ªå­—母到最后,且满­‘³ç±»åçš„命名规范åQ?/p>

如: IMenuEngine

4、枚举( Enum åQ‰çš„命名

基本ä¸?Class 的命名规范类伹{€‚在满èƒö Classd 命名规则的基¼‹€ä¹‹ä¸ŠåQŒä¿è¯å¼€å¤´ç¬¬ä¸€ä¸ªå­—æ¯äØ“ ”Eâ€?åQ?/p>

便于与普通的 Class区别开�br />如: EUserRole

5、异常( Exception åQ‰çš„命名

异常åQ?Exception åQ?通常采用字母 e 表示异常åQŒå¯¹äºŽè‡ªå®šä¹‰çš„异常类åQŒå…¶åŽç¼€å¿…é¡»ä¸?Exception

如: BusinessException

6、方法( Method åQ‰çš„命名

æ–ÒŽ³•åæ˜¯ä¸€ä¸ªåŠ¨è¯ï¼Œé‡‡ç”¨å¤§å°å†™æØœåˆçš„æ–¹å¼åQŒç¬¬ä¸€ä¸ªå•词的首字母小写,其后单词的首字母大写ã€?/p>

æ–ÒŽ³•名尽可能的描˜q°å‡ºè¯¥æ–¹æ³•çš„åŠ¨ä½œè¡ŒäØ“ã€‚è¿”å›žç±»åž‹äØ“ Boolean 值的æ–ÒŽ³•一般由â€?is ”或â€?has ”来开å¤?/p>

如: getCurrentUser() �addUser() �hasAuthority()

7、参敎ͼˆ Param åQ‰çš„命名

½W¬ä¸€ä¸ªå•词的首字母小写,其后单词的首字母大写。参数量名不允许以下划线或美元符号开å¤ß_¼Œ

虽然˜q™åœ¨è¯­æ³•上是允许的。参数名应简短且富于描述ã€?/p>

如: public UserContext getLoginUser(String loginName);

8、常量字ŒD?åQ?Constants åQ‰çš„命名

静态常量字ŒDµï¼ˆ static final åQ?全部采用大写字母åQŒå•词之间用下划¾U¿åˆ†éš”ï¼›

如: public static final Long FEEDBACK;
public static Long USER_STATUS;

三、注释规�/p>

一个很好的可遵循的有关注释的经验法则是åQ?/p>

问问你自己,你如果从未见˜q‡è¿™ŒDµä»£ç ï¼Œè¦åœ¨åˆç†çš„æ—¶é—´å†…有效地明白这ŒDµä»£ç ï¼Œä½ éœ€è¦ä¸€äº›ä»€ä¹ˆä¿¡æ¯ï¼ŸåQŸï¼Ÿ

1、一般概�/p>

1、注释应该增加代码的清晰�/p>

2、保持注释的½Ž€‹z?/p>

3、在写代码之前或同时写注�/p>

4、注释出ä¸ÞZ»€ä¹ˆåšäº†ä¸€äº›äº‹åQŒè€Œä¸ä»…仅是做了什ä¹?/p>

2、注释哪些部�/p>

1、Java æ–‡äšgåQšå¿…™åÕd†™æ˜Žç‰ˆæƒä¿¡æ¯ä»¥åŠè¯¥æ–‡äšg的创建时间和作者;

2、类åQšç±»çš„目的、即¾cÀL‰€å®Œæˆçš„功能,以及该类创徏的时间和作者名¿UŽÍ¼›å¤šäh一‹Æ¡ç¼–辑或修改同一个类æ—Óž¼Œ

应在作者名¿U°å¤„出现多äh的名¿UŽÍ¼›

3、接口: 在满­‘³ç±»æ³¨é‡Šçš„基¼‹€ä¹‹ä¸ŠåQŒæŽ¥å£æ³¨é‡Šåº”该包含设¾|®æŽ¥å£çš„目的、它应如何被使用以及如何不被使用ã€?/p>

在接口注释清楚的前提下对应的实现¾cÕd¯ä»¥ä¸åŠ æ³¨é‡Šï¼›

4、方法注释: 对于讄¡½® (Set æ–ÒŽ³• ) 与获å?(Get æ–ÒŽ³• ) 成员的方法,在成员变量已有说明的情况下,

可以不加注释åQ›æ™®é€šæˆå‘˜æ–¹æ³•要求说明完成什么功能,参数含义是什么且˜q”回å€ég»€ä¹ˆï¼›å¦å¤–æ–ÒŽ³•的创å»?/p>

æ—‰™—´å¿…须注释清楚åQŒäØ“ž®†æ¥çš„维护和阅读提供宝贵¾U¿çƒ¦åQ?/p>

5、方法内部注释: 控制¾l“æž„åQŒä»£ç åšäº†äº›ä»€ä¹ˆä»¥åŠäؓ什么这样做åQŒå¤„理顺序等åQŒç‰¹åˆ«æ˜¯å¤æ‚的逻辑处理部分åQ?/p>

è¦å°½å¯èƒ½çš„ç»™å‡ø™¯¦¾l†çš„æ³¨é‡ŠåQ?/p>

6、参敎ͼš 参数含义、及其它ä»ÖM½•¾U¦æŸæˆ–前提条ä»Óž¼›

7、属性: 字段描述åQ?/p>

8、局éƒ?( 中间 ) 变量åQ?无特别意义的情况下不加注释;

3、注释格�/p>

遵åó@工程规定的统一注释格式åQŒä¸€èˆ¬æƒ…况下会以 codetemplates.xml 格式的文件导å…?IDE(Eclipse)

或者用Eclipse默认的;

四、代码格式规�/p>

遵åó@工程规定的统一代码格式åQŒä¸€èˆ¬æƒ…况下直接使用 IDE(Eclipse) 自带的默认代码格式对代码˜q›è¡Œæ ¼å¼åŒ–ï¼›

五、其他规�/p>

JSP æ–‡äšg命名

采用完整的英文描˜q°è¯´æ˜?JSP 所完成的功能,ž®½å¯èƒ½åŒ…括一个生动的动词åQŒç¬¬ä¸€ä¸ªå­—母小写,

如: viewMessage.jsp 、editUser.jsp ½{‰ã€?/p>

六、工½E‹ç‰¹æœ‰å‘½åè§„èŒ?/p>

1、持久层

1ã€?Hibernate 映射文äšg及实ä½?/p>

与数据库表名¿U°å®Œå…¨å¯¹åº”ï¼›
如: Advertisement.hbm.xml �Advertisement.java

2、数据访�DAO

DAO 接口和实现类名称必须完全½W¦åˆæ­£å¸¸æŽ¥å£å’Œå®žçŽ°ç±»çš„å‘½åè§„åˆ™ï¼Œä¸”æœ€åŽä»¥ ”DAOâ€?¾l“å°¾

DAO 内的数据讉K—®æ–ÒŽ³•å¿…é¡»­‘›_¤ŸæŠ½è±¡çš„æ˜q°å‡ºå¯ÒŽ•°æ®åº“的基æœ?CRUD 操作åQ?br />如: ICrossAdDAO( 接口 ) ã€?CrossAdDAO( 实现¾c?)

3、各¿Uæ“ä½œæ•°æ®åº“çš?HQL 配置文äšg

HQL æ–‡äšg的个数原则上与系¾lŸçš„ Services 层的服务个数相等åQŒä¸”以服务名¿U°å‘½å?HQL æ–‡äšgåQ?/p>

如: resource.hbm.xml

2、服务层

1、服务接口和实现

服务接口和实现类必须完全½W¦åˆæ­£å¸¸æŽ¥å£å’Œå®žçŽ°ç±»çš„å‘½åè§„åˆ™ï¼›ä»¥å·¥½E‹å®šä¹‰çš„æœåŠ¡åäØ“ä¸ÖM½“åQ?/p>

òq¶ç»Ÿä¸€ä»?”Servâ€?¾l“å°¾
如: IResourceServ( 服务接口 ) ã€?ResourceServ( 接口实现¾c?)

2、服务接口方�/p>

æ–ÒŽ³•åæ˜¯ä¸€ä¸ªåŠ¨è¯ï¼Œé‡‡ç”¨å¤§å°å†™æØœåˆçš„æ–¹å¼åQŒç¬¬ä¸€ä¸ªå•词的首字母小写,其后单词的首字母大写ã€?/p>

æ–ÒŽ³•名尽可能的描˜q°å‡ºè¯¥æ–¹æ³•çš„åŠ¨ä½œè¡ŒäØ“ã€?/p>

˜q”回¾cÕdž‹ä¸?Boolean å€û|¼šç”¨â€?is ”或â€?has ”来开å¤?br />得到某数据: get+ 数据描述名词复数 + 数据¾cÕdž‹åQ?br />得到所有数据: get+All+ 数据描述名词复数 + 数据¾cÕdž‹åQ?br />通过 XXX 得到 / 查询某数据: get/query+ 数据描述名词复数 + 数据¾cÕdž‹ +By+ 条äšgåQ?br />æ·ÕdŠ æŸæ•°æ®ï¼š save/add+ 数据描述名词 ()
更新某数据: save/update+ 数据描述名词åQ?br />删除某数据: delete/remove+ 数据描述名词åQ?/p>

3、业务对�/p>

业务名称 +BO

4、查询参数对�/p>

凡是¾l§æ‰¿ Abst***QuerySpec 的查询参数类全部满èƒö以下规则åQ?br />Query+ 所要查询的数据描述名词 +Spec
ä½œäØ“å‚æ•°ä¼ å…¥æ—Óž¼Œå‚数名必™åÖMØ“åQšæ‰€è¦æŸ¥è¯¢çš„æ•°æ®æè¿°åè¯ +Spec
如: QueryProgramSpec

3、MVC �

1、Action 控制�/p>

Action ¾cÕdåQšåŠŸèƒ½æ¨¡å—å¿U?+Action åQ?br />Actoin æ–ÒŽ³•名称ž®½å¯èƒ½çš„æè¿°å‡ºé¡µé¢è¿¿Uȝš„åŽÕd‘
如: LoginAction( ç™Õd½•ç”?action) åQ?toWelcome( 转向‹Æ¢è¿Ž™å늚„ action æ–ÒŽ³• )

2、资源文�/p>

¾pȝ»Ÿå…¨å±€èµ„源文äšgåQ?globalMessages_+ 字符¾~–码¾cÕdž‹ +.properties
功能模块内部的资源文ä»Óž¼š package.properties

4、Spring 配置文äšg

1、Action 相关配置文äšg
æ–‡äšg目录åQ?WebRoot/WEB-INF/spring/action/ 功能模块名称 +_ApplicationContext.xml

2、Services 相关配置文äšg

æ–‡äšg目录åQ?WebRoot/WEB-INF/spring/services/Services_ApplicationContext.xml

3、全局性配¾|®æ–‡ä»?/p>

æ–‡äšg目录åQ?WebRoot/WEB-INF/spring/工程å?_ApplicationContext.xml

5、JSP æ–‡äšg

采用完整的英文描˜q°è¯´æ˜?JSP 所完成的功能,ž®½å¯èƒ½åŒ…括一个生动的动词åQŒç¬¬ä¸€ä¸ªå­—母小写,
如: viewMessage.jsp 、editUser.jsp ½{‰ã€?/p>


本文来自CSDN博客åQŒè{载请标明出处åQ?a >http://blog.csdn.net/lyjia2001/archive/2007/11/02/1863402.aspx



]]>
EL表达å¼?/title><link>http://www.aygfsteel.com/kxbin/articles/297763.html</link><dc:creator>kxbin</dc:creator><author>kxbin</author><pubDate>Sun, 11 Oct 2009 03:56:00 GMT</pubDate><guid>http://www.aygfsteel.com/kxbin/articles/297763.html</guid><wfw:comment>http://www.aygfsteel.com/kxbin/comments/297763.html</wfw:comment><comments>http://www.aygfsteel.com/kxbin/articles/297763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/kxbin/comments/commentRss/297763.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/kxbin/services/trackbacks/297763.html</trackback:ping><description><![CDATA[ <p> <span style="font-size: medium;"> <span style="font-size: large;"> <strong> <br /> </strong> </span> </span> </p> <p> <span style="font-size: medium;"> <span style="font-size: large;"> <strong>作用åŸ?/strong> </span> <br /> <br /> </span>使用el的时候,默认会以一定顺序搜索四个作用域åQŒå°†æœ€å…ˆæ‰¾åˆ°çš„变量值显½Cºå‡ºæ¥ã€?/p> <div id="wmqeeuq" class="mediaobject"> <img src="http://www.family168.com/tutorial/jsp/shared/images/jsp-ch-13-02-scope-01.png" alt="" align="middle" /> </div> <p>如果我们æœ?{username}˜q™æ ·ä¸€ä¸ªæ­£åˆ™è¡¨è¾‘Ö¼åQŒå®ƒå›žåŽ»ä¾æ¬¡è°ƒç”¨pageContext.getAttribute("username") -> request.getAttribute("username") -> session.getAttribute("username") -> application.getAttribute("username")åQŒåªè¦æ‰¾åˆ°æŸä¸€ä¸ªä¸ä¸ºç©ºçš„值就立刻˜q”回ã€?/p> <p>˜q™æ ·çš„确方便我们的操作,但是随之也出çŽîCº†å¦å¤–一个问题,如果pageContextå’Œrequest中有同名变量åQŒä½†æ˜¯æˆ‘惛_–å¾—request中的变量该如何是好呢åQŸè¿™ž®±éœ€è¦äØ“el表达式引入作用域的概念了ã€?/p> <pre class="programlisting">${pageScope.username}<br /><br />${requestScope.username}<br /></pre> <p>我们可以直接讉K—®13-04˜q™ä¸ªåº”用åQŒçœ‹çœ‹el表达式支持的所有对象ã€?/p> <div id="wmqeeuq" class="mediaobject"> <img src="http://www.family168.com/tutorial/jsp/shared/images/jsp-ch-13-02-scope-02.png" alt="" align="middle" /> </div> <p>下面我们分别å¯Òޝä¸ªä½œç”¨åŸŸå¯¹è±¡˜q›è¡Œè®²è§£ã€?/p> <div id="wmqeeuq" class="table"> <a name="d4e1749"> </a> <p class="title"> <strong>表Â?3.1. el中的作用åŸ?/strong> </p> <div id="wmqeeuq" class="table-contents"> <table summary="el中的作用åŸ? border="1"> <colgroup span="1"> <col span="1" /> <col span="1" /> </colgroup> <thead> <tr> <th align="center">el中的作用åŸ?/th> <th align="center">对应关系</th> </tr> </thead> <tbody> <tr> <td align="center">pageContext<a name="co-jsp-ch-13-02-01"></a>(1)</td> <td align="center">当前™å늚„pageContext对象</td> </tr> <tr> <td align="center">pageScope</td> <td align="center">把page作用域中的数据映ž®„äØ“ä¸€ä¸ªmap对象</td> </tr> <tr> <td align="center">requestScope<a name="co-jsp-ch-13-02-02"></a>(2)</td> <td align="center">把request作用域中的数据映ž®„äØ“ä¸€ä¸ªmap对象</td> </tr> <tr> <td align="center">sessionScope</td> <td align="center">把session作用域中的数据映ž®„äØ“ä¸€ä¸ªmap对象</td> </tr> <tr> <td align="center">applicationScope</td> <td align="center">把application作用域中的数据映ž®„äØ“ä¸€ä¸ªmap对象</td> </tr> <tr> <td align="center">param</td> <td align="center">对应request.getParameter()</td> </tr> <tr> <td align="center">paramValues<a name="co-jsp-ch-13-02-03"></a>(3)</td> <td align="center">对应request.getParameterValues()</td> </tr> <tr> <td align="center">header<a name="co-jsp-ch-13-02-04"></a>(4)</td> <td align="center">对应request.getHeader()</td> </tr> <tr> <td align="center">headerValues</td> <td align="center">对应request.getHeaderValues()</td> </tr> <tr> <td align="center">cookie<a name="co-jsp-ch-13-02-05"></a>(5)</td> <td align="center">对应request.getCookies()</td> </tr> <tr> <td align="center">initParam<a name="co-jsp-ch-13-02-06"></a>(6)</td> <td align="center">对应ServletContext.getInitParamter()</td> </tr> </tbody> </table> </div> </div> <p> <br class="table-break" /> </p> <div id="wmqeeuq" class="calloutlist"> <table summary="Callout list" border="0"> <tbody> <tr> <td align="left" valign="top" width="5%"> <p> <a > <span style="color: rgb(16, 138, 198);">(1)</span> </a> </p> </td> <td align="left" valign="top"> <p>例子中的${pageContext.request.contextPath}˜q”回的是request.getContextPath()çš„å€û|¼Œåœ¨æ­¤ä¾‹ä¸­ž®±æ˜¯/13-04åQŒæˆ‘ä»¬ç»å¸æ€‹É用这个来拼接jsp中的¾lå¯¹è·¯å¾„ã€?/p> <p>˜q™é‡Œçš?{pageContext.request.contextPath}是一¿Uç‰¹ŒDŠç”¨æ³•,不能使用${request.contextPath}çš„åŞ式替代ã€?/p> </td> </tr> <tr> <td align="left" valign="top" width="5%"> <p> <a > <span style="color: rgb(16, 138, 198);">(2)</span> </a> </p> </td> <td align="left" valign="top"> <p>pageScope, requestScope, sessionScope, appliationScope都可以看作是Map型变量,调用其中的数据可以ä‹Éç”?{pageScope.name} æˆ?{pageScope["name"]}çš„åŞ式,˜q™ä¸¤¿Uå†™æ³•是½{‰ä­hçš„ã€?/p> <p>在某些情况下只能使用${pageScope["content-type"]}åQŒè¿™é‡Œä¸èƒ½å†™æˆ?{pageScope.content-type}åQŒjsp无法解析˜qžå­—½W¦ï¼ˆ-åQ‰ä¼šå‡ºçŽ°é”™è¯¯ã€?/p> </td> </tr> <tr> <td align="left" valign="top" width="5%"> <p> <a > <span style="color: rgb(16, 138, 198);">(3)</span> </a> </p> </td> <td align="left" valign="top"> <p>需要注意的æ˜?{paramValues.name}得到的是一个字½W¦ä¸²æ•°ç»„åQŒå¦‚果需要获得其中某个å€û|¼Œ˜q˜éœ€è¦ä‹Éç”?{paramValues.name[0]}指定数组中的索引ã€?/p> <p>˜q™ä¸Žä¸‹é¢çš?{headerValues.name}是相似的ã€?/p> </td> </tr> <tr> <td align="left" valign="top" width="5%"> <p> <a > <span style="color: rgb(16, 138, 198);">(4)</span> </a> </p> </td> <td align="left" valign="top"> <p>${header.name}会取得httpè¯äh±‚中的header参数åQŒçŽ°å®žå·¥ä½œä¸­å¾ˆå°‘ç”¨åˆ°˜q™é‡Œçš„æ•°æ®ã€?/p> <p>例子中ä‹É用Host是指è¯äh±‚讉K—®çš„主机地址åQŒåŒ…括ip和端口号。而Referer比较有趣åQŒå¦‚果用户通过­‘…链接蟩转过来的åQŒReferer会保存上‹Æ¡è®¿é—®é¡µé¢çš„地址åQŒæˆ‘们就可以通过它来¾lŸè®¡å“ªäº›ç”¨æˆ·æ˜¯ä»Žå“ªé‡Œè½¬æ¥çš„了ã€?/p> </td> </tr> <tr> <td align="left" valign="top" width="5%"> <p> <a > <span style="color: rgb(16, 138, 198);">(5)</span> </a> </p> </td> <td align="left" valign="top"> <p>${cookie.name}ž®†èŽ·å¾—å¯¹åº”cookie的对象,比如我们用jspž®†ä¸€ŒDµcookie发送给客户端ã€?/p> <pre class="programlisting">Cookie cookie = <span id="wmqeeuq" class="hl-keyword">new</span> Cookie(<span id="wmqeeuq" class="hl-string">"username"</span>, <span id="wmqeeuq" class="hl-string">"Username in cookie"</span>);<br />response.addCookie(cookie);<br /></pre> <p>创徏一个名¿UîCØ“usernameåQŒå€égØ“"Username in cookie"çš„Cookie对象åQŒç„¶åŽå‘送给客户端ã€?/p> <p>然后我们ž®±å¯ä»¥ä‹Éç”?{cookie.username}获得˜q™ä¸ªcookie了,${cookie.username.name}获得cookie名称åQ?{cookie.username.value}获得cookie倹{€?/p> </td> </tr> <tr> <td align="left" valign="top" width="5%"> <p> <a > <span style="color: rgb(16, 138, 198);">(6)</span> </a> </p> </td> <td align="left" valign="top"> <p>ServletContext.getInitParamter()指的应用的初始变量,˜q™äº›å˜é‡éƒ½æ˜¯å®šä¹‰åœ¨web.xml中的ã€?/p> <pre class="programlisting"><<strong class="hl-tag" style="color: blue;">context-param</strong>><br /> <<strong class="hl-tag" style="color: blue;">param-name</strong>>username<<strong class="hl-tag" style="color: blue;">/param-name</strong>><br /> <<strong class="hl-tag" style="color: blue;">param-value</strong>>username with context param<<strong class="hl-tag" style="color: blue;">/param-value</strong>><br /><<strong class="hl-tag" style="color: blue;">/context-param</strong>><br /></pre> <p>${initParam.username}ž®×ƒ¼šå¾—到˜q™é‡Œçš„变量倹{€?/p> </td> </tr> </tbody> </table> </div> <p>以上都是死记¼‹¬èƒŒçš„ä¸œè¥¿ï¼Œå»ø™®®å®žé™…用到的时候翻看一下就好了åQŒæ¼”½CÞZ»£ç éƒ½æ”‘Öœ¨13-04下,ä¸ÞZº†èŽ·å¾—paramå’Œcookie˜q˜è¦ç‚¹å‡»ä¸€ä¸‹æœ€ä¸‹è¾¹çš„连接才可以ã€?/p> <div id="wmqeeuq" class="titlepage" lang="zh-cn"> <div> <div> <h2 class="title" style="clear: both;"> <a name="jsp-ch-13-03"> </a>˜qç®—½W?/h2> </div> </div> </div> <p class="sect1" lang="zh-cn">el表达式中支持java中所有的操作½W¦ï¼Œòq¶ä¸”˜q˜æœ‰ä¸€äº›æ‰©å±•,下面我们½Ž€è¦åšä¸€ä¸‹å¯¹ç…§ã€?/p> <div id="wmqeeuq" class="table" lang="zh-cn"> <a name="d4e1824"> </a> <p class="title"> <strong>表Â?3.2. 加减乘除四则˜qç®—</strong> </p> <div id="wmqeeuq" class="table-contents"> <table summary="加减乘除四则˜qç®—" border="1"> <colgroup span="1"> <col span="1" /> <col span="1" /> </colgroup> <thead> <tr> <th align="center">½W¦å·</th> <th align="center">说明</th> </tr> </thead> <tbody> <tr> <td align="center">+</td> <td align="center">åŠ?/td> </tr> <tr> <td align="center">-</td> <td align="center">å‡?/td> </tr> <tr> <td align="center">*</td> <td align="center">ä¹?/td> </tr> <tr> <td align="center">/或div</td> <td align="center">é™?/td> </tr> <tr> <td align="center">%或mod</td> <td align="center">求余</td> </tr> </tbody> </table> </div> </div> <div id="wmqeeuq" class="sect1" lang="zh-cn"> <br class="table-break" /> </div> <div id="wmqeeuq" class="table" lang="zh-cn"> <a name="d4e1849"> </a> <p class="title"> <strong>表Â?3.3. 比较˜qç®—</strong> </p> <div id="wmqeeuq" class="table-contents"> <table summary="比较˜qç®—" border="1"> <colgroup span="1"> <col span="1" /> <col span="1" /> </colgroup> <thead> <tr> <th align="center">½W¦å·</th> <th align="center">说明</th> </tr> </thead> <tbody> <tr> <td align="center">==或eq</td> <td align="center">相等åQˆequalsåQ?/td> </tr> <tr> <td align="center">!=或ne</td> <td align="center">不相½{‰ï¼ˆnot equalsåQ?/td> </tr> <tr> <td align="center"><或lt</td> <td align="center">ž®äºŽåQˆless thanåQ?/td> </tr> <tr> <td align="center">>或gt</td> <td align="center">大于åQˆgreater thanåQ?/td> </tr> <tr> <td align="center"><=或le</td> <td align="center">ž®äºŽ½{‰äºŽåQˆless than or equalsåQ?/td> </tr> <tr> <td align="center">>=或ge</td> <td align="center">大于½{‰äºŽåQˆgreater than or equalsåQ?/td> </tr> </tbody> </table> </div> </div> <div id="wmqeeuq" class="sect1" lang="zh-cn"> <br class="table-break" /> </div> <div id="wmqeeuq" class="table" lang="zh-cn"> <a name="d4e1877"> </a> <p class="title"> <strong>表Â?3.4. 逻辑˜qç®—</strong> </p> <div id="wmqeeuq" class="table-contents"> <table summary="逻辑˜qç®—" border="1"> <colgroup span="1"> <col span="1" /> <col span="1" /> </colgroup> <thead> <tr> <th align="center">½W¦å·</th> <th align="center">说明</th> </tr> </thead> <tbody> <tr> <td align="center">&&或and</td> <td align="center">逻辑å’?/td> </tr> <tr> <td align="center">||或or</td> <td align="center">逻辑æˆ?/td> </tr> <tr> <td align="center">!或not</td> <td align="center">取反</td> </tr> </tbody> </table> </div> </div> <div id="wmqeeuq" class="sect1" lang="zh-cn"> <br class="table-break" /> </div> <div id="wmqeeuq" class="table" lang="zh-cn"> <a name="d4e1896"> </a> <p class="title"> <strong>表Â?3.5. ç‰ÒŽ®Š˜qç®—</strong> </p> <div id="wmqeeuq" class="table-contents"> <table summary="ç‰ÒŽ®Š˜qç®—" border="1"> <colgroup span="1"> <col span="1" /> <col span="1" /> </colgroup> <thead> <tr> <th align="center">½W¦å·</th> <th align="center">说明</th> </tr> </thead> <tbody> <tr> <td align="center">empty</td> <td align="center">是否为null或空字符ä¸?/td> </tr> <tr> <td align="center">? :</td> <td align="center">三元˜qç®—½W?/td> </tr> </tbody> </table> </div> </div> <div id="wmqeeuq" class="sect1" lang="zh-cn"> <br class="table-break" /> </div> <p class="sect1" lang="zh-cn">下面上所有运½Ž—符的显½Cºç»“果,™åÞZ¾¿è¯´ä¸€ä¸‹å¦‚果想在jsp中显½C?{name}而不让jsp把它当作el计算出来åQŒå¯ä»¥å†™æˆ\${name}åQŒè¿™æ ähœ€åŽæ˜¾½Cºçš„¾l“æžœž®±æ˜¯${name}了ã€?/p> <img class="magplus" title="点击查看原始大小囄¡‰‡" src="http://www.family168.com/tutorial/jsp/shared/images/jsp-ch-13-03-operator-01.png" alt="" align="middle" height="338" width="700" /> <img src ="http://www.aygfsteel.com/kxbin/aggbug/297763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/kxbin/" target="_blank">kxbin</a> 2009-10-11 11:56 <a href="http://www.aygfsteel.com/kxbin/articles/297763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>getAttributeå’ŒgetParameter的区åˆ?http://www.aygfsteel.com/kxbin/articles/kxbin.htmlkxbinkxbinSat, 10 Oct 2009 08:24:00 GMThttp://www.aygfsteel.com/kxbin/articles/kxbin.htmlhttp://www.aygfsteel.com/kxbin/comments/297697.htmlhttp://www.aygfsteel.com/kxbin/articles/kxbin.html#Feedback0http://www.aygfsteel.com/kxbin/comments/commentRss/297697.htmlhttp://www.aygfsteel.com/kxbin/services/trackbacks/297697.html JSP中getParameter与getAttribute有何区别åQ?br />
——getParameter得到的都是String¾cÕdž‹çš„。或者是http://a.jsp?id=123中的123åQŒæˆ–者是某个表单提交˜q‡åŽ»çš„æ•°æ®ã€?br /> ——getAttribute则可以是对象ã€?br /> ——getParameter()是获取POST/GET传递的参数å€û|¼›
——getAttribute()是获取对象容器中的数据å€û|¼›
——getParameteråQšç”¨äºŽå®¢æˆïL«¯é‡å®šå‘æ—¶åQŒå³ç‚¹å‡»äº†é“¾æŽ¥æˆ–提交按扭时传值用åQŒå³ç”¨äºŽåœ¨ç”¨è¡¨å•或url重定向传值时接收数据用ã€?br /> ——getAttributeåQšç”¨äºŽæœåŠ¡å™¨ç«¯é‡å®šå‘æ—Óž¼Œå›_œ¨sevlet中ä‹É用了forward函数,或struts中ä‹É用了mapping.findForward。getAttribute只能收到½E‹åºç”¨setAttribute传过来的倹{€?br /> ——getParameter()是获取POST/GET传递的参数å€û|¼›
——getAttribute()是获取SESSIONçš„å€û|¼›
另外åQŒå¯ä»¥ç”¨setAttribute,getAttribute发送接收对è±?而getParameter昄¡„¶åªèƒ½ä¼ å­—½W¦ä¸²ã€?br /> setAttribute 是应用服务器把这个对象放在该™åµé¢æ‰€å¯¹åº”的一块内存中去,当你的页面服务器重定向到另一个页面时åQŒåº”用服务器会把˜q™å—内存拯‚´å¦ä¸€ä¸ªé¡µé¢æ‰€å¯¹åº”的内存中。这样getAttributež®Þpƒ½å–得你所设下的å€û|¼Œå½“ç„¶˜q™ç§æ–ÒŽ³•可以传对象。sessionä¹Ÿä¸€æ øP¼Œåªæ˜¯å¯¹è±¡åœ¨å†…存中的生命周期不一栯‚€Œå·²ã€?br /> getParameter只是应用服务器在分析你送上来的request™åµé¢çš„æ–‡æœ¬æ—¶åQŒå–得你讑֜¨è¡¨å•或url重定向时的倹{€?br />
getParameter   ˜q”回的是String,   用于è¯Õd–提交的表单中的å€?       
getAttribute   ˜q”回的是ObjectåQŒéœ€˜q›è¡Œè½¬æ¢,可用setAttribute讄¡½®æˆä“Q意对象,使用很灵‹z»ï¼Œå¯éšæ—¶ç”¨åQ?br />


]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÈÕ¿¦ÔòÊÐ| ÎÞ¼«ÏØ| Àè³ÇÏØ| Áú¿ÚÊÐ| ³£ÄþÊÐ| ÑôÎ÷ÏØ| ÈýÃÅÏ¿ÊÐ| ºÏË®ÏØ| ±õº£ÏØ| ±¨¼Û| äÀ´¨ÏØ| ÄþÎäÏØ| ͨ»¯ÏØ| ¾¸½­ÊÐ| ÈÕÕÕÊÐ| °ÍÄÏÇø| ºÍÕþÏØ| ɯ³µÏØ| ³¤ÎäÏØ| ´ó¸ÛÇø| äü¹ØÏØ| ºÚË®ÏØ| ãòË®ÏØ| Í©°ØÏØ| ÔóÖÝÏØ| ÓàÇìÏØ| ºÓ³ØÊÐ| Â«ÏªÏØ| ºÚÁú½­Ê¡| ÉñÄ¾ÏØ| ¯»ôÏØ| ÁÙ°²ÊÐ| Ïã¸ñÀïÀ­ÏØ| ·ðѧ| ¸ßÌ¨ÏØ| ºþ±±Ê¡| Î÷²Ø| ±±°²ÊÐ| ±ö´¨ÏØ| °ÔÖÝÊÐ| ±¦ÇåÏØ|