﻿<?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-followith</title><link>http://www.blogjava.net/followith/</link><description>既然我们不能改变周遭的世界，我们就只好改变自己，用慈悲心和智慧心来面对这一切。</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 11:33:51 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 11:33:51 GMT</pubDate><ttl>60</ttl><item><title>SAX Parser </title><link>http://www.blogjava.net/followith/archive/2009/05/12/270214.html</link><dc:creator>followith</dc:creator><author>followith</author><pubDate>Tue, 12 May 2009 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/followith/archive/2009/05/12/270214.html</guid><wfw:comment>http://www.blogjava.net/followith/comments/270214.html</wfw:comment><comments>http://www.blogjava.net/followith/archive/2009/05/12/270214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/followith/comments/commentRss/270214.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/followith/services/trackbacks/270214.html</trackback:ping><description><![CDATA[<p><a name="0"><font size="2">什么是 SAX</font></a><br />
<font size="2">读取和操纵 XML 文件的标准方法是 DOM（&#8220;文档对象模型&#8221;）。遗憾的是，这种方法需要读取整个文件并将它存储到树结构中，因而效率不高、缓慢，并且会过度使用资源。</font></p>
<p><font size="2">一种替代方法是使用 Simple API for XML 或 SAX。SAX 允许正在读取文档时处理该文档，这避免了在采取操作之前需要等待存储文档的所有内容。</font></p>
<p><font size="2">SAX 是由 XML-DEV 邮件列表的成员开发的，Java 版本由 David Megginson 维护。他们的目的是提供一种更自然的方法来使用 XML，这种方法不会涉及到使用 DOM 的那种开销。</font></p>
<p><font size="2">结果是基于事件的 API。解析器将事件（譬如，元素的开始或结束）发送给处理信息的事件处理程序。然后，应用程序自己可以处理数据。虽然原始文档保持不变，但 SAX 提供了操纵数据的方法，然后会将该方法导向另一个过程或文档。</font></p>
<p><font size="2">对于 SAX，没有官方的标准；万维网（W3C）或其它官方组织不维护 SAX，但在 XML 社区中，它是一个事实上的标准。</font></p>
<p><a name="1"><font size="2">SAX 处理是如何工作的</font></a><br />
<font size="2">SAX 分析经过其的 XML 流，这非常象老式的自动收报机纸条。考虑以下 XML 代码片断：</font></p>
<table width="100%" bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0">
    <tbody>
        <tr>
            <td>
            <pre><code><br />
            <font size="2">&lt;?xml version="1.0"?&gt;<br />
            &lt;samples&gt;<br />
            &lt;server&gt;UNIX&lt;/server&gt;<br />
            &lt;monitor&gt;color&lt;/monitor&gt;<br />
            &lt;/samples&gt;<br />
            </font></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<p><font size="2">一般情况下，SAX 处理器分析这段代码将生成以下事件：</font></p>
<table width="100%" bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0">
    <tbody>
        <tr>
            <td>
            <pre><code><br />
            <font size="2">Start document<br />
            Start element (samples)<br />
            Characters (white space)<br />
            Start element (server)<br />
            Characters (UNIX)<br />
            End element (server)<br />
            Characters (white space)<br />
            Start element (monitor)<br />
            Characters (color)<br />
            End element (monitor)<br />
            Characters (white space)<br />
            End element (samples)<br />
            </font></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<p><font size="2">SAX API 允许开发者捕获这些事件，并对它们进行操作。</font></p>
<p><font size="2">SAX 处理涉及以下几步：</font></p>
<ol xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/">
    <li><font size="2">创建事件处理程序。 </font>
    </li>
    <li><font size="2">创建 SAX 解析器。 </font>
    </li>
    <li><font size="2">将事件处理程序分配给解析器。 </font>
    </li>
    <li><font size="2">对文档进行解析，将每个事件发送给处理程序。 </font></li>
</ol>
<p><a name="2"><font size="2"><span style="color: #08a3ff;">
<p><a name="2"><font size="2">在SAX与DOM之间，如何选择</font></a><br />
<font size="2">选择 DOM 还是 SAX，这取决于几个因素：</font></p>
<ol xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/">
    <li><font size="2">应用程序的目的：如果必须对数据进行更改，并且作为 XML 将它输出，则在大多数情况下，使用 DOM。与使用 XSL 转换来完成的简单结构更改不一样，如果是对数据本身进行更改，则尤其应该使用 DOM。 </font>
    </li>
    <li><font size="2">数据的数量：对于大文件，SAX 是更好的选择。 </font>
    </li>
    <li><font size="2">将如何使用数据：如果实际上只使用一小部分数据，则使用 SAX 将数据抽取到应用程序中，这种方法更好些。另一方面，如果知道将需要向后引用已经处理过的信息，则 SAX 可能不是正确的选择。 </font>
    </li>
    <li><font size="2">需要速度：通常，SAX 实现比 DOM 实现快。 </font></li>
</ol>
<p><font size="2">记住 SAX 和 DOM 不是互斥的，这一点很重要。可以使用 DOM 来创建事件的 SAX 流，可以使用 SAX 来创建 DOM 树。事实上，大多数解析器实际常常使用 SAX 来创建 DOM 树！</font></p>
</span></font></a></p>
<p><font size="2"></font></p>
<p><a name="3"><font size="2">使用 JAXP 来创建解析器</font></a><br />
<font size="2">接下来我们来看一下JAXP的SAX Parser是怎么样工作的。</font></p>
<p><font size="2">首先声明 XMLReader xmlReader。然后使用 SAXParserFactory 来创建 SAXParser。正是 SAXParser 给您了 XMLReader。</font></p>
<table width="100%" bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0">
    <tbody>
        <tr>
            <td>
            <pre><code><br />
            <font size="2">import org.xml.sax.helpers.DefaultHandler;<br />
            import javax.xml.parsers.SAXParser;<br />
            import javax.xml.parsers.SAXParserFactory;<br />
            import org.xml.sax.XMLReader;<br />
            <br />
            public class SurveyReader extends DefaultHandler<br />
            {<br />
            public SurveyReader() {<br />
            }<br />
            <br />
            public static void main (String args[]) {<br />
            XMLReader xmlReader = null;<br />
            try {<br />
            SAXParserFactory spfactory =<br />
            SAXParserFactory.newInstance();<br />
            spfactory.setValidating(false);	//设置验证选项,<br />
            如果您的XML文件是有效文档的话,<br />
            就不用验证.这将提高处理速度<br />
            SAXParser saxParser = spfactory.newSAXParser();<br />
            xmlReader = saxParser.getXMLReader();<br />
            <br />
            } catch (Exception e) {<br />
            System.err.println(e);<br />
            System.exit(1);<br />
            }<br />
            }<br />
            }<br />
            </font></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<p><a name="4"><font size="2">设置内容处理程序</font></a><br />
