<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>hf200012</title>
    <description></description>
    <link>http://hf200012.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>自己开发一个google talk的聊天小工具</title>
        <author>hf200012</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hf200012.javaeye.com">hf200012</a>&nbsp;
          链接：<a href="http://hf200012.javaeye.com/blog/224917" style="color:red;">http://hf200012.javaeye.com/blog/224917</a>&nbsp;
          发表时间: 2008年08月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我们可以基于google talk开发一个属于自己的聊天客户端</p>
<p>代码如下：</p>
<pre name="code" class="java">public class GoogleTalk {

	/**
	 * @param args
	 * @throws XMPPException 
	 */
	public static void main(String[] args) throws XMPPException {
		XMPPConnection.DEBUG_ENABLED = true;
		XMPPConnection connection = new XMPPConnection(&quot;gmail.com&quot;);
		connection.connect();
		connection.login(&quot;用户名&quot;, &quot;密码&quot;);

		Chat chat = connection.getChatManager().createChat(
				&quot;你要进行聊天的用户的ID&quot;, new MessageListener() {
					public void processMessage(Chat chat, Message message) {
						System.out.println(message.getFrom() + &quot; &quot;
								+ &quot;说:&quot;
								+ message.getBody());
					}

				});
		BufferedReader cmdIn = new BufferedReader(new InputStreamReader(System.in));
		for (;;) {
			try {
				String cmd = cmdIn.readLine();
				if (&quot;!q&quot;.equalsIgnoreCase(cmd)) {
					break;
				}
				chat.sendMessage(cmd);
			} catch (Exception ex) {
			}
		}
		connection.disconnect();
		System.exit(0);

	}
}</pre>
<p>&nbsp;将代码中的中文说明部分替换成你自己的信息就可以</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://hf200012.javaeye.com/blog/224917#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 06 Aug 2008 11:03:04 +0800</pubDate>
        <link>http://hf200012.javaeye.com/blog/224917</link>
        <guid>http://hf200012.javaeye.com/blog/224917</guid>
      </item>
      <item>
        <title>基于开源软件做一个获取google talk你的联系人给你发送消息的小程序</title>
        <author>hf200012</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hf200012.javaeye.com">hf200012</a>&nbsp;
          链接：<a href="http://hf200012.javaeye.com/blog/224913" style="color:red;">http://hf200012.javaeye.com/blog/224913</a>&nbsp;
          发表时间: 2008年08月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我在哪吒闹海的网站上看到他们使用google talk来实现发送信息留言的功能，就想自己做一个看看，事实上就是完成一个对你的google上的所有用户发过来的消息实现监控就可以。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先我们要下载
igniterealtime 提供的开源 Smack Java XMPP 软件包，下载地址是：
<a href="http://www.igniterealtime.org/downloads/index.jsp#smack" title="http://www.igniterealtime.org/downloads/index.jsp#smack">http://www.igniterealtime.org/downloads/index.jsp#smack</a>
 ，然后点击下载 <a href="http://www.igniterealtime.org/downloads/download-landing.jsp?file=smack/smack_3_0_4.zip">smack_3_0_4.zip</a>
</p>
<p>&nbsp;</p>
<p>具体的程序如下：</p>
<pre name="code" class="java">import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.MessageListener;

import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;

import org.jivesoftware.smack.packet.Message;


public class GoogleTalk {

	/**
	 * @param args
	 * @throws XMPPException 
	 */
	public static void main(String[] args) throws XMPPException {
		XMPPConnection.DEBUG_ENABLED = true;
		XMPPConnection connection = new XMPPConnection(&quot;gmail.com&quot;);
		connection.connect();
		connection.login(&quot;用户名&quot;, &quot;密码&quot;);

		ChatManager manager = connection.getChatManager();
		manager.addChatListener(new ChatManagerListener(){
			public void chatCreated(Chat chat, boolean arg1) {
				chat.addMessageListener(new MessageListener(){
					public void processMessage(Chat arg0, Message message) {
						System.out.println(message.getFrom() + &quot; &quot; + message.getBody());
					}
				});
			}
		});
      }
}
</pre>
&nbsp;
<p>然后将用户名,密码替换成自己google talk的用户名密码就可以</p>
<p>这样就可以监听你的google talk上所有用户发送过来的消息了</p>
<pre name="code" class="java">XMPPConnection.DEBUG_ENABLED = true;</pre>
<p>
这句是为了要弹出个调试对话框来查看接受和发送的消息，如果你不想让他弹出这个对话框去掉这句就可以了。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://hf200012.javaeye.com/blog/224913#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 06 Aug 2008 10:57:32 +0800</pubDate>
        <link>http://hf200012.javaeye.com/blog/224913</link>
        <guid>http://hf200012.javaeye.com/blog/224913</guid>
      </item>
      <item>
        <title>基于开源软件做一个获取google talk你的联系人给你发送消息的小程序</title>
        <author>hf200012</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hf200012.javaeye.com">hf200012</a>&nbsp;
          链接：<a href="http://hf200012.javaeye.com/blog/224911" style="color:red;">http://hf200012.javaeye.com/blog/224911</a>&nbsp;
          发表时间: 2008年08月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我在哪吒闹海的网站上看到他们使用google talk来实现发送信息留言的功能，就想自己做一个看看，事实上就是完成一个对你的google上的所有用户发过来的消息实现监控就可以。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先我们要下载
igniterealtime 提供的开源 Smack Java XMPP 软件包，下载地址是：
<a href="http://www.igniterealtime.org/downloads/index.jsp#smack" title="http://www.igniterealtime.org/downloads/index.jsp#smack">http://www.igniterealtime.org/downloads/index.jsp#smack</a>
 ，然后点击下载 <a href="http://www.igniterealtime.org/downloads/download-landing.jsp?file=smack/smack_3_0_4.zip">smack_3_0_4.zip</a>
</p>
<p>&nbsp;</p>
<p>具体的程序如下：</p>
<pre name="code" class="java">import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.MessageListener;

import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;

import org.jivesoftware.smack.packet.Message;


public class GoogleTalk {

	/**
	 * @param args
	 * @throws XMPPException 
	 */
	public static void main(String[] args) throws XMPPException {
		XMPPConnection.DEBUG_ENABLED = true;
		XMPPConnection connection = new XMPPConnection(&quot;gmail.com&quot;);
		connection.connect();
		connection.login(&quot;zhangjf1&quot;, &quot;asdfghjkl)(*&amp;^&quot;);

		ChatManager manager = connection.getChatManager();
		manager.addChatListener(new ChatManagerListener(){
			public void chatCreated(Chat chat, boolean arg1) {
				chat.addMessageListener(new MessageListener(){
					public void processMessage(Chat arg0, Message message) {
						System.out.println(message.getFrom() + &quot; &quot; + message.getBody());
					}
				});
			}
		});
      }
}</pre>
&nbsp;
<p>这样就可以监听你的google talk上所有用户发送过来的消息了</p>
<pre name="code" class="java">XMPPConnection.DEBUG_ENABLED = true;</pre>
<p>
这句是为了要弹出个调试对话框来查看接受和发送的消息，如果你不想让他弹出这个对话框去掉这句就可以了。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://hf200012.javaeye.com/blog/224911#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 06 Aug 2008 10:54:20 +0800</pubDate>
        <link>http://hf200012.javaeye.com/blog/224911</link>
        <guid>http://hf200012.javaeye.com/blog/224911</guid>
      </item>
      <item>
        <title>JSTL function 标签 使用</title>
        <author>hf200012</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hf200012.javaeye.com">hf200012</a>&nbsp;
          链接：<a href="http://hf200012.javaeye.com/blog/212731" style="color:red;">http://hf200012.javaeye.com/blog/212731</a>&nbsp;
          发表时间: 2008年07月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span>长度函数：</span>
 <span><span style="font-family: Times New Roman;">fn:length</span>
 </span>
</p>
<p><span>字符串处理函数：</span>
 <span><span style="font-family: Times New Roman;">fn:contains</span>
 </span>
<span>、</span>
 <span><span style="font-family: Times New Roman;">fn:containsIgnoreCase</span>
 </span>
<span>、</span>
 <span><span style="font-family: Times New Roman;">fn:endsWith</span>
 </span>
<span>、</span>
 <span><span style="font-family: Times New Roman;">fn:escapeXml</span>
 </span>
<span>、</span>
 <span><span style="font-family: Times New Roman;">fn:indexOf</span>
 </span>
<span>、</span>
 <span><span style="font-family: Times New Roman;">fn:join</span>
 </span>
<span>、</span>
 <span><span style="font-family: Times New Roman;">fn:replace</span>
 </span>
<span>、</span>
 <span><span style="font-family: Times New Roman;">fn:split</span>
 </span>
<span>、</span>
 <span><span style="font-family: Times New Roman;">fn:startsWith</span>
 </span>
<span>、</span>
 <span><span style="font-family: Times New Roman;">fn:substring</span>
 </span>
<span>、</span>
 <span><span style="font-family: Times New Roman;">fn:substringAfter</span>
 </span>
<span>、</span>
 <span><span style="font-family: Times New Roman;">fn:substringBefore</span>
 </span>
<span>、</span>
 <span><span style="font-family: Times New Roman;">fn:toLowerCase</span>
 </span>
<span>、</span>
 <span><span style="font-family: Times New Roman;">fn:toUpperCase</span>
 </span>
<span>、</span>
 <span><span style="font-family: Times New Roman;">fn:trim</span>
 </span>
</p>
<p>JSP 页面上：</p>
<p>&lt;%@ taglib uri=&quot;/WEB-INF/fn.tld&quot; prefix=&quot;fn&quot; %&gt;</p>
<p>${fn:toUpperCase(&quot;sdjkhjshjhjd&quot;) }</p>
<p>&nbsp;</p>
<p>这个例子将输出 这些字母的大写字母</p>
<h3><span style="font-size: small;"><span><span><span><span>一.长度函数</span>
 </span>
</span>
</span>
<span><span><span><span><span style="font-family: Arial;">fn:length</span>
 </span>
</span>
</span>
</span>
</span>
<span><span><span><span><span style="font-size: small;">函数</span>
</span>
 </span>
</span>
</span>
</h3>
<p><span>长度函数</span>
 <span><span style="font-family: Times New Roman;">fn:length</span>
 </span>
<span>的出现有重要的意义。在</span>
 <span><span style="font-family: Times New Roman;">JSTL1.0</span>
 </span>
<span>中，有一个功能被忽略了，那就是对集合的长度取值。虽然</span>
 <span><span style="font-family: Times New Roman;">java.util.Collection</span>
 </span>
<span>接口定义了</span>
 <span><span style="font-family: Times New Roman;">size</span>
 </span>
<span>方法，但是该方法不是一个标准的</span>
 <span><span style="font-family: Times New Roman;">JavaBean</span>
 </span>
<span>属性方法（没有</span>
 <span><span style="font-family: Times New Roman;">get,set</span>
 </span>
<span>方法），因此，无法通过</span>
 <span><span style="font-family: Times New Roman;">EL</span>
 </span>
<span>表达式&ldquo;</span>
 <span><span style="font-family: Times New Roman;">${collection.size}</span>
 </span>
<span>&rdquo;来轻松取得。</span>
</p>
<p><span><span style="font-family: Times New Roman;">fn:length</span>
 </span>
<span>函数正是为了解决这个问题而被<span style="color: #1d58d1;">设计</span>
出来的。它的参数为</span>
 <span><span style="font-family: Times New Roman;">input</span>
 </span>
<span>，将计算通过该属性传入的对象长度。该对象应该为集合类型或</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型。其返回结果是一个</span>
 <span><span style="font-family: Times New Roman;">int</span>
 </span>
<span>类型的值。下面看一个示例。</span>
</p>
<p><span><span><span style="font-family: Arial;">&lt;%ArrayList arrayList1 = new ArrayList();</span>
 </span>
</span>
</p>
<p><span><span><span style="font-family: Arial;"><span>&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;</span>
arrayList1.add(&quot;aa&quot;);</span>
 </span>
</span>
</p>
<p><span><span><span style="font-family: Arial;"><span>&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;</span>
arrayList1.add(&quot;bb&quot;);</span>
 </span>
</span>
</p>
<p><span><span><span style="font-family: Arial;"><span>&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;</span>
arrayList1.add(&quot;cc&quot;);</span>
 </span>
</span>
</p>
<p><span><span><span style="font-family: Arial;">%&gt;</span>
 </span>
