??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲日本一区二区一本一道,最新亚洲人成无码网www电影,亚洲人成无码网站http://www.tkk7.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.tkk7.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.tkk7.com/kxbin/articles/372390.html</guid><wfw:comment>http://www.tkk7.com/kxbin/comments/372390.html</wfw:comment><comments>http://www.tkk7.com/kxbin/articles/372390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kxbin/comments/commentRss/372390.html</wfw:commentRss><trackback:ping>http://www.tkk7.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="0m6awoe" 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 />多׃行提CZ?例如:<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.tkk7.com/kxbin/aggbug/372390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kxbin/" target="_blank">kxbin</a> 2012-03-21 18:00 <a href="http://www.tkk7.com/kxbin/articles/372390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>html中area标签使用 http://www.tkk7.com/kxbin/articles/369640.htmlkxbinkxbinThu, 09 Feb 2012 02:24:00 GMThttp://www.tkk7.com/kxbin/articles/369640.htmlhttp://www.tkk7.com/kxbin/comments/369640.htmlhttp://www.tkk7.com/kxbin/articles/369640.html#Feedback0http://www.tkk7.com/kxbin/comments/commentRss/369640.htmlhttp://www.tkk7.com/kxbin/services/trackbacks/369640.html
<html>
<body>
 <p>Ld像上的星球,把它们放大?/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>


kxbin 2012-02-09 10:24 发表评论
]]>
web.xml中Servlet Filter的调用顺?转蝲)http://www.tkk7.com/kxbin/articles/367378.htmlkxbinkxbinWed, 28 Dec 2011 00:58:00 GMThttp://www.tkk7.com/kxbin/articles/367378.htmlhttp://www.tkk7.com/kxbin/comments/367378.htmlhttp://www.tkk7.com/kxbin/articles/367378.html#Feedback0http://www.tkk7.com/kxbin/comments/commentRss/367378.htmlhttp://www.tkk7.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ƈ分配需要其处理的urlQ如下:
<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> 
当某个urlh匚w了多个FilterӞ应用服务器将多个Filterl织成FilterChainQ这个链的执行顺序是由其<filter-mapping>元素在web.xml文g中的序军_的?br />doFilter函数可以qoh或者响应,当其qo完请求后调用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> 
    对于不同的应用服务器QFilter的init函数的执行时间是不同的,例如Qtomcat会在tomcat启动的时候执行init函数Q而weblogic{一些其他的应用服务器则会在该Filter匚w的url被首ơ请求的时候加载?br />Q下面的部分是我通过实验猜想的,不一定正。) 
    对于tomcat而言Qtomcat启动时会解析web.xml文gQ然后按?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当有两个元素时QA在B的前面,当再加入20个元素的时候A׃一定在B的前面了Q,所以init函数的执行顺序是无法保证的?/div>