<font size="2">一旦创建了解析器，则需要将 SurveyReader 设置为内容处理程序，以便于其接收事件。</font></p>
<p><font size="2">xmlReader 的 setContentHandler() 方法完成这项工作。</font></p>
<table width="100%" bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0">
    <tbody>
        <tr>
            <td>
            <pre><code><br />
            <font size="2">...<br />
            xmlReader = saxParser.getXMLReader();<br />
            <br />
            xmlReader.setContentHandler(new SurveyReader());<br />
            <br />
            } catch (Exception e) {<br />
            ...<br />
            </font></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<p><font size="2">当然，对于内容处理程序，这不是唯一的选项。</font></p>
<p><a name="5"><font size="2">解析 InputSource</font></a><br />
<font size="2">为了对文件进行实际地解析，需要 InputSource。这个 SAX 类封装了所有将要处理的数据，所以不必担心它来自哪里。</font></p>
<p><font size="2">现在，准备对文件进行实际解析。应用程序将封装在 InputSource 中的文件传递给 parse()，然后应用程序会继续运行。</font></p>
<table width="100%" bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0">
    <tbody>
        <tr>
            <td>
            <pre><code><br />
            <font size="2">...<br />
            <br />
            import org.xml.sax.InputSource;<br />
            <br />
            ...<br />
            xmlReader = saxParser.getXMLReader();<br />
            xmlReader.setContentHandler(new SurveyReader());<br />
            <br />
            InputSource source = new InputSource("surveys.xml");<br />
            xmlReader.parse(source);<br />
            <br />
            <br />
            } catch (Exception e) {<br />
            ...<br />
            </font></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<p><font size="2">可以编译和运行该程序，但这时应该什么也没有发生，因为应用程序还没有定义任何事件。</font></p>
<p><a name="6"><font size="2">创建 ErrorHandler</font></a><br />
<font size="2">当然总会有可能在试图进行解析时，数据有问题。在这样的情况下，有一个处理程序来处理错误和内容将是有帮助的。</font></p>
<p><font size="2">就如同创建内容处理程序一样，可以创建出错处理程序。通常，将作为 ErrorHandler
的单独实例来创建它，但为了简化该示例，出错处理正是包含在 SurveyResults 中。由于该类继承了 DefaultHandler
且没有扩展 ContentHandler，所以这种双重用法是可能的。</font></p>
<p><font size="2">需要关注的事件有三个：警告、错误和致命错误。</font></p>
<table width="100%" bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0">
    <tbody>
        <tr>
            <td>
            <pre><code><br />
            <font size="2">...<br />
            <br />
            import org.xml.sax.SAXParseException;<br />
            <br />
            <br />
            public class SurveyReader extends DefaultHandler<br />
            {<br />
            <br />
            public SurveyReader() {<br />
            }<br />
            public void error (SAXParseException e) {<br />
            System.out.println("Error parsing the file: "+e.getMessage());<br />
            }<br />
            public void warning (SAXParseException e) {<br />
            System.out.println("Problem parsing the file: "+e.getMessage());<br />
            }<br />
            public void fatalError (SAXParseException e) {<br />
            System.out.println("Error parsing the file: "+e.getMessage());<br />
            System.out.println("Cannot continue.");<br />
            System.exit(1);<br />
            }<br />
            }<br />
            ....<br />
            xmlReader.setContentHandler(new SurveyReader());<br />
            <br />
            xmlReader.setErrorHandler(new SurveyReader());<br />
            //设置 ErrorHandler<br />
            <br />
            InputSource source = new InputSource("surveys.xml");<br />
            ....<br />
            <br />
            public static void main (String args[]) {<br />
            ...<br />
            <br />
            </font></code></pre>
            </td>
        </tr>
    </tbody>
</table>
<p><a name="7"><font size="2">SAX 事件</font></a><br />
<font size="2">以下事件是常用的；它们都在 org.xml.sax 包的 HandlerBase 类中定义。</font></p>
<ol xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/">
    <li><font size="2">startDocument 表示文档开始。 </font>
    </li>
    <li><font size="2">endDocument 表示文档结束。 </font>
    </li>
    <li><font size="2">startElement 表示元素开始。当一对标记中的起始标记中的所有内容被处理后，解析器 激发此事件。包括了标记名和其属性。 </font>
    </li>
    <li><font size="2">endElement 表示元素结束。 </font>
    </li>
    <li><font size="2">characters 包含字符数据，类似于 DOM 的一个 Text 节点。 </font></li>
</ol>
<p><font size="2">还有更多的 SAX 事件：</font></p>
<ol xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dw="http://www.ibm.com/developerworks/">
    <li><font size="2">ignorableWhitespace 此事件类似于我们前面所讨论的无用 DOM 节点。它与 character 事件的区别，好处是:如果您不需要空格符，您可以通过忽略这个事件来忽略所有的空格符。 </font>
    </li>
    <li><font size="2">warning、error 和 fatalError 这三个事件表示了解析错误。您可根据需要来响应它们。 </font>
    </li>
    <li><font size="2">setDocumentLocator 这个事件允许您存储一个 SAX 的 Locator 对象。Locator 对象可以用来找出在文档中确切发生事件的地方。 </font></li>
</ol>
<p><font size="2">转自：<a href="http://www-128.ibm.com/developerworks/cn/xml/x-cert/part8/">http://www-128.ibm.com/developerworks/cn/xml/x-cert/part8/</a></font></p>
<img src ="http://www.blogjava.net/followith/aggbug/270214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/followith/" target="_blank">followith</a> 2009-05-12 15:29 <a href="http://www.blogjava.net/followith/archive/2009/05/12/270214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP的重定向有两种：forward和sendRedirect，它们的原理以及区别</title><link>http://www.blogjava.net/followith/archive/2009/04/24/267324.html</link><dc:creator>followith</dc:creator><author>followith</author><pubDate>Fri, 24 Apr 2009 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/followith/archive/2009/04/24/267324.html</guid><wfw:comment>http://www.blogjava.net/followith/comments/267324.html</wfw:comment><comments>http://www.blogjava.net/followith/archive/2009/04/24/267324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/followith/comments/commentRss/267324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/followith/services/trackbacks/267324.html</trackback:ping><description><![CDATA[<br />
<div style="text-align: left;">JSP的重定向有两种：forward和sendRedirect，它们的原理以及区别是什么呢？
<div>&nbsp;</div>
<div style="text-indent: 21pt;">它们在使用上的区别有很多，那些都是表面现象，在理解了它们各自的原理以后，使用上的区别那就能容易掌握了。<br />
<table width="160" align="left" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td id="newbooks1"><br />
            </td>
        </tr>
    </tbody>
</table>
</div>
<div style="margin-left: 21pt; text-indent: -21pt;">一、原理.</div>
<div style="margin-left: 39pt; text-indent: -18pt;">1、&nbsp;Forward</div>
<div style="text-indent: 18pt;">这种方式是在<a href="http://www.23book.net/Server/Index.htm">服务器</a>端作的重定向。<a href="http://www.23book.net/Server/Index.htm">服务器</a>往<span>client发送数据的过程是这样的：<a href="http://www.23book.net/Server/Index.htm">服务器</a>在
向客户端发送数据之前，是先将数据输出到缓冲区，然后将缓冲区中数据发送给client端。什么时候将缓冲区里的数据发送给client端呢？（1）当对
来自client的request处理完，并把所有数据输出到缓冲区，（2）当缓冲区满，（3）在程序中调用缓冲区的输出方法out.flush()或
response.flushbuffer()，web container才将缓冲区中的数据发送给client。</span></div>
<div style="text-indent: 18pt;">这种重定向方式是利用<a href="http://www.23book.net/Server/Index.htm">服务器</a>端的缓冲区机制，在把缓冲区的数据发送到客户端之前，原来的数据不发送，将执行转向重定向页面，发送重定向页面的数据，重定向调用页的数据将被清除。如果在&lt;JSP:FORWORD&gt;之前有很多输出，前面的输出已使缓冲区满，将自动输出到客户端，那么这种重定向方式将不起作用，这一点应该特别注意。</div>
<div><span style="font-size: 10pt;">public&nbsp;void&nbsp;doPost(HttpServletRequest&nbsp;request,HttpServletResponse&nbsp;response)&nbsp;&nbsp;throws&nbsp;ServletException,IOException<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType("text/html;&nbsp;charset=UTF-8");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletContext&nbsp;sc&nbsp;=&nbsp;getServletContext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestDispatcher&nbsp;rd&nbsp;=&nbsp;null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rd&nbsp;=&nbsp;sc.getRequestDispatcher("/index.jsp");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rd.forward(request,&nbsp;response);<br />
}</span></div>
<div style="margin-left: 39pt; text-indent: -18pt;">2、&nbsp;sendRedirect</div>
<div style="text-indent: 21pt;">这种方式是在客户端作的重定向处理。该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的，让浏览器对在location中指定的<span style="color: black; text-decoration: none;">URL提出请求，使浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL，那么Web&nbsp;container在将它发送到客户端前会把它转换成一个绝对的URL。</span><span style="font-size: 10pt;">public&nbsp;void&nbsp;doPost(HttpServletRequest&nbsp;request,HttpServletResponse&nbsp;response)&nbsp;&nbsp;&nbsp;throws&nbsp;ServletException,IOException<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType("text/html;&nbsp;charset=UTF-8");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.sendRedirect("/index.jsp");<br />
}</span></div>
<div><strong>&nbsp;</strong></div>
<div>二、区别.</div>
<div style="text-indent: 21pt;">1、forward重定向是在容器内部实现的同一个Web应用程序的重定向，所以forward方法只能重定向到同一个Web应用程序中的一个资源，<span style="font-size: 10pt;">重定向后浏览器地址栏</span><span style="font-size: 10pt;">URL</span><span style="font-size: 10pt;">不变</span>，而sendRedirect方法可以重定向到任何URL， 因为这种方法是修改http头来实现的，URL没什么限制，<span style="font-size: 10pt;">重定向后浏览器地址栏</span><span style="font-size: 10pt;">URL</span><span style="font-size: 10pt;">改变</span>。</div>
<div style="text-indent: 21pt;">2、forward重定向将原始的HTTP请求对象（request）从一个servlet实例传递到另一个实例，而采用sendRedirect方式两者不是同一个application。</div>
<div style="text-indent: 21pt;">3、基于第二点，参数的传递方式不一样。forward的form参数跟着传递，所以在第二个实例中可以取得HTTP请求的参数。sendRedirect只能通过链接传递参数，response.sendRedirect(&#8220;login.jsp?param1=a&#8221;)。</div>
<div style="text-indent: 21pt;">4、sendRedirect能够处理相对URL，自动把它们转换成绝对URL，如果地址是相对的，没有一个&#8216;/&#8217;，那么Web&nbsp;container就认为它是相对于当前的请求<span style="color: black; text-decoration: none;">URI的。比如，如果为response.sendRedirect("login.jsp")，则会从当前servlet 的<span style="color: black; text-decoration: none;">URL</span>路径下找login.jsp： http://10.1.18.8:8081/dms/servlet/Servlet 重定向的URL: <span style="color: black; text-decoration: none;">http://10.1.18.8:8081/dms/servlet/login.jsp</span>，如果为response.sendRedirect("/login.jsp")则会从当前应用径下查找<span style="color: black; text-decoration: none;">url:http://10.1.18.8:8081/login.jsp</span>。而forward不能这样处理相对路径。</span></div>
</div>
<img src ="http://www.blogjava.net/followith/aggbug/267324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/followith/" target="_blank">followith</a> 2009-04-24 11:39 <a href="http://www.blogjava.net/followith/archive/2009/04/24/267324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Log4j分析</title><link>http://www.blogjava.net/followith/archive/2009/04/22/266919.html</link><dc:creator>followith</dc:creator><author>followith</author><pubDate>Wed, 22 Apr 2009 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/followith/archive/2009/04/22/266919.html</guid><wfw:comment>http://www.blogjava.net/followith/comments/266919.html</wfw:comment><comments>http://www.blogjava.net/followith/archive/2009/04/22/266919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/followith/comments/commentRss/266919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/followith/services/trackbacks/266919.html</trackback:ping><description><![CDATA[1、Log4j可以帮助调试(有时候debug是发挥不了作用的)和分析，要下载和了解更详细的内容可以访问官方网站：http://jakarta.apache.org/log4j<br />
2、log4j概念<br />
Log4j中有三个主要的组件，它们分别是Logger、Appender和Layout，Log4j允许开发人员定义多个Logger，每个Logger拥有自己的名字，Logger之间通过名字来表明隶属关系。有一个Logger称为Root，它永远存在，且不能通过名字检索或引用，可以通过Logger，getRootLogger（）方法获得，其他Logger通过Logger.getLogger(String name)方法<br />
Appender则是用来指明将所有log信息存放到什么地方，Log4j中支持多种appender，如console，files，GUI components、NT&nbsp; Event Loggers等，一个Logger可以拥有多个Appender，也就是你既可以将Log信息输出到屏幕，同时存储到一个文件中。<br />
Layout的作用是控制Log信息的输出方式，也就是格式化输出的信息<br />
Log4j中将要输出的Log信息定义了5中级别，依次为DEBUG、INFO、WARN、ERROR和FATAL，当输出时只有级别高过配置中规定的级别的信息才能真正的输出，这样就很方便的来配置不同情况下要输出的内容，而不需要更改代码，这点实在是方便。<br />
3、log4j的配置文件<br />
虽然可以不用配置文件，而在程序中实现配置，但这种方法在如今的系统开发中显然是不可取的，能采用配置文件的地方一定一定要采用配置文件。Log4j支持两种格式的配置文件：xml格式和java的property格式<br />
<br />
log4j.roorLogger=debug,stdout,R<br />
log4j.appender.stout=org.apache.log4j.ConsoleAppender<br />
log4j.appender.stout.layout=org.apache.log4j.PatternLayout<br />
<br />
#pattern to output the caller's file name and line number<br />
log4j.apender.stout.layout.ConversionPattern=%5p [%t] (%F:%L) -%m%n<br />
<br />
log4j.appender.R=org.apache.log4j.RollingFileAppender<br />
log4j.appender.R.file=example.log<br />
log4j.appender.R.MaxFileSize=100KB<br />
<br />
#keep one backup file<br />
log4j.appender.R.MaxBackupIndex=1<br />
<br />
log4j.appender.R.layout=org.apache.log4j.PatternLayout<br />
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n<br />
<br />
<br />
<font color="#614db3"><font color="#000000"><font size="2">首先，是设置root，格式为appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。</font>
<font size="2">配置日志信息输出目的地Appender，其语法为<br />
</font>
<font size="2">&nbsp; log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />
&nbsp; log4j.appender.appenderName.option1 = value1<br />
&nbsp; ...<br />
&nbsp; log4j.appender.appenderName.option = valueN</font>
<br />
<font size="2">Log4j提供的appender有以下几种：<br />
&nbsp; org.apache.log4j.ConsoleAppender（控制台）<br />
&nbsp; org.apache.log4j.FileAppender（文件）<br />
&nbsp; org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件）<br />
&nbsp; org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生新文件）<br />
&nbsp; org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br />
</font>
</font>
</font>
<font color="#614db3">
<font color="#000000">
<font size="2">配置日志信息的格式（布局），其语法为：<br />
</font>
<font size="2">&nbsp; log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br />
&nbsp; log4j.appender.appenderName.layout.option1 = value1<br />
&nbsp; ....<br />
&nbsp; log4j.appender.appenderName.layout.option = valueN</font>
<br />
<font size="2">Log4j提供的layout有以下几种：<br />
&nbsp; org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />
&nbsp; org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />
&nbsp; org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />
&nbsp; org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息） <br />
<br />
</font>
</font>
</font>
<font color="#000000">
<span style="font-size: 10.5pt;">
<font size="2">
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，打印参数如下： %m 输出代码中指定的消息
</font>
</span>
</font>
<p>
<font color="#000000">
<span style="font-size: 10.5pt;">
<span>
<font size="2">%p 输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL <br />
%r 输出自应用启动到输出该log信息耗费的毫秒数 <br />
%c 输出所属的类目，通常就是所在类的全名 <br />
%t 输出产生该日志事件的线程名 <br />
%n 输出一个回车换行符，Windows平台为&#8220;"r"n&#8221;，Unix平台为&#8220;"n&#8221; <br />
%d 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：</font>
</span>
</span>
<span style="font-size: 10.5pt;">
<font size="2">2002年10月18日</font>
</span>
<span style="font-size: 10.5pt;">
<font size="2"> 22：10：28，921 <br />
%l 输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java:10)</font>
</span>
</font>
</p>
<br />
<font color="#614db3">
<font color="#000000">
<font size="2">
<br />
<strong>4、Log4j在程序中的使用</strong>
</font>
</font>
</font>
<font color="#614db3">
<font color="#000000">
<br />
</font>
<font color="#a0a0a0">
<font size="2" color="#090909">&nbsp;
要在自己的程序中使用Log4j，首先需要将commons-logging.jar和logging-log4j-1.2.9.jar导入到构建路径
中。然后再将log4j.properties放到src根目录下。这样就可以在程序中使用log4j了。在类中使用log4j，</font>
</font>
</font>
<font color="#614db3">
<font color="#a0a0a0">
<font size="2" color="#090909">首先声明一个静态变量</font>
</font>
</font>
<font color="#614db3">
<font color="#a0a0a0">
<font size="2" color="#090909">Logger
logger=Logger.getLog("classname")；现在就可以使用了，用法如下：logger.debug("debug
message")或者logger.info("info message")，看下面一个小例子：</font>
</font>
</font>
<font color="#614db3">
<font color="#a0a0a0">
<br />
</font>
<br />
<font size="2">&nbsp; import com.foo.Bar;<br />
&nbsp; import org.apache.log4j.Logger;<br />
&nbsp;&nbsp;import org.apache.log4j.PropertyConfigurator;<br />
&nbsp;&nbsp;public class MyApp {<br />
&nbsp; &nbsp; static Logger logger = Logger.getLogger(MyApp.class.getName());<br />
&nbsp;&nbsp; &nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; &nbsp; // BasicConfigurator replaced with PropertyConfigurator.<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;PropertyConfigurator.configure(args[0]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.info("Entering application.");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bar bar = new Bar();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bar.doIt();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.info("Exiting application.");<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;}</font></font><br />
<img src ="http://www.blogjava.net/followith/aggbug/266919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/followith/" target="_blank">followith</a> 2009-04-22 10:43 <a href="http://www.blogjava.net/followith/archive/2009/04/22/266919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp中forward和redirect的区别</title><link>http://www.blogjava.net/followith/archive/2009/03/23/261443.html</link><dc:creator>followith</dc:creator><author>followith</author><pubDate>Mon, 23 Mar 2009 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/followith/archive/2009/03/23/261443.html</guid><wfw:comment>http://www.blogjava.net/followith/comments/261443.html</wfw:comment><comments>http://www.blogjava.net/followith/archive/2009/03/23/261443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/followith/comments/commentRss/261443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/followith/services/trackbacks/261443.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; （1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;共同点：
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;都实现了根据自己的条件实现的页面的跳转。</p>
<p style="text-indent: 2em;">（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;区别 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<table border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td valign="top" width="72">
            <p style="text-indent: 2em;">类别</p>
            </td>
            <td valign="top" width="144">
            <p style="text-indent: 2em;">概念</p>
            </td>
            <td valign="top" width="144">
            <p style="text-indent: 2em;">共享数据</p>
            </td>
            <td valign="top" width="153">
            <p style="text-indent: 2em;">应用</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="72">
            <p style="text-indent: 2em;">Redirect</p>
            </td>
            <td valign="top" width="144">
            <p style="text-indent: 2em;">URL重新定向：可以是任意的URL</p>
            </td>
            <td valign="top" width="144">
            <p style="text-indent: 2em;">不能共享request里面的数据</p>
            </td>
            <td valign="top" width="153">
            <p style="text-indent: 2em;">一般用于用户注销登录时返回主页面和跳转到其它的网站等等</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="72">
            <p style="text-indent: 2em;">Forward</p>
            </td>
            <td valign="top" width="144">
            <p style="text-indent: 2em;">页面的转发：只能是同一个Web应用程序的其他Web组件</p>
            </td>
            <td valign="top" width="144">
            <p style="text-indent: 2em;">转发页面和转发到的页面可以共性request里面的数据</p>
            </td>
            <td valign="top" width="153">
            <p style="text-indent: 2em;">一般用于用户登录的时候根据角色转发到相应的模块等等</p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-indent: 2em;">（3） 例子：</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;譬如：client
通过XXX"index.jsp?name=gauss&amp;pwd=123访问index.jsp,而index.jsp中有&lt;
jsp:forward
page="login.jsp"/&gt;,则在login.jsp中可以通过request.getParameter()得到name和pwd，
而&lt;%response.sendRedirect("login.jsp");%&gt;得不到。</p>
<p style="text-indent: 2em;">（4） 注意</p>
<p style="text-indent: 2em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一般在index.jsp页面之前有个提交数据的页面
default.jsp，则defautl.jsp页面提交的数据就可以在login.jsp页面得到，而不是得到index.jsp页面提交的数据，index.jsp页面只是执行的一个转发操作当然在里面可以增加写业务操作，它可以得到request的数据，用
XXX"index.jsp?name=gauss&amp;pwd=123这种方式登录就是省略了index.jsp前面的一个页面提交数据而已</p>
<img src ="http://www.blogjava.net/followith/aggbug/261443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/followith/" target="_blank">followith</a> 2009-03-23 10:00 <a href="http://www.blogjava.net/followith/archive/2009/03/23/261443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache+Tomcat负载平衡设置（workers）详解</title><link>http://www.blogjava.net/followith/archive/2009/02/26/256861.html</link><dc:creator>followith</dc:creator><author>followith</author><pubDate>Thu, 26 Feb 2009 09:52:00 GMT</pubDate><guid>http://www.blogjava.net/followith/archive/2009/02/26/256861.html</guid><wfw:comment>http://www.blogjava.net/followith/comments/256861.html</wfw:comment><comments>http://www.blogjava.net/followith/archive/2009/02/26/256861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/followith/comments/commentRss/256861.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/followith/services/trackbacks/256861.html</trackback:ping><description><![CDATA[一、简介： <br />
<br />
<clk>每个 Tomcat worker是一个<nobr oncontextmenu="return false" onmousemove="kwM(0)" id="clickeyekey0" onmouseover="kwE(event,0, this)" style="border-bottom: 1px dotted #6600ff; color: #6600ff; background-color: transparent; text-decoration: underline;" onclick='kwC(event,0,"")' onmouseout="kwL(event,this)">服务</nobr>于web
server、等待执行servlet的Tomcat实例。例如我们经常使用像Apache之类的web
server转发sevlet请求给位于其后面的一个Tomcat进程（也就是前面所说的worker）。本文详细介绍了如何配置各种类型worker和
loadbalance，并说明了各种类型worker的特性和loadbalance配置的原理。 </clk><br />
<br />
二、为什么使用Tomcat
workers： <br />
<br />
上文描述了一个非常简单的结构，事实上能够配置多个Tomcat workers来处理web
server转发的servlet请求。而这样配置的理由不外乎以下几种假想环境： <br />
<br />
* 我们在开发环境中发布不同的Tomcat
workers为各自不同的应用服务。当然在开发环境中的开发者共享同一个web server，但是每个Tomcat worke服务于拥有它的开发者。
<br />
<br />
* 我们在不同的Tomcat进程上定义各自的虚拟主机，这样不同的公司可以使用各自的web site，从而使他们的web
site得到了合理的分割。 <br />
<br />
* 我们提供负载平衡的web site，也就意味着同时使用多个Tomcat workers，而每个Tomcat
worker具有独立的主机并且在workers之间要分配通过web server转发来的请求。
<br />
<br />
当然，这些假想情况也许并不能涵盖使用多个workers的所有状况。 <br />
<br />
三、workers.properties配置说明：
<br />
<br />
定义Tomcat
workers的方法是在apache的conf目录下编写一个名为&#8220;workers.properties&#8221;的属性文件。本文将详细解释如何进行配置的：
<br />
<br />
1.定义Workers列表：
<br />
<br />
定义workers的方法就是在apache的conf目录下编写一个workers.properties文件，使其作为apache的插件来发挥作用。
<br />
<br />
定义workers列表的格式： <br />
<br />
worker.list =&lt;使用&#8220;,&#8221;分割的worker 名字列表&gt;
<br />
<br />
<br />
<br />
例如： <br />
<br />
worker.list= worker1, worker2
<br />
<br />
当apache启动时，workers.properties作为插件将初始化出现在worker.list列表中的workers。
<br />
<br />
2.定义Workers的类型：
<br />
<br />
每个被命名的worker都应有一些关于其自身的附加信息。这些信息包括了worker的类型和其它相关信息。这里讨论的是JK1.2.5中定义的workers类型。
<br />
<br />
定义worker类型的格式： <br />
<br />
worker . worker名字. type =
<br />
<br />
worker名字的命名最好遵循java的命名规范。 <br />
<br />
worker类型取值于下面的表格：
<br />
<br />
定义一个名为&#8220;local&#8221;的worker，其使用ajpv12协议与Tomcat 进程通讯：
<br />
<br />
worker.local.type=ajp12 <br />
<br />
定义一个名为&#8220;remote&#8221;的worker，其使用ajpv13协议与Tomcat
进程通讯： <br />
<br />
worker.remote.type=ajp13
<br />
<br />
定义一个名为&#8220;fast&#8221;的worker，其使用JNI的方式与Tomcat 进程通讯： <br />
<br />
worker.fast.type=jni
<br />
<br />
定义一个名为&#8220;loadbalancer&#8221;的worker，其作为对多个Tomcat 进程的负载平衡使用：
<br />
<br />
worker.loadbalancer.type=lb <br />
<br />
各个类型具有不同的行为，我们在下文中会详细解释。
<br />
<br />
3.设置Worker属性： <br />
<br />
在定义worker之后，还需要提供各个worker的属性，这些属性的定义使用下面的方式：
<br />
<br />
worker.&lt;worker名字&gt;.&lt;属性&gt;=&lt;属性值&gt; <br />
<br />
<br />
3-1
ajp12类型的Worker属性： <br />
<br />
ajp12类型的worker工作时使用基于TCP/IP
socket的ajpv12协议转发请求给&#8220;进程外&#8221;Tomcat worker。 <br />
<br />
ajp12 worker属性如下： <br />
<br />
host：
<br />
<br />
侦听ajp12请求的Tomcat worker主机。 <br />
<br />
port： <br />
<br />
Tomcat worker主机的侦听端口。
<br />
<br />
lbfactor： <br />
<br />
当此Tomcat
worker被用于一个负载平衡worker使用时，此属性将被使用。它定义了此worker的负载平衡权值。
<br />
<br />
例如：下面的&#8220;worker1&#8221;定义了一个位于www.x.com主机上的Tomcat，它使用8007端口侦听apache发来的请求，并具有2.5的负载权值
<br />
<br />
worker.worker1.host=www.x.comworker.worker1.port=8007worker.worker1.lbfactor=2.5
<br />
<br />
注意：在ajpv12协议中，针对每个请求都要一个连接建立、使用、关闭。其默认侦听端口为8007。 <br />
<br />
3-2
ajp13类型的Worker属性： <br />
<br />
ajp13类型的worker工作时使用基于TCP/IP
socket的ajpv13协议转发请求给&#8220;进程外&#8221;Tomcat worker。 <br />
<br />
ajpv13协议与ajpv12协议的主要不同：
<br />
<br />
* ajpv13具有更丰富的二进制协议，它使用将频繁使用的字符串编码为小整数的方式对请求数据进行压缩。 <br />
<br />
*
ajpv13重用打开的socket并保留这些打开的socket以处理将来的请求。这在apache与Tomcat之间具有防火墙的网络环境下是必要的。
<br />
<br />
* ajpv13具有对SSL信息的处理能力，以致容器能够实现SSL的相关方法（如isSecure()）。
<br />
<br />
注意：ajp13当前只能用于支持&#8220;进程外&#8221;协议的Tomcat 4.0.x, 4.1.x and 5。
<br />
<br />
下表描述了ajp13worker接受的属性： <br />
<br />
host： <br />
<br />
侦听ajp13请求的Tomcat worker主机。
<br />
<br />
port： <br />
<br />
Tomcat worker主机的侦听端口。 <br />
<br />
lbfactor： <br />
<br />
当此Tomcat
worker被用于一个负载平衡worker使用时，此属性将被使用。它定义了此worker的负载平衡权值。 <br />
<br />
cachesize：
<br />
<br />
当在多线程的web server（例如apache2.0、IIS 、Netsc<clk>ape）中使用JK时，此属性是<nobr oncontextmenu="return false" onmousemove="kwM(1)" id="clickeyekey1" onmouseover="kwE(event,1, this)" style="border-bottom: 1px dotted #6600ff; color: #6600ff; background-color: transparent; text-decoration: underline;" onclick='kwC(event,1,"")' onmouseout="kwL(event,this)">有效</nobr>的。如果将cachesize的值设置为较高的值，这些支持多线程的web
server将获得很好的处理能力。如果此属性不被设置，则连接cache特性将失效。 </clk><br />
<br />
cache_timeout：
<br />
<br />
本属性用于声明JK在cache中保留一个打开的socket的时间，它对减少web serer的线程数有所帮助。
<br />
<br />
使用cache_timeout的原因： <br />
<br />
众所周知，一个身背重负的web
server（例如apache）建立childs/threads来处理负载，而当负载减少时它将销毁无用的childs/threads。每个
child在转发请求给Tomcat时要打开一个ajp13连接，而在Tomcat那一端也将建立一个ajp13线程与之通讯。
<br />
<br />
但是问题出现在一个ajp13连接建立完成后，child没有及时的释放那个ajp13连接，由于web
server1将保持它的childs/threads运行已处理高负载，即使childs/threads处理快速的静态内容，在Tomcat端也将积累很多的无用ajp13线程。
<br />
<br />
socket_keepalive： <br />
<br />
当防火墙位于web
server与Tomcat之间时，防火墙将尝试断开未激活的网络连接。此属性将告诉操作系统在未激活的连接中发送KEEP_ALIVE信息(发送间隔时间依赖于操作系统的设置，一般为120秒)，这样将防止防火墙切断未激活的网络连接。
<br />
<br />
但此设置并不是万能钥匙，它对于某些防火墙也无能为力。 <br />
<br />
socket_timeout： <br />
<br />
<clk>此属性<nobr oncontextmenu="return false" onmousemove="kwM(0)" id="clickeyekey0" onmouseover="kwE(event,0, this)" style="border-bottom: 1px dotted #6600ff; color: #6600ff; background-color: transparent; text-decoration: underline;" onclick='kwC(event,0,"")' onmouseout="kwL(event,this)">说明</nobr>连接在未激活的状况下持续多久，web
server将主动切断之。这是一个使Tomcat端的陈旧线程不致过多的好方法，但是也带来了在下一次请求到来时需要重新打开socket的开销。此属性与cache_timeout有类似的功效，但是它工作在non-cache模式。
</clk><br />
<br />
connect_timeout： <br />
<br />
web server在连接建立后将一个PING请求发送到ajp13协议的连接上。
此属性说明了web server等待PONG回应的时间（以ms为单位）。此属性在jk 1.2.6版本被增加进来，以求避免Tomcat的死机，Tomcat
3.3.2+, 4.1.28+ and 5.0.13+实现了对使用ajp13的 ping/pong的支持。此属性默认为失效的。
<br />
<br />
prepost_timeout： <br />
<br />
web
server在转发一个请求后将一个PING请求发送到ajp13协议的连接上。此属性说明了web server等待PONG回应的时间（以ms为单位）。此属性在jk
1.2.6版本被增加进来，以求避免Tomcat的死机，Tomcat 3.3.2+, 4.1.28+ and 5.0.13+实现了对使用ajp13的
ping/pong的支持。此属性默认为失效的。 <br />
<br />
reply_timeout： <br />
<br />
此属性告诉web
server在接到远端的Tomcat已死并实时的切换到集群中的另外一个Tomcat的回应之前等待一段时间。默认情况下web
server将永远等待。属性值为web server要等待回应的时间（以ms为单位），所以如果具有运行时间较长的servlet时设置其值要小心。此属性在jk
1.2.6版本被增加进来，以求避免Tomcat的死机和在支持ajp13的servlet引擎上发生的问题。此属性默认为失效的。
<br />
<br />
recovery_options： <br />
<br />
此属性说明了web
server在检测到Tomcat失败后如何进行恢复工作。默认情况下，web
server将转发请求给处于负载平衡模式中的另一个Tomcat。属性值为0，说明全部恢复；属性值为1，说明如果在Tomcat接到请求后出现失败状况，则不进行恢复；属性值为2，说明如果在Tomcat发送http头给客户端后出现失败状况，则不进行恢复；属性值为3，说明如果在Tomcat接到请求后出现失败状况或者在Tomcat发送http头给客户端后出现失败状况，则不进行恢复。
<br />
<br />
此属性在jk 1.2.6版本被增加进来，以求避免Tomcat的死机和在支持ajp13的servlet引擎上发生的问题。此属性默认为全部恢复。
<br />
<br />
例如：一个名为&#8220;worker2&#8221;的worker的配置：
<br />
<br />
<br />
worker.worker2.host=www2.x.comworker.worker2.port=8009worker.worker2.lbfactor=3.5worker.worker2.cachesize=10worker.worker2.cache_timeout=600worker.worker2.socket_keepalive=1worker
"worker2" want ajp13connection to be dropped after 5mn
(timeout)worker.worker2.socket_timeout=300 <br />
&nbsp;
<br />
<br />
<br />
<br />
说明：上例中的worker要求操作系统在连接上发送KEEP-ALIVE信号。
<br />
<br />
注意：在ajpv13协议中默认端口为8009。 <br />
<br />
4.设置lb Worker属性：
<br />
<br />
<clk>负载平衡类型的worker并不与Tomcat worker通讯，它负责<nobr oncontextmenu="return false" onmousemove="kwM(2)" id="clickeyekey2" onmouseover="kwE(event,2, this)" style="border-bottom: 1px dotted #6600ff; color: #6600ff; background-color: transparent; text-decoration: underline;" onclick='kwC(event,2,"")' onmouseout="kwL(event,this)">管理</nobr>这些Tomcat worker。
</clk><br />
<br />
其管理范围如下： <br />
<br />
* 初始化在web server的worker列表中定义的worker。 <br />
<br />
*
使用worker的负载平衡权值，执行基于权值的负载平衡，将数量多的请求发送到负载平衡权值高（在web server看来就是更加健壮的）的worker。
<br />
<br />
* 维护在同一个Tomcat worker上的同一个session的请求，使其发送到同一个Tomcat worker上。以达到Tomcat
worker上的session一致性、持续性。 <br />
<br />
* 标识已经失败的Tomcat workers，悬空发向它们的请求，在被lb
worker管理的其它workers上寻找可以失败恢复的worker。 <br />
<br />
被同一个lb
worker管理多个worker之间的负载平衡的（基于它们的lbfactor和当前用户session），也可以尽量避免由于单一的Tomcat进程死掉而造成这个网站被&#8220;杀&#8221;的不良反应。
<br />
<br />
下表说明了lb worker接受的属性： <br />
<br />
* balanced_workers：一个由&#8220;，&#8221;分割的worker列表，用来声明lb
worker需要被管理的workers。这些workers不应出现在worker.list属性中。 <br />
<br />
*
sticky_session：表述是否将对SESSION ID的请求路由回到相同的Tomcat
worker。如果属性值不为0，它将被设置为JK_TRUE，session将是粘性的，即SESSION ID的请求路由回到相同的Tomcat
worker；当Tomcat正使用能够跨越多个Tomcat实例持久化session数据的Session
Manager时，它将被设置为JK_FALSE。属性默认值为JK_TRUE。 <br />
<br />
例如：worker
balance1管理着两个workers：worker1、worker2：
<br />
<br />
worker.balance1.balanced_workers=worker1, worker2 <br />
<br />
5.高级lb
Worker属性： <br />
<br />
JK
1.2.x版本通过增加两个新的属性：local_worker_only 和 local_worker 为lb worker增添了新的负载平衡和容错支持。
<br />
<br />
下面让我们举一个实际的环境作为example： <br />
<br />
一个集群具有两个节点(worker1+worker2)，一个web
server与tomcat workers一前一后，一个负载平衡器（lb Worker）位于节点的前面、web server的后面。 <br />
<br />
配置如下：
<br />
<br />
<br />
<br />
worker.list=router# Define a 'local_worker' worker using
ajp13worker.worker1.port=8009worker.worker1.host=node1.domain.orgworker.worker1.type=ajp13worker.worker1.lbfactor=1worker.worker1.local_worker=1#Define
another 'local_worker' worker using
ajp13worker.worker2.port=8009worker.worker2.host=node2.domain.orgworker.worker2.type=ajp13worker.worker2.lbfactor=1worker.worker2.local_worker=0#
Define the LB
workerworker.router.type=lbworker.router.balanced_workers=worker1,worker2worker.router.local_worker_only=1
<br />
&nbsp; <br />
<br />
<br />
<br />
在worker1和worker2上的local_worker标志告诉lb_worker哪个连接属于本地worker。
<br />
<br />
如果local_worker值为非0，则它将被设置为JK_TRUE，用来标记&#8220;local
worker&#8221;，而JK_FALSE的情况则相反。如果至少一个worker被标记为local worker，则lb_worker将工作于local
worker模式。这种模式下，所有的local workers将被移到在lb_worker中的内部worker列表的头部。
<br />
<br />
这意味着一个带有session
id的请求到达lb_worker时，相应的worker（根据权值排序，权值最大的那个worker）将被确定作为此请求的接受/处理者。如果这个
worker死掉/当机，请求将被发送到处于非错误状态的第一个local worker；如果一个没有session
id的请求到达lb_worker时，此请求将被路由到第一个local worker。 <br />
<br />
如果所有的local
worker均处于错误状态，则这时&#8220;local_worker_only&#8221;标志显得尤其重要。如果local_worker_only的属性值为非0，则它被设置为
JK_TRUE，否则被设置为 JK_FALSE。 <br />
<br />
<clk>当它被设置为 JK_TRUE时，这个没有session
id的请求将得到一个错误作为回应，否则lb_worker将尝试将请求路由到其它的被<nobr oncontextmenu="return false" onmousemove="kwM(0)" id="clickeyekey0" onmouseover="kwE(event,0, this)" style="border-bottom: 1px dotted #6600ff; color: #6600ff; background-color: transparent; text-decoration: underline;" onclick='kwC(event,0,"")' onmouseout="kwL(event,this)">管理</nobr>的worker上。如果其中的一个worker处于错误状态，并且恢复会话的工作并没有任何改变，local
worker将查找这个没有session id的请求（因为在local
worker中保存有这个请求的session），而其它的worker只能查找带有session id的请求。
</clk><br />
<br />
注意：local_worker默认值是0，local_worker_only默认值也是0。
<br />
<br />
<br />
<br />
<br />
例如：设置&#8220;wrkjni&#8221;的JVM shared lib (IBM SDK on Linux)。
<br />
<br />
worker.wrkjni.jvm_lib=/opt/IBMJava2-131/jre/bin/classic/libjvm.so
<br />
<br />
例如：设置&#8220;wrkjni&#8221;的JVM shared lib (Sun SDK on Windows)。
<br />
<br />
worker.wrkjni.jvm_lib=c:"JDK"1.3.1"jre"bin"classic
<br />
<br />
worker.worker名.stdout：设置JVM写它的System.out的完整路径位置。
<br />
<br />
例如：将&#8220;wrkjni&#8221;的JVM系统输出路径设置为/var/log/http/jk-jvm-out.log。
<br />
<br />
worker.wrkjni.stdout=/var/log/http/jk-jvm-out.log
<br />
<br />
worker.worker名.stderr：设置JVM写它的System.err的完整路径位置。
<br />
<br />
例如：将&#8220;wrkjni&#8221;的JVM系统错误输出路径设置为/var/log/http/jk-jvm-err.log
<br />
<br />
worker.wrkjni.stderr=/var/log/http/jk-jvm-out.log
<br />
<br />
worker.worker名.ms：设置JVM的初始堆大小。 <br />
<br />
例如：设置&#8220;wrkjni&#8221;的JVM的初始堆为64M。
<br />
<br />
worker.wrkjni.ms=64 <br />
<br />
worker.worker名.mx：设置JVM的最大的堆大小。
<br />
<br />
例如：设置&#8220;wrkjni&#8221;的JVM堆最大为128M <br />
<br />
worker.wrkjni.mx=128
<br />
<br />
worker.worker名.sysprops：设置JVM的系统属性。 <br />
<br />
例如：设置&#8220;wrkjni&#8221;的JVM使用法语。
<br />
<br />
worker.wrkjni.sysprops=-Duser.region=FR
<br />
<br />
worker.worker名.ld_path：设置附加的动态链接库路径(类似于LD_LIBRARY_PATH)
<br />
<br />
例如：添加一些动态链接库路径到&#8220;wrkjni&#8221;的java环境中。
<br />
<br />
worker.wrkjni.ld_path=/opt/IBMJava2-131/jre/bin/worker.wrkjni.ld_path=/opt/IBMJava2-131/jre/bin/classic
<br />
<br />
注意：在Linux下，上面的ld_path并不能更新LD_LIBRARY_PATH，所以需要在执行web
server之前手动更新LD_LIBRARY_PATH,。 <br />
<br />
8.属性文件宏：
<br />
<br />
我们可以在属性文件中定义&#8220;宏&#8221;。这些宏让我们定义属性，并在以后使用它们来构建其它的属性文件。当我们修改Java Home、Tomcat
Home、系统路径分隔符时这是很有用的。 <br />
<br />
例如：定义了属性workers.tomcat_home、workers.java_home。
<br />
<br />
workers.tomcat_home=d:"tomcatworkers.java_home=d:"sdk"jdk1.2.2
<br />
<br />
在定义worker.inprocess.class_path时就可以使用前面定义的workers.tomcat_home。
<br />
<br />
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)classes
<br />
<br />
9.一个简单而完整的worker.properties： <br />
件中定义了比较完整的结构，可以做为参考模版： <br />
<br />
*
一个位于localhost的使用8007端口的ajp12 worker； <br />
<br />
* 一个位于localhost的使用8008端口的ajp13
worker； <br />
<br />
* 一个jni worker； <br />
<br />
* 一个lb worker：负责ajp12 worker、ajp13
workers的负载平衡。 <br />
<br />
文件内容如下： <br />
<br />
<br />
# Define some
propertiesworkers.apache_log=/var/log/httpd/workers.tomcat_home=/var/tomcat3workers.java_home=/opt/IBMJava2-131/ps=/#
Define 4 workers, 3 real workers using ajp12, ajp13, jni, the last one being a
loadbalancing workerworker.list=worker1,worker2, worker3, worker4# Set
properties for worker1
(ajp12)worker.worker1.type=ajp12worker.worker1.host=locahostworker.worker1.port=8007worker.worker1.lbfactor=5#
Set properties for worker2
(ajp13)worker.worker2.type=ajp13worker.worker2.host=locahostworker.worker2.port=8009worker.worker2.lbfactor=50worker.worker2.cachesize=10worker.worker2.cache_timeout=600worker.worker2.socket_keepalive=1worker.worker2.socket_timeout=300#
Set properties for worker3 (jni)worker.worker3.type=jni# Set worker3 bridge
type, here Tomcat 3.3worker.worker3.bridge=tomcat33# Set worker3
classpathworker.worker3.class_path=$(workers.tomcat_home)$(ps)classesworker.worker3.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar#
Setworker3 tomcat command
lineworker.worker3.cmd_line=-homeworker.worker3.cmd_line=$(workers.tomcat_home)#
Set worker3 Tomcat/JVM
settingsworker.worker3.jvm_lib=$(workers.java_home)$(ps)jre$(ps)bin$(ps)classic$(ps)libjvm.soworker.worker3.stdout=$(workers.apache_log)$(ps)inprocess.stdoutworker.worker3.stderr=$(workers.apache_log)$(ps)inprocess.stderrworker.worker3.sysprops=tomcat.home=$(workers.tomcat_home)#
Set properties for worker4 (lb) which use worker1 and
worker2worker.worker4.balanced_workers=worker1,worker2 <br />
<br />
<img src ="http://www.blogjava.net/followith/aggbug/256861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/followith/" target="_blank">followith</a> 2009-02-26 17:52 <a href="http://www.blogjava.net/followith/archive/2009/02/26/256861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>上传任意多个文件</title><link>http://www.blogjava.net/followith/archive/2009/02/13/254529.html</link><dc:creator>followith</dc:creator><author>followith</author><pubDate>Fri, 13 Feb 2009 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/followith/archive/2009/02/13/254529.html</guid><wfw:comment>http://www.blogjava.net/followith/comments/254529.html</wfw:comment><comments>http://www.blogjava.net/followith/archive/2009/02/13/254529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/followith/comments/commentRss/254529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/followith/services/trackbacks/254529.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;从《Struts1.x系列教程（8）：上传单个文件》中给出的例子可以看出，在Struts1.x中上传单个文件是非常简单的，但在实际应用中，上传文件的个数一般是不确定的，如在网络硬盘中，用户可以根据自己的需要上传任意多个文件（当然，网络硬盘一次上传文件的数目一般也是有上限的，如50个，但用户可以只上传了3个文件，因此，在这种情况下，上传文件的个数也是不确定的）。如果读者用过&#8220;...&nbsp;&nbsp;<a href='http://www.blogjava.net/followith/archive/2009/02/13/254529.html'>阅读全文</a><img src ="http://www.blogjava.net/followith/aggbug/254529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/followith/" target="_blank">followith</a> 2009-02-13 11:53 <a href="http://www.blogjava.net/followith/archive/2009/02/13/254529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cookie的用法</title><link>http://www.blogjava.net/followith/archive/2008/12/08/245055.html</link><dc:creator>followith</dc:creator><author>followith</author><pubDate>Mon, 08 Dec 2008 08:37:00 GMT</pubDate><guid>http://www.blogjava.net/followith/archive/2008/12/08/245055.html</guid><wfw:comment>http://www.blogjava.net/followith/comments/245055.html</wfw:comment><comments>http://www.blogjava.net/followith/archive/2008/12/08/245055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/followith/comments/commentRss/245055.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/followith/services/trackbacks/245055.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.http.Cookie;<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">实例化一个Cookie</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">Cookie&nbsp;cookie&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Cookie(key,value)<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">设置cookie的生命周期</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">cookie.setMaxAge(</span><span style="color: #000000;">60</span><span style="color: #000000;">*</span><span style="color: #000000;">60</span><span style="color: #000000;">*</span><span style="color: #000000;">24</span><span style="color: #000000;">*</span><span style="color: #000000;">365</span><span style="color: #000000;">)&nbsp;<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">以秒为单位<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">为避免字符乱码，先设置一下response的编码方式，默认是GBK的</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">response.setCharacterEncoding(</span><span style="color: #000000;">"</span><span style="color: #000000;">utf-8</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">response.addCookie(cookie)<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">读取cookie</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">Cookie[]&nbsp;cookie&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;request.getCookies()<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #0000ff;">for</span><span style="color: #000000;">(</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;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">cookie.length();&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;Cookie&nbsp;c&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cookie[i]<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(c.getName().equals(</span><span style="color: #000000;">"</span><span style="color: #000000;">cookie</span><span style="color: #000000;">"</span><span style="color: #000000;">)){&nbsp;<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">这里的cookie是你实例化cookie的名称</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;c.getValue()<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">}<br />
如果还存在字符编码的问题，可以将value值在实例化之前在encode一下，然后读出的时候在decode<br />
使用到的方法 java.net.URLEncoder.encode(str,"utf-8")以及 java.net.URLDecoder.decode(str,"UTF-8")<br />
</span></div>
<img src ="http://www.blogjava.net/followith/aggbug/245055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/followith/" target="_blank">followith</a> 2008-12-08 16:37 <a href="http://www.blogjava.net/followith/archive/2008/12/08/245055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ant cxf webservice</title><link>http://www.blogjava.net/followith/archive/2008/10/29/237397.html</link><dc:creator>followith</dc:creator><author>followith</author><pubDate>Wed, 29 Oct 2008 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/followith/archive/2008/10/29/237397.html</guid><wfw:comment>http://www.blogjava.net/followith/comments/237397.html</wfw:comment><comments>http://www.blogjava.net/followith/archive/2008/10/29/237397.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/followith/comments/commentRss/237397.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/followith/services/trackbacks/237397.html</trackback:ping><description><![CDATA[&lt;?xml version="1.0"?&gt;<br />
&lt;project name="cxf wsdl2java" basedir="."&gt;<br />
&nbsp;&nbsp; &lt;property name="cxf.home" location ="E:"opensource"cxf"/&gt;<br />
<br />
&nbsp;&nbsp; &lt;path id="cxf.classpath"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fileset dir="${cxf.home}/lib"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;include name="*.jar"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/fileset&gt;<br />
&nbsp;&nbsp; &lt;/path&gt;<br />
<br />
&nbsp;&nbsp; &lt;target name="cxfWSDLToJava"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;java classname="org.apache.cxf.tools.wsdlto.WSDLToJava" fork="true"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arg value="-client"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arg value="-d"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arg value="src"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arg value="http://www.webservicex.net/globalweather.asmx?wsdl"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;classpath&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;path refid="cxf.classpath"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/classpath&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/java&gt;<br />
&nbsp;&nbsp; &lt;/target&gt;<br />
&lt;/project&gt;<br />
<br />
ant ${target}<br />
<img src ="http://www.blogjava.net/followith/aggbug/237397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/followith/" target="_blank">followith</a> 2008-10-29 16:16 <a href="http://www.blogjava.net/followith/archive/2008/10/29/237397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java解压zip文件</title><link>http://www.blogjava.net/followith/archive/2008/10/21/235731.html</link><dc:creator>followith</dc:creator><author>followith</author><pubDate>Tue, 21 Oct 2008 09:40:00 GMT</pubDate><guid>http://www.blogjava.net/followith/archive/2008/10/21/235731.html</guid><wfw:comment>http://www.blogjava.net/followith/comments/235731.html</wfw:comment><comments>http://www.blogjava.net/followith/archive/2008/10/21/235731.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/followith/comments/commentRss/235731.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/followith/services/trackbacks/235731.html</trackback:ping><description><![CDATA[try {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; File outFile = new File(outputDirectory);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (!outFile.exists()) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;outFile.mkdirs();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; org.apache.tools.zip.ZipFile zipFile = new org.apache.tools.zip.ZipFile(uploadFileName);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; java.util.Enumeration e = zipFile.getEntries();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; org.apache.tools.zip.ZipEntry zipEntry = null;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; while (e.hasMoreElements()){<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; zipEntry = (org.apache.tools.zip.ZipEntry)e.nextElement();<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; def zipEntryName = zipEntry.getName()<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; if (zipEntry.isDirectory()) {<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; // mkdir directory<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;def dirName = zipEntryName.substring(0, zipEntryName.length() - 1);<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;File f = new File(outFile.getPath() + File.separator + dirName);<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;f.mkdirs();<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; }<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; if (! zipEntry.isDirectory()){<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;//mkdir entryDirectory<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; if( -1 != zipEntry.getName().indexOf("/")){<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; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;def fileDirName = zipEntryName.substring(0,zipEntryName.lastIndexOf("/"))<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; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//println(fileDirName)<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; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;File fDir = new File(outFile.getPath() + File.separator + fileDirName)<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; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//println(fDir.mkdirs())<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; &nbsp;&nbsp;&nbsp; &nbsp;}<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;File f = new File(outputDirectory + File.separator + zipEntry.getName());<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;if(!f.exists()){<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;f.createNewFile()<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; &nbsp;&nbsp;&nbsp; &nbsp;}<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;InputStream fin = zipFile.getInputStream(zipEntry);<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;FileOutputStream out = new FileOutputStream(f);<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;int c;<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;byte[] b = new byte[1024];<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;while((c=fin.read(b)) != -1){<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;out.write(b,0,c);<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;}<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;out.close();<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;fin.close();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;zipFile.close();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}catch (Exception ex){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ex.printStackTrace();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;new File(uploadFileName).delete()<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/followith/aggbug/235731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/followith/" target="_blank">followith</a> 2008-10-21 17:40 <a href="http://www.blogjava.net/followith/archive/2008/10/21/235731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js、jQuery增加select的&lt;option&gt;</title><link>http://www.blogjava.net/followith/archive/2008/10/08/233187.html</link><dc:creator>followith</dc:creator><author>followith</author><pubDate>Wed, 08 Oct 2008 09:43:00 GMT</pubDate><guid>http://www.blogjava.net/followith/archive/2008/10/08/233187.html</guid><wfw:comment>http://www.blogjava.net/followith/comments/233187.html</wfw:comment><comments>http://www.blogjava.net/followith/archive/2008/10/08/233187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/followith/comments/commentRss/233187.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/followith/services/trackbacks/233187.html</trackback:ping><description><![CDATA[&nbsp;(1)var option = new Option(item.name,item.businessCode)<br />
&nbsp;&nbsp;&nbsp; $("#serviceCode")[0].options.add(option)//注意[0]的用法<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;(2)$("&lt;option&gt;").attr("value",item.businessCode).text(item.name).appendTo("#serviceCode");
<img src ="http://www.blogjava.net/followith/aggbug/233187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/followith/" target="_blank">followith</a> 2008-10-08 17:43 <a href="http://www.blogjava.net/followith/archive/2008/10/08/233187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>