</span>
</p>
<p><span><span><span style="font-family: Arial;">&lt;%request.getSession().setAttribute(&quot;arrayList1&quot;, arrayList1);%&gt;</span>
 </span>
</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:length(sessionScope.arrayList1)}</span>
 </span>
</span>
</p>
<p><span>假设一个</span>
 <span><span style="font-family: Times New Roman;">ArrayList</span>
 </span>
<span>类型的实例&ldquo;</span>
 <span><span style="font-family: Times New Roman;">arrayList1</span>
 </span>
<span>&rdquo;，并为其添加三个字符串对象，使用</span>
 <span><span style="font-family: Times New Roman;">fn:length</span>
 </span>
<span>函数后就可以取得返回结果为&ldquo;</span>
 <span><span style="font-family: Times New Roman;">3</span>
 </span>
<span>&rdquo;。</span>
</p>
<h3><span style="font-size: small;"><span><span><span><span>二.判断函数</span>
 </span>
</span>
</span>
<span><span><span><span><span style="font-family: Arial;">fn:contains</span>
 </span>
</span>
</span>
</span>
</span>
<span><span><span><span><span style="font-size: small;">函数</span>
</span>
 </span>
</span>
</span>
</h3>
<p><span><span style="font-family: Times New Roman;">fn:contains</span>
 </span>
<span>函数用来判断源字符串是否包含子字符串。它包括</span>
 <span><span style="font-family: Times New Roman;">string</span>
 </span>
<span>和</span>
 <span><span style="font-family: Times New Roman;">substring</span>
 </span>
<span>两个参数，它们都是</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型，分布表示源字符串和子字符串。其返回结果为一个</span>
 <span><span style="font-family: Times New Roman;">boolean</span>
 </span>
