﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-空间站-文章分类-JAVA</title><link>http://www.blogjava.net/i369/category/17158.html</link><description>北极心空</description><language>zh-cn</language><lastBuildDate>Thu, 03 Apr 2008 06:08:53 GMT</lastBuildDate><pubDate>Thu, 03 Apr 2008 06:08:53 GMT</pubDate><ttl>60</ttl><item><title>[收藏] Java数据类型，Hibernate数据类型，标准sql数据类型之间的对应表 </title><link>http://www.blogjava.net/i369/articles/190588.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 03 Apr 2008 04:39:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/190588.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/190588.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/190588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/190588.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/190588.html</trackback:ping><description><![CDATA[<table style="border-right: #f3f3f3 5px solid; border-top: #f3f3f3 5px solid; border-left: #f3f3f3 5px solid; border-bottom: #f3f3f3 5px solid" cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="padding-left: 10px; padding-top: 5px" width="560" colspan="2"><span style="font-size: 13px; line-height: 22px">
            <div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/haoqingshi/articles/10912.html">Java数据类型，Hibernate数据类型，标准sql数据类型之间的对应表</a></div>
            <table style="width: 100%; text-align: left" cellspacing="2" cellpadding="2" border="1">
                <tbody>
                    <tr>
                        <td style="background-color: rgb(204,204,204)"><small><font size="2">Java数据类型</font></small></td>
                        <td style="background-color: rgb(204,204,204)"><small><font size="2">Hibernate数据类型</font></small></td>
                        <td style="background-color: rgb(204,204,204)"><small><font size="2">标准SQL数据类型<br />
                        (PS:对于不同的DB可能有所差异)</font></small></td>
                    </tr>
                    <tr>
                        <td>byte、java.lang.Byte</td>
                        <td>byte</td>
                        <td>TINYINT</td>
                    </tr>
                    <tr>
                        <td>short、java.lang.Short</td>
                        <td>short</td>
                        <td>SMALLINT</td>
                    </tr>
                    <tr>
                        <td>int、java.lang.Integer</td>
                        <td>integer</td>
                        <td>INGEGER</td>
                    </tr>
                    <tr>
                        <td>long、java.lang.Long</td>
                        <td>long</td>
                        <td>BIGINT</td>
                    </tr>
                    <tr>
                        <td>float、java.lang.Float</td>
                        <td>float</td>
                        <td>FLOAT</td>
                    </tr>
                    <tr>
                        <td>double、java.lang.Double</td>
                        <td>double</td>
                        <td>DOUBLE</td>
                    </tr>
                    <tr>
                        <td>java.math.BigDecimal</td>
                        <td>big_decimal</td>
                        <td>NUMERIC</td>
                    </tr>
                    <tr>
                        <td>char、java.lang.Character</td>
                        <td>character</td>
                        <td>CHAR(1)</td>
                    </tr>
                    <tr>
                        <td>boolean、java.lang.Boolean</td>
                        <td>boolean</td>
                        <td>BIT</td>
                    </tr>
                    <tr>
                        <td>java.lang.String</td>
                        <td>string</td>
                        <td>VARCHAR</td>
                    </tr>
                    <tr>
                        <td>boolean、java.lang.Boolean</td>
                        <td>yes_no</td>
                        <td>CHAR(1)('Y'或'N')</td>
                    </tr>
                    <tr>
                        <td>boolean、java.lang.Boolean</td>
                        <td>true_false</td>
                        <td>CHAR(1)('Y'或'N')</td>
                    </tr>
                    <tr>
                        <td>java.util.Date、java.sql.Date</td>
                        <td>date</td>
                        <td>DATE</td>
                    </tr>
                    <tr>
                        <td>java.util.Date、java.sql.Time</td>
                        <td>time</td>
                        <td>TIME</td>
                    </tr>
                    <tr>
                        <td>java.util.Date、java.sql.Timestamp</td>
                        <td>timestamp</td>
                        <td>TIMESTAMP</td>
                    </tr>
                    <tr>
                        <td>java.util.Calendar</td>
                        <td>calendar</td>
                        <td>TIMESTAMP</td>
                    </tr>
                    <tr>
                        <td>java.util.Calendar</td>
                        <td>calendar_date</td>
                        <td>DATE</td>
                    </tr>
                    <tr>
                        <td>byte[]</td>
                        <td>binary</td>
                        <td>VARBINARY、BLOB</td>
                    </tr>
                    <tr>
                        <td>java.lang.String</td>
                        <td>text</td>
                        <td>CLOB</td>
                    </tr>
                    <tr>
                        <td>java.io.Serializable</td>
                        <td>serializable</td>
                        <td>VARBINARY、BLOB</td>
                    </tr>
                    <tr>
                        <td>java.sql.Clob</td>
                        <td>clob</td>
                        <td>CLOB</td>
                    </tr>
                    <tr>
                        <td>java.sql.Blob</td>
                        <td>blob</td>
                        <td>BLOB</td>
                    </tr>
                    <tr>
                        <td>java.lang.Class</td>
                        <td>class</td>
                        <td>VARCHAR</td>
                    </tr>
                    <tr>
                        <td>java.util.Locale</td>
                        <td>locale</td>
                        <td>VARCHAR</td>
                    </tr>
                    <tr>
                        <td>java.util.TimeZone</td>
                        <td>timezone</td>
                        <td>VARCHAR</td>
                    </tr>
                    <tr>
                        <td>java.util.Currency</td>
                        <td>currency</td>
                        <td>VARCHAR</td>
                    </tr>
                </tbody>
            </table>
            </span></td>
        </tr>
        <tr>
            <td valign="bottom" colspan="2" height="40">文章来源:<a href="http://www.blogjava.net/haoqingshi/articles/10912.html" target="_blank">http://www.blogjava.net/haoqingshi/articles/10912.html</a></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/i369/aggbug/190588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-04-03 12:39 <a href="http://www.blogjava.net/i369/articles/190588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j和commons.logging日志记录的使用方法</title><link>http://www.blogjava.net/i369/articles/185309.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 11 Mar 2008 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/185309.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/185309.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/185309.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/185309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/185309.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text"><span style="font-size: 9pt; color: black">
            <p style="margin: 0in 0in 0pt"><strong><span style="font-size: 9pt">Log4j</span><span style="font-size: 9pt">中文手册下载地址</span></strong><span style="font-size: 9pt"><a href="http://www.matrix.org.cn/resource/upload/forum/2006_04_07_205056_ZCxoePRlHJ.pdf" target="_blank"><span style="color: windowtext">http://www.matrix.org.cn/resource/upload/forum/2006_04_07_205056_ZCxoePRlHJ.pdf</span></a></span></p>
            <p style="margin: 0in 0in 0pt"></p>
            <p style="margin: 0in 0in 0pt"><span style="font-size: 9pt">log4j的好处在于：<br />
            1.通过修改配置文件，就可以决定log信息输出到何处(console,文件,...),是否输出。<br />
            这样，在系统开发阶段可以打印详细的log信息以跟踪系统运行情况,而在系统稳定后可以关闭log输出,从而在能跟踪系统运行情况的同时,又减少了垃圾代码(System.out.println(...)等)。<br />
            2.使用log4j，需要整个系统有一个统一的log机制，有利于系统的规划。</span></p>
            <p style="margin: 0in 0in 0pt"></p>
            </span>
            <p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; color: black">当你在开发程序的时候</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">调试</span><span style="font-size: 9pt; color: black">(debugging)</span><span style="font-size: 9pt; color: black">和日志</span><span style="font-size: 9pt; color: black">(logging)</span><span style="font-size: 9pt; color: black">都是非常重要的工作</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">但是</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">现在有太多的</span><span style="font-size: 9pt; color: black"> logging API </span><span style="font-size: 9pt; color: black">问世</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">因为他们都不错</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">很难做一个抉择</span><span style="font-size: 9pt; color: black">. </span><span style="font-size: 9pt; color: black">国外</span><span style="font-size: 9pt; color: black"> java </span><span style="font-size: 9pt; color: black">论坛对于这些</span><span style="font-size: 9pt; color: black"> logging </span><span style="font-size: 9pt; color: black">方式也是有一番讨论</span><span style="font-size: 9pt; color: black">.<br />
            <br />
            </span><span style="font-size: 9pt; color: black">而</span><span style="font-size: 9pt; color: black"> common logging </span><span style="font-size: 9pt; color: black">就是一个在这几个不同的</span><span style="font-size: 9pt; color: black"> logging API </span><span style="font-size: 9pt; color: black">中建立小小的桥梁</span><span style="font-size: 9pt; color: black">.</span><span style="font-size: 9pt; color: black">目前在</span><span style="font-size: 9pt; color: black"> Java </span><span style="font-size: 9pt; color: black">中最有名的</span><span style="font-size: 9pt; color: black"> Log </span><span style="font-size: 9pt; color: black">方式</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">首推是</span><span style="font-size: 9pt; color: black"> Log4j, </span><span style="font-size: 9pt; color: black">另是</span><span style="font-size: 9pt; color: black"> JDK 1.4 Logging API. </span><span style="font-size: 9pt; color: black">除此之外</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">还有</span><span style="font-size: 9pt; color: black"> Avalon </span><span style="font-size: 9pt; color: black">中用的</span><span style="font-size: 9pt; color: black"> </span><span style="font-size: 9pt; color: black">LogKit </span><span style="font-size: 9pt; color: black">等等</span><span style="font-size: 9pt; color: black"> . </span><span style="font-size: 9pt; color: black">而</span><span style="font-size: 9pt; color: black"> commons-logging </span><span style="font-size: 9pt; color: black">也有实现一些基本</span><span style="font-size: 9pt; color: black"> </span><span style="font-size: 9pt; color: black">的</span><span style="font-size: 9pt; color: black"> logging </span><span style="font-size: 9pt; color: black">方式为</span><span style="font-size: 9pt; color: black"> NoOpLog </span><span style="font-size: 9pt; color: black">及</span><span style="font-size: 9pt; color: black"> SimpleLog. </span><span style="font-size: 9pt; color: black">对于他们的比较不在这次讨论范围</span><span style="font-size: 9pt; color: black">,<br />
            <br />
            </span><span style="font-size: 9pt; color: black">有兴趣者请自行参阅参考文件</span><span style="font-size: 9pt; color: black">.<br />
            <br />
            </span><span style="font-size: 9pt; color: black">快速使用</span><span style="font-size: 9pt; color: black"> Logging </span><span style="font-size: 9pt; color: black">其实</span><span style="font-size: 9pt; color: black"> logging </span><span style="font-size: 9pt; color: black">非常简单去使用</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">将</span><span style="font-size: 9pt; color: black"> commons-logging.jar </span><span style="font-size: 9pt; color: black">放到</span><span style="font-size: 9pt; color: black"> /WEB-INF/lib </span><span style="font-size: 9pt; color: black">之下</span><span style="font-size: 9pt; color: black">.</span><span style="font-size: 9pt; color: black">接著写以下的代码</span><span style="font-size: 9pt; color: black"><br />
            <br />
            LoggingTest.java<br />
            <br />
            package com.softleader.newspaper.java.opensource;<br />
            <br />
            import org.apache.commons.logging.Log;<br />
            import org.apache.commons.logging.LogFactory;<br />
            <br />
            public class LoggingTest {<br />
            <br />
            Log log = LogFactory.getLog(LoggingTest.class);<br />
            <br />
            public void hello() {<br />
            log.error("ERROR");<br />
            log.debug("DEBUG");<br />
            log.warn("WARN");<br />
            log.info("INFO");<br />
            log.trace("TRACE");<br />
            System.out.println("OKOK");<br />
            }<br />
            <br />
            }<br />
            <br />
            </span><span style="font-size: 9pt; color: black">在</span><span style="font-size: 9pt; color: black"> / </span><span style="font-size: 9pt; color: black">放置一个</span><span style="font-size: 9pt; color: black"> jsp </span><span style="font-size: 9pt; color: black">测试</span><span style="font-size: 9pt; color: black"> test-commons-logging.jsp<br />
            <br />
            &lt;%@ page import="com.softleader.newspaper.java.opensource.LoggingTest" %&gt;<br />
            &lt;% LoggingTest test = new LoggingTest(); test.hello();%&gt;<br />
            <br />
            </span><span style="font-size: 9pt; color: black">你将会看到</span><span style="font-size: 9pt; color: black"> tomcat console </span><span style="font-size: 9pt; color: black">会有下面输出</span><span style="font-size: 9pt; color: black"><br />
            <br />
            log4j:WARN No appenders could be found for logger (com.softleader.newspaper.java.opensource.LoggingTest).<br />
            log4j:WARN Please initialize the log4j system properly.OKOK<br />
            <br />
            </span><span style="font-size: 9pt; color: black">是因为你还没有配置</span><span style="font-size: 9pt; color: black"> commons-logging.properties, </span><span style="font-size: 9pt; color: black">马上会为你介绍</span><span style="font-size: 9pt; color: black"> ~~~.<br />
            <br />
            </span><span style="font-size: 9pt; color: black">设定</span><span style="font-size: 9pt; color: black"> commons-logging.properties </span><span style="font-size: 9pt; color: black">你可以设置你的</span><span style="font-size: 9pt; color: black"> log factory </span><span style="font-size: 9pt; color: black">是要使用哪一个</span><span style="font-size: 9pt; color: black"> </span><span style="font-size: 9pt; color: black">我以</span><span style="font-size: 9pt; color: black"> Log4J </span><span style="font-size: 9pt; color: black">为例子</span><span style="font-size: 9pt; color: black"> </span><span style="font-size: 9pt; color: black">在</span><span style="font-size: 9pt; color: black"> /WEB-INF/classes/commons-logging.properties </span><span style="font-size: 9pt; color: black">中写入</span><span style="font-size: 9pt; color: black"><br />
            org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog<br />
            </span><span style="font-size: 9pt; color: black">如果你</span><span style="font-size: 9pt; color: black"> server </span><span style="font-size: 9pt; color: black">是使用</span><span style="font-size: 9pt; color: black"> jdk1.4 </span><span style="font-size: 9pt; color: black">以上的版本</span><span style="font-size: 9pt; color: black"><br />
            </span><span style="font-size: 9pt; color: black">可以使用</span><span style="font-size: 9pt; color: black"> org.apache.commons.logging.impl.Jdk14Logger<br />
            </span><span style="font-size: 9pt; color: black">接著根据你的</span><span style="font-size: 9pt; color: black"> Logger </span><span style="font-size: 9pt; color: black">撰写符合他的</span><span style="font-size: 9pt; color: black"> properties </span><span style="font-size: 9pt; color: black">拿</span><span style="font-size: 9pt; color: black"> Log4j </span><span style="font-size: 9pt; color: black">为例子</span><span style="font-size: 9pt; color: black"> </span><span style="font-size: 9pt; color: black">你就要在</span><span style="font-size: 9pt; color: black"><br />
            /WEB-INF/classes/ </span><span style="font-size: 9pt; color: black">下放置一个</span><span style="font-size: 9pt; color: black"><br />
            <br />
            //</span><span style="font-size: 9pt; color: black">日志输出到文件</span><span style="font-size: 9pt; color: black"><br />
            log4j.rootLogger=DEBUG, A_default<br />
            log4j.appender.A_default=org.apache.log4j.RollingFileAppender<br />
            log4j.appender.A_default.File=c://log/test.log<br />
            log4j.appender.A_default.MaxFileSize=4000KB<br />
            log4j.appender.A_default.MaxBackupIndex=10<br />
            log4j.appender.A_default.layout=org.apache.log4j.PatternLayout<br />
            log4j.appender.A_default.layout.ConversionPattern=%d{ISO8601} - %p - %m%n<br />
            <br />
            //</span><span style="font-size: 9pt; color: black">日志输出到控制台</span><span style="font-size: 9pt; color: black"><br />
            log4j.rootLogger=INFO, A1<br />
            log4j.appender.A1=org.apache.log4j.ConsoleAppender<br />
            log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />
            log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n<br />
            <br />
            //</span><span style="font-size: 9pt; color: black">发送邮件</span><span style="font-size: 9pt; color: black"><br />
            # Configuration for receiving e-mails when ERROR messages occur.<br />
            <br />
            #</span><span style="font-size: 9pt; color: black">自定义的</span><span style="font-size: 9pt; color: black">Appender<br />
            log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender<br />
            #</span><span style="font-size: 9pt; color: black">日志的错误级别</span><span style="font-size: 9pt; color: black"><br />
            log4j.appender.MAIL.Threshold=ERROR<br />
            #</span><span style="font-size: 9pt; color: black">缓存文件大小，日志达到</span><span style="font-size: 9pt; color: black">512K</span><span style="font-size: 9pt; color: black">时发送</span><span style="font-size: 9pt; color: black">Email<br />
            log4j.appender.MAIL.BufferSize=512<br />
            #</span><span style="font-size: 9pt; color: black">发件人</span><span style="font-size: 9pt; color: black"><br />
            log4j.appender.MAIL.From=webmaster@bcxy.com<br />
            #</span><span style="font-size: 9pt; color: black">发送邮件的服务器</span><span style="font-size: 9pt; color: black"><br />
            log4j.appender.MAIL.SMTPHost=smtp.163.com<br />
            #</span><span style="font-size: 9pt; color: black">邮件的标题</span><span style="font-size: 9pt; color: black"><br />
            log4j.appender.MAIL.Subject=Log4J Message<br />
            #</span><span style="font-size: 9pt; color: black">日志邮件的接收者</span><span style="font-size: 9pt; color: black"><br />
            log4j.appender.MAIL.To=ezerg@126.com<br />
            #</span><span style="font-size: 9pt; color: black">日志</span><span style="font-size: 9pt; color: black">PatternLayout<br />
            log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout<br />
            #</span><span style="font-size: 9pt; color: black">日志的格式</span><span style="font-size: 9pt; color: black"><br />
            log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br />
            <br />
            <br />
            </span><span style="font-size: 9pt; color: black">此时你去执行</span><span style="font-size: 9pt; color: black"> test-commons-logging.jsp </span><span style="font-size: 9pt; color: black">输出的内容</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">就会记录在你的</span><span style="font-size: 9pt; color: black"> c:\log </span><span style="font-size: 9pt; color: black">目录的</span><span style="font-size: 9pt; color: black"> test.log </span><span style="font-size: 9pt; color: black">中了</span><span style="font-size: 9pt; color: black"> ps:</span><span style="font-size: 9pt; color: black">如果没有相关的</span><span style="font-size: 9pt; color: black"> class </span><span style="font-size: 9pt; color: black">会使用到</span><span style="font-size: 9pt; color: black"> SimpLog, </span><span style="font-size: 9pt; color: black">此时要设定的是</span><span style="font-size: 9pt; color: black"><br />
            simplelog.properties </span><span style="font-size: 9pt; color: black">结论以我自己本身使用的经验</span><span style="font-size: 9pt; color: black">, Log4j </span><span style="font-size: 9pt; color: black">可以满足所有工程师</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">所以我也是直接使用</span><span style="font-size: 9pt; color: black"> log4j </span><span style="font-size: 9pt; color: black">而没有使用</span><span style="font-size: 9pt; color: black"> commons-logging.<br />
            <br />
            </span><span style="font-size: 9pt; color: black">不过为了增加产品的通用性</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">避免移植时候的麻烦</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">新的产品及项目</span><span style="font-size: 9pt; color: black">, </span><span style="font-size: 9pt; color: black">我会将他改成</span><span style="font-size: 9pt; color: black"> commons-logging api </span><span style="font-size: 9pt; color: black">去调用</span><span style="font-size: 9pt; color: black">.<br />
            <br />
            </span><span style="font-size: 9pt; color: black">如果你对</span><span style="font-size: 9pt; color: black">commons-logging</span><span style="font-size: 9pt; color: black">的工作原理不是很了解，请参考＜</span><span style="font-size: 9pt; color: black">commons-logging</span><span style="font-size: 9pt; color: black">的使用方法＞</span></p>
            <p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; color: black">另，</span><span style="font-size: 9pt; color: black">mvnforum</span><span style="font-size: 9pt; color: black">里面的</span><span style="font-size: 9pt; color: black">commons-logging.properties</span><span style="font-size: 9pt; color: black">写法：</span><span style="font-size: 9pt; color: black"><br />
            # This is configuration file which used to config Logging for mvnForum application<br />
            # mvnForum supports 2 Loggings: Log4J and jzonic<br />
            # Depend on your web server, you should choose a logging properly<br />
            <br />
            <br />
            # IMPORTANT NOTE FOR TOMCAT 5.x USERS:<br />
            #<br />
            # By default, Tomcat 5.x will not work with Log4J. <br />
            # However, this file (commons-logging.properties) with a line<br />
            # config : org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.Log4jFactory<br />
            # make Tomcat 5.x and Log4J work happyly together forever, I dont know why :-)<br />
            <br />
            <br />
            <br />
            # Log4J<br />
            # This used to config logging Log4J<br />
            # Note that by default, common logging will look for Log4J first<br />
            # Comment out folling line to if you will use Jlo logging (also remember to enable Jlo below)<br />
            <br />
            org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.Log4jFactory<br />
            <br />
            # Jlo <br />
            # jlo.xml config logging which only log the statements (DEBUG, ERROR, TRACE, INFO, WARN) <br />
            # from the packages start with net.myvietnam and com.mvnforum. <br />
            # See properities/jlo.xml for detail about this logging<br />
            # See <a href="http://jzonic.org/" target="_blank"><font color="#333333">http://jzonic.org</font></a> for documentation<br />
            # If you want to extend mvnForum application, you should be aware of that<br />
            <br />
            # Uncomment folling line to choose jlo logging <br />
            # You will need Jlo if Log4j could not run on Tomcat 5.0.x, Tomcat 5.5.x or JRun 4<br />
            # NOTE: read comment above about Tomcat 5.x issue<br />
            <br />
            # org.apache.commons.logging.LogFactory=org.jzonic.jlo.LogManager</span></p>
            <p style="margin: 0in 0in 0pt"></p>
            <p style="margin: 0in 0in 0pt"><span style="font-size: 9pt; color: black">====================================================================</span></p>
            <p style="margin: 0in 0in 0pt"><span style="font-size: 9pt">LOG4J的配置之简单使它遍及于越来越多的应用中了：Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了， <br />
            <br />
            <br />
            <br />
            log4j.rootLogger=DEBUG,CONSOLE,A1,im <br />
            log4j.addivity.org.apache=true <br />
            <br />
            <br />
            <br />
            # 应用于控制台 <br />
            <br />
            log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender <br />
            log4j.appender.Threshold=DEBUG <br />
            log4j.appender.CONSOLE.Target=System.out <br />
            log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout <br />
            log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />
            #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n <br />
            <br />
            <br />
            #应用于文件 <br />
            <br />
            log4j.appender.FILE=org.apache.log4j.FileAppender <br />
            log4j.appender.FILE.File=file.log <br />
            log4j.appender.FILE.Append=false <br />
            log4j.appender.FILE.layout=org.apache.log4j.PatternLayout <br />
            log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />
            # Use this layout for LogFactor 5 analysis <br />
            <br />
            <br />
            <br />
            # 应用于文件回滚 <br />
            <br />
            log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender <br />
            log4j.appender.ROLLING_FILE.Threshold=ERROR <br />
            log4j.appender.ROLLING_FILE.File=rolling.log <br />
            log4j.appender.ROLLING_FILE.Append=true <br />
            log4j.appender.ROLLING_FILE.MaxFileSize=10KB <br />
            log4j.appender.ROLLING_FILE.MaxBackupIndex=1 <br />
            log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout <br />
            log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />
            <br />
            <br />
            #应用于socket <br />
            log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender <br />
            log4j.appender.SOCKET.RemoteHost=localhost <br />
            log4j.appender.SOCKET.Port=5001 <br />
            log4j.appender.SOCKET.LocationInfo=true <br />
            # Set up for Log Facter 5 <br />
            log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout <br />
            log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n <br />
            <br />
            <br />
            # Log Factor 5 Appender <br />
            log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender <br />
            log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 <br />
            <br />
            <br />
            <br />
            # 发送日志给邮件 <br />
            <br />
            log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender <br />
            log4j.appender.MAIL.Threshold=FATAL <br />
            log4j.appender.MAIL.BufferSize=10 <br />
            log4j.appender.MAIL.From=web@<a href="http://www.wuset.com/" target="_blank">www.wuset.com</a> <br />
            log4j.appender.MAIL.SMTPHost=www.wusetu.com <br />
            log4j.appender.MAIL.Subject=Log4J Message <br />
            log4j.appender.MAIL.To=web@<a href="http://www.wusetu.com/" target="_blank">www.wusetu.com</a> <br />
            log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout <br />
            log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />
            <br />
            <br />
            <br />
            # 用于数据库 <br />
            log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender <br />
            log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test <br />
            log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver <br />
            log4j.appender.DATABASE.user=root <br />
            log4j.appender.DATABASE.password= <br />
            log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') <br />
            log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout <br />
            log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />
            <br />
            <br />
            log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender <br />
            log4j.appender.A1.File=SampleMessages.log4j <br />
            log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' <br />
            log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout <br />
            <br />
            #自定义Appender <br />
            <br />
            log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender <br />
            <br />
            log4j.appender.im.host = mail.cybercorlin.net <br />
            log4j.appender.im.username = username <br />
            log4j.appender.im.password = password <br />
            log4j.appender.im.recipient = <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#111;&#114;&#108;&#105;&#110;&#64;&#99;&#121;&#98;&#101;&#114;&#99;&#111;&#114;&#108;&#105;&#110;&#46;&#110;&#101;&#116;">corlin@cybercorlin.net</a> <br />
            <br />
            log4j.appender.im.layout=org.apache.log4j.PatternLayout <br />
            log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<br />