kxbin 2011-12-28 08:58 发表评论
]]>
|站用户单点dpȝ解决Ҏ(?http://www.tkk7.com/kxbin/articles/367377.htmlkxbinkxbinWed, 28 Dec 2011 00:53:00 GMThttp://www.tkk7.com/kxbin/articles/367377.htmlhttp://www.tkk7.com/kxbin/comments/367377.htmlhttp://www.tkk7.com/kxbin/articles/367377.html#Feedback0http://www.tkk7.com/kxbin/comments/commentRss/367377.htmlhttp://www.tkk7.com/kxbin/services/trackbacks/367377.html
|站用户单点dpȝ解决Ҏ

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间实现单点dQ我们要考虑以下的问题:

  • 单点dpȝ的实现在各应用系l都采用B/S模式q一前提下进行?/li>
  • 需要在各应用系l间l一用户认证标志Q用L录后可以得到用户令牌Q各应用pȝ认可l一的用户o牌?/li>
  • 用户令牌应当是安全加密的Qƈ且要限定时效期?/li>
  • ׃每个应用pȝ都有自己的用户库Q一个用户可能在不同的应用系l中使用不同的̎P因此每个要用多个应用系l的用户要设|一个统一的用戯̎号ƈ以此账号q行单点dQ该账号与该用户在各应用pȝ中的一个̎号Ş成映关pR?/li>
  • 各应用系l可能属于不同的域,因此要实现跨域的单点d?/li>
  • 已经上线q行的应用系l需要进行改造来支持单点dQ正在开发的应用pȝ则可以在开发阶D增加对单点d的支持,但应用系l之间应该是松耦合?/li>
  • ׃各应用系l往往都已l处于稳定运行期Q单点登录系l的实现应该对各应用pȝ的登录认证体pdL,各应用系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、单点登录服务器查到用户已经单点dQ如果用h有单点登录则要求用户dQ登录标志存储ؓ客户端浏览器的CookieQ,扑ֈ该用户在相应应用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服务器上dq,W二步到W四布对用户来说是透明的,用户感觉只是向应用系l发Z讉KhQ然后得C面反馈?/p>


4 实现

(?

5 ȝ

  本方案设计的用户单点dpȝ做到了:

  • 真正了实现单点登录、全|访问,方便用户的用过E?/li>
  • 各系l之间耦合度低Q应用系l的攚w不破坏其固有流E和l构Q整个系l的实施q程安全qx?/li>
  • l一了单点登录服务器到应用服务器的用戯证信息访问标准,l一了o牌安全加密的传输和识别标准,为将来更多应用系l提供了l一的单点登录框架?/li>
  • 整合了过d散在各应用系l中虽然有内在关联却难以判别的用户信息资源,为更q一步的用户个性化服务打下了基?/li>


kxbin 2011-12-28 08:53 发表评论
]]>
org.hibernate.exception.GenericJDBCException: Cannot release connectionQ{Q?/title><link>http://www.tkk7.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.tkk7.com/kxbin/articles/365940.html</guid><wfw:comment>http://www.tkk7.com/kxbin/comments/365940.html</wfw:comment><comments>http://www.tkk7.com/kxbin/articles/365940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kxbin/comments/commentRss/365940.html</wfw:commentRss><trackback:ping>http://www.tkk7.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="miok0os" 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,讉Kpȝ会出现如下错误,再次讉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则它会自动转换成可利用的连接。默认的时旉?00U?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行验证QThis 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.tkk7.com/kxbin/aggbug/365940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kxbin/" target="_blank">kxbin</a> 2011-12-09 09:01 <a href="http://www.tkk7.com/kxbin/articles/365940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>beanutils,StringUtils{工具包的学?/title><link>http://www.tkk7.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.tkk7.com/kxbin/articles/365373.html</guid><wfw:comment>http://www.tkk7.com/kxbin/comments/365373.html</wfw:comment><comments>http://www.tkk7.com/kxbin/articles/365373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kxbin/comments/commentRss/365373.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/kxbin/services/trackbacks/365373.html</trackback:ping><description><![CDATA[1.beanutils<br />2.StringUtils<img src ="http://www.tkk7.com/kxbin/aggbug/365373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kxbin/" target="_blank">kxbin</a> 2011-12-02 14:11 <a href="http://www.tkk7.com/kxbin/articles/365373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>saveToken介绍一http://www.tkk7.com/kxbin/articles/365348.htmlkxbinkxbinFri, 02 Dec 2011 01:32:00 GMThttp://www.tkk7.com/kxbin/articles/365348.htmlhttp://www.tkk7.com/kxbin/comments/365348.htmlhttp://www.tkk7.com/kxbin/articles/365348.html#Feedback0http://www.tkk7.com/kxbin/comments/commentRss/365348.htmlhttp://www.tkk7.com/kxbin/services/trackbacks/365348.html
1》防止多ơ点?#8220;提交”,让多?#8220;提交”变成只一?#8220;提交”
saveToken(rquest)
的目的是面上的按钮只相应一ơ,比如_在页面上有个新增按钮Q如果你q箋点击数次Q后台程序可能会响应nơ,加了q句话,在页?/div>
上自动生成一个hidden变量
2》防止页面重复提?/div>
利用同步令牌QTokenQ机制来解决Web应用中重复提交的问题QStruts也给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");
 }