<span>类型的值。下面看一个示例。</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:contains(&quot;ABC&quot;, &quot;a&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:contains(&quot;ABC&quot;, &quot;A&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span>前者返回&ldquo;</span>
 <span><span style="font-family: Times New Roman;">false</span>
 </span>
<span>&rdquo;，后者返回&ldquo;</span>
 <span><span style="font-family: Times New Roman;">true</span>
 </span>
<span>&rdquo;。</span>
</p>
<h3><span style="font-size: small;">三.</span>
<span><span><span><span style="color: #1d58d1;"><span style="font-size: small;"><span style="font-family: Arial;"> fn:containsIgnoreCase</span>
 </span>
</span>
</span>
</span>
</span>
<span><span><span><span><span style="font-size: small;">函数</span>
</span>
 </span>
</span>
</span>
</h3>
<p><span><span style="font-family: Times New Roman;">fn:containsIgnoreCase</span>
 </span>
<span>函数与</span>
 <span><span style="font-family: Times New Roman;">fn:contains</span>
 </span>
<span>函数的功能差不多，唯一的区别是</span>
 <span><span style="font-family: Times New Roman;">fn:containsIgnoreCase</span>
 </span>
<span>函数对于子字符串的包含比较将忽略大小写。它与</span>
 <span><span style="font-family: Times New Roman;">fn:contains</span>
 </span>
<span>函数相同，包括</span>
 <span><span style="font-family: Times New Roman;">string</span>
 </span>
<span>和</span>
 <span><span style="font-family: Times New Roman;">substring</span>
 </span>
<span>两个参数，并返回一个</span>
 <span><span style="font-family: Times New Roman;">boolean</span>
 </span>
<span>类型的值。下面看一个示例。</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:containsIgnoreCase(&quot;ABC&quot;, &quot;a&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:containsIgnoreCase(&quot;ABC&quot;, &quot;A&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span>前者和后者都会返回&ldquo;</span>
 <span><span style="font-family: Times New Roman;">true</span>
 </span>
<span>&rdquo;。</span>
</p>
<h3><span style="font-size: small;"><span><span><span><span>四.词头判断函数</span>
 </span>
</span>
</span>
<span><span><span><span><span style="font-family: Arial;">fn:startsWith</span>
 </span>
</span>
</span>
</span>
</span>
<span><span><span><span><span style="font-size: small;">函数</span>
</span>
 </span>
</span>
</span>
</h3>
<p><span><span style="font-family: Times New Roman;">fn:startsWith</span>
 </span>
<span>函数用来判断源字符串是否符合一连串的特定词头。它除了包含一个</span>
 <span><span style="font-family: Times New Roman;">string</span>
 </span>
<span>参数外，还包含一个</span>
 <span><span style="font-family: Times New Roman;">subffx</span>
 </span>
<span>参数，表示词头字符串，同样是</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型。该函数返回一个</span>
 <span><span style="font-family: Times New Roman;">boolean</span>
 </span>
<span>类型的值。下面看一个示例。</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:startsWith (&quot;ABC&quot;, &quot;ab&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:startsWith (&quot;ABC&quot;, &quot;AB&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span>前者返回&ldquo;</span>
 <span><span style="font-family: Times New Roman;">false</span>
 </span>
<span>&rdquo;，后者返回&ldquo;</span>
 <span><span style="font-family: Times New Roman;">true</span>
 </span>
<span>&rdquo;。</span>
</p>
<h3><span style="font-size: small;"><span><span><span><span>五.词尾判断函数</span>
 </span>
</span>
</span>
<span><span><span><span><span style="font-family: Arial;">fn:endsWith</span>
 </span>
</span>
</span>
</span>
</span>
<span><span><span><span><span style="font-size: small;">函数</span>
</span>
 </span>
</span>
</span>
</h3>
<p><span><span style="font-family: Times New Roman;">fn:endsWith</span>
 </span>
<span>函数用来判断源字符串是否符合一连串的特定词尾。它与</span>
 <span><span style="font-family: Times New Roman;">fn:startsWith</span>
 </span>
<span>函数相同，包括</span>
 <span><span style="font-family: Times New Roman;">string</span>
 </span>
<span>和</span>
 <span><span style="font-family: Times New Roman;">subffx</span>
 </span>
<span>两个参数，并返回一个</span>
 <span><span style="font-family: Times New Roman;">boolean</span>
 </span>
<span>类型的值。下面看一个示例。</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:endsWith(&quot;ABC&quot;, &quot;bc&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:endsWith(&quot;ABC&quot;, &quot;BC&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span>前者返回&ldquo;</span>
 <span><span style="font-family: Times New Roman;">false</span>
 </span>
<span>&rdquo;，后者返回&ldquo;</span>
 <span><span style="font-family: Times New Roman;">true</span>
 </span>
<span>&rdquo;。</span>
</p>
<h3><span><span><span><span>六<span style="font-size: small;">.字符实体转换函数</span>
</span>
<span style="font-size: small;"> </span>
</span>
</span>
</span>
<span style="font-size: small;"><span><span><span><span><span style="font-family: Arial;">fn:escapeXml</span>
 </span>
</span>
</span>
</span>
<span><span><span><span>函数</span>
 </span>
</span>
</span>
</span>
</h3>
<p><span><span style="font-family: Times New Roman;">fn:escapeXml</span>
 </span>
<span>函数用于将所有特殊字符转化为字符实体码。它只包含一个</span>
 <span><span style="font-family: Times New Roman;">string</span>
 </span>
<span>参数，返回一个</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型的值。</span>
</p>
<h3><span style="font-size: small;"><span><span><span><span>七.字符匹配函数</span>
 </span>
</span>
</span>
<span><span><span><span><span style="font-family: Arial;">fn:indexOf</span>
 </span>
</span>
</span>
</span>
</span>
<span><span><span><span><span style="font-size: small;">函数</span>
</span>
 </span>
</span>
</span>
</h3>
<p><span><span style="font-family: Times New Roman;">fn:indexOf</span>
 </span>
<span>函数用于取得子字符串与源字符串匹配的开始位置，若子字符串与源字符串中的内容没有匹配成功将返回&ldquo;</span>
 <span><span style="font-family: Times New Roman;">-1</span>
 </span>
<span>&rdquo;。它包括</span>
 <span><span style="font-family: Times New Roman;">string</span>
 </span>
<span>和</span>
 <span><span style="font-family: Times New Roman;">substring</span>
 </span>
<span>两个参数，返回结果为</span>
 <span><span style="font-family: Times New Roman;">int</span>
 </span>
<span>类型。下面看一个示例。</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:indexOf(&quot;ABCD&quot;,&quot;aBC&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:indexOf(&quot;ABCD&quot;,&quot;BC&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span>前者由于没有匹配成功，所以返回</span>
 <span><span style="font-family: Times New Roman;">-1</span>
 </span>
<span>，后者匹配成功将返回位置的下标，为</span>
 <span><span style="font-family: Times New Roman;">1</span>
 </span>
<span>。</span>
</p>
<h3><span style="font-size: small;"><span><span><span><span>八.分隔符函数</span>
 </span>
</span>
</span>
<span><span><span><span><span style="font-family: Arial;">fn:join</span>
 </span>
</span>
</span>
</span>
</span>
<span><span><span><span><span style="font-size: small;">函数</span>
</span>
 </span>
</span>
</span>
</h3>
<p><span><span style="font-family: Times New Roman;">fn:join</span>
 </span>
<span>函数允许为一个字符串数组中的每一个字符串加上分隔符，并连接起来。它的参数、返回结果和描述如表</span>
 <span><span style="font-family: Times New Roman;">9.25</span>
 </span>
<span>所示：</span>
</p>
<p><span>表</span>
 <span><span style="font-family: Arial;">9.25</span>
 </span>
<span>　</span>
 <span><span style="font-family: Arial;">fn:join</span>
 </span>
<span>函数</span>
</p>
<div>
<table cellspacing="0" border="1" width="281" cellpadding="0">
<tbody>
<tr>
<td width="65">
<p><span>参数</span>
</p>
</td>
<td width="216">
<p><span>描述</span>
</p>
</td>
</tr>
<tr>
<td width="65">
<p><span><span style="font-family: Times New Roman;">array</span>
 </span>
</p>
</td>
<td width="216">
<p><span>字符串数组。其类型必须为</span>
 <span><span style="font-family: Times New Roman;">String[]</span>
 </span>
<span>类型</span>
</p>
</td>
</tr>
<tr>
<td width="65">
<p><span><span style="font-family: Times New Roman;">separator</span>
 </span>
</p>
</td>
<td width="216">
<p><span>分隔符。其类型必须为</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型</span>
</p>
</td>
</tr>
<tr>
<td width="65">
<p><span>返回结果</span>
</p>
</td>
<td width="216">
<p><span>返回一个</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型的值</span>
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p><span>下面看一个示例。</span>
</p>
<p><span><span><span style="font-family: Arial;">&lt;% String[] stringArray = {&quot;a&quot;,&quot;b&quot;,&quot;c&quot;}; %&gt;</span>
 </span>
</span>
</p>
<p><span><span><span style="font-family: Arial;">&lt;%request.getSession().setAttribute(&quot;stringArray&quot;, stringArray);%&gt;</span>
 </span>
</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:join(sessionScope.stringArray,&quot;;&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span>定义数组并放置到</span>
 <span><span style="font-family: Times New Roman;">Session</span>
 </span>
<span>中，然后通过</span>
 <span><span style="font-family: Times New Roman;">Session</span>
 </span>
<span>得到该字符串数组，使用</span>
 <span><span style="font-family: Times New Roman;">fn:join</span>
 </span>
<span>函数并传入分隔符&ldquo;</span>
 <span><span style="font-family: Times New Roman;">;</span>
 </span>
<span>&rdquo;，得到的结果为&ldquo;</span>
 <span><span style="font-family: Times New Roman;">a;b;c</span>
 </span>
<span>&rdquo;。</span>
</p>
<p>
<span>
<h3><span style="font-size: small;"><span><span><span><span>九.替换函数</span>
 </span>
</span>
</span>
<span><span><span><span><span style="font-family: Arial;">fn:replace</span>
 </span>
</span>
</span>
</span>
</span>
<span><span><span><span><span style="font-size: small;">函数</span>
</span>
 </span>
</span>
</span>
</h3>
<p><span><span style="font-family: Times New Roman;">fn:replace</span>
 </span>
<span>函数允许为源字符串做替换的工作。它的参数、返回结果和描述如表</span>
 <span><span style="font-family: Times New Roman;">9.26</span>
 </span>
<span>所示：</span>
</p>
<p><span>表</span>
 <span><span style="font-family: Arial;">9.26</span>
 </span>
<span>　</span>
 <span><span style="font-family: Arial;">fn:replace</span>
 </span>
<span>函数</span>
</p>
<div>
<table cellspacing="0" border="1" width="353" cellpadding="0">
<tbody>
<tr>
<td width="105">
<p><span>参数</span>
</p>
</td>
<td width="249">
<p><span>描述</span>
</p>
</td>
</tr>
<tr>
<td width="105">
<p><span><span style="font-family: Times New Roman;">inputString</span>
 </span>
</p>
</td>
<td width="249">
<p><span>源字符串。其类型必须为</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型</span>
</p>
</td>
</tr>
<tr>
<td width="105">
<p><span><span style="font-family: Times New Roman;">beforeSubstring</span>
 </span>
</p>
</td>
<td width="249">
<p><span>指定被替换字符串。其类型必须为</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型</span>
</p>
</td>
</tr>
<tr>
<td width="105">
<p><span><span style="font-family: Times New Roman;">afterSubstring</span>
 </span>
</p>
</td>
<td width="249">
<p><span>指定替换字符串。其类型必须为</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型</span>
</p>
</td>
</tr>
<tr>
<td width="105">
<p><span>返回结果</span>
</p>
</td>
<td width="249">
<p><span>返回一个</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型的值</span>
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p><span>下面看一个示例。</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:replace(&quot;ABC&quot;,&quot;A&quot;,&quot;B&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span>将&ldquo;</span>
 <span><span style="font-family: Times New Roman;">ABC</span>
 </span>
<span>&rdquo;字符串替换为&ldquo;</span>
 <span><span style="font-family: Times New Roman;">BBC</span>
 </span>
<span>&rdquo;，在&ldquo;</span>
 <span><span style="font-family: Times New Roman;">ABC</span>
 </span>
<span>&rdquo;字符串中用&ldquo;</span>
 <span><span style="font-family: Times New Roman;">B</span>
 </span>
<span>&rdquo;替换了&ldquo;</span>
 <span><span style="font-family: Times New Roman;">A</span>
 </span>
<span>&rdquo;。</span>
</p>
<h3><span style="font-size: small;"><span><span><span><span>十.分隔符转换数组函数</span>
 </span>
</span>
</span>
<span><span><span><span><span style="font-family: Arial;">fn:split</span>
 </span>
</span>
</span>
</span>
</span>
<span><span><span><span><span style="font-size: small;">函数</span>
</span>
 </span>
</span>
</span>
</h3>
<p><span><span style="font-family: Times New Roman;">fn:split</span>
 </span>
<span>函数用于将一组由分隔符分隔的字符串转换成字符串数组。它的参数、返回结果和描述如表</span>
 <span><span style="font-family: Times New Roman;">9.27</span>
 </span>
<span>所示：</span>
</p>
<p><span>表</span>
 <span><span style="font-family: Arial;">9.27</span>
 </span>
<span>　</span>
 <span><span style="font-family: Arial;">fn:<span>split</span>
</span>
 </span>
<span>函数</span>
</p>
<div>
<table cellspacing="0" border="1" width="281" cellpadding="0">
<tbody>
<tr>
<td width="65">
<p><span>参数</span>
</p>
</td>
<td width="216">
<p><span>描述</span>
</p>
</td>
</tr>
<tr>
<td width="65">
<p><span><span style="font-family: Times New Roman;">string</span>
 </span>
</p>
</td>
<td width="216">
<p><span>源字符串。其类型必须为</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型</span>
</p>
</td>
</tr>
<tr>
<td width="65">
<p><span><span style="font-family: Times New Roman;">delimiters</span>
 </span>
</p>
</td>
<td width="216">
<p><span>指定分隔符。其类型必须为</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型</span>
</p>
</td>
</tr>
<tr>
<td width="65">
<p><span>返回结果</span>
</p>
</td>
<td width="216">
<p><span>返回一个</span>
 <span><span style="font-family: Times New Roman;">String[]</span>
 </span>
<span>类型的值</span>
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p><span>下面看一个示例。</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:split(&quot;A,B,C&quot;,&quot;,&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span>将&ldquo;</span>
 <span><span style="font-family: Times New Roman;">A,B,C</span>
 </span>
<span>&rdquo;字符串转换为数组</span>
 <span><span style="font-family: Times New Roman;">{A,B,C}</span>
 </span>
<span>。</span>
</p>
<h3><span style="font-size: small;"><span><span><span><span>十一.字符串截取函数</span>
 </span>
</span>
</span>
<span><span><span><span><span style="font-family: Arial;">fn:substring</span>
 </span>
</span>
</span>
</span>
</span>
<span><span><span><span><span style="font-size: small;">函数</span>
</span>
 </span>
</span>
</span>
</h3>
<p><span><span style="font-family: Times New Roman;">fn:substring</span>
 </span>
<span>函数用于截取字符串。它的参数、返回结果和描述如表</span>
 <span><span style="font-family: Times New Roman;">9.28</span>
 </span>
<span>所示：</span>
</p>
<p><span>表</span>
 <span><span style="font-family: Arial;">9.28</span>
 </span>
<span>　</span>
 <span><span style="font-family: Arial;">fn:<span>substring</span>
</span>
 </span>
<span>函数</span>
</p>
<div>
<table cellspacing="0" border="1" width="353" cellpadding="0">
<tbody>
<tr>
<td width="68">
<p><span>参数</span>
</p>
</td>
<td width="285">
<p><span>描述</span>
</p>
</td>
</tr>
<tr>
<td width="68">
<p><span><span style="font-family: Times New Roman;">string</span>
 </span>
</p>
</td>
<td width="285">
<p><span>源字符串。其类型必须为</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型</span>
</p>
</td>
</tr>
<tr>
<td width="68">
<p><span><span style="font-family: Times New Roman;">beginIndex</span>
 </span>
</p>
</td>
<td width="285">
<p><span>指定起始下标（值从</span>
 <span><span style="font-family: Times New Roman;">0</span>
 </span>
<span>开始）。其类型必须为</span>
 <span><span style="font-family: Times New Roman;">int</span>
 </span>
<span>类型</span>
</p>
</td>
</tr>
<tr>
<td width="68">
<p><span><span style="font-family: Times New Roman;">endIndex</span>
 </span>
</p>
</td>
<td width="285">
<p><span>指定结束下标（值从</span>
 <span><span style="font-family: Times New Roman;">0</span>
 </span>
<span>开始）。其类型必须为</span>
 <span><span style="font-family: Times New Roman;">int</span>
 </span>
<span>类型</span>
</p>
</td>
</tr>
<tr>
<td width="68">
<p><span>返回结果</span>
</p>
</td>
<td width="285">
<p><span>返回一个</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型的值</span>
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p><span>下面看一个示例。</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:substring(&quot;ABC&quot;,&quot;1&quot;,&quot;2&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<div><span>截取结果为&ldquo;</span>
 <span><span style="font-family: Times New Roman;">B</span>
 </span>
<span>&rdquo;。</span>
</div>
<p>&nbsp;</p>
<h3><span style="font-size: small;"><span><span><span><span>十二.起始到定位截取字符串函数</span>
 </span>
</span>
</span>
<span><span><span><span><span style="font-family: Arial;">fn:substringBefore</span>
 </span>
</span>
</span>
</span>
</span>
<span><span><span><span><span style="font-size: small;">函数</span>
</span>
 </span>
</span>
</span>
</h3>
<p><span><span style="font-family: Times New Roman;">fn:substringBefore</span>
 </span>
<span>函数允许截取源字符从开始到某个字符串。它的参数和</span>
 <span><span style="font-family: Times New Roman;">fn:substringAfter</span>
 </span>
<span>函数相同，不同的是</span>
 <span><span style="font-family: Times New Roman;">substring</span>
 </span>
<span>表示的是结束字符串。下面看一个示例。</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:substringBefore(&quot;ABCD&quot;,&quot;BC&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span>截取的结果为&ldquo;</span>
 <span><span style="font-family: Times New Roman;">A</span>
 </span>
<span>&rdquo;。</span>
</p>
<h3><span style="font-size: small;"><span><span><span><span>十三.小写转换函数</span>
 </span>
</span>
</span>
<span><span><span><span><span style="font-family: Arial;">fn:toLowerCase</span>
 </span>
</span>
</span>
</span>
</span>
<span><span><span><span><span style="font-size: small;">函数</span>
</span>
 </span>
</span>
</span>
</h3>
<p><span><span style="font-family: Times New Roman;">fn:toLowerCase</span>
 </span>
<span>函数允许将源字符串中的字符全部转换成小写字符。它只有一个表示源字符串的参数</span>
 <span><span style="font-family: Times New Roman;">string</span>
 </span>
<span>，函数返回一个</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型的值。下面看一个示例。</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:toLowerCase(&quot;ABCD&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span>转换的结果为&ldquo;</span>
 <span><span style="font-family: Times New Roman;">abcd</span>
 </span>
<span>&rdquo;。</span>
</p>
<h3><span style="font-size: small;"><span><span><span><span>十四.大写转换函数</span>
 </span>
</span>
</span>
<span><span><span><span><span style="font-family: Arial;">fn:toUpperCase</span>
 </span>
</span>
</span>
</span>
</span>
<span><span><span><span><span style="font-size: small;">函数</span>
</span>
 </span>
</span>
</span>
</h3>
<p><span><span style="font-family: Times New Roman;">fn:toUpperCase</span>
 </span>
<span>函数允许将源字符串中的字符全部转换成大写字符。它与</span>
 <span><span style="font-family: Times New Roman;">fn:toLowerCase</span>
 </span>
<span>函数相同，也只有一个</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>参数，并返回一个</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型的值。下面看一个示例。</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:toUpperCase(&quot;abcd&quot;)}&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span>转换的结果为&ldquo;</span>
 <span><span style="font-family: Times New Roman;">ABCD</span>
 </span>
<span>&rdquo;。</span>
</p>
<h3><span style="font-size: small;"><span><span><span><span>十五.空格删除函数</span>
 </span>
</span>
</span>
<span><span><span><span><span style="font-family: Arial;">fn:trim</span>
 </span>
</span>
</span>
</span>
</span>
<span><span><span><span><span style="font-size: small;">函数</span>
</span>
 </span>
</span>
</span>
</h3>
<p><span><span style="font-family: Times New Roman;">fn:trim</span>
 </span>
<span>函数将删除源字符串中结尾部分的&ldquo;空格&rdquo;以产生一个新的字符串。它与</span>
 <span><span style="font-family: Times New Roman;">fn:toLowerCase</span>
 </span>
<span>函数相同，只有一个</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>参数，并返回一个</span>
 <span><span style="font-family: Times New Roman;">String</span>
 </span>
<span>类型的值。下面看一个示例。</span>
</p>
<p><span><span><span style="font-family: Arial;">${fn:trim(&quot;AB C &quot;)}D&lt;br&gt;</span>
 </span>
</span>
</p>
<p><span>转换的结果为&ldquo;</span>
 <span><span style="font-family: Times New Roman;">AB CD</span>
 </span>
<span>&rdquo;，注意，它将只删除词尾的空格而不是全部，因此&ldquo;</span>
 <span><span style="font-family: Times New Roman;">B</span>
 </span>
<span>&rdquo;和&ldquo;</span>
 <span><span style="font-family: Times New Roman;">C</span>
 </span>
<span>&rdquo;之间仍然留有一个空格。</span>
</p>
</span>
</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://hf200012.javaeye.com/blog/212731#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Jul 2008 14:34:18 +0800</pubDate>
        <link>http://hf200012.javaeye.com/blog/212731</link>
        <guid>http://hf200012.javaeye.com/blog/212731</guid>
      </item>
      <item>
        <title>在是用Ibatis是操作Oracle数据库字段类型为LONG的问题</title>
        <author>hf200012</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hf200012.javaeye.com">hf200012</a>&nbsp;
          链接：<a href="http://hf200012.javaeye.com/blog/212724" style="color:red;">http://hf200012.javaeye.com/blog/212724</a>&nbsp;
          发表时间: 2008年07月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>查询语句：</p>
<pre name="code" class="xml">	&lt;select id=&quot;selectJingHuaBlogArticleCount&quot; resultMap=&quot;result_JingHuaBlog&quot; &gt;
		&lt;![CDATA[
		select * from (
		SELECT a.article_id,a.class_id,a.article_title,a.article_content,c.class_name,l.member_register_id,l.member_register_pic,l.member_register_okno
		 FROM article a,ARTICLE_CLASS c,login_information l 
		 WHERE a.class_id=c.class_id AND a.member_register_id=l.member_register_id AND a.pick=1 and a.auth=1
		)ttt where rownum &lt; $count$		
	]]&gt;
	&lt;/select&gt;
</pre>
<p>&nbsp;映射的结果对象：</p>
<pre name="code" class="xml">	&lt;resultMap class=&quot;article&quot; id=&quot;result_JingHuaBlog&quot;&gt;
		
		&lt;result column=&quot;article_id&quot; property=&quot;articleId&quot; /&gt;
               &lt;result column=&quot;article_content&quot; property=&quot;articleContent&quot;/&gt;

		&lt;result column=&quot;class_id&quot; property=&quot;articleClass.classId&quot; /&gt;
		&lt;result column=&quot;class_name&quot; property=&quot;articleClass.className&quot; /&gt;
		&lt;result column=&quot;article_title&quot; property=&quot;articleTitle&quot; /&gt;
		&lt;result column=&quot;member_register_pic&quot; property=&quot;loginInformation.memberRegisterPic&quot; /&gt;
		&lt;result column=&quot;member_register_okno&quot; property=&quot;loginInformation.memberRegisterOkno&quot; /&gt;
		&lt;result column=&quot;member_register_Id&quot; property=&quot;loginInformation.memberRegisterId&quot; /&gt;
	&lt;/resultMap&gt;</pre>
&nbsp;
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是使用iBatis操作oracle数据库时，当你的字段类型为LONG类型的时候，查询出结果的时候会报<span style="color: #ff0000;">流已经被关闭<span style="color: #000000;">，这个问题困扰了我好几个小时，使用最基本的JDBC</span>
</span>
对Oracle.Long型可以直接通过ResultSet.getString()读写的,一直就想不通为什么？我知道无论是LONG,CLOB还是BLOB实际上都只是resultset拿一个定位符，LONG和CLOB
就会在getString时侯打开一个流由JDBC转换成String;如果再次读同一个定位符就会得到这个&quot;流已经关闭&quot;的错误信息。不过，我就是检查
来检查去，无论如何发现不了重复执行两次get同一字段的代码。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一直到我使用一个检测代码执行同样的取值时，发现如果在一行resultset中先读其他列然后再读这个Long列就会出同样
的错误。所以只要把上面的结果映射的</p>
<pre name="code" class="xml">&lt;result column=&quot;article_content&quot; property=&quot;articleContent&quot;/&gt;</pre>
<p>拿到最前面就一切正常，但是还是不明白为什么？</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://hf200012.javaeye.com/blog/212724#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Jul 2008 14:19:20 +0800</pubDate>
        <link>http://hf200012.javaeye.com/blog/212724</link>
        <guid>http://hf200012.javaeye.com/blog/212724</guid>
      </item>
      <item>
        <title>实现从Oracle中随机取得几条记录</title>
        <author>hf200012</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hf200012.javaeye.com">hf200012</a>&nbsp;
          链接：<a href="http://hf200012.javaeye.com/blog/212719" style="color:red;">http://hf200012.javaeye.com/blog/212719</a>&nbsp;
          发表时间: 2008年07月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p> select &nbsp; * &nbsp; from &nbsp; (select &nbsp; * &nbsp; from &nbsp; tablename &nbsp; order &nbsp; by &nbsp; sys_guid()) &nbsp; where &nbsp; rownum &nbsp; &lt; &nbsp; N; &nbsp; <br />
 &nbsp; select &nbsp; * &nbsp; from &nbsp; (select &nbsp; * &nbsp; from &nbsp; tablename &nbsp; order &nbsp; by &nbsp; dbms_random.value) &nbsp; where &nbsp; rownum&lt; &nbsp; N</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://hf200012.javaeye.com/blog/212719#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Jul 2008 14:06:13 +0800</pubDate>
        <link>http://hf200012.javaeye.com/blog/212719</link>
        <guid>http://hf200012.javaeye.com/blog/212719</guid>
      </item>
      <item>
        <title>tomcat 6 el表达式的问题</title>
        <author>hf200012</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hf200012.javaeye.com">hf200012</a>&nbsp;
          链接：<a href="http://hf200012.javaeye.com/blog/210106" style="color:red;">http://hf200012.javaeye.com/blog/210106</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>下面的这个页面在 tomcat 5.5.15里面是正确的，但是在6.0.14里面就出问题<br /></p>
<pre name="code" class="html">&lt;?xml version="1.0" encoding="GBK"?&gt;
&lt;html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:jsp="http://java.sun.com/JSP/Page"&gt;

&lt;jsp:output omit-xml-declaration="true"
doctype-root-element="html"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" /&gt;

&lt;head&gt;
&lt;title&gt;error!!!&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;${true? (false?true:false):false}&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
&nbsp;
<p><br /><br />org.apache.jasper.JasperException: An exception occurred processing JSP page<br />/test.jspx at line 15<br /><br />12: &lt;title&gt;error!!!&lt;/title&gt;<br />13: &lt;/head&gt;<br />14: &lt;body&gt;<br />15: &lt;p&gt;${true? (false?true:false):false}&lt;/p&gt;<br />16: &lt;/body&gt;<br />17: &lt;/html&gt;<br /><br /><br />Stacktrace:<br />org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:524)<br />org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:435)<br />org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)<br />org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)<br />javax.servlet.http.HttpServlet.service(HttpServlet.java:803)<br /><br />root cause<br /><br />javax.el.ELException: Error Parsing: ${true? (false?true:false):false}<br />org.apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:125)<br />org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:146)<br />org.apache.el.lang.ExpressionBuilder.createValueExpression(ExpressionBuilder.java:190)<br />org.apache.el.ExpressionFactoryImpl.createValueExpression(ExpressionFactoryImpl.java:68)<br />org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:922)<br />org.apache.jsp.test_jspx._jspService(test_jspx.java:62)<br />org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)<br />javax.servlet.http.HttpServlet.service(HttpServlet.java:803)<br />org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)<br />org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)<br />org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)<br />javax.servlet.http.HttpServlet.service(HttpServlet.java:803)<br /><br />root cause<br /><br />org.apache.el.parser.ParseException: Encountered "true: false" at line 1, column 16.<br />Was expecting one of:<br />"(" ...<br />&lt;IDENTIFIER&gt; ...<br />&lt;NAMESPACE&gt; &lt;IDENTIFIER&gt; ...<br /><br />org.apache.el.parser.ELParser.generateParseException(ELParser.java:1874)<br />org.apache.el.parser.ELParser.jj_consume_token(ELParser.java:1754)<br />org.apache.el.parser.ELParser.NonLiteral(ELParser.java:1136)<br />org.apache.el.parser.ELParser.ValuePrefix(ELParser.java:1030)<br />org.apache.el.parser.ELParser.Value(ELParser.java:978)<br />org.apache.el.parser.ELParser.Unary(ELParser.java:960)<br />org.apache.el.parser.ELParser.Multiplication(ELParser.java:723)<br />org.apache.el.parser.ELParser.Math(ELParser.java:643)<br />org.apache.el.parser.ELParser.Compare(ELParser.java:455)<br />org.apache.el.parser.ELParser.Equality(ELParser.java:349)<br />org.apache.el.parser.ELParser.And(ELParser.java:293)<br />org.apache.el.parser.ELParser.Or(ELParser.java:237)<br />org.apache.el.parser.ELParser.Choice(ELParser.java:203)<br />org.apache.el.parser.ELParser.Expression(ELParser.java:183)<br />org.apache.el.parser.ELParser.NonLiteral(ELParser.java:1122)<br />org.apache.el.parser.ELParser.ValuePrefix(ELParser.java:1030)<br />org.apache.el.parser.ELParser.Value(ELParser.java:978)<br />org.apache.el.parser.ELParser.Unary(ELParser.java:960)<br />org.apache.el.parser.ELParser.Multiplication(ELParser.java:723)<br />org.apache.el.parser.ELParser.Math(ELParser.java:643)<br />org.apache.el.parser.ELParser.Compare(ELParser.java:455)<br />org.apache.el.parser.ELParser.Equality(ELParser.java:349)<br />org.apache.el.parser.ELParser.And(ELParser.java:293)<br />org.apache.el.parser.ELParser.Or(ELParser.java:237)<br />org.apache.el.parser.ELParser.Choice(ELParser.java:203)<br />org.apache.el.parser.ELParser.Expression(ELParser.java:183)<br />org.apache.el.parser.ELParser.DynamicExpression(ELParser.java:155)<br />org.apache.el.parser.ELParser.CompositeExpression(ELParser.java:52)<br />org.apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:93)<br />org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:146)<br />org.apache.el.lang.ExpressionBuilder.createValueExpression(ExpressionBuilder.java:190)<br />org.apache.el.ExpressionFactoryImpl.createValueExpression(ExpressionFactoryImpl.java:68)<br />org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:922)<br />org.apache.jsp.test_jspx._jspService(test_jspx.java:62)<br />org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)<br />javax.servlet.http.HttpServlet.service(HttpServlet.java:803)<br />org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)<br />org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)<br />org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)<br />javax.servlet.http.HttpServlet.service(HttpServlet.java:803) </p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://hf200012.javaeye.com/blog/210106#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 12:09:30 +0800</pubDate>
        <link>http://hf200012.javaeye.com/blog/210106</link>
        <guid>http://hf200012.javaeye.com/blog/210106</guid>
      </item>
      <item>
        <title>[以解决]请教iBatis批量插入数据问题</title>
        <author>hf200012</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hf200012.javaeye.com">hf200012</a>&nbsp;
          链接：<a href="http://hf200012.javaeye.com/blog/207053" style="color:red;">http://hf200012.javaeye.com/blog/207053</a>&nbsp;
          发表时间: 2008年06月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我使用的Spring +Ibatis</p>