<img src ="http://www.blogjava.net/i369/aggbug/185309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-03-11 11:48 <a href="http://www.blogjava.net/i369/articles/185309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取Java文件路径</title><link>http://www.blogjava.net/i369/articles/182041.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 25 Feb 2008 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/182041.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/182041.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/182041.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/182041.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/182041.html</trackback:ping><description><![CDATA[<p>1.如何获得当前文件路径</p>
<p>常用：</p>
<p>字符串类型：System.getProperty("user.dir");</p>
<p>综合：</p>
<p>package com.zcjl.test.base;<br />
import java.io.File;<br />
public class Test {<br />
public static void main(String[] args) throws Exception {<br />
System.out.println(<br />
Thread.currentThread().getContextClassLoader().getResource(""));<br />
System.out.println(Test.class.getClassLoader().getResource(""));<br />
System.out.println(ClassLoader.getSystemResource(""));<br />
System.out.println(Test.class.getResource(""));<br />
System.out.println(Test.class.getResource("/"));<br />
System.out.println(new File("").getAbsolutePath());<br />
System.out.println(System.getProperty("user.dir"));<br />
}<br />
}</p>
<p>2.Web服务中</p>
<p>(1).Weblogic</p>
<p>WebApplication的系统文件根目录是你的weblogic安装所在根目录。<br />
例如：如果你的weblogic安装在c:\bea\weblogic700.....<br />
那么，你的文件根路径就是c:\.<br />
所以，有两种方式能够让你访问你的服务器端的文件：<br />
a.使用绝对路径：<br />
比如将你的参数文件放在c:\yourconfig\yourconf.properties，<br />
直接使用 new FileInputStream("yourconfig/yourconf.properties");<br />
b.使用相对路径：<br />
相对路径的根目录就是你的webapplication的根路径，即WEB-INF的上一级目录，将你的参数文件放在yourwebapp\yourconfig\yourconf.properties，<br />
这样使用：<br />
new FileInputStream("./yourconfig/yourconf.properties");<br />
这两种方式均可，自己选择。</p>
<p>(2).Tomcat</p>
<p>在类中输出System.getProperty("user.dir");显示的是%Tomcat_Home%/bin</p>
<p>(3).Resin</p>
<p>不是你的JSP放的相对路径,是JSP引擎执行这个JSP编译成SERVLET<br />
的路径为根.比如用新建文件法测试File f = new File("a.htm");<br />
这个a.htm在resin的安装目录下 </p>
<p>(4).如何读相对路径哪？</p>
<p>在Java文件中getResource或getResourceAsStream均可</p>
<p>例：getClass().getResourceAsStream(filePath);//filePath可以是"/filename",这里的/代表web发布根路径下WEB-INF/classes</p>
<p>(5).获得文件真实路径</p>
<p>string file_real_path=request.getRealPath("mypath/filename"); </p>
<p>通常使用request.getRealPath("/"); </p>
<p>3.文件操作的类</p>
<p>import java.io.*;<br />
import java.net.*;<br />
import java.util.*;<br />
//import javax.swing.filechooser.*;<br />
//import org.jr.swing.filter.*;</p>
<p>/**<br />
* 此类中封装一些常用的文件操作。<br />
* 所有方法都是静态方法，不需要生成此类的实例，<br />
* 为避免生成此类的实例，构造方法被申明为private类型的。<br />
* @since 0.1<br />
*/</p>
<p>public class FileUtil {<br />
/**<br />
* 私有构造方法，防止类的实例化，因为工具类不需要实例化。<br />
*/<br />
private FileUtil() {</p>
<p>}</p>
<p>/**<br />
* 修改文件的最后访问时间。<br />
* 如果文件不存在则创建该文件。<br />
* &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出，这些信息输出是否保留还在考</p>
<p>虑中。&lt;/b&gt;<br />
* @param file 需要修改最后访问时间的文件。<br />
* @since 0.1<br />
*/<br />
public static void touch(File file) {<br />
long currentTime = System.currentTimeMillis();<br />
if (!file.exists()) {<br />
System.err.println("file not found:" file.getName());<br />
System.err.println("Create a new file:" file.getName());<br />
try {<br />
if (file.createNewFile()) {<br />
// System.out.println("Succeeded!");<br />
}<br />
else {<br />
// System.err.println("Create file failed!");<br />
}<br />
}<br />
catch (IOException e) {<br />
// System.err.println("Create file failed!");<br />
e.printStackTrace();<br />
}<br />
}<br />
boolean result = file.setLastModified(currentTime);<br />
if (!result) {<br />
// System.err.println("touch failed: " file.getName());<br />
}<br />
}</p>
<p>/**<br />
* 修改文件的最后访问时间。<br />
* 如果文件不存在则创建该文件。<br />
* &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出，这些信息输出是否保留还在考</p>
<p>虑中。&lt;/b&gt;<br />
* @param fileName 需要修改最后访问时间的文件的文件名。<br />
* @since 0.1<br />
*/<br />
public static void touch(String fileName) {<br />
File file = new File(fileName);<br />
touch(file);<br />
}</p>
<p>/**<br />
* 修改文件的最后访问时间。<br />
* 如果文件不存在则创建该文件。<br />
* &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出，这些信息输出是否保留还在考</p>
<p>虑中。&lt;/b&gt;<br />
* @param files 需要修改最后访问时间的文件数组。<br />
* @since 0.1<br />
*/<br />
public static void touch(File[] files) {<br />
for (int i = 0; i &lt; files.length; i ) {<br />
touch(files);<br />
}<br />
}</p>
<p>/**<br />
* 修改文件的最后访问时间。<br />
* 如果文件不存在则创建该文件。<br />
* &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出，这些信息输出是否保留还在考</p>
<p>虑中。&lt;/b&gt;<br />
* @param fileNames 需要修改最后访问时间的文件名数组。<br />
* @since 0.1<br />
*/<br />
public static void touch(String[] fileNames) {<br />
File[] files = new File[fileNames.length];<br />
for (int i = 0; i &lt; fileNames.length; i ) {<br />
files = new File(fileNames);<br />
}<br />
touch(files);<br />
}</p>
<p>/**<br />
* 判断指定的文件是否存在。<br />
* @param fileName 要判断的文件的文件名<br />
* @return 存在时返回true，否则返回false。<br />
* @since 0.1<br />
*/<br />
public static boolean isFileExist(String fileName) {<br />
return new File(fileName).isFile();<br />
}</p>
<p>/**<br />
* 创建指定的目录。<br />
* 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录。<br />
* &lt;b&gt;注意：可能会在返回false的时候创建部分父目录。&lt;/b&gt;<br />
* @param file 要创建的目录<br />
* @return 完全创建成功时返回true，否则返回false。<br />
* @since 0.1<br />
*/<br />
public static boolean makeDirectory(File file) {<br />
File parent = file.getParentFile();<br />
if (parent != null) {<br />
return parent.mkdirs();<br />
}<br />
return false;<br />
}</p>
<p>/**<br />
* 创建指定的目录。<br />
* 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录。<br />
* &lt;b&gt;注意：可能会在返回false的时候创建部分父目录。&lt;/b&gt;<br />
* @param fileName 要创建的目录的目录名<br />
* @return 完全创建成功时返回true，否则返回false。<br />
* @since 0.1<br />
*/<br />
public static boolean makeDirectory(String fileName) {<br />
File file = new File(fileName);<br />
return makeDirectory(file);<br />
}</p>
<p>/**<br />
* 清空指定目录中的文件。<br />
* 这个方法将尽可能删除所有的文件，但是只要有一个文件没有被删除都会返回false。<br />
* 另外这个方法不会迭代删除，即不会删除子目录及其内容。<br />
* @param directory 要清空的目录<br />
* @return 目录下的所有文件都被成功删除时返回true，否则返回false.<br />
* @since 0.1<br />
*/<br />
public static boolean emptyDirectory(File directory) {<br />
boolean result = false;<br />
File[] entries = directory.listFiles();<br />
for (int i = 0; i &lt; entries.length; i ) {<br />
if (!entries.delete()) {<br />
result = false;<br />
}<br />
}<br />
return true;<br />
}</p>
<p>/**<br />
* 清空指定目录中的文件。<br />
* 这个方法将尽可能删除所有的文件，但是只要有一个文件没有被删除都会返回false。<br />
* 另外这个方法不会迭代删除，即不会删除子目录及其内容。<br />
* @param directoryName 要清空的目录的目录名<br />
* @return 目录下的所有文件都被成功删除时返回true，否则返回false。<br />
* @since 0.1<br />
*/<br />
public static boolean emptyDirectory(String directoryName) {<br />
File dir = new File(directoryName);<br />
return emptyDirectory(dir);<br />
}</p>
<p>/**<br />
* 删除指定目录及其中的所有内容。<br />
* @param dirName 要删除的目录的目录名<br />
* @return 删除成功时返回true，否则返回false。<br />
* @since 0.1<br />
*/<br />
public static boolean deleteDirectory(String dirName) {<br />
return deleteDirectory(new File(dirName));<br />
}</p>
<p>/**<br />
* 删除指定目录及其中的所有内容。<br />
* @param dir 要删除的目录<br />
* @return 删除成功时返回true，否则返回false。<br />
* @since 0.1<br />
*/<br />
public static boolean deleteDirectory(File dir) {<br />
if ( (dir == null) || !dir.isDirectory()) {<br />
throw new IllegalArgumentException("Argument " dir <br />
" is not a directory. ");<br />
}</p>
<p>File[] entries = dir.listFiles();<br />
int sz = entries.length;</p>
<p>for (int i = 0; i &lt; sz; i ) {<br />
if (entries.isDirectory()) {<br />
if (!deleteDirectory(entries)) {<br />
return false;<br />
}<br />
}<br />
else {<br />
if (!entries.delete()) {<br />
return false;<br />
}<br />
}<br />
}</p>
<p>if (!dir.delete()) {<br />
return false;<br />
}<br />
return true;<br />
}</p>
<p><br />
/**<br />
* 返回文件的URL地址。<br />
* @param file 文件<br />
* @return 文件对应的的URL地址<br />
* @throws MalformedURLException<br />
* @since 0.4<br />
* @deprecated 在实现的时候没有注意到File类本身带一个toURL方法将文件路径转换为URL。<br />
* 请使用File.toURL方法。<br />
*/<br />
public static URL getURL(File file) throws MalformedURLException {<br />
String fileURL = "file:/" file.getAbsolutePath();<br />
URL url = new URL(fileURL);<br />
return url;<br />
}</p>
<p>/**<br />
* 从文件路径得到文件名。<br />
* @param filePath 文件的路径，可以是相对路径也可以是绝对路径<br />
* @return 对应的文件名<br />
* @since 0.4<br />
*/<br />
public static String getFileName(String filePath) {<br />
File file = new File(filePath);<br />
return file.getName();<br />
}</p>
<p>/**<br />
* 从文件名得到文件绝对路径。<br />
* @param fileName 文件名<br />
* @return 对应的文件路径<br />
* @since 0.4<br />
*/<br />
public static String getFilePath(String fileName) {<br />
File file = new File(fileName);<br />
return file.getAbsolutePath();<br />
}</p>
<p>/**<br />
* 将DOS/Windows格式的路径转换为UNIX/Linux格式的路径。<br />
* 其实就是将路径中的"\"全部换为"/"，因为在某些情况下我们转换为这种方式比较方便，<br />
* 某中程度上说"/"比"\"更适合作为路径分隔符，而且DOS/Windows也将它当作路径分隔符。<br />
* @param filePath 转换前的路径<br />
* @return 转换后的路径<br />
* @since 0.4<br />
*/<br />
public static String toUNIXpath(String filePath) {<br />
return filePath.replace('\\', '/');<br />
}</p>
<p>/**<br />
* 从文件名得到UNIX风格的文件绝对路径。<br />
* @param fileName 文件名<br />
* @return 对应的UNIX风格的文件路径<br />
* @since 0.4<br />
* @see #toUNIXpath(String filePath) toUNIXpath<br />
*/<br />
public static String getUNIXfilePath(String fileName) {<br />
File file = new File(fileName);<br />
return toUNIXpath(file.getAbsolutePath());<br />
}</p>
<p>/**<br />
* 得到文件的类型。<br />
* 实际上就是得到文件名中最后一个&#8220;.&#8221;后面的部分。<br />
* @param fileName 文件名<br />
* @return 文件名中的类型部分<br />
* @since 0.5<br />
*/<br />
public static String getTypePart(String fileName) {<br />
int point = fileName.lastIndexOf('.');<br />
int length = fileName.length();<br />
if (point == -1 || point == length - 1) {<br />
return "";<br />
}<br />
else {<br />
return fileName.substring(point 1, length);<br />
}<br />
}</p>
<p>/**<br />
* 得到文件的类型。<br />
* 实际上就是得到文件名中最后一个&#8220;.&#8221;后面的部分。<br />
* @param file 文件<br />
* @return 文件名中的类型部分<br />
* @since 0.5<br />
*/<br />
public static String getFileType(File file) {<br />
return getTypePart(file.getName());<br />
}</p>
<p>/**<br />
* 得到文件的名字部分。<br />
* 实际上就是路径中的最后一个路径分隔符后的部分。<br />
* @param fileName 文件名<br />
* @return 文件名中的名字部分<br />
* @since 0.5<br />
*/<br />
public static String getNamePart(String fileName) {<br />
int point = getPathLsatIndex(fileName);<br />
int length = fileName.length();<br />
if (point == -1) {<br />
return fileName;<br />
}<br />
else if (point == length - 1) {<br />
int secondPoint = getPathLsatIndex(fileName, point - 1);<br />
if (secondPoint == -1) {<br />
if (length == 1) {<br />
return fileName;<br />
}<br />
else {<br />
return fileName.substring(0, point);<br />
}<br />
}<br />
else {<br />
return fileName.substring(secondPoint 1, point);<br />
}<br />
}<br />
else {<br />
return fileName.substring(point 1);<br />
}<br />
}</p>
<p>/**<br />
* 得到文件名中的父路径部分。<br />
* 对两种路径分隔符都有效。<br />
* 不存在时返回""。<br />
* 如果文件名是以路径分隔符结尾的则不考虑该分隔符，例如"/path/"返回""。<br />
* @param fileName 文件名<br />
* @return 父路径，不存在或者已经是父目录时返回""<br />
* @since 0.5<br />
*/<br />
public static String getPathPart(String fileName) {<br />
int point = getPathLsatIndex(fileName);<br />
int length = fileName.length();<br />
if (point == -1) {<br />
return "";<br />
}<br />
else if (point == length - 1) {<br />
int secondPoint = getPathLsatIndex(fileName, point - 1);<br />
if (secondPoint == -1) {<br />
return "";<br />
}<br />
else {<br />
return fileName.substring(0, secondPoint);<br />
}<br />
}<br />
else {<br />
return fileName.substring(0, point);<br />
}<br />
}</p>
<p>/**<br />
* 得到路径分隔符在文件路径中首次出现的位置。<br />
* 对于DOS或者UNIX风格的分隔符都可以。<br />
* @param fileName 文件路径<br />
* @return 路径分隔符在路径中首次出现的位置，没有出现时返回-1。<br />
* @since 0.5<br />
*/<br />
public static int getPathIndex(String fileName) {<br />
int point = fileName.indexOf('/');<br />
if (point == -1) {<br />
point = fileName.indexOf('\\');<br />
}<br />
return point;<br />
}</p>
<p>/**<br />
* 得到路径分隔符在文件路径中指定位置后首次出现的位置。<br />
* 对于DOS或者UNIX风格的分隔符都可以。<br />
* @param fileName 文件路径<br />
* @param fromIndex 开始查找的位置<br />
* @return 路径分隔符在路径中指定位置后首次出现的位置，没有出现时返回-1。<br />
* @since 0.5<br />
*/<br />
public static int getPathIndex(String fileName, int fromIndex) {<br />
int point = fileName.indexOf('/', fromIndex);<br />
if (point == -1) {<br />
point = fileName.indexOf('\\', fromIndex);<br />
}<br />
return point;<br />
}</p>
<p>/**<br />
* 得到路径分隔符在文件路径中最后出现的位置。<br />
* 对于DOS或者UNIX风格的分隔符都可以。<br />
* @param fileName 文件路径<br />
* @return 路径分隔符在路径中最后出现的位置，没有出现时返回-1。<br />
* @since 0.5<br />
*/<br />
public static int getPathLsatIndex(String fileName) {<br />
int point = fileName.lastIndexOf('/');<br />
if (point == -1) {<br />
point = fileName.lastIndexOf('\\');<br />
}<br />
return point;<br />
}</p>
<p>/**<br />
* 得到路径分隔符在文件路径中指定位置前最后出现的位置。<br />
* 对于DOS或者UNIX风格的分隔符都可以。<br />
* @param fileName 文件路径<br />
* @param fromIndex 开始查找的位置<br />
* @return 路径分隔符在路径中指定位置前最后出现的位置，没有出现时返回-1。<br />
* @since 0.5<br />
*/<br />
public static int getPathLsatIndex(String fileName, int fromIndex) {<br />
int point = fileName.lastIndexOf('/', fromIndex);<br />
if (point == -1) {<br />
point = fileName.lastIndexOf('\\', fromIndex);<br />
}<br />
return point;<br />
}</p>
<p>/**<br />
* 将文件名中的类型部分去掉。<br />
* @param filename 文件名<br />
* @return 去掉类型部分的结果<br />
* @since 0.5<br />
*/<br />
public static String trimType(String filename) {<br />
int index = filename.lastIndexOf(".");<br />
if (index != -1) {<br />
return filename.substring(0, index);<br />
}<br />
else {<br />
return filename;<br />
}<br />
}<br />
/**<br />
* 得到相对路径。<br />
* 文件名不是目录名的子节点时返回文件名。<br />
* @param pathName 目录名<br />
* @param fileName 文件名<br />
* @return 得到文件名相对于目录名的相对路径，目录下不存在该文件时返回文件名<br />
* @since 0.5<br />
*/<br />
public static String getSubpath(String pathName,String fileName) {<br />
int index = fileName.indexOf(pathName);<br />
if (index != -1) {<br />
return fileName.substring(index pathName.length() 1);<br />
}<br />
else {<br />
return fileName;<br />
}<br />
}</p>
<p>}<br />
4.遗留问题</p>
<p>目前new FileInputStream()只会使用绝对路径，相对没用过，因为要相对于web服务器地址，比较麻烦</p>
<p>还不如写个配置文件来的快哪</p>
<p>5.按Java文件类型分类读取配置文件</p>
<p>配 置文件是应用系统中不可缺少的，可以增加程序的灵活性。java.util.Properties是从jdk1.2就有的类，一直到现在都支持load ()方法，jdk1.4以后save(output,string) -&gt;store(output,string)。如果只是单纯的读，根本不存在烦恼的问题。web层可以通过 Thread.currentThread().getContextClassLoader().<br />
getResourceAsStream("xx.properties") 获取；Application可以通过new FileInputStream("xx.properties");直接在classes一级获取。关键是有时我们需要通过web修改配置文件，我们不 能将路径写死了。经过测试觉得有以下心得：</p>
<p>1.servlet中读写。如果运用Struts 或者Servlet可以直接在初始化参数中配置，调用时根据servlet的getRealPath("/")获取真实路径，再根据String file = this.servlet.getInitParameter("abc");获取相对的WEB-INF的相对路径。<br />
例：<br />
InputStream input = Thread.currentThread().getContextClassLoader().<br />
getResourceAsStream("abc.properties");<br />
Properties prop = new Properties();<br />
prop.load(input);<br />
input.close();<br />
OutputStream out = new FileOutputStream(path);<br />
prop.setProperty("abc", &#8220;test");<br />
prop.store(out, &#8220;&#8211;test&#8211;");<br />
out.close();</p>
<p>2.直接在jsp中操作，通过jsp内置对象获取可操作的绝对地址。<br />
例：<br />
// jsp页面<br />
String path = pageContext.getServletContext().getRealPath("/");<br />
String realPath = path "/WEB-INF/classes/abc.properties";</p>
<p>//java 程序<br />
InputStream in = getClass().getClassLoader().getResourceAsStream("abc.properties"); // abc.properties放在webroot/WEB-INF/classes/目录下<br />
prop.load(in);<br />
in.close();</p>
<p>OutputStream out = new FileOutputStream(path); // path为通过页面传入的路径<br />
prop.setProperty("abc", &#8220;abcccccc");<br />
prop.store(out, &#8220;&#8211;test&#8211;");<br />
out.close();</p>
<p>3.只通过Java程序操作资源文件<br />
InputStream in = new FileInputStream("abc.properties"); // 放在classes同级</p>
<p>OutputStream out = new FileOutputStream("abc.properties"); </p>
<p>&nbsp;</p>
<p>/**<br />
&nbsp;&nbsp;&nbsp; * 获取一个类的class文件所在的绝对路径。 这个类可以是JDK自身的类，也可以是用户自定义的类，或者是第三方开发包里的类。<br />
&nbsp;&nbsp;&nbsp; * 只要是在本程序中可以被加载的类，都可以定位到它的class文件的绝对路径。<br />
&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp; * @param cls<br />
&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个对象的Class属性<br />
&nbsp;&nbsp;&nbsp; * @return 这个类的class文件位置的绝对路径。 如果没有这个类的定义，则返回null。<br />
&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp; public String getPathFromClass(Class cls) throws IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp; String path = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp; if (cls == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new NullPointerException();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; URL url = getClassLocationURL(cls);<br />
&nbsp;&nbsp;&nbsp;&nbsp; if (url != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path = url.getPath();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ("jar".equalsIgnoreCase(url.getProtocol())) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path = new URL(path).getPath();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (MalformedURLException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int location = path.indexOf("!/");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (location != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path = path.substring(0, location);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File file = new File(path);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path = file.getCanonicalPath();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; return path;<br />
&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; /**<br />
* 获取类的class文件位置的URL。这个方法是本类最基础的方法，供其它方法调用。<br />
*/<br />
private URL getClassLocationURL(final Class cls) {<br />
&nbsp;&nbsp; if (cls == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalArgumentException("class that input is null");<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; URL result = null;<br />
&nbsp;&nbsp; final String clsAsResource = cls.getName().replace('.', '/').concat(".class");<br />
&nbsp;&nbsp; final ProtectionDomain pd = cls.getProtectionDomain();<br />
&nbsp;&nbsp; if (pd != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; final CodeSource cs = pd.getCodeSource();<br />
&nbsp;&nbsp;&nbsp;&nbsp; if (cs != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = cs.getLocation();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; if (result != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ("file".equals(result.getProtocol())) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (result.toExternalForm().endsWith(".jar")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || result.toExternalForm().endsWith(".zip")) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = new URL("jar:".concat(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.toExternalForm()).concat("!/")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .concat(clsAsResource));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (new File(result.getFile()).isDirectory()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = new URL(result, clsAsResource);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (MalformedURLException ignore) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; if (result == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; final ClassLoader clsLoader = cls.getClassLoader();<br />
&nbsp;&nbsp;&nbsp;&nbsp; result = clsLoader != null ? clsLoader.getResource(clsAsResource)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : ClassLoader.getSystemResource(clsAsResource);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; return result;<br />
}</p>
<img src ="http://www.blogjava.net/i369/aggbug/182041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-02-25 16:56 <a href="http://www.blogjava.net/i369/articles/182041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java类序列化成xml 方法[转]</title><link>http://www.blogjava.net/i369/articles/176896.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 22 Jan 2008 01:01:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/176896.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/176896.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/176896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/176896.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/176896.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天看了下JAVA序列化。还是一知半解。怎么也没有弄明白，怎么序列化成XML文件。处入半解状态。在网上找了很多，大部分是理论上的。没有实际的例子。功夫不负有心人，终于找到了。做了下测试终于成功。忍不住记录的下来。&nbsp;&nbsp;&nbsp; JXmlSerializable&nbsp;&nbsp; 是一个利用java反射，通过调用对象中所有以get（不区分大小写)开头的方法除去getC...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/176896.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/176896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-01-22 09:01 <a href="http://www.blogjava.net/i369/articles/176896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从java jar文件包中读资源的常用方法</title><link>http://www.blogjava.net/i369/articles/168819.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Wed, 19 Dec 2007 10:08:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/168819.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/168819.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/168819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/168819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/168819.html</trackback:ping><description><![CDATA[可能有不少初学者会有这样的困惑（以前我也有过）：在你的代码里调用了一些资源文件，如图片，音乐等，在调试环境或单独运行的时候可以正常显示或播放，而一旦打包到jar文件中，这些东东就再也出不来了，除非把这个jar放到原来未打包以前的目录下，但通常jar是单独发布的。这里介绍一个解决这类问题的方法。<br />
getResource和getResourceAsStream<br />
&nbsp;&nbsp;&nbsp;&nbsp;问题的根源还是在于老生常谈的所谓class path，不信的话你在系统环境变量里的ClassPath加上你的jar文件，这下你就看得到你的图片了！但单独发布jar的话不可能指望每次都让用户为你的jar而专门修改classpath。那么有没有什么办法一劳永逸地搞定它呢？我们需要从类的装载入手。先扯远一点，在开发JSP之类的Web应用程序的时候要用到第三方的库怎么办？通常的做法是把这些库（可以是class，也可以是jar）统统放到WEB-INF/lib/目录下面，为什么这样系统就认了呢？因为Web容器（譬如Tomcat）在装载类的时候有自己的组织方式（可以参考Tomcat手册http://jakarta.apache.org/tomcat/tomcat-4.1-doc/class-loader-howto.html）。特别地，jar也是类装载器的一个可访问媒介，ClassLoader提供了两个方法用于从装载的类路径中取得资源：<br />
public URL getResource(String name);<br />
public InputStream getResourceAsStream(String name);<br />
这里name是资源的类路径，它是相对与&#8220;/&#8221;根路径下的位置。getResource得到的是一个URL对象来定位资源，而getResourceAsStream取得该资源输入流的引用保证程序可以从正确的位置抽取数据。<br />
真正使用的不是ClassLoader的这两个方法，而是Class的getResource和getResourceAsStream方法，因为Class对象可以从你的类得到（如YourClass.class或YourClass.getClass()），而ClassLoader则需要再调用一次YourClass.getClassLoader()方法，但根据JDK文档的说法，Class对象的这两个方法其实是&#8220;委托&#8221;（delegate）给装载它的ClassLoader来做的，所以只需要使用Class对象的这两个方法就可以了。<br />
在参考资料中有一篇老外写的文章比较深入介绍了从jar中装载资源的方法。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;一个应用的例子<br />
<br />
以下是在我写的一个小工具MSNHistoryCombiner中用到的一段代码，可以从jar中装载图片和文本信息。譬如，你的jar中根目录下有个img目录，里面放有一些图片，如img1.jpg，你可以这样调用<br />
Utilities.getImageFromJar("/img/img1.jpg", YourClass.class);<br />
注意必须这里是&#8220;/img/img1.jpg&#8221;而非&#8220;img/img1.jpg&#8221;。从jar中读文本资源也是类似方法调用getTextFromJar。<br />
需要说明的是，这段代码也不是我原创的，是从一段别的代码中经过修改得到的，但原代码的来源忘记了，在这里向原作者表示感谢和歉意。<br />
<br />
import java.awt.Image;<br />
import java.awt.Toolkit;<br />
import java.io.*;<br />
<br />
public class ResourseReader {<br />
<br />
public ResourseReader() {<br />
}<br />
<br />
public static Image getImageFromJar(String s, Class class1) {<br />
Image image = null;<br />
InputStream inputstream = class1.getResourceAsStream(s);<br />
if(inputstream != null) {<br />
ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream();<br />
try {<br />
byte abyte0[] = new byte[1024];<br />
for(int i = 0; (i = inputstream.read(abyte0)) &gt;= 0;) {<br />
bytearrayoutputstream.write(abyte0, 0, i);<br />
}<br />
<br />
image = Toolkit.getDefaultToolkit().createImage(bytearrayoutputstream.toByteArray());<br />
}<br />
catch(IOException ioexception) {<br />
ioexception.printStackTrace();<br />
}<br />
}<br />
return image;<br />
}<br />
<br />
public static String getTextFromJar(String s, Class class1) {<br />
String s1 = "";<br />
InputStream inputstream = class1.getResourceAsStream(s);<br />
if(inputstream != null) {<br />
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(inputstream));<br />
String s2;<br />
try {<br />
while((s2 = bufferedreader.readLine()) != null) {<br />
s1 = s1 + s2 + "\n";<br />
}<br />
}<br />
catch(IOException ioexception) {<br />
ioexception.printStackTrace();<br />
}<br />
}<br />
return s1;<br />
}<br />
}<br />
<br />
<br />
从Jar中读取gif文件<br />
<br />
<br />
在Java的程序发布中，很多人会选择采用二进制的jar的格式进行发布，怎么样读取Jar里面的资源呢？<br />
主要是采用ClassLoader的下面几个方法来实现：<br />
public URL getResource(String name)；<br />
public InputStream getResourceAsStream(String name)<br />
<br />
public static InputStream getSystemResourceAsStream(String name)<br />
public static URL getSystemResource(String name)<br />
<br />
后两个方法可以看出是静态的方法，这几个方法都可以从Jar中读取图片资源，但是对与动画的gif文件，笔者在尝试过程中发现，存在一些差异。<br />
<br />
String gifName为Gif文件在Jar中的相对路径。<br />
(1)使用了两个静态方法<br />
BufferedImage image=ImageIO.read（ClassLoader.getSystemResourceAsStream(gifName));<br />
<br />
或者<br />
<br />
Image image=Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource(gifName));<br />
<br />
这两种方式可以成功地读取gif文件，但是对于gif动画，显示出来地是静态的。<br />
<br />
(2)使用其他两个方法<br />
Image image=Toolkit.getDefaultToolkit().getImage(this.getClass.getClassLoader().getResource(gifName));<br />
<br />
再这种方式下动画可以正常显示了。
<img src ="http://www.blogjava.net/i369/aggbug/168819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-12-19 18:08 <a href="http://www.blogjava.net/i369/articles/168819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Ajax的应用程序架构汇总</title><link>http://www.blogjava.net/i369/articles/167182.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Wed, 12 Dec 2007 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/167182.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/167182.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/167182.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/167182.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/167182.html</trackback:ping><description><![CDATA[<p>浏览器端框架被划分成两大类：
<p>&#183;应用程序框架：提供浏览器的功能，但是常以包括窗口小部件抽象和另外的部件而出名，其功能主要围绕桌面GUI框架。
<p>&#183;基本结构框架：提供基本的管道和可移植的浏览器抽象，让<a href="http://www.cn-java.com/"><u><strong>开发</strong></u></a>者去创建内容。典型的功能：
<p>* 针对XMLHttpRequest的包装器以封装浏览器-服务器的交互。(所有的框架都提供这一功能)。
<p>* XML操作和查询。
<p>* 根据来自XMLHttpRequest的应答执行DOM操作。
<p>* 在一些情况中，与另外的浏览器端技术如Flash(和潜在的Java applets)集成在一起。
<p>而服务器端框架通常以下面两种方式工作(尽管它们在这里根据语言的不同进行了分类)：
<p>&#183;HTML/JS生成：服务器提供完整的HTML/Javascript代码生成和浏览器-服务器协调，结果是只有浏览器端编码可以被定制。
<p>&#183;远程调用：Javascript调用直接被路由到服务器端功能(例如Java方法)并返回到Javascript回叫处理器；或者Javascript调用服务器以提取信息，例如会话细节，数据库查询等。
<p>&#183;纯Javascript：应用程序框架
<p><strong>1.1 Bindows(自从2003年)</strong>
<p>网址是：<a href="http://www.bindows.net/">http://www.bindows.net</a>，Bindows是一个软件开发包(SDK)，它，通过强力联合DHTML，JavaScript，CSS和XML等技术，能生成高度交互的互联网应用程序-成为现代的桌面应用程序的强有力对手。Bindows应用程序不要求下载和也不需要在<a href="http://www.cn-java.com/"><u><strong>用户</strong></u></a>端安装-仅要求有一个浏览器(也不需要Java，Flash或者ActiveX)。Bindows有可能领导面向对象开发的<a href="http://www.cn-java.com/"><u><strong>AJAX</strong></u></a>应用程序的平台。<br />
&#183;它是商业化的，使用来自于MB的技术(总部位于GA USA，主要开发中心在瑞典，成立于2002年)。<br />
Bindows框架提供给你：
<p>&#183;基于类的面向对象的API
<p>&#183;一套完整的窗口系统，提供宽范围的窗口小部件支持，包括菜单、表单、格子、滑动条、量程，甚至更多
<p>&#183;用于开发zero-footprint <a href="http://www.cn-java.com/"><u><strong>SOA</strong></u></a>客户端应用程序的领先的工具箱
<p>&#183;本机的XML，SOAP和XML-RPC支持
<p>&#183;单用户到企业级的支持
<p>&#183;内建的对AJAX的支持<br />
Bindows开发环境：
<p>&#183;支持企业级规模的工程开发
<p>&#183;跨浏览器，跨平台支持
<p>&#183;服务器独立结构
<p>&#183;与新的和现有资源的互操作性
<p>&#183;一致性开发方法学<br />
<strong>1.2 BackBase(自从2003年)</strong>
<p>网址是：<a href="http://www.backbase.com/">http://www.backbase.com</a>，是一个全面的浏览器端框架，支持丰富的浏览器功能以及与.NET和Java的集成。
<p>&#183;商业化，来自于Backbase B.V(总部在Amsterdam，成立于2003年)。
<p><strong>1.3 DOJO(开发中;自从2004年9月)</strong>
<p>网址是：<a href="http://dojotoolkit.org/">http://dojotoolkit.org/</a>，提供全面窗口小组件和浏览器-服务器消息支持。
<p>&#183;为创建定制的Javascript窗口小组件提供框架支持。
<p>&#183;预置的窗口小组件库。
<p>&#183;浏览器-服务器消息支持-XMLHttpRequest和另外的机制。
<p>&#183;支持浏览器中的URL操纵功能。
<p>&#183;<a href="http://www.cn-java.com/"><u><strong>开源</strong></u></a>许可(学术自由许可2.1(<a href="http://opensource.org/licenses/afl-2.1.php">http://opensource.org/licenses/afl-2.1.php</a>))，由JotSpot(http://www.jot.com/)的Alex Russell(<a href="http://alex.dojotoolkit.org/">http://alex.dojotoolkit.org/</a>)所领导。
<p><strong>1.4 Open Rico(开发中;自从2005年5月;基于早期的私有框架)</strong>
<p>网址是：<a href="http://openrico.org/demos.page">http://openrico.org/demos.page</a>，是一多用途框架，支持Ajax基础结构和用户交互。
<p>&#183;一个XMLHttpRequest应答能被路由到一个或者更多回叫操作，DOM对象，或者Javascript对象。
<p>&#183;容易鼠标拖动支持。
<p>&#183;Ajax动画，例如缩放和变换。
<p>&#183;"行为"-实质上是窗口小组件库。
<p>&#183;使用指南(<a href="http://www.mirimar.net/mailbrowser/">http://www.mirimar.net/mailbrowser/</a>)，由RussMirimar的Yonah所提供
<p>&#183;开源。源于Sabre航空公司解决方案，由Bill Scott(http://looksgoodworkswell.blogspot.com)，Darren James及另外一些人所支持。
<p><strong>1.5 qooxdoo(开发中;自从2005年5月)</strong>
<p>网址是：<a href="http://qooxdoo.sourceforge.net/">http://qooxdoo.sourceforge.net/</a>，是另一个雄心勃勃的框架，提供宽范围的UI支持和正在开发中的<a href="http://www.cn-java.com/"><u><strong>基础</strong></u></a>结构特性。
<p>&#183;基础结构：
<p>* DOM和事件/焦点管理的可移植的抽象。
<p>* 调试支持。
<p>* 易于时间调度的Timer类。
<p>* Getter/Setter支持。
<p>&#183;UI：
<p>* 窗口小组件框架和预置的窗口小组件库。<br />
* 布局管理器。
<p>* 图像缓冲和可移植的PNG透明性。
<p>&#183;开源(LGPL)。来自多方面的贡献者。
<p><strong>1.6 Tibet(开发中;自从2005年6月)</strong>
<p>网址是：<a href="http://www.technicalpursuit.com/">http://www.technicalpursuit.com/</a>，目的是提供高度可移植的和全面的Javascript. API，结果是，可能自动生成大量的客户端代码。自称是"企业级Ajax"。
<p>&#183;远程脚本运行在XMLHttpRequest包装之上-通过协调调用结果支持工作流管理，例如应答可以发生在只有当两个分离的调用返回时。
<p>&#183;URI支持。
<p>&#183;所有的HTTP方法-不仅是"GET"和"POST"。
<p>&#183;低级的协议-File://和WebDav以及HTTP。
<p>&#183;Web服务调用-SOAP，XML-RPC，等等。
<p>&#183;预置的针对Google API，Amazon API等等服务的支持。
<p>&#183;由高级Javascript对象组成一个巨大的库。
<p>&#183;许多XML操作。
<p>&#183;<a href="http://www.cn-java.com/"><u><strong>IDE</strong></u></a>和开发工具。
<p>&#183;开源许可(显然经过OSI认证，但是细节不多)。
<p><strong>2 纯Javascript：基础结构框架</strong>
<p><strong>2.1 AjaxCaller(Alpha版本;自从5月2005年)</strong>
<p>网址是：<a href="http://ajaxify.com/run/testAjaxCaller/">http://ajaxify.com/run/testAjaxCaller/</a>，是一基本的<a href="http://www.cn-java.com/"><u><strong>线程</strong></u></a>安全的XMLHttpRequest包装器，主要针对Ajax新手，仍处于原始的alpha开发阶段，目前仅与AjaxPatterns的在线搜索范例一起打包。
<p>&#183;实现对服务器的调用(GET/POST/PUT/DELETE)，用路由到一个回叫操作的plain-text或者XML完成。
<p>&#183;使用过的XMLHttpRequest对象的析构。
<p>&#183;Response缓冲(计划的)。
<p>&#183;针对Ajax新手-并非强调性能优化，该库主要用于实现易读的基础代码并将提供调试支持。
<p>&#183;开源许可。由Michael Mahemoff(http://softwareas.com)(具有John Wehr和Richard Schwartz的一些思想)维护。
<p><strong>2.2 Flash JavaScript集成包</strong>
<p>网址是：<a href="http://www.osflash.org/doku.php?id=flashjs">http://www.osflash.org/doku.php?id=flashjs</a>，允许JavaScript和Flash内容的集成：
<p>&#183;使JavaScript能够调用ActionScript功能和反过来的实现。
<p>&#183;所有主要的数据类型能在这两种环境之间传递。
<p>&#183;开源许可。由多个开源Flash贡献者提供支持。
<p><strong>2.3 Google AJAXSLT(发行于2005年6月)</strong>
<p>网址是：<a href="http://goog-ajaxslt.sourceforge.net/">http://goog-ajaxslt.sourceforge.net/</a>，是一个Javascript框架，用来执行XSLT转换以及XPath查询。
<p>&#183;建立在Google地图工作基础之上。
<p>&#183;开源许可(BSD)。由一家创新搜索方案公司支持，自称为"Google"。
<p><strong>2.4 HTMLHttpRequest(Beta版；始于2005年)</strong>
<p>HtmlHttpRequest(<a href="http://www.twinhelix.com/javascript/htmlhttprequest/">http://www.twinhelix.com/javascript/htmlhttprequest/</a>)，它使用了XMLHttpRequest和Iframes以改进兼容性。
<p>&#183;测试过并能工作在:IE6/Win，IE5.5/Win，IE5/Win，IE4/Win，Mozilla/Win，Opera7/Win，Safari/Mac，IE5/Mac。
<p>&#183;未测试，可能能工作在：IE4/Mac，Mozilla/Mac，Opera/Other，Konqueror/Linux。你正在使用这些之一吗？作者正在请求兼容性信息。
<p>&#183;开源许可(LGPL)。由Twin Helix Designs(http://www.twinhelix.com/)的Angus Turnbull维护。
<p><strong>2.5 交互式网站框架(自从2005年5月)</strong>
<p>交互式网站框架(<a href="http://sourceforge.net/projects/iwf/">http://sourceforge.net/projects/iwf/</a>，是一个项目，目的是从浏览器端对Ajax基础结构的多方面予以支持。自描述为"使用javascript，css，xml，和html来创造高度交互网站的框架。包括一个定制的针对高度可读的javascript的xml分析器。实质上，是建立基于AJAX的网站的基础，还有另外一些通用脚本"。
<p>&#183;线程安全的XMLHttpRequest实现。
<p>&#183;针对XML文档的包装器，以便你能够创建更具可读性的代码：
<p>var node = doc.groceries.frozen[0].pizza[0].size;&lt;/pre&gt;
<p>代替手工的导航：
<p>var node = doc.documentElement.firstChild.firstChild.getAttribute("size");&lt;/pre&gt;
<p>&#183;开源许可。由Weaver(<a href="http://circaware.com|brock/">http://circaware.com|Brock</a>)维护。
<p><strong>2.6 LibXMLHttpRequest(发行于2003年6月)</strong>
<p>libXmlRequest(<a href="http://www.whitefrost.com/servlet/connector?file=reference/2003/06/17/libXmlRequest.html">http://www.whitefrost.com/servlet/connector?file=reference/2003/06/17/libXmlRequest.html</a>)，是XMLHttpRequest的一个瘦包装器。
<p>&#183;getXML()和postXML()方法。
<p>&#183;XMLHttpRequest对象池支持。
<p>&#183;Response缓冲。
<p>&#183;可用源码(明显)，但是受标准版权的保护，由Stephen W.Coate(<a href="http://www.whitefrost.com/index.jsp">http://www.whitefrost.com/index.jsp</a>)所维护。
<p><strong>2.7 RSLite(x)</strong>
<p>网站是：<a href="http://www.ashleyit.com/rs/main.htm">http://www.ashleyit.com/rs/main.htm</a>，是一个针对XMLHttpRequest的瘦包装器。
<p>&#183;一个简单的组件，作为Brent Ashley的更全面的远程脚本工作(参见Javascript远程脚本-JSRS在多语言服务器端)的一部分发行。
<p><strong>2.8 Sack(在开发中，自从2005年5月)</strong>
<p>网站是：<a href="http://twilightuniverse.com/2005/05/sack-of-ajax/">http://twilightuniverse.com/2005/05/sack-of-ajax/</a>，是一个针对XMLHttpRequest的瘦包装器。
<p>&#183;调用者能指定回叫函数或者回叫DOM对象。借助于回叫DOM，应答文本直接被推入到DOM中
<p><strong>2.9 Sarissa(发行于2月，2003年)</strong>
<p>网站是：<a href="http://sarissa.sf.net/">http://sarissa.sf.net</a>，是一种Javascript. API，它封装了在浏览器端可以独立调用XML的功能。
<p>&#183;可移植的XMLHttpRequest创建
<p>&#183;可移植的XPath查询
<p>&#183;可移植的DOM操作
<p>&#183;可移植的XSLT
<p>&#183;可移植的XML串行化
<p>&#183;开源(GPL2.0和LGPL2.1)。来自多方面贡献者。
<p><strong>2.10 XHConn(发行于自从4月，2005年)</strong>
<p>网站是：<a href="http://xkr.us/code/javascript/XHConn/">http://xkr.us/code/javascript/XHConn/</a>，是一个对XMLHttpRequest的瘦包装器。
<p>&#183;例如
<p>new XHConn().connect("mypage.php"，"POST"，"foo=bar&amp;baz=qux"，fnWhenDone);
<p>&#183;开源许可。由Brad Fults所维护。
<p><strong>3 服务器端：多种语言</strong>
<p><strong>3.1 跨平台异步的接口工具箱(5月2005年)</strong>
<p>CPAINT：<a href="http://cpaint.sourceforge.net/">http://cpaint.sourceforge.net/</a>，是一真正的支持PHP和ASP/Vbscript的Ajax实现和JSRS(JavaScript远程脚本)实现。CPAINT提供给你需求的代码在后台实现AJAX和JSRS，而返回的数据以JavaScript形式在前台操作，格式化和显示。这允许你创建能提供接近实时的反馈给用户的web应用程序。
<p>&#183;支持PHP&amp;ASP
<p>&#183;针对所有函数的一致的JavaScript文件
<p>&#183;支持远程脚本和XML
<p>&#183;支持本地和远程函数
<p>&#183;单个或者多个XMLHTTP对象
<p>&#183;以文本或者JavaScript. XML/DOM文档对象方式返回后台数据
<p>&#183;能支持POST和GET请求
<p>&#183;后台代理函数来访问远程函数和数据
<p>&#183;在所有的主要浏览器上测试过
<p>&#183;在GNU GPL&amp;LGPL保护下发行
<p><strong>3.2 SAJAX(可用，但是不是1.0版本;自从3月2005年)</strong>
<p>网站是：<a href="http://www.modernmethod.com/sajax/">http://www.modernmethod.com/sajax/</a>，直接把调用从Javascript发送到你的服务器端语言并再次回返。例如，调用一个javascript方法x_calculateBudget()，将先到达服务器和调用一个Java calculateBudget()方法，然后以javascript方式把值返回到x_calculateBudget_cb()。
<p>&#183;便利从Javascript代理函数到后台操作的映射。
<p>&#183;能够代理对众多服务器端平台（ASP/ColdFusion/Io/Lua/Perl/PHP/Python/Ruby）的调用。
<p>&#183;开源许可。来自多方面贡献者。
<p><strong>3.3 Javascipt对象标志(JSON)和JSON-RPC</strong>
<p>JSON(<a href="http://www.crockford.com/JSON/index.html">http://www.crockford.com/JSON/index.html</a>)，是一个"胖的自由的XML选择"，而JSON-RPC(<a href="http://www.json-rpc.org/">http://www.json-rpc.org/</a>)是一种远程过程协议，类似于XML-RPC，强有力支持Javascript客户。
<p>&#183;实现多服务器端平台(<a href="http://www.json-rpc.org/impl.xhtml">http://www.json-rpc.org/impl.xhtml</a>)：Java，Python，Ruby，Perl。
<p>&#183;针对每种平台有独立的打包和许可，如JSON-RPC-Java(<a href="http://oss.metaparadigm.com/jsonrpc/">http://oss.metaparadigm.com/jsonrpc/</a>)。
<p><strong>3.4 Javascript远程脚本(JSRS)(自从2000年)</strong>
<p>网址是：<a href="http://www.ashleyit.com/rs/jsrs/test.htm">http://www.ashleyit.com/rs/jsrs/test.htm</a>，直接把调用从Javascript发送到你的服务器端语言并再次回返。
<p>&#183;知名的浏览器：IE4+，NS4.x，NS6.x，Mozilla，Opera7和Galeon。
<p>&#183;服务器端支持：ASP，ColdFusion，PerlCGI，PHP,Python和JSP(servlet)。
<p>&#183;开源许可。由Brent Ashley(<a href="http://www.ashleyit.com/">http://www.ashleyit.com/</a>)提供支持。
<p><strong>4 服务器端：Java<br />
</strong><br />
注意：许多现有的框架最近正在添加Java支持(例如<a href="http://www.cn-java.com/"><u><strong>struts</strong></u></a>)，我将在后面指出。
<p><strong>4.1 WebORB for Java(自从2005年8月)</strong>
<p>网址：<a href="http://www.themidnightcoders.com/weborb/aboutWeborb.htm">http://www.themidnightcoders.com/weborb/aboutWeborb.htm</a>，是一个平台，支持开发AJAX和基于Flash的胖客户端应用程序，并可以把它们与Java对象和XML Web服务相系起来。在线举例(http：//www.themidnightcoders.com/examples)
<p>&#183;WebORB包括一个称作丰富的客户系统(<a href="http://www.themidnightcoders.com/rcs/index.htm">http://www.themidnightcoders.com/rcs/index.htm</a>)的客户端库。该丰富的客户系统提供一简单的在线api来绑定到并调用任何Java对象，XML Web服务或者<a href="http://www.cn-java.com/"><u><strong>EJB</strong></u></a>上的方法。
<p>&#183;支持同步的和异步的方法调用。
<p>&#183;并不要求在服务器端代码上作任何修改，不需要定制方法属性，特别的签名或者参数类型。★不要求设计时生成代理。
<p>&#183;同步调用返回来自于该调用(不需要回叫)的数据。异步的调用依赖于一个回叫实现。
<p>&#183;任何服务器端方法能被同步地或者异步地调用。
<p>&#183;客户应用程序能向服务器对象请求指定的活动方式。结果，对象能被轻易地创建而不需任何特殊的编程。
<p>&#183;提供一个特定API来处理数据库查询结果-服务器代码能返回Data集合或者Data表，而客户端以一个特殊RecordSet JavaScript对象来显示这个结果。该对象提供一个方法以检索列名和行数据。
<p>&#183;支持数据分页技术。客户应用程序能检索页面中的数据。
<p>&#183;支持所有的服务器端参数类型并返回值-原型，字符串，复合类型，数组，本机.net集合，远程参考。
<p>&#183;共有两种版本可用：标准版(自由)和专业版(商业许可)
<p><strong>4.2 Echo 2(自从3月2005年)</strong>
<p>网址是：<a href="http://www.nextapp.com/products/echo2/">http://www.nextapp.com/products/echo2/</a>，允许你用纯Java代码编写Ajax应用软件(范例(<a href="http://demo.nextapp.com/InteractiveTest/ia">http://demo.nextapp.com/InteractiveTest/ia</a>))。
<p>自动地生成HTML和Javascript。
<p>&#183;协调浏览器和服务器之间的消息。消息形式为XML。
<p>&#183;如果需要，可以手工编写定制的Javascript部件。
<p>&#183;开源许可(Mozilla公共许可或者GNU LGPL)。源于Next App,Inc.(<a href="http://www.nextapp.com/">http://www.nextapp.com/</a>)。
<p><strong>4.3 Direct Web Remoting (DWR)(2005年)</strong>
<p>网址是：<a href="http://www.getahead.ltd.uk/dwr/">http://www.getahead.ltd.uk/dwr/</a>，是一个框架，用于直接从Javascript代码中调用Java方法。
<p>&#183;象SAJAX，能把Javascript中的调用传递到Java方法，并返回到Javascript回叫。
<p>&#183;能与任何web框架（Struts，Tapestry，等等）一起使用。
<p>&#183;开源许可(Apache(<a href="http://www.apache.org/LICENSE.txt">http://www.apache.org/LICENSE.txt</a>))。由Joe Walker(http://www.getahead.ltd.uk/sg/space/joe/)所支持。被加入到WebWork(<a href="http://www.opensymphony.com/webwork/">http://www.opensymphony.com/webwork/</a>)版本。
<p><strong>4.4 SWATO(2005年)</strong>
<p>网址是：<a href="http://swato.dev.java.net/">http://swato.dev.java.net/</a>，是一套可重用的和良好集成的Java/JavaScript库，它实现了一种更容易的方式来改变你的web应用程序的交互，它是通过AJAX方式实现。
<p>&#183;服务器端Java库能被容易地配置到所有的Servlet 2.3+匹配的容器中。
<p>&#183;客户端JavaScript库能工作在支持HttpXMLRequest的各种浏览器中。
<p>&#183;使用JSON来在服务器端编组你的POJO数据。这样你能存取在任何JavaScript环境(HTML，XUL，SVG)中的远程数据，这种存取可以容易地通过硬编码或者与某种成熟的JavaScript库集成来实现。
<p>&#183;提供一个简单的接口来使你的JavaScript代码可以与暴露在客户端的远程POJO交互(RPC等)。
<p>&#183;使用web.xml中的&lt;servlet&gt;和&lt;filter&gt;的容易且灵活的配置，并能(但不是依赖)与<a href="http://www.cn-java.com/"><u><strong>Spring</strong></u></a>集成到一起。
<p>&#183;提供了几个可帮助你快速开发web应用程序的组件(如自动完成的文本框，在线表单，在线列表，等等)。
<p><strong>5 服务器端：Lisp</strong>
<p><strong>5.1 CL-Ajax</strong>
<p>网址：<a href="http://cliki.net/cl-ajax">http://cliki.net/cl-ajax</a>，实现Javascript直接调用服务器端Lisp函数。
<p>&#183;如下输出函数：
<p>(export-函数 #&#8217;my-函数)
<p>&#183;可以产生带有参数的Javascript代理。
<p>&#183;能回叫Javascript函数或者DOM对象。
<p>&#183;可以被集成进SAJAX。
<p>&#183;开源(定制，非常灵活，许可)。由[Richard Newman](<a href="http://www.holygoat.co.uk/">http://www.holygoat.co.uk/</a>)所维护。
<p><strong>6 服务器端：.NET</strong>
<p><strong>6.1 WebORB for.NET(自从8月2005年)</strong>
<p>网址：<a href="http://www.themidnightcoders.com/weborb/aboutWeborb.htm">http://www.themidnightcoders.com/weborb/aboutWeborb.htm</a>，是一个平台，用于开发AJAX和基于Flash的胖客户端应用程序，并能把它们连接到.NET对象和XML Web服务。(在线举例(<a href="http://www.themidnightcoders.com/examples">http://www.themidnightcoders.com/examples</a>))
<p>&#183;WebORB包括一个客户端库，名叫Rich Client System(http://www.themidnightcoders.com/rcs/index.htm)。Rich Client System提供一简单的在线api以绑定到和调用任何.NET对象或者XML Web服务上的任何方法。
<p>&#183;支持同步和异步的方法调用
<p>&#183;并不要求在服务器端代码上作任何修改，不需要定制方法属性，特别的签名或者参数类型。**不要求设计时代理生成。
<p>&#183;同步调用返回来自于该调用的数据(不需要回叫)。异步的调用依赖于一个回叫实现。
<p>&#183;任何服务器端方法能被同步地或者异步地调用。
<p>&#183;客户应用程序能向服务器对象请求指定的活动方式。结果，对象能被轻易地创建而不需任何特殊的编程。
<p>&#183;提供一个特定API来处理数据库查询结果-服务器代码能返回DataSet或者DataTable，而客户端以一个特殊RecordSet JavaScript对象来显示这个结果。该对象提供一个方法以检索列名和行数据
<p>&#183;支持数据页面技术。客户端应用程序能检索页面中的数据。
<p>&#183;支持所有的服务器端参数类型并返回值-原型，字符串，复合类型，数组，本机.net集合，远程参考
<p>&#183;共有两种版本可用的：标准版(自由)和专业版(商业许可)
<p><strong>6.2 Ajax.NET(自从3月2005年)</strong>
<p>网址是：<a href="http://ajax.schwarz-interactive.de/">http://ajax.schwarz-interactive.de/</a>，是一个库，实现从Javascript到服务器端.NET的存取。
<p>&#183;象SAJAX，能把Javascript中的调用传递到.NET方法，并返回到Javascript回叫。
<p>&#183;能存取来自于JavaScript的会话数据。
<p>&#183;缓存结果
<p>&#183;自由使用，可用的源码，未指定使用许可。由Michael Schwarz(<a href="http://weblogs.asp.net/mschwarz/">http://weblogs.asp.net/mschwarz/</a>)所维护。
<p>&#183;不允许改变源代码，用属性标记方法
<p>&#183;完整的类支持以返回客户端JavaScript值
<p>&#183;使用HtmlControls来进行输入和返回值
<p>&#183;可以返回数据表，数据集，数据视图，数组和集合
<p><strong>7 服务器端：PHP</strong>
<p><strong>7.1 AjaxAC(自从2005年4月)</strong>
<p>网址是：<a href="http://ajax.zervaas.com.au/">http://ajax.zervaas.com.au/</a>，用单个的PHP类封装了完整的应用程序。
<p>&#183;所有的应用程序代码是自包含在单个类中(附加另外一些JavaScript库)
<p>&#183;干净利索地调用PHP文件/HTML页面。只需创建应用程序类，然后参照应用程序JavaScript和依附任何需要的HTML元素到该应用程序。
<p>&#183;容易地处理JavaScript事件的内嵌功能
<p>&#183;创建子需要并处理它们的内嵌功能
<p>&#183;允许定制的配置值，因此某些单元能在运行时间设置
<p>&#183;无凌乱的JavaScript代码夹杂在调用HTML的代码中-所有的事件是被动态依附的
<p>&#183;由于以上两个原因容易和模板引擎集成到一起
<p>&#183;容易钩到（hook in to）已有的PHP类或者MySQL数据库以返回来自于子需求的数据
<p>&#183;能够容易地进一步生成JavaScript对象的可扩展的窗口小组件结构(但是还需要做一些工作)
<p>背景：
<p>&#183;开源许可(Apache2.0)。由Zervaas Enterprises(<a href="http://ajax.zervaas.com.au/">http://ajax.zervaas.com.au/</a>)支持
<p><strong>7.2 JPSpan</strong>
<p>网址是：<a href="http://jpspan.sourceforge.net/wiki/doku.php">http://jpspan.sourceforge.net/wiki/doku.php</a>，直接把Javascript调用传递到PHP函数。
<p>&#183;进行了严肃的单元测试。
<p>&#183;开源许可(PHP)。
<p><strong>7.3 XAJAX</strong>
<p>网址是：<a href="http://xajax.sf.net/">http://xajax.sf.net</a>，直接把Javascript调用传递到PHP函数。
<p>&#183;使用Javascript代理来调用PHP脚本。
<p>&#183;开源。由J.Max Wilson所创。
<p><strong>8 服务器端：Ruby</strong>
<p>Ruby On Rails(<a href="http://www.rubyonrails.org/">http://www.rubyonrails.org/</a>)是一个通常的强力支持Ajax的web框架：
<p>&#183;当Ajax出现的时候Rails还处于其发展的早期，因此Ajax可能逐渐成为Rails框架的核心。
<p>&#183;生成浏览器中大多数/全部的窗口小组件和动画的Javascript脚本。
<p>&#183;支持服务器端调用。
<p>&#183;调度支持。　
<p>&#183;开源许可。 </p>
<img src ="http://www.blogjava.net/i369/aggbug/167182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-12-12 11:48 <a href="http://www.blogjava.net/i369/articles/167182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>去掉字符串两端的全角空格和半角空格（含源代码）</title><link>http://www.blogjava.net/i369/articles/162531.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 23 Nov 2007 01:33:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/162531.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/162531.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/162531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/162531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/162531.html</trackback:ping><description><![CDATA[标签：<span style="color: #aaaaaa"><a class="operlink" href="http://blog.51cto.com/tagindex.php?keyword=%C8%AB%BD%C7%BF%D5%B8%F1%A1%A1%B0%EB%BD%C7%BF%D5%B8%F1%A1%A1%D7%D6%B7%FB%B4%AE%C1%BD%B6%CB%A1%A1trim" target="_blank">全角空格　半角空格　字符串两端　trim</a></span>　<br />
<br />
<div>
<table id="content" style="table-layout: fixed; width: 650px" cellspacing="10" cellpadding="0" width="650" border="0">
    <tbody>
        <tr>
            <td>
            <div class="copy"><strong>版权声明：</strong>原创作品，允许转载，转载时请务必以超链接形式标明文章 <a style="text-decoration: underline" href="http://su3390.blog.51cto.com/176528/33671" target="_blank">原始出处</a> 、作者信息和本声明。否则将追究法律责任。<a href="http://su3390.blog.51cto.com/176528/33671">http://su3390.blog.51cto.com/176528/33671</a></div>
            </td>
        </tr>
        <tr>
            <td>
            <div>
            <div>　　昨天，遇到了一个技术问题。本来我在程序中用的trim()方法来处理从JSP页面传来的值,后来在测试时，发现当我输入的是全角空格时，trim()方法失效。</div>
            <div>　　需求是这样的，只是去掉字符串两端的空格（不论是全角空格还是半角空格），字符串中间的空格不变。后来经过查资料和研究，总结出了以下两种写法：</div>
            <div>一、字符串的字符替换法：</div>
            <div>　　思路：（1）将字符串中所以有的全角空格转换成两个半角空格</div>
            <div>　　　　　（2）用trim()方法去掉字符串两端的空格（此时全是半角空格）</div>
            <div>　　　　　（3）将两个相邻的半角合成一个全角</div>
            <div>　　评价：这方法遇到字符串中间是半角+全角的时间，（3）步中有可能合并后，与原来</div>
            <div>　　　　　不一样。</div>
            <div><strong>原代码：</strong></div>
            <div>　　　　　public String&nbsp; trim(String Str){<br />
            &nbsp; &nbsp;　　　　　　String newstr = Str.replaceAll("　","&nbsp; ");<br />
            &nbsp; &nbsp;　　　　　　newstr = newstr.trim();<br />
            &nbsp; &nbsp;　　　　　　newstr = newstr.replaceAll("&nbsp; ","　");<br />
            &nbsp; &nbsp;　　　　　　return newstr;&nbsp; &nbsp;&nbsp;<br />
            &nbsp; 　　　　　}</div>
            <div>二、正则表达式转换法：　　　</div>
            <div>　　思路：利用正则表达式进行匹配替换。</div>
            <div>　　评价：这应该是正统的解决之道</div>
            <div>&nbsp;</div>
            <div><strong>原代码：</strong></div>
            <div>例1：</div>
            <div>public static String&nbsp; trims(String Str,String Flag) {&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp; if (Str == null || Str.equals("")) {<br />
            &nbsp;&nbsp;&nbsp;return Str;<br />
            &nbsp;&nbsp;} else {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Str =&nbsp;&nbsp; ""+Str;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(&nbsp;&nbsp; Flag&nbsp;&nbsp; ==&nbsp;&nbsp; "l"&nbsp;&nbsp; ||&nbsp;&nbsp; Flag&nbsp;&nbsp; ==&nbsp;&nbsp; "L"&nbsp;&nbsp; )/*trim&nbsp;&nbsp; left&nbsp;&nbsp; side&nbsp;&nbsp; only*/&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String RegularExp =&nbsp; "^[　 ]+";&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; Str.replaceAll(RegularExp,"");&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp; if(&nbsp;&nbsp; Flag&nbsp;&nbsp; ==&nbsp;&nbsp; "r"&nbsp;&nbsp; ||&nbsp;&nbsp; Flag&nbsp;&nbsp; ==&nbsp;&nbsp; "R"&nbsp;&nbsp; )/*trim&nbsp;&nbsp; right&nbsp;&nbsp; side&nbsp;&nbsp; only*/&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String RegularExp =&nbsp;&nbsp; "[　 ]+$";&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; Str.replaceAll(RegularExp,"");&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else/*defautly,&nbsp;&nbsp; trim&nbsp;&nbsp; both&nbsp;&nbsp; left&nbsp;&nbsp; and&nbsp;&nbsp; right&nbsp;&nbsp; side*/&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String RegularExp =&nbsp;&nbsp; "^[　 ]+|[　 ]+$";&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; Str.replaceAll(RegularExp,"");&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;</div>
            <div>&nbsp;&nbsp; }&nbsp;<br />
            } </div>
            <div>&nbsp;</div>
            <div>例2：</div>
            <div>public static String trim(String str) {<br />
            &nbsp;&nbsp;if (str == null || str.equals("")) {<br />
            &nbsp;&nbsp;&nbsp;return str;<br />
            &nbsp;&nbsp;} else {<br />
            &nbsp;&nbsp;&nbsp;//return leftTrim(rightTrim(str));<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return str.replaceAll("^[　 ]+|[　 ]+$","");<br />
            &nbsp;&nbsp;}<br />
            &nbsp;}</div>
            <div>&nbsp;public static String leftTrim(String str) {<br />
            &nbsp;&nbsp;if (str == null || str.equals("")) {<br />
            &nbsp;&nbsp;&nbsp;return str;<br />
            &nbsp;&nbsp;} else {<br />
            &nbsp;&nbsp;&nbsp;return str.replaceAll("^[　 ]+", "");<br />
            &nbsp;&nbsp;}<br />
            &nbsp;}</div>
            <div>&nbsp;public static String rightTrim(String str) {<br />
            &nbsp;&nbsp;if (str == null || str.equals("")) {<br />
            &nbsp;&nbsp;&nbsp;return str;<br />
            &nbsp;&nbsp;} else {<br />
            &nbsp;&nbsp;&nbsp;return str.replaceAll("[　 ]+$", "");<br />
            &nbsp;&nbsp;}<br />
            }</div>
            <div>&nbsp;</div>
            <div>给大家一个综合的测试类：</div>
            <div>public class Test {</div>
            <div>&nbsp;public static void main(String[] args) {<br />
            &nbsp;&nbsp;System.out.println("leftTrim:" + leftTrim(" 　　123　　123　　123　　 ") + ":");<br />
            &nbsp;&nbsp;System.out.println("rightTrim:" + rightTrim(" 　　123　　123　　123　 　") + ":");<br />
            &nbsp;&nbsp;System.out.println("trim:" + trim(" 　　123　　123　　123 　　") + ":");<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("leftTrim:" + trims(" 　　123　　123　　123　　 ","l") + ":");<br />
            &nbsp;&nbsp;System.out.println("rightTrim:" + trims(" 　　123　　123　　123　 　","r") + ":");<br />
            &nbsp;&nbsp;System.out.println("trim:" + trims(" 　　123　　123　　123 　　","a") + ":");<br />
            &nbsp;}</div>
            <div>&nbsp;public static String trim(String str) {<br />
            &nbsp;&nbsp;if (str == null || str.equals("")) {<br />
            &nbsp;&nbsp;&nbsp;return str;<br />
            &nbsp;&nbsp;} else {<br />
            &nbsp;&nbsp;&nbsp;//return leftTrim(rightTrim(str));<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return str.replaceAll("^[　 ]+|[　 ]+$","");<br />
            &nbsp;&nbsp;}<br />
            &nbsp;}</div>
            <div>&nbsp;public static String leftTrim(String str) {<br />
            &nbsp;&nbsp;if (str == null || str.equals("")) {<br />
            &nbsp;&nbsp;&nbsp;return str;<br />
            &nbsp;&nbsp;} else {<br />
            &nbsp;&nbsp;&nbsp;return str.replaceAll("^[　 ]+", "");<br />
            &nbsp;&nbsp;}<br />
            &nbsp;}</div>
            <div>&nbsp;public static String rightTrim(String str) {<br />
            &nbsp;&nbsp;if (str == null || str.equals("")) {<br />
            &nbsp;&nbsp;&nbsp;return str;<br />
            &nbsp;&nbsp;} else {<br />
            &nbsp;&nbsp;&nbsp;return str.replaceAll("[　 ]+$", "");<br />
            &nbsp;&nbsp;}<br />
            &nbsp;}</div>
            <div>&nbsp; public static String&nbsp; trims(String Str,String Flag) {&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp; if (Str == null || Str.equals("")) {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Str;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Str =&nbsp;&nbsp; ""+Str;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(&nbsp;&nbsp; Flag&nbsp;&nbsp; ==&nbsp;&nbsp; "l"&nbsp;&nbsp; ||&nbsp;&nbsp; Flag&nbsp;&nbsp; ==&nbsp;&nbsp; "L"&nbsp;&nbsp; )/*trim&nbsp;&nbsp; left&nbsp;&nbsp; side&nbsp;&nbsp; only*/&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String RegularExp =&nbsp; "^[　 ]+";&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; Str.replaceAll(RegularExp,"");&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp; if(&nbsp;&nbsp; Flag&nbsp;&nbsp; ==&nbsp;&nbsp; "r"&nbsp;&nbsp; ||&nbsp;&nbsp; Flag&nbsp;&nbsp; ==&nbsp;&nbsp; "R"&nbsp;&nbsp; )/*trim&nbsp;&nbsp; right&nbsp;&nbsp; side&nbsp;&nbsp; only*/&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String RegularExp =&nbsp;&nbsp; "[　 ]+$";&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; Str.replaceAll(RegularExp,"");&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else/*defautly,&nbsp;&nbsp; trim&nbsp;&nbsp; both&nbsp;&nbsp; left&nbsp;&nbsp; and&nbsp;&nbsp; right&nbsp;&nbsp; side*/&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String RegularExp =&nbsp;&nbsp; "^[　 ]+|[　 ]+$";&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; Str.replaceAll(RegularExp,"");&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
            &nbsp;&nbsp; }&nbsp;&nbsp; <br />
            }</div>
            <div>如果你也遇到这样的问题，希望以上的文字能帮助到你：），欢迎光临我的博客！　　　　　</div>
            <p>本文出自 &#8220;<a href="http://su3390.blog.51cto.com/">兰色的海洋</a>&#8221; 博客，请务必保留此出处<a href="http://su3390.blog.51cto.com/176528/33671">http://su3390.blog.51cto.com/176528/33671</a></p>
            <a class="hidden" href="http://su3390.blog.51cto.com/176528/33671">本文出自 51CTO.COM技术博客</a></div>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/i369/aggbug/162531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-11-23 09:33 <a href="http://www.blogjava.net/i369/articles/162531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java开源 Jsp标签库</title><link>http://www.blogjava.net/i369/articles/159249.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 09 Nov 2007 00:51:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/159249.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/159249.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/159249.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/159249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/159249.html</trackback:ping><description><![CDATA[displytag <br />
与Struts结合使用最出名的一个tag主要是显示表格数据很漂亮、完善。&nbsp;&nbsp; <br />
<a href="http://displaytag.sourceforge.net/" target="_blank">http://displaytag.sourceforge.net/</a> <br />
<br />
cewolf&nbsp;tag <br />
用来在web上显示复杂图形报表的一个jsp&nbsp;tag。&nbsp;&nbsp; <br />
<a href="http://cewolf.sourceforge.net/" target="_blank">http://cewolf.sourceforge.net/</a> <br />
<br />
Loading&nbsp;Tab <br />
当一个复杂的操作可以加载比较长的时间时，用这个tag。&nbsp;&nbsp; <br />
<a href="http://www.mycgiserver.com/~eboudrant/#taglibs" target="_blank">http://www.mycgiserver.com/~eboudrant/#taglibs</a> <br />
<br />
DbForms <br />
DbForms!它是一个基于&nbsp;Java&nbsp;(Servlet,JSP/Taglib)的快速应用程序开发环境，可以帮助开发人员快速建造基于Web的数据库应用程序。&nbsp;&nbsp; <br />
<a href="http://jdbforms.sourceforge.net/" target="_blank">http://jdbforms.sourceforge.net/</a> <br />
<br />
Jakarta&nbsp;Taglibs <br />
Jakarta&nbsp;Taglibs&nbsp;是为JSP定制标签库和相关的项目提供的一个开源仓库，如&nbsp;TagLibraryValidator类，和对页面生成工具的扩展来支持标签库。Jakarta&nbsp;Taglibs&nbsp;也包括了对JSP&nbsp;Standard&nbsp;Tag&nbsp;Library&nbsp;(JSTL)的参考实现。这个实现基于项目标准。目前，在Jakarta&nbsp;Taglibs&nbsp;中没有其它标签库代表了Java&nbsp;Community&nbsp;Process&nbsp;(JCP)&nbsp;标准。&nbsp;&nbsp; <br />
<a href="http://jakarta.apache.org/taglibs/index.html" target="_blank">http://jakarta.apache.org/taglibs/index.html</a> <br />
<br />
EasyLDAP <br />
LDAP标签库为JSP程序员和Web页面设计者提供了最容易的方法来执行任意的LDAP操作。&nbsp;&nbsp; <br />
<a href="http://easyldap.sourceforge.net/" target="_blank">http://easyldap.sourceforge.net/</a> <br />
<br />
WebJMX <br />
WebJMX标签库项目可以控制你的JMX&nbsp;接口。WebJMX&nbsp;这个标签库项目的目的是生成一个JSP标签库，可以让有技巧的JSP开发人员为JMX生成一个可定制的、规范的、基于Web的界面。&nbsp;&nbsp; <br />
<a href="http://webjmx.sourceforge.net/" target="_blank">http://webjmx.sourceforge.net/</a> <br />
<br />
JPivot <br />
JPivot&nbsp;-&nbsp;是一个JSP&nbsp;自定制的标签库，可以绘制一个OLAP表格和图表。用户可以执行典型的OLAP导航，如下钻，切片和方块。它使用Mondrian&nbsp;作为其OLAP服务器。&nbsp;&nbsp; <br />
<a href="http://jpivot.sourceforge.net/" target="_blank">http://jpivot.sourceforge.net/</a> <br />
<br />
JSP&nbsp;Tree&nbsp;Tag&nbsp; <br />
JSP&nbsp;Tree&nbsp;Tag是一个显示树型结构jsp标签，它只把需要显示的部分送到客户浏览器。&nbsp;&nbsp; <br />
<a href="http://www.jenkov.dk/projects/treetag/treetag.jsp" target="_blank">http://www.jenkov.dk/projects/treetag/treetag.jsp</a> <br />
<br />
Google&nbsp;Tag&nbsp;Library&nbsp; <br />
该标记库和&nbsp;Google&nbsp;有关。使用该标记库，利用&nbsp;Google&nbsp;为你的网站提供网站查询，并且可以直接在你的网页里面显示搜查的结果。&nbsp;&nbsp; <br />
<a href="http://google-taglib.sourceforge.net/" target="_blank">http://google-taglib.sourceforge.net/</a> <br />
<br />
TableTag <br />
TableTag是类似于DataGrid的Jsp标签库。通过<a href="http://pop.pcpop.com/Subject/13151.html" target="_blank"><font color="#000000">java</font></a>.util.List填充数据。&nbsp;&nbsp; <br />
<a href="http://tabletag.sourceforge.net/" target="_blank">http://tabletag.sourceforge.net/</a> <br />
<br />
uitags <br />
uitags利用这个开源自定义标签可以很容易开发出一个友好的用户界面。&nbsp;&nbsp; <br />
<a href="http://uitags.sourceforge.net/" target="_blank">http://uitags.sourceforge.net/</a> <br />
<br />
ValueList <br />
ValueList利用这个标签可以进行数据过滤，排序，分页。而且界面挺漂亮的。&nbsp;&nbsp; <br />
<a href="http://valuelist.sourceforge.net/" target="_blank">http://valuelist.sourceforge.net/</a> <br />
<br />
JCE&nbsp;taglib <br />
JCE&nbsp;taglib把JCE（Java&nbsp;Cryptographic&nbsp;Extensions）包装成TagLib并且包含了EL函数。使用这个标签能够为jsp应用程序加强安全性。&nbsp;&nbsp; <br />
<a href="http://jcetaglib.sourceforge.net/" target="_blank">http://jcetaglib.sourceforge.net/</a> <br />
<br />
Prize&nbsp;Tags <br />
Prize&nbsp;Tags是一个集许多功能于一身的Jsp标签库。其中最受欢迎的Tree&nbsp;Tag，这个Tag可以为不同节点指定不同的图标，而且可以服务端可以监控客户端节点的展开，关闭，选中与未选中等事件。除了Tree&nbsp;Tag还有日历Tag,Icon&nbsp;Tag,Alternate&nbsp;Tag&nbsp;,Template&nbsp;Tag&nbsp;等其它的功能。&nbsp;&nbsp; <br />
<a href="http://www.jenkov.com/prizetags/introduction.tmpl" target="_blank">http://www.jenkov.com/prizetags/introduction.tmpl</a> <br />
<br />
Struts-Layout <br />
Struts-Layout是一个用在Struts的标签库.这个强大的标签库可以用来显示面板(panels),输入框,表格,treeviews,sortable&nbsp;lists,datagrids,popups,日历等.使用这些标签可以不用写HTML代码,甚至可以不用懂得HTML.这个项目还提供一个Eclipse下的插件Kiwi帮助使用Struts和Struts-Layout来开发Jsp页面.以下是一张例图: <br />
<a href="http://struts.application-servers.com/" target="_blank">http://struts.application-servers.com/</a> <br />
<br />
JImageTaglib <br />
JImageTaglib是一个用在J2EE&nbsp;Web应用程序的Java标签库.它用来在服务端生成与处理图片然后再反馈到JSP页面.可以过滤(filtering)图片,调整图片文件大小,生成条形码等.&nbsp;&nbsp; <br />
<a href="http://jimagetaglib.sourceforge.net/" target="_blank">http://jimagetaglib.sourceforge.net/</a> <br />
<br />
uitags <br />
uitags是一个开源的JSP&nbsp;custom-tag库.它让开发友好的用户界面变得简单.&nbsp;&nbsp; <br />
<a href="http://uitags.sourceforge.net/" target="_blank">http://uitags.sourceforge.net/</a> <br />
<br />
AJAX&nbsp;Tags <br />
AJAX&nbsp;Tag是一组Jsp标签,用来简化AJAX(Asynchronous&nbsp;JavaScript&nbsp;and&nbsp;XML&nbsp;)技术在JSP页面中的使用.&nbsp;&nbsp; <br />
<a href="http://ajaxtags.sourceforge.net/" target="_blank">http://ajaxtags.sourceforge.net/</a> <br />
<br />
Struts&nbsp;AjaxTags <br />
这个AjaxTags是在现有的Struts&nbsp;HTML标签库上添加对AJAX&nbsp;(Asynchronous&nbsp;Java脚本+XML)技术的支持。这样就可以为现有的基于Struts&nbsp;HTML标签库的应用程序添加AJAX功能而不用破坏现存的代码并且开发者不需要了解AJAX是怎样工作的。&nbsp;&nbsp; <br />
<a href="http://struts.sourceforge.net/ajaxtags/" target="_blank">http://struts.sourceforge.net/ajaxtags/</a> <br />
<br />
AWTaglib <br />
AWTaglib是一个Jsp标签可用于创建网格(grid)控件.它还提供一些额外的功能可以把网格中的数据导出为XLS,PDF和CSV(利用JasperReports来实现)并能与Struts框架相结合.&nbsp;&nbsp; <br />
<a href="http://awtaglib.sourceforge.net/" target="_blank">http://awtaglib.sourceforge.net/</a> <br />
<br />
eXtremeTable <br />
eXtremeTable是一个可扩展的用于以表格的形式来显示数据的一组JSP标签库.&nbsp;&nbsp; <br />
<a href="http://www.extremecomponents.org/" target="_blank">http://www.extremecomponents.org</a><font color="#cccccc"><br />
</font>
<img src ="http://www.blogjava.net/i369/aggbug/159249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-11-09 08:51 <a href="http://www.blogjava.net/i369/articles/159249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>访问安全网站(使用SSL)总是跳出安全警报的解决方法</title><link>http://www.blogjava.net/i369/articles/157717.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 02 Nov 2007 04:04:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/157717.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/157717.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/157717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/157717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/157717.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/i369/aggbug/157717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-11-02 12:04 <a href="http://www.blogjava.net/i369/articles/157717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为CAS提供中文界面支持</title><link>http://www.blogjava.net/i369/articles/156003.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 26 Oct 2007 00:45:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/156003.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/156003.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/156003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/156003.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/156003.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/i369/aggbug/156003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-26 08:45 <a href="http://www.blogjava.net/i369/articles/156003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]CAS及客户端Acegi的安装配置指南</title><link>http://www.blogjava.net/i369/articles/155776.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 25 Oct 2007 01:19:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/155776.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/155776.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/155776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/155776.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/155776.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: CAS及客户端Acegi的安装配置指南（上）作者：龙智&nbsp;(Dragon)时间：2006-07-09&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CAS（Central Authentication Service）是耶鲁大学开发的一个开源的SSO（single sign on，单点登录）系统。它提供了丰富的客...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/155776.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/155776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-25 09:19 <a href="http://www.blogjava.net/i369/articles/155776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache上全部JAVA开源项目简介</title><link>http://www.blogjava.net/i369/articles/155468.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Wed, 24 Oct 2007 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/155468.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/155468.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/155468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/155468.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/155468.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt">
            <p><a href="http://www.inspring.cn/b/?p=265" rel="bookmark"><strong style="color: black; background-color: #ffff66">Apache</strong>上全部JAVA开源<strong style="color: black; background-color: #99ff99">项目</strong>简介</a></p>
            <p>最近接触Jakarta-Common-BeanUtils这个东东比较多，于是对<strong style="color: black; background-color: #ffff66">Apache</strong> Jakarta Project产生了兴趣，上他们的官方网站上看了下感觉有用的东西好多，眼花缭乱的，又没有中文网站，又上各大论坛搜了下，也没有发现一个集中该<strong style="color: black; background-color: #99ff99">项目</strong>的资料，于是决定自己整理翻译一下，有助于各位网友更好的了解该<strong style="color: black; background-color: #99ff99">项目</strong>。如果有什么描述不对不全面的地方，希望各位提出来给大家分享。<br />
            Jakarta<strong style="color: black; background-color: #99ff99">项目</strong>是ASF(The <strong style="color: black; background-color: #ffff66">Apache</strong> Software Foundation)的一部分。ASF是一个非赢利组织，她鼓励基于开放的软件许可下进行合作、注重实效的开发，并提供各个领域的高质量软件，她涉及到Http服务器，编译工具，类库，开发架构，服务器端Java技术,J2EE容器，数据库工具，日志工具，XML解析等等诸多领域。ASF提供的java<strong style="color: black; background-color: #99ff99">项目</strong>有一部分在Jakarta中，还有一些成为独立的诸如Tomcat的<strong style="color: black; background-color: #99ff99">项目</strong>,Jakarta<strong style="color: black; background-color: #99ff99">项目</strong>则提供了多种多样开源的java解决通用方案。</p>
            <p><a></a></p>
            <p>先<a name="baidusnap3"></a><strong style="color: black; background-color: #ff9999">介绍</strong>一下ASF中和Jakarta<strong style="color: black; background-color: #99ff99">项目</strong>并列的java<strong style="color: black; background-color: #99ff99">项目</strong>：</p>
            <p>Ant ——java构建工具，使用一个配置文件就可以完成java的<strong style="color: black; background-color: #99ff99">项目</strong>的，编译、打包、测试、运行、部署、生成文档等诸多工作。<br />
            Avalon ——是一个包括核心框架、工具、组件和容器的面向组件编程（AOP）的完整开发平台。使用关键设计模式，如反向控制模式（IoC）和分离考虑模（SoC）。 Avalon提供各种基本组件和缺省的应用程序模块，帮助你快速的建立你自己的应用程序解决方案。<br />
            Excalibur ——集多个开源<strong style="color: black; background-color: #99ff99">项目</strong>(Avalon Framework、LogKit和Cornerstone)于一身的轻量级可嵌入式反向控制容器。<br />
            Gump ——是<strong style="color: black; background-color: #ffff66">Apache</strong>组织自己也使用的一个持续集成工具，全面支持Ant和Maven，当有新的改动提交到版本控制系统，它可以检查出潜在 的冲突，并及时通知<strong style="color: black; background-color: #99ff99">项目</strong>组的<a name="baidusnap1"></a><strong style="color: black; background-color: #a0ffff">所有</strong>成员并自动生成改动的详细报告。<br />
            James ——是一套用java开发的邮件、新闻组、消息服务器，提供了比较完善的配置方案，尤其是关于邮件内容存储和用户信息存储。 支持 SMTP, POP3 , NNTP , IMAP 。<br />
            Logging ——可靠，快速的日志工具。<br />
            Lucene ——Java开发的高性能，全方位的文本搜索引擎。替文件的每一个字作索引，索引让搜寻的效率比传统的逐字比较大大提高， Lucen提供一组解读，过滤，分析文件，编排和使用索引的API，它的强大之处除了高效和简单外， 是最重要的是使使用者可以随时应自已需要自订其功能。<br />
            Maven ——是一个潜在的基于java的<strong style="color: black; background-color: #ffff66">apache</strong> ant的构建工具的替代者。提供了更强大的功能和易用性。<br />
            Portals ——提供了功能全面的、具有商业价值的企业门户。门户概念：门户对企业内的各种资源如信息管理系统进行整合并通过单一接口 对外提供服务，雇员、合伙人及顾客可以通过任何装置在任何地点通过门户入口享受到企业提供的服务， 分析家们预计,门户将成为下一代的桌面环境。<br />
            Struts ——一个实现MVC model2的web应用程序开发框架。通过一个配置文件可以很好的对各种组件进行装配，结构清晰，应用的最广泛的额web开发框架。<br />
            Tapestry——类似 Struts，也是一个基于servlet的应用程序框架，支持MVC，出现的较晚，不如Struts普及，主要利用javabean和xml技术进行开发，<br />
            Tomcat ——Serlvet容器，同时具有传统的Web服务器的功能，如：处理Html页面。能够处理动静态网页。<br />
            Watchdog ——用来检查一个servlet或jsp容器在相应规范上的执行情况的兼容性。但是该<strong style="color: black; background-color: #99ff99">项目</strong>已经静止了，只支持Servlet2.3、JSP1.2，相应 的Serlvet容器如Tomcat也只支持Tomcat4.x。</p>
            <p>下面<strong style="color: black; background-color: #ff9999">介绍</strong>下Jakarta的各个子<strong style="color: black; background-color: #99ff99">项目</strong>：</p>
            <p>Alexandria——已经不再开发<br />
            BCEL ——The Byte Code Engineering Library (formerly known as JavaClass) 字节码引擎类库，它让用户方便的分析，创建，操作java的class文件成为可能。 它可以让您深入 JVM 汇编语言进行类操作的细节。<br />
            BSF ——bean脚本框架 在java应用内对脚本语言提供了支持，通过脚本语言可以访问java的对象和方法。<br />
            Cactus ——一个基于JUnit框架的简单测试框架，用来单元测试服务端Java代码。 Cactus单元测试服务端内容包括servlet,EJB,? tag librarie, filter等<br />
            Commons ——提供很多日常开发中使用率很高的功能解决方案，已被很多著名的开源<strong style="color: black; background-color: #99ff99">项目</strong>采用。具体的<strong style="color: black; background-color: #99ff99">项目</strong>列表后面会有。<br />
            ECS ——使用Java语言和面向对象方法创建标记语言文档(HTML,XML)的开源<strong style="color: black; background-color: #99ff99">项目</strong>。<br />
            HiveMind ——是一个服务和配置的微型内核， 一套通过简单的java对象和接口创建复杂应用的框架。<br />
            HttpComponents ——提供了java.net包所不能提供的更多强大的、方便的http协议处理功能。<br />
            JCS ——一个分布式的缓存系统，用来提高应用程序的性能，并且提供很多强大的额外功能。<br />
            JMeter ——纯java开发的一套桌面应用程序。用来进行功能测试和性能测试。它可以用来测试静止资料库或者活动资料库中的服务器的运行情况， 可以用来模拟对服务器或者网络系统加以重负荷以测试它的抵抗，或者用来分析不同负荷类型下的<strong style="color: black; background-color: #a0ffff">所有</strong>运行情况。 它也提供了一个可替换的界面用来定制数据显示，测试同步及测试的创建和执行。<br />
            ORO ——一套文本处理工具，能提供perl5.0兼容的正则表达式、 AWK-like正则表达式, glob 表达式。还提供替换，分割，文件名过虑等功能。<br />
            POI ——一套用来创建，读写基于OLE 2组件文档格式的文件。使用Java来读写MS Excel ,Word文件。<br />
            Regexp ——一套纯java的正则表达式相关的包。<br />
            Slide ——主要模块是一个可以做为内容管理框架底层的内容仓库.它可以把内容信息存取到专门的,异质的,分布式的数据库中.Slide还增加了security, locking, versioning等特性.<br />
            Taglibs ——一套在开发web应用时十分有用的，jsp 通用 tag包。<br />
            Turbine ——类似 Struts，也是一个基于servlet的应用程序框架，支持MVC。提供了大量可重用的组件。此框架包中包含了大量组件，但是这些组件是离散的。<br />
            Velocity ——是一个基于java的模板引擎（template engine）。它允许任何人仅仅简单的使用模板语言（template language）来引用由java代码定义的对象。? 当Velocity应用于web开发时，界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点， 也就是说，页面设计人员可以只关注页面的显示效果，而由java程序开发人员关注业务逻辑编码。 Velocity将java代码从web页面中分离出来，这样为web站点的长期维护提供了便利， 同时也为我们在JSP和PHP之外又提供了一种可选的方案。 Velocity的能力远不止web站点开发这个领域， 例如，它可以从模板（template）产生SQL和PostScript、XML，它也可以被当作一个独立工具来产生源代码和报告， 或者作为其他系统的集成组件使用。Velocity也可以为Turbine web开发架构提供模板服务（template service）。 Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。?<br />
            <strong style="color: black; background-color: #ffff66">Apache</strong> java<strong style="color: black; background-color: #99ff99">项目</strong>全<strong style="color: black; background-color: #ff9999">介绍</strong>2<br />
            下面<strong style="color: black; background-color: #ff9999">介绍</strong>一下Jakarta下的Commons：一个csdn网友描述得很贴切，Commons就好比一个java百宝箱。<br />
            commons分为3部分Commons Proper、Commons Sandbox和Commons Dormant<br />
            Commons Proper：提供了设计良好可重用的java组件，并都经过了广泛、严格的测试。<br />
            Commons Sandbox：处于实验、测试阶段的组件。<br />
            Commons Dormant：处于停滞状态，从Sandbox退出的，不活跃的组件，谨慎使用。</p>
            <p>Commons Proper组件：</p>
            <p>Attributes—— 支持源代码级的元数据。<br />
            BeanUtils——提供对 Java 反射和自省API的包装，处理javabean的工具。<br />
            Betwixt——将JavaBeans与XML相互转换。?<br />
            Chain——对Chain of Responsibility（责任链）设计模式的实现。使多个对象都有机会处理请求， 从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链，并沿着这条链传递请求，直到有一个对象处理它为止。<br />
            CLI——处理命令行的命令的解析。<br />
            Codec——包含一些通用的编码解码算法。包括一些语音编码器， Hex, Base64, 以及URL encoder。<br />
            Collections——扩展和增加标准的 Java Collection框架。<br />
            Configuration——操作各种格式的配置文件。Properties文件 /XML文件 /JNDI /JDBC 数据源 /System properties /Applet parameters / Servlet parameters<br />
            Daemon——创建类似unix守护线程的java代码，可以安全地执行一些后台操作，线程不被某个应用程序控制，而是由操作系统控制 类似windows的service，可以设置一个服务依赖于另一个服务，一个服务关闭前必须先执行另一个服务。<br />
            DBCP——一个数据库连接池<br />
            DbUtils——一个JDBC的工具类，比如可以将ResultSets生成javabean。<br />
            Digester——基于规则的XML文档解析,主要用于XML到Java对象的映射.<br />
            Discovery——提供工具来定位资源 (包括类) ，通过使用各种模式来映射服务/引用名称和资源名称。<br />
            EL——JSP 2.0引入的表达式<br />
            Email——处理e-mail<br />
            FileUpload——web应用中的文件上传组件<br />
            HttpClient——使用HTTP协议的客户端开发框架<br />
            IO——帮助进行IO功能开发<br />
            Jelly——Jelly能够把XML转换成可执行代码,所以Jelly是一个基于XML与Java的脚本和处理引擎。 Jelly借鉴了JSP定指标签，Velocity, Cocoon和Xdoclet中的脚本引擎的许多优点。Jelly可以用在命令行，Ant或者Servlet之中。<br />
            Jexl——Jexl是一个表达式语言，通过借鉴来自于Velocity的经验扩展了JSTL定义的表达式语言。<br />
            JXPath——使用XPath语法操作javabean的工具。<br />
            Lang——提供对java.lang包的扩展。?<br />
            Launcher——跨平台的java程序的启动<br />
            Logging——提供的是一个日志(Log)接口(interface)，同时兼顾轻量级和不依赖于具体的日志实现工具。 它提供给中间件/日志工具开发者一个简单的日志操作抽象，允许程序开发人员使用不同的具体日志实现工具。用户被假定已熟悉某种日志实现工具的更高级别的细节。JCL提供的接口，对其它一些日志工具，包括Log4J, Avalon LogKit, and JDK 1.4等，进行了简单的包装，此接口更接近于Log4J和LogKit的实现.<br />
            Math——Math 是一个轻量的，自包含的数学和统计组件，解决了许多非常通用但没有及时出现在Java标准语言中的实践问题.<br />
            Modeler—— 支持兼容JMX规范的MBeans开发。<br />
            Net——集合了网络工具和协议工具的实现<br />
            Pool——Commons-Pool 提供了通用对象池接口，一个用于创建模块化对象池的工具包，以及通常的对象池实现。<br />
            Primitives——对java原始类型的支持。<br />
            SCXML——处理SCXML<br />
            Transaction——事务处理，实现了多层次锁、事务集合、事务文件的访问。?<br />
            Validator——提供了一个简单的，可扩展的框架来在一个XML文件中定义校验器 (校验方法)和校验规则。支持校验规则的和错误消息的国际化。<br />
            VFS——访问各种文件系统，可以是本地文件、HTTP服务器上的文件、zip中的文件。<br />
            Commons Sandbox组件：</p>
            <p>Compress——处理压缩文件如tar, zip 和 bzip2 格式。<br />
            CSV——处理CSV文件<br />
            Exec——安全地处理外部进程<br />
            Finder——实现类似UNIX find命令的功能<br />
            I18n——处理软件的I18n功能<br />
            Id——生成id号功能<br />
            Javaflow——捕捉程序运行状态<br />
            JCI——java编译接口<br />
            OpenPGP——处理加密方法OpenPGP.?<br />
            Pipeline——处理类似工作队列的管道工具<br />
            Proxy——生成动态代理</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<div class="tit">Java开源－Apache组织的所有开源项目</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt">
            <p>来自<strong style="color: black; background-color: #ffff66">Apache</strong>的开源<strong style="color: black; background-color: #99ff99">项目</strong>（按字母顺序排序）：<br />
            <br />
            　　<strong>Ant</strong>：Ant现在已经是任何IDE都集成的编译工具了。为了编译一大堆java源代码文件，需要一次次的在命令行敲重复的命令，Ant便是让你编写命令脚本，然后让Ant自动完成复杂的编译工作，类似于Makefile，但Ant脚本是标准的XML格式，更容易编写和阅读。事实上，巧妙地使用Ant，您可以让Ant自动完成编译，测试，输出文档，生成Release版本等一系列任务，使得整个<strong style="color: black; background-color: #99ff99">项目</strong>流程自动化。<br />
            <br />
            　　<strong>Commons</strong>：Commons包括一组可重用的Java组件，如BeanUtil，Collections，FileUpload，Validator等等。<br />
            <br />
            　　<strong>Jetspeed</strong>：Jetspeed是开源的企业门户应用框架。支持JSP，Velocity，XML，RSS，WAP等，即将支持Java Portlet API规范（JSR168标准）<br />
            <br />
            　　<strong>JMeter</strong>：JMeter是100%纯Java编写的压力测试工具，最初专用于Web应用的压力测试，现在还可以测试文件系统，数据队列，FTP服务等其他应用。JMeter模拟多用户同时向服务器发送请求，并将结果以图表的方式显示出来，使用非常简便。<br />
            <br />
            　　<strong>Log4j</strong>：看名字就能猜到，Log4j是专门为Java设计的日志服务。Log4j提供非常方便的分等级的日志记录，可以输出到屏幕，文件甚至是NT的日志系统，特点是速度非常快。如果您留意的话，可以看到很多Java<strong style="color: black; background-color: #99ff99">项目</strong>早已集成了Log4j，如Eclipse，Tomcat，Spring等等。<br />
            <br />
            　　<strong>Lucence</strong>：Lucence是一个高性能的全文搜索引擎，可以非常容易的把它集成到您的应用中来。Lucence的发起人就是搜索领域的一位专家，曾在Excite任职。<br />
            <br />
            　　<strong>Taglibs</strong>：Taglibs是一组自定义的JSP标签库。JSP标签能以简单的标签来实现页面功能但避免了嵌入Java代码，不过JSP标签编写比较困难，好在Taglibs提供一系列标签，几乎能满足您的常见需求。<br />
            <br />
            　　<strong>Tapestry</strong>：Tapestry是类似于JSP，Velocity的视图技术，提供一个完整的框架让您不必使用JSP也能实现动态页面。</p>
            <p><br />
            　　<strong>Tomcat</strong>：Tomcat是最著名的开源Web服务器，最新版本5.5支持Servlet2.4和JSP2.0，最适合于构件Java Web应用。<br />
            <br />
            　　<strong>Velocity</strong>：Velocity是类似JSP的另一种动态页面，特点是标签更简单，能直接写在HTML中，并且不能嵌入Java代码，强迫您只能在Velocity页面中渲染结果而不是处理业务逻辑，以便更清晰地划分MVC结构。<br />
            </p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/i369/aggbug/155468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-24 09:54 <a href="http://www.blogjava.net/i369/articles/155468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR源码学习函数调用篇 </title><link>http://www.blogjava.net/i369/articles/155211.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 23 Oct 2007 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/155211.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/155211.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/155211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/155211.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/155211.html</trackback:ping><description><![CDATA[<div><a id="viewpost1_TitleUrl" href="http://www.blogjava.net/javajohn/archive/2006/06/06/50650.html">DWR源码学习函数调用篇</a> </div>
<p style="margin: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dwr <span style="font-family: 宋体">通过用户配置文件</span> dwr.xml <span style="font-family: 宋体">将</span> java <span style="font-family: 宋体">类映射成一个</span> javascript <span style="font-family: 宋体">对象，从实现手法上看与</span> java <span style="font-family: 宋体">里的数据映射很相似。而</span> dwr <span style="font-family: 宋体">是将</span> JAVA <span style="font-family: 宋体">的对象映射到了</span> js <span style="font-family: 宋体">里，由客户端的</span> JS <span style="font-family: 宋体">提供给用户各类实现，而</span> java <span style="font-family: 宋体">代码完全在后台运行。</span> </p>
<p style="margin: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWR <span style="font-family: 宋体">函数调用里涉及到的</span> JS <span style="font-family: 宋体">代码：</span> engine.js </p>
<p style="margin: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWR <span style="font-family: 宋体">函数调用里涉及到的类有：</span> <span style="font-size: 10pt; background: silver; color: black; font-family: 'Courier New'">AbstractDWRServlet</span> <span style="font-size: 10pt; color: black; font-family: 宋体">、</span> <span style="font-size: 10pt; background: silver; color: black; font-family: 'Courier New'">DefaultProcessor</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt; color: black; font-family: 宋体">用户在提交</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">request</span> <span style="font-size: 10pt; color: black; font-family: 宋体">以后的操作步骤请参见我</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">blog</span> <span style="font-size: 10pt; color: black; font-family: 宋体">里的：《</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">dwr</span> <span style="font-size: 10pt; color: black; font-family: 宋体">源码学习（一）》，</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">JAVA</span> <span style="font-size: 10pt; color: black; font-family: 宋体">代码生成的映射</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">JS</span> <span style="font-size: 10pt; color: black; font-family: 宋体">代码其实只是一个</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">javascript</span> <span style="font-size: 10pt; color: black; font-family: 宋体">接口，它调用了</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWREngine._execute</span> <span style="font-size: 10pt; color: black; font-family: 宋体">这个函数，而这个函数大体只是执行了一些解析的工作，在它结尾处调用了</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWREngine.endBatch()</span> <span style="font-size: 10pt; color: black; font-family: 宋体">，然后又执行了</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWREngine._sendData(batch)</span> <span style="font-size: 10pt; color: black; font-family: 宋体">，这时我们会发现有这样一句：</span> <span style="font-size: 10pt; color: black; font-family: 宋体">&#8220;</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">batch.req.open("GET", batch.path + "/exec/" + statsInfo + "?" + query, batch.async);</span> <span style="font-size: 10pt; color: black; font-family: 宋体">&#8221;很熟悉吧。</span> </p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 宋体">下一步就到了真正的实现</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">js</span> <span style="font-size: 10pt; color: black; font-family: 宋体">调用</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">java</span> <span style="font-size: 10pt; color: black; font-family: 宋体">代码里方法的时候了，兴奋吧。其实实现也是很简单的。通过</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">servlet</span> <span style="font-size: 10pt; color: black; font-family: 宋体">这里实现了对各类型</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">request</span> <span style="font-size: 10pt; color: black; font-family: 宋体">参数的不同的匹配，还是看</span> <span style="font-size: 10pt; background: silver; color: black; font-family: 'Courier New'">AbstractDWRServlet</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">.getPost()</span> <span style="font-size: 10pt; color: black; font-family: 宋体">这个方法：<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"><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span>&nbsp;<span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;doPost(HttpServletRequest&nbsp;req,&nbsp;HttpServletResponse&nbsp;resp)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException,&nbsp;ServletException<br />
</span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.set(req,&nbsp;resp,&nbsp;getServletConfig(),&nbsp;getServletContext(),&nbsp;container);<br />
</span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletLoggingOutput.setExecutionContext(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processor.handle(req,&nbsp;resp);<br />
</span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000"><br />
</span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.unset();<br />
</span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletLoggingOutput.unsetExecutionContext();<br />
</span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">}<br />
</span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">注意processor.handle(req,&nbsp;resp);<br />
</span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;handle(HttpServletRequest&nbsp;req,&nbsp;HttpServletResponse&nbsp;resp)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException,&nbsp;ServletException<br />
</span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;pathInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;req.getPathInfo();<br />
</span><span style="color: #008080">20</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;servletPath&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;req.getServletPath();<br />
</span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(nullPathInfoWorkaround&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;pathInfo&nbsp;</span><span style="color: #000000">==</span>&nbsp;<span style="color: #0000ff">null</span><span style="color: #000000">)<br />
</span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">24</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pathInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;req.getServletPath();<br />
</span><span style="color: #008080">25</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servletPath&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;HtmlConstants.PATH_ROOT;<br />
</span><span style="color: #008080">26</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span style="color: #000000">"</span><span style="color: #000000">Default&nbsp;servlet&nbsp;suspected.&nbsp;pathInfo=</span><span style="color: #000000">"</span>&nbsp;<span style="color: #000000">+</span><span style="color: #000000">&nbsp;pathInfo&nbsp;</span><span style="color: #000000">+</span>&nbsp;<span style="color: #000000">"</span><span style="color: #000000">;&nbsp;contextPath=</span><span style="color: #000000">"</span>&nbsp;<span style="color: #000000">+</span><span style="color: #000000">&nbsp;req.getContextPath()&nbsp;</span><span style="color: #000000">+</span>&nbsp;<span style="color: #000000">"</span><span style="color: #000000">;&nbsp;servletPath=</span><span style="color: #000000">"</span>&nbsp;<span style="color: #000000">+</span><span style="color: #000000">&nbsp;servletPath);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">$NON-NLS-1$&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">$NON-NLS-2$&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">$NON-NLS-3$</span><span style="color: #008000"><br />
</span><span style="color: #008080">27</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">28</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">29</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pathInfo&nbsp;</span><span style="color: #000000">==</span>&nbsp;<span style="color: #0000ff">null</span>&nbsp;<span style="color: #000000">||</span><span style="color: #000000"><br />
</span><span style="color: #008080">30</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pathInfo.length()&nbsp;</span><span style="color: #000000">==</span>&nbsp;<span style="color: #000000">0</span>&nbsp;<span style="color: #000000">||</span><span style="color: #000000"><br />
</span><span style="color: #008080">31</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pathInfo.equals(HtmlConstants.PATH_ROOT))<br />
</span><span style="color: #008080">32</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">33</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp.sendRedirect(req.getContextPath()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;servletPath&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;HtmlConstants.FILE_INDEX);<br />
</span><span style="color: #008080">34</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">35</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span>&nbsp;<span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pathInfo.startsWith(HtmlConstants.FILE_INDEX))<br />
</span><span style="color: #008080">36</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">37</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index.handle(req,&nbsp;resp);<br />
</span><span style="color: #008080">38</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">39</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span>&nbsp;<span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pathInfo.startsWith(HtmlConstants.PATH_TEST))<br />
</span><span style="color: #008080">40</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">41</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test.handle(req,&nbsp;resp);<br />
</span><span style="color: #008080">42</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">43</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span>&nbsp;<span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pathInfo.startsWith(HtmlConstants.PATH_INTERFACE))<br />
</span><span style="color: #008080">44</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">45</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iface.handle(req,&nbsp;resp);<br />
</span><span style="color: #008080">46</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">47</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span>&nbsp;<span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pathInfo.startsWith(HtmlConstants.PATH_EXEC))<br />
</span><span style="color: #008080">48</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">49</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exec.handle(req,&nbsp;resp);<br />
</span><span style="color: #008080">50</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">51</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span>&nbsp;<span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pathInfo.equalsIgnoreCase(HtmlConstants.FILE_ENGINE))<br />
</span><span style="color: #008080">52</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">53</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.doFile(req,&nbsp;resp,&nbsp;HtmlConstants.FILE_ENGINE,&nbsp;HtmlConstants.MIME_JS);<br />
</span><span style="color: #008080">54</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">55</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span>&nbsp;<span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pathInfo.equalsIgnoreCase(HtmlConstants.FILE_UTIL))<br />
</span><span style="color: #008080">56</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">57</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.doFile(req,&nbsp;resp,&nbsp;HtmlConstants.FILE_UTIL,&nbsp;HtmlConstants.MIME_JS);<br />
</span><span style="color: #008080">58</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">59</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span>&nbsp;<span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pathInfo.equalsIgnoreCase(HtmlConstants.FILE_DEPRECATED))<br />
</span><span style="color: #008080">60</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">61</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.doFile(req,&nbsp;resp,&nbsp;HtmlConstants.FILE_DEPRECATED,&nbsp;HtmlConstants.MIME_JS);<br />
</span><span style="color: #008080">62</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">63</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
</span><span style="color: #008080">64</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080">65</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.warn(</span><span style="color: #000000">"</span><span style="color: #000000">Page&nbsp;not&nbsp;found&nbsp;(</span><span style="color: #000000">"</span>&nbsp;<span style="color: #000000">+</span><span style="color: #000000">&nbsp;pathInfo&nbsp;</span><span style="color: #000000">+</span>&nbsp;<span style="color: #000000">"</span><span style="color: #000000">).&nbsp;In&nbsp;debug/test&nbsp;mode&nbsp;try&nbsp;viewing&nbsp;/[WEB-APP]/dwr/</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">$NON-NLS-1$&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">$NON-NLS-2$</span><span style="color: #008000"><br />
</span><span style="color: #008080">66</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp.sendError(HttpServletResponse.SC_NOT_FOUND);<br />
</span><span style="color: #008080">67</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">68</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">69</span>&nbsp;</div>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt; color: black; font-family: 宋体">也就只有这几种类型的请求，还记得</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWREngine._sendData</span> <span style="font-size: 10pt; color: black; font-family: 宋体">吗？里面有这么一句：&#8220;</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">batch.req.open("GET", batch.path + "/exec/" + statsInfo + "?" + query, batch.async);</span> <span style="font-size: 10pt; color: black; font-family: 宋体">&#8221;看到他的请求路径是</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">exec</span> <span style="font-size: 10pt; color: black; font-family: 宋体">，对应在</span> <strong><span style="font-size: 10pt; font-family: 'Courier New'">processor.handle(req, resp);</span> </strong><span style="font-size: 10pt; font-family: 宋体">这个方法里就是</span> <span style="font-size: 10pt; font-family: 'Courier New'">exec</span> <span style="font-size: 10pt; font-family: 宋体">，在刚才的</span> <span style="font-size: 10pt; font-family: 'Courier New'">JAVA</span> <span style="font-size: 10pt; font-family: 宋体">代码里我们已经看到过了是括号内的代码（</span> <strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">else</span> </strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">if</span> </strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(pathInfo.startsWith(HtmlConstants.</span> <em><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">PATH_EXEC</span> </em><span style="font-size: 10pt; color: black; font-family: 'Courier New'">))</span> <span style="font-size: 10pt; font-family: 宋体">），而</span> <span style="font-size: 10pt; font-family: 'Courier New'">exec</span> <span style="font-size: 10pt; font-family: 宋体">早已在</span> <span style="font-size: 10pt; font-family: 'Courier New'">servlet</span> <span style="font-size: 10pt; font-family: 宋体">初始化的时候就已经设置为</span> <span style="font-size: 10pt; background: silver; color: black; font-family: 'Courier New'">DefaultExecProcessor</span> <span style="font-size: 10pt; color: black; font-family: 宋体">，它的函数</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">hadle()</span> <span style="font-size: 10pt; color: black; font-family: 宋体">就是具体对</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">js</span> <span style="font-size: 10pt; color: black; font-family: 宋体">调用</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">java</span> <span style="font-size: 10pt; color: black; font-family: 宋体">类方法的实现了。</span> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span> <span style="font-size: 10pt; color: black; font-family: 宋体">是一个小型的</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">AJAX</span> <span style="font-size: 10pt; color: black; font-family: 宋体">框架，它的实现思路简单，其实有很多人在开发中一定也有过类似的想法。它之所以现在才出现我想大概还是要归功于异步</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">javascript</span> <span style="font-size: 10pt; color: black; font-family: 宋体">消息发送这样的技术成为现实。所以我又想</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">AJAX</span> <span style="font-size: 10pt; color: black; font-family: 宋体">，从技术上说只能是</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">javascript</span> <span style="font-size: 10pt; color: black; font-family: 宋体">有了一个飞跃性的进步，而</span> <span style="font-size: 10pt; color: black; font-family: 'Courier New'">AJAX</span> <span style="font-size: 10pt; color: black; font-family: 宋体">的最终成功却要靠软件工程。</span> </p>
<img src ="http://www.blogjava.net/i369/aggbug/155211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-23 10:37 <a href="http://www.blogjava.net/i369/articles/155211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR源码学习（一）</title><link>http://www.blogjava.net/i369/articles/155212.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 23 Oct 2007 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/155212.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/155212.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/155212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/155212.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/155212.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: DWR源码学习（一） DWR一个外国人实现的很有前途的AJAX框架。多余的话就不说了，请看DWR的例子程序：web.xml&nbsp;1&lt;?xml&nbsp;version="1.0"&nbsp;encoding="ISO-8859-1"?&gt;&nbsp;2&lt;!DOCTYPE&nbsp;web-app&nbsp;PUBLIC&nbsp;"-//Sun&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/155212.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/155212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-23 10:37 <a href="http://www.blogjava.net/i369/articles/155212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA反射机制</title><link>http://www.blogjava.net/i369/articles/154996.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 22 Oct 2007 06:41:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/154996.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/154996.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/154996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/154996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/154996.html</trackback:ping><description><![CDATA[JAVA反射机制<br />
&nbsp;&nbsp;&nbsp;&nbsp;JAVA反射机制是在运行状态中，对于任意一个类，都能够知道这个类的所有属性和方法；对于任意一个对象，都能够调用它的任意一个方法；这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。<br />
Java反射机制主要提供了以下功能：&nbsp;在运行时判断任意一个对象所属的类；在运行时构造任意一个类的对象；在运行时判断任意一个类所具有的成员变量和方法；在运行时调用任意一个对象的方法；生成动态代理。<br />
1.&nbsp;得到某个对象的属性<br />
<br />
1&nbsp;public&nbsp;Object&nbsp;getProperty(Object&nbsp;owner,&nbsp;String&nbsp;fieldName)&nbsp;throws&nbsp;Exception&nbsp;{<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;ownerClass&nbsp;=&nbsp;owner.getClass();<br />
3&nbsp;<br />
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field&nbsp;field&nbsp;=&nbsp;ownerClass.getField(fieldName);<br />
5&nbsp;<br />
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;property&nbsp;=&nbsp;field.get(owner);<br />
7&nbsp;<br />
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;property;<br />
9&nbsp;}<br />
Class&nbsp;ownerClass&nbsp;=&nbsp;owner.getClass()：得到该对象的Class。<br />
<br />
Field&nbsp;field&nbsp;=&nbsp;ownerClass.getField(fieldName)：通过Class得到类声明的属性。<br />
<br />
Object&nbsp;property&nbsp;=&nbsp;field.get(owner)：通过对象得到该属性的实例，如果这个属性是非公有的，这里会报IllegalAccessException。<br />
<br />
2.&nbsp;得到某个类的静态属性<br />
<br />
&nbsp;1&nbsp;public&nbsp;Object&nbsp;getStaticProperty(String&nbsp;className,&nbsp;String&nbsp;fieldName)<br />
&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;Exception&nbsp;{<br />
&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;ownerClass&nbsp;=&nbsp;Class.forName(className);<br />
&nbsp;4&nbsp;<br />
&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field&nbsp;field&nbsp;=&nbsp;ownerClass.getField(fieldName);<br />
&nbsp;6&nbsp;<br />
&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;property&nbsp;=&nbsp;field.get(ownerClass);<br />
&nbsp;8&nbsp;<br />
&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;property;<br />
10&nbsp;}<br />
<br />
Class&nbsp;ownerClass&nbsp;=&nbsp;Class.forName(className)&nbsp;：首先得到这个类的Class。<br />
<br />
Field&nbsp;field&nbsp;=&nbsp;ownerClass.getField(fieldName)：和上面一样，通过Class得到类声明的属性。<br />
<br />
Object&nbsp;property&nbsp;=&nbsp;field.get(ownerClass)&nbsp;：这里和上面有些不同，因为该属性是静态的，所以直接从类的Class里取。<br />
<br />
3.&nbsp;执行某对象的方法<br />
<br />
&nbsp;1&nbsp;public&nbsp;Object&nbsp;invokeMethod(Object&nbsp;owner,&nbsp;String&nbsp;methodName,&nbsp;Object[]&nbsp;args)&nbsp;throws&nbsp;Exception&nbsp;{<br />
&nbsp;2&nbsp;<br />
&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;ownerClass&nbsp;=&nbsp;owner.getClass();<br />
&nbsp;4&nbsp;<br />
&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class[]&nbsp;argsClass&nbsp;=&nbsp;new&nbsp;Class[args.length];<br />
&nbsp;6&nbsp;<br />
&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0,&nbsp;j&nbsp;=&nbsp;args.length;&nbsp;i&nbsp;&lt;&nbsp;j;&nbsp;i++)&nbsp;{<br />
&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argsClass[i]&nbsp;=&nbsp;args[i].getClass();<br />
&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
10&nbsp;<br />
11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method&nbsp;=&nbsp;ownerClass.getMethod(methodName,&nbsp;argsClass);<br />
12&nbsp;<br />
13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;method.invoke(owner,&nbsp;args);<br />
14&nbsp;}<br />
Class&nbsp;owner_class&nbsp;=&nbsp;owner.getClass()&nbsp;：首先还是必须得到这个对象的Class。<br />
<br />
5～9行：配置参数的Class数组，作为寻找Method的条件。<br />
<br />
Method&nbsp;method&nbsp;=&nbsp;ownerClass.getMethod(methodName,&nbsp;argsClass)：通过Method名和参数的Class数组得到要执行的Method。<br />
<br />
method.invoke(owner,&nbsp;args)：执行该Method，invoke方法的参数是执行这个方法的对象，和参数数组。返回值是Object，也既是该方法的返回值。<br />
<br />
4.&nbsp;执行某个类的静态方法<br />
<br />
&nbsp;1&nbsp;public&nbsp;Object&nbsp;invokeStaticMethod(String&nbsp;className,&nbsp;String&nbsp;methodName,<br />
&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;args)&nbsp;throws&nbsp;Exception&nbsp;{<br />
&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;ownerClass&nbsp;=&nbsp;Class.forName(className);<br />
&nbsp;4&nbsp;<br />
&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class[]&nbsp;argsClass&nbsp;=&nbsp;new&nbsp;Class[args.length];<br />
&nbsp;6&nbsp;<br />
&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0,&nbsp;j&nbsp;=&nbsp;args.length;&nbsp;i&nbsp;&lt;&nbsp;j;&nbsp;i++)&nbsp;{<br />
&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argsClass[i]&nbsp;=&nbsp;args[i].getClass();<br />
&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
10&nbsp;<br />
11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method&nbsp;=&nbsp;ownerClass.getMethod(methodName,&nbsp;argsClass);<br />
12&nbsp;<br />
13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;method.invoke(null,&nbsp;args);<br />
14&nbsp;}<br />
<br />
基本的原理和实例3相同，不同点是最后一行，invoke的一个参数是null，因为这是静态方法，不需要借助实例运行。<br />
<br />
5.&nbsp;新建实例<br />
&nbsp;1&nbsp;<br />
&nbsp;2&nbsp;public&nbsp;Object&nbsp;newInstance(String&nbsp;className,&nbsp;Object[]&nbsp;args)&nbsp;throws&nbsp;Exception&nbsp;{<br />
&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;newoneClass&nbsp;=&nbsp;Class.forName(className);<br />
&nbsp;4&nbsp;<br />
&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class[]&nbsp;argsClass&nbsp;=&nbsp;new&nbsp;Class[args.length];<br />
&nbsp;6&nbsp;<br />
&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0,&nbsp;j&nbsp;=&nbsp;args.length;&nbsp;i&nbsp;&lt;&nbsp;j;&nbsp;i++)&nbsp;{<br />
&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argsClass[i]&nbsp;=&nbsp;args[i].getClass();<br />
&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
10&nbsp;<br />
11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;cons&nbsp;=&nbsp;newoneClass.getConstructor(argsClass);<br />
12&nbsp;<br />
13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;cons.newInstance(args);<br />
14&nbsp;<br />
15&nbsp;}<br />
<br />
这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数，可以直接使用newoneClass.newInstance()来实现。<br />
<br />
Class&nbsp;newoneClass&nbsp;=&nbsp;Class.forName(className)：第一步，得到要构造的实例的Class。<br />
<br />
第5～第9行：得到参数的Class数组。<br />
<br />
Constructor&nbsp;cons&nbsp;=&nbsp;newoneClass.getConstructor(argsClass)：得到构造子。<br />
<br />
cons.newInstance(args)：新建实例。<br />
<br />
6.&nbsp;判断是否为某个类的实例<br />
<br />
1&nbsp;public&nbsp;boolean&nbsp;isInstance(Object&nbsp;obj,&nbsp;Class&nbsp;cls)&nbsp;{<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;cls.isInstance(obj);<br />
3&nbsp;}<br />
<br />
7.&nbsp;得到数组中的某个元素<br />
1&nbsp;public&nbsp;Object&nbsp;getByArray(Object&nbsp;array,&nbsp;int&nbsp;index)&nbsp;{<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Array.get(array,index);<br />
3&nbsp;}<br />
<br />
<img src ="http://www.blogjava.net/i369/aggbug/154996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-22 14:41 <a href="http://www.blogjava.net/i369/articles/154996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在spring框架中解决多数据源的问题</title><link>http://www.blogjava.net/i369/articles/152880.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 15 Oct 2007 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/152880.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/152880.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/152880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/152880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/152880.html</trackback:ping><description><![CDATA[<table width="100%">
    <tbody>
        <tr>
            <td>
            <p><span style="font-family: 宋体"><span Times p < Roman?;&nbsp;>
            <h2>问题的分析</h2>
            <p><span style="font-family: 宋体">我首先想到在</span>spring<span Times 宋体;? Roman?;?font-family:>但是，我很快发现一个问题：当多用户同时并发访问数据库的时候会出现资源争用的问题。这都是&#8220;单例模式&#8221;惹的祸。众所周知，我们在使用</span>spring<span Times 宋体;? Roman?;?font-family:>通过以上的分析，解决多数据源访问问题的关键，就集中在</span>sessionFactory<span Times Roman?;??>(一)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>采用Decorator设计模式
            <h4></h4>
            <p><span style="font-family: 宋体">要解决这个问题，我的思路锁定在了这个</span>dataSource<span Times 10.5pt; 宋体;? font-family: Roman?;?font-size:>什么是&#8220;</span><span Times Roman?; New New?center?></p>
            <p><span Times Roman?;??>(二)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>设计MultiDataSource类
            <h4></h4>
            <p><span style="font-family: 宋体">现在回到我们的问题，我们需要对</span>dataSource<span Times Roman?;?center?></p>
            <p>对比原Decorator<span Times span &nbsp;&nbsp;< Roman?;class&nbsp;MultiDataSource&nbsp;implements&nbsp;DataSource&nbsp;{>
            <li>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;DataSource&nbsp;dataSource&nbsp;=&nbsp;null; &nbsp;&nbsp;
            <li>public&nbsp;MultiDataSource(DataSource&nbsp;dataSource){ &nbsp;&nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.dataSource&nbsp;=&nbsp;dataSource; &nbsp;&nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;(non-Javadoc) &nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;javax.sql.DataSource#getConnection() &nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Connection&nbsp;getConnection()&nbsp;throws&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;getDataSource().getConnection(); &nbsp;&nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;//其它DataSource接口应当实现的方法 &nbsp;&nbsp;
            <li>&nbsp;&nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;DataSource&nbsp;getDataSource(){ &nbsp;&nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.dataSource; &nbsp;&nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setDataSource(DataSource&nbsp;dataSource)&nbsp;{ &nbsp;&nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.dataSource&nbsp;=&nbsp;dataSource; &nbsp;&nbsp;
            <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
            <li>} &nbsp;&nbsp; </li>
            <ol></ol>
                <div></div>
                <p>客户在发出请求的时候，将dataSourceName放到request中，然后把request中的数据源名通过调用new <span style="font-size: 10pt; color: black; font-family: 'Courier New'">MultiDataSource(dataSource)</span><span ?Courier New??>时可以告诉</span><span Courier New?; ?Courier New??>客户需要的数据源，就可以实现动态切换数据源了。但细心的朋友会发现这在单例的情况下就是问题的，因为</span><span Courier New?; ?Courier New??>在系统中只有一个对象，它的实例变量</span><span Courier New?; ?Courier New??>也只有一个，就如同一个静态变量一般。正因为如此，</span><span Times Roman?;??>(三)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>单例模式下的MultiDataSource
                <h4></h4>
                <p><span style="font-family: 宋体">在单例模式下，由于我们在每次调用</span>MultiDataSource
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug("dataSourceName:"+dataSourceName); &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(dataSourceName==null||dataSourceName.equals("")){ &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.dataSource; &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(DataSource)this.applicationContext.getBean(dataSourceName); &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(NoSuchBeanDefinitionException&nbsp;ex){ &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;DaoException("There&nbsp;is&nbsp;not&nbsp;the&nbsp;dataSource&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li>
                <ol></ol>
                    <div></div>
                    <p>值得一提的是，我需要的数据源已经都在spring<span Times Roman?; ?Courier New??>就是其对应的</span><span Courier span New?;<>bean&nbsp;id="dataSource1"&nbsp;&nbsp;</span>
                    <li>&nbsp;&nbsp;&nbsp;&nbsp;class="org.apache.commons.dbcp.BasicDataSource"&gt;&nbsp;&nbsp;
                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="driverClassName"&gt;&nbsp;&nbsp;
                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;oracle.jdbc.driver.OracleDrivervalue&gt;&nbsp;&nbsp;
                    <li>&nbsp;&nbsp;&nbsp;&nbsp;property&gt;&nbsp;
                    <li>&nbsp;&nbsp;&nbsp;&nbsp;...... &nbsp;&nbsp;
                    <li>bean&gt;&nbsp;&nbsp;
                    <li>&lt;bean&nbsp;id="dataSource2"&nbsp;&nbsp;
                    <li>&nbsp;&nbsp;&nbsp;&nbsp;class="org.apache.commons.dbcp.BasicDataSource"&gt;&nbsp;&nbsp;
                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="driverClassName"&gt;&nbsp;&nbsp;
                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;oracle.jdbc.driver.OracleDrivervalue&gt;&nbsp;
                    <li>&nbsp;&nbsp;&nbsp;&nbsp;property&gt;&nbsp;&nbsp;&nbsp;
                    <li>&nbsp;&nbsp;&nbsp;&nbsp;...... &nbsp;&nbsp;
                    <li>bean&gt;&nbsp;&nbsp;&nbsp; </li>
                    <ol></ol>
                        <div></div>
                        <p>为了得到spring<span Times Roman?; ?Courier New??>，并且实现方法：</span></p>
                        <div>java 代码</div>
                        <div>
                        <ol>
                            <li>private&nbsp;ApplicationContext&nbsp;applicationContext&nbsp;=&nbsp;null; &nbsp;&nbsp;
                            <li>public&nbsp;void&nbsp;setApplicationContext(ApplicationContext&nbsp;applicationContext)&nbsp;throws&nbsp;BeansException&nbsp;{ &nbsp;&nbsp;
                            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.applicationContext&nbsp;=&nbsp;applicationContext; &nbsp;&nbsp;
                            <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li>
                        </ol>
                        </div>
                        <p>如此这样，我就可以通过<strong><span Courier New?; ?Courier New??>得到</span><span Courier New?; ?Courier New??>了。</span></p>
                        <h4>(四)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>通过线程传递dataSourceName</h4>
                        <p><span style="font-family: 宋体">查看以上设计，</span>MultiDataSource<span Times Roman?;?center?><span style="font-family: 宋体"><img height="146" alt="" src="http://fangang.javaeye.com/upload/picture/pic/3752/58696c8a-fd62-4a7f-b6f1-1973c1ef7954.jpg" width="480" /></span></p>
                        <span Times span Roman?;<>class&nbsp;SpObserver&nbsp;{ &nbsp;&nbsp;</span>
                        <li>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;ThreadLocal&nbsp;local&nbsp;=&nbsp;new&nbsp;ThreadLocal(); &nbsp;&nbsp;
                        <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;putSp(String&nbsp;sp)&nbsp;{ &nbsp;&nbsp;
                        <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local.set(sp); &nbsp;&nbsp;
                        <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                        <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;String&nbsp;getSp()&nbsp;{ &nbsp;&nbsp;
                        <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(String)local.get(); &nbsp;&nbsp;
                        <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                        <li>} &nbsp;&nbsp; </li>
                        <ol></ol>
                            <div></div>
                            <p>做一个filter<span Times Roman?; ?Courier New??>，将</span>request<span ?Courier New??>中的</span>dataSourceName<span Times Roman?; ?Courier New??>对象。</span>
                            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sp&nbsp;=&nbsp;SpObserver.getSp(); &nbsp;&nbsp;
                            <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;getDataSource(sp); &nbsp;&nbsp;
                            <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li>
                            <ol></ol>
                                <div></div>
                                <p>完整的MultiDataSource<span Times Roman?;??>(五)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>动态添加数据源
                                <h4></h4>
                                <p><span style="font-family: 宋体">通过以上方案，我们解决了动态分配数据源的问题，但你可能提出疑问：方案中的数据源都是配置在</span>spring<span Times Roman?; ?Courier New??>中（见附件）。不通过配置文件直接加载对象，在</span><span Courier New?; ?Courier New??>的源码中也有，感兴趣的朋友可以自己研究。</span></span></p>
                                <h4>(六)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在spring中配置</h4>
                                <p><span style="font-family: 宋体">在完成了所有这些设计以后，我最后再唠叨一句。我们应当在</span>spring<span Times span Roman?;<>bean&nbsp;id="dynamicLoadBean"&nbsp;class="com.htxx.service.dao.DynamicLoadBean"&gt;bean&gt;&nbsp;&nbsp; </span>
                                <li>&lt;bean&nbsp;id="dataSource"&nbsp;class="com.htxx.service.dao.MultiDataSource"&gt;&nbsp;&nbsp;
                                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="dataSource"&gt;&nbsp;&nbsp;
                                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&nbsp;bean="dataSource1"&nbsp;/&gt;&nbsp;&nbsp;
                                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property&gt;&nbsp;&nbsp;
                                <li>&nbsp;&nbsp;&nbsp;&nbsp;bean&gt;&nbsp;&nbsp;
                                <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean&nbsp;id="sessionFactory"&nbsp;class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;&nbsp;&nbsp;
                                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="dataSource"&gt;&nbsp;&nbsp;
                                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref&nbsp;bean="dataSource"&nbsp;/&gt;&nbsp;&nbsp;
                                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property&gt;&nbsp;&nbsp;
                                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...... &nbsp;&nbsp;
                                <li>&nbsp;&nbsp;&nbsp;&nbsp;bean&gt;&nbsp;&nbsp; </li>
                                <ol></ol>
                                    <div></div>
                                    <p>其中dataSource<span Times 宋体;? Roman?;?font-family:>以上方案与其它方案相比，它有哪些优势呢？</span></p>
                                    <p><span style="font-family: 宋体">首先，这个方案完全是在</span>spring<span Times 宋体;? Roman?;?font-family:>其次，实现简单，易于维护。这个方案虽然我说了这么多东西，其实都是分析，真正需要我们写的代码就只有</span>MultiDataSource<span Times 宋体;? Roman?;?font-family:>最后，这个方案可以使单数据源与多数据源兼容。这个方案完全不影响</span>BUS<span Times 宋体;? Roman?;?font-family:>相关博客：<a href="http://www.javaeye.com/topic/91667">再析在spring框架中解决多数据源的问题</a> </span></p>
                                    </span></span></span></span></span></span></strong></td>
                                </tr>
                            </tbody>
                        </table>
                        <div style="padding-right: 10px; border-top: gray 1px solid; padding-left: 10px; padding-bottom: 10px; margin: 15px 0px 0px 10px; padding-top: 10px">
                        <table cellspacing="0" cellpadding="2" width="95%" align="center" border="1">
                            <tbody>
                                <tr>
                                    <td style="background: #d1d7dc" align="center" width="100%" colspan="3"><strong>example.rar</strong></td>
                                </tr>
                                <tr>
                                    <td width="15%">&nbsp;描述:</td>
                                    <td width="75%">&nbsp;源码及示例 </td>
                                    <td align="center" width="10%" rowspan="4"><img alt="" src="http://fangang.javaeye.com/images/forum/icon_clip.gif" border="0" /><br />
                                    <a href="http://fangang.javaeye.com/topics/download/11b45eb4-9732-4fcb-85de-dd88238958b2"><strong>下载</strong></a> </td>
                                </tr>
                                <tr>
                                    <td width="15%">&nbsp;文件名:</td>
                                    <td width="75%">&nbsp;example.rar</td>
                                </tr>
                                <tr>
                                    <td width="15%">&nbsp;文件大小:</td>
                                    <td width="75%">&nbsp;32 KB</td>
                                </tr>
                                <tr>
                                    <td width="15%">&nbsp;下载过的:</td>
                                    <td width="75%">&nbsp;文件被下载或查看 521 次</td>
                                </tr>
                            </tbody>
                        </table>
                        <br />
                        <div style="margin-top: 1px; margin-left: 15px">
                        <h2><a title="永久链接：再析在spring框架中解决多数据源的问题" href="http://fangang.javaeye.com/blog/91667">再析在spring框架中解决多数据源的问题</a> </h2>
                        </div>
                        <div style="margin-top: 5px; margin-left: 15px"><strong>关键字:</strong> Spring &nbsp; Hibernate Decorator 设计模式&nbsp;&nbsp;&nbsp;&nbsp; </div>
                        <div style="margin-top: 10px; margin-left: 15px; overflow: auto">
                        <table width="100%">
                            <tbody>
                                <tr>
                                    <td><span  Times 72486? blog fangang.javaeye.com Roman?;?http:>如何在</a></span><a>spring</a><span Times 宋体;? Roman?;?font-family:>总结多数据源的问题，其实它需要分为以下三种情况：各个数据源的数据结构不同、各个数据源的数据结构相同、各个数据源的数据结构部分相同又有部分不同。对于第二种情况，各个数据源的数据结构相同，我们使用一个</span>sessionFactory<span Times 宋体;? Roman?;?font-family:>对于各个数据源的数据结构不同的情况，使用一个</span>sessionFactory<span Times 宋体;? Roman?;?font-family:>与</span>MultiDataSource
                                    <p>&nbsp;</p>
                                    <p><span style="font-family: 宋体"><img height="387" alt="" src="http://fangang.javaeye.com/upload/picture/pic/3974/10f6052e-a238-46fd-b6d3-b62321b2c51d.jpg" width="563" /></span></p>
                                    <p><span style="font-family: 宋体">在该方案中，</span>SessionFactory<span Times Roman?; ?Courier New??>接口，</span>Decorator<span ?Courier New??>就是</span>MultiSessionFactory<span ?Courier New??>，</span>SessionFactory1<span ?Courier New??>和</span>SessionFactory2<span ?Courier New??>往往是</span>spring<span ?Courier New??>的</span><span Courier New?; ?Courier New??>。细心的朋友可能会注意，实际上</span><span Courier New?; ?Courier New??>并不是</span>SessionFactory<span Times Roman?; ?Courier New??>的时候其实并不是真正地得到了它，而是得到了一个</span>SessionFactory<span Times Roman?; ?Courier New??>重写了</span>getObject()<span Times Roman?; ?Courier New??>。</span><span Courier 宋体;? New?;?font-family:>在整个这个方案中，我们需要实现的只有</span>MultiSessionFactory<span Times Roman?; ?Courier New??>。</span>MultiSessionFactory<span Times span Roman?;<>class&nbsp;MultiSessionFactory&nbsp;implements&nbsp;SessionFactory,&nbsp;ApplicationContextAware&nbsp;{ &nbsp;&nbsp;</span>
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;long&nbsp;serialVersionUID&nbsp;=&nbsp;2064557324203496378L; &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;Log&nbsp;log&nbsp;=&nbsp;LogFactory.getLog(MultiSessionFactory.class); &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;ApplicationContext&nbsp;applicationContext&nbsp;=&nbsp;null; &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;SessionFactory&nbsp;sessionFactory&nbsp;=&nbsp;null; &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ApplicationContext&nbsp;getApplicationContext()&nbsp;{ &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;applicationContext; &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setApplicationContext(ApplicationContext&nbsp;applicationContext)&nbsp;{ &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.applicationContext&nbsp;=&nbsp;applicationContext; &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;SessionFactory&nbsp;getSessionFactory(String&nbsp;sessionFactoryName)&nbsp;{ &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug("sessionFactoryName:"+sessionFactoryName); &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(sessionFactoryName==null||sessionFactoryName.equals("")){ &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sessionFactory; &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(SessionFactory)this.getApplicationContext().getBean(sessionFactoryName); &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(NoSuchBeanDefinitionException&nbsp;ex){ &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;DaoException("There&nbsp;is&nbsp;not&nbsp;the&nbsp;sessionFactory&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;SessionFactory&nbsp;getSessionFactory()&nbsp;{ &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sessionFactoryName&nbsp;=&nbsp;SpObserver.getSp(); &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;getSessionFactory(sessionFactoryName); &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setSessionFactory(SessionFactory&nbsp;sessionFactory)&nbsp;{ &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.sessionFactory&nbsp;=&nbsp;sessionFactory; &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SessionFactory接口需要实现的方法 &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;
                                    <li>...... &nbsp;&nbsp;
                                    <li>&nbsp;&nbsp;
                                    <li>}&nbsp;&nbsp; </li>
                                    <ol></ol>
                                        <div></div>
                                        <p>MultiSessionFactory<span style="font-size: 10.5pt; font-family: 宋体">的完整代码见我提供的附件。</span><span Times Roman?; New span New<>bean&nbsp;id="sessionFactory"&nbsp;class="com.htxx.service.dao.MultiSessionFactory"&gt;&nbsp;&nbsp;</span>
                                        <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="sessionFactory"&gt;&lt;ref&nbsp;bean="hostSessionFactory"/&gt;property&gt;&nbsp;
                                        <li>&gt;&nbsp;&nbsp; </li>
                                        <ol></ol>
                                            <div></div>
                                            <p>SpServer<span style="font-size: 10.5pt; font-family: 宋体">的写法与<a href="http://fangang.javaeye.com/blog/72486">《如何在</a></span><span Times Roman?; 宋体;? New?font-family:>另外，在</span>spring<span Times 宋体;? Roman?;?font-family:>也许有些朋友对以上方案还不满意，因为在执行数据访问前毕竟还要多做一步指定</span>sessionFactory<span Times 宋体;? Roman?;?font-family:>另外，在这个方案中的核心是运用</span>Decorator<span Times 宋体;? Roman?;?font-family:>前面我已经给出了第一种和第二种情况的解决方案：各个数据源的数据结构不同的情况用</span>MultiSessionFactory<span Times Roman?; New 10px? padding-top: 10px; 0px 15px margin: padding-bottom: padding-left: solid; 1px gray border-top: New?padding-right:>
                                            <table cellspacing="0" cellpadding="2" width="95%" align="center" border="1">
                                                <tbody>
                                                    <tr>
                                                        <td style="background: #d1d7dc" align="center" width="100%" colspan="3"><strong>example.rar</strong></td>
                                                    </tr>
                                                    <tr>
                                                        <td width="15%">&nbsp;描述:</td>
                                                        <td width="75%">&nbsp;示例文件 </td>
                                                        <td align="center" width="10%" rowspan="4"><img alt="" src="http://fangang.javaeye.com/images/forum/icon_clip.gif" border="0" /><br />
                                                        <a href="http://fangang.javaeye.com/topics/download/ff2cdd35-efb4-4a79-96d2-3136b40533aa"><strong>下载</strong></a> </td>
                                                    </tr>
                                                    <tr>
                                                        <td width="15%">&nbsp;文件名:</td>
                                                        <td width="75%">&nbsp;example.rar</td>
                                                    </tr>
                                                    <tr>
                                                        <td width="15%">&nbsp;文件大小:</td>
                                                        <td width="75%">&nbsp;16 KB</td>
                                                    </tr>
                                                    <tr>
                                                        <td width="15%">&nbsp;下载过的:</td>
                                                        <td width="75%">&nbsp;文件被下载或查看 180 次</td>
                                                    </tr>
                                                </tbody>
                                            </table>
                                            <div></div>
                                            <div></div>
                                            </span>
                                        </tr>
                                    </tbody>
                                </table>
                                建议到原作者博客查看原文,那里有很好的回复讨论~http://fangang.javaeye.com/blog/72486<br />
                                </div>
                                </div>
<img src ="http://www.blogjava.net/i369/aggbug/152880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-15 09:53 <a href="http://www.blogjava.net/i369/articles/152880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR帮助说明－dwr的bug及其解决方法</title><link>http://www.blogjava.net/i369/articles/152877.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 15 Oct 2007 01:49:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/152877.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/152877.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/152877.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/152877.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/152877.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">使用</span>DWR<span Times 宋体;? Roman?;?font-family:>我在《</span><a title="永久链接：DWR帮助文档－dwr.xml文件的配置" href="http://fangang.javaeye.com/blog/119767">DWR帮助文档－dwr.xml文件的配置</a><span Times span Roman?;Error&nbsp;marshalling&nbsp;com.htxx.demo.model.Employee:&nbsp;Ignoring&nbsp;request&nbsp;to&nbsp;inline&nbsp;on&nbsp;reference&nbsp;<>for:&nbsp;Object:s0:{departmentId=Simple:"001",&nbsp;departmentName=Simple:""u4EBA"u529B"u8D44"u6E90"u90E8",&nbsp;employees=Simple:null}.&nbsp;See&nbsp;the&nbsp;logs&nbsp;for&nbsp;more&nbsp;details. &nbsp;&nbsp;</span>
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.directwebremoting.convert.BasicObjectConverter.convertOutbound(BasicObjectConverter.java:200) &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.directwebremoting.dwrp.DefaultConverterManager.convertOutbound(DefaultConverterManager.java:192) &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>...&nbsp;&nbsp;&nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>Caused&nbsp;by:&nbsp;java.lang.IllegalStateException:&nbsp;Ignoring&nbsp;request&nbsp;to&nbsp;inline&nbsp;on&nbsp;reference&nbsp;for:&nbsp;Object:s0:{departmentId=Simple:"001",&nbsp;departmentName=Simple:""u4EBA"u529B"u8D44"u6E90"u90E8",&nbsp;employees=Simple:null} &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.directwebremoting.dwrp.AbstractOutboundVariable.getReferenceVariable(AbstractOutboundVariable.java:148) &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.directwebremoting.dwrp.DefaultConverterManager.convertOutbound(DefaultConverterManager.java:181) &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.directwebremoting.convert.BasicObjectConverter.convertOutbound(BasicObjectConverter.java:189) &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;28&nbsp;more &nbsp;&nbsp; </li>
<ol></ol>
    <div></div>
    <p>org.</p>
    <p><span style="font-family: 宋体">仔细查看和跟踪源码，我发现这个问题出在</span>AbstractOutboundVariable<span Times Roman?; ?Courier New??>
    <div>java 代码</div>
    <div>
    <ol>
        <li>/*&nbsp;(non-Javadoc) &nbsp;
        <li>&nbsp;*&nbsp;@see&nbsp;org.directwebremoting.OutboundVariable#getReference() &nbsp;
        <li>&nbsp;*/&nbsp;&nbsp;
        <li>public&nbsp;OutboundVariable&nbsp;getReferenceVariable() &nbsp;&nbsp;
        <li>{ &nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(reference&nbsp;==&nbsp;null) &nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference&nbsp;=&nbsp;new&nbsp;ReferenceOutboundVariable(getVariableName()); &nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(forcedInlineStatus) &nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalStateException("Ignoring&nbsp;request&nbsp;to&nbsp;inline&nbsp;on&nbsp;reference&nbsp;for:&nbsp;"&nbsp;+&nbsp;this); &nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setInline(false); &nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;reference; &nbsp;&nbsp;
        <li>}&nbsp;&nbsp; </li>
    </ol>
    </div>
    <p align="left">当<span style="font-size: 10pt; color: black; font-family: 'Courier New'">dwr</span><span ?Courier New??>已经使用了某个对象以后，就会将它的</span><span Courier New?; ?Courier New??>置为</span><span Courier New?; ?Courier New??>，当</span><span Courier New?; ?Courier New??>再次装载这个对象的时候就会强制抛出</span><span Courier New?; ?Courier New??>异常。这在通常情况下是没有问题的，但在我们前面提到的例子中就有问题了。当</span><span Courier New?; ?Courier New??>转换员工值对象集合的时候，首先装载和转换了员工甲，他因为是&#8220;研发</span><span Courier New?; ?Courier New??>部&#8221;所以</span><span Courier New?; ?Courier New??>也装载了&#8220;研发</span><span Courier New?; ?Courier New??>部&#8221;这个部门值对象。然后</span><span Courier New?; ?Courier New??>开始装载和转换员工乙。由于员工乙也是&#8220;研发</span><span Courier New?; ?Courier New??>部&#8221;，因此</span><span Courier New?; ?Courier New??>又开始装载&#8220;研发</span><span Courier New?; ?Courier New??>部&#8221;这个值对象，但突然发现这个值对象已经装载过了，因而就抛出了以上错误。</span></p>
    <p><span style="font-size: 10pt; color: black; font-family: 宋体">如果我们希望整合</span><span Courier New?; ?Courier New??>、</span><span Courier New?; ?Courier New??>、</span><span Courier New?; ?Courier New??>到一起进行项目开发，以上这个问题是怎么也不能避免的，问题是如何解决。非常遗憾的是，</span><span Courier New?; ?Courier New??>官方似乎还没有要解决这个问题的意思，我思索再三以后决定，还是&#8220;自己动手丰衣足食&#8221;吧。解决的办法其实很简单，就是把</span><span Courier New?; ?Courier New??>行这个强制抛出异常注释掉，然后重新编译。这样修改以后就再也没有出现以上问题，同时至今也没有发现其它问题出现。</span><span Courier 宋体;? New?;?font-family:>这个问题我同样在《</span><a title="永久链接：DWR帮助文档－dwr.xml文件的配置" href="http://fangang.javaeye.com/blog/119767">DWR帮助文档－dwr.xml文件的配置</a><span  Times href="http://fangang.javaeye.com/blog/119767"  Roman?;?永久链接：DWR帮助文档－dwr.xml文件的配置?>DWR帮助文档－dwr.xml文件的配置</a></span><span Times 宋体;? Roman?;?font-family:>在使用</span>dwr<span Times ?Courier font-family: color: 10pt; New?;? #2a00ff; Roman?;?font-size:>Missing java bean property to match javascript property:[</span><span ?Courier New??>属性名</span><span Courier 宋体;? New?;?font-family:>如果将</span>log4j<span Times ?Courier font-family: color: 10pt; New?;? #2a00ff; Roman?;?font-size:>You may be missing the correct setter: setXXX()</span></p>
    <p><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">The property may be excluded using include or exclude rules.</span></p>
    <p><span style="font-family: 宋体">其实你并没有在</span>dwr<span Times 宋体;? Roman?;?font-family:>在使用</span>dwr
    <li>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.htxx.demo.model.Department$$EnhancerByCGLIB$$f4b4f445.getHibernateLazyInitializer() &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.directwebremoting.hibernate.H3BeanConverter.getClass(H3BeanConverter.java:139)&nbsp;&nbsp; </li>
    <ol></ol>
        <div></div>
        <p>之所以说这个异常比较离谱，是因为它似乎就没有dwr<span Times Roman?;?ST1?>3.2.0.rc4</span><span Times 宋体;? Roman?;?font-family:>这个还是</span>hibernate3<span Times ?Courier font-family: color: 10pt; New?;? Roman?;?font-size: red;>CharScanner; panic: </span><u><span Courier 宋体;? New?;?font-family:>遇到这个问题不要怕，其实解决的方法很简单，就是在</span>spring<span Times span Roman?;<>property&nbsp;name="hibernateProperties"&gt;&nbsp;&nbsp;</span>
        <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;props&gt;&nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop&nbsp;key="hibernate.query.factory_class"&gt;org.hibernate.hql.classic.ClassicQueryTranslatorFactoryprop&gt;&nbsp;&nbsp;
        <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props&gt;&nbsp;&nbsp;
        <li>property&nbsp;&nbsp; </li>
        <ol></ol>
            <div></div>
            <h2>六、在JDK1.4中运行和部署DWR2和hibernate3出现的问题</h2>
            <p><span style="font-family: 宋体">在</span>DWR2.0<span Times 宋体;? Roman?;?font-family:>同样的问题出现在</span>hibernate3<span Times 宋体;? Roman?;?font-family:>另外值得说明的是，以上</span>2</p>
            </u></span>
<img src ="http://www.blogjava.net/i369/aggbug/152877.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-15 09:49 <a href="http://www.blogjava.net/i369/articles/152877.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR帮助说明－服务器端程序的编写[转]</title><link>http://www.blogjava.net/i369/articles/152875.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 15 Oct 2007 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/152875.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/152875.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/152875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/152875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/152875.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">也许朋友们会以为这是</span><span Courier New?; ?Courier New??>官方</span><span Times 宋体;? Roman?;?font-family:>前面我谈到，</span>dwr<span Times 宋体;? Roman?;?font-family:>据说在其它一些</span>ajax<span Times 宋体;? Roman?;?font-family:>虽然</span>dwr<span Times 宋体;? Roman?;?font-family:>如果我们在写</span>bus<span Times 宋体;? Roman?;?font-family:>说了这么半天虚的，举一个例子来实际说明一下该怎样设计。在一个项目中需要使用</span>request<span Times span Roman?;<>class&nbsp;Context&nbsp;{ &nbsp;&nbsp;</span>
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;WebContext&nbsp;getContext(){ &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;WebContextFactory.get(); &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;HttpServletRequest&nbsp;getRequest(){ &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;getContext().getHttpServletRequest(); &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;HttpServletResponse&nbsp;getResponce(){ &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;getContext().getHttpServletResponse(); &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;HttpSession&nbsp;getSession(){ &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;getContext().getSession(); &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
<li>&nbsp;&nbsp;
<li>} &nbsp;&nbsp;
<li>&nbsp;&nbsp; </li>
<ol></ol>
    <div></div>
    <p>然后写一个UserInfoUtil<span Times 宋体;? Roman?;?font-family:>前面谈完了</span>request<span Times 宋体;? Roman?;?font-family:>首先，我们可能在不同的项目中会对为项目提供多种权限校验的机制，比如通过部门级次进行校验、通过分配给用户的功能进行校验、通过用户的特殊身份（总经理、局长等）进行校验等。这些校验机制并不是每个</span>bus<span Times 宋体;? Roman?;?font-family:>另外，我们还可能出现，一些特殊的功能需要单独为它设计一个权限校验机制，这个机制只作用与它自己。</span></p>
    <p><span style="font-family: 宋体">还有一种情况是权限校验机制需要分不同的方法进行校验，如增删改一个校验机制，而查询是另一种校验机制。</span></p>
    <p><span style="font-family: 宋体">然后，我们不希望在开发过程中加上权限校验机制，这无疑会为我们的调试增加许多的不便。</span></p>
    <p><span style="font-family: 宋体">总结以上所有对权限校验的需求，使用</span>filter<span Times 宋体;? Roman?;?font-family:>我在前面的文章中提到，在页面端</span>dwr<span Times 宋体;? Roman?;?font-family:>最后我要提到的，就是</span>dwr<span Times 宋体;? Roman?;?font-family:>除此以外，与其它框架一样，我们在运用</span>dwr</p>
<img src ="http://www.blogjava.net/i369/aggbug/152875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-15 09:48 <a href="http://www.blogjava.net/i369/articles/152875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR帮助说明－如何编写通用的单行编辑框[转]</title><link>http://www.blogjava.net/i369/articles/152873.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 15 Oct 2007 01:47:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/152873.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/152873.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/152873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/152873.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/152873.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/i369/aggbug/152873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-15 09:47 <a href="http://www.blogjava.net/i369/articles/152873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR帮助说明－如何编写通用的列表显示框[转]</title><link>http://www.blogjava.net/i369/articles/152872.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 15 Oct 2007 01:46:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/152872.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/152872.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/152872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/152872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/152872.html</trackback:ping><description><![CDATA[<span Times Roman?; ?Courier New??>官方</span><span Times 宋体;? Roman?;?font-family:>看了</span>DWR<span Times 宋体;? Roman?;?font-family:>首先，我们先看一看</span>DWR<span Times span Roman?;<><span Times span Roman?;<>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">但在</span>js<span Times span Roman?;<></p>
<p><span style="font-family: 宋体">在这段代码中，</span>function(resultset){ &#8230; }<span Times span Roman?;<></p>
<p>&#8230;</p>
<p>function getResultset(resultset){ &#8230; };</p>
<p><span style="font-family: 宋体">甚至可以将后面这个函数写成这样：</span></p>
<p>getResultset = function(resultset){ &#8230; };</p>
<p><span style="font-family: 宋体">这样的代码比较奇怪是吧，习惯了就不奇怪了。</span></p>
<p>2<span Times Roman?; ?Courier New??>来删除</span><span Courier New?; ?Courier New??>中所有的行，除了那个作为模板的行，其</span><span Courier New?; ?Courier New??>取名为</span><span Courier New?; ?Courier New??>。这个名为</span><span Courier New?; ?Courier New??>的行十分重要，它被设置为不显示，但表格中的其它行都是由这一行进行克隆得到的。</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">3</span><span ?Courier New??>、执行一个循环语句，从</span><span Courier New?; ?Courier New??>中依次取出值对象，然后使用</span>DWR<span Times Roman?; ?Courier New??>使用模板行克隆一个新行，然后使用数个</span>DWR<span Times Roman?;?ST1?>002<span Times negative="False" numbertype="1" sourcevalue="2" w:st="on" unitname="&#8217;" tcsc="0"  Roman?;?False?>002&#8217;, vo.departmentId);</span><span Times 宋体;? Roman?;?font-family:>经过这样三个步骤，</span>DWR<span Times negative="False" numbertype="1" sourcevalue="2" w:st="on" unitname="&#8217;" tcsc="0"  Roman?;?False?>002&#8217;, vo.departmentId);</span></p>
<p>setValue(&#8216;departmentName002&#8217;, vo.departmentName);</p>
<p><span style="font-family: 宋体">而对于另一个表格</span>Employee<span Times negative="False" numbertype="1" sourcevalue="2" w:st="on" unitname="&#8217;" tcsc="0"  Roman?;?False?>002&#8217;, vo.employeeId);</span></p>
<p>setValue(&#8216;name002&#8217;, vo.name);</p>
<p>setValue(&#8216;sex002&#8217;, vo.sex);</p>
<p><span style="font-family: 宋体">也就是说，我们不得不根据值对象的不同分别去写</span>setValue<span Times Roman?; ?Courier New??>并提供了</span><span Courier New?; ?Courier New??>个将结果集填充到表格的函数</span><span Courier New?; ?Courier New??>、</span><span Courier New?; ?Courier New??>和</span><span Courier New?; ?Courier New??>。</span><span Courier New?; ?Courier New??>用于直接将结果集填充到表格中，</span><span Courier New?; ?Courier New??>将表格填充的同时还实现了无刷新页面翻页的功能，而</span><span Courier New?; ?Courier New??>则用于当数据更新时不查询后台而直接通过页面的结果集缓存变量刷新数据。具体的实现见我提供的示例。</span></p>
<h2>二、前缀</h2>
<p><span style="font-family: 宋体">前面我提到了后缀的功能，即页面在列表显示的时候，为了使表格中的数据既可以与值对象的属性对应，又可以使各列之间的</span>id<span Times 宋体;? Roman?;?font-family:>如果在设计页面的时候出现</span>id<span Times span Roman?;<></p>
<p><span style="font-family: 宋体">后面的后缀就是我重写</span>setValues<span Times 宋体;? Roman?;?font-family:>示例：<a href="http://fangang.javaeye.com/blog/120768">一个dwr+spring+hibernate的示例</a></span></p>
</span></span></span></span></span></span>
<img src ="http://www.blogjava.net/i369/aggbug/152872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-15 09:46 <a href="http://www.blogjava.net/i369/articles/152872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR帮助文档－dwr.xml文件的配置[转]</title><link>http://www.blogjava.net/i369/articles/152871.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 15 Oct 2007 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/152871.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/152871.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/152871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/152871.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/152871.html</trackback:ping><description><![CDATA[<span Times Roman?; ?Courier New??>官方</span><span Times 宋体;? Roman?;?font-family:>要理解</span>dwr.xml<span Times 宋体;? Roman?;?font-family:>假如我在项目的</span>BUS<span Times span script&gt;< Roman?;script&gt;&lt;><span Times 宋体;? Roman?;?font-family:>前面我们提到，</span>DWR<span Times 宋体;? Roman?;?font-family:>讲到这里，我们现在重新回到</span>dwr.xml<span Times span Roman?;<>create&nbsp;creator="spring"&nbsp;javascript="DepartmentBus"&nbsp;scope="script"&gt;&nbsp;&nbsp;</span>
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name="beanName"&nbsp;value="departmentBus"/&gt;&nbsp;&nbsp;
<li>create&gt;&nbsp;&nbsp; </li>
<ol></ol>
    <div></div>
    <p align="left">Creator<span style="font-size: 10.5pt; font-family: 宋体"><span Courier New?; ?Courier New??>包中找到一个</span><span Courier New?; ?Courier New??>的文件。在该文件</span><span Courier New?; ?Courier New??>下的</span><span Courier New?; ?Courier New??>中可以看到。</span></span></span></p>
    <p align="left"></span><span Courier New?; ?Courier New??>是用于你在</span><span Courier New?; ?Courier New??>中调用这个对象时使用什么名称，强烈建议你使用首字母大写，这样在页面中很容易看出这是一个与后台对应的对象。</span><span Courier 宋体;? font-family: black; color: 10pt; New?;?font-size:>如果你使用了</span><span Courier New?; ?Courier New??>并且在</span><span Courier New?; ?Courier New??>中选择了</span><span Courier New?; ?Courier New??>，那么你需要一个叫</span><span Courier New?; ?Courier New??>的参数，而其值就是在</span><span Courier New?; ?Courier New??>配置文件中配置的</span><span Courier New?; ?Courier New??>，如</span><span Courier New?; ?Courier New??>。</span><span Courier 宋体;? font-family: black; color: 10pt; New?;?font-size:>另外</span><span Courier New?; ?Courier New??>个非常有用的参数是</span><span Courier New?; ?Courier New??>和</span><span Courier New?; ?Courier New??>，</span><span Courier New?; ?Courier New??>可以禁止页面调用后台的某个或某些方法，具体的写法是在</span><span Courier New?; ?Courier New??>中加入：</span><span Courier span New?;<>exclude&nbsp;method="createDepartment"/&gt;&nbsp;&nbsp;</span> </li>
    <ol></ol>
        <div></div>
        <p>method<span style="font-size: 10pt; color: black; font-family: 宋体">部分写的是这些方法不带括号的方法名，如果有多个就写多行</span><span Courier New?; ?Courier New??>；</span><span Courier New?; ?Courier New??>则规定页面只能调用某些方法。</span></p>
        <p><span style="font-size: 10pt; color: black; font-family: 宋体">在</span>dwr.xml<span Times span Roman?;<>convert&nbsp;match="com.htxx.demo.datasource1.model.Department"&nbsp; &nbsp;&nbsp;</span>
        <li>javascript="Department"&nbsp;converter="hibernate3"/&gt;&nbsp;&nbsp; </li>
        <ol></ol>
            <div></div>
            <p>match<span style="font-size: 10.5pt; font-family: 宋体">用于告诉</span><span Times Roman?; New span New<></p>
            <p><span style="font-family: 宋体">如果你使用后一种方法去批量注册对象，那么你就不能这样初始化这个对象而只能这样手动注册：</span></p>
            <p>Var dep = {departmentId:null, departmentName:null, &#8230;&#8230;};</p>
            <p><span style="font-family: 宋体">我推荐大家采用第一种方法的好处可以在我后面写的《<a title="永久链接：DWR帮助说明－如何编写通用的单行编辑框" href="http://fangang.javaeye.com/blog/119791">DWR帮助说明－如何编写通用的单行编辑框</a></span><span  Times href="http://fangang.javaeye.com/blog/122445"  Roman?;?永久链接：DWR帮助说明－dwr的bug及其解决方法?>DWR帮助说明－dwr的bug及其解决方法</a></span><span Times Roman?; ?Courier New??>首字母大写。</span><span Courier ?Courier font-family: black; color: 10pt; New?;?font-size: New?;?>Converter</span><span ?Courier New??>用于告诉</span><span Courier New?; ?Courier New??>用什么</span><span Courier New?; ?Courier New??>的类来执行转换，常用的转换器有</span><span Courier New?; ?Courier New??>、</span><span Courier New?; ?Courier New??>、</span><span Courier New?; ?Courier New??>、</span><span Courier New?; ?Courier New??>等。</span><span Courier New?; ?Courier New??>有哪些转换器可以在</span><span Courier New?; ?Courier New??>的</span><span Courier New?; ?Courier New??>（该文件的位置见前文）中找到。我需要强调的是，如果朋友们使用了</span><span Courier New?; ?Courier New??>，那么你需要将需要使用的所有值对象都通过转换器注册。但是我在网上看见很多朋友都使用</span><span Courier New?; ?Courier New??>转换器来注册。如果你使用</span><span Courier New?; ?Courier New??>来转换值对象，在运行程序的时候会出现很多问题（这些问题我就不详述了），同时还会出现效率的问题，因为</span><span Courier New?; ?Courier New??>会将该值对象的所有属性，及其这些属性的所有属性，所有属性的属性，都以穷举的方式取出来。熟悉</span><span Courier New?; ?Courier New??>的朋友应当马上明白这样将是数据库操作的一个灾难。如果你使用</span><span Courier New?; ?Courier New??>或</span><span Courier New?; ?Courier New??>作为转换器将不会发生这样的事，同时，</span><span Courier New?; ?Courier New??>还较好地解决了延迟查询的问题，但</span><span Courier New?; ?Courier New??>官方建议我们使用</span><span Courier New?; ?Courier New??>的</span><span Courier New?; ?Courier New??>，这我也不再详述，不清楚的朋友可以查阅</span><span Courier New?; ?Courier New??>的帮助文档。但另一个问题我不得不提，</span><span Courier New?; ?Courier New??>在使用延迟查询的时候其实还是有问题的。譬如有一个值对象</span><span Courier New?; ?Courier New??>包含一个</span><span Courier New?; ?Courier New??>的属性，根据延迟查询的规则，在</span><span Courier New?; ?Courier New??>某个</span><span Courier New?; ?Courier New??>时，属性</span><span Courier New?; ?Courier New??>不会马上装载，即使执行</span><span Courier New?; ?Courier New??>也不会装载。必须到真正对这个</span><span Courier New?; ?Courier New??>操作的时候才会装载。既然如此，问题就来了，我们使用</span><span Courier New?; ?Courier New??>执行查询的时候，常常是真正到页面才会读取</span><span Courier New?; ?Courier New??>，这时已经是脱离服务器端到页面端了而不能再得到</span><span Courier New?; ?Courier New??>。这个问题怎么办呢，最好的办法是在服务器端就提前装载页面需要使用的属性，因为作为开发者他肯定知道哪些属性要在客户端使用，哪些属性不需要。至于如何在服务器端就提前装载，感兴趣的朋友在我的示例中看到。</span><span Courier 宋体;? font-family: black; color: 10pt; New?;?font-size:>另外一个需要提的是，与</span><span Courier New?; ?Courier New??>一样，转换器也可以一样地设置</span><span Courier New?; ?Courier New??>和</span><span Courier New?; ?Courier New??>参数。但是与</span><span Courier New?; ?Courier New??>不同的是，它们说明</span><span Courier New?; ?Courier New??>在转换对象的时候需要转换或不转换某些属性。这个参数对于</span><span Courier New?; ?Courier New??>的一对一关联非常重要。在</span><span Courier New?; ?Courier New??>中一对一关联是不做延迟查询的，假如有一个值对象</span><span Courier New?; ?Courier New??>与值对象</span><span Courier New?; ?Courier New??>是一对一关联，那么</span><span Courier New?; ?Courier New??>中有</span><span Courier New?; ?Courier New??>的属性，而</span><span Courier New?; ?Courier New??>中有</span><span Courier New?; ?Courier New??>的属性。由于一对一关联不做延迟查询，当</span><span Courier New?; ?Courier New??>在转换一个</span><span Courier New?; ?Courier New??>是会装载它的属性</span><span Courier New?; ?Courier New??>，然后在装载</span><span Courier New?; ?Courier New??>的时候，又会去装载</span><span Courier New?; ?Courier New??>中的</span><span Courier New?; ?Courier New??>属性。如此这样，就会形成一个死循环，最后以堆栈溢出告终。解决这个问题的办法就是禁掉</span><span Courier New?; ?Courier New??>中的</span><span Courier New?; ?Courier New??>属性，避免产生死循环。具体写法如下：</span></p>
            <div>xml 代码</div>
            <div>
            <ol>
                <li>&lt;convert&nbsp;match="com.htxx.demo.model.Address"&nbsp;javascript="Address"&nbsp;converter="hibernate3"&gt;&nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;<font face="Courier New">param name="exclude"</font>&nbsp;value="employee"/&gt;&nbsp;&nbsp;
                <li>&lt;/convert&gt;&nbsp;&nbsp; </li>
            </ol>
            </div>
            <p align="left">Value<span style="font-size: 10pt; color: black; font-family: 宋体">部分是需要转换的属性，如果有多个则用逗号隔开就可以了。</span>（<a href="http://fangang.javaeye.com/blog/120768">一个dwr+spring+hibernate的示例</a>）</p>
            </span>
<img src ="http://www.blogjava.net/i369/aggbug/152871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-15 09:45 <a href="http://www.blogjava.net/i369/articles/152871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]回复：《如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件》 </title><link>http://www.blogjava.net/i369/articles/152868.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 15 Oct 2007 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/152868.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/152868.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/152868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/152868.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/152868.html</trackback:ping><description><![CDATA[<table width="100%">
    <tbody>
        <tr>
            <td>&nbsp;
            <p><span Times Roman?;?2?><a href="http://fangang.javaeye.com/admin/show/47670">如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件</a></font></span>》。昨天和几个朋友讨论问题的时候，谈到通过</span>DaoSupport</p>
            <h3>2<span Times Roman?;?Arial?><font face="Arial">
            <div>java 代码</div>
            </font></font></span>
            <h3><span>
            <div>
            <ol>
                <li>package&nbsp;com.htxx.thps.psb.dao.imp; &nbsp;&nbsp;
                <li>&nbsp;&nbsp;
                <li>import&nbsp;com.htxx.service.dao.BasicDao; &nbsp;&nbsp;
                <li>import&nbsp;com.htxx.service.dao.Condition; &nbsp;&nbsp;
                <li>import&nbsp;com.htxx.service.dao.ResultSet; &nbsp;&nbsp;
                <li>import&nbsp;com.htxx.thps.model.PsPsb; &nbsp;&nbsp;
                <li>import&nbsp;com.htxx.thps.model.PsPsjcd; &nbsp;&nbsp;
                <li>import&nbsp;com.htxx.thps.model.PsWtmx; &nbsp;&nbsp;
                <li>import&nbsp;com.htxx.thps.psb.dao.PsbDao; &nbsp;&nbsp;
                <li>&nbsp;&nbsp;
                <li>/** &nbsp;
                <li>&nbsp;*&nbsp;@author&nbsp;FanGang &nbsp;
                <li>&nbsp;* &nbsp;
                <li>&nbsp;*/&nbsp;&nbsp;
                <li>public&nbsp;class&nbsp;PsbDaoImp&nbsp;extends&nbsp;BasicDao&nbsp;implements&nbsp;PsbDao&nbsp;{ &nbsp;&nbsp;
                <li>&nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;(non-Javadoc) &nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;com.htxx.thps.psb.dao.PsbDao#getPsb(java.lang.String) &nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;PsPsb&nbsp;getPsb(String&nbsp;id)&nbsp;{ &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(PsPsb)this.load(PsPsb.class,&nbsp;id); &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                <li>&nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;(non-Javadoc) &nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;com.htxx.thps.psb.dao.PsbDao#updatePsb(com.htxx.thps.model.PsPsb) &nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;updatePsb(PsPsb&nbsp;vo)&nbsp;{ &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.update(vo); &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                <li>&nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;(non-Javadoc) &nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;com.htxx.thps.psb.dao.PsbDao#getPsb(com.htxx.service.dao.Condition) &nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ResultSet&nbsp;getPsb(Condition&nbsp;condition)&nbsp;{ &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.query("PsPsb",&nbsp;condition); &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                <li>&nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;PsPsjcd&nbsp;getPsjcd(String&nbsp;id)&nbsp;{ &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(PsPsjcd)this.load(PsPsjcd.class,&nbsp;id); &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                <li>&nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ResultSet&nbsp;getPsjcd(Condition&nbsp;condition)&nbsp;{ &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.query("PsPsjcd",&nbsp;condition); &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                <li>&nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;PsWtmx&nbsp;getWtmx(String&nbsp;id)&nbsp;{ &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(PsWtmx)this.load(PsWtmx.class,&nbsp;id); &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                <li>&nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ResultSet&nbsp;getWtmx(Condition&nbsp;condition)&nbsp;{ &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.query("PsWtmx",&nbsp;condition); &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                <li>&nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;updatePsjcd(PsPsjcd&nbsp;vo)&nbsp;{ &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.update(vo); &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                <li>&nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;updateWtmx(PsWtmx&nbsp;vo)&nbsp;{ &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.update(vo); &nbsp;&nbsp;
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
                <li>&nbsp;&nbsp;
                <li>}&nbsp;&nbsp; </li>
            </ol>
            </div>
            4</span>&nbsp;
            <p>&nbsp;</p>
            <p><span Times Roman?;?2?><a href="http://fangang.javaeye.com/admin/show/47670">如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件</a></font></span>》中已经给出了这个结构的一个实现，供大家参考。</span></p>
            </h3>
            </h3>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<br />
说明:以上2篇文章均来自:http://fangang.javaeye.com/blog/52883推荐,到原博客阅读,和下载相关代码,此处只是本人收藏,方便查看,在此向作者表示衷心感谢!
<img src ="http://www.blogjava.net/i369/aggbug/152868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-15 09:44 <a href="http://www.blogjava.net/i369/articles/152868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件</title><link>http://www.blogjava.net/i369/articles/152863.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 15 Oct 2007 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/152863.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/152863.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/152863.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/152863.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/152863.html</trackback:ping><description><![CDATA[<strong><font size="4">问题的提出</font></strong>
<p><span style="font-family: 宋体">我常常在思考一个问题，我们如何能设计出高水平、高质量的软件出来。怎样是高水平、高质量的软件？它应当是易于维护、易于适应变更、可重用性好的一个系统。如何做到这一点呢？答案当然是&#8220;低耦合、高内聚&#8221;了。低耦合就是软件在构造的时候，各个模块、各个功能、各个类都不会过度依赖于它周围的环境。只有这样，才能使我们的模块（功能、类）在周围发生变更时不受影响，做到易于维护和易于适应变更。正因为如此，也使它更易于重用到其它功能类似的环境中，提高了重用性。高内聚则使软件中的各个模块（功能、类）能够各尽其能而又充分合作，也就是对于软件问题空间中需求的各个功能，系统可以合理地把它分配给各个模块（功能、类）来共同完成，而不是一个或几个八面玲珑、包打天下的超级类一个人完成。而对于该系统中的某一个模块（功能、类），具有自己高度相关的职责，即该职责中的几个任务是高度相关的。每一个模块（功能、类）都决不去完成与自己无关职责的任务。</span></p>
<p><span style="font-family: 宋体">那么怎样能构造一个低耦合、高内聚的系统能，时下最流行的框架结构之一的</span>struts+spring+hibernate<span Times 宋体;? Roman?;?font-family:>然而我要说的是，即使我们使用了</span>struts+spring+hibernate&nbsp;</p>
<pre><strong><font size="4">分析与决策</font></strong></pre>
<h2><span style="font-size: 14pt; line-height: 173%">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>编写DAO的时候不要直接去使用hibernate或spring对hibernate的支持。</h2>
<p><span style="font-family: 宋体">现在我们在编写</span>DAO<span Times Roman?; ?Times New Courier New?; 宋体;? New?;?font-family:>以上问题，究其原因，是我们项目中的</span>DAO<span Times Roman?; ?Times New Courier New?; New?;??><img height="528" alt="" src="http://www.javaeye.com/topics/download/caeb8220-1b1e-4efe-93d2-eda8a63db6fc" width="551" /></span></p>
<h2><span style="font-size: 14pt; line-height: 173%">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>编写Action的时候不要直接使用spring和spring的继承类</h2>
<p><span style="font-family: 宋体">前面我说了应当避免</span>DAO<span Times Roman?; ?Times New Courier New?; ?Courier>的继承类</span><span ?Courier>然后使用它的</span><span Courier New?; ?Courier>方法。如此的使用，我们的</span><span Courier New?;>Action</span><span ?Courier>将依赖与</span><span Courier New?;>spring</span><span ?Courier>。我们同样可以使用一个叫</span><span Courier New?;>BasicAction</span><span ?Courier>的父类，然后用一个接口来隔离</span><span Courier New?;>spring</span><span ?Courier>。由于</span>Action<span Times Roman?; ?Times New Courier New?;>BasicAction</span><span ?Courier>中，提高系统的可维护性。</span></p>
<h2><span style="font-size: 14pt; line-height: 173%">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>当BUS需要获取别的模块的数据的时候，不要直接去使用该模块的DAO</h2>
<p><span style="color: black; font-family: 宋体">我举一个简单的例子：我需要设计一个软件评审的管理软件，该软件分为评审组织者制订评审计划、评审者分别填写评审表后由评审组织者汇总评审表、评审组织者制作评审报告。这是一个非常简单的项目，分成了三个人来完成。但是项目进行快结束的时候却出现了问题。填写评审表需要获得评审计划中的一些数据，制作评审报告的数据来源于评审表。项目组在开始编程前先开了一次会，大家约定好了各个部分的数据格式及其规则，然后开始工作。然而数天后项目组把各个模块整合以后发现，系统根本跑不起来，为什么呢？设计评审计划的人发现，所有评审计划应当按照产品编号来进行管理而不是项目编号。由于这个变更，填写评审表模块在待评审列表中什么都无法显示；同样，设计评审表的人发现，在一个评审计划中评审表与评审者不是一对多的关系，而是一对一的关系，因而修改了这两个表的关联。因为这样，在制作评审报告时就不能正确得到评审表数据。其实一个软件项目在整个进行过程中总是不断变更。我们需要做的不是去抑制这些变更，而应当是通过软件的结构去适应这些变更，即是降低各模块间的依赖（耦合），提高内聚。</span></p>
<p><span style="color: black; font-family: 宋体">拿这个实例来说，当评审表需要调用评审计划的数据的时候，不应当是自己写一个</span><span Courier New?;>DAO</span><span ?Courier>去调用评审计划的数据，而应当是调用评审计划的接口，将这个任务交给评审计划类来完成。当评审报告需要调用评审表的数据的时候，同样应当去调用评审表的接口，由评审表来实现。同时，这种调用应当是去调用</span><span Courier New?;>BUS</span><span ?Courier>层的接口。为什么呢？比如在评审计划中的一个业务逻辑是只有在评审计划发布以后才能制作评审表，那么怎样才是已发布的评审计划呢？这个业务逻辑应当由谁来定义？当然是评审计划。在什么地方定义？当然是</span><span Courier New?;>BUS</span><span ?Courier>而不是</span><span Courier New?;>DAO</span><span ?Courier>，因为</span><span Courier New?;>DAO</span><span ?Courier>仅仅是实现数据的持久化，而</span><span Courier New?;>BUS</span><span ?Courier>才是实现业务逻辑的地方。既然如此，如果评审表去调用评审计划的</span><span Courier New?;>DAO</span><span ?Courier>，那么已发布评审计划的业务逻辑必然包含在了评审表的业务逻辑里了。我们假设有一天，已发布评审计划的业务逻辑发生变更了（实际上这样的会在你毫不经意间就发生了），编写评审计划的人会很快就修改了评审计划的业务实现并且测试通过了。他不知道评审表里也包含了这样的业务逻辑，因而修改后的程序在运行到评审表的时候就很可能会出错。不幸的是，在实际工作中，同样一个业务逻辑可能包含在无数个你可能知道，但你也可能不知道的代码中。这样的结构就是一个不易于维护的差的结构。</span></p>
<pre><span style="font-size: 16pt; line-height: 240%; font-family: 宋体"><strong>总结：从技术升级和需求变更两方面适应变化</strong></span></pre>
<p><span style="font-family: 宋体">软件开发专家</span>Alistair Cockburn<span Times Roman?; ?Times New Courier 宋体;? New?;?font-family:>相关链接：<a href="http://fangang.javaeye.com/blog/52883">回复：《<font size="2">如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件</font>》</a>。</span></p>
<div style="padding-right: 10px; border-top: gray 1px solid; padding-left: 10px; padding-bottom: 10px; margin: 15px 0px 0px 10px; padding-top: 10px">
<table cellspacing="0" cellpadding="2" width="95%" align="center" border="1">
    <tbody>
        <tr>
            <td style="background: #d1d7dc" align="center" width="100%" colspan="3"><strong>Spring-Hibernate.rar</strong></td>
        </tr>
        <tr>
            <td width="15%">&nbsp;描述:</td>
            <td width="75%">&nbsp; </td>
            <td align="center" width="10%" rowspan="4"><img alt="" src="http://fangang.javaeye.com/images/forum/icon_clip.gif" border="0" /><br />
            <a href="http://fangang.javaeye.com/topics/download/828d7ac5-1922-4104-aecb-0ee888c4e9a0"><strong>下载</strong></a> </td>
        </tr>
        <tr>
            <td width="15%">&nbsp;文件名:</td>
            <td width="75%">&nbsp;Spring-Hibernate.rar</td>
        </tr>
        <tr>
            <td width="15%">&nbsp;文件大小:</td>
            <td width="75%">&nbsp;9 KB</td>
        </tr>
        <tr>
            <td width="15%">&nbsp;下载过的:</td>
            <td width="75%">&nbsp;文件被下载或查看 511 次</td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/i369/aggbug/152863.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-15 09:39 <a href="http://www.blogjava.net/i369/articles/152863.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转贴]一个dwr+spring+hibernate的示例</title><link>http://www.blogjava.net/i369/articles/152861.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 15 Oct 2007 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/152861.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/152861.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/152861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/152861.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/152861.html</trackback:ping><description><![CDATA[<div style="margin-top: 1px; margin-left: 15px">
<h2><a title="永久链接：一个dwr+spring+hibernate的示例" href="http://fangang.javaeye.com/blog/120768">一个dwr+spring+hibernate的示例</a> </h2>
</div>
<div style="margin-top: 5px; margin-left: 15px"><strong>关键字:</strong> JavaScript &nbsp; spring,hibernate&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div style="margin-top: 10px; margin-left: 15px; overflow: auto">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>这是一个运用dwr+spring+hibernate这样一个框架编写的示例。它展示了一下内容：</p>
            <p>1、在dwr中尝试编写的一些通用的代码，包括如何编写一个通用的列表显示框并实现分页、如何编写一个通用的单行编辑框、如何编辑一个通用的存盘和删除程序等等。</p>
            <p>2、在dwr中如何与spring兼容，调用bus中的方法；在dwr中如何与hibernate兼容，在页面端操作值对象，以及处理值对象间的各种关系。</p>
            <p>3、如何在spring中实现单dao，使这个单dao既可以与hibernate隔离，使其低耦合高内聚，提高可维护性，又能满足各个bus的业务需要，简化开发的过程。</p>
            <p>不是美工，界面比较外行，见谅了：）</p>
            <p>示例在MyEclipse中安装部署的步骤：</p>
            <p>1、创建一个新的web项目并拷贝示例中的文件到项目中。注意web.xml文件应当是将原文件覆盖。</p>
            <p>2、添加spring和hibernate。点击项目树中的项目名按Alt+Enter键，弹出项目属性对话框。选择&#8220;Java Build Path&#8221;中的&#8220;Libraries&#8221;标签，然后点击&#8220;Add Library&#8221;按钮，选择&#8220;MyEclipse Libraries&#8221;，点击&#8220;Next&#8221;，选择&#8220;Hibernate 3.0 Core Libraries&#8221;、&#8220;Spring 1.2 AOP Libraries&#8221;、&#8220;Spring 1.2&nbsp;Core Libraries&#8221;、&#8220;Spring 1.2&nbsp;ORM/DAO/Hibernate Libraries&#8221;、&#8220;Spring 1.2&nbsp;Web Libraries&#8221;，点击&#8220;Finish&#8221;按钮。</p>
            <p>3、点击&#8220;Add External JARs&#8221;按钮，添加dwr.jar、daosupport.jar、hxtg.jar、hibernate3(必须将hibernate3升级到3.2以上)以及其它数据库相关的jar包到项目中。添加完成以后记得重新部署应用服务器。</p>
            <p>4、创建数据库实例，如果是oracle，在pl/sql中运行示例中的employee.sql创建数据库对象。</p>
            <p>5、修改ApplicationContext-hibernate.xml中datasource的连接属性为你的数据库。部署完成！</p>
            <p>部署完成后运行可能会在部分功能中出错。这些问题的解决我会在《<a title="永久链接：DWR帮助说明－dwr的bug及其解决方法" href="http://fangang.javaeye.com/blog/122445">DWR帮助说明－dwr的bug及其解决方法</a>》中详细讨论。</p>
            <p>相关文档：</p>
            <p><a title="永久链接：如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件" href="http://fangang.javaeye.com/blog/47670">如何在struts+spring+hibernate的框架下构建低耦合高内聚的软件</a> </p>
            <p><a title="永久链接：DWR帮助文档－dwr.xml文件的配置" href="http://fangang.javaeye.com/blog/119767">DWR帮助文档－dwr.xml文件的配置</a> </p>
            <p><a title="永久链接：DWR帮助说明－如何编写通用的列表显示框" href="http://fangang.javaeye.com/blog/119787">DWR帮助说明－如何编写通用的列表显示框</a> </p>
            <p><a title="永久链接：DWR帮助说明－如何编写通用的单行编辑框" href="http://fangang.javaeye.com/blog/119791">DWR帮助说明－如何编写通用的单行编辑框</a> </p>
            <p><a title="永久链接：DWR帮助说明－服务器端程序的编写" href="http://fangang.javaeye.com/blog/121954">DWR帮助说明－服务器端程序的编写</a> </p>
            <p><a title="永久链接：DWR帮助说明－dwr的bug及其解决方法" href="http://fangang.javaeye.com/blog/122445">DWR帮助说明－dwr的bug及其解决方法</a> </p>
            </td>
        </tr>
    </tbody>
</table>
<div style="padding-right: 10px; border-top: gray 1px solid; padding-left: 10px; padding-bottom: 10px; margin: 15px 0px 0px 10px; padding-top: 10px">
<table class="attach" cellspacing="0" cellpadding="2" width="95%" align="center" border="1">
    <tbody>
        <tr>
            <td class="attachrow" style="background: #d1d7dc" align="center" width="100%" colspan="3"><strong><span class="gen">employee.rar</span></strong></td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;描述:</span></td>
            <td class="attachrow" width="75%">&nbsp; </td>
            <td class="attachrow" align="center" width="10%" rowspan="4"><img alt="" src="http://fangang.javaeye.com/images/forum/icon_clip.gif" border="0" /><br />
            <a href="http://fangang.javaeye.com/topics/download/8b49cc76-21db-4b7e-9d9d-e5a6ab42f7cb"><strong>下载</strong></a> </td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;文件名:</span></td>
            <td class="attachrow" width="75%"><span class="genmed">&nbsp;employee.rar</span></td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;文件大小:</span></td>
            <td class="attachrow" width="75%"><span class="genmed">&nbsp;272 KB</span></td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;下载过的:</span></td>
            <td class="attachrow" width="75%"><span class="genmed">&nbsp;文件被下载或查看 236 次</span></td>
        </tr>
    </tbody>
</table>
</div>
<div style="padding-right: 10px; border-top: gray 1px solid; padding-left: 10px; padding-bottom: 10px; margin: 15px 0px 0px 10px; padding-top: 10px">
<table class="attach" cellspacing="0" cellpadding="2" width="95%" align="center" border="1">
    <tbody>
        <tr>
            <td class="attachrow" style="background: #d1d7dc" align="center" width="100%" colspan="3"><strong><span class="gen">employee.rar</span></strong></td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;描述:</span></td>
            <td class="attachrow" width="75%">&nbsp;重新修订了一下 </td>
            <td class="attachrow" align="center" width="10%" rowspan="4"><img alt="" src="http://fangang.javaeye.com/images/forum/icon_clip.gif" border="0" /><br />
            <a href="http://fangang.javaeye.com/topics/download/950ed5c6-01ea-4f19-8ebd-0a42f142a37e"><strong>下载</strong></a> </td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;文件名:</span></td>
            <td class="attachrow" width="75%"><span class="genmed">&nbsp;employee.rar</span></td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;文件大小:</span></td>
            <td class="attachrow" width="75%"><span class="genmed">&nbsp;2 M</span></td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;下载过的:</span></td>
            <td class="attachrow" width="75%"><span class="genmed">&nbsp;文件被下载或查看 397 次</span></td>
        </tr>
    </tbody>
</table>
</div>
</div>
<img src ="http://www.blogjava.net/i369/aggbug/152861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-15 09:31 <a href="http://www.blogjava.net/i369/articles/152861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取JAVA路径 包括CLASSPATH外的路径</title><link>http://www.blogjava.net/i369/articles/151991.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 11 Oct 2007 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/151991.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/151991.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/151991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/151991.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/151991.html</trackback:ping><description><![CDATA[<p><span style="font-size: 14pt">&nbsp; </p>
<p class="MsoNormal" style="background: white; text-align: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 1" align="left"><strong><span style="color: #666666; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 18.0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">获取</span></strong><strong><span lang="EN-US" style="color: #666666; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 18.0pt">JAVA</span></strong><strong><span style="color: #666666; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 18.0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">路径</span></strong><strong><span style="color: #666666; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 18.0pt"> </span></strong><strong><span style="color: #666666; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 18.0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">包括</span></strong><strong><span lang="EN-US" style="color: #666666; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 18.0pt">CLASSPATH</span></strong><strong><span style="color: #666666; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 18.0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">外的路径</span></strong><strong><span lang="EN-US" style="color: #666666; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 18.0pt"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="background: white; margin: 0.5pt 5.5pt 0.5pt 2.5pt; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 2" align="left"><span style="color: #666666; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">作者</span><span lang="EN-US" style="color: #666666; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">: </span><span style="color: #666666; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">周建东</span><span lang="EN-US" style="color: #666666; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">&nbsp;&nbsp;</span><span style="color: #666666; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">日期</span><span lang="EN-US" style="color: #666666; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">: 2007-09-10 16:04<o:p></o:p></span></p>
<p class="MsoNormal" style="background: white; text-align: right; mso-pagination: widow-orphan" align="right"><span style="color: #666666; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">字体大小</span><span lang="EN-US" style="color: #666666; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">: <a href="javascript:SetFont('logcontent_422','12px')"><span lang="EN-US" style="color: #666666; font-family: 宋体; text-decoration: none; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; text-underline: none"><span lang="EN-US">小</span></span></a> <a href="javascript:SetFont('logcontent_422','14px')"><span lang="EN-US" style="color: #666666; font-family: 宋体; text-decoration: none; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; text-underline: none"><span lang="EN-US">中</span></span></a> <a href="javascript:SetFont('logcontent_422','16px')"><span lang="EN-US" style="color: #666666; font-family: 宋体; text-decoration: none; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; text-underline: none"><span lang="EN-US">大</span></span></a> <o:p></o:p></span></p>
<p class="MsoNormal" style="background: white; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="color: #666666; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shape id="_x0000_i1025" style="width: 14.25pt; height: 14.25pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://tmsoft.lsxy.com/images/weather/hn2_sunny.gif" src="file:///C:\DOCUME~1\ljw\LOCALS~1\Temp\msohtml1\02\clip_image001.gif"></v:imagedata></v:shape><v:shape id="_x0000_i1026" style="width: 19.5pt; height: 5.25pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://tmsoft.lsxy.com/images/weather/hn2_t_sunny.gif" src="file:///C:\DOCUME~1\ljw\LOCALS~1\Temp\msohtml1\02\clip_image002.gif"></v:imagedata></v:shape><o:p></o:p></span></p>
<p class="MsoNormal" style="background: white; word-break: break-all; line-height: 160%; text-align: left; mso-pagination: widow-orphan" align="left"><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">归纳一些网上取</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">JAVA</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">路径的方法：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">注明：如果从</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">ANT</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">启动程序，</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">this.getClass().getResource("")</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">取出来的比较怪，直接用</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">JAVA</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">命令行调试就可成功。</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">得到</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">classpath</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">和当前类的绝对路径的一些方法</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">获得</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">CLASSPATH</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">之外路径的方法：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">　　</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">URL base = this.getClass</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（）</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">.getResource</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">""</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）；</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"> //</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">先获得本类的所在位置，如</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">/home/popeye/testjava/build/classes/net/ String path = new File</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">base.getFile</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（），</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"> "&#8230;&#8230;/&#8230;&#8230;/&#8230;&#8230;/"+name</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">.getCanonicalPath</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（）；</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"> //</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">就可以得到</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">/home/popeye/testjava/name<br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">下面是一些得到</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">classpath</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">和当前类的绝对路径的一些方法。你可能需要使用其中的一些方法来得到你需要的资源的绝对路径。</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
1.FileTest.class.getResource</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">""</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">得到的是当前类</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">FileTest.class</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">文件的</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">URI</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">目录。不包括自己！</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">如：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">file</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">/D</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">/java/eclipse32/workspace/jbpmtest3/bin/com/test/<br />
<br />
2.FileTest.class.getResource</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">"/"</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">得到的是当前的</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">classpath</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的绝对</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">URI</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">路径。</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">如：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">file</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">/D</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">/java/eclipse32/workspace/jbpmtest3/bin/<br />
<br />
3.Thread.currentThread</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（）</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">.getContextClassLoader</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（）</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">.getResource</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">""</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">得到的也是当前</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">ClassPath</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的绝对</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">URI</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">路径。</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">如：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">file</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">/D</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">/java/eclipse32/workspace/jbpmtest3/bin/<br />
<br />
4.FileTest.class.getClassLoader</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（）</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">.getResource</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">""</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">得到的也是当前</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">ClassPath</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的绝对</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">URI</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">路径。</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">如：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">file</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">/D</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">/java/eclipse32/workspace/jbpmtest3/bin/<br />
<br />
5.ClassLoader.getSystemResource</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">""</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">得到的也是当前</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">ClassPath</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的绝对</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">URI</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">路径。</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">如：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">file</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">/D</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">/java/eclipse32/workspace/jbpmtest3/bin/<br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">我推荐使用</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">Thread.currentThread</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（）</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">.getContextClassLoader</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（）</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">.getResource</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">""</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）来得到当前的</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">classpath</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的绝对路径的</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">URI</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">表示法。</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">在</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">Web</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">应用程序中，我们一般通过</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">ServletContext.getRealPath</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">"/"</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）方法得到</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">Web</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">应用程序的根目录的绝对路径。这样，我们只需要提供相对于</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">Web</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">应用程序根目录的路径，就可以构建出定位资源的绝对路径。</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">注意点：</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
1.</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">尽量不要使用相对于</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">System.getProperty</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">"user.dir"</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）当前用户目录的相对路径。这是一颗定时炸弹，随时可能要你的命。</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
2.</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">尽量使用</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">URI</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">形式的绝对路径资源。它可以很容易的转变为</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">URI</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">，</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">URL</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">，</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">File</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">对象。</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
3.</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">尽量使用相对</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">classpath</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的相对路径。不要使用绝对路径。使用上面</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">ClassLoaderUtil</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">类的</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">public static URL getExtendResource</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">String relativePath</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）方法已经能够使用相对于</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">classpath</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的相对路径定位所有位置的资源。</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
4.</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">绝对不要使用硬编码的绝对路径。因为，我们完全可以使用</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">ClassLoader</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">类的</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">getResource</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">（</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">""</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）方法得到当前</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">classpath</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的绝对路径。</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">使用硬编码的绝对路径是完全没有必要的！它一定会让你死的很难看！程序将无法移植！</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">如果你一定要指定一个绝对路径，那么使用配置文件，也比硬编码要好得多！</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"><br />
<br />
</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">当然，我还是推荐你使用程序得到</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">classpath</span><span style="color: #333333; line-height: 160%; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的绝对路径来拼资源的绝对路径</span><span lang="EN-US" style="color: #333333; line-height: 160%; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt"> <o:p></o:p></span></p>
<p><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Tahoma; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shape id="_x0000_i1027" style="width: 6.75pt; height: 6.75pt" alt="" type="#_x0000_t75"><v:imagedata o:href="http://tmsoft.lsxy.com/images/icon_trackback.gif" src="file:///C:\DOCUME~1\ljw\LOCALS~1\Temp\msohtml1\02\clip_image003.gif"></v:imagedata></v:shape></span><strong><span style="font-size: 10.5pt; color: #333333; font-family: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">引用通告地址</span><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Tahoma; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">:</span></strong><span lang="EN-US" style="font-size: 10.5pt; color: #333333; font-family: Tahoma; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> http://tmsoft.lsxy.com/trackback.php?tbID=422&amp;extra=f<st1:chmetcnv w:st="on" unitname="F" sourcevalue="48" hasspace="False" negative="False" numbertype="1" tcsc="0">48f</st1:chmetcnv>99</span></span></p>
<img src ="http://www.blogjava.net/i369/aggbug/151991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-11 11:47 <a href="http://www.blogjava.net/i369/articles/151991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一步一步架设自用svn服务器</title><link>http://www.blogjava.net/i369/articles/151220.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 09 Oct 2007 00:54:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/151220.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/151220.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/151220.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/151220.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/151220.html</trackback:ping><description><![CDATA[简单介绍如何在Windows平台通过TortoiseSVN搭建简单的自用svn文件管理服务器。<br />
&nbsp;<span style="font-family: 宋体">目的</span>：
<p style="margin-left: 35.35pt; text-indent: -14.15pt; tab-stops: 35.35pt">1.架设基于Svnserve的服务器</p>
<p style="margin-left: 35.35pt; text-indent: -14.15pt; tab-stops: 35.35pt">2.让Svnserve在Windows启动时，自动启动 &nbsp;</p>
<p style="margin-bottom: 14.15pt"><span></p>
<p></span>一，下载TortoiseSVN和Subversion软件</p>
<div style="border-right: silver 1pt solid; padding-right: 7pt; border-top: silver 1pt solid; padding-left: 7pt; padding-bottom: 7pt; margin-left: 49.55pt; border-left: silver 1pt solid; margin-right: 1cm; padding-top: 7pt; border-bottom: silver 1pt solid">
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">1.下载TortoiseSVN,当前最新的版本是1.4.4, 从这儿下载<a href="http://prdownloads.sourceforge.net/tortoisesvn/TortoiseSVN-1.4.4.9706-win32-svn-1.4.4.msi?download">http://prdownloads.sourceforge.net/tortoisesvn/TortoiseSVN-1.4.4.9706-win32-svn-1.4.4.msi?download</a></p>
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">2.安装</p>
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">3.重启</p>
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">4.下载Subversion，当前最新版是1.4.4，从这儿下载<a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91%20.">http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91%20.</a></p>
<p style="margin: 0cm 0cm 14.15pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">5.安装</p>
</div>
<p style="margin-bottom: 14.15pt">二，新建仓库<br />
&nbsp;&nbsp;&nbsp; 仓库是存放你的源代码文件等等的集散地。</p>
<div style="border-right: silver 1pt solid; padding-right: 7pt; border-top: silver 1pt solid; padding-left: 7pt; padding-bottom: 7pt; margin-left: 49.55pt; border-left: silver 1pt solid; margin-right: 1cm; padding-top: 7pt; border-bottom: silver 1pt solid">
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">1.在任意地方新建一个文件夹。譬如: d:"Repo. </p>
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">2.右击这个文件夹，选择TortoiseSVN-&gt;Create repository here &#8230; </p>
<p style="margin: 0cm 0cm 14.15pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">3.创建仓库结束&nbsp;</p>
</div>
<p style="margin-bottom: 14.15pt"><br />
三，架设Svnserver服务器<br />
&nbsp;&nbsp;&nbsp; Svnserver是Subversion自带的一个轻量级的服务器。<br />
&nbsp;&nbsp;&nbsp; 1. 启动Svnserver服务</p>
<div style="border-right: silver 1pt solid; padding-right: 7pt; border-top: silver 1pt solid; padding-left: 7pt; padding-bottom: 7pt; margin-left: 49.55pt; border-left: silver 1pt solid; margin-right: 1cm; padding-top: 7pt; border-bottom: silver 1pt solid">
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">1.Windows桌面，点击开始</p>
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">2.运行，键入cmd(打开一个dos窗口) </p>
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">3.键入svnserve.exe &#8211;daemon &#8211;root drive:"path"to"repository </p>
<p style="margin: 0cm 0cm 0pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">4.启动了一个svn服务器。</p>
<p style="margin: 0cm 0cm 14.15pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt">5.这样你就可以从任何地方访问你的repository了,譬如svn co <a href="svn://192.168.0.1/test/trunk" rel="nofollow">svn://192.168.0.1/test/trunk</a>或者svn co <a href="svn://localhost/test/trunk" rel="nofollow">svn://localhost/test/trunk</a></p>
</div>
<p style="margin-bottom: 14.15pt">&nbsp;&nbsp;&nbsp; 2. 让Svnserver随Windows自动启动</p>
<div style="border-right: silver 1pt solid; padding-right: 7pt; border-top: silver 1pt solid; padding-left: 7pt; padding-bottom: 7pt; margin-left: 49.55pt; border-left: silver 1pt solid; margin-right: 1cm; padding-top: 7pt; border-bottom: silver 1pt solid">
<p style="margin: 0cm 0cm 14.15pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt"><span style="color: red">1.</span>sc create svnserve binpath= &#8220;C:"Program Files"Subversion"bin"svnserve.exe &#8211;service &#8211;root drive:"path"to"repository&#8221; displayname= &#8220;Subversion&#8221; depend= tcpip start= auto&nbsp;&nbsp; <span style="color: red">将C:"Program Files"Subversion"改为Subversion安装文件夹，将drive:"path"to"repository改为Repository所在文件夹。如果命令写错了，先sc delete svnserve，然后再写命令，否则会因为有相同的服务名，而无法创建成功</span></p>
</div>
<p style="margin-bottom: 14.15pt">&nbsp;&nbsp;&nbsp; 3. 控制Svnserver访问权限</p>
<div style="border-right: silver 1pt solid; padding-right: 7pt; border-top: silver 1pt solid; padding-left: 7pt; padding-bottom: 7pt; margin-left: 49.55pt; border-left: silver 1pt solid; margin-right: 1cm; padding-top: 7pt; border-bottom: silver 1pt solid">
<p style="margin: 0cm 0cm 14.15pt 14.15pt; text-indent: -14.15pt; tab-stops: list 35.35pt left 63.7pt"><span style="color: black">1.</span>让匿名访问可以读可以写：Repository所在位置下的conf目录，打开svnserve.conf,把[general]下的password-db = passwd前的注释去掉，<span style="color: red">注意要把空格也去掉。<span style="color: black">然后再在passwd文件里添加用户和用户名</span></span></p>
</div>
<img src ="http://www.blogjava.net/i369/aggbug/151220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-09 08:54 <a href="http://www.blogjava.net/i369/articles/151220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>树形组织结构图 </title><link>http://www.blogjava.net/i369/articles/151219.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 09 Oct 2007 00:51:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/151219.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/151219.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/151219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/151219.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/151219.html</trackback:ping><description><![CDATA[<h1><span class="Title">树形组织结构图</span></h1>
<h4><font color="#ff0000">第一、组织结构预览如下图：</font></h4>
<p><img height="441" alt="" src="file:///C:/Documents%20and%20Settings/ljw/My%20Documents/My%20Pictures/树形组织结构图%20-%20daniel_kaka专栏%20-%20CSDNBlog.files/菜单组织结构图.jpg" width="637" /></p>
<h4><font color="#ff0000">&nbsp;第二、功能说明：</font></h4>
<p>当鼠标点击左边某组织时，会把该组织下的所有成员添加到右边（排重）；</p>
<p>当鼠标点击左边某成员时，会把该成员添加到右边（排重）；</p>
<p>当鼠标点击"全选"时，会把所有组织的成员添加到右边（排重）；</p>
<p>当鼠标点击"移除"时，会把右侧被选中的成员移除；</p>
<h4><font color="#ff0000">第三、java script代码实现如下：</font></h4>
<p>//添加成员<br />
&nbsp;&nbsp;&nbsp; function addUser(id, name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var oOption = document.createElement("OPTION");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oOption.text = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oOption.value = id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var oSelect = window.parent.document.getElementById("groupdest");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!checkById(id, name)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oSelect.add(oOption);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>//添加组织<br />
&nbsp;&nbsp;&nbsp; function addGroup(id, ids, names) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ids == "") {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var idArr = ids.split(",");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var nameArr = names.split(",");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var len = idArr.length;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; len - 1; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addUser(idArr[i], nameArr[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>//检查是否已经添加过<br />
&nbsp;&nbsp;&nbsp; function checkById(id, name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var oSelect = window.parent.document.getElementById("groupdest");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var bContains = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; oSelect.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (oSelect.options[i].value == id || oSelect.options[i].text == name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bContains = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return bContains;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>//移除用户</p>
<p>function removeUser() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var oSelect = document.getElementById("groupdest");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; oSelect.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var option = oSelect.options[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (option.selected == true) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oSelect.remove(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<h4><font color="#ff0000">第四：树状组织结构图的MzTreeView-1.0动态实现的Table</font></h4>
<p>/**<br />
&nbsp;* <br />
&nbsp;*/<br />
package com.daniel.lr.crbt.share.db;</p>
<p>import javax.persistence.Column;<br />
import javax.persistence.Entity;<br />
import javax.persistence.Table;</p>
<p>import org.hibernate.validator.Pattern;</p>
<p>/**<br />
&nbsp;* @author Daniel Cao<br />
&nbsp;* @date&nbsp;&nbsp; 2007-4-27<br />
&nbsp;* @time&nbsp;&nbsp; 下午10:47:59<br />
&nbsp;*<br />
&nbsp;* 树状菜单(Menu)数据库定义.<br />
&nbsp;* 利用MzTreeView1.0生成.<br />
&nbsp;* 每个字段值中不可有冒号,不可以换行,<br />
&nbsp;* 引号酌情考虑应不与节点字符串的引号相冲突<br />
&nbsp;*<br />
&nbsp;*/<br />
@Entity<br />
@Table(name="sys_menu")<br />
public class Menu extends HibernateObject {<br />
&nbsp;private static final long serialVersionUID = 9135605811004668162L;<br />
&nbsp;//父节点ID,若已经是根节点则为0<br />
&nbsp;private Long&nbsp;&nbsp; parentId;<br />
&nbsp;//节点显示文本,根节点可空，表示不显示<br />
&nbsp;private String text; <br />
&nbsp;//节点提示说明<br />
&nbsp;private String hint; <br />
&nbsp;//节点的图标,对应的名字在类里的icons和iconsExpand定义,这里表示图片的名称pic.gif;picopen.gif格式<br />
&nbsp;private String icon; <br />
&nbsp;//节点挂的数据,如param=value&amp;param=value,url里?后的那串字符串格式<br />
&nbsp;private String data;<br />
&nbsp;//节点的链接,它为空或者为#时,这个节点的链接，点击将无反应<br />
&nbsp;private String url;<br />
&nbsp;//每个节点的链接允许在不同的target里打开,为空时取类里的默认值<br />
&nbsp;private String target;<br />
&nbsp;//点击该链接时所想触发的脚本语句<br />
&nbsp;private String method;<br />
&nbsp;<br />
&nbsp;@Column(name="menu_data")<br />
&nbsp;@Pattern(regex="[^:\n\r]+")<br />
&nbsp;public String getData() {<br />
&nbsp;&nbsp;return data;<br />
&nbsp;}<br />
&nbsp;public void setData(String data) {<br />
&nbsp;&nbsp;this.data = data;<br />
&nbsp;}<br />
&nbsp;@Column(name="menu_hint")<br />
&nbsp;@Pattern(regex="[^:\n\r]+")<br />
&nbsp;public String getHint() {<br />
&nbsp;&nbsp;return hint;<br />
&nbsp;}<br />
&nbsp;public void setHint(String hint) {<br />
&nbsp;&nbsp;this.hint = hint;<br />
&nbsp;}<br />
&nbsp;@Column(name="menu_icon")<br />
&nbsp;@Pattern(regex="[^:\n\r]+")<br />
&nbsp;public String getIcon() {<br />
&nbsp;&nbsp;return icon;<br />
&nbsp;}<br />
&nbsp;public void setIcon(String icon) {<br />
&nbsp;&nbsp;this.icon = icon;<br />
&nbsp;}<br />
&nbsp;@Column(name="menu_method")<br />
&nbsp;@Pattern(regex="[^:\n\r]+")<br />
&nbsp;public String getMethod() {<br />
&nbsp;&nbsp;return method;<br />
&nbsp;}<br />
&nbsp;public void setMethod(String method) {<br />
&nbsp;&nbsp;this.method = method;<br />
&nbsp;}<br />
&nbsp;@Column(name="menu_parent_id")<br />
&nbsp;@Pattern(regex="[^:\n\r]+")<br />
&nbsp;public Long getParentId() {<br />
&nbsp;&nbsp;return parentId;<br />
&nbsp;}<br />
&nbsp;public void setParentId(Long parentId) {<br />
&nbsp;&nbsp;this.parentId = parentId;<br />
&nbsp;}<br />
&nbsp;@Column(name="menu_target")<br />
&nbsp;@Pattern(regex="[^:\n\r]+")<br />
&nbsp;public String getTarget() {<br />
&nbsp;&nbsp;return target;<br />
&nbsp;}<br />
&nbsp;public void setTarget(String target) {<br />
&nbsp;&nbsp;this.target = target;<br />
&nbsp;}<br />
&nbsp;@Column(name="menu_text",nullable=false)<br />
&nbsp;@Pattern(regex="[^:\n\r]+")<br />
&nbsp;public String getText() {<br />
&nbsp;&nbsp;return text;<br />
&nbsp;}<br />
&nbsp;public void setText(String text) {<br />
&nbsp;&nbsp;this.text = text;<br />
&nbsp;}<br />
&nbsp;@Column(name="menu_url")<br />
&nbsp;@Pattern(regex="[^:\n\r]+")<br />
&nbsp;public String getUrl() {<br />
&nbsp;&nbsp;return url;<br />
&nbsp;}<br />
&nbsp;public void setUrl(String url) {<br />
&nbsp;&nbsp;this.url = url;<br />
&nbsp;}<br />
}<br />
</p>
<p>/**<br />
&nbsp;* <br />
&nbsp;*/<br />
package com.daniel.lr.crbt.share.db;</p>
<p>import java.io.Serializable;<br />
import java.util.Date;</p>
<p>import javax.persistence.Column;<br />
import javax.persistence.GeneratedValue;<br />
import javax.persistence.GenerationType;<br />
import javax.persistence.Id;<br />
import javax.persistence.MappedSuperclass;</p>
<p>/**<br />
&nbsp;* @author Dianel Cao<br />
&nbsp;* @date&nbsp;&nbsp; 2007-4-18<br />
&nbsp;* @time&nbsp;&nbsp; 下午02:43:34<br />
&nbsp;*<br />
&nbsp;*/<br />
@MappedSuperclass<br />
public abstract class HibernateObject implements Serializable {<br />
&nbsp;private Long&nbsp;&nbsp; id;&nbsp; //id主键值<br />
&nbsp;private String name;&nbsp; //名称，备用字段<br />
&nbsp;private String status;&nbsp; //status，备用字段<br />
&nbsp;private String memo;&nbsp; //memo，备用字段<br />
&nbsp;private String createUser;&nbsp; //创建者，备用字段<br />
&nbsp;private Date&nbsp;&nbsp; createTime;&nbsp; //创建日期，备用字段<br />
&nbsp;private Date&nbsp;&nbsp; lastUpdateTime;&nbsp; //更新日期，备用字段<br />
&nbsp;<br />
&nbsp;@Id@GeneratedValue(strategy=GenerationType.IDENTITY)<br />
&nbsp;public Long getId() {<br />
&nbsp;&nbsp;return id;<br />
&nbsp;}<br />
&nbsp;public void setId(Long id) {<br />
&nbsp;&nbsp;this.id = id;<br />
&nbsp;}<br />
&nbsp;@Column(name="name",length=60)<br />
&nbsp;public String getName() {<br />
&nbsp;&nbsp;return name;<br />
&nbsp;}<br />
&nbsp;public void setName(String name) {<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;}<br />
&nbsp;@Column(name="status",length=10)<br />
&nbsp;public String getStatus() {<br />
&nbsp;&nbsp;return status;<br />
&nbsp;}<br />
&nbsp;public void setStatus(String status) {<br />
&nbsp;&nbsp;this.status = status;<br />
&nbsp;}<br />
&nbsp;@Column(name="memo")<br />
&nbsp;public String getMemo() {<br />
&nbsp;&nbsp;return memo;<br />
&nbsp;}<br />
&nbsp;public void setMemo(String memo) {<br />
&nbsp;&nbsp;this.memo = memo;<br />
&nbsp;}<br />
&nbsp;@Column(updatable=true,name="createUser",nullable=true,length=60)<br />
&nbsp;public String getCreateUser() {<br />
&nbsp;&nbsp;return createUser;<br />
&nbsp;}<br />
&nbsp;public void setCreateUser(String createUser) {<br />
&nbsp;&nbsp;this.createUser = createUser;<br />
&nbsp;}<br />
&nbsp;@Column(updatable=false,name="createTime",nullable=false)<br />
&nbsp;public Date getCreateTime() {<br />
&nbsp;&nbsp;return createTime;<br />
&nbsp;}<br />
&nbsp;public void setCreateTime(Date createTime) {<br />
&nbsp;&nbsp;this.createTime = createTime;<br />
&nbsp;}<br />
&nbsp;@Column(name="lastUpdateTime")<br />
&nbsp;public Date getLastUpdateTime() {<br />
&nbsp;&nbsp;return lastUpdateTime;<br />
&nbsp;}<br />
&nbsp;public void setLastUpdateTime(Date lastUpdateTime) {<br />
&nbsp;&nbsp;this.lastUpdateTime = lastUpdateTime;<br />
&nbsp;}<br />
}<br />
</p>
<h4><font color="#ff0000">第五、动态树状组织结构的Taglib实现：</font></h4>
<p>/**<br />
&nbsp;* <br />
&nbsp;*/<br />
package com.daniel.lr.crbt.service.web.taglib;</p>
<p>import java.io.IOException;<br />
import java.net.URLEncoder;<br />
import java.util.ArrayList;<br />
import java.util.Collection;<br />
import java.util.List;</p>
<p>import javax.servlet.jsp.JspException;<br />
import javax.servlet.jsp.JspWriter;<br />
import javax.servlet.jsp.tagext.Tag;<br />
import javax.servlet.jsp.tagext.TagSupport;</p>
<p>import org.apache.commons.logging.Log;<br />
import org.apache.commons.logging.LogFactory;</p>
<p>import com.daniel.lr.crbt.share.db.Menu;</p>
<p>/**<br />
&nbsp;* @author Daniel Cao<br />
&nbsp;* @date 2007-4-27<br />
&nbsp;* @time 下午11:51:09<br />
&nbsp;* <br />
&nbsp;*/<br />
public class TreeMenuTag extends TagSupport {<br />
&nbsp;private static final long serialVersionUID = -4747559965295669957L;<br />
&nbsp;protected Log logger = LogFactory.getLog(TreeMenuTag.class);<br />
&nbsp;// 菜单数据<br />
&nbsp;private Collection&lt;Menu&gt; menuCollection;<br />
&nbsp;// 树节点的图标存放位置路径，可以是相对路径或绝对路径<br />
&nbsp;private String imagePath = "images/";<br />
&nbsp;// 点击节点时，默认跳转的Url<br />
&nbsp;private String defaultUrl = "#";<br />
&nbsp;// 点击节点时，打开的默认位置，可以是_top,_self,_parent,某一页面Name等<br />
&nbsp;private String defaultTegart = "_self";</p>
<p>&nbsp;@Override<br />
&nbsp;public int doEndTag() throws JspException {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;JspWriter out = this.pageContext.getOut();<br />
&nbsp;&nbsp;&nbsp;out.write(buildTreeMenu(menuCollection));<br />
&nbsp;&nbsp;} catch (IOException ioe) {<br />
&nbsp;&nbsp;&nbsp;logger.error("输出自定义标签时错误.", ioe);<br />
&nbsp;&nbsp;&nbsp;throw new JspException("输出自定义标签时错误.");<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;logger.error("创建自定义标签时错误.", e);<br />
&nbsp;&nbsp;&nbsp;throw new JspException("创建自定义标签时错误.");<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return Tag.EVAL_PAGE;<br />
&nbsp;}</p>
<p>&nbsp;@Override<br />
&nbsp;public int doStartTag() throws JspException {<br />
&nbsp;&nbsp;return Tag.SKIP_BODY;<br />
&nbsp;}</p>
<p>&nbsp;@Override<br />
&nbsp;public void release() {<br />
&nbsp;&nbsp;menuCollection = null;<br />
&nbsp;&nbsp;super.release();<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;private String buildIcons(Collection&lt;Menu&gt; menuCollection) throws Exception{<br />
&nbsp;&nbsp;StringBuilder sb = new StringBuilder("");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;List&lt;String&gt; iconList = new ArrayList&lt;String&gt;();<br />
&nbsp;&nbsp;for (Menu menu : menuCollection) {<br />
&nbsp;&nbsp;&nbsp;String icon = menu.getIcon();<br />
&nbsp;&nbsp;&nbsp;if (icon == null || icon.trim().equals("") || icon.trim().equals(";")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;if (icon.indexOf(";") == 0) {//只有打开图标不符合,用默认图标<br />
&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />
&nbsp;&nbsp;&nbsp;}else if (icon.indexOf(";") == icon.length() - 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;String iconname = icon.substring(0, icon.length() - 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;String iconname1 = iconname.split("<a href='file://.")[0/' href_cetemp='file://.")[0/'>file://.")[0/</a>];<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!iconList.contains(iconname)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append("tree.icons[\"");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(iconname1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append("\"] = \"");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(iconname);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append("\";\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconList.add(iconname1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;String[] icons = icon.trim().split(";");<br />
&nbsp;&nbsp;&nbsp;&nbsp;String name0 = icons[0].split("<a href='file://.")[0/' href_cetemp='file://.")[0/'>file://.")[0/</a>];<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!iconList.contains(name0)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append("tree.icons[\"");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(name0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append("\"] = \"");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(icons[0]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append("\";\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append("tree.iconsExpand[\"");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(name0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append("\"] = \"");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(icons[1]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append("\";\n");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconList.add(name0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;return sb.toString();<br />
&nbsp;}</p>
<p>&nbsp;private String buildTreeMenu(Collection&lt;Menu&gt; menuCollection) throws Exception {<br />
&nbsp;&nbsp;StringBuilder sb = new StringBuilder("");<br />
&nbsp;&nbsp;sb.append("&lt;script language=\"JavaScript\"&gt;\n");<br />
&nbsp;&nbsp;sb.append("var tree = new MzTreeView(\"tree\");\n");<br />
&nbsp;&nbsp;//以下三步不能换位置<br />
&nbsp;&nbsp;//1,创建自定义图标库<br />
&nbsp;&nbsp;sb.append(buildIcons(menuCollection));<br />
&nbsp;&nbsp;//2,设定图标库路径<br />
&nbsp;&nbsp;sb.append("tree.setIconPath(\"");<br />
&nbsp;&nbsp;sb.append(imagePath);<br />
&nbsp;&nbsp;sb.append("\"); \n");<br />
&nbsp;&nbsp;//3,设定节点属性<br />
&nbsp;&nbsp;for (Menu menu : menuCollection) {<br />
&nbsp;&nbsp;&nbsp;String nodeInfo = "";<br />
&nbsp;&nbsp;&nbsp;String text = menu.getText();<br />
&nbsp;&nbsp;&nbsp;if (text != null &amp;&amp; !text.equals("")) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;nodeInfo += "text:" + text + ";";<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;Long id = menu.getId();<br />
&nbsp;&nbsp;&nbsp;Long pId = menu.getParentId();<br />
&nbsp;&nbsp;&nbsp;String hint = menu.getHint();<br />
&nbsp;&nbsp;&nbsp;if (hint != null &amp;&amp; !hint.equals("")) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;nodeInfo += "hint:" + hint + ";";<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;String icon = menu.getIcon();<br />
&nbsp;&nbsp;&nbsp;if (icon != null &amp;&amp; !icon.trim().equals("") &amp;&amp; icon.trim().length() &gt; 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (icon.indexOf(";") == 0) {//只有打开图标不符合,用默认图标<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else if (icon.indexOf(";") == icon.length() - 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String iconname = icon.substring(0, icon.length() - 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String iconname1 = iconname.split("<a href='file://.")[0/' href_cetemp='file://.")[0/'>file://.")[0/</a>];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nodeInfo += "icon:" + iconname1 + ";";<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[] icons = icon.trim().split(";");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String name0 = icons[0].split("<a href='file://.")[0/' href_cetemp='file://.")[0/'>file://.")[0/</a>];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nodeInfo += "icon:" + name0 + ";";<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;String data = menu.getData();<br />
&nbsp;&nbsp;&nbsp;if (data != null &amp;&amp; !data.trim().equals("")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;nodeInfo += "data:" + data + ";\n";<br />
&nbsp;&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;nodeInfo += "data:id=" + id + "&amp;name=" + URLEncoder.encode(text,"utf-8") + ";";<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;String url = menu.getUrl();<br />
&nbsp;&nbsp;&nbsp;if (url != null &amp;&amp; !url.trim().equals("")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;nodeInfo += "url:" + url + ";";<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;String target = menu.getTarget();<br />
&nbsp;&nbsp;&nbsp;if (target != null &amp;&amp; !target.trim().equals("")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;nodeInfo += "target:" + target + ";";<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;String method = menu.getMethod();<br />
&nbsp;&nbsp;&nbsp;if (method !=null &amp;&amp; !method.trim().equals("")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;String methodName = method.split("<a href='file://(")[0/' href_cetemp='file://(")[0/'>file://(")[0/</a>];<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (methodName.indexOf("javascript:") == -1){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodName = "javascript:" + methodName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (method != null &amp;&amp; !method.trim().equals("")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nodeInfo += "method:" + methodName + "(" + id + ",'" + text + "');";<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;nodeInfo += "\";";<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;sb.append("tree.nodes[\"");<br />
&nbsp;&nbsp;&nbsp;sb.append(pId);<br />
&nbsp;&nbsp;&nbsp;sb.append("_");<br />
&nbsp;&nbsp;&nbsp;sb.append(id);<br />
&nbsp;&nbsp;&nbsp;sb.append("\"] = \"");<br />
&nbsp;&nbsp;&nbsp;sb.append(nodeInfo);<br />
&nbsp;&nbsp;&nbsp;sb.append("\n");<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;sb.append("tree.setURL(\"");<br />
&nbsp;&nbsp;sb.append(defaultUrl);<br />
&nbsp;&nbsp;sb.append("\");\n");<br />
&nbsp;&nbsp;sb.append("tree.setTarget(\"");<br />
&nbsp;&nbsp;sb.append(defaultTegart);<br />
&nbsp;&nbsp;sb.append("\");\n");<br />
&nbsp;&nbsp;sb.append("document.write(tree.toString());\n");<br />
&nbsp;&nbsp;sb.append("&lt;/script&gt;\n");</p>
<p>&nbsp;&nbsp;return sb.toString();<br />
&nbsp;}</p>
<p>&nbsp;public String getDefaultTegart() {<br />
&nbsp;&nbsp;return defaultTegart;<br />
&nbsp;}</p>
<p>&nbsp;public void setDefaultTegart(String defaultTegart) {<br />
&nbsp;&nbsp;this.defaultTegart = defaultTegart;<br />
&nbsp;}</p>
<p>&nbsp;public String getDefaultUrl() {<br />
&nbsp;&nbsp;return defaultUrl;<br />
&nbsp;}</p>
<p>&nbsp;public void setDefaultUrl(String defaultUrl) {<br />
&nbsp;&nbsp;this.defaultUrl = defaultUrl;<br />
&nbsp;}</p>
<p>&nbsp;public String getImagePath() {<br />
&nbsp;&nbsp;return imagePath;<br />
&nbsp;}</p>
<p>&nbsp;public void setImagePath(String imagePath) {<br />
&nbsp;&nbsp;this.imagePath = imagePath;<br />
&nbsp;}</p>
<p>&nbsp;public Collection&lt;Menu&gt; getMenuCollection() {<br />
&nbsp;&nbsp;return menuCollection;<br />
&nbsp;}</p>
<p>&nbsp;public void setMenuCollection(Collection&lt;Menu&gt; menuCollection) {<br />
&nbsp;&nbsp;this.menuCollection = menuCollection;<br />
&nbsp;}<br />
}<br />
</p>
<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1611914</p>
<img src ="http://www.blogjava.net/i369/aggbug/151219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-09 08:51 <a href="http://www.blogjava.net/i369/articles/151219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入了解struts中的struts-config.xml  </title><link>http://www.blogjava.net/i369/articles/151217.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 09 Oct 2007 00:50:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/151217.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/151217.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/151217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/151217.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/151217.html</trackback:ping><description><![CDATA[<p><u><font color="#800080"><span class="Title"><u><font color="#800080">深入了解struts中的struts-config.xml</font></u>&nbsp;</span></font></u></p>
<p>&nbsp;弄清楚struts-config.xml中各项元素的作用，对于我们构建web项目有莫大的好处。&lt;struts-config&gt;是struts的根元素，它主要有8个子元素，DTD定义如下：</p>
<p>&lt;!ELEMENT struts-config<br />
(data-sources?,form-beans?,global-exceptions?,global-forwards?,action-mappings?,controller?,message-resources*,plug-in*)<br />
&gt;<br />
以上8个元素，下面一一描述：<br />
<font color="#ff0000"><strong>1. date-sources元素<br />
</strong></font><font color="#000000"><strong>　　</strong>date-sources元素用来配置应用程序所需要的数据源。java语言提供了javax.sql.DateSource接口，所有数据源必须实现该接口。如下配置：<br />
&lt;data-sources&gt;<br />
　　&lt;data-source type="org.apache.commons.dbcp.BasicDataSource"&gt;<br />
　　　　&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
　　&lt;/data-source&gt;<br />
</font>&lt;/data-sources&gt;<br />
在Action中访问方式如：<br />
javax.sql.DataSource dataSource;<br />
java.sql.Connection myConnection;<br />
try<br />
{<br />
　　dataSource = getDataSource(request);<br />
　　myConnection　＝　dataSource.getConnection();<br />
}<br />
&#8230;&#8230;&#8230;&#8230;<br />
　　如果是多数据源，可用如下配置：<br />
&lt;data-sources&gt;<br />
　　&lt;data-source key="a"&nbsp; type="org.apache.commons.dbcp.BasicDataSource"&gt;<br />
　　　　&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
　　&lt;/data-source&gt;<br />
　　&lt;data-source key="b"&nbsp;&nbsp; type="org.apache.commons.dbcp.BasicDataSource"&gt;<br />
　　　　&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; <br />
　　&lt;/data-source&gt;<br />
&lt;/data-sources&gt;<br />
访问方式：dataSource = getDataSource(request,"a");</p>
<p><strong><font color="#ff0000">&nbsp;2. form-beans元素</font></strong><br />
　　该元素主要用来配置表单验证的类。它包含如下属性：<br />
　　1. classname：一般用得少，指定和form-bean无素对应的配置类，默认为org.apache.struts.config.FormBeanConfig，如果自定义，则必须扩展FormBeanConfig类。可有可无。<br />
　　2. name：ActionForm Bean的惟一标识。必须。<br />
　　3. type：ActionForm的完整类名。必须。<br />
如下所示：<br />
&lt;form-beans&gt;<br />
　　&lt;form-bean <br />
　　　　　　name="Loign"<br />
　　　　　　type="com.ha.login"&gt;<br />
　　&lt;/form-bean&gt;<br />
&lt;/form-beans&gt;<br />
　　如果是动态Action FormBean，还必须配置form-bean元素的form-property子元素。它包含四个属性，上面三个，还有一个initial 元素：以字符串的形式设置表单字段的初始值，如果没有设置该属性，则是基本类型为0，如果是对象则为null。可有可无。如下所示：<br />
&lt;form-beans&gt;<br />
　　&lt;form-bean <br />
　　　　　　name="Loign"<br />
　　　　　　type="com.ha.login"&gt;<br />
　　　　　&lt;form-property name="ok"&nbsp; type="java.lang.String"/&gt;<br />
　　　　　&lt;form-property name="oks"&nbsp; type="java.lang.String"/&gt;<br />
　　　　　&lt;form-property name="okss"&nbsp; type="java.lang.Integer" initial="20"/&gt;<br />
　　&lt;/form-bean&gt;<br />
&lt;/form-beans&gt;</p>
<p><strong><font color="#ff0000">&nbsp;3. global-exceptions元素</font></strong><br />
　　该元素主要配置异常处理，它的exception子元素代表全局的异常配置。struts采取配置的方式来处理异常。它用来设置java异常和异常处理类org.apache.struts.action.ExceptionHandler之间的映射。它有七个属性，如下所示：<br />
　　1. className：指定和exception元素对应的配置类，默认为：org.apache.struts.config.ExceptionConfig。可有可无。<br />
　　2. Handler：指定异常得理类，默认为：org.apache.struts.action.ExceptionHandler。可有可无<br />
　　3. key：指定在Resource Bundle中描述该异常的消息key<br />
　　4. path：指定当异常发生时的转发路径。<br />
　　5. scope：指定ActionMessages实例的存放范围，可选值包括：request和session，默认为request。可有可无。<br />
　　6. type：指定所需处理异常类的名字，必须。<br />
　　7. bundle：指定Resource Bundle<br />
如下所示：<br />
&lt;global-exceptions&gt;<br />
　　&lt;exception <br />
　　　　　　key="global.error.invalidlogin"<br />
　　　　　　path="/error.jsp"<br />
　　　　　　scope="request"<br />
　　　　　　type="com.hn.tree"<br />
　　/&gt;<br />
&lt;/global-exceptions&gt;</p>
<p><font color="#ff0000"><strong>&nbsp;4. global-forwards元素<br />
</strong></font>　　该元素主要用来声明全局的转发关系，它具有以下四个属性：<br />
　　1. className：和forward元素对应的配置类，默认为：org.apache.struts.action.ActionForward。可有可无。<br />
　　2. contextRelative：此项为true时，表时path属性以＂/＂开头，相对于当前上下文的URL，默认为false．可有可无。　<br />
　　3. name：转发路径的逻辑名．必填。<br />
　　4. path：转发或重定向的URL，当contextRelative=false时，URL路径相对于当前应用（application），当为ture时，表示URL路径相对于当前上下文（context）。<br />
　　5.&nbsp; redirect：当此项为ture时，表示执行重定向操作。当此项为false时表示转向操作。默认为false。<br />
如下所示：<br />
&lt;global-forwards&gt;<br />
　　&lt;forward&nbsp; name="forms1" &nbsp;path="/a.do"/&gt;<br />
　　&lt;forward&nbsp; name="forms2" &nbsp;path="/nb.jsp"/&gt;<br />
&lt;global-forwards&gt;</p>
<p><font color="#ff0000"><strong>&nbsp;5. action-mappings元素</strong></font><br />
　　描述从特定的请求路径到相应的Action类的映射。它具有以下几个属性：<br />
　　1. attribute：设置和Action关联的ActionForm Bean在request和session范围内的key。如：Form Bean存在于request范围内，此项设为&#8220;myBenas&#8221;，则在request.getAttribute("myBenas")就可以返回该Bean的实例。<br />
　　2. classsName：和action元素对应的配置元素，默认为：org.apache.struts.action.ActionMapping.<br />
　　3. forward：转发的URL路径。<br />
　　4. include：指定包含的URL路径。<br />
　　5. input：输入表单的URL路径，当表单验证失败时，将把请求转发到该URL。<br />
　　6. name：指定和Action关联的Action FormBean的名字，该名字必须在Form-Bean定义过。<br />
　　7. path：指定访问Action的路径，以&#8220;/&#8221;开头，无扩展名。<br />
　　8. parameter：指定Actgion的配置参数，在Action类的execute()方法中，可以调用ActionMapping对象的getParameter()方法来读取该配置参数。<br />
　　9. roles：指定允许调用该Action的安全角色，多个角色之间用，隔开，在处理请求时，RequestProcessor会根据该配置项来决定用户是否有权限调用Action权限。<br />
　　10. scope：指定ActionForm Bean的存在范围，可选取为request和session，默认为session。<br />
　　11. type：指定Action类的完整类名。<br />
　　12. unknown：如果此项为true，表示可以处理用户发出的所有无效的Action URL，默认为false；<br />
　　13. validate：指定是否要调用Action FormBean的validate方法，默认值为ture.<br />
注：forward、include、type属性只能选中其中一项。<br />
如下：<br />
&lt;action path="/search"<br />
　　　　type="zxj.okBean"<br />
　　　　name="a1"<br />
　　　　scope="request"<br />
　　　　validate="true"<br />
　　　　input="/b.jsp"&gt;<br />
　　&lt;forward name="tig" path="/aa.jsp"/&gt;<br />
&lt;/action&gt;<br />
注：此中的forward是指局部的转发路径。global-forwards表示全局的转发路径。</p>
<p><font color="#ff0000"><strong>&nbsp;6. controller元素<br />
</strong></font>　　该元素用于配置ActionServlet。它具有以下属性。<br />
　　1. bufferSize：指定上载文件的输入缓冲大小，可选，默认为4096<br />
　　2. className：指定和controller元素对应的配置类，默认为org.apache.struts.config.ControllerConfig<br />
　　3. conentType：字符编码，如果在Action和JSP网页中设置了，则覆盖该设置。<br />
　　4. locale：指定是否把Locale对象保存到当前用户的session中，默认值为false.<br />
　　5. processorClass：指定负责请求的java类完整路径。<br />
　　6. tempDir：指定处理文件的临时工作目录，如果此项没有设置，将采用Servlet容器为web应用分配的临时工作目录。<br />
　　7. nochache：如果为true：在响应结果中将加入特定的头参数：Pragma,Cache-Control和Expise，防止页面被保存在客户端的浏览器中，默认为false<br />
如下：<br />
&lt;controller<br />
　　contentType="text/html;charset="UTF-8""<br />
　　locale="true"<br />
　　processorClass="con.ok"/&gt;</p>
<p><font color="#ff0000"><strong>&nbsp;7. message-resources元素</strong></font><br />
　　主要配置本地化消息文本，它具有以下属性。<br />
　　1. className：和message-resources元素对应的配置类，默认为org.apache.struts.config.MessageResourcesConfig。<br />
　　2. factory：指定消息资源的工厂类，默认为：org.apache.struts.util.PropertyMessageResourcesFactory类<br />
　　3. key：指定Resource Bundle存放的ServletContext对象中时采用的属性Key，默认由Globals.MESSAGES_KEY定义的字符串常量，只允许一个Resource Bundle采用默认的属性Key。<br />
　　4. null：指定MessageSources类如何处理未知消息的key，如果为true，则返回空字符串，如果为false，则返回相关字串，默认为false<br />
　　5. prameter：指定MessageSources的资源文件名，如果为：a.b.ApplicationResources，则实际对应的文件路径为：WEB-INF/classes/a/b/ApplicationResources.properties.<br />
如：<br />
&lt;message-resources null="false" parameter="defaultResource"/&gt;<br />
&lt;message-resources key="num1" null="false" parameter="test"/&gt;<br />
访问为：<br />
&lt;bean:message&nbsp; key="zxj"/&gt;<br />
&lt;bean:message&nbsp; key="zxj"&nbsp; bundle="num1"/&gt;<br />
其中，zxj表法，messagesource资源文件中的一个字符串。</p>
<p><font color="#ff0000"><strong>&nbsp;8. plugin-in元素</strong></font><br />
　　配置Struts的插件，属性如下：<br />
　　1.&nbsp;className：指定的Struts插件类，必须实现org.apache.struts.action.PlugiIn接口。如：<br />
&lt;plug-in<br />
　　className="a.b.c."&gt;<br />
　　&lt;set-property property="xxx" value="/WEB-INF/aa.xml"&nbsp;&nbsp;/&gt;<br />
&lt;/plug-in&gt;</p>
<p>&nbsp;后记，多模块的配置，可以供多个应用应用不同的struts-config.xml</p>
<p>(转载于：<a href="http://blog.csdn.net/zxjcool/archive/2006/06/18/810305.aspx">http://blog.csdn.net/zxjcool/archive/2006/06/18/810305.aspx</a>)</p>
<img src ="http://www.blogjava.net/i369/aggbug/151217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-09 08:50 <a href="http://www.blogjava.net/i369/articles/151217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>级联数据的树状存储结构HashMap实现</title><link>http://www.blogjava.net/i369/articles/151216.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 09 Oct 2007 00:49:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/151216.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/151216.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/151216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/151216.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/151216.html</trackback:ping><description><![CDATA[<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"><span style="color: #008000">//</span><span style="color: #008000">级联数据的树状存储结构HashMap实现</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*&nbsp;<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;test;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.ArrayList;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.HashMap;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Map;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Map.Entry;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;Daniel&nbsp;Cao<br />
&nbsp;*&nbsp;@date&nbsp;2007-4-26<br />
&nbsp;*&nbsp;@time&nbsp;上午12:20:44<br />
&nbsp;*&nbsp;<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestSortGroup&nbsp;{<br />
<br />
&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;args<br />
&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;TestSortGroup&nbsp;test&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TestSortGroup();<br />
&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;test.getGroupList1();<br />
&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">ok</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;}<br />
<br />
&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Group</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;makeList()&nbsp;{<br />
&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Group</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;totalList&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">Group</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
&nbsp;&nbsp;Group&nbsp;g1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Group();<br />
&nbsp;&nbsp;g1.setId(</span><span style="color: #000000">1L</span><span style="color: #000000">);<br />
&nbsp;&nbsp;g1.setName(</span><span style="color: #000000">"</span><span style="color: #000000">a1</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;g1.setParentId(</span><span style="color: #000000">0L</span><span style="color: #000000">);<br />
&nbsp;&nbsp;totalList.add(g1);<br />
&nbsp;&nbsp;Group&nbsp;g2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Group();<br />
&nbsp;&nbsp;g2.setId(</span><span style="color: #000000">2L</span><span style="color: #000000">);<br />
&nbsp;&nbsp;g2.setName(</span><span style="color: #000000">"</span><span style="color: #000000">a2</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;g2.setParentId(</span><span style="color: #000000">1L</span><span style="color: #000000">);<br />
&nbsp;&nbsp;totalList.add(g2);<br />
&nbsp;&nbsp;Group&nbsp;g3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Group();<br />
&nbsp;&nbsp;g3.setId(</span><span style="color: #000000">3L</span><span style="color: #000000">);<br />
&nbsp;&nbsp;g3.setName(</span><span style="color: #000000">"</span><span style="color: #000000">a3</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;g3.setParentId(</span><span style="color: #000000">0L</span><span style="color: #000000">);<br />
&nbsp;&nbsp;totalList.add(g3);<br />
&nbsp;&nbsp;Group&nbsp;g4&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Group();<br />
&nbsp;&nbsp;g4.setId(</span><span style="color: #000000">4L</span><span style="color: #000000">);<br />
&nbsp;&nbsp;g4.setName(</span><span style="color: #000000">"</span><span style="color: #000000">a4</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;g4.setParentId(</span><span style="color: #000000">1L</span><span style="color: #000000">);<br />
&nbsp;&nbsp;totalList.add(g4);<br />
&nbsp;&nbsp;Group&nbsp;g5&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Group();<br />
&nbsp;&nbsp;g5.setId(</span><span style="color: #000000">5L</span><span style="color: #000000">);<br />
&nbsp;&nbsp;g5.setName(</span><span style="color: #000000">"</span><span style="color: #000000">a5</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;g5.setParentId(</span><span style="color: #000000">2L</span><span style="color: #000000">);<br />
&nbsp;&nbsp;totalList.add(g5);<br />
&nbsp;&nbsp;Group&nbsp;g6&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Group();<br />
&nbsp;&nbsp;g6.setId(</span><span style="color: #000000">6L</span><span style="color: #000000">);<br />
&nbsp;&nbsp;g6.setName(</span><span style="color: #000000">"</span><span style="color: #000000">a6</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;g6.setParentId(</span><span style="color: #000000">2L</span><span style="color: #000000">);<br />
&nbsp;&nbsp;totalList.add(g6);<br />
&nbsp;&nbsp;Group&nbsp;g7&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Group();<br />
&nbsp;&nbsp;g7.setId(</span><span style="color: #000000">7L</span><span style="color: #000000">);<br />
&nbsp;&nbsp;g7.setName(</span><span style="color: #000000">"</span><span style="color: #000000">a7</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;g7.setParentId(</span><span style="color: #000000">3L</span><span style="color: #000000">);<br />
&nbsp;&nbsp;totalList.add(g7);<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;totalList;<br />
&nbsp;}<br />
<br />
&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getGroupList()&nbsp;{</span><span style="color: #008000">//</span><span style="color: #008000">针对3层</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Group</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;totalList&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;makeList();<br />
&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;第1层</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;lvl1Map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Group&nbsp;group&nbsp;:&nbsp;totalList)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;Long&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;group.getId();<br />
&nbsp;&nbsp;&nbsp;Long&nbsp;pId&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;group.getParentId();<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pId&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;GroupNode&nbsp;gn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GroupNode();<br />
&nbsp;&nbsp;&nbsp;&nbsp;gn.setId(id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;gn.setMember(group);<br />
&nbsp;&nbsp;&nbsp;&nbsp;lvl1Map.put(id,&nbsp;gn);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;第2层</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;lvl2Map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Group&nbsp;group&nbsp;:&nbsp;totalList)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;Long&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;group.getId();<br />
&nbsp;&nbsp;&nbsp;Long&nbsp;pId&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;group.getParentId();<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(lvl1Map.containsKey(pId))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;GroupNode&nbsp;gn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GroupNode();<br />
&nbsp;&nbsp;&nbsp;&nbsp;gn.setId(id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;gn.setMember(group);<br />
&nbsp;&nbsp;&nbsp;&nbsp;lvl2Map.put(id,&nbsp;gn);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;第3层</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;lvl3Map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Group&nbsp;group&nbsp;:&nbsp;totalList)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;Long&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;group.getId();<br />
&nbsp;&nbsp;&nbsp;Long&nbsp;pId&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;group.getParentId();<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(lvl2Map.containsKey(pId))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;GroupNode&nbsp;gn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GroupNode();<br />
&nbsp;&nbsp;&nbsp;&nbsp;gn.setId(id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;gn.setMember(group);<br />
&nbsp;&nbsp;&nbsp;&nbsp;lvl3Map.put(id,&nbsp;gn);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;先把2、3层拼起来</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Entry</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;entry&nbsp;:&nbsp;lvl3Map.entrySet())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;Long&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;entry.getKey();<br />
&nbsp;&nbsp;&nbsp;GroupNode&nbsp;node&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;entry.getValue();<br />
&nbsp;&nbsp;&nbsp;Long&nbsp;pId&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;node.getMember().getParentId();<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(lvl2Map.containsKey(pId))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;GroupNode&nbsp;parent&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lvl2Map.get(pId);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;son&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;parent.getSon();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(son&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;son&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;son.put(id,&nbsp;node);<br />
&nbsp;&nbsp;&nbsp;&nbsp;parent.setSon(son);<br />
&nbsp;&nbsp;&nbsp;&nbsp;lvl2Map.put(pId,&nbsp;parent);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;再把1、2层拼起来</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Entry</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;entry&nbsp;:&nbsp;lvl2Map.entrySet())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;Long&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;entry.getKey();<br />
&nbsp;&nbsp;&nbsp;GroupNode&nbsp;node&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;entry.getValue();<br />
&nbsp;&nbsp;&nbsp;Long&nbsp;pId&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;node.getMember().getParentId();<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(lvl1Map.containsKey(pId))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;GroupNode&nbsp;parent&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lvl1Map.get(pId);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;son&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;parent.getSon();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(son&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;son&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;son.put(id,&nbsp;node);<br />
&nbsp;&nbsp;&nbsp;&nbsp;parent.setSon(son);<br />
&nbsp;&nbsp;&nbsp;&nbsp;lvl1Map.put(pId,&nbsp;parent);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;lvl1Map;<br />
&nbsp;}<br />
<br />
&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getGroupList1()&nbsp;{</span><span style="color: #008000">//</span><span style="color: #008000">无限层的实现</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Group</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;totalList&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;makeList();<br />
&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">保存所有层数据</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;lvlList&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">();<br />
&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">前一层</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;lastLlvlMap&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(totalList</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">totalList.isEmpty())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">当前层数据</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;lvlMap&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Group</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;tmpList&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">Group</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Group&nbsp;group&nbsp;:&nbsp;totalList)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Long&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;group.getId();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Long&nbsp;pId&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;group.getParentId();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pId&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GroupNode&nbsp;gn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GroupNode();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gn.setId(id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gn.setMember(group);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lvlMap.put(id,&nbsp;gn);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpList.add(group);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(lastLlvlMap&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;lastLlvlMap.containsKey(pId))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GroupNode&nbsp;gn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GroupNode();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gn.setId(id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gn.setMember(group);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lvlMap.put(id,&nbsp;gn);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpList.add(group);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;totalList.removeAll(tmpList);<br />
&nbsp;&nbsp;&nbsp;lvlList.add(lvlMap);<br />
&nbsp;&nbsp;&nbsp;lastLlvlMap&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lvlMap;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lvlList.size();<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(size&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">){<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(size&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">){<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;lvlList.get(</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">从最后一层向前归并</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;lastLvlMap&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lvlList.get(size&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;size</span><span style="color: #000000">-</span><span style="color: #000000">2</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">){<br />
&nbsp;&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;currentLvlMap&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lvlList.get(i);<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Entry</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;entry&nbsp;:&nbsp;lastLvlMap.entrySet())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Long&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;entry.getKey();<br />
&nbsp;&nbsp;&nbsp;&nbsp;GroupNode&nbsp;node&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;entry.getValue();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Long&nbsp;pId&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;node.getMember().getParentId();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(currentLvlMap.containsKey(pId))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GroupNode&nbsp;parent&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;currentLvlMap.get(pId);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;son&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;parent.getSon();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(son&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;son&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">Long,&nbsp;GroupNode</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;son.put(id,&nbsp;node);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent.setSon(son);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentLvlMap.put(pId,&nbsp;parent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;lastLvlMap&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;currentLvlMap;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;System.out.println(lastLvlMap.size());<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;lastLvlMap;<br />
&nbsp;}<br />
}<br />
<br />
<br />
</span></div>
<img src ="http://www.blogjava.net/i369/aggbug/151216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-09 08:49 <a href="http://www.blogjava.net/i369/articles/151216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>native2ascii工具完全揭密作者: 周建东  日期: 2007-08-29 14:54</title><link>http://www.blogjava.net/i369/articles/151214.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 09 Oct 2007 00:48:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/151214.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/151214.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/151214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/151214.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/151214.html</trackback:ping><description><![CDATA[<table width="100%" border="0">
    <tbody>
        <tr>
            <td>
            <div><font size="2"><font color="#0000ff">背景</font>：在做Java开发的时候，常常会出现一些乱码，或者无法正确识别或读取的文件，比如常见的validator验证用的消息资源（properties）文件就需要进行Unicode重新编码。原因是java默认的编码方式为Unicode，而我们的计算机系统编码常常是GBK等编码。需要将系统的编码转换为java正确识别的编码问题就解决了。</font></div>
            <div><font size="2"><font color="#0000ff"><strong>1、native2ascii简介</strong></font>：native2ascii是sun java sdk提供的一个工具。用来将别的文本类文件（比如*.txt,*.ini,*.properties,*.java等等）编码转为Unicode编码。为什么要进行转码，原因在于程序的国际化。Unicode编码的定义：Unicode（统一码、万国码、单一码）是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码，以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发，1994年正式公布。随着计算机工作能力的增强，Unicode也在面世以来的十多年里得到普及。（声明：Unicode编码定义来自互联网）。</font></div>
            <div><font size="2"><font color="#0000ff"><strong>2、获取native2ascii</strong></font>：安装了jdk后，假如你是在windows上安装，那么在jdk的安装目录下，会有一个bin目录，其中native2ascii.exe正是。</font></div>
            <div><font size="2"><font color="#0000ff"><strong>3、native2ascii的命令行的命名格式</strong></font>：<br />
            <font color="#ff00ff">native2ascii -[options] [inputfile [outputfile]]<br />
            </font></font></div>
            <div><font size="2"><font color="#228b22">说明：</font> </font></div>
            <div><font color="#0000ff" size="2"><font color="#ff00ff">-[options]：表示命令开关，有两个选项可供选择</font><br />
            <font color="#008000">-reverse：将Unicode编码转为本地或者指定编码，不指定编码情况下，将转为本地编码。<br />
            -encoding encoding_name：转换为指定编码，encoding_name为编码名称。<font color="#000000"><br />
            </font></font></font><font color="#0000ff" size="2"><font color="#ff00ff">[inputfile [outputfile]]</font><br />
            <font color="#008000">inputfile：表示输入文件全名。<br />
            outputfile：输出文件名。如果缺少此参数，将输出到控制台。</font></font></div>
            <div><font size="2"><font color="#0000ff"><strong>4、最佳实践</strong></font>：首先将JDK的bin目录加入系统变量path。在盘下建立一个test目录，在test目录里建立一个zh.txt文件，文件内容为：&#8220;熔岩&#8221;，打开&#8220;命令行提示符&#8221;，并进入C:test目录下。下面就可以按照说明一步一步来操作，注意观察其中编码的变化。</font></div>
            <div><font size="2"><font color="#ff1493">A：将zh.txt转换为Unicode编码，输出文件到u.txt<br />
            </font><font color="#ff00ff"><font color="#008000">native2ascii zh.txt u.txt</font><br />
            </font>打开u.txt，内容为&#8220;u7194u5ca9&#8221;。</font></div>
            <div><font color="#ff1493" size="2">B：将zh.txt转换为Unicode编码，输出到控制台</font></div>
            <div><font size="2">C:test&gt;<font color="#228b22">native2ascii zh.txt<br />
            </font>u7194u5ca9<br />
            可以看到，控制台输出了&#8220;u7194u5ca9&#8221;。</font></div>
            <div><font color="#ff1493" size="2">C：将zh.txt转换为ISO8859-1编码，输出文件到i.txt</font><font size="2"><br />
            <font color="#228b22">native2ascii -encoding ISO8859-1 zh.txt i.txt<br />
            </font>打开i.txt文件，内容为&#8220;u00c8u00dbu00d1u00d2&#8221;。</font></div>
            <div><font size="2"><font color="#ff1493">D：将u.txt转换为本地编码，输出到文件u_nv.txt<br />
            </font><font color="#228b22">native2ascii -reverse u.txt u_nv.txt<br />
            </font>打开u_nv.txt文件，内容为&#8220;熔岩&#8221;。</font></div>
            <div><font size="2"><font color="#ff1493">E：将u.txt转换为本地编码，输出到控制台</font><br />
            C:test&gt;<font color="#228b22">native2ascii -reverse u.txt<br />
            </font>熔岩<br />
            可以看到，控制台输出了&#8220;熔岩&#8221;。</font></div>
            <div><font size="2"><font color="#ff1493">F：将i.txt转换为本地编码，输出到i_nv.txt<br />
            </font><font color="#228b22">native2ascii -reverse i.txt i_nv.txt<br />
            </font>打开i_nv.txt文件，内容为&#8220;u00c8u00dbu00d1u00d2&#8221;。发现转码前后完全一样的。也就是说，等于没有转，或者说思想糊涂，对命名没有理解。。</font></div>
            <div><font size="2"><font color="#ff1493">G：将i.txt转换为GBK编码，输出到i_gbk.txt<br />
            </font><font color="#32cd32"><font color="#228b22">native2ascii -reverse -encoding GBK i.txt i_gbk.txt</font><br />
            </font>打开i_gbk.txt文件，内容为&#8220;u00c8u00dbu00d1u00d2&#8221;。发现转码前后完全一样的。也就是说，等于没有转，或者说思想糊涂，对命名没有理解。</font></div>
            <div><font size="2"><font color="#ff1493">H：将u_nv.txt转码到本地编码GBK，输出到控制台<br />
            </font>C:test&gt;<font color="#228b22">native2ascii -reverse -encoding ISO8859-1 i.txt<br />
            </font>熔岩<br />
            从这个结果看，目标达到到了，编码i.txt为ISO8859-1，转为本地编码后内容为&#8220;熔岩&#8221;。从这里应该意识到，<strong><font color="#0000ff">native2ascii -reverse命令中-encoding指定的编码为源文件的编码格式。而在native2ascii 命令中-encoding指定的编码为（生成的）目标文件的编码格式。这一点非常的重要！切记！！<br />
            </font></strong></font></div>
            <div><font size="2">继续探索，新建文件12a.txt，内容&#8220;12axyz&#8221;。看看纯字母数字的编码又如何。</font></div>
            <div><font size="2"><font color="#ff1493">I：将纯字母数字的文本文件12a.txt转换为Unicode编码</font><br />
            <font color="#228b22">native2ascii 12a.txt 12a_nv.txt<br />
            </font>打开12a_nv.txt文件，内容为&#8220;12axyz&#8221;。<br />
            继续测试，转为ISO8859-1编码看看<br />
            </font><font size="2">C:test&gt;<font color="#228b22">native2ascii -encoding ISO8859-1 12a.txt<br />
            </font>12axyz<br />
            结果还是没有转码。<br />
            从结果可以得出结论：对于纯数字和字母的文本类型件，转码前后的内容是一样的。<br />
            </font></div>
            <div><font size="2"><font color="#0000ff"><strong>5、总结</strong></font>：<font color="#000000"><font color="#0000ff">native2ascii是一个非常的好转码工具，并且转码是可逆的！而其真正的含义并非本地编码——&gt;转码为ASCII码，而是一个通用的文本文件编码转换工具。在做编码转换的时候有两类指定编码的情形，分别指输出文件编码和输入文件编码，具体可以看看最佳实践部分。</font></font></font></div>
            <div><font color="#000000" size="3"><strong>实际应用中：</strong></font></div>
            <div>
            <div>比如可以这样利用native2ascii：</div>
            <div><strong>native2ascii -encoding gbk&nbsp;&nbsp;&nbsp;&nbsp; temp.properties&nbsp;&nbsp;&nbsp; application_zh_CN.properties</strong></div>
            <div>
            <div>&nbsp;&nbsp;&nbsp; 这里将根据一个临时文件temp.properties输出了application_zh_CN.properties，然后把application_zh_CN.properties中的文件内容替换这个临时文件的内容就可以了。</div>
            </div>
            </div>
            </td>
            &nbsp;&nbsp;&nbsp;&nbsp;
        </tr>
    </tbody>
</table>
<div class="Content-body"><img style="margin: 0px 2px -4px 0px" alt="" src="file:///C:/Documents%20and%20Settings/ljw/My%20Documents/My%20Pictures/native2ascii工具完全揭密%20-%20工具%20-%20周老师科研站.files/icon_trackback.gif" /><strong>引用通告地址:</strong> <span id="tbURL" title="点击复制到剪贴板" style="cursor: pointer" onclick="CopyText(document.all.tbURL)">http://tmsoft.lsxy.com/trackback.php?tbID=393&amp;extra=ed9faa</span><br />
</div>
<img src ="http://www.blogjava.net/i369/aggbug/151214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-09 08:48 <a href="http://www.blogjava.net/i369/articles/151214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>