??xml version="1.0" encoding="utf-8" standalone="yes"?>91亚洲导航深夜福利,亚洲成a人无码av波多野按摩,亚洲国产精品久久网午夜http://www.tkk7.com/zhhp1314520/category/16149.htmlzh-cnFri, 02 Mar 2007 07:43:27 GMTFri, 02 Mar 2007 07:43:27 GMT60事务隔离EJB的?/title><link>http://www.tkk7.com/zhhp1314520/articles/transaction_iso.html</link><dc:creator>捕风</dc:creator><author>捕风</author><pubDate>Mon, 15 Jan 2007 08:01:00 GMT</pubDate><guid>http://www.tkk7.com/zhhp1314520/articles/transaction_iso.html</guid><wfw:comment>http://www.tkk7.com/zhhp1314520/comments/93972.html</wfw:comment><comments>http://www.tkk7.com/zhhp1314520/articles/transaction_iso.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhhp1314520/comments/commentRss/93972.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhhp1314520/services/trackbacks/93972.html</trackback:ping><description><![CDATA[ <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">业务操作的事务性和事务隔离性,?/span> <span lang="EN-US">J2EE</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发中一个非帔R要的功能?/span> <span lang="EN-US"> <br /> </span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比如Q在业务操作中的pȝ日志和权限日志,很好的体现了事务原子性和事务隔离的应用?/span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">q里Q主要讲一下事务隔?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">EJB</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">的用?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold"> <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt -9pt"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold"> Z能在h事务?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">action</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">中调用不允许事务支持的外部系l?/span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">EJB</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">Q如</span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">UMSAO</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">Q增加了事务隔离</span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">EJB</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">?br /></span> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold"> <o:p> </o:p> </span> </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #000000">Facade4IsolateService.java<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />Facade4IsolateServiceEJB.java<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />Facade4IsolateServiceHome.java<br /><img id="Codehighlighter1_150_222_Open_Image" onclick="this.style.display='none'; Codehighlighter1_150_222_Open_Text.style.display='none'; Codehighlighter1_150_222_Closed_Image.style.display='inline'; Codehighlighter1_150_222_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_150_222_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_150_222_Closed_Text.style.display='none'; Codehighlighter1_150_222_Open_Image.style.display='inline'; Codehighlighter1_150_222_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">interface</span> <span style="COLOR: #000000"> Facade4IsolateService </span> <span style="COLOR: #0000ff">extends</span> <span style="COLOR: #000000"> EJBLocalObject?/span> <span id="Codehighlighter1_150_222_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.tkk7.com/images/dot.gif" /> </span> <span id="Codehighlighter1_150_222_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000"> getReadPrivList(List permissionList, List userTypeList);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img id="Codehighlighter1_289_370_Open_Image" onclick="this.style.display='none'; Codehighlighter1_289_370_Open_Text.style.display='none'; Codehighlighter1_289_370_Closed_Image.style.display='inline'; Codehighlighter1_289_370_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_289_370_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_289_370_Closed_Text.style.display='none'; Codehighlighter1_289_370_Open_Image.style.display='inline'; Codehighlighter1_289_370_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000"> Facade4IsolateServiceEJB </span> <span style="COLOR: #0000ff">extends</span> <span style="COLOR: #000000"> PafaSlsSessionBean </span> <span id="Codehighlighter1_289_370_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.tkk7.com/images/dot.gif" /> </span> <span id="Codehighlighter1_289_370_Open_Text"> <span style="COLOR: #000000">{<br /><img id="Codehighlighter1_359_368_Open_Image" onclick="this.style.display='none'; Codehighlighter1_359_368_Open_Text.style.display='none'; Codehighlighter1_359_368_Closed_Image.style.display='inline'; Codehighlighter1_359_368_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_359_368_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_359_368_Closed_Text.style.display='none'; Codehighlighter1_359_368_Open_Image.style.display='inline'; Codehighlighter1_359_368_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000"> getReadPrivList(List permissionList, List userTypeList)</span> <span id="Codehighlighter1_359_368_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.tkk7.com/images/dot.gif" /> </span> <span id="Codehighlighter1_359_368_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        … ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #0000ff">interface</span> <span style="COLOR: #000000"> Facade4IsolateServiceHome </span> <span style="COLOR: #0000ff">extends</span> <span style="COLOR: #000000"> EJBLocalHome<br /><img id="Codehighlighter1_436_501_Open_Image" onclick="this.style.display='none'; Codehighlighter1_436_501_Open_Text.style.display='none'; Codehighlighter1_436_501_Closed_Image.style.display='inline'; Codehighlighter1_436_501_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_436_501_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_436_501_Closed_Text.style.display='none'; Codehighlighter1_436_501_Open_Image.style.display='inline'; Codehighlighter1_436_501_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span> <span id="Codehighlighter1_436_501_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"> <img src="http://www.tkk7.com/images/dot.gif" /> </span> <span id="Codehighlighter1_436_501_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"> Facade4IsolateService create() </span> <span style="COLOR: #0000ff">throws</span> <span style="COLOR: #000000"> CreateException;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </span> </div> <br /> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"> <i style="mso-bidi-font-style: normal"> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">需要在相关文g中配|:</span> </i> <i style="mso-bidi-font-style: normal"> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold"> <o:p> </o:p> </span> </i> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">biz-context.xml<br />"ejb/test/Facade4IsolateService"在weblogic-ejb-jar.xml中配|,必须同名?br /></span> </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">bean </span> <span style="COLOR: #ff0000">id</span> <span style="COLOR: #0000ff">="isolateEJB"</span> <span style="COLOR: #ff0000">        class</span> <span style="COLOR: #0000ff">="com.test.app.lwc.service.remoting.access.ejb.LocalStatelessSessionProxyFactoryBean"</span> <span style="COLOR: #ff0000">     lazy-init</span> <span style="COLOR: #0000ff">="true"</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">property </span> <span style="COLOR: #ff0000">name</span> <span style="COLOR: #0000ff">="jndiName"</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">ejb/test/Facade4IsolateService</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">property</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">property </span> <span style="COLOR: #ff0000">name</span> <span style="COLOR: #0000ff">="businessInterface"</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />                com.test.biz.service.ejb.Facade4IsolateService<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">property</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">property </span> <span style="COLOR: #ff0000">name</span> <span style="COLOR: #0000ff">="jndiTemplate"</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">ref </span> <span style="COLOR: #ff0000">local</span> <span style="COLOR: #0000ff">="jndiTemplate"</span> <span style="COLOR: #ff0000"> </span> <span style="COLOR: #0000ff">/></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">property</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">bean</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </span> </div> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"> <br /> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"> <i style="mso-bidi-font-style: normal"> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">weblogic-ejb-jar.xml<o:p></o:p></span> <br />Facade4IsolateServiceEJB在ejb-jar.xml文g中设|?br /></i> </p> <o:p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">weblogic-enterprise-bean</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">ejb-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">Facade4IsolateServiceEJB</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">ejb-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">stateless-session-descriptor</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">pool</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />                </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">max-beans-in-free-pool</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">500</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">max-beans-in-free-pool</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />                </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">initial-beans-in-free-pool</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">1</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">initial-beans-in-free-pool</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">pool</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">stateless-session-descriptor</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">enable-call-by-reference</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">True</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">enable-call-by-reference</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">local-jndi-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">ejb/test/Facade4IsolateService</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">local-jndi-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">weblogic-enterprise-bean</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </span> </div> <br /> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"> <i style="mso-bidi-font-style: normal"> <span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">ejb-jar.xml<br /></span> </i> </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">session </span> <span style="COLOR: #ff0000">id</span> <span style="COLOR: #0000ff">="Facade4IsolateServiceEJB"</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">ejb-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">Facade4IsolateServiceEJB</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">ejb-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">local-home</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">com.test.biz.service.ejb.Facade4IsolateServiceHome</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">local-home</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">local</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">com.test.biz.service.ejb.Facade4IsolateService</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">local</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">ejb-class</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">com.test.biz.service.ejb.Facade4IsolateServiceEJB</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">ejb-class</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">session-type</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">Stateless</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">session-type</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">transaction-type</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">Container</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">transaction-type</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">env-entry</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />                </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">env-entry-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">ejb/BeanFactoryPath</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">env-entry-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />                </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">env-entry-type</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">java.lang.String</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">env-entry-type</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />                </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">env-entry-value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">biz-context.xml</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">env-entry-value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">env-entry</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">session</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </span> </div> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"> <o:p> </o:p> 讄事务的隔d?/p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">container-transaction</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">method</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />                </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">ejb-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">Facade4IsolateServiceEJB</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">ejb-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />                </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">method-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">*</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">method-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />              </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">method</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />              </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">trans-attribute</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">NotSupported</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">trans-attribute</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">container-transaction</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </span> </div> </o:p> <img src ="http://www.tkk7.com/zhhp1314520/aggbug/93972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhhp1314520/" target="_blank">捕风</a> 2007-01-15 16:01 <a href="http://www.tkk7.com/zhhp1314520/articles/transaction_iso.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>antl合junitq行软g自动试http://www.tkk7.com/zhhp1314520/articles/ant_junit.html捕风捕风Tue, 28 Nov 2006 09:11:00 GMThttp://www.tkk7.com/zhhp1314520/articles/ant_junit.htmlhttp://www.tkk7.com/zhhp1314520/comments/84098.htmlhttp://www.tkk7.com/zhhp1314520/articles/ant_junit.html#Feedback0http://www.tkk7.com/zhhp1314520/comments/commentRss/84098.htmlhttp://www.tkk7.com/zhhp1314520/services/trackbacks/84098.html本文假设读者具备如下知识:

1、熟lantq行java工程~译Q参考本人“ant~译java工程”一文)

2、junit知识Q看看www.junit.org

准备Q?/p>

1、www.junit.org下蝲junit.jar

2、xml.apache.org下蝲xalan.jarQant ?juntreport需要用刎ͼxalan最好版本大?.0Q不然你q要下蝲其他的java库)

把junit.jar、xalan.jar拯?ANT_HOME/lib/下面Qƈ且最好加到系lCLASSPATHQjunit.jar是肯定要的,xalan.jar׃清楚了)?br />

对自qE序djunit试E序Q此处请参考www.junit.org的文档,很简单的?br />

然后在build.xml中添加如下指?很多东西略过Q所以强烈要求读者先完成本h“ant~译java工程”一文)

<!-- 单元试Q需要完成compiled -->

<target name="test" depends="compile">

<junit printsummary="yes">

<!-- 需要的classpath -->

<classpath refid="classpath"/>

<batchtest>

<!-- 单元试文g为所有src目录下的*Test.java文g -->

<fileset dir="${srcDir}"><include name="**/*Test.java"/></fileset>

<!-- 生成格式为xmlQ也可以用plain或者brief -->

<!-- Z么生成xmlQ是Z下一步做report?-->

<formatter type="xml"/>

</batchtest>

</junit>

<!-- 对xml文g生成相应的html文g在reports目录?-->

<!-- 如果指定于web可访问的目录Q就可以使整个项目组看到单元试情况 -->

<junitreport todir="reports">

<fileset dir=".">

<include name="TEST-*.xml"/>

</fileset>

<!-- 带有框架Q可以用noframes选不带框?-->

<report format="frames" todir="reports/html"/>

</junitreport>

</target>

现在q行ant testQ看看reports/下面是不是有了生成的单元试l果的文件了Q?/p>

如果有问题可以用ant -debug test看看问题出在哪里Q?/p>

另外更改源程序,让程序通过试和通不q测试看看生成的l果如何Q?/p>

捕风 2006-11-28 17:11 发表评论
]]>
使用Antq行本地E序(? http://www.tkk7.com/zhhp1314520/articles/ant123.html捕风捕风Tue, 28 Nov 2006 09:09:00 GMThttp://www.tkk7.com/zhhp1314520/articles/ant123.htmlhttp://www.tkk7.com/zhhp1314520/comments/84097.htmlhttp://www.tkk7.com/zhhp1314520/articles/ant123.html#Feedback0http://www.tkk7.com/zhhp1314520/comments/commentRss/84097.htmlhttp://www.tkk7.com/zhhp1314520/services/trackbacks/84097.html阅读全文

捕风 2006-11-28 17:09 发表评论
]]>
Ant+Tomcat自动部vhttp://www.tkk7.com/zhhp1314520/articles/ant_tomcat.html捕风捕风Thu, 23 Nov 2006 00:59:00 GMThttp://www.tkk7.com/zhhp1314520/articles/ant_tomcat.htmlhttp://www.tkk7.com/zhhp1314520/comments/82934.htmlhttp://www.tkk7.com/zhhp1314520/articles/ant_tomcat.html#Feedback0http://www.tkk7.com/zhhp1314520/comments/commentRss/82934.htmlhttp://www.tkk7.com/zhhp1314520/services/trackbacks/82934.html
遇到一个怪问题,百思不得其解:
通过ant depoly可以把msms.war部v到tomcat上。当Ӟ要求q时候webapps下面没有msms目录?br />看tomcat的纪录,加蝲msms.war正常Q网也可以打开?br />
通过ant undeployQ可以把msms卸蝲。Tomcat昄Q?br />Undeploying context [/msms]
正常卸蝲了。问题是Q去看webapps目录下面Q居然有一个msms目录的残骸,里面保留的目录是
WEB-INF\lib
有以下几个文件残留着Q?br />commons-digester.jar
commons-validator.jar
struts.jar