kxbin 2011-12-02 09:32 发表评论
]]>saveToken介绍?/title><link>http://www.tkk7.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.tkk7.com/kxbin/articles/365349.html</guid><wfw:comment>http://www.tkk7.com/kxbin/comments/365349.html</wfw:comment><comments>http://www.tkk7.com/kxbin/articles/365349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kxbin/comments/commentRss/365349.html</wfw:commentRss><trackback:ping>http://www.tkk7.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"">Qo牌)机制能够很好的解册单重复提交的问题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中的令牌值如何保存,其实和我们qx在页面中保存一些信息是一LQ通过隐藏字段来保存,保存的Ş式如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"">cM?/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,所以这cL作控制的意义不是很大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表CZ码执行到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,cM于这栗?/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.tkk7.com/kxbin/aggbug/365349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kxbin/" target="_blank">kxbin</a> 2011-12-02 09:32 <a href="http://www.tkk7.com/kxbin/articles/365349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用q接池连接MySQLhttp://www.tkk7.com/kxbin/articles/325296.htmlkxbinkxbinMon, 05 Jul 2010 08:15:00 GMThttp://www.tkk7.com/kxbin/articles/325296.htmlhttp://www.tkk7.com/kxbin/comments/325296.htmlhttp://www.tkk7.com/kxbin/articles/325296.html#Feedback0http://www.tkk7.com/kxbin/comments/commentRss/325296.htmlhttp://www.tkk7.com/kxbin/services/trackbacks/325296.html下面我把配置q程分成三个步骤来完成:
W一步:在你安装TomCat的目录下扑ֈcontext.xml配置文g。(例如QD:\Tomcat 6.0\conf\context.xmlQ然后打开context.xmlQ在? {?lt;context></<context>之间加入以下内容Q?Z大家Ҏ理解Q我加了较详l的注释)
<Resource
name="jdbc/course" //数据源名Uͼ自定义)到时候要用到的,所以最好v
//个有含义的名字,例如我这个数据源名字Qjdbc表示?/数据库连接有关的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数据库的urlQ其中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配置文gQ然后打开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>
其中QDB 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。(例如QD:\Tomcat 6.0\lib\mysql-connector-java-3.1.10-bin.jarQ完成这三步配|好了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>




kxbin 2010-07-05 16:15 发表评论
]]>
JAVA ~码不可不注意的规范http://www.tkk7.com/kxbin/articles/313444.htmlkxbinkxbinSat, 20 Feb 2010 05:45:00 GMThttp://www.tkk7.com/kxbin/articles/313444.htmlhttp://www.tkk7.com/kxbin/comments/313444.htmlhttp://www.tkk7.com/kxbin/articles/313444.html#Feedback0http://www.tkk7.com/kxbin/comments/commentRss/313444.htmlhttp://www.tkk7.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、标识符cd说明

1、包Q?Package Q的命名

Package 的名字应该采用完整的英文描述W,都是׃个小写单词组成。ƈ且包名的前缀L一个顶U域名,