<p>在我做批量从插入的时候遇到了数据插不进去的问题，请大家帮忙看看</p>
<p>&nbsp;</p>
<p>数据访问接口的代码是：</p>
<pre name="code" class="java">	public void saveMessages(String oknos, String userId, String title,String msg){
		Map&lt;String,Object&gt; params = new HashMap&lt;String,Object&gt;();
		params.put("userId", userId);
		params.put("title", title);
		params.put("msg", msg);
		params.put("oknos", oknos);
		this.getSqlMapClientTemplate().insert("insertMessageByOKNOS", params);
	}
</pre>
<p>&nbsp;</p>
<p>定义的IBATIS映射文件是：</p>
<pre name="code" class="xml">	&lt;insert id="insertMessageByOKNOS" &gt;
		INSERT INTO scrip (scrip_id,loginer_id,myfriend_id,isread,msg,scrip_title,stime)
		SELECT scrip_id.NEXTVAL ,$userId$, member_register_id ,
		0,#msg#,#title#,SYSDATE FROM login_information  WHERE member_register_okno IN (#oknos#) 
	&lt;/insert&gt;
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>调用保存方法就是插入不进去数据，也不出错，但是如果把定义的sql语句换成</p>
<pre name="code" class="xml">	&lt;insert id="insertMessageByOKNOS" &gt;
 INSERT INTO scrip (scrip_id,loginer_id,myfriend_id,isread,msg,scrip_title,stime)  
  SELECT scrip_id.NEXTVAL ,123, member_register_id ,  
  0,'222222','222222',SYSDATE FROM login_information  WHERE member_register_okno IN ('45628846','45628847','45628849') 
	&lt;/insert&gt;</pre>