q时候msms目录也无法手工删除,必须停掉tomcat后才能删除?br />
我装的tomcat?.5。不知道是否q有人遇到过q种情况Q我反正是晕了?br />
build.properties文g如下Q?br />tomcat.dir=C:/ApacheGroup/Tomcat5.5
tomcat.webapps=C:/ApacheGroup/Tomcat5.5/webapps
tomcat.manager.url=http://localhost:8080/manager
tomcat.manager.username=admin
tomcat.manager.password=xxxxxxxx

build.xml文g如下Q?br /><?xml version="1.0"?>
<project name="msms" default="compile" basedir=".">
    <!-- Ant Tomcat Task Definition -->
    <taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask">
        <classpath>
            <path location="${tomcat.dir}/server/lib/catalina-ant.jar" />
        </classpath>
    </taskdef>

    <taskdef name="undeploy" classname="org.apache.catalina.ant.UndeployTask">
        <classpath>
            <path location="${tomcat.dir}/server/lib/catalina-ant.jar" />
        </classpath>
    </taskdef>

    <taskdef name="install" classname="org.apache.catalina.ant.InstallTask">
        <classpath>
            <path location="${tomcat.dir}/server/lib/catalina-ant.jar" />
        </classpath>
    </taskdef>

    <taskdef name="reload" classname="org.apache.catalina.ant.ReloadTask">
        <classpath>
            <path location="${tomcat.dir}/server/lib/catalina-ant.jar" />
        </classpath>
    </taskdef>

    <taskdef name="list" classname="org.apache.catalina.ant.ListTask">
        <classpath>
            <path location="${tomcat.dir}/server/lib/catalina-ant.jar" />
        </classpath>
    </taskdef>

    <taskdef name="start" classname="org.apache.catalina.ant.StartTask">
        <classpath>
            <path location="${tomcat.dir}/server/lib/catalina-ant.jar" />
        </classpath>
    </taskdef>

    <taskdef name="stop" classname="org.apache.catalina.ant.StopTask">
        <classpath>
            <path location="${tomcat.dir}/server/lib/catalina-ant.jar" />
        </classpath>
    </taskdef>

    <property name="build" value="build" />
    <property name="dist" value="dist" />
    <property name="src" value="src/java" />
    <property name="test" value="src/test" />
    <property name="war-config" value="src/config" />
    <property name="report" value="report" />
    <property name="lib" value="lib" />
    <property name="web" value="web" />
    <property name="meta" value="meta" />
    <property name="context-path" value="${ant.project.name}" />
    <property file="build.properties" />

    <path id="build.classpath">
        <fileset file="${lib}/*.jar" />
        <fileset dir="${tomcat.dir}/common/lib">
            <include name="*.jar" />
        </fileset>
        <fileset dir="${tomcat.dir}/common/endorsed">
            <include name="*.jar" />
        </fileset>
        <pathelement path="${build}" />
    </path>

    <!-- Hibernate Tool Task Definition -->
    <taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask" classpathref="build.classpath" />
   
    <target name="clean">
        <echo message="Cleaning up the build and dist directories" />
        <delete dir="${build}" />
        <mkdir dir="${build}" />
        <delete dir="${dist}" />
        <mkdir dir="${dist}" />
    </target>

    <target name="copy-resources">
        <copy todir="${build}">
            <fileset dir="${src}">
                <exclude name="**/*.java" />
                <exclude name="**/*.hbm.xml" />
            </fileset>
        </copy>
    </target>

    <target name="compile" depends="copy-resources">
        <javac destdir="${build}" srcdir="${src}:${test}">
            <classpath refid="build.classpath" />
        </javac>
    </target>

    <target name="initdb" depends="compile">
        <hibernatetool destdir="${build}">
            <classpath>
                <path location="${build}" />
            </classpath>
            <annotationconfiguration configurationfile="src/java/hibernate.cfg.xml" />

            <hbm2ddl create="true" />
        </hibernatetool>
    </target>

    <target name="run" depends="compile">
        <java fork="true" classname="cn.ac.rcpa.msms.tools.ProjectManager" classpathref="build.classpath">
            <classpath path="${build}" />
            <arg value="${action}" />
            <arg value="${project}" />
            <arg value="${description}" />
        </java>
    </target>

    <target name="test" depends="compile" description="run junit test">
        <delete dir="${report}" />
        <mkdir dir="${report}" />
        <junit dir="." fork="true" printsummary="on" haltonfailure="false" failureproperty="tests.failed" showoutput="true">
            <classpath refid="build.classpath" />
            <formatter type="brief" />
            <batchtest todir="${report}">
                <fileset dir="${build}">
                    <include name="**/*Test.*" />
                    <include name="**/Test*.*" />
                </fileset>
            </batchtest>
        </junit>
        <fail if="tests.failed">
      ***********************************************************
      **** One or more tests failed! Check the output ... ****
      ***********************************************************
    </fail>
    </target>

    <target name="create-war" depends="clean, compile" description="build release war">
        <echo message="creation the WAR file...${context-path}.war" />
        <war destfile="${dist}/${context-path}.war" webxml="${meta}/web.xml">
            <classes dir="${build}">
                <exclude name="**/*Test.*" />
                <exclude name="**/Test*.*" />
                <exclude name="hibernate.cfg.xml" />
            </classes>
            <lib dir="${lib}" />
            <fileset dir="${web}" />
            <zipfileset dir="${war-config}" prefix="WEB-INF/classes" />
        </war>
        <!--        <scp file="${dist}/${context-path}.war" todir="root:${password}@172.16.1.20:/usr/local/tomcat/webapps" trust="true" /> -->
    </target>

    <target name="deploy" description="Install application in Tomcat">
        <deploy url="${tomcat.manager.url}" username="${tomcat.manager.username}" password="${tomcat.manager.password}" path="/${context-path}" localWar="file:${dist}/${context-path}.war" />
    </target>

    <target name="undeploy" description="Remove application in Tomcat" if="already.deployed">
        <undeploy url="${tomcat.manager.url}" username="${tomcat.manager.username}" password="${tomcat.manager.password}" path="/${context-path}" />
    </target>

    <target name="reload" description="Reload application in Tomcat">
        <reload url="${tomcat.manager.url}" username="${tomcat.manager.username}" password="${tomcat.manager.password}" path="/${context-path}" />
    </target>

    <target name="start" description="Start Tomcat application">
        <start url="${tomcat.manager.url}" username="${tomcat.manager.username}" password="${tomcat.manager.password}" path="/${context-path}" />
    </target>

    <target name="stop" description="Stop Tomcat application">
        <stop url="${tomcat.manager.url}" username="${tomcat.manager.username}" password="${tomcat.manager.password}" path="/${context-path}" />
    </target>

    <target name="list" description="List Tomcat applications">
        <list url="${tomcat.manager.url}" username="${tomcat.manager.username}" password="${tomcat.manager.password}" />
    </target>

    <target name="deploy-application" description="Compile the web application...">
        <echo message="Undeploying the application only if it's deployed..." />
        <available file="${tomcat.webapps}/${context-path}.war" property="already.deployed" />
        <antcall target="undeploy" />
        <antcall target="create-war" />
        <antcall target="deploy" />
    </target>
</project>


只有Windows上才会有的问题,
创徏META-INF目录Q?在目录里新徏context.xmlQ加入如下内?

<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="true" antiResourceLocking="true">
</Context>

昨天的错误至今无法修正,即重装了Tomcat也不行?br />
不过QdeployC台linux服务器上倒都成功了?br />    <taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask">
        <classpath>
            <path location="${tomcat.dir}/server/lib/catalina-ant.jar" />
        </classpath>
    </taskdef>

    <taskdef name="list" classname="org.apache.catalina.ant.ListTask">
        <classpath>
            <path location="${tomcat.dir}/server/lib/catalina-ant.jar" />
        </classpath>
    </taskdef>

    <target name="deploy-web" description="Install application in Local Tomcat">
        <echo message="deploying to web ..." />
        <deploy url="http://172.16.1.20:8080/manager" username="${tomcat.manager.username}" password="${tomcat.manager.password}" path="/${context-path}" war="file:${dist}/${context-path}.war" update="true" />
    </target>

    <target name="list-web">
        <echo message="list web tomcat ..." />
        <list url="http://172.16.1.20:8080/manager" username="${tomcat.manager.username}" password="${tomcat.manager.password}" />
    </target>


q里跟昨天的代码有一点不一P
1、localWarҎ了war?br />原来更新q程服务器的时候,L昄更新成功Q但是到webapps目录下L没有相应的war文gQ通过调用
ant list-web
发现Q有一个context-path是dist/msmsQ而且是stop状态。哦Q原来localWar的意思不是指开发的机器的local pathQ而是指把q个war被写到服务器的什么地斏V改成war正怺?br />
2、不需要判断是否已ldeployq而调用undeploy了,直接通过update="true"更新可以了?br />


捕风 2006-11-23 08:59 发表评论
]]>
Ant基本使用指南http://www.tkk7.com/zhhp1314520/articles/ant_all.html捕风捕风Thu, 23 Nov 2006 00:56:00 GMThttp://www.tkk7.com/zhhp1314520/articles/ant_all.htmlhttp://www.tkk7.com/zhhp1314520/comments/82933.htmlhttp://www.tkk7.com/zhhp1314520/articles/ant_all.html#Feedback0http://www.tkk7.com/zhhp1314520/comments/commentRss/82933.htmlhttp://www.tkk7.com/zhhp1314520/services/trackbacks/82933.html阅读全文

捕风 2006-11-23 08:56 发表评论
]]>
了解AOP(一)http://www.tkk7.com/zhhp1314520/articles/aop1.html捕风捕风Wed, 25 Oct 2006 02:06:00 GMThttp://www.tkk7.com/zhhp1314520/articles/aop1.htmlhttp://www.tkk7.com/zhhp1314520/comments/77133.htmlhttp://www.tkk7.com/zhhp1314520/articles/aop1.html#Feedback0http://www.tkk7.com/zhhp1314520/comments/commentRss/77133.htmlhttp://www.tkk7.com/zhhp1314520/services/trackbacks/77133.html原文:http://www.javaworld.com/javaworld/jw-01-2002/jw-0118-aspect.html

了解AOPQ第一部分Q?-用面向方面的~程方式分离软gx?/span>

摘要

多数软gpȝ都包含几个跨多个模块的x炏V用面向对象技术实现这些关注点会ɾpȝ难以实现Q难以理解,q且不利于Y件的演进。新的AOPQ面向角度的~程ҎQ利用模块化来分Y件中横切多模块的x炏V用AOPQ你可以建立Ҏ设计Q易于理解和l护的系l。此外,AOP可以带来更高的出,更好的质量,更好的扩展性,q篇文章是这个系列里三篇文章中的W一章,介绍AOP的概念和它所解决的问题?

作者:Ramnivas Laddad

一个关注点是一个特定的目的、一块我们感兴趣的的区域。从技术的角度来说Q一个典型的软gpȝ包含一些核心的x点和pȝU的x炏VD个例子来_一个信用卡处理pȝ的核心关注点是借贷/存入处理Q而系l的关注点则是日志Q事务完整性,授权Q安全性及性能问题{,许多x点——我们叫它横切关注点——会在多个模块中出现Q用现有的~程ҎQ横切关注点会横多个模块,l果是ɾpȝ难以设计、理解、实现和演进?

AOPQ面向角度的~程方式Q能够比上述Ҏ更好的分ȝl关注点Q从而提供模块化的横切关注点?

在这文章里——关于AOP的三文章的W一章,我首先会 解释横切x点在一些即使是中等复杂度的软gpȝ中也会引L问题Q接着我会介绍AOP的核心概念ƈ演示AOP是怎样解决横切x炚w题的?

软g~程Ҏ的演q?/span>

在计机U学的早期阶D,开发h员用直接的机器U代码来~程Q不q的是,E序员得p更多旉来考虑一U特定机器的指o集而不是手中需要解决的问题本n。慢慢的我们转而用允许对底层机器做某U抽象的高语言。然后是l构化语aQ我们可以把问题分解成一些必要的q程来完成Q务。但是,随着复杂E度的增加,我们又需要更适合的技术。面向对象的~程方式QOOPQ我们可以把系l看作是一批相互合作的对象。类允许我们把实现细节隐藏在接口下。多态性ؓ相关概念提供公共的行为和接口Qƈ允许特定的组件在无需讉K基础实现的前提下改变特定行ؓ?

~程Ҏ和语a军_了我们和计算Z的方式。每一U新的方法学都提ZU新的分解问题的ҎQ机器码、伪代码、过E和cȝ。每U新的方法学都得从pȝ需求到~程概念的映更加自然。编E方法学的发展让我们可以建立更加复杂的系l,q句话反q来说也对,我们能够建立更加复杂的系l是因ؓq些技术允许我们处理这U复杂度?

现在Q大多数软g目都选择OOP的编E方式。确实,OOP已经表明了它处理一般行为的能力Q但是,我们一会儿会看刎ͼ或许你已l感觉到了)Q?OOP不能很好的处理横多个——经常是不相关的——模块的行ؓQ相比之下,AOP填补了这个空白,它很可能会是~程Ҏ学发展的下一个里E碑?

把系l看作一批关注点

我们可以把一个复杂的pȝ看作是由多个xҎl合实现的,一个典型的pȝ可能会包括几个方面的x点,如业务逻辑Q性能Q数据存储,日志和调试信息,授权Q安全,U程Q错误检查等Q还有开发过E中的关注点Q如易懂Q易l护Q易q查Q易扩展{,图一演示了由不同模块实现的一批关注点l成了一个系l?



?1. 把模块作Z批关注点来实?

 
图二把需求比作一束穿q三镜的光Q我们让需求之光通过x炚w别三镜Q就会区别出每个x点,同样的方法也适用于开发阶D늚x炏V?


?2. x点分? 三棱镜法?

开发h员徏立一个系l以满多个需求,我们可以大致的把q些需求分cMؓ核心模块U需求和pȝU需求。很多系l需求一般来说是怺独立的,但它们一般都会横切许多核心模块。D个例子来_一个典型的企业应用包含许多横切x点,如验证,日志Q资源池Q系l管理,性能及存储管理等Q每一个关注点都牵涉到几个子系l,如存储管理关注点会媄响到所有的有状态业务对象?

让我们来看一个简单,但是具体的例子,考虑一个封装了业务逻辑的类的实现框Ӟ

代码:
public class SomeBusinessClass extends OtherBusinessClass {
    // 核心数据成员

    // 其它数据成员Q日志流Q保证数据完整性的标志位等

    // 重蝲基类的方?

    public void performSomeOperation(OperationInformation info) {
        // 安全性验?

        // 查传入数据是否满_?

        // 锁定对象以保证当其他U程讉K时的数据完整?

        // 查缓存中是否为最C?

        // U录操作开始执行时?

        // 执行核心操作

        // U录操作完成旉

        // l对象解?
    }

    // 一些类似操?

    public void save(PersitanceStorage ps) {
    }

    public void load(PersitanceStorage ps) {
    }
}


在上面的代码中,我们注意C个问题,首先Q其它数据成员不是这个类的核心关注点Q第二,performSomeOperation()的实现做了许多核心操作之外的事,它要处理日志Q验证,U程安全Q协议验证和~存理{一些外围操作,而且q些外围操作同样也会应用于其他类Q第三,save() 和load()执行的持久化操作是否构成q个cȝ核心清楚的?

横切x点的问题

虽然横切x点会跨越多个模块Q但当前的技术們֐于用一l的Ҏ学来处理q种需求,把对应需求的实现限制在一l的I间里。这个一l空间就是核心模块实现Q其他需求的实现被嵌入在q个占统d位的I间Q换句话_需求空间是一个nl空_而实现空间是一l空_q种不匹配导致了p糕的需求到实现的映?

表现
用当前方法学实现横切xҎ不好的,它会带来一些问题,我们可以大致把这些问题分Zc?

  • 代码混ؕQY件系l中的模块可能要同时兼顾几个斚w的需要。D例来_开发者经常要同时考虑业务逻辑Q性能Q同步,日志和安全等问题Q兼֐斚w的需要导致相应关注点的实现元素同时出玎ͼ引v代码混ؕ?
  • 代码分散Q由于横切关注点Q本来就涉及到多个模块,相关实现也就得遍布在q些模块里,如在一个用了数据库的pȝ里,性能问题׃影响所有访问数据库的模块。这D代码分散在各?

l果

混ؕ和分散的代码会在多个斚w影响pȝ的设计和开发:

  • 可读性差Q同时实现几个关注点模糊了不同关注点的实玎ͼ使得x点与其实C间的对应关系不明显?
  • 低出:同时实现几个xҎ开发h员的注意力从主要的{Ud外围x点,D产能降低?
  • 低代码重用率Q由于这U情况下Q一个模块实现多个关注点Q其他需要类似功能的pȝ不能马上使用该模块,q一步降低了产能?
  • 代码质量差:混ؕ的代码掩盖了代码中隐藏的问题。而且Q由于同时要处理多个x点,应该特别注意的关注点得不到应有的x
  • 难以扩展Q狭H的视角和有限的资源L产生仅注意当前关注点的设计。新的需求导致从新实现。由于实C是模块化的,是说实现牵涉到多个模块Qؓ了新需求修改子pȝ可能会带来数据的不一_而且q需相当规模试来保证这些修改不会带来bug?

    当前解决Ҏ

    ׃多数pȝ中都包含横切x点,自然的已lŞ成了一些技术来模块化横切关注点的实玎ͼq些技术包括:混入c,设计模式和面向特定问题域的解x?

    使用混入c,你可以推q关注点的最l实现。基本类包含一个؜入类的实例,允许pȝ的其他部分设|这个实例,举个例子来说Q实C务逻辑的类包含一个؜入的loggerQ系l的其他部分可以讄q个logger已得到合适的日志cdQ比如logger可能被设|ؓ使用文gpȝ或是消息中间?在这U方式下Q虽然日志的具体实现被推q啦Q基本类q是得包含在所有的写日志的点调用日志操作和控制日志信息的代码?

    行ؓ型设计模式,如Visitor和Template模式Q也允许你推q具体实现。但是也像混入cMP操作的控制——调用visitor或template的逻辑——仍然留l了基本c?

    面向特定问题域的解决方式Q如框架和应用服务器Q允许开发者用更模块化的方式处理某些横切关注点。比如EJB(Enterprise JavaBeanQ企业javabean)架构,可以处理安全Q系l管理,性能和容器管理的持久化(container-managed persistenceQ等横切x炏VBean的开发者仅需兛_业务逻辑Q而部|者仅需兛_部v问题Q如bean与数据库的映。但是大多数情况下,开发者还是要了解存储l构。这U方式下Q你用基于XML的映关pLq器来实C数据持久化相关的横切x炏V?

    面向特定问题域的解决方式提供了解决特定问题的专门机制Q它的缺Ҏ对于每一U这L解决方式开发h员都必须重新学习Q另外,׃q种方式是特定问题域相关的,属于特定问题域之外的横切x炚w要特D的对待

    设计师的两难局?/span>

    好的pȝ设计师不仅会考虑当前需求,q会考虑到可能会有的需求以避免到处打补丁。这样就存在一个问题,预知来是很困难的,如果你漏q了来可能会有的横切关注点的需求,你将会需要修Ҏ甚至是重新实现系l的许多部分Q从另一个角度来_太过于关注不一定需要的需求会Dq分设计QoverdesignedQ的Q难以理解的Q臃肿的pȝ。所以系l设计师处在q么一个两隑ֱ面中Q怎么设计是q分设计Q应该宁可设计不是宁可过分设计?

    举个例子来说Q设计师是否应该在系l中包含现在q不需要的日志机制Q如果是的话Q哪里是应该写日志的点?日志应该记录那些信息Q相似的例子q有关于性能的优化问题,我们很少能预先知道瓶颈的所在。常用的Ҏ是徏立系l,profile它,然后Lpȝ以提高性能Q这U方式可能会依照 profiling修改pȝ的很多部分,此外Q随着旉的流逝,׃使用方式的变化,可能q会产生新的瓉Q类库设计师的Q务更困难Q因Z很难设想出所有对cd的用方式?

    总而言之,设计师很N及到pȝ可能需要处理的所有关注点。即使是在已l知道了需求的前提下,某些建立pȝ旉要的l节也可能不能全部得到。整体设计就面着设计不/q分设计的两隑ֱ面?

    AOP基础

    到目前ؓ止的讨论说明模块化横切关注点是有好处的。研Ih员已l尝试了多种Ҏ来实现这个Q务,q些Ҏ有一个共同的主题Q分d注点。AOP是这些方法中的一U,它的目的是清晰的分离xҎ解决以上提到的问题?

    AOPQ从其本质上Ԍ使你可以用一U松散耦合的方式来实现独立的关注点Q然后,l合q些实现来徏立最l系l。用它所建立的系l是使用松散耦合的,模块化实现的横切xҎ搭徏的。与之对照,用OOP建立的系l则是用松散耦合的模块化实现的一般关注点来实现的。在AOPl,q些模块化单元叫斚wQaspectQ,而在OOP中,q些一般关注点的实现单元叫做类?

    AOP包括三个清晰的开发步骤:

    • 斚w分解Q分解需求提取出横切x点和一般关注点。在q一步里Q你把核心模块x点和pȝU的横切x点分d来。就前面所提到的信用卡例子来说Q你可以分解Z个关注点Q核心的信用卡处理,日志和验证?
    • x点实玎ͼ各自独立的实现这些关注点Q还用上面信用卡的例子,你要实现信用卡处理单元,日志单元和验证单元?
    • 斚w的重新组合:在这一步里Q方面集成器通过创徏一个模块单元——方面来指定重组的规则。重l过E——也叫织入或l合——则使用q些信息来构建最l系l,q拿信用卡的那个例子Q你可以指定Q用某种AOP的实现所提供的语aQ每个操作的开始和l束需要纪录,q且每个操作在涉及到业务逻辑之前必须通过验证?




    ?3. AOP 开发的步骤

    AOP与OOP的不同关键在于它处理横切x点的方式Q在AOP中,每个x点的实现都不知道其它xҎ否会‘关注’它Q如信用卡处理模块ƈ不知道其它的x点实现正在ؓ它做日志和验证操作。它展示了一个从OOP转化来的强大的开发范型?

    注意Q一个AOP实现可以借助其它~程范型作ؓ它的基础Q从而原不动的保留其基范型的优炏V例如,AOP可以选择OOP作ؓ它的基础范型Q从而把OOP善于处理一般关注点的好处直接带q来。用q样一U实玎ͼ独立的一般关注点可以使用OOP技术。这像q程型语a是许多OOP语言的基一栗?

    l入举例
    l入器——一个处理器——组装一个个x点(q个q程叫做l入Q。就是说Q它依照提供l它的规则把不同的执行逻辑D|؜~v来?

    Z说明代码l入Q让我们回到信用卡处理的例子Qؓ了简单v见,我们只考虑两个操作Q存入和取出Qƈ且我们假讑ַl有了一个合适的logger.

    来看一下下面的信用卡模块:
    代码:

    public class CreditCardProcessor {
        public void debit(CreditCard card, Currency amount)
           throws InvalidCardException, NotEnoughAmountException,
                  CardExpiredException {
            // 取出逻辑
        }
       
        public void credit(CreditCard card, Currency amount)
            throws InvalidCardException {
            // 存入逻辑

        }
    }


    下面是日志接?
    代码:

    public interface Logger {
        public void log(String message);
    }


    所需l合需要如下织入规则,q里用自然语a来表达(本文的后面会提供q些l入规则的程序版本)Q?
    [list=a]
  • U录每个公共操作的开?
  • U录每个公共操作的结?
  • U录所有公共方法抛出的异常


l入器就会用这些织入规则和x点实现来产生与如下代码有相同效果的代码:

代码:
public class CreditCardProcessorWithLogging {
    Logger _logger;

    public void debit(CreditCard card, Money amount)
        throws InvalidCardException, NotEnoughAmountException,
               CardExpiredException {
        _logger.log("Starting CreditCardProcessor.credit(CreditCard,
Money) "
                    + "Card: " + card + " Amount: " + amount);
        // 取出逻辑
        _logger.log("Completing CreditCardProcessor.credit(CreditCard,
Money) "
                    + "Card: " + card + " Amount: " + amount);
    }
   
    public void credit(CreditCard card, Money amount)
        throws InvalidCardException {
        System.out.println("Debiting");
        _logger.log("Starting CreditCardProcessor.debit(CreditCard,
Money) "
                    + "Card: " + card + " Amount: " + amount);
        // 存入逻辑
        _logger.log("Completing CreditCardProcessor.credit(CreditCard,
Money) "
                    + "Card: " + card + " Amount: " + amount);

    }
}


AOP语言剖析

像其他~程范型的实CPAOP的实现有两部分组成:语言规范和实现。语a规范描述了语a的基单元和语法。语a实现则按照语a规范来验证代码的正确性ƈ把代码{成目标机器的可执行Ş式。这一节,我来解释一下AOPl成部分?

AOP语言规范
从抽象的角度看来Q一UAOP语言要说明下面两个方面:

  • x点的实现Q把每个需求映ؓ代码Q然后,~译器把它翻译成可执行代码,׃x点的实现以指定过E的形式出现Q你可以使用传统语言如CQC++QJava{?
  • l入规则规范Q怎样把独立实现的x点组合v来Ş成最l系l呢Qؓ了这个目的,需要徏立一U语a来指定组合不同的实现单元以Ş成最l系l的规则Q这U指定织入规则的语言可以是实现语a的扩展,也可以是一U完全不同的语言?


AOP语言的实?/span>

AOP的编译器执行两步操作Q?

  1. l装x炏V?
  2. 把组装结果{成可执行代码

AOP实现可以用多U方式实现织入,包括源码到源码的转换。它预处理每个方面的源码产生l入q的源码Q然后把l入q的源码交给基础语言的编译器产生最l可执行代码。比如,使用q种方式Q一个基于Java的AOP实现可以先把不同的方面{化成Java源代码,然后让Java~译器把它{化成字节码。也可以直接在字节码U别执行l入Q毕竟,字节码本w也是一U源码。此外,下面的执行系l——Java虚拟机——也可以是方面认知的Q基于Java的AOP 实现如果使用q种方式的话Q虚拟机可以先装入织入规则,然后对后来装入的c都应用q种规则Q也是_它可以执行just-in-time的方面织入?

AOP的好?/span>

AOP可帮助我们解决上面提到的代码混ؕ和代码分散所带来的问题,它还有一些别的好处:

  • 块化横切x点:AOP用最的耦合处理每个x点,使得即是横切关注点也是模块化的。这L实现产生的系l,其代码的冗余。模块化的实现还使得pȝҎ理解和维?
  • pȝҎ扩展Q由于方面模块根本不知道横切x点,所以很Ҏ通过建立新的斚w加入新的功能Q另外,当你往pȝ中加入新的模块时Q已有的斚w自动的横切进来,使系l的易于扩展
  • 设计军_的迟l定Q还记得设计师的两难局面吗Q用AOP,设计师可以推qؓ来的需求作军_Q因为它可以把这U需求作为独立的斚w很容易的实现?
  • 更好的代码重用性:׃AOP把每个方面实Cؓ独立的模块,模块之间是松散耦合的,举例来说Q你可以用另外一个独立的日志写入器方面(替换当前的)把日志写入数据库Q以满不同的日志写入要求?
    ȝ来说Q松散耦合的实现意味着更好的代码重用性, AOP在ɾpȝ实现松散耦合q一点上比OOP做得更好?


AspectJ:一个Java的AOP实现

AspectJ是一个可免费获得的由施乐公司帕洛阿尔托研I中心(Xerox PARCQ开发Java的AOP实现Q它是一个多功能的面向方面的Java扩展。它使用Java作ؓ单个x点的实现语言Qƈ扩展Java以指定织入规则。这些规则是用切入点QpointcutsQ、联l点Qjoin pointsQ,通知QadviceQ和斚wQaspectQ来说明的。联l点是定义在E序执行q程之间的点Q切入点q来指定联l点的语a构造,通知定义了要在切入点上执行的代码片,而方面则是这些基元素的组合?

另外QAspectJ允许以多U方式用斚w和类建立新的斚wQ你可以引入新的数据成员和方法,或是声明一个新的类来承和实现另外的类或接口?

AspectJ的织入器——AspectJ的编译器——负责把不同的方面组合在一P׃由AspectJ~译器徏立的最l系l是UJava字节码,它可以运行在MW合Java标准的虚拟机上。而且QAspectJq提供了一些工具如调试器和Java IDE集成{,我将会在本系列的W二、三部分详细讲解q些?

下面是我在上面用自然语言描述的日志方面的l入规则的AspectJ实现Q由于我会在第二部分详l介lAspectJQ所以如果你不能透彻的看懂它的话也不必担心。关键是你应该注意到信用卡处理过E本w一炚w不知道日志的事?

代码:

public aspect LogCreditCardProcessorOperations {
    Logger logger = new StdoutLogger();

    pointcut publicOperation():
        execution(public * CreditCardProcessor.*(..));

    pointcut publicOperationCardAmountArgs(CreditCard card,
                                           Money amount):
        publicOperation() && args(card, amount);

    before(CreditCard card, Money amount):
        publicOperationCardAmountArgs(card, amount) {
        logOperation("Starting",
             thisjoin point.getSignature().toString(), card, amount);
    }

    after(CreditCard card, Money amount) returning:
        publicOperationCardAmountArgs(card, amount) {
        logOperation("Completing",
            thisjoin point.getSignature().toString(), card, amount);
    }

    after (CreditCard card, Money amount) throwing (Exception e):
        publicOperationCardAmountArgs(card, amount) {
        logOperation("Exception " + e,
            thisjoin point.getSignature().toString(), card, amount);
    }

    private void logOperation(String status, String operation,
                              CreditCard card, Money amount) {
        logger.log(status + " " + operation +
                   " Card: " + card + " Amount: " + amount);
    }
}




我需要AOP吗?

AOP仅仅是解册计上的缺点吗Q在AOP里,每个x点的实现的ƈ不知道是否有其它x点关注它Q这是AOP和OOP的主要区别,在AOP里,l合的流向是从横切关注点Cx点,而OOP则相反,但是QOOP可以和AOP很好的共存。比如,你可以用一个؜入类来做l合Q既可以用AOP实现Q也可以用OOP实现Q这取决你对AOP的接受程度。在q两U情况下Q实现横切关注点的؜入类实现都无需知道它自己是被用在类中还是被用在斚w中。D个例子来_你可以把一个日志写入器接口用作某些cȝ混入cL是用作一个日志方面。因而,从OOP到AOP是渐q的?

了解AOP

在这文章里Q你看到了横切关pd来的问题Q这些问题的当前解决ҎQ以及这些方法的~点。你也看CAOP是怎样克服q些~点的。AOP的编E方式试图模块化横切x点的实现Q提供了一个更好更快的软g开发方式?

如果你的pȝ中涉及到多个横切x点,你可以考虑q一步了解AOP,它的实现Q它的好处。AOP很可能会是编E方式的下一个里E碑。请l箋x本系列的W二、第三部分?


捕风 2006-10-25 10:06 发表评论
]]>
Spring AOP中文教程http://www.tkk7.com/zhhp1314520/articles/Spring_AOP.html捕风捕风Wed, 25 Oct 2006 02:04:00 GMThttp://www.tkk7.com/zhhp1314520/articles/Spring_AOP.htmlhttp://www.tkk7.com/zhhp1314520/comments/77131.htmlhttp://www.tkk7.com/zhhp1314520/articles/Spring_AOP.html#Feedback0http://www.tkk7.com/zhhp1314520/comments/commentRss/77131.htmlhttp://www.tkk7.com/zhhp1314520/services/trackbacks/77131.htmlq是在网上发现的一关于Spring AOP~程的教E,dq篇文章后,Spring AOP不再难以理解Q因此我把它译成中文Q推荐给Spring AOP的初学者。这是译文的链接?

AOP正在成ؓ软g开发的下一个圣杯。用AOPQ你可以处理aspect的代码注入主E序Q通常ȝ序的主要目的q不在于处理q些aspect。AOP可以防止代码混ؕ?
Z理解AOP如何做到q点Q考虑一下记日志的工作。日志本w不太可能是你开发的ȝ序的主要d。如果能“不可见的”、通用的日志代码注入主E序中,那该多好啊。AOP可以帮助你做到?
Spring framework是很有前途的AOP技术。作ZU非늕性的Q轻型的AOP frameworkQ你无需使用预编译器或其他的元标{,便可以在JavaE序中用它。这意味着开发团队里只需一对付AOP frameworkQ其他hq是象往怸LE?
AOP是很多直觉难以理解的术语的根源。幸q的是,你只要理解三个概念,可以编写AOP模块。这三个概念是:adviceQpointcut?advisor。advice是你惛_别的E序内部不同的地Ҏ入的代码。pointcut定义了需要注入advice的位|,通常是某个特定的cȝ一?publicҎ。advisor是pointcut和advice的装配器Q是advice注入ȝ序中预定义位|的代码?

既然我们知道了需要用advisor向主要代码中注入“不可见的”adviceQ让我们实现一个Spring AOP的例子。在q个例子中,我们实C个before adviceQ这意味着advice的代码在被调用的publicҎ开始前被执行。以下是q个before advice的实C码:

代码:
package com.company.springaop.test;

import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;

public class TestBeforeAdvice implements MethodBeforeAdvice {

  public void before(Method m, Object[] args, Object target)
  throws Throwable {
    System.out.println("Hello world! (by "
        + this.getClass().getName()
        + ")");
  }
}
 


接口MethodBeforeAdvice只有一个方法before需要实玎ͼ它定义了advice的实现。beforeҎq三个参数Q它们提供了相当丰富的信息。参数Method m是advice开始后执行的方法。方法名U可以用作判断是否执行代码的条g。Object[] args是传l被调用的publicҎ的参数数l。当需要记日志Ӟ参数args和被执行Ҏ的名Uͼ都是非常有用的信息。你也可以改变传lm的参敎ͼ但要心使用q个功能Q编写最初主E序的程序员q不知道ȝ序可能会和传入参数的发生冲突。Object target是执行方法m对象的引用?

在下面的BeanImplcMQ每个publicҎ调用前,都会执行adviceQ?

代码:
package com.company.springaop.test;

public class BeanImpl implements Bean {

  public void theMethod() {
    System.out.println(this.getClass().getName()
        + "." + new Exception().getStackTrace()[0].getMethodName()
        + "()"
        + " says HELLO!");
  }
}


cBeanImpl实现了下面的接口BeanQ?

代码:
package com.company.springaop.test;

public interface Bean {
  public void theMethod();
}



虽然不是必须使用接口Q但面向接口而不是面向实现编E是良好的编E实践,Spring也鼓p样做?

pointcut和advice通过配置文g来实玎ͼ因此Q接下来你只需~写L法的Java代码Q?
代码:


package com.company.springaop.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Main {

  public static void main(String[] args) {
    //Read the configuration file
    ApplicationContext ctx
        = new FileSystemXmlApplicationContext("springconfig.xml");

    //Instantiate an object
    Bean x = (Bean) ctx.getBean("bean");

    //Execute the public method of the bean (the test)
    x.theMethod();
  }
}



我们从读入和处理配置文g开始,接下来马上要创徏它。这个配|文件将作ؓ_合E序不同部分的“胶水”。读入和处理配置文g后,我们会得C个创建工厂ctx。Q何一个Spring理的对象都必须通过q个工厂来创建。对象通过工厂创徏后便可正怋用?

仅仅用配|文件便可把E序的每一部分l装h?
代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC  "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
  <!--CONFIG-->
  <bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
      <value>com.company.springaop.test.Bean</value>
    </property>
    <property name="target">
      <ref local="beanTarget"/>
    </property>
    <property name="interceptorNames">
      <list>
        <value>theAdvisor</value>
      </list>
    </property>
  </bean>

  <!--CLASS-->
  <bean id="beanTarget" class="com.company.springaop.test.BeanImpl"/>

  <!--ADVISOR-->
  <!--Note: An advisor assembles pointcut and advice-->
  <bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice">
      <ref local="theBeforeAdvice"/>
    </property>
    <property name="pattern">
      <value>com\.company\.springaop\.test\.Bean\.theMethod</value>
    </property>
  </bean>

  <!--ADVICE-->
  <bean id="theBeforeAdvice" class="com.company.springaop.test.TestBeforeAdvice"/>
</beans>
 


四个bean定义的次序ƈ不重要。我们现在有了一个adviceQ一个包含了正则表达式pointcut的advisorQ一个主E序cd一个配|好的接口,通过工厂ctxQ这个接口返回自己本w实现的一个引用?

BeanImpl和TestBeforeAdvice都是直接配置。我们用一个唯一的ID创徏一个bean元素Qƈ指定了一个实现类。这是全部的工作?

advisor通过Spring framework提供的一个RegexMethodPointcutAdvisorcL实现。我们用advisor的一个属性来指定它所需?advice-bean。第二个属性则用正则表辑ּ定义了pointcutQ确保良好的性能和易L?

最后配|的是beanQ它可以通过一个工厂来创徏。bean的定义看h比实际上要复杂。bean是ProxyFactoryBean的一个实玎ͼ它是Spring framework的一部分。这个bean的行为通过一下的三个属性来定义Q?


  • 属性proxyInterface定义了接口类?
  • 属性target指向本地配置的一个beanQ这个beanq回一个接口的实现?
  • 属性interceptorNames是唯一允许定义一个值列表的属性。这个列表包含所有需要在beanTarget上执行的advisor。注意,advisor列表的次序是非常重要的?


Spring工具

虽然你可以手工修改Ant构徏脚本Q但使用SpringUIQ译注:SpringUI现在是Spring framework的一部分Qƈ改名为spring-ideQ,使用Spring AOP变得很简单,只要点点鼠标卛_。你可以把SpringUI安装成Eclipse的一个plug-in。然后,你只需在你的project上右击鼠标,q择“add Spring Project Nature”。在project属性中Q你可以在“Spring Project”下dSpring配置文g。在~译前把下面的类库加入projectQaopalliance.jarQcommons- logging.jarQjakarta-oro-2.0.7.jar和spring.jar。运行程序时你会看到下面的信息:

... (logging information)
Hello world! (by com.company.springaop.test.TestBeforeAdvice)
com.company.springaop.test.BeanImpl.theMethod() says HELLO!


优点和缺?/span>

Spring比v其他的framework更有优势Q因为除了AOP以外Q它提供了更多别的功能。作Z个轻型frameworkQ它在J2EE 不同的部分都可以发挥作用。因此,即不想使用Spring AOPQ你可能q是想用Spring。另一个优ҎQSpringq不要求开发团队所有的人员都会用它。学习Spring应该从Spring reference的第一开始。读了本文后Q你应该可以更好地理解Spring reference了。Spring唯一的缺Ҏ~Z更多的文档,但它的mailing list是个很好的补充,而且会不断地出现更多的文档?/span>

捕风 2006-10-25 10:04 发表评论
]]>
关于AspectJ 中的pointcut 语法http://www.tkk7.com/zhhp1314520/articles/AspectJ_pointcut.html捕风捕风Thu, 19 Oct 2006 09:28:00 GMThttp://www.tkk7.com/zhhp1314520/articles/AspectJ_pointcut.htmlhttp://www.tkk7.com/zhhp1314520/comments/76225.htmlhttp://www.tkk7.com/zhhp1314520/articles/AspectJ_pointcut.html#Feedback0http://www.tkk7.com/zhhp1314520/comments/commentRss/76225.htmlhttp://www.tkk7.com/zhhp1314520/services/trackbacks/76225.html 关于AspectJ 中的pointcut 语法     q两天忙着看AspectJ in Action Z补一下AOP知识。看了Spring 2.0的规范,其中AOP部分已经基本融合了AspectJQ看来有必要看一看AspectJ了?br />   看了很多AOP的文章了QAOPq两q发展的很慢Q没有什么新意,现在到处都是SOAQSCA了,不过研究了一下,觉得q是很有帮助的。尤其是增加pȝ的契U性和模块的独立性来_很有帮助?br />   当然Q学东西Q基很重要。下面就说说AspectJ中的基本语法Q有兴趣的可以看看AspectJ in Action?br />   先来说说pointcutQ从字面的意思说的是切面的意思。也是横切的时候,会有哪些执行点会被识别。只有先识别了,才能执行相应的Advice?br />   基本的定义如下:
  
   public pointcut accountOperations:call(* Account.*(..))
  
   1.通配W和pointcut 操作W?br />
  •    表示M数量的字W,除了(.)
  •     .. 表示M数量的字W包括Q何数量的(.)
  •        + 描述指定cd的Q何子cL者子接口
    ?/span>java一P提供了一元和二元的条件表达操作符?br />    一元操作符Q?/span>!
     
二元操作W:||?/span>&&
     
优先权同java

      2.
{֐语法

 
cd{֐样式

 
主要的例?
  Account                              cdAccount
   
*Account                             使用Account名称l束的类型,?/span>SavingsAccount?/span>CheckingAccount
   
java.*.Date                         cdDate在Q何直接的java子包中,?/span>java.util.Date?/span>java.sql.Date
   
java..*                                 M?/span>java包或者所有子包中的类型,?/span>java.awt?/span>java.util或?/span>java.awt.event ?/span>java.util.logging
   
javax..*Model+                   所?/span>javax包或者子包中?/span>Modell尾的类型和其所有子c,?/span>TableModel,TreeModel?br />  Q?/span>vector                             所有除?/span>Vector的类?br />  Vector|| Hashtable              Vector或?/span>Hashtablecd
 
java.util.RandomAccess+    实现RandomAccess?/span>List的所有子c?/span>
   && java.util.List+
  
  
Ҏ和构造器{֐模式

  public void Collection.clear()Q?br /> 
在Collection中同L名的clearҎ

  public void Account.debit(float) throws InsufficientBalanceExceptionQ?br />  Account中同L名的debitҎ

  public void Account.set*(*)
 
Account中以set开_q且只有一个参数类型的Ҏ

  public void Account.*()
 
Account中所有的没有参数的public void Ҏ
 
  public * Account.*()
  Account中所有没有参数的public Ҏ

  public * Account.*(..)
 
Account中所有的public Ҏ

  * Account.*(..)
 
Account中的所有方法,包括privateҎ

  !public * Account.*(..)
 
所有的非public Ҏ

   * Account+.*(..)
  
所有的ҎQ包括子cȝҎ

   * java.io.Reader.read(..)
  
所有的readҎ

   * java.io.Reader.read(char[],..)
  
所有以read(char[])开始的ҎQ包括read(char[])和read(char[],int,int)

   * javax..*.add*Listener(EventListener+)
  
命名以add开始,以Listenerl尾的方法,参数中ؓEventListener或子c?br />
   * *.*(..) throws RemoteException
  
抛出RemoteException的所有方?/span>

   构造器Q同上面
   public Account.new()
  
没有参数的构造器Ҏ

    属性签名模?/b>
    同方法一P属性也查不?br />    * Account.*   
    所有的Account属?br />
    !public static * banking..*.*
    所有的非public static 属性,在banking的包或者子包中
   
    3.主要的pointcutscd
  
    分类pointcuts
    遵@特定的语法用于捕h一个种cȝ可用连接点?br />    主要的种c:
  • Ҏ执行Qexecution(MethodSignature)
  • Ҏ调用Qcall(MethodSignature)
  • 构造器执行Qexecution(ConstructorSignature)
  • 构造器调用Qcall(ConstructorSignature)
  • cd始化Qstaticinitialization(TypeSignature)
  • 属性读操作Qget(FieldSignature)
  • 属性写操作Qset(FieldSignature)
  • 例外处理执行Qhandler(TypeSignature)
  • 对象初始化:initialization(ConstructorSignature)
  • 对象预先初始化:preinitialization(ConstructorSignature)
  • Advice执行Qadviceexecution()
   Z控制的pointcuts
   主要包括两种cd的控制流Q?br />   cflow(Pointcut)Q捕h有的q接点在指定的方法执行中Q包括执行方法本w?br />   cflowbelow(Pointcut)Q捕h有的q接点在指定的方法执行中Q除了执行方法本w?br />
   如以下的例子Q?br />   cflow(call(* Account.debit(..))
   所有的debitҎ中的q接点,包括debitҎ本n
   cflowbelow(call(* Account.debit(..))
   所有debitҎ中的q接点,除了debitҎ本n
   cflow(transactedOperations())
   所有由transactedOperations捕获的连接点
   cflowbelow(execution(Account.new(..))
   所有在Account 构造器中执行的q接?br />
   Z词汇l构的连接点
   源代码片断。,如within()和withincode()
   within Q捕获在指定cL者方面中的程序体中的所有连接点Q包括内部类?br />   WithincodeQ用于捕获在构造器或者方法中的所有连接点Q包括在其中的本地类

   执行对象q接?/b>
   匚wthis,和target对象Q作为方法被调用的对象?br />   this(Account)Q所有Account的实例的执行点,匚w所有的q接点,如方法调用,属性设|,当前的执行对象ؓAccountQ或者其子类?br />   target(Account)Q匹配所有的q接点,目标对象为Account或其子类?br />
   必须执行相应的类型,不能使用*,或?.通配W。当前静态方法,不能被匹配?br />
   在within()和this()中的区别Q?br />   一个是E序体,而另一个ؓ对象执行?br />
   参数pointcuts
   用于捕获参数cd的连接点?br />   args(String,..,int)
   args(RemoteException)

   条gpointcuts
   if(System.currentTimeMillis()>triggerTime)


   基本的语法就q些Q不qAspectJ5 已经增加了不语法,主要关于Annotation 的,不过q部分还没有仔细研究Q以后再讲解吧。希望能有所帮助


捕风 2006-10-19 17:28 发表评论
]]>
j2ee应?/title><link>http://www.tkk7.com/zhhp1314520/articles/j2ee_file_rss_search.html</link><dc:creator>捕风</dc:creator><author>捕风</author><pubDate>Fri, 13 Oct 2006 02:08:00 GMT</pubDate><guid>http://www.tkk7.com/zhhp1314520/articles/j2ee_file_rss_search.html</guid><wfw:comment>http://www.tkk7.com/zhhp1314520/comments/74927.html</wfw:comment><comments>http://www.tkk7.com/zhhp1314520/articles/j2ee_file_rss_search.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhhp1314520/comments/commentRss/74927.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhhp1314520/services/trackbacks/74927.html</trackback:ping><description><![CDATA[ <span style="FONT-SIZE: 13px">附加功能 (目录)<br />实现囄上传 (目录)<br />  用户必须能够上传囄Q因此需要文件上传的功能。比较常见的文g上传lg有Commons FileUploadQ?a target="_blank">http://jakarta.apache.org/commons/fileupload/a</a>>Q和COS FileUploadQ?a target="_blank">http://www.servlets.com/cos</a>Q,Spring已经完全集成了这两种lgQ这里我们选择Commons FileUpload?br />  ׃Post一个包含文件上传的Form会以multipart/form-datah发送给服务器,必须明确告诉 DispatcherServlet如何处理MultipartRequest。首先在dispatcher-servlet.xml中声明一?MultipartResolverQ?br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="multipartResolver"</span><span style="COLOR: #ff0000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />       class</span><span style="COLOR: #0000ff">="org.springframework.web.multipart.commons.CommonsMultipartResolver"</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #008000"><!--</span><span style="COLOR: #008000"> 讄上传文g的最大尺ؓ1MB </span><span style="COLOR: #008000">--></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="maxUploadSize"</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000">1048576</span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">></span></div><br /><br />  q样一旦某个Request是一个MultipartRequestQ它׃首先被MultipartResolver处理Q然后再转发相应的Controller?br />  在UploadImageController中,HttpServletRequest转型为MultipartHttpServletRequestQ就能非常方便地得到文g名和文g内容Q?br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_109_445_Open_Image" onclick="this.style.display='none'; Codehighlighter1_109_445_Open_Text.style.display='none'; Codehighlighter1_109_445_Closed_Image.style.display='inline'; Codehighlighter1_109_445_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_109_445_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_109_445_Closed_Text.style.display='none'; Codehighlighter1_109_445_Open_Image.style.display='inline'; Codehighlighter1_109_445_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception </span><span id="Codehighlighter1_109_445_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_109_445_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 转型为MultipartHttpRequestQ?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    MultipartHttpServletRequest multipartRequest </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (MultipartHttpServletRequest) request;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 获得文gQ?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    MultipartFile file </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> multipartRequest.getFile(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">file</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 获得文g名:</span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    String filename </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> file.getOriginalFilename();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 获得输入:</span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    InputStream input </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> file.getInputStream();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 写入文g<img src="http://www.tkk7.com/images/dot.gif" /></span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">}</span></span></div><br /><br />生成~略?(目录)<br />  当用户上传了囄后,必须生成~略图以便用戯快速浏览。我们不需借助W三方YӞJDK标准库就包含了图像处理的API。我们把一张图片按比例~放?20X120大小Q以下是关键代码Q?br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_71_1006_Open_Image" onclick="this.style.display='none'; Codehighlighter1_71_1006_Open_Text.style.display='none'; Codehighlighter1_71_1006_Closed_Image.style.display='inline'; Codehighlighter1_71_1006_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_71_1006_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_71_1006_Closed_Text.style.display='none'; Codehighlighter1_71_1006_Open_Image.style.display='inline'; Codehighlighter1_71_1006_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> createPreviewImage(String srcFile, String destFile) </span><span id="Codehighlighter1_71_1006_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_71_1006_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_81_852_Open_Image" onclick="this.style.display='none'; Codehighlighter1_81_852_Open_Text.style.display='none'; Codehighlighter1_81_852_Closed_Image.style.display='inline'; Codehighlighter1_81_852_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_81_852_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_81_852_Closed_Text.style.display='none'; Codehighlighter1_81_852_Open_Image.style.display='inline'; Codehighlighter1_81_852_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_81_852_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_81_852_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        File fi </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> File(srcFile); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> src</span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        File fo </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> File(destFile); </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> dest</span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        BufferedImage bis </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ImageIO.read(fi);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> w </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> bis.getWidth();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> h </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> bis.getHeight();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000"> scale </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">)w</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">h;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nw </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> IMAGE_SIZE; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> final int IMAGE_SIZE = 120;</span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nh </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (nw </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> h) </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> w;<br /><img id="Codehighlighter1_440_510_Open_Image" onclick="this.style.display='none'; Codehighlighter1_440_510_Open_Text.style.display='none'; Codehighlighter1_440_510_Closed_Image.style.display='inline'; Codehighlighter1_440_510_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_440_510_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_440_510_Closed_Text.style.display='none'; Codehighlighter1_440_510_Open_Image.style.display='inline'; Codehighlighter1_440_510_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">( nh</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">IMAGE_SIZE ) </span><span id="Codehighlighter1_440_510_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_440_510_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            nh </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> IMAGE_SIZE;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />            nw </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (nh </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> w) </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> h;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000"> sx </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">)nw </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> w;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000"> sy </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">)nh </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000"> h;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        transform.setToScale(sx,sy);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        AffineTransformOp ato </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> AffineTransformOp(transform, </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        BufferedImage bid </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> BufferedImage(nw, nh, BufferedImage.TYPE_3BYTE_BGR);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        ato.filter(bis,bid);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        ImageIO.write(bid, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">jpeg</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, fo);<br /><img id="Codehighlighter1_873_1004_Open_Image" onclick="this.style.display='none'; Codehighlighter1_873_1004_Open_Text.style.display='none'; Codehighlighter1_873_1004_Closed_Image.style.display='inline'; Codehighlighter1_873_1004_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_873_1004_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_873_1004_Closed_Text.style.display='none'; Codehighlighter1_873_1004_Open_Image.style.display='inline'; Codehighlighter1_873_1004_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    }</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">(Exception e) </span><span id="Codehighlighter1_873_1004_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_873_1004_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        e.printStackTrace();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> RuntimeException(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Failed in create preview image. Error: </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> e.getMessage());<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br />实现RSS (目录)<br />  RSS是一个标准的XML文gQRss阅读器可以读取这个XML文g获得文章的信息,使用户可以通过Rss阅读器而非览器阅读BlogQ我们只要动态生成这个XML文g便可以了。RSSLibJ是一个专门读取和生成RSS的小巧实用的Java库,大小?5kQ可以从<a target="_blank">http://sourceforge.net/projects/rsslibj/</a>下蝲rsslibj-1_0RC2.jar和它需要的EXMLjar两个文gQ然后复制到web/WEB-INF/lib/下?br />  使用RSSLibJ异常单,我们先设|好HttpServletResponse的HeaderQ然后通过RSSLibJ输出XML卛_Q?br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">Channel channel </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Channel();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />channel.setDescription(account.getDescription());<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />baseUrl </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> baseUrl.substring(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, n);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />channel.setLink(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://server-name/home.c?accountId=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> accountId);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />channel.setTitle(account.getTitle());<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />List articles </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> facade.getArticles(accountId, account.getMaxPerPage(), </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />Iterator it </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> articles.iterator();<br /><img id="Codehighlighter1_355_543_Open_Image" onclick="this.style.display='none'; Codehighlighter1_355_543_Open_Text.style.display='none'; Codehighlighter1_355_543_Closed_Image.style.display='inline'; Codehighlighter1_355_543_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_355_543_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_355_543_Closed_Text.style.display='none'; Codehighlighter1_355_543_Open_Image.style.display='inline'; Codehighlighter1_355_543_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(it.hasNext()) </span><span id="Codehighlighter1_355_543_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_355_543_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    Article article </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (Article)it.next();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    channel.addItem(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://server-name/article.c?articleId=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> article.getArticleId(),<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        article.getSummary(), article.getTitle()<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />    );<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 输出xml:</span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">response.setContentType(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text/xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />PrintWriter pw </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> response.getWriter();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />pw.print(channel.getFeed(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">rss</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />pw.close();</span></div><br />实现全文搜烦 (目录)<br />  全文搜烦能大大方便用户快速找C们希望的文章Qؓblog增加一个全文搜索功能是非常必要的。然而,全文搜烦不等于SQL的LIKE语句Q因为关pL据库的设计ƈ不是为全文搜索设计的Q数据库索引对全文搜索无效,在一个几百万条记录中索LIKE Q?A%Q可能会耗时几分钟,q是不可接受的。幸q的是,我们能用免费ƈ且开源的UJava实现的Lucene全文搜烦引擎QLucene可以非常Ҏ地集成到我们的blog中?br />  Lucene不提供直接对文gQ数据库的烦引,只提供一个高性能的引擎,但接口却Zh意料地简单。我们只需要关心以下几个简单的接口Q?br />  DocumentQ代表Lucene数据库的一条记录,也代表搜索的一条结果?br />  FieldQ一个Document包含一个或多个FieldQ类似关pL据库的字Dc?br />  IndexWriterQ用于创建新的烦引,也就是向数据库添加新的可搜烦的大D字W串?br />  AnalyzerQ将字符串拆分成单词QTokenQ,不同的文本对应不同的AnalyzerQ如HtmlAnalyzerQPDFAnalyzer?br />  QueryQ封装一个查询,用于解析用户输入。例如,“bea blog”解析ؓ“同时包含bea和blog的文章”?br />  SearcherQ搜索一个QueryQ结果将以Hitsq回?br />  HitsQ封装一个搜索结果,包含Document集合Q能非常Ҏ地输出结果?br />  下一步,我们需要ؓArticle表的content字段建立全文索引。首先ؓLucene新徏一个数据库Q请注意q个数据库是Lucene专用的,我们不能也不必知道它的内部结构。Lucene的每个数据库对应一个目录,只需要指定目录即可:<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">String indexDir </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C:/search/blog</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />IndexWriter indexWriter </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> IndexWriter(indexDir, </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> StandardAnalyzer(), </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />indexWriter.close();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />  然后d文章Q让Lucene对其索引Q?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />String title </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文章标题</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 从数据库d</span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">String content </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文章内容</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 从数据库d<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 打开索引Q?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">IndexWriter indexWriter </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> IndexWriter(indexDir, </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> StandardAnalyzer(), </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> d一个新记录Q?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Document doc </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Document();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />doc.add(Field.Keyword(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">title</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, title));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />doc.add(Field.Text(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">content</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, content));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 建立索引Q?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">indexWriter.addDocument(doc);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 关闭Q?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">indexWriter.close();</span></div><br /> 要搜索文章非常简单:<br /> 然后d文章Q让对其索引Q?br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">String title </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文章标题</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 从数据库d</span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">String content </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">文章内容</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 从数据库d<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 打开索引Q?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">IndexWriter indexWriter </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> IndexWriter(indexDir, </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> StandardAnalyzer(), </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> d一个新记录Q?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Document doc </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Document();<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />doc.add(Field.Keyword(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">title</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, title));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />doc.add(Field.Text(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">content</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, content));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 建立索引Q?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">indexWriter.addDocument(doc);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 关闭Q?/span><span style="COLOR: #008000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">indexWriter.close();</span></div><br />  要搜索文章非常简单:<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">Searcher searcher </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> IndexSearcher(dir);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />Query query </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> QueryParser.parse(keyword, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">content</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> StandardAnalyzer());<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />Hits hits </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> searcher.search(query);<br /><img id="Codehighlighter1_173_368_Open_Image" onclick="this.style.display='none'; Codehighlighter1_173_368_Open_Text.style.display='none'; Codehighlighter1_173_368_Closed_Image.style.display='inline'; Codehighlighter1_173_368_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_173_368_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_173_368_Closed_Text.style.display='none'; Codehighlighter1_173_368_Open_Image.style.display='inline'; Codehighlighter1_173_368_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(hits </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_173_368_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_173_368_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_216_366_Open_Image" onclick="this.style.display='none'; Codehighlighter1_216_366_Open_Text.style.display='none'; Codehighlighter1_216_366_Closed_Image.style.display='inline'; Codehighlighter1_216_366_Closed_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_216_366_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_216_366_Closed_Text.style.display='none'; Codehighlighter1_216_366_Open_Image.style.display='inline'; Codehighlighter1_216_366_Open_Text.style.display='inline';" src="http://www.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> hits.length(); i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_216_366_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.tkk7.com/images/dot.gif" /></span><span id="Codehighlighter1_216_366_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        Document doc </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> hits.doc(i);<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">found in </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> doc.get(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">title</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(doc.get(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">content</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />searcher.close();</span></div>  我们设计一个LuceneSearchercd装全文搜索功能,׃必须锁定数据库所在目录,我们把数据库讑֮?WEB-INF/search/下,保用户不能讉KQƈ且在配置文g中初始化目录Q?br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="luceneSearcher"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="org.crystalblog.search.LuceneSearcher"</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="directory"</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000">/WEB-INF/search/</span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">></span></div><br />效果如下Q?br /><br /><br />Q图4QsearchQ?br /><br />发送Email (目录)<br />  Blog用户可以让系l将来访用户的留a发送到注册的Email地址Qؓ了避免用SMTP发信服务器,我们自己手动~写一个SendMaillgQ直接通过SMTP协议Email发送到用户信箱?br />  SendMaillg只需配置好DNS服务器的IP地址Q即可向指定的Email信箱发送邮件。ƈ且,SendMail使用~冲队列和多U程在后台发送EmailQ不会中断正常的Web服务。具体代码请看SendMail.java?br /><br />试 (目录)<br />  服务器配|ؓQP4 1.4GQ?12M DDRQ?00M EthernetQWindows XP Professional SP2?br />  试服务器分别ؓWebLogic Server 8.1QTomcat 4.1/5.0QResin 2.1.1?br />  试数据库ؓMS SQL Server 2000 SP3。如果你使用Oracle或者DB2QMySQL{其他数据库q测试成功,请将SQL初始化脚本和详细配置q程发一份给我,谢谢?br />  ׃旉有限Q没有作q一步的调优。WebLogic Server和iBatis有很多优化选项Q详l配|可以参考相x档?br /><br />中文支持 (目录)<br />  试发现Q中文不能在面中正常显C,Z支持中文Q首先在web.xml加入FilterQ用于将输入~码讄为gb2312Q?br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">filter</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000">encodingFilter</span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">filter-class</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000">org.crystalblog.web.filter.EncodingFilter</span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">filter-class</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000">encoding</span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000">gb2312</span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">filter</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">filter-mapping</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000">encodingFilter</span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000">/*</span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">filter-mapping</span><span style="COLOR: #0000ff">></span></div><br />  然后用文本工h索所有的.htmQ?htmlQ?properties文gQ将“iso-8859-1”替换ؓ“gb2312”,现在面中文已经能正常显C,但是Lucene仍不能正常解析中文,原因是标准的StandardA?nalyzer只能解析英文Q可以从|上下蝲一个支持中文的 Analyzer?/span> <img src ="http://www.tkk7.com/zhhp1314520/aggbug/74927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhhp1314520/" target="_blank">捕风</a> 2006-10-13 10:08 <a href="http://www.tkk7.com/zhhp1314520/articles/j2ee_file_rss_search.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Caching the result of methods using Spring and EHCache http://www.tkk7.com/zhhp1314520/articles/Spring_and_EHCache.html捕风捕风Wed, 11 Oct 2006 03:27:00 GMThttp://www.tkk7.com/zhhp1314520/articles/Spring_and_EHCache.htmlhttp://www.tkk7.com/zhhp1314520/comments/74508.htmlhttp://www.tkk7.com/zhhp1314520/articles/Spring_and_EHCache.html#Feedback0http://www.tkk7.com/zhhp1314520/comments/commentRss/74508.htmlhttp://www.tkk7.com/zhhp1314520/services/trackbacks/74508.html阅读全文

捕风 2006-10-11 11:27 发表评论
]]>
spring+AOP+osCachehttp://www.tkk7.com/zhhp1314520/articles/spring_AOP_osCache.html捕风捕风Wed, 11 Oct 2006 01:43:00 GMThttp://www.tkk7.com/zhhp1314520/articles/spring_AOP_osCache.htmlhttp://www.tkk7.com/zhhp1314520/comments/74426.htmlhttp://www.tkk7.com/zhhp1314520/articles/spring_AOP_osCache.html#Feedback0http://www.tkk7.com/zhhp1314520/comments/commentRss/74426.htmlhttp://www.tkk7.com/zhhp1314520/services/trackbacks/74426.html Introduction

by:http://opensource.atlassian.com/confluence/spring/display/DISC/AOP+Cache

I've written an AOP interceptor which allows you to specify which methods to cache for Spring beans.
Different cache providers are available: Memory HashMap, EHCache, OSCache (which is clusterable) and SwarmCache.

Example

We start by defining a bookManager object which has one method

public  List getRelated(Book);

 

which returns a List of Books that are related to the Book that is specified. This method is ideally suited for caching, since the related books will not change that often.
<bean id="bookManager" class="com.example.BookManager"/>

Next we define the AOP interceptor which will cache the results. This example will return a cached result (the List of Books) instead of a call to bookManager.getRelated(Book), if the method is called with the same Book argument.

Available implementations of CacheInterceptor are:

  • MemoryCacheInterceptor: a simple in-memory cache that's not meant for production
  • EHCacheInterceptor: uses EHCache from Hibernate and should be configured in ehcache.xml as described in the EHCache documentation.
  • SwarmCacheInterceptor: a clusterable cache implementation
  • OSCacheInterceptor: uses OSCache from OpenSymphony and is the one used in this example

The cache in the example is expired after 15 minutes.  
     

< bean  id ="cacheInterceptor"  
    class
="org.springframework.aop.interceptor.cache.OSCacheInterceptor" >
    
< property  name ="refreshPeriods" >
        
< props >
            
<!--  Cache the returned related books for 15 minutes  -->
            
< prop  key ="com.example.BookManager@getRelated" > 900 </ prop >
        
</ props >
    
</ property >
    
<!--  For caches not defined under 'refreshPeriods', use this value  -->
    
< property  name ="defaultRefreshPeriod" >
        
< value > -1 </ value >
    
</ property >
    
<!--  Which method to call for non-standard objects like String, Boolean or Number.
 This method should be a simple method, like getId() or toString(), but should
 uniquely identify the object. 
-->
    
< property  name ="identifiers" >
        
< props >
            
<!--  If a method contains an argument com.example.Book,
             the generated cache key contains the value of Book.getId() 
-->
            
< prop  key ="com.example.Book" > getId </ prop >
        
</ props >
    
</ property >
</ bean >

      

refreshPeriods and defaultRefreshPeriod are properties that are specific for the OSCacheInterceptor. The best way to know how to configure a specific CacheInterceptor implementation is by having a look in the Javadoc (see the project.zip file).

refreshPeriods indicates how long the results will be cached in seconds. So a call to com.example.BookManager.getRelated() will be cached for 900 seconds (15 minutes).
When a method is intercepted that is not defined under refreshPeriods, the value of defaultRefreshPeriod will be used.

In order to be able to identify a call to the method with the same parameter, we use the identifiers property. Here you can list the function that needs to be called in order to get a unique identifier for this class. For each class that is used as an argument for the cached methods, specify the method name (which may not have any parameters). This is a better aproach than using the toString() method, since this method can produce long lines while most of the time a simple identifier is available. So in this example, book.getId() will be used to identify separate Book arguments. There is no need to specify arguments that are primitives (float, int), Strings or Numbers (Float, Integer, ...).

Now we wire the cacheInterceptor to the bookManager bean and we're done! Calls to bookManager.getRelated() will from now on be cached for 15 minutes.
Of course you can add as many beans to the cache as you want.

<!--  An advisor that wraps bookManager.getRelated() with the cacheInterceptor  -->
< bean  id ="bookManagerAdvisor"  
    class
="org.springframework.aop.support.RegexpMethodPointcutAdvisor" >
    
< property  name ="advice" >
        
< ref  bean ="cacheInterceptor" />
    
</ property >
    
< property  name ="patterns" >
        
< list >
            
< value > .*getRelated </ value >
        
</ list >
    
</ property >
</ bean >
< bean  id ="bookManagerCacheProxyCreator"  
    class
="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" >
    
< property  name ="beanNames" >
        
< value > bookManager </ value >
    
</ property >
    
< property  name ="interceptorNames" >
        
< list >
            
< value > bookManagerAdvisor </ value >
        
</ list >
    
</ property >
</ bean >

 

Versions

The first version was written quite some time ago, but since 2006/03/21 there is a new version  (2.0.18).

About

I've used this code already in three projects, but not all implementations of the cache (SwarmCache) are well tested. The code is written in the org.springframework.aop.interceptor.cache package and may be copied/used for free.
This code is written by Pieter Coucke for Onthoo.com, but may be used for free. Of course, if the Spring core developers are interested in integrating this, they are free to do so. If you find this code useful or have any remarks, please let me know!

Files

See this XML file for a sample configuration.
Eclipse project and source code. More info is available in the javadocs.

 Related

Caching the result of methods using Spring and EHCache
My AOP cache blog  and a post about version 2.0.18.
Attribute based caching



捕风 2006-10-11 09:43 发表评论
]]>
OSCache使用指南http://www.tkk7.com/zhhp1314520/articles/OSCache.html捕风捕风Wed, 11 Oct 2006 01:37:00 GMThttp://www.tkk7.com/zhhp1314520/articles/OSCache.htmlhttp://www.tkk7.com/zhhp1314520/comments/74424.htmlhttp://www.tkk7.com/zhhp1314520/articles/OSCache.html#Feedback0http://www.tkk7.com/zhhp1314520/comments/commentRss/74424.htmlhttp://www.tkk7.com/zhhp1314520/services/trackbacks/74424.html OSCache是当前运用最q的~存ҎQJBoss,Hibernate,Spring{都对其有支持,下面单介l一下OSCache的配|和使用q程?br />1.安装q程
?a >http://www.opensymphony.com/oscache/download.html下蝲合适的OSCache版本Q?br />我下载的是oscache-2.0.2-full版本?br />解压~下载的文g到指定目?/p>

从解压羃目录取得oscache.jar  文g攑ֈ  /WEB-INF/lib  或相应类库目录?目录中,
jar文g名可能含有版本号和该版本的发布日期信息等Q如oscache-2.0.2-22Jan04.jar

如果你的jdk版本?.3.x,在lib中加入Apache  Common  Lib  的commons-collections.jar包?br />如jdk?.4以上则不?/p>

从src或etc目录取得oscache.properties  文gQ放入src根目录或发布环境?WEB-INF/classes  目录
如你需要徏立磁盘缓存,M改oscache.properties  中的cache.path信息  (L前面?注释)?br />winc\径类gؓc:\app\cache
unixc\径类gؓ/opt/myapp/cache

拯OSCache标签库文件oscache.tld?WEB-INF/classes目录?/p>

现在你的应用目录cM如下Q?br />$WEB_APPLICATIONWEB-INFliboscache.jar
$WEB_APPLICATIONWEB-INFclassesoscache.properties
$WEB_APPLICATIONWEB-INFclassesoscache.tld

下列代码加入web.xml文g?br />E序代码Q?br /><taglib>
<taglib-uri>oscache</taglib-uri>
<taglib-location>/WEB-INF/classes/oscache.tld</taglib-location>
</taglib>


Z便于调试日志输出Q须加入commons-logging.jar和log4j-1.2.8.jar到当前类库\径中

在src目录加入下面两个日志输出配置文gQ?/p>

log4j.properties  文g内容为:
E序代码Q?br />log4j.rootLogger=DEBUG,stdout,file

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[start]%d{yyyy/MM/dd/ HH:mm:ss}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=oscache.log
log4j.appender.file.MaxFileSize=100KB
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[start]%d{yyyy/MM/dd/ HH:mm:ss}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n

log4j.logger.org.apache.commons=ERROR
log4j.logger.com.opensymphony.oscache.base=INFO

commons-logging.properties 文g内容?br />org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog


2.oscache.properties  文g配置向导 

cache.memory
gؓtrue  或?false  Q默认ؓ在内存中作缓存,
如设|ؓfalseQ那cache只能~存到数据库或硬盘中Q那cacheq有什么意义:Q?/p>

cache.capacity
~存元素个数

cache.persistence.class
持久化缓存类Q如此类打开Q则必须讄cache.path信息

cache.cluster  相关
为集设|信息?br />?br />cache.cluster.multicast.ip为广播IP地址
cache.cluster.properties为集属?/p>


3.OSCache的基本用?/p>

cache1.jsp  内容如下

E序代码Q?br /><%@ page import="java.util.*" %>
<%@ taglib uri="oscache" prefix="cache" %>

<html>
<body>

没有~存的日? <%= new Date() %><p>
<!--自动h-->
<cache:cache time="30">
?0U刷新缓存一ơ的日期: <%= new Date() %>
</cache:cache>
<!--手动h-->
<cache:cache key="testcache">
手动h~存的日? <%= new Date() %> <p>
</cache:cache>
<a href="cache2.jsp">手动h</a>

</body>
</html>


cache2.jsp  执行手动h面如下
<  %@  taglib  uri="oscache"  prefix="cache"  %  >

<html>
<body>

~存已刷?..<p>

<cache:flush  key="testcache"  scope="application"/>

<a  href="cache1.jsp">q回</a>

</body>
</html>


你也可以通过下面语句定义Cache的有效范?如不定义scope,scope默认为Applcation
E序代码Q?br /><cache:cache time="30" scope="session">
...
</cache:cache>


4.  ~存qo器?CacheFilter 

你可以在web.xml中定义缓存过滤器Q定义特定资源的~存?br />E序代码Q?br /><filter>
<filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
<init-param>
<param-name>time</param-name>
<param-value>60</param-value>
</init-param>
<init-param>
<param-name>scope</param-name>
<param-value>session</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>


上面定义缓存所?jsp面Q缓存刷新时间ؓ60U,~存作用域ؓSession

注意QCacheFilter只捕获Http头ؓ200的页面请求,卛_Ҏ错误h作缓存,
而不对其他请求(?00,404,400Q作~存处理


OSCache?


OSCache是OpenSymphonyl织提供的一个J2EE架构中Web应用层的~存技术实现组Ӟ它的出现解决了我们面临的问题?OSCache
目前最新的E_版本?.0Q本文中的例子都是基于这个版本的Q如果大家运行例子的q程中发生问题,请首先确认是否采用了正确的Y件版本?

2.1 主要特征


1. 兼容多种支持JSP的web服务?

已经通过兼容试的web服务器包括OrionServer (1.4.0或者以上版? 、Macromedia JRun (3.0或者以上版? 、BEA Weblogic (7.x或者以上版? 、IBM Websphere (5.0版本)、Silverstream (3.7.4版本)、Caucho Resin (1.2.3或者以上版?、Tomcat (4.0或者以上版? Q其他支持servlet2.3、jsp1.2的web服务器应该都是完全兼?/font>OSCache
的?

2. 可选的~存?

你可以用内存、硬盘空间、同时用内存和盘或者提供自q其他资源Q需要自己提供适配器)作ؓ~存区?

使用内存作ؓ~存区将可以提供更好的性能
使用盘作ؓ~存区可以在服务器重起后q速恢复缓存内?
同时使用内存和硬盘作为缓存区则可以减对内存的占?
3. 灉|的缓存系l?

OSCache
支持寚w分页面内Ҏ者对面U的响应内容q行~存Q编E者可以根据不同的需求、不同的环境选择不同的缓存别?

4. 定w

在一般的web应用中,如果某个面需要和数据库打交道Q而当客户h到达Ӟweb应用和数据库之间无法q行交互Q那么将q回l用?pȝ出错"或者类似的提示信息Q如果用了
OSCache
的话Q你可以使用~存提供l用Pl自p得维护系l或者采取其他补救的旉?

其它Ҏ还包括寚w的支持、缓存主动刷新等Ҏ,大家可以参考OpenSymphony|站上的其他资源获取更多的信息?

3
OSCache
lg的安?


OSCache
是一个基于web应用的组Ӟ他的安装工作主要是对web应用q行配置Q大概的步骤如下Q?

1. 下蝲、解压羃
OSCache


请到
OSCache的主http://www.opensymphony.com/oscache/download.html下蝲Oscache的最新版本,作者下载的?/font>OSCache
的最新稳定版?.0?

下载后的。Zip文g解压~到c:\
oscacheQ后面的章节中将使用%OSCache
_Home%来表C个目录)目录?

2. 新徏立一个web应用

3. 主要组?
OSCache_Home%\oscache
.jar攑օWEB-INF\lib目录

4. commons-logging.jar、commons-collections.jar的处?

OSCachelg用Jakarta Commons Logging来处理日志信息,所以需要commons-logging.jar的支持,请将%OSCache
_Home%\lib\core\commons-logging.jar攑օclasspathQ通常意味着这个文件放入WEB-INF\lib目录Q?
如果使用JDK1.3,请将%
OSCache
_Home%\lib\core\commons-collections.jar攑օclasspathQ如果用JDK1.4或者以上版本,则不需要了
5. ?/font>oscache.properties?/font>oscache
.tld攑օWEB-INF\class目录

%
OSCache_Home%\oscache.properties包含了对OSCache
q行特征值的讄信息
%
OSCache_Home%\oscache.tld包含?/font>OSCache
提供的标{ֺ的定义内?
6. 修改web.xml文g

在web.xml文g中增加下面的内容Q增加对
OSCache
提供的taglib的支持:

<taglib>
<taglib-uri>
oscache
</taglib-uri>
<taglib-location>/WEB-INF/classes/
oscache
.tld</taglib-location>
</taglib>




4 开始?/font>OSCache
中的~存lg


OSCache
中按照缓存范围的不同分ؓ两种不同的方式:一U是~存JSP面中部分或者全部内容,一U是Z整个面文g的缓存?

4.1 JSP部分内容~存


4.1.1 Cache-
OSCache
提供的缓存标{?


q是
OSCache
提供的标{ֺ中最重要的一个标{,包括在标{中的内容将应用~存机制q行处理Q处理的方式取决于~程者对cache标签属性的讄?

W一ơ请求到达时Q标{中的内容被处理q且~存hQ当下一个请求到达时Q缓存系l会查这部分内容的缓存是否已l失效,主要是以下几:

1. ~存旉过了cache标签讄的time或者duration属性规定的时旉
2. cron属性规定的旉比缓存信息的开始时间更?
3. 标签中缓存的内容在缓存后又被重新hq?
4. 其他~存期讑֮
如果W合上面四项中的M一,被缓存的内容视ؓ已经失效Q这时被~存的内容将被重新处理ƈ且返回处理过后的信息Q如果被~存的内Ҏ有失效,那么q回l用L是~存中的信息?

cache标签的属性说?

key - 标识~存内容的关键词。在指定的作用范围内必须是唯一的。默认的key是被讉K面的URI和后面的h字符丌Ӏ?

你可以在同一个页面中使用很多cache标签而不指定他的key属性,q种情况下系l用该面的URI和后面的h字符Ԍ另外再自动给q些key增加一个烦引值来区分q些~存内容。但是不推荐采用q样的方式?

scope - ~存发生作用的范_可以是application或者session

time - ~存内容的时间段Q单位是U,默认?600U,也就是一个小Ӟ如果讑֮一个负|那么q部分被~存的内容将永远不过期?

duration - 指定~存内容失效的时_是相对time的另一个选择Q可以用简单日期格式或者符合USO-8601的日期格式。如Qduration='PT5M' duration='5s'{?

refresh - false 或者true?

如果refresh属性设|ؓtrueQ不其他的属性是否符合条Ӟq部分被~存的内定w被更新Q这l编E者一U选择Q决定什么时候必d新?

mode - 如果~程者不希望被缓存的内容增加到给用户的响应中Q可以设|mode属性ؓ"silent"

其它可用的属性还包括Qcron 、groups、language、refreshpolicyclass、refreshpolicyparam?

上面的这些属性可以单独用,也可以根据需要组合用,下面的例子将讲解q些常用属性的使用方式?

4.1.2 Cache标签实例分析:


1. 最单的cache标签用法

使用默认的关键字来标识cache内容Q超时时间是默认?600U?

<cache:cache>
<%
//自己的JSP代码内容
%>
</cache:cache>




2. 用自己指定的字符串标识缓存内容,q且讑֮作用范围为session?

<cache:cache key="foobar" scope="session">
<%
//自己的JSP代码内容
%>
</cache:cache>
3.动态设定key|使用自己指定的time属性设定缓存内容的时旉Q用动态refresh值决定是否强制内容刷新?

因ؓ
OSCache
使用key值来标识~存内容Q用相同的key值将会被认ؓ使用相同的的~存内容Q所以用动态的key值可以自qҎ不同的角艌Ӏ不同的要求军_使用不同的缓存内宏V?

<cache:cache key="<%= product.getId() %>" time="1800" refresh="<%= needRefresh %>">
<%
//自己的JSP代码内容
%>
</cache:cache>




4. 讄time属性ؓ负数使缓存内Ҏ不过?

<cache:cache time="-1">
<%
//自己的JSP代码内容
%>




5. 使用duration属性设|超期时?

<cache:cache duration='PT5M'>
<%
//自己的JSP代码内容
%>




6. 使用mode属性被缓存的内容不加入给客户的响应中

<cache:cache mode='silent'>
<%
//自己的JSP代码内容
%>




4.2 用CashFilter实现面U缓?


?/font>OSCache
lg中提供了一个CacheFilter用于实现面U的~存Q主要用于对web应用中的某些动态页面进行缓存,其是那些需要生成pdf格式文g/报表、图片文件等的页面,不仅减少了数据库的交互、减数据库服务器的压力Q而且对于减少web服务器的性能消耗有很显著的效果?

q种功能的实现是通过在web.xml中进行配|来军_~存哪一个或者一l页面,而且q可以设|缓存的相关属性,q种Z配置文g的实现方式对于J2EE来说应该是一U标准的实现方式了?

[注] 只有客户讉K时返回http头信息中代码?00Q也是讉K已经成功Q的面信息才能够被~存

1. ~存单个文g

修改web.xmlQ增加如下内容,定?testContent.jsp面q行~存?

<filter>
<filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.
oscache
.web.filter.CacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<!-?testContent.jsp面内容q行~存-->
<url-pattern>/testContent.jsp</url-pattern>
</filter-mapping>




2. ~存URL pattern

修改web.xmlQ增加如下内容,定?.jsp面q行~存?

<filter>
<filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.
oscache
.web.filter.CacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<!-Ҏ有jsp面内容q行~存-->
<url-pattern>*.jsp</url-pattern>
</filter-mapping>




3. 自己讑֮~存属?

在页面~存的情况下Q可以通过讄CacheFilter的初始属性来军_~存的一些特性:time属性设|缓存的旉D,默认?600U,可以Ҏ自己的需要只有的讄Q而scope属性设|,默认为applicationQ可选项包括application、session

<filter>
<filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.
oscache
.web.filter.CacheFilter</filter-class>
<init-param>
<param-name>time</param-name>
<param-value>600</param-value>
</init-param>
<init-param>
<param-name>scope</param-name>
<param-value>session</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<!-Ҏ有jsp面内容q行~存-->
<url-pattern>*.jsp</url-pattern>
</filter-mapping>





捕风 2006-10-11 09:37 发表评论
]]>
J2EE For Weblogic开发中Weblogic.xml文g的配|?/title><link>http://www.tkk7.com/zhhp1314520/articles/Weblogic_deploy.html</link><dc:creator>捕风</dc:creator><author>捕风</author><pubDate>Wed, 11 Oct 2006 01:29:00 GMT</pubDate><guid>http://www.tkk7.com/zhhp1314520/articles/Weblogic_deploy.html</guid><wfw:comment>http://www.tkk7.com/zhhp1314520/comments/74423.html</wfw:comment><comments>http://www.tkk7.com/zhhp1314520/articles/Weblogic_deploy.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zhhp1314520/comments/commentRss/74423.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zhhp1314520/services/trackbacks/74423.html</trackback:ping><description><![CDATA[ <p>      weblogic Server允许通过讄weblogic应用E序扩展描述W(weblogic.xmlQ配|jsp容器Q?br />该文仉常位于web应用E序的web-inf目录下。一般不通过修改weblogic文g直接配置Q?br />而是通过控制台配|该文gQ在Deploments-->web Application-->defaultWebApp中配|?br />可在开发和生环境中配|不同的信息?br />主要配置信息Q?br />compilerSupportsEncoding //trueQ-支持使用字符?br />encoding //指定jsp文g的默认字W集Q如gb2312Q?br />vervose //是否调试信息输出到览器和日志Q?br />keepgenerated //是否让编译jsp文g产生?java文g持箋存在Q?br />Page Check Seconds //正数Q-在以Uؓ单位的时间间隔检查jsp文g是否发生了修改,如果是则重新~译Q?br />           0Q-在每一个请求检查jsp;<br />           -1Q-不对jsp文gq行查?br />Precompile //trueQ-在weblogic服务器启动时自动~译所有的jsp?br />Debug Enable //trueQ-是否允许调试?br /><br />Weblogic .xml<br /></p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #0000ff"><?</span> <span style="COLOR: #ff00ff">xml version="1.0" encoding="GB2312"</span> <span style="COLOR: #0000ff">?></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff"><!</span> <span style="COLOR: #ff00ff">DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd"</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">weblogic-web-app</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #008000"><!--</span> <span style="COLOR: #008000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        为web.xml所定义角色赋?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        如果是Weblogic 8.1 SP2 或者之前的版本Q可以不定义security-role-assignment<br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        如果是SP3Q必L工添加所有principalQ角色或角色l)Q?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        详细介绍请参考 PAFA3开发设计指南 文档 ?br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />     </span> <span style="COLOR: #008000">--></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">security-role-assignment</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #008000"><!--</span> <span style="COLOR: #008000"> role-name 必须跟web.xml中security-role标记下的role-name取值相同?/span> <span style="COLOR: #008000">--></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">role-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">pafaDemoUser</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">role-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #008000"><!--</span> <span style="COLOR: #008000"> principal-name 必须是UM中定义的角色或者角色组Q不能是用户 </span> <span style="COLOR: #008000">--></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">principal-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">r_usermanager_rm_user</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">principal-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">principal-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">p_g_rmtest03_myopr</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">principal-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">    <br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">principal-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">Administrators</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">principal-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">    <br /><img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">security-role-assignment</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">jsp-descriptor</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">jsp-param</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">param-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">pageCheckSeconds</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">param-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">param-value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">1</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">param-value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">jsp-param</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">jsp-param</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">param-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">compilerSupportsEncoding</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">param-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">param-value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">true</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">param-value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">jsp-param</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">jsp-param</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">param-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">encoding</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">param-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">param-value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">GB2312</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">param-value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">jsp-param</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">jsp-param</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">param-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">verbose</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">param-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">param-value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">true</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">param-value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">jsp-param</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">jsp-param</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">param-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">printNulls</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">param-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">param-value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">false</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">param-value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">jsp-param</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">jsp-param</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">param-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">keepgenerated</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">param-name</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">param-value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">true</span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">param-value</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">jsp-param</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">jsp-descriptor</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">weblogic-web-app</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align="top" /> </span> </div> <img src ="http://www.tkk7.com/zhhp1314520/aggbug/74423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zhhp1314520/" target="_blank">捕风</a> 2006-10-11 09:29 <a href="http://www.tkk7.com/zhhp1314520/articles/Weblogic_deploy.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://dfcnpc.com" target="_blank">ɫƨƨwwwӰԺѹۿƵ</a>| <a href="http://86trader.com" target="_blank">Ļ</a>| <a href="http://xjdz8.com" target="_blank">պһëƬ</a>| <a href="http://8izh.com" target="_blank">ֱѹۿ</a>| <a href="http://shnisda.com" target="_blank">18ڵվ</a>| <a href="http://yhanalati.com" target="_blank">ձѲ</a>| <a href="http://56v6.com" target="_blank">һѿ</a>| <a href="http://www-474749.com" target="_blank">ĻȫѰ </a>| <a href="http://wenbye.com" target="_blank">޾Ʒ뼤AV</a>| <a href="http://wwwvv99.com" target="_blank">va˳Ƶվȫ</a>| <a href="http://gxnnzk.com" target="_blank">˳Ƭ߹ۿ</a>| <a href="http://172pk.com" target="_blank">Ůһ</a>| <a href="http://alodaba.com" target="_blank">ĻۺϾþò</a>| <a href="http://vankiz.com" target="_blank">ձ߹ۿ</a>| <a href="http://ydstbj.com" target="_blank">avһas</a>| <a href="http://b7277.com" target="_blank">AVרӰ߹ۿ</a>| <a href="http://hengzekang.com" target="_blank">޹һ</a>| <a href="http://apguangyu.com" target="_blank">͵ͼƬ</a>| <a href="http://8mav1000.com" target="_blank">Ʒ˿߲</a>| <a href="http://tiantiantegou.com" target="_blank">޹Ʒһ</a>| <a href="http://4228970.com" target="_blank">Ļmv</a>| <a href="http://www-7607.com" target="_blank">͵޾Ʒ</a>| <a href="http://yuduruizhi.com" target="_blank">պƵ</a>| <a href="http://8mav938.com" target="_blank">վѹۿ</a>| <a href="http://xyflash.com" target="_blank">99Ƶۿ</a>| <a href="http://987566.com" target="_blank">Ұ߹ۿ3</a>| <a href="http://hnkangshi.com" target="_blank">Ʒþ޾þþþûʿ </a>| <a href="http://wangquanai.com" target="_blank">aٰƵ</a>| <a href="http://jcthbank.com" target="_blank">ձһѿ</a>| <a href="http://42329c.com" target="_blank">þwww˳_Ƭ</a>| <a href="http://sdsxyz.com" target="_blank">߲˳Ƶ߹ۿ</a>| <a href="http://2c06xyz.com" target="_blank">һƬaѲſ֮ </a>| <a href="http://91se01.com" target="_blank">ձһ߹ۿ</a>| <a href="http://www3ratcom.com" target="_blank">ƷŮٸAVѹۿ</a>| <a href="http://www5g9.com" target="_blank">Ƶۿwww</a>| <a href="http://gdfcjzx.com" target="_blank">޳aƬ߹ۿ</a>| <a href="http://4228970.com" target="_blank">һƵ</a>| <a href="http://baoyutv777.com" target="_blank">պƷAƬձ</a>| <a href="http://xxyy66.com" target="_blank">ؼëƬƵ</a>| <a href="http://3688008.com" target="_blank">þþƷһ</a>| <a href="http://kmrghj.com" target="_blank">վ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>