通常?com、edu、gov、mil、net、org {;
如: com.yjhmily.test

2、类Q?Class Q的命名

cd应该是个一名词Q采用大写混合的方式,每个单词的首字母大写。尽量保证类名简z而富于描q?/p>

使用完整单词Q避免羃写词 ( 除非工程内有l一~写规范或该~写词被更广泛用,?URL Q?HTML)

如: FileDescription

3、接口( Interface Q的命名

基本?Class 的命名规范类伹{在满 Classd 命名规则的基之上Q保证开头第一个字母ؓ ”I”,

便于与普通的 Class区别开。其实现cdU取接口名的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 文gQ必d明版权信息以及该文g的创建时间和作者;

2、类Q类的目的、即cL完成的功能,以及该类创徏的时间和作者名Uͼ多h一ơ编辑或修改同一个类Ӟ

应在作者名U处出现多h的名Uͼ

3、接口: 在满类注释的基之上Q接口注释应该包含设|接口的目的、它应如何被使用以及如何不被使用?/p>

在接口注释清楚的前提下对应的实现cd以不加注释;

4、方法注释: 对于讄 (Set Ҏ ) 与获?(Get Ҏ ) 成员的方法,在成员变量已有说明的情况下,

可以不加注释Q普通成员方法要求说明完成什么功能,参数含义是什么且q回g么;另外Ҏ的创?/p>

旉必须注释清楚Qؓ来的维护和阅读提供宝贵U烦Q?/p>

5、方法内部注释: 控制l构Q代码做了些什么以及ؓ什么这样做Q处理顺序等Q特别是复杂的逻辑处理部分Q?/p>

要尽可能的给l的注释Q?/p>

6、参敎ͼ 参数含义、及其它MU束或前提条Ӟ

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 文gQ?/p>

如: resource.hbm.xml

2、服务层

1、服务接口和实现

服务接口和实现类必须完全W合正常接口和实现类的命名规则;以工E定义的服务名ؓMQ?/p>

q统一?”Serv?l尾
如: IResourceServ( 服务接口 ) ?ResourceServ( 接口实现c?)

2、服务接口方?/p>

Ҏ名是一个动词,采用大小写؜合的方式Q第一个单词的首字母小写,其后单词的首字母大写?/p>

Ҏ名尽可能的描q出该方法的动作行ؓ?/p>

q回cd?Boolean |用?is ”或?has ”来开?br />得到某数据: get+ 数据描述名词复数 + 数据cdQ?br />得到所有数据: get+All+ 数据描述名词复数 + 数据cdQ?br />通过 XXX 得到 / 查询某数据: get/query+ 数据描述名词复数 + 数据cd +By+ 条gQ?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 cdQ功能模块名U?+Action Q?br />Actoin Ҏ名称可能的描述出页面迁Uȝd
如: LoginAction( d?action) Q?toWelcome( 转向Ƣ迎늚 action Ҏ )

2、资源文?/p>

pȝ全局资源文gQ?globalMessages_+ 字符~码cd +.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



kxbin 2010-02-20 13:45 发表评论
]]>
EL表达?/title><link>http://www.tkk7.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.tkk7.com/kxbin/articles/297763.html</guid><wfw:comment>http://www.tkk7.com/kxbin/comments/297763.html</wfw:comment><comments>http://www.tkk7.com/kxbin/articles/297763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/kxbin/comments/commentRss/297763.html</wfw:commentRss><trackback:ping>http://www.tkk7.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="ee0w0cu" 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>我们可以直接讉K13-04q个应用Q看看el表达式支持的所有对象?/p> <div id="oe8s8g0" 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="mk0ayq6" class="table"> <a name="d4e1749"> </a> <p class="title"> <strong>表?3.1. el中的作用?/strong> </p> <div id="0c0kc0g" 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="8000aue" 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-04Q我们经怋用这个来拼接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}Qjsp无法解析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}会取得httph中的header参数Q现实工作中很少用到q里的数据?/p> <p>例子中用Host是指h讉K的主机地址Q包括ip和端口号。而Referer比较有趣Q如果用户通过链接蟩转过来的QReferer会保存上ơ访问页面的地址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一Dcookie发送给客户端?/p> <pre class="programlisting">Cookie cookie = <span id="yo0ise0" class="hl-keyword">new</span> Cookie(<span id="kq8ga8q" class="hl-string">"username"</span>, <span id="08acyai" class="hl-string">"Username in cookie"</span>);<br />response.addCookie(cookie);<br /></pre> <p>创徏一个名UCؓusernameQgؓ"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演CZ码都攑֜13-04下,Z获得param和cookieq要点击一下最下边的连接才可以?/p> <div id="wu88s80" 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="8800umk" class="table" lang="zh-cn"> <a name="d4e1824"> </a> <p class="title"> <strong>表?3.2. 加减乘除四则q算</strong> </p> <div id="8gyk00k" 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="8egk8ge" class="sect1" lang="zh-cn"> <br class="table-break" /> </div> <div id="o88suua" class="table" lang="zh-cn"> <a name="d4e1849"> </a> <p class="title"> <strong>表?3.3. 比较q算</strong> </p> <div id="8os0ksy" 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">相等QequalsQ?/td> </tr> <tr> <td align="center">!=或ne</td> <td align="center">不相{(not equalsQ?/td> </tr> <tr> <td align="center"><或lt</td> <td align="center">于Qless thanQ?/td> </tr> <tr> <td align="center">>或gt</td> <td align="center">大于Qgreater thanQ?/td> </tr> <tr> <td align="center"><=或le</td> <td align="center">于{于Qless than or equalsQ?/td> </tr> <tr> <td align="center">>=或ge</td> <td align="center">大于{于Qgreater than or equalsQ?/td> </tr> </tbody> </table> </div> </div> <div id="su000m0" class="sect1" lang="zh-cn"> <br class="table-break" /> </div> <div id="ecqw0gm" class="table" lang="zh-cn"> <a name="d4e1877"> </a> <p class="title"> <strong>表?3.4. 逻辑q算</strong> </p> <div id="8qsm8ou" 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="kagie00" class="sect1" lang="zh-cn"> <br class="table-break" /> </div> <div id="8k0q0ec" class="table" lang="zh-cn"> <a name="d4e1896"> </a> <p class="title"> <strong>表?3.5. Ҏq算</strong> </p> <div id="ca8qmag" 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="agwg0ye" 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.tkk7.com/kxbin/aggbug/297763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/kxbin/" target="_blank">kxbin</a> 2009-10-11 11:56 <a href="http://www.tkk7.com/kxbin/articles/297763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>getAttribute和getParameter的区?http://www.tkk7.com/kxbin/articles/kxbin.htmlkxbinkxbinSat, 10 Oct 2009 08:24:00 GMThttp://www.tkk7.com/kxbin/articles/kxbin.htmlhttp://www.tkk7.com/kxbin/comments/297697.htmlhttp://www.tkk7.com/kxbin/articles/kxbin.html#Feedback0http://www.tkk7.com/kxbin/comments/commentRss/297697.htmlhttp://www.tkk7.com/kxbin/services/trackbacks/297697.html JSP中getParameter与getAttribute有何区别Q?br />
——getParameter得到的都是Stringcd的。或者是http://a.jsp?id=123中的123Q或者是某个表单提交q去的数据?br /> ——getAttribute则可以是对象?br /> ——getParameter()是获取POST/GET传递的参数|
——getAttribute()是获取对象容器中的数据|
——getParameterQ用于客L重定向时Q即点击了链接或提交按扭时传值用Q即用于在用表单或url重定向传值时接收数据用?br /> ——getAttributeQ用于服务器端重定向Ӟ卛_sevlet中用了forward函数,或struts中用了mapping.findForward。getAttribute只能收到E序用setAttribute传过来的倹{?br /> ——getParameter()是获取POST/GET传递的参数|
——getAttribute()是获取SESSION的|
另外Q可以用setAttribute,getAttribute发送接收对?而getParameter昄只能传字W串?br /> setAttribute 是应用服务器把这个对象放在该面所对应的一块内存中去,当你的页面服务器重定向到另一个页面时Q应用服务器会把q块内存拯另一个页面所对应的内存中。这样getAttributep取得你所设下的|当然q种Ҏ可以传对象。session也一P只是对象在内存中的生命周期不一栯已?br /> getParameter只是应用服务器在分析你送上来的request面的文本时Q取得你讑֜表单或url重定向时的倹{?br />
getParameter   q回的是String,   用于d提交的表单中的?       
getAttribute   q回的是ObjectQ需q行转换,可用setAttribute讄成Q意对象,使用很灵z,可随时用Q?br />


kxbin 2009-10-10 16:24 发表评论
]]>
վ֩ģ壺 aëƬ߹ۿ| AVҹƬ| þþƷƬѹۿ| ƷרWEB | AVɫ߹ۿ| 㽶­| ҹƵ| ŮëƬѲ| ˳ɾƷƵ| ߲91| ŮоƷվѹۿ| ޹Ʒ18þþþþ| ޹˾þ| ͼƬ߹ۿ| һ | һһëƬ| 뾫Ʒ| ޾Ʒվ߹ۿ㶮| ޾ƷƬ߹ۿƷĻ| ޳aavҰĦ| һҹߴ| պaëƬa| 91Ƶ| ձƵһ߹ۿ| ƷվƵ| һ| ѹҹƵ| Ӱ߹ۿ| ҹƬ| ˿wwwѹۿ| һaëһa˽| VƬ߲| һëƬѿa| һ˿wwwѸĻ| ƷŮٸaѾþ| ߹ۿʮ| ˿appַios| 91µַ| δʮ18ֹվ| þһ߹ۿ2020| 91Ʒž߹ۿ|