<p>&nbsp;就可以插入，通过参数传递就不可以，下面是Spring的日志</p>
<p>2008-06-23 11:51:58,398 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] Creating new transaction with name [com.inc.i941ok.server.BaseManager.saveMessages]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT<br />2008-06-23 11:51:58,398 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] Acquired Connection [org.apache.commons.dbcp.PoolableConnection@2f6aea] for JDBC transaction<br />2008-06-23 11:51:58,398 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] Switching JDBC Connection [org.apache.commons.dbcp.PoolableConnection@2f6aea] to manual commit<br />2008-06-23 11:51:58,398 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] Bound value [org.springframework.jdbc.datasource.ConnectionHolder@158bc22] for key [org.apache.commons.dbcp.BasicDataSource@1dea651] to thread [http-8080-2]<br />2008-06-23 11:51:58,398 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] Initializing transaction synchronization<br />2008-06-23 11:51:58,398 DEBUG [org.springframework.transaction.interceptor.TransactionInterceptor] Getting transaction for [com.inc.i941ok.server.BaseManager.saveMessages]<br />2008-06-23 11:51:58,398 DEBUG [org.springframework.orm.ibatis.SqlMapClientTemplate] Opened SqlMapSession [com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl@a76306] for iBATIS operation<br />2008-06-23 11:51:58,398 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@158bc22] for key [org.apache.commons.dbcp.BasicDataSource@1dea651] bound to thread [http-8080-2]<br />2008-06-23 11:51:58,398 DEBUG [java.sql.Connection] {conn-100008} Connection<br />2008-06-23 11:51:58,398 DEBUG [org.springframework.orm.ibatis.SqlMapClientTemplate] Obtained JDBC Connection [Transaction-aware proxy for target Connection [org.apache.commons.dbcp.PoolableConnection@2f6aea]] for iBATIS operation<br />2008-06-23 11:51:58,398 DEBUG [java.sql.Connection] {conn-100008} Preparing Statement:&nbsp;&nbsp;&nbsp; INSERT INTO scrip (scrip_id,loginer_id,myfriend_id,isread,msg,scrip_title,stime)&nbsp;&nbsp; SELECT scrip_id.NEXTVAL ,123, member_register_id ,&nbsp;&nbsp; 0,?,?,SYSDATE FROM login_information&nbsp; WHERE member_register_okno IN (?)&nbsp;&nbsp; <br />2008-06-23 11:51:58,398 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@158bc22] for key [org.apache.commons.dbcp.BasicDataSource@1dea651] bound to thread [http-8080-2]<br />2008-06-23 11:51:58,398 DEBUG [java.sql.PreparedStatement] {pstm-100009} Executing Statement:&nbsp;&nbsp;&nbsp; INSERT INTO scrip (scrip_id,loginer_id,myfriend_id,isread,msg,scrip_title,stime)&nbsp;&nbsp; SELECT scrip_id.NEXTVAL ,123, member_register_id ,&nbsp;&nbsp; 0,?,?,SYSDATE FROM login_information&nbsp; WHERE member_register_okno IN (?)&nbsp;&nbsp; <br />2008-06-23 11:51:58,398 DEBUG [java.sql.PreparedStatement] {pstm-100009} Parameters: [qqqqqqqqqqqqqqqq, qqqqqqqq, 45628846,45628847,45628849]<br />2008-06-23 11:51:58,398 DEBUG [java.sql.PreparedStatement] {pstm-100009} Types: [java.lang.String, java.lang.String, java.lang.String]<br />2008-06-23 11:51:58,414 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@158bc22] for key [org.apache.commons.dbcp.BasicDataSource@1dea651] bound to thread [http-8080-2]<br />2008-06-23 11:51:58,414 DEBUG [org.springframework.transaction.interceptor.TransactionInterceptor] Completing transaction for [com.inc.i941ok.server.BaseManager.saveMessages]<br />2008-06-23 11:51:58,414 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] Triggering beforeCommit synchronization<br />2008-06-23 11:51:58,414 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] Triggering beforeCompletion synchronization<br />2008-06-23 11:51:58,414 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] Initiating transaction commit<br />2008-06-23 11:51:58,414 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] Committing JDBC transaction on Connection [org.apache.commons.dbcp.PoolableConnection@2f6aea]<br />2008-06-23 11:51:58,414 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] Triggering afterCommit synchronization<br />2008-06-23 11:51:58,414 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] Triggering afterCompletion synchronization<br />2008-06-23 11:51:58,414 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] Clearing transaction synchronization<br />2008-06-23 11:51:58,414 DEBUG [org.springframework.transaction.support.TransactionSynchronizationManager] Removed value [org.springframework.jdbc.datasource.ConnectionHolder@158bc22] for key [org.apache.commons.dbcp.BasicDataSource@1dea651] from thread [http-8080-2]<br />2008-06-23 11:51:58,461 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] Releasing JDBC Connection [org.apache.commons.dbcp.PoolableConnection@2f6aea] after transaction<br />2008-06-23 11:51:58,461 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Returning JDBC Connection to DataSource<br />2008-06-23 11:51:58,461 DEBUG [org.springframework.orm.ibatis.SqlMapClientTemplate] Opened SqlMapSession [com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl@1563e06] for iBATIS operation<br />2008-06-23 11:51:58,461 DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] Fetching JDBC Connection from DataSource</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://hf200012.javaeye.com/blog/207053#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 23 Jun 2008 11:59:55 +0800</pubDate>
        <link>http://hf200012.javaeye.com/blog/207053</link>
        <guid>http://hf200012.javaeye.com/blog/207053</guid>
      </item>
      <item>
        <title>转发一个 JPA 批注参考文档</title>
        <author>hf200012</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hf200012.javaeye.com">hf200012</a>&nbsp;
          链接：<a href="http://hf200012.javaeye.com/blog/191362" style="color:red;">http://hf200012.javaeye.com/blog/191362</a>&nbsp;
          发表时间: 2008年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          希望能在大家编程中提供帮助
          <br/><br/>
          <span style="color:red;">
            <a href="http://hf200012.javaeye.com/blog/191362#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 May 2008 11:45:55 +0800</pubDate>
        <link>http://hf200012.javaeye.com/blog/191362</link>
        <guid>http://hf200012.javaeye.com/blog/191362</guid>
      </item>
      <item>
        <title>Spring AOP 进行统一日志处理</title>
        <author>hf200012</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hf200012.javaeye.com">hf200012</a>&nbsp;
          链接：<a href="http://hf200012.javaeye.com/blog/180674" style="color:red;">http://hf200012.javaeye.com/blog/180674</a>&nbsp;
          发表时间: 2008年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          java代码：<br /><pre name="code" class="java">import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;

public class GenericLoggerBean {

	private static Logger logger = LogManager.getLogger(GenericLoggerBean.class);

	public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable {
		System.out.println(joinPoint.getTarget().getClass());
		logger.warn("Beginning method : " +  joinPoint.getTarget().getClass() + "." + joinPoint.getSignature().getName()+ "()");
		long startTime = System.currentTimeMillis();
		try{
			Object result = joinPoint.proceed();
			return result;
		}catch(Exception e){
			logger.warn(  joinPoint.getTarget().getClass() + "." + joinPoint.getSignature().getName() + "() invoke error" );
			logger.warn("error info ["+e.getMessage()+"]");
		}finally{
			logger.warn("Ending method : " + joinPoint.getTarget().getClass() + "." + joinPoint.getSignature().getName() + "()");
			logger.warn("Method invocation time : " + (System.currentTimeMillis() - startTime) + " ms.");			
		}
		return null;
	}

}
</pre><br /><br />spring配置文件：<br /><pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">


	&lt;aop:config>
		&lt;aop:pointcut id="logger"
			expression="execution( public * com.potato..*.*(..)) and !execution( * com.potato.core.aop.GenericLogger.*(..))" />
		&lt;aop:aspect id="loggerAspect" ref="genericLoggerBean">
			&lt;aop:around pointcut-ref="logger" method="invoke" />
		&lt;/aop:aspect>
	&lt;/aop:config>

	
	&lt;bean id="genericLoggerBean"
		class="com.potato.core.aop.GenericLoggerBean">
	&lt;/bean>


&lt;/beans></pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://hf200012.javaeye.com/blog/180674#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Apr 2008 08:32:37 +0800</pubDate>
        <link>http://hf200012.javaeye.com/blog/180674</link>
        <guid>http://hf200012.javaeye.com/blog/180674</guid>
      </item>
      <item>
        <title>windows XP下安裝APACHE2.0.59+PHP5.5.3+MYSQL5</title>
        <author>hf200012</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hf200012.javaeye.com">hf200012</a>&nbsp;
          链接：<a href="http://hf200012.javaeye.com/blog/158782" style="color:red;">http://hf200012.javaeye.com/blog/158782</a>&nbsp;
          发表时间: 2008年01月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>先从各官方网站下了APACHE2.0.59、PHP5.5.2、MYSQL5、PHPMYADMIN2.6.1</p><p>&nbsp;</p><p>假设:系统盘为 c:/<br />假设:把所有的东西安装在D盘下的php目录下<br />假设:安装好后目录状态会是这样子: <br />apache-------------------------&gt; d:/php/apache<br />mysql---------------------------&gt; d:/php/mysql<br />php-----------------------------&gt; d:/php/php<br />网页文件------------------------&gt; d:/php/www<br />以上这些是我的喜好,你可以改成你喜欢的</p><p>第一步 安装mysql4.1.10a( 本文章的配置适用于mysql4.1 和 mysql5.0版本 )</p><p>将下载的的mysql压缩包，直接解压到指定目录(d:phpmysql)就可以了<br />然后双击 D:phpmysqlbinwinmysqladmin.exe 这个文件,请输入winmysqladmin的初始用户、密码 （注：这不是mysql里的用户、密码）随便填不必在意.确定之后你的右下角任务的启动栏会出现一个红绿灯的图标（绿灯），红灯亮代表服务停止，绿灯亮代表服务正常<br />(如果不是绿灯,就左击这个图标-&gt;winnt-&gt;install the service 安装此服务<br />再左击这个图标-&gt;winnt-&gt;start the service 启动mysql服务)</p><p>修改mysql数据库的root密码<br />开始-&gt;运行,输入cmd 然后cd 到d:mysqlbin 执行以下命令</p><p>D:mysqlbin&gt;mysql<br />&nbsp;<br />进入mysql后接着执行:</p><p><br />(将root密码设置为easy)</p><p><br />下面一步是让PHP可以连接到mysql4.1以上版本的,一定不可以省略。具体可参考<a href="http://www.phpv.net/article.php/288">http://www.phpv.net/article.php/288</a> </p><p><br />密码请根据你需要换成别的</p><p>如果你下载的是进制安装包,解压到任意目录后就直接双击setup.exe 文件,按照你安装软件的习惯装好它,记得到路径选择那一步时请写d:phpmysql 装好后打开d:phpmysqlbin文件夹,双击winmysqladmin.exe文件,会弹出一个窗口,要求设置你的mysql服务的管理员用户名密码.自己定吧</p><p><br />两种方法区别一看就明了.</p><p>第二步: 安装apache 并配置支持PHP</p><p>双击安装文件apache_2.0.53-win32-x86-no_ssl.msi<br />将apache安装在 D:phpapache 目录下<br />还会有输入框,提示输入域名呀管理员信箱,随便填就是了.<br />+-----------------------------------------------------<br />| 注: 安装完后会自动安装并启动apache的服务,如在此处出现问题:<br />|&ldquo;（OS 10048)通常每个套接字地址 (协议/网络地址/端口) 只允许使用一次: <br />| make_sock: could not bind to address 0.0.0.0:80...&rdquo; 一般是IIS占用了80端口引起的<br />| 解决方法: 打开 控制面板-&gt;服务 找到 IIS admin 的服务 关闭并禁用<br />| 然后用CMD进入命令行模式 进入你安装apache的目录 /apache2/bin<br />| 输入 <br />| apache -k install<br />| apache -k start<br />| 如果成功的话,再接着做下面的!<br />+--------------------------------------------------------------</p><p>将php-5.0.3-Win32.zip 里内容解压到 D:phpphp 里</p><p>找到 php目录里的 php.ini-dist (似乎这是一个习惯,其实我更喜欢用php.ini-recommended)重命名为 php.ini 并拷到 windows系统目录下(特殊情况:win2k系统目录为winnt)<br />如我的php.ini是拷到 c:windows目录<br />再将php目录里的 php5ts.dll,libmysql.dll 拷到 系统目录系统目录如我的是c:windows 里(也可以是c:windowssystem32)<br />&nbsp;<br />最后到D:phpphpext下将php_gd2.dll php_mysql.dll这两个文件复制到system/system32如我的是c:windowssystem里</p><p>配置apache里的httpd.conf</p><p>打开 D:phpApacheconfhttpd.conf 这个文件</p><p>找到 AddDefaultCharset ISO-8859-1 将其改为</p><p>AddDefaultCharset GB2312 （让默认语言编码为简体中文）</p><p>找到 DocumentRoot &quot;D:/php/Apache2/htdocs&quot; 将其改为你的WEB目录,如我的为</p><p>DocumentRoot &quot;D:/php/www&quot;</p><p>找到 DirectoryIndex index.html index.html.var 在后面加入 index.htm index.php (默认index.php为首页文件)</p><p>--------------模块化安装PHP----------------------------------------<br />找到 #LoadModule ssl_module modules/mod_ssl.so 这行，在此行后加入一行</p><p>LoadModule php5_module d:/php/php/php5apache2.dll</p><p>其中d:/php/php/php5apache2.dll 为你php目录中php5apache2.dll所在的位置</p><p>再找到 AddType application/x-gzip .gz .tgz 这行，在此行后加入一行</p><p>AddType application/x-httpd-php .php</p><p>(其实:上面两行红色的,你可以直接加在httpd.conf文件的最后面也可以的)<br />--------------------------------------------------------------------</p><p>此时PHP环境基本已经配置成功 <br />在WEB根目录（如我的D:phpwww）里建一个名为test.php (提示:用记事本的朋友,请避免文件为test.php.txt) ,的文件内容如下 <br />PHP代码:<br />&lt;? echo phpinfo(); ?&gt; <br />重新启动apache服务<br />用浏览器打开 <a href="http://localhost/test.php">http://localhost/test.php</a><br />如果可以看到php配置输出信息就OK了<br />(如果看到的是下载页面或者&lt;? echo phpinfo(); ?&gt;,请查查你所做的与上面是否有错漏)</p><p><br />三、配置php.ini并测试mysql、GD2（php.ini为 c:windows下的 php.ini）</p><p><br />找到<br />;extension=php_mysql.dll <br />将';'去掉改为.</p><p>extension=php_mysql.dll<br />&nbsp;<br />找到<br />;extension=php_gd2.dll 去掉前面的; 以便支持GD库.如<br />&nbsp;<br />extension=php_gd2.dll </p><p>找到<br />;session.save_path = &quot;/tmp&quot;<br />将';'去掉.设置你保存session的目录，如</p><p>session.save_path = &quot;d:/Temp&quot;;</p><p><br />重启apache服务<br />在Web根目录下（如 D:phpwww）建立testdb.php文件内容如下： <br />PHP代码:<br />&lt;?php<br />$link=mysql_connect('localhost','root','123456'); //这里的root和123456是MYSQL的用户和密码,请根据你自己的情况改好<br />if(!$link) echo &quot;fail&quot;;<br />else echo &quot;success&quot;;<br />mysql_close();<br />?&gt; <br />用浏览器打开<a href="http://localhost/testdb.php">http://localhost/testdb.php</a> 如果输出success就OK了</p><p>四、phpmyadmin的安装配置</p><p>将phpMyAdmin-2.6.1.zip解压到WEB根目录(d:phpwww中去)，重命名文件夹为phpmyadmin或其它<br />打开phpmyadmin 目录中的 config.inc.php<br />找到以下这些(以下我已改好):</p><p>$cfg['PmaAbsoluteUri'] = 'http://localhost/phpmyadmin';&nbsp; //假设是有域名的服务器,可改成http://域名/phpmyadmin</p><p><br />$cfg['Servers'][$i]['user'] = 'root'; </p><p>$cfg['Servers'][$i]['password'] = 'easy; //分别填上你mysql的用户和密码即可</p><p>$cfg['Servers'][$i]['auth_type'] = 'http'; // 这里也可以改为cookie或者是config</p><p>&nbsp;</p><p>改好了保存,在浏览器打开<a href="http://localhost/phpmyadmin">http://localhost/phpmyadmin</a> 输入你的用户名和密码,便可以管理mysql了</p><p><br />差不多了,如果你想让你的PHP代码执行得更快,就再装个Zend Optimizer.<br />可到<a href="http://down.phpv.net/soft/379.htm">http://down.phpv.net/soft/379.htm</a>下载</p><p>方法是:下载后双击,选择路径安装.问PHP.INI路径就填 c:/windows </p><p>装好重启apache服务.再看<a href="http://localhost/test.php">http://localhost/test.php</a> 时应该看到会多一些东西 </p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://hf200012.javaeye.com/blog/158782#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Jan 2008 16:43:06 +0800</pubDate>
        <link>http://hf200012.javaeye.com/blog/158782</link>
        <guid>http://hf200012.javaeye.com/blog/158782</guid>
      </item>
      <item>
        <title>Apache+JK+Tomcat负载平衡配置 </title>
        <author>hf200012</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hf200012.javaeye.com">hf200012</a>&nbsp;
          链接：<a href="http://hf200012.javaeye.com/blog/157521" style="color:red;">http://hf200012.javaeye.com/blog/157521</a>&nbsp;
          发表时间: 2008年01月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2 style="margin: 13pt 0cm"><span style="font-family: 黑体">准备软件</span></h2><p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体"><span>1、<span style="font-weight: normal; font-size: 7pt; line-height: normal; font-style: normal; font-variant: normal">&nbsp; </span></span></span><span style="font-family: 宋体">Tomcat</span><span style="font-family: 宋体">或<span>JBoss</span>（本文档中采用的是<span>JBoss4.0.2</span>）；</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体"><span>2、<span style="font-weight: normal; font-size: 7pt; line-height: normal; font-style: normal; font-variant: normal">&nbsp; </span></span></span><span style="font-family: 宋体">apache2.0.54</span><span style="font-family: 宋体">是开源的<span>Web</span>服务器，下载地址为： <span><a href="http://www.apache.org/dist/httpd/binaries/">http://www.apache.org/dist/httpd/binaries/</a> </span>；</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体"><span>3、<span style="font-weight: normal; font-size: 7pt; line-height: normal; font-style: normal; font-variant: normal">&nbsp; </span></span></span><span>mod_jk-1.2.14-apache-2.0.54.so</span><span style="font-family: 宋体">模块<span>,jk</span>是<span>mod_jserv</span>的替代者，它是<span>Tomcat-Apache</span>插件，为<span>Apache</span>和<span>Tomcat</span>的连接器，处理<span>Tomcat</span>和<span>Apache</span>之间的通信，在集群配置中充当负载均衡器的作用，当前的最新版本为<span>1.2.15</span>，不过不同<span>JK</span>版本与不同的<span>Apache</span>版本之间的搭配有一些差异，有的甚至配不起来。<span>JK2</span>是符合<span>apache2.x</span>系列的新品，但由于其配置太过麻烦，使用的人很少，所以目前已停止开发，所以我们采用了<span>jk</span>连接器，下载地址：<span><a href="http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/">http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/</a></span>。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><h2 style="margin: 13pt 0cm"><span style="font-family: 黑体">集群与负载平衡</span></h2><p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; word-break: break-all; text-indent: 21pt; line-height: 16.5pt; text-align: left"><span style="font-family: 宋体">使用</span><span>mod_jk</span><span style="font-family: 宋体">默认的以轮循方式进行平衡负载，假设有四个服务器节点，有</span><span>10</span><span style="font-family: 宋体">个请求，则四个节点分别接受请求编号如下：</span></p><div align="center"><table class="MsoNormalTable" cellspacing="0" border="1" cellpadding="0"><tbody><tr><td valign="top" style="background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center"><span style="font-size: 9pt; color: black; line-height: 145%; font-family: 宋体">节点</span><span style="font-size: 9pt; color: black; line-height: 145%; font-family: Arial">1</span></p><p>&nbsp;</p></td><td valign="top" style="background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center"><span style="font-size: 9pt; color: black; line-height: 145%; font-family: 宋体">节点</span><span style="font-size: 9pt; color: black; line-height: 145%; font-family: Arial">2</span></p><p>&nbsp;</p></td><td valign="top" style="background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center"><span style="font-size: 9pt; color: black; line-height: 145%; font-family: 宋体">节点</span><span style="font-size: 9pt; color: black; line-height: 145%; font-family: Arial">3</span></p><p>&nbsp;</p></td><td valign="top" style="background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center"><span style="font-size: 9pt; color: black; line-height: 145%; font-family: 宋体">节点</span><span style="font-size: 9pt; color: black; line-height: 145%; font-family: Arial">4</span></p><p>&nbsp;</p></td></tr><tr style="height: 11.5pt"><td valign="top" style="height: 11.5pt; background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center"><span style="font-size: 9pt; color: black; line-height: 145%; font-family: Arial">1</span></p><p>&nbsp;</p></td><td valign="top" style="height: 11.5pt; background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center"><span style="font-size: 9pt; color: black; line-height: 145%; font-family: Arial">2</span></p><p>&nbsp;</p></td><td valign="top" style="height: 11.5pt; background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center"><span style="font-size: 9pt; color: black; line-height: 145%; font-family: Arial">3</span></p><p>&nbsp;</p></td><td valign="top" style="height: 11.5pt; background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center"><span style="font-size: 9pt; color: black; line-height: 145%; font-family: Arial">4</span></p><p>&nbsp;</p></td></tr><tr style="height: 10.4pt"><td valign="top" style="height: 10.4pt; background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center"><span style="font-size: 9pt; color: black; line-height: 145%; font-family: Arial">5</span></p><p>&nbsp;</p></td><td valign="top" style="height: 10.4pt; background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center"><span style="font-size: 9pt; color: black; line-height: 145%; font-family: Arial">6</span></p><p>&nbsp;</p></td><td valign="top" style="height: 10.4pt; background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center"><span style="font-size: 9pt; color: black; line-height: 145%; font-family: Arial">7</span></p><p>&nbsp;</p></td><td valign="top" style="height: 10.4pt; background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center"><span style="font-size: 9pt; color: black; line-height: 145%; font-family: Arial">8</span></p><p>&nbsp;</p></td></tr><tr style="height: 10pt"><td valign="top" style="height: 10pt; background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center"><span style="font-size: 9pt; color: black; line-height: 145%; font-family: Arial">9</span></p><p>&nbsp;</p></td><td valign="top" style="height: 10pt; background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center"><span style="font-size: 9pt; color: black; line-height: 145%; font-family: Arial">10</span></p><p>&nbsp;</p></td><td valign="top" style="height: 10pt; background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center">&nbsp;</p><p>&nbsp;</p></td><td valign="top" style="height: 10pt; background-color: transparent; border: #d4d0c8; padding: 0cm"><p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; line-height: 145%; text-align: center">&nbsp;</p><p>&nbsp;</p></td></tr></tbody></table></div><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">而集群方式也是使用这种方法进行平衡。</span><span>Tomcat</span><span style="font-family: 宋体">中的集群原理是通过组播的方式进行节点的查找并使用</span><span>TCP</span><span style="font-family: 宋体">连接进行会话的复制。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体">集群不同于负载平衡的是，由于集群服务需要在处理请求之间不断地进行会话复制，复制后的会话将会慢慢变得庞大，因此它的资源占用率是非常高的，如果在并发量大的应用中，复制的会话大小会变得相当大，而使用的总内存更是会迅速升高。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体">但集群的会话复制，增加了系统的高可用性。由于在每台服务器都保存有用户的</span><span>Session</span><span style="font-family: 宋体">信息，如果服务器群中某台当机，应用可以自动切换到其它服务器上继续运行，而用户的信息不会丢失，这提高了应用的冗错性。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">具体采用负载平衡还是集群，这要看应用的需求了。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><h2 style="margin: 13pt 0cm"><span style="font-family: 黑体">安装配置</span><span>Apache</span></h2><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>1</span><span style="font-family: 宋体">、下载</span><span>Apache</span><span style="font-family: 宋体">的安装程序</span><span>apache_2.0.54-win32-x86-no_ssl.exe</span><span style="font-family: 宋体">后，安装很简单，一路回车，就此略过。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>2</span><span style="font-family: 宋体">、安装完毕后，将下载的</span><span>mod_jk-1.2.14-apache-2.0.54.so</span><span style="font-family: 宋体">复制到</span><span>Apache</span><span style="font-family: 宋体">安装目录下的</span><span>modules</span><span style="font-family: 宋体">子目录中。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>3</span><span style="font-family: 宋体">、然后进入</span><span>Apache</span><span style="font-family: 宋体">安装目录下的</span><span>conf</span><span style="font-family: 宋体">子目录中，打开</span><span>httpd.conf</span><span style="font-family: 宋体">配置文件，在最后插入以下一行：</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="color: blue">Include conf/mod_jk.conf</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span><span>4、<span style="font-weight: normal; font-size: 7pt; line-height: normal; font-style: normal; font-variant: normal">&nbsp; </span></span></span><span style="font-family: 宋体">在</span><span>conf</span><span style="font-family: 宋体">子目录下，建立一个新的配置文件：</span><span>mod_jk.conf</span><span style="font-family: 宋体">，此文件为</span><span>Apache</span><span style="font-family: 宋体">加载连接器的配置文件，文件名可修改，但要与</span><span>httpd.conf</span><span style="font-family: 宋体">中</span><span>Include</span><span style="font-family: 宋体">的文件名一致，内容如下：</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span># Load mod_jk module. Specify the filename</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span># of the mod_jk lib you&rsquo;ve downloaded and</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span># installed in the previous section</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>#</span><span style="font-family: 宋体">加载</span><span>mod_jk</span><span style="font-family: 宋体">模块</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="color: blue">LoadModule jk_module modules/mod_jk-1.2.14-apache-2.0.54.so</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span># Where to find workers.properties</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>JkWorkersFile conf/workers2.properties</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span># Where to put jk logs</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>JkLogFile logs/mod_jk.log</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span># Set the jk log level [debug/error/info]</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>JkLogLevel info</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span># Select the log format</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>JkLogStampFormat &quot;[%a %b %d %H:%M:%S %Y] &quot;</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span># JkOptions indicate to send SSL KEY SIZE,</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span># JkRequestLogFormat set the request format</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>JkRequestLogFormat &quot;%w %V %T&quot;</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span># </span><span style="font-family: 宋体">请求分发配置，可以配置多项</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="color: blue">JkMount /* loadbalancer</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>#</span><span style="font-family: 宋体">关掉主机</span><span>Lookup</span><span style="font-family: 宋体">，如果为</span><span>on</span><span style="font-family: 宋体">，很影响性能，可以有</span><span>10</span><span style="font-family: 宋体">多秒钟的延迟。</span><span><br />HostnameLookups&nbsp;Off</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 21.1pt; text-indent: -21.1pt"><span style="color: red; font-family: 宋体">注：</span><span style="color: black; font-family: 宋体">蓝色加粗的两行是重点，第一句是</span><span style="color: black">Apache</span><span style="color: black; font-family: 宋体">加载</span><span style="color: black">JK</span><span style="color: black; font-family: 宋体">模块用的；第二句为配置哪些</span><span style="color: black">URL</span><span style="color: black; font-family: 宋体">请求将由负载平衡器来处理。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span><span>5、<span style="font-weight: normal; font-size: 7pt; line-height: normal; font-style: normal; font-variant: normal">&nbsp; </span></span></span><span style="font-family: 宋体">在</span><span>conf</span><span style="font-family: 宋体">子目录下，建立一个新的配置文件：</span><span>workers2.properties</span><span style="font-family: 宋体">，此文件为负载平衡的配置文件，文件名不能修改，这是</span><span>JK</span><span style="font-family: 宋体">默认的名字，内容如下：</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="color: blue">worker.list=loadbalancer</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span># Define the first node...</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server99.port=8009</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server99.host=192.168.11.99</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server99.type=ajp13</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="color: blue">worker.server99.lbfactor=1 </span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server99.local_worker=1</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server99.cachesize=1000</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server99.cache_timeout=600</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server99.socket_keepalive=1</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server99.socket_timeout=0</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server99.reclycle_timeout=300</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server99.retries=3</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span># Define the second node...</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server202.port=8009</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server202.host=192.168.11.202</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server202.type=ajp13</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="color: blue">worker.server202.lbfactor=1</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server202.local_worker=1</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server202.cachesize=1000</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server202.cache_timeout=600</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server202.socket_keepalive=1</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server202.socket_timeout=0</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server202.reclycle_timeout=300</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.server202.retries=3</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span># Now we define the load-balancing behaviour</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.loadbalancer.type=lb</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>worker.retries=3</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="color: blue">worker.loadbalancer.balance_workers=server99 ,server202</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="color: blue">worker.loadbalancer.sticky_session=true</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="color: blue">worker.loadbalancer.sticky_session_force=true</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 21.1pt; text-indent: -21.1pt"><span style="color: red; font-family: 宋体">注：</span><span style="font-family: 宋体">以上定义了两个</span><span>worker</span><span style="font-family: 宋体">，一个为</span><span>server99</span><span style="font-family: 宋体">，另一个为</span><span>server202</span><span style="font-family: 宋体">，定义了一个负载平衡服务器</span><span>loadbalancer</span><span style="font-family: 宋体">，其中标蓝色的为重点配置项，相关的详细说明可以看官方的网站文档：</span><span><a href="http://tomcat.apache.org/connectors-doc/">http://tomcat.apache.org/connectors-doc/</a></span><span style="font-family: 宋体">，其它节点的定义可以直接</span><span>Copy</span><span style="font-family: 宋体">，修改一下节点名及</span><span>IP</span><span style="font-family: 宋体">就好了。</span><span><br />A</span><span style="font-family: 宋体">、</span><span>worker.list=loadbalancer</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 15.75pt"><span style="font-family: 宋体">设定工作的负载平衡器，各</span><span>Tomcat</span><span style="font-family: 宋体">节点不能加入此列表。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span><span>&nbsp;&nbsp;&nbsp; </span>B</span><span style="font-family: 宋体">、</span><span>worker.server99.lbfactor</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 36.75pt"><span style="font-family: 宋体">负载平衡的权重比，如果此权重比越大，则分配到此节点的请求越多，如以上两个节点的权重比为</span><span>1:1</span><span style="font-family: 宋体">，则为平均分配。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><span>C</span><span style="font-family: 宋体">、</span><span>worker.loadbalancer.balance_workers=server99,server202</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><span><span>&nbsp;&nbsp; </span></span><span style="font-family: 宋体">指定此负载平衡器负责的</span><span>Tomcat</span><span style="font-family: 宋体">应用节点。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt"><span>D</span><span style="font-family: 宋体">、</span><span>worker.loadbalancer.sticky_session=true</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 37.5pt; text-indent: -15.75pt"><span><span>&nbsp;&nbsp; </span></span><span style="font-family: 宋体">此处指定集群是否需要会话复制，如果设为</span><span>true</span><span style="font-family: 宋体">，则表明为会话粘性，不进行会话复制，当某用户的请求第一次分发到哪台</span><span>Tomcat</span><span style="font-family: 宋体">后，后继的请求会一直分发到此</span><span>Tomcat</span><span style="font-family: 宋体">服务器上处理；如果设为</span><span>false</span><span style="font-family: 宋体">，则表明需求会话复制。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 37.5pt; text-indent: -15.75pt"><span>E</span><span style="font-family: 宋体">、</span><span>worker.loadbalancer.sticky_session_force=true</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 37.5pt; text-indent: -15.75pt"><span><span>&nbsp;&nbsp; </span></span><span style="font-family: 宋体">如果上面的</span><span>sticky_session</span><span style="font-family: 宋体">设为</span><span>true</span><span style="font-family: 宋体">时，建议此处也设为</span><span>true</span><span style="font-family: 宋体">，此参数表明如果集群中某台</span><span>Tomcat</span><span style="font-family: 宋体">服务器在多次请求没有响应后，是否将当前的请求，转发到其它</span><span>Tomcat</span><span style="font-family: 宋体">服务器上处理；此参数在</span><span>sticky_session=true</span><span style="font-family: 宋体">时，影响比较大，会导致转发到其它</span><span>Tomcat</span><span style="font-family: 宋体">服务器上的请求，找不到原来的</span><span>session</span><span style="font-family: 宋体">，所以如果此时请求中有读取</span><span>session</span><span style="font-family: 宋体">中某些信息的话，就会导致应用的</span><span>null</span><span style="font-family: 宋体">异常。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>6</span><span style="font-family: 宋体">、</span><span>Apache</span><span style="font-family: 宋体">服务器的配置文件</span><span>httpd.conf</span><span style="font-family: 宋体">中，默认有三个参数对性能的影响比较大，但根据不同的性能要求，参数的表现又不一样，太小并发提不上去，太大性能反而不好，建议根据项目的需要，实际做个测试，如并发要求</span><span>800</span><span style="font-family: 宋体">的话，可以设定为：</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>#</span><span style="font-family: 宋体">一个连接的最大请求数量</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>MaxKeepAliveRequests</span><span style="font-family: 宋体">　</span><span>1000</span><span style="font-family: 宋体">（值为</span><span>0</span><span style="font-family: 宋体">，则不限制数量）</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>#</span><span style="font-family: 宋体">每个进程的线程数，最大</span><span>1920</span><span style="font-family: 宋体">。</span><span>NT</span><span style="font-family: 宋体">只启动父子两个进程，不能设置启动多个进程</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>ThreadsPerChild</span><span style="font-family: 宋体">　　　　</span><span>1000</span><span style="font-family: 宋体">（最大为</span><span>1920</span><span style="font-family: 宋体">）</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>#</span><span style="font-family: 宋体">每个子进程能够处理的最大请求数</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>MaxRequestsPerChild<span>&nbsp;&nbsp; </span>1000</span><span style="font-family: 宋体">（值为</span><span>0</span><span style="font-family: 宋体">，则不限制数量）</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">这三个参数要根据不同的需求，不同的服务器进行调整。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><h2 style="margin: 13pt 0cm"><span style="font-family: 黑体">安装配置</span><span>Tomcat</span><span style="font-family: 黑体">或</span><span>JBoss</span></h2><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>1</span><span style="font-family: 宋体">、对于</span><span>Tomcat</span><span style="font-family: 宋体">或</span><span>JBoss</span><span style="font-family: 宋体">的安装，这里不做说明，目前我们是采用</span><span>Apache+JBoss</span><span style="font-family: 宋体">，不过，</span><span>JBoss</span><span style="font-family: 宋体">也是用的</span><span>Tomcat</span><span style="font-family: 宋体">，所以这里的配置也是适合</span><span>Tomcat</span><span style="font-family: 宋体">的；</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>2</span><span style="font-family: 宋体">、对于</span><span>JBoss</span><span style="font-family: 宋体">的配置，很简单，只需要改两个地方就可以了：</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 26.25pt; text-indent: -26.25pt"><span style="font-family: 宋体">第一个地方：进入</span><span>jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar</span><span style="font-family: 宋体">，打开</span><span>server.xml</span><span style="font-family: 宋体">，大约在第</span><span>32</span><span style="font-family: 宋体">行左右，有</span><span></span><span style="font-family: 宋体">，在其中加入一个参数，变为：</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 42pt"><span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 26.25pt; text-indent: -26.25pt"><span style="font-family: 宋体">第二个地方：进入</span><span>jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar\META-INF</span><span style="font-family: 宋体">目录，打开</span><span>jboss-service.xml</span><span style="font-family: 宋体">，大约在</span><span>110</span><span style="font-family: 宋体">行，有</span><span>false</span><span style="font-family: 宋体">，将其改为：</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 42pt"><span>true</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">这里有一个需要特别注意的地方，</span><span>JBoss</span><span style="font-family: 宋体">的</span><span>Tomcat</span><span style="font-family: 宋体">中，关于</span><span>AJP</span><span style="font-family: 宋体">连接协议的默认配置，对于大并发量是不够用的，要做一些修改，进入</span><span>jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar</span><span style="font-family: 宋体">，打开</span><span>server.xml</span><span style="font-family: 宋体">，找到</span><span><!-- A AJP 1.3 Connector on port 8009 --></span><span style="font-family: 宋体">的地方，这里是定义</span><span>AJP</span><span style="font-family: 宋体">连接器的地方，它的配置中没有</span><span>maxThreads</span><span style="font-family: 宋体">项，默认为</span><span>200</span><span style="font-family: 宋体">，我们可以做修改：</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>emptySessionPath=&quot;true&quot; enableLookups=&quot;false&quot; redirectPort=&quot;8443&quot; </span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>protocol=&quot;AJP/1.3&quot; <span style="color: blue">maxThreads=&quot;3000&quot;</span>/&gt;</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>maxThreads</span><span style="font-family: 宋体">的值要看你的并发量多大，设置太大也不好。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><h2 style="margin: 13pt 0cm"><span style="font-family: 黑体">运行</span></h2><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">至此，整个配置全部完成，注意一点是，在各</span><span>JBoss</span><span style="font-family: 宋体">节点，重启或新增加一个</span><span>JBoss</span><span style="font-family: 宋体">节点时，需要重新启动</span><span>Apache</span><span style="font-family: 宋体">，而对于服务器群中某个</span><span>JBoss</span><span style="font-family: 宋体">节点</span><span>shutdown</span><span style="font-family: 宋体">，</span><span>Apache</span><span style="font-family: 宋体">会自动侦测，不用重新启动。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">如果在运行过程中，群中的某个</span><span>JBoss</span><span style="font-family: 宋体">节点</span><span>shutdown</span><span style="font-family: 宋体">，则已登录到此服务器上的用户的请求将出错，此服务器负责的</span><span>session</span><span style="font-family: 宋体">将丢失，但</span><span>Apache</span><span style="font-family: 宋体">会自动侦测到此服务器已</span><span>shutdown</span><span style="font-family: 宋体">，后继的新请求将不会再引导到此节点。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">对于负责请求分发的</span><span>Apache</span><span style="font-family: 宋体">服务器，需要消耗大量的</span><span>CPU</span><span style="font-family: 宋体">资源，因此如果在测试过程中出现一些</span><span>Service&nbsp;Temporarily&nbsp;Unavailable</span><span style="font-family: 宋体">或</span><span>Server&nbsp;&nbsp;has&nbsp;shut&nbsp;down&nbsp;the&nbsp;connection&nbsp;prematurely</span><span style="font-family: 宋体">这样的错误，这一般都是服务器配置不够好引起的，或者是</span><span>Apache</span><span style="font-family: 宋体">、</span><span>Tomcat</span><span style="font-family: 宋体">、及应用中的某些配置不够使用，这时候就要考虑换更好的机器或优化应用中的配置。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="font-size: 16pt; font-family: 黑体">常见问题</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体">一、</span><span>cannot&nbsp;connect&nbsp;to&nbsp;server</span><span style="font-family: 宋体">：无法连接到服务器。这种情况是服务器的配置有问题，服务器无法承受过多的并发连接了，需要优化服务器的配置：</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span style="font-family: 宋体">如操作系统采用更高版本，如</span><span>windows&nbsp;2003&nbsp;server</span><span style="font-family: 宋体">，</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span style="font-family: 宋体">优化</span><span>tomcat</span><span style="font-family: 宋体">配置：</span><span>maxThreads=&quot;500&quot;&nbsp;minSpareThreads=&quot;400&quot;&nbsp;maxSpareThreads=&quot;450&quot;</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span style="font-family: 宋体">但是</span><span>tomcat&nbsp;</span><span style="font-family: 宋体">最多支持</span><span>500</span><span style="font-family: 宋体">个并发访问</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span style="font-family: 宋体">优化</span><span>apache</span><span style="font-family: 宋体">配置：</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span>ThreadsPerChild&nbsp;1900 </span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span>MaxRequestsPerChild&nbsp;&nbsp;10000</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">二、</span><span>&nbsp;Action.c(10):&nbsp;Error&nbsp;-27791:&nbsp;Server&nbsp;&nbsp;has&nbsp;shut&nbsp;down&nbsp;the&nbsp;connection&nbsp;prematurely</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><span>HTTP&nbsp;Status-Code=503&nbsp;(Service&nbsp;Temporarily&nbsp;Unavailable)<br /></span><span style="font-family: 宋体">一般都是由于服务器配置不够好引起的，需要优化硬件和调整程序了。</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt">&nbsp;</p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">三、无法处理请求：</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">当我们输入</span><span>&nbsp;***.do&nbsp;</span><span style="font-family: 宋体">命令后，</span><span>apache</span><span style="font-family: 宋体">却返回错误信息，而连接</span><span>tomcat</span><span style="font-family: 宋体">却没有问题。原因是没有把</span><span>.do</span><span style="font-family: 宋体">命令转发给</span><span>tomcat</span><span style="font-family: 宋体">处理。解决方法如下：</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">在</span><span>apache</span><span style="font-family: 宋体">配置文件中配置如下内容：</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>JkMount&nbsp;/*.jsp&nbsp;loadbalancer</span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>JkMount&nbsp;/*.do&nbsp;loadbalancer</span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://hf200012.javaeye.com/blog/157521#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 18 Jan 2008 23:48:50 +0800</pubDate>
        <link>http://hf200012.javaeye.com/blog/157521</link>
        <guid>http://hf200012.javaeye.com/blog/157521</guid>
      </item>
      <item>
        <title>Java异常分析</title>
        <author>hf200012</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hf200012.javaeye.com">hf200012</a>&nbsp;
          链接：<a href="http://hf200012.javaeye.com/blog/152825" style="color:red;">http://hf200012.javaeye.com/blog/152825</a>&nbsp;
          发表时间: 2008年01月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>算术异常类：ArithmeticExecption</p><p>空指针异常类：NullPointerException</p><p>类型强制转换异常：ClassCastException</p><p>数组负下标异常：NegativeArrayException</p><p>数组下标越界异常：ArrayIndexOutOfBoundsException</p><p>违背安全原则异常：SecturityException</p><p>文件已结束异常：EOFException</p><p>文件未找到异常：FileNotFoundException</p><p>字符串转换为数字异常：NumberFormatException</p><p><br />操作数据库异常：SQLException</p><p><br />输入输出异常：IOException</p><p><br />方法未找到异常：NoSuchMethodException</p><p>java.lang.AbstractMethodError</p><p>抽象方法错误。当应用试图调用抽象方法时抛出。</p><p>java.lang.AssertionError</p><p>断言错。用来指示一个断言失败的情况。</p><p>java.lang.ClassCircularityError</p><p>类循环依赖错误。在初始化一个类时，若检测到类之间循环依赖则抛出该异常。</p><p>java.lang.ClassFormatError</p><p>类格式错误。当Java虚拟机试图从一个文件中读取Java类，而检测到该文件的内容不符合类的有效格式时抛出。</p><p>java.lang.Error</p><p>错误。是所有错误的基类，用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况。</p><p>java.lang.ExceptionInInitializerError</p><p>初始化程序错误。当执行一个类的静态初始化程序的过程中，发生了异常时抛出。静态初始化程序是指直接包含于类中的static语句段。</p><p>java.lang.IllegalAccessError</p><p>违法访问错误。当一个应用试图访问、修改某个类的域（Field）或者调用其方法，但是又违反域或方法的可见性声明，则抛出该异常。</p><p>java.lang.IncompatibleClassChangeError</p><p>不兼容的类变化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时，抛出该异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新编译而直接运行的情况下，容易引发该错误。</p><p>java.lang.InstantiationError</p><p>实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常.</p><p>java.lang.InternalError</p><p>内部错误。用于指示Java虚拟机发生了内部错误。</p><p>java.lang.LinkageError</p><p>链接错误。该错误及其所有子类指示某个类依赖于另外一些类，在该类编译之后，被依赖的类改变了其类定义而没有重新编译所有的类，进而引发错误的情况。</p><p>java.lang.NoClassDefFoundError</p><p>未找到类定义错误。当Java虚拟机或者类装载器试图实例化某个类，而找不到该类的定义时抛出该错误。</p><p>java.lang.NoSuchFieldError</p><p>域不存在错误。当应用试图访问或者修改某类的某个域，而该类的定义中没有该域的定义时抛出该错误。</p><p>java.lang.NoSuchMethodError</p><p>方法不存在错误。当应用试图调用某类的某个方法，而该类的定义中没有该方法的定义时抛出该错误。</p><p>java.lang.OutOfMemoryError</p><p>内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。</p><p>java.lang.StackOverflowError</p><p>堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。</p><p>java.lang.ThreadDeath</p><p>线程结束。当调用Thread类的stop方法时抛出该错误，用于指示线程结束。</p><p>java.lang.UnknownError</p><p>未知错误。用于指示Java虚拟机发生了未知严重错误的情况。</p><p>java.lang.UnsatisfiedLinkError</p><p>未满足的链接错误。当Java虚拟机未找到某个类的声明为native方法的本机语言定义时抛出。</p><p>java.lang.UnsupportedClassVersionError</p><p>不支持的类版本错误。当Java虚拟机试图从读取某个类文件，但是发现该文件的主、次版本号不被当前Java虚拟机支持的时候，抛出该错误。</p><p>java.lang.VerifyError</p><p>验证错误。当验证器检测到某个类文件中存在内部不兼容或者安全问题时抛出该错误。</p><p>java.lang.VirtualMachineError</p><p>虚拟机错误。用于指示虚拟机被破坏或者继续执行操作所需的资源不足的情况。</p><p><br />java.lang.ArithmeticException</p><p>算术条件异常。譬如：整数除零等。</p><p>java.lang.ArrayIndexOutOfBoundsException</p><p>数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。</p><p>java.lang.ArrayStoreException</p><p>数组存储异常。当向数组中存放非数组声明类型对象时抛出。</p><p>java.lang.ClassCastException</p><p>类造型异常。假设有类A和B（A不是B的父类或子类），O是A的实例，那么当强制将O构造为类B的实例时抛出该异常。该异常经常被称为强制类型转换异常。</p><p>java.lang.ClassNotFoundException</p><p>找不到类异常。当应用试图根据字符串形式的类名构造类，而在遍历CLASSPAH之后找不到对应名称的class文件时，抛出该异常。</p><p>java.lang.CloneNotSupportedException</p><p>不支持克隆异常。当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。</p><p>java.lang.EnumConstantNotPresentException</p><p>枚举常量不存在异常。当应用试图通过名称和枚举类型访问一个枚举对象，但该枚举对象并不包含常量时，抛出该异常。</p><p>java.lang.Exception</p><p>根异常。用以描述应用程序希望捕获的情况。</p><p>java.lang.IllegalAccessException</p><p>违法的访问异常。当应用试图通过反射方式创建某个类的实例、访问该类属性、调用该类方法，而当时又无法访问类的、属性的、方法的或构造方法的定义时抛出该异常。</p><p>java.lang.IllegalMonitorStateException</p><p>违法的监控状态异常。当某个线程试图等待一个自己并不拥有的对象（O）的监控器或者通知其他线程等待该对象（O）的监控器时，抛出该异常。</p><p>java.lang.IllegalStateException</p><p>违法的状态异常。当在Java环境和应用尚未处于某个方法的合法调用状态，而调用了该方法时，抛出该异常。</p><p>java.lang.IllegalThreadStateException</p><p>违法的线程状态异常。当县城尚未处于某个方法的合法调用状态，而调用了该方法时，抛出异常。</p><p>java.lang.IndexOutOfBoundsException</p><p>索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时，抛出该异常。</p><p>java.lang.InstantiationException</p><p>实例化异常。当试图通过newInstance()方法创建某个类的实例，而该类是一个抽象类或接口时，抛出该异常。</p><p>java.lang.InterruptedException</p><p>被中止异常。当某个线程处于长时间的等待、休眠或其他暂停状态，而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常。</p><p>java.lang.NegativeArraySizeException</p><p>数组大小为负值异常。当使用负数大小值创建数组时抛出该异常。</p><p>java.lang.NoSuchFieldException</p><p>属性不存在异常。当访问某个类的不存在的属性时抛出该异常。</p><p>java.lang.NoSuchMethodException</p><p>方法不存在异常。当访问某个类的不存在的方法时抛出该异常。</p><p>java.lang.NullPointerException</p><p>空指针异常。当应用试图在要求使用对象的地方使用了null时，抛出该异常。譬如：调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。</p><p>java.lang.NumberFormatException</p><p>数字格式异常。当试图将一个String转换为指定的数字类型，而该字符串确不满足数字类型要求的格式时，抛出该异常。</p><p>java.lang.RuntimeException</p><p>运行时异常。是所有Java虚拟机正常操作期间可以被抛出的异常的父类。</p><p>java.lang.SecurityException</p><p>安全异常。由安全管理器抛出，用于指示违反安全情况的异常。</p><p>java.lang.StringIndexOutOfBoundsException</p><p>字符串索引越界异常。当使用索引值访问某个字符串中的字符，而该索引值小于0或大于等于序列大小时，抛出该异常。</p><p>java.lang.TypeNotPresentException</p><p>类型不存在异常。当应用试图以某个类型名称的字符串表达方式访问该类型，但是根据给定的名称又找不到该类型是抛出该异常。该异常与ClassNotFoundException的区别在于该异常是unchecked（不被检查）异常，而ClassNotFoundException是checked（被检查）异常。</p><p>java.lang.UnsupportedOperationException</p><p>不支持的方法异常。指明请求的方法不被支持情况的异常。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://hf200012.javaeye.com/blog/152825#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Jan 2008 15:14:40 +0800</pubDate>
        <link>http://hf200012.javaeye.com/blog/152825</link>
        <guid>http://hf200012.javaeye.com/blog/152825</guid>
      </item>
      <item>
        <title>不断的测试，产品就会不断的改进</title>
        <author>hf200012</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hf200012.javaeye.com">hf200012</a>&nbsp;
          链接：<a href="http://hf200012.javaeye.com/blog/150281" style="color:red;">http://hf200012.javaeye.com/blog/150281</a>&nbsp;
          发表时间: 2007年12月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial"><strong>什么是软件测试？</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关于软件测试的定义，比较权威的是IEEE在1983年提出的：&ldquo;使用人工或自动手段来运行或测定某个系统的过程，其目的在于检验它是否满足规定的需求或是弄清预期结果与实际结果之间的差别。&rdquo;</font></p>
<p><strong>软件测