<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_皓浪－技术交流</title><subtitle type="text">Code Explorer</subtitle><id>http://feed.cnblogs.com/blog/u/33310/rss</id><updated>2011-12-07T15:12:44Z</updated><author><name>张皓</name><uri>http://www.cnblogs.com/zhmore/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhmore/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/33310/rss"/><entry><id>http://www.cnblogs.com/zhmore/archive/2011/12/07/2280029.html</id><title type="text">Stereoscopic Player 1.7.4 (SSP) 加载字幕</title><summary type="text">Stereoscopic Player官方提供的DivX设置方法在老版本好使，可是在1.7.4里面死活找不到，最后网上找到办法设置，分享下：需要安装FFDSHOW解码器（终极解码亦可）。然后如下设置即可打开SSP。文件-设置-解码器-过滤器标签页把画面拉下来-其他音频处理器添加 ffdshow Audio Decoder为第一项视频处理器添加ffdshow raw video fiter为第一项即可。设置后即可挂字幕跟切换音轨了，设置方法有两种：1.双击右下角FFD图标出现页面，勾选字幕，字幕-位置下勾选“3D立体影视”；2.文件-视频属性-过滤器选ffdshow raw filter，点击详</summary><published>2011-12-07T15:12:00Z</published><updated>2011-12-07T15:12:00Z</updated><author><name>张皓</name><uri>http://www.cnblogs.com/zhmore/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhmore/archive/2011/12/07/2280029.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhmore/archive/2011/12/07/2280029.html"/><content type="html">&lt;p&gt;Stereoscopic Player官方提供的DivX设置方法在老版本好使，可是在1.7.4里面死活找不到，最后网上找到办法设置，分享下：&lt;/p&gt;&#xD;
&lt;p&gt;需要安装FFDSHOW解码器（终极解码亦可）。然后如下设置即可&lt;/p&gt;&#xD;
&lt;p&gt;打开SSP。文件-设置-解码器-过滤器标签页把画面拉下来-其他&lt;br /&gt;音频处理器添加 ffdshow Audio Decoder为第一项&lt;br /&gt;视频处理器添加ffdshow raw video fiter为第一项即可。&lt;/p&gt;&#xD;
&lt;p&gt;设置后即可挂字幕跟切换音轨了，设置方法有两种：&lt;br /&gt;1.双击右下角FFD图标出现页面，勾选字幕，字幕-位置下勾选&amp;ldquo;3D立体影视&amp;rdquo;；&lt;br /&gt;2.文件-视频属性-过滤器选ffdshow raw filter，点击详细，设置方法同上。&lt;/p&gt;&#xD;
&lt;p&gt;注意：建议使用sub(srt)格式字幕，其它格式可能无法设置字体大小等格式。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhmore/aggbug/2280029.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhmore/archive/2011/12/07/2280029.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhmore/archive/2011/11/04/2236514.html</id><title type="text">layout_weight体验(实现按比例显示)</title><summary type="text">在android开发中LinearLayout很常用，LinearLayout的内控件的android:layout_weight在某些场景显得非常重要，比如我们需要按比例显示。android并没用提供table这样的控件，虽然有TableLayout，但是它并非是我们想象中的像html里面的table那么好用，我们常用ListView实现table的效果，但是列对齐确比较麻烦，现在用LinearLayout及属性android:layout_weight能很好地解决。下面我们共同体验下layout_weight这个属性。 一、LinearLayout内的控件的layout_width设...</summary><published>2011-11-04T09:50:00Z</published><updated>2011-11-04T09:50:00Z</updated><author><name>张皓</name><uri>http://www.cnblogs.com/zhmore/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhmore/archive/2011/11/04/2236514.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhmore/archive/2011/11/04/2236514.html"/><content type="html">&lt;p&gt;在android开发中LinearLayout很常用，LinearLayout的内控件的android:layout_weight在某些场景显得非常重要，比如我们需要按比例显示。android并没用提供table这样的控件，虽然有TableLayout，但是它并非是我们想象中的像html里面的table那么好用，我们常用ListView实现table的效果，但是列对齐确比较麻烦，现在用LinearLayout及属性android:layout_weight能很好地解决。下面我们共同体验下layout_weight这个属性。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　一、LinearLayout内的控件的layout_width设置为"wrap_content"，请看一下xml配置：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;LinearLayout&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:orientation&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="horizontal"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;     &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TextView&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="wrap_content"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:background&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="#aa0000"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:gravity&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="center"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TextView&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="wrap_content"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="2"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:background&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="#00aa00"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:gravity&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="center"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TextView&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="wrap_content"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="3"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:background&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="#0000aa"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:gravity&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="center"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;LinearLayout&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;效果如下：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/29756/2011110417021047.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可以看到这三个TextView是按照1:2:3的比例进行显示的，这样看来似乎可以实现按照比例显示了，但是有个问题，如果TextView内的文本长度一同那么较长文本的TextView会宽度会有所增加，见下面配置及效果：&lt;/p&gt;&#xD;
&lt;p&gt;配置：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;LinearLayout&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:orientation&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="horizontal"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TextView&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="wrap_content"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:background&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="#aa0000"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:gravity&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="center"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1111111111111111111111111111111111111111111"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TextView&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="wrap_content"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="2"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:background&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="#00aa00"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:gravity&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="center"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="2"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TextView&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="wrap_content"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="3"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:background&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="#0000aa"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:gravity&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="center"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="3"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;LinearLayout&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;效果：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/29756/2011110417062420.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这样看来我们所需要的按比例又无法实现了，经过满天地google终于找到了解决方案，就是设置layout_width设置为"wrap_content"。配置及效果见下：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;LinearLayout&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:orientation&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="horizontal"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TextView&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="0dp"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:background&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="#aa0000"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:gravity&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="center"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1111111111111111111111111111111111111111111"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TextView&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="0dp"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="2"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:background&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="#00aa00"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:gravity&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="center"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="2"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TextView&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="0dp"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="3"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:background&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="#0000aa"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:gravity&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="center"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="3"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;LinearLayout&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;效果：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/29756/2011110417110312.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这样终于达到我们的按比例显示的效果了，感觉很是奇怪，android开发框架的大佬们有时候设计确实有点匪夷所思。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　二、LinearLayout内的控件的layout_width设置为"fill_parent"，请看一下xml配置：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;LinearLayout&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:orientation&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="horizontal"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TextView&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:background&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="#aa0000"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:gravity&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="center"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TextView&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="2"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:background&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="#00aa00"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:gravity&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="center"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="2"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;LinearLayout&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;效果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/29756/2011110417184513.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;奇怪吧，整个宽度平分3块，第一个TextView占了两块，这样看来weight值越小的优先级越大。只有两个TextView似乎看出些道理，那么让我们看看三个是什么效果：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;LinearLayout&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:orientation&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="horizontal"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;      android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TextView&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:background&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="#aa0000"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:gravity&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="center"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="1"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TextView&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="2"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:background&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="#00aa00"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:gravity&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="center"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="2"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;TextView&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;android:layout_width&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_height&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="fill_parent"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:layout_weight&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="3"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:background&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="#0000aa"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:gravity&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="center"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;          android:text&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="3"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;LinearLayout&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;效果：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/29756/2011110417344167.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;什么意思？第三个TextView丢掉了，很是奇怪，让我们再试一个，把weight分别改为2,3,4的看看效果：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/29756/2011110417364083.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个效果让人很困惑，我一直想寻求出一个确切的比例公式，但是至今未找到。有哪位大神能搞定的话忘不吝赐教。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;虽然这个android:layout_weight属性很怪异，但幸运的是我们达到了目标：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　按比例显示LinearLayout内各个子控件，需设置android:layout_width="0dp"，如果为竖直方向的设置android:layout_height="0dp"。在这种情况下某子个控件占用LinearLayout的比例为：本控件weight值 / LinearLayout内所有控件的weight值的和。&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhmore/aggbug/2236514.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhmore/archive/2011/11/04/2236514.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhmore/archive/2011/03/02/1969014.html</id><title type="text">Linux5配置jboss环境</title><summary type="text">Linux5配置jboss环境说明：Linux版本：Redhat Enterprise Linux 5JDK版本：jdk1.6.0_21(安装文件：jdk-6u21-linux-i586-rpm.bin)Jboss版本：jboss-5.1.0.GA进入系统的用户是用root，拥有最大的权限。 1.安装JDK(1)在根目录下面创建JDK目录：＃mkdir jdk,然后用FTP上传你的jdk-6u21-linux-i586-rpm.bin 这个文件到目录下。(2)进入到JDK目录下：＃chmod +x jdk-6u21-linux-i586-rpm.bin 或 #chmod 755 jdk-6u2</summary><published>2011-03-02T08:18:00Z</published><updated>2011-03-02T08:18:00Z</updated><author><name>张皓</name><uri>http://www.cnblogs.com/zhmore/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhmore/archive/2011/03/02/1969014.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhmore/archive/2011/03/02/1969014.html"/><content type="html">&lt;p style="text-align: center;"&gt;&lt;span style="font-size: 16px;"&gt;&lt;strong&gt;Linux5配置jboss环境&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;说明：&lt;br /&gt;&amp;nbsp;Linux版本：Redhat Enterprise Linux 5&lt;/p&gt;&#xD;
&lt;p&gt;JDK版本：jdk1.6.0_21(安装文件：jdk-6u21-linux-i586-rpm.bin)&lt;/p&gt;&#xD;
&lt;p&gt;Jboss版本：jboss-5.1.0.GA&lt;/p&gt;&#xD;
&lt;p&gt;进入系统的用户是用root，拥有最大的权限。&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;1.安装JDK&lt;/p&gt;&#xD;
&lt;p&gt;(1)在根目录下面创建JDK目录：＃mkdir jdk,然后用FTP上传你的jdk-6u21-linux-i586-rpm.bin 这个文件到目录下。&lt;/p&gt;&#xD;
&lt;p&gt;(2)进入到JDK目录下：＃chmod +x jdk-6u21-linux-i586-rpm.bin 或 #chmod 755 jdk-6u21-linux-i586-rpm.bin 设置文件可执行权限；&lt;/p&gt;&#xD;
&lt;p&gt;(3)# ./jdk-6u21-linux-i586-rpm.bin 执行后会发现生成了/usr/java/jdk1.6.0_21/的文件夹，即为java的根目录。&lt;/p&gt;&#xD;
&lt;p&gt;(4)设置环境变量 # vi /etc/profile;这样作的目的是让所有的用户用到。进入编辑模式，添加添加如下设置：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; JAVA_HOME=/usr/java/jdk1.6.0_21&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLASSPATH=.:$JAVA_HOME/lib/tools.jar&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PATH=$JAVA_HOME/bin:$PATH&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; export JAVA_HOME CLASSPATH PATH&lt;/p&gt;&#xD;
&lt;p&gt;写好了以后，我们要重文本模式转换到命令模式，用esc来切换。然后用:wq保存退出。重启机器用#shutdown -r now,用java -version查看JDK安装情况。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;2.安装JBOSS。&lt;/p&gt;&#xD;
&lt;p&gt;(1)下载jboss压缩文件jboss-5.1.0.GA.zip,#unzip jboss-5.1.0.GA.zip解压压缩文件，#cp jboss-5.1.0.GA /usr/jboss-5.1.0.GA复制到指定的文件，也可直接解压到指定&lt;/p&gt;&#xD;
&lt;p&gt;的文件目录下。&lt;/p&gt;&#xD;
&lt;p&gt;(2)设置环境变量：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #vi /etc/profile 进入编辑模式并添加以下内容：&lt;/p&gt;&#xD;
&lt;p&gt;JBOSS_HOME=/usr/jboss-5.1.0.GA&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PATH=$PATH:/usr/jboss-5.1.0.GA/bin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; export JBOSS_HOME PATH&lt;br /&gt;&amp;nbsp;(3)#source /etc/profile 让环境变量立即有效,可使用#echo $JBOSS_HOME查看环境变量。&lt;/p&gt;&#xD;
&lt;p&gt;(4)#cd $JBOSS_HOME/bin&amp;nbsp; 进入到bin目录下用：&lt;/p&gt;&#xD;
&lt;p&gt;#./run.sh &amp;amp; 来启动Jboss,用IP来访问页面，&lt;a href="http://localhost:8080/"&gt;http://localhost:8080&lt;/a&gt;就可以出现测试页面了，也可使用#wget &lt;a href="http://localhost:8080/"&gt;http://localhost:8080&lt;/a&gt;测试。&lt;/p&gt;&#xD;
&lt;p&gt;(5)使其它主机通过ip访问：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 使用命令#./run.sh -b 0.0.0.0 &amp;amp; 启动可是其它主机通过ip访问，如想让在终端退出后jboss仍然运行可使用以下命令(要使用exit命令退出)：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #nohup ./run.sh -b 0.0.0.0 &amp;amp; 此时可以通过#more nohup.out查看日志&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 也可使用以下方法，重新创建个启动文件，启动jboss时使用它启动：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #cd $JBOSS_HOME/bin 目录下去&lt;/p&gt;&#xD;
&lt;p&gt;#vi start.sh&amp;nbsp; 编辑该文件，然后加入nohup ./run.sh -Djboss.bind.address=服务的IP(可设置为0.0.0.0) &amp;amp; &lt;/p&gt;&#xD;
&lt;p&gt;#chmod a+x start.sh&amp;nbsp; --赋予权限&lt;/p&gt;&#xD;
&lt;p&gt;#./start.sh --之后只需运行此命令即可&lt;/p&gt;&#xD;
&lt;p&gt;3.设置JBOSS开机启动服务&lt;/p&gt;&#xD;
&lt;p&gt;(1)#cp /usr/server/jboss-5/bin/jboss_init_redhat.sh /etc/rc.d/init.d/jboss 复制文件jboss_init_redhat.sh到指定的文件内，这里为jboss。&lt;/p&gt;&#xD;
&lt;p&gt;(2)#vi /etc/rc.d/init.d/jboss 进入编辑模式修改jboss启动参数，&lt;/p&gt;&#xD;
&lt;p&gt;修改对应的JAVA_HOME,JAVA_USER,JAVAPATH，如下：&lt;/p&gt;&#xD;
&lt;p&gt;JBOSS_HOME=${JBOSS_HOME:-"/usr/jboss-5.1.0.GA"}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; JBOSS_USER=${JBOSS_USER:-"root"}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; JAVAPTH=${JAVAPTH:-"/usr/java/jdk1.6.0_21/bin"}&lt;/p&gt;&#xD;
&lt;p&gt;为了使jboss适应所有ip在文件开头加&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; JBOSS_HOST=${JBOSS_HOST:-"0.0.0.0"}&lt;/p&gt;&#xD;
&lt;p&gt;如要测试修改是否正确可使用命令#/etc/rc.d/init.d/jboss start 手工启动，等待几分钟测试jboss是否启动，如未启动说明修改错误。&lt;/p&gt;&#xD;
&lt;p&gt;(3)修改rc.local使得开机启动 &lt;/p&gt;&#xD;
&lt;p&gt;#vi /etc/rc.d/rc.local 进入编辑模式添加以下内容：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /etc/rc.d/init.d/jboss start&lt;/p&gt;&#xD;
&lt;img src="http://www.cnblogs.com/zhmore/aggbug/1969014.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhmore/archive/2011/03/02/1969014.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhmore/archive/2010/11/25/1887820.html</id><title type="text">pager-taglib 分页扩展实例</title><summary type="text">pager-taglib 是个很好的jsp分页标签，使用它结合jstl可以实现灵活的分页导航功能。在实际的开发中post方式的提交比较常见，本人做了一个比较通用的基于post方式的一个应用。主要实现一下功能：1.添加输入跳转、每页记录数选择功能2.显示数据与struts2结合实现各行变色3.基于jquery.form插件的无刷新表单提交，实现无刷新效果实现环境：struts2.2.1、jdk6、j...</summary><published>2010-11-25T08:40:00Z</published><updated>2010-11-25T08:40:00Z</updated><author><name>张皓</name><uri>http://www.cnblogs.com/zhmore/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhmore/archive/2010/11/25/1887820.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhmore/archive/2010/11/25/1887820.html"/><content type="html">&lt;p&gt;pager-taglib 是个很好的jsp分页标签，使用它结合jstl可以实现灵活的分页导航功能。在实际的开发中post方式的提交比较常见，本人做了一个比较通用的基于post方式的一个应用。主要实现一下功能：&lt;br /&gt;1.添加输入跳转、每页记录数选择功能&lt;br /&gt;2.显示数据与struts2结合实现各行变色&lt;br /&gt;3.基于jquery.form插件的无刷新表单提交，实现无刷新效果&lt;br /&gt;实现环境：struts2.2.1、jdk6、jboss5.1、pager-taglib、mysql&lt;br /&gt;以上环境内通过测试，具体用法请参考项目内readme.txt&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;效果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/29756/2010112516390460.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;代码下载地址：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://download.csdn.net/source/2862539"&gt;http://download.csdn.net/source/2862539&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhmore/aggbug/1887820.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhmore/archive/2010/11/25/1887820.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhmore/archive/2010/11/25/1887808.html</id><title type="text">DisplayTag1.2 扩展(自定义分页、排序、导出、页面导航)</title><summary type="text">DisplayTag1.2 扩展(自定义分页、排序、导出、页面导航)DisplayTag是个很好的jsp标签，目前最新版本为1.2，支持了自定义分页，解决了之前版本每次查询都把全部数据查出的低效率做法。但是DisplayTag默认是通过url传参，以及分页导航不灵活给人们带来了不少麻烦。鉴于此本人对它做了扩展，主要扩展功能如下：1.自定义分页、排序2.自定义导出数据3.增强分页导航功能，可以实现输...</summary><published>2010-11-25T08:31:00Z</published><updated>2010-11-25T08:31:00Z</updated><author><name>张皓</name><uri>http://www.cnblogs.com/zhmore/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhmore/archive/2010/11/25/1887808.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhmore/archive/2010/11/25/1887808.html"/><content type="html">&lt;p&gt;DisplayTag1.2 扩展(自定义分页、排序、导出、页面导航)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;DisplayTag是个很好的jsp标签，目前最新版本为1.2，支持了自定义分页，解决了之前版本每次查询都把全部数据查出的低效率做法。但是DisplayTag默认是通过url传参，以及分页导航不灵活给人们带来了不少麻烦。鉴于此本人对它做了扩展，主要扩展功能如下：&lt;br /&gt;1.自定义分页、排序&lt;br /&gt;2.自定义导出数据&lt;br /&gt;3.增强分页导航功能，可以实现输入跳转、选择每页记录数等&lt;br /&gt;4.自定义导出按钮&lt;br /&gt;5.基于jquery.form插件的无刷新表单提交，实现无刷新效果&lt;br /&gt;6.添加鼠标经过变色&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;效果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/29756/2010112516271833.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;实现环境：struts2.2.1、jdk6、jboss5.1、displaytag1.2、mysql&lt;br /&gt;以上环境内通过测试，具体用法请参考项目内readme.txt&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;代码下载地址：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://download.csdn.net/source/2862544"&gt;http://download.csdn.net/source/2862544&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhmore/aggbug/1887808.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhmore/archive/2010/11/25/1887808.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhmore/archive/2010/11/11/1875121.html</id><title type="text">EJB3在JBoss5内集群探究</title><summary type="text">EJB3在JBoss5x内集群探究本文介绍ejb3在jboss5x内集群的基本配置及注意事项，我们主要的目的是在jboss5x内集群ejb3,，然后被客户端(可以是web应用程序)，不涉及到jboss http请求集群内容。具体见下：一、 程序准备我们准备两个项目ejb.rar、webapp.war，其中前者是ejb3项目、后者是web应用程序，主要代码如下：ejb.rar主要代码：接口：pack...</summary><published>2010-11-11T10:43:00Z</published><updated>2010-11-11T10:43:00Z</updated><author><name>张皓</name><uri>http://www.cnblogs.com/zhmore/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhmore/archive/2010/11/11/1875121.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhmore/archive/2010/11/11/1875121.html"/><content type="html">&lt;p&gt;&lt;strong&gt;EJB3&lt;/strong&gt;&lt;strong&gt;在&lt;/strong&gt;&lt;strong&gt;JBoss5x&lt;/strong&gt;&lt;strong&gt;内集群探究&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本文介绍ejb3在jboss5x内集群的基本配置及注意事项，我们主要的目的是在jboss5x内集群ejb3,，然后被客户端(可以是web应用程序)，不涉及到jboss http请求集群内容。具体见下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;一、&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/strong&gt;&lt;strong&gt;程序准备&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们准备两个项目ejb.rar、webapp.war，其中前者是ejb3项目、后者是web应用程序，主要代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;ejb.rar主要代码：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;接口：&lt;/p&gt;&#xD;
&lt;p&gt;package&amp;nbsp;com.sample; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;@Remote&lt;/p&gt;&#xD;
&lt;p&gt;//@Local&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;public&amp;nbsp;interface&amp;nbsp;HelloBeanItf&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;public&amp;nbsp;void&amp;nbsp;doSomething();&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;}&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;实现：&lt;/p&gt;&#xD;
&lt;p&gt;package&amp;nbsp;com.sample; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;import&amp;nbsp;java.io.Serializable; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;import&amp;nbsp;javax.ejb.*; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;import&amp;nbsp;org.jboss.annotation.ejb.Clustered; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;@Stateless&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;@Clustered&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;public&amp;nbsp;class&amp;nbsp;HelloBean&amp;nbsp;implements&amp;nbsp;HelloBeanItf&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;int&amp;nbsp;counter&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;public&amp;nbsp;void&amp;nbsp;doSomething()&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;counter++; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;System.out.println("Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is&amp;nbsp;"&amp;nbsp;+&amp;nbsp;counter); &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;} &amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;}&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;上面是无状态的session bean，注意标注@Clustered是必须的，如果不进行标注那么这个session bean将不会被集群。同样有状态的session bean的集群声明也是这样的，如下：&lt;/p&gt;&#xD;
&lt;p&gt;@Stateful&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;@Clustered&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;public&amp;nbsp;class&amp;nbsp;HelloBean2&amp;nbsp;implements&amp;nbsp;HelloBeanItf,Serializable&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;int&amp;nbsp;counter&amp;nbsp;=&amp;nbsp;0; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;public&amp;nbsp;void&amp;nbsp;doSomething()&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;counter++; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;System.out.println("Stateful&amp;nbsp;: Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is&amp;nbsp;"&amp;nbsp;+&amp;nbsp;counter); &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;} &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;webapp.war主要代码：&lt;/p&gt;&#xD;
&lt;p&gt;创建index.jsp文件用以调用无状态session bean，在主要代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;% &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;public&amp;nbsp;void&amp;nbsp;jspInit&amp;nbsp;()&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;try&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;HelloBeanItf&amp;nbsp;ejb&amp;nbsp;=&amp;nbsp;null; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;InitialContext&amp;nbsp;ctx&amp;nbsp;=&amp;nbsp;new&amp;nbsp;InitialContext(); &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;for(int i=0;i&amp;lt;10;i++){&lt;/p&gt;&#xD;
&lt;p&gt;//ejb&amp;nbsp;=&amp;nbsp;(HelloBeanItf)&amp;nbsp;ctx.lookup("HelloBean/local"); &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;ejb&amp;nbsp;=&amp;nbsp;(HelloBeanItf)&amp;nbsp;ctx.lookup("HelloBean/remote"); &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;} &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;catch&amp;nbsp;(Exception&amp;nbsp;exc)&amp;nbsp;{&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;exc.printStackTrace(); &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;} &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;} &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;ejb.doSomething(); &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;%&amp;gt; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;Stateless EJB&amp;nbsp;invoked&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;创建index2.jsp文件用以调用有状态session bean，在主要代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;% &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;public&amp;nbsp;void&amp;nbsp;jspInit&amp;nbsp;()&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;try&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;HelloBeanItf&amp;nbsp;ejb&amp;nbsp;=&amp;nbsp;null; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;InitialContext&amp;nbsp;ctx&amp;nbsp;=&amp;nbsp;new&amp;nbsp;InitialContext(); &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;for(int i=0;i&amp;lt;10;i++){&lt;/p&gt;&#xD;
&lt;p&gt;//ejb&amp;nbsp;=&amp;nbsp;(HelloBeanItf)&amp;nbsp;ctx.lookup("HelloBean2/local"); &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;ejb&amp;nbsp;=&amp;nbsp;(HelloBeanItf)&amp;nbsp;ctx.lookup("HelloBean2/remote"); &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;} &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;catch&amp;nbsp;(Exception&amp;nbsp;exc)&amp;nbsp;{&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;exc.printStackTrace(); &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;} &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;} &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;ejb.doSomething(); &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;%&amp;gt; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;Stateful EJB&amp;nbsp;invoked&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Classpath下添加jndi.porperties文件，具体如下：&lt;/p&gt;&#xD;
&lt;p&gt;java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory&lt;/p&gt;&#xD;
&lt;p&gt;java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces&lt;/p&gt;&#xD;
&lt;p&gt;java.naming.provider.url=192.168.1.2:1099, 192.168.1.3:1099&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;二、&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/strong&gt;&lt;strong&gt;配置jboss&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;配置jboss要稍微麻烦点，我们在三台机器上分别部署jboss名称分别为jboss1、jboss2、jboss3，对应的ip分别为192.168.1.1、192.168.1.2、192.168.1.3。配置具体步骤如下：&lt;/p&gt;&#xD;
&lt;p&gt;(1)&amp;nbsp;&amp;nbsp;&amp;nbsp; 使jboss能通过ip访问，分别找到jboss2与jboss3安装目录下的文件jboss-home\server\all\deploy\jbossweb.sar\server.xml并打开，把&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;Connector protocol="HTTP/1.1" port="8080" address="${jboss.bind.address}" &amp;nbsp;connectionTimeout="20000" redirectPort="8443" /&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;改为：&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;Connector protocol="HTTP/1.1" port="8080" address="0.0.0.0" connectionTimeout="20000" redirectPort="8443" /&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;(2)&amp;nbsp;&amp;nbsp;&amp;nbsp; 配置jvmRoute,打开jboss2及jboss3内的文件jboss-home\server\all\deploy\jbossweb.sar\server.xml，修改&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;Engine name="jboss.web" defaultHost="localhost" &amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;jboss2改为：&amp;lt;Engine name="jboss.web" defaultHost="localhost" jvmRoute="jboss2"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;jboss3改为：&amp;lt;Engine name="jboss.web" defaultHost="localhost" jvmRoute="jboss3"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;(3)&amp;nbsp;&amp;nbsp;&amp;nbsp; 设置ServerPeerID，打开jboss2及jboss3内的文件jboss-home\ server\all\deploy\messaging\ messaging-service.xml，修改&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;attribute name="ServerPeerID"&amp;gt;${jboss.messaging.ServerPeerID:0}&amp;lt;/attribute&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;jboss2改为：&amp;lt;attribute name="ServerPeerID"&amp;gt;${jboss.messaging.ServerPeerID:2}&amp;lt;/attribute&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;jboss3改为：&amp;lt;attribute name="ServerPeerID"&amp;gt;${jboss.messaging.ServerPeerID:3}&amp;lt;/attribute&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;三、&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/strong&gt;&lt;strong&gt;部署&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们把ejb分别部署到jboss2和jboss3内，使它们进行集群。把web客户端部署到jboss1内用以访问ejb，具体如下：&lt;/p&gt;&#xD;
&lt;p&gt;(1)&amp;nbsp;&amp;nbsp;&amp;nbsp; 复制ejb.jar到jboss2的jboss-home\server\all\farm下，使用all进行部署是因为all内包含所有的服务，集群服务及jboss cache服务都是我们所需的，放入farm内是为了当几个jboss集群后它们将自动完成部署ejb到各自的farm目录内，不过这个功能偶尔会部署失败，可以手工copy一份。当然我们也可以手工把ejb分别复制jboss2、jboss3的jboss-home\server\all\deploy目录下，集群效果一样。&lt;/p&gt;&#xD;
&lt;p&gt;(2)&amp;nbsp;&amp;nbsp;&amp;nbsp; 分别进入jboss2、jboss3主机上控制台进入jboss安装目录使用 run.bat &amp;ndash;c all -b 0.0.0.0 命令启动jboss。&lt;/p&gt;&#xD;
&lt;p&gt;当然我们也可以分别用run.bat &amp;ndash;c all -b 192.168.1.2 run.bat &amp;ndash;c all -b 192.168.1.3分别启动&lt;/p&gt;&#xD;
&lt;p&gt;(3)&amp;nbsp;&amp;nbsp;&amp;nbsp; 部署webapp.war到jboss1的目录jboss-home\server\default\deploy下，并启动jboss1&lt;/p&gt;&#xD;
&lt;p&gt;(4)&amp;nbsp;&amp;nbsp;&amp;nbsp; 部署webapp.war到jboss2的目录jboss-home\server\all\deploy下，用以跟jboss1的web客户端做比对。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;四、&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/strong&gt;&lt;strong&gt;运行分析&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(1)&amp;nbsp;&amp;nbsp;&amp;nbsp; 运行jboss1内的web客户端&lt;/p&gt;&#xD;
&lt;p&gt;在浏览器上输入&lt;a href="http://192.168.1.1/webapp/index.jsp"&gt;http://192.168.1.1/webapp/index.jsp&lt;/a&gt;，后我们观察下jboss2、jboss3的控制台&lt;/p&gt;&#xD;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;jboss2&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;jboss3&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 1&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 1&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 2&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 2&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 3&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 1&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 2&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 3&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 4&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 5&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;再刷新一次如下：&lt;/p&gt;&#xD;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;jboss2&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;jboss3&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 3&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 4&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 4&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 5&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 5&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 6&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 7&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 8&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 9&lt;/p&gt;&#xD;
&lt;p&gt;Stateless : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 10&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;第一次访问时我们循环了10次，发现在jboss上分别运行了5次，这就达到了负载均衡的目的。第二次访问了我们看jboss内counter是的规律是11223344&amp;hellip;这说明jboss1内产生了两个HelloBean&amp;nbsp;的实例进行轮训访问，而jboss2内只有一个HelloBean&amp;nbsp;的实例，这完全符合无状态session bean的特性，至于为什么jboss2内有两个实例，还未搞清楚，有待探究。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后我们在浏览器内输入&lt;a href="http://192.168.1.1/webapp/index.jsp"&gt;http://192.168.1.1/webapp/index2.jsp&lt;/a&gt;，后我们观察下jboss2、jboss3的控制台&lt;/p&gt;&#xD;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;jboss2&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;jboss3&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 1&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 2&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 3&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 4&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 5&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 6&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 7&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 8&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 9&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 10&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;再刷新一次如下：&lt;/p&gt;&#xD;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;jboss2&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;jboss3&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;Statefu l: Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 1&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 2&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 3&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 4&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 5&lt;/p&gt;&#xD;
&lt;p&gt;Statefu l: Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 6&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 7&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 8&lt;/p&gt;&#xD;
&lt;p&gt;Stateful&amp;nbsp;: Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 9&lt;/p&gt;&#xD;
&lt;p&gt;Stateful : Value&amp;nbsp;of&amp;nbsp;counter&amp;nbsp;is 10&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td width="331" valign="top"&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;如再连续刷新两次发现输入跟上面一样。第一次访问时我们循环了10次，发现在jboss3上分别运行了10次产生了一个HelloBean2实例，第二次jboss2上运行10次产生了一个HelloBean2实例，这样我们可以看出，每次访问时集群会随机给我们找一个ejb服务，而每次访问都会产生一个新的session bean实例，这完全符合有状态session bean的特性。&lt;/p&gt;&#xD;
&lt;p&gt;(2)&amp;nbsp;&amp;nbsp;&amp;nbsp; 关闭jboss3，我们按照上一步操作进行，发现访问正常进行，所有的请求都在jboss2上响应了，这样我们就达到了故障转移的目的。&lt;/p&gt;&#xD;
&lt;p&gt;(3)&amp;nbsp;&amp;nbsp;&amp;nbsp; 以同样的方式重新启动jboss3，我们分别通过&lt;a href="http://192.168.1.2/webapp/index.jsp"&gt;http://192.168.1.2/webapp/index.jsp&lt;/a&gt;，&lt;a href="http://192.168.1.2/webapp/index2.jsp"&gt;http://192.168.1.2/webapp/index2.jsp&lt;/a&gt;，进行访问，不难发现所有的请求都在jboss2上得到了响应，这是因为如果如果jboss内的web客户端访问集群ejb时，如果要访问的ejb集群本机也参与的话那么群集只返回本机的ejb，当然如果本机的ejb挂掉的话集群是可以随机分配其它jboss内的ejb的。&lt;/p&gt;&#xD;
&lt;p&gt;(4)&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们可以把HelloBeanItf&amp;nbsp;的注解改为@Local，把index.jsp、index2.jsp内的&amp;nbsp;ctx.lookup("HelloBean2/remote"); &amp;nbsp;改为&amp;nbsp;ctx.lookup("HelloBean2/local");然后按照之前方式重新部署，我们发现只能通 &amp;nbsp;&lt;a href="http://192.168.1.2/webapp/index.jsp"&gt;http://192.168.1.2/webapp/index.jsp&lt;/a&gt;，&lt;a href="http://192.168.1.2/webapp/index2.jsp"&gt;http://192.168.1.2/webapp/index2.jsp&lt;/a&gt;进行访问，而且请求全部在jboss2上响应，这也符合Local的session bean的特性。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;五、讨论&lt;/p&gt;&#xD;
&lt;p&gt;通过上面的测试我们可以想象，我们可以构造这样一个集群系统，在一个jboss内构建对外的web客户端来访问其它多个集群后的ejb服务的系统是完全可行的，这样要求这个对外web客户端的jboss不能参与ejb的集群。这种方式看上去有点类似于apache+mod_jk+jboss的http集群，但本质上是不太一样的。这两种方式的集群到底哪个更优本人还未进行过测试，希望以后能有机会亲自测试体验下。以上是我对jboss内集群ejb的一些探究，不足与错误忘大家指点。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhmore/aggbug/1875121.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhmore/archive/2010/11/11/1875121.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhmore/archive/2010/10/25/1860862.html</id><title type="text">maven2 Jetty运行多模块的web application</title><summary type="text">maven2 Jetty运行多模块的web application方法一：设置extraClasspath，见一下程序结构 pom.xml (packaging pom, has two modules)m2_common01/ pom.xml (packaging jar&amp;lt;m2_webapp01/ pom.xml(packaging war, depends on m2_common01)...</summary><published>2010-10-25T15:16:00Z</published><updated>2010-10-25T15:16:00Z</updated><author><name>张皓</name><uri>http://www.cnblogs.com/zhmore/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhmore/archive/2010/10/25/1860862.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhmore/archive/2010/10/25/1860862.html"/><content type="html">&lt;p&gt;&lt;strong&gt;maven2 Jetty&lt;/strong&gt;&lt;strong&gt;运行多模块的web application&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;方法一：&lt;/p&gt;&#xD;
&lt;p&gt;设置extraClasspath，见一下程序结构 &lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;pom.xml (packaging pom, has two modules)&lt;/li&gt;&#xD;
&lt;li&gt;m2_common01/ &#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;pom.xml (packaging jar&amp;lt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;m2_webapp01/ &#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;pom.xml(packaging war, depends on m2_common01)&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;曾尝试着在m2_webapp01/pom.xml内配置但是没有成功，后在主项目内pom.xml内配置运行正常，具体配置如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;plugins&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;......&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;plugin&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;groupId&amp;gt;org.mortbay.jetty&amp;lt;/groupId&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;artifactId&amp;gt;&lt;span style="text-decoration: underline;"&gt;jetty&lt;/span&gt;-&lt;span style="text-decoration: underline;"&gt;maven&lt;/span&gt;-&lt;span style="text-decoration: underline;"&gt;plugin&lt;/span&gt;&amp;lt;/artifactId&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!-- 此版7.2.0.v20101020本可用，8.0.0.M1不可用 --&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;version&amp;gt;7.2.0.v20101020&amp;lt;/version&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;configuration&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;webAppSourceDirectory&amp;gt;${&lt;span style="text-decoration: underline;"&gt;basedir&lt;/span&gt;}/m2_webapp01/&lt;span style="text-decoration: underline;"&gt;src&lt;/span&gt;/main/&lt;span style="text-decoration: underline;"&gt;webapp&lt;/span&gt;&amp;lt;/webAppSourceDirectory&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;classesDirectory&amp;gt;${&lt;span style="text-decoration: underline;"&gt;basedir&lt;/span&gt;}/m2_webapp01/target/classes&amp;lt;/classesDirectory&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;scanIntervalSeconds&amp;gt;2&amp;lt;/scanIntervalSeconds&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;stopKey&amp;gt;&lt;span style="text-decoration: underline;"&gt;foo&lt;/span&gt;&amp;lt;/stopKey&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;stopPort&amp;gt;9999&amp;lt;/stopPort&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;webAppConfig&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;contextPath&amp;gt;/m2_webapp01&amp;lt;/contextPath&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!-- 设置extraClasspath，多个用";"隔开 --&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;extraClasspath&amp;gt;${&lt;span style="text-decoration: underline;"&gt;basedir&lt;/span&gt;}/m2_common01/target/classes&amp;lt;/extraClasspath&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/webAppConfig&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;!-- 设置监听目录 --&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;scanTargets&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;scanTarget&amp;gt;${&lt;span style="text-decoration: underline;"&gt;basedir&lt;/span&gt;}/m2_common01/target/classes&amp;lt;/scanTarget&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/scanTargets&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/configuration&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/plugin&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;......&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;/plugins&amp;gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhmore/aggbug/1860862.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhmore/archive/2010/10/25/1860862.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhmore/archive/2010/10/15/1852434.html</id><title type="text">JBoss5开发web service常见问题</title><summary type="text">最近在研究EJB3，在使用EJB3的Web service的时候遇到了不少棘手的问题，现在总结常见问题与大家分享，希望您能少浪费些时间去漫天地搜解决方案，具体见下：1.服务器端错误信息：jboss5 java.lang.NoClassDefFoundError: org/apache/xerces/xs/XSModel</summary><published>2010-10-15T09:36:00Z</published><updated>2010-10-15T09:36:00Z</updated><author><name>张皓</name><uri>http://www.cnblogs.com/zhmore/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhmore/archive/2010/10/15/1852434.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhmore/archive/2010/10/15/1852434.html"/><content type="html">&lt;p&gt;最近在研究EJB3，在使用EJB3的Web service的时候遇到了不少棘手的问题，现在总结常见问题与大家分享，希望您能少浪费些时间去漫天地搜解决方案，具体见下：&lt;/p&gt;&#xD;
&lt;p&gt;1.&lt;br /&gt;服务器端错误信息：&lt;br /&gt;jboss5 java.lang.NoClassDefFoundError: org/apache/xerces/xs/XSModel&lt;/p&gt;&#xD;
&lt;p&gt;症状：&lt;br /&gt;(JBoss5.1内有此现象)在控制台启动则可以正常部署，在eclipse内则报错。&lt;/p&gt;&#xD;
&lt;p&gt;解决方法：&lt;br /&gt;很可能是在添加服务器的时候选择了eclipse的JBoss插件，位置：JBoss-&amp;gt;JBoss V5.0，改为JBoss Tool插件内的JBossAS Tool插件，位置：JBoss Community-&amp;gt;JBoss AS V5.1&lt;/p&gt;&#xD;
&lt;p&gt;2.&lt;br /&gt;(JBoss5.1内有此现象)&lt;br /&gt;客户端调用报错，&lt;br /&gt;当使用JBossWS调用Webservice时报错如下两个异常交替出现：&lt;br /&gt;javax.xml.ws.WebServiceException: No Content-type in the header&lt;br /&gt;和&lt;br /&gt;javax.xml.ws.WebServiceException: java.lang.UnsupportedOperationException: setProperty must be overridden by all subclasses of SOAPMessage &lt;/p&gt;&#xD;
&lt;p&gt;当使用Axis是报错如下：&lt;br /&gt;org.xml.sax.SAXParseException: Premature end of file.&lt;/p&gt;&#xD;
&lt;p&gt;原因及解决办法：&lt;br /&gt;把JBoss4.2内的JBOSS_HOME/client目录下的一下文件复制到JBoss5.1内的JBOSS_HOME/lib/endorsed目录下，重启服务就可以了。&lt;br /&gt;jboss-jaxrpc.jar&lt;br /&gt;jboss-jaxws.jar&lt;br /&gt;jboss-jaxws-ext.jar&lt;br /&gt;jboss-saaj.jar&lt;/p&gt;&#xD;
&lt;p&gt;另一种做法是下载JBoss5.1的jdk1.6版本。&lt;/p&gt;&#xD;
&lt;p&gt;参考如下：&lt;br /&gt;I read the release notes for Jboss as 4.2.3.GA and it describes what to do if running webservies using jdk1.6. Here is what helped me: (taken from the release notes and followed exactly as printed)&lt;/p&gt;&#xD;
&lt;p&gt;* JBossAS 4.2.3.GA can be compiled with both Java5 &amp;amp; Java6. The Java5 compiled binary is our primary/recommended &lt;br /&gt;binary distribution. It has undergone rigorous testing and can run under both a Java 5 and a Java 6 runtime. When &lt;br /&gt;running under Java 6 you need to manually copy the following libraries from the JBOSS_HOME/client directory to &lt;br /&gt;the JBOSS_HOME/lib/endorsed directory, so that the JAX-WS 2.0 apis supported by JBossWS are used:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; o jboss-jaxrpc.jar&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; o jboss-jaxws.jar&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; o jboss-jaxws-ext.jar&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; o jboss-saaj.jar&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhmore/aggbug/1852434.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhmore/archive/2010/10/15/1852434.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhmore/archive/2010/09/25/1834700.html</id><title type="text">jboss启动常见的错误</title><summary type="text">3.报错：Deployment "AttachmentStore" is in error due to: java.lang.IllegalArgumentException: Wrong arguments. new for target java.lang.reflect.Constructor expected=[java.net.URI] actual=[java.io.File] </summary><published>2010-09-25T08:55:00Z</published><updated>2010-09-25T08:55:00Z</updated><author><name>张皓</name><uri>http://www.cnblogs.com/zhmore/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhmore/archive/2010/09/25/1834700.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhmore/archive/2010/09/25/1834700.html"/><content type="html">&lt;p&gt;1.报错：java.rmi.server.ExportException: Port already in use: 1098; nested exception is: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; java.net.BindException: Address already in use: JVM_Bind&lt;br /&gt;此错误常在4.2版本中出现。&lt;br /&gt;需要修改的文件的路径：jboss-4.2.2.GA\server\default\conf\jboss-service.xml&amp;nbsp;&amp;nbsp; 把1098改为其它号码即可，一直改到它成功为止&lt;/p&gt;&#xD;
&lt;p&gt;&amp;lt;attribute name="Port"&amp;gt;1099&amp;lt;/attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;attribute name="RmiPort"&amp;gt;1098&amp;lt;/attribute&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.报错：java.net.BindException:&amp;nbsp;&amp;nbsp; Address&amp;nbsp;&amp;nbsp; already&amp;nbsp;&amp;nbsp; in&amp;nbsp;&amp;nbsp; use:&amp;nbsp;&amp;nbsp; JVM_Bind:8080&lt;br /&gt;需要修改的文件的路径：jboss-4.2.2.GA\server\default\deploy\jboss-web.deployer\server.xml&lt;br /&gt;把8080改为其它号码即可，一直改到它成功为止，修改后一定记得要保存.如安装eclipse插件可以打开服务直接修改Port即可。&lt;br /&gt;此错误在各个版本都常见。&lt;/p&gt;&#xD;
&lt;p&gt;JBOSS里面这个异常说明端口1098被其他进程占用了，查看占用进程的方法为：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;1）命令行cmd -&amp;gt; netstat -ano | findstr "1098"，得到占用端口1098的pID&lt;br /&gt;2）ctrl+alt+del，进入任务管理器，点击&amp;ldquo;查看&amp;lsquo;，选择pid后，查看是那个进程占用的，结束即可&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;3.报错：Deployment "AttachmentStore" is in error due to: java.lang.IllegalArgumentException: Wrong arguments. new for target java.lang.reflect.Constructor expected=[java.net.URI] actual=[java.io.File]&lt;br /&gt;具体：&lt;br /&gt;...&lt;br /&gt;16:15:28,605 ERROR [AbstractKernelController] Error installing to Instantiated: name=AttachmentStore state=Described&amp;nbsp;&amp;nbsp; &lt;br /&gt;java.lang.IllegalArgumentException: Wrong arguments. new for target java.lang.reflect.Constructor expected=[java.net.URI] actual=[java.io.File]&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.reflect.plugins.introspection.ReflectionUtils.handleErrors(ReflectionUtils.java:395)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.reflect.plugins.introspection.ReflectionUtils.newInstance(ReflectionUtils.java:153)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.reflect.plugins.introspection.ReflectConstructorInfoImpl.newInstance(ReflectConstructorInfoImpl.java:106)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.joinpoint.plugins.BasicConstructorJoinPoint.dispatch(BasicConstructorJoinPoint.java:80)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.aop.microcontainer.integration.AOPConstructorJoinpoint.createTarget(AOPConstructorJoinpoint.java:282)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.aop.microcontainer.integration.AOPConstructorJoinpoint.dispatch(AOPConstructorJoinpoint.java:103)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.kernel.plugins.dependency.KernelControllerContextAction$JoinpointDispatchWrapper.execute(KernelControllerContextAction.java:241)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.kernel.plugins.dependency.ExecutionWrapper.execute(ExecutionWrapper.java:47)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.kernel.plugins.dependency.KernelControllerContextAction.dispatchExecutionWrapper(KernelControllerContextAction.java:109)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.kernel.plugins.dependency.KernelControllerContextAction.dispatchJoinPoint(KernelControllerContextAction.java:70)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.kernel.plugins.dependency.InstantiateAction.installActionInternal(InstantiateAction.java:66)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.kernel.plugins.dependency.InstallsAwareAction.installAction(InstallsAwareAction.java:54)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.kernel.plugins.dependency.InstallsAwareAction.installAction(InstallsAwareAction.java:42)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:774)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:540)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.kernel.plugins.deployment.AbstractKernelDeployer.deployBean(AbstractKernelDeployer.java:319)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.kernel.plugins.deployment.AbstractKernelDeployer.deployBeans(AbstractKernelDeployer.java:297)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.kernel.plugins.deployment.AbstractKernelDeployer.deploy(AbstractKernelDeployer.java:130)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.kernel.plugins.deployment.BasicKernelDeployer.deploy(BasicKernelDeployer.java:76)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.bootstrap.microcontainer.TempBasicXMLDeployer.deploy(TempBasicXMLDeployer.java:91)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.bootstrap.microcontainer.TempBasicXMLDeployer.deploy(TempBasicXMLDeployer.java:161)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.bootstrap.microcontainer.ServerImpl.doStart(ServerImpl.java:138)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:450)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.Main.boot(Main.java:221)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.Main$1.run(Main.java:556)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at java.lang.Thread.run(Thread.java:619)&amp;nbsp;&amp;nbsp; &lt;br /&gt;Failed to boot JBoss:&amp;nbsp;&amp;nbsp; &lt;br /&gt;java.lang.IllegalStateException: Incompletely deployed:&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;DEPLOYMENTS IN ERROR:&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Deployment "AttachmentStore" is in error due to: java.lang.IllegalArgumentException: Wrong arguments. new for target java.lang.reflect.Constructor expected=[java.net.URI] actual=[java.io.File]&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;DEPLOYMENTS MISSING DEPENDENCIES:&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Deployment "ProfileServicePersistenceDeployer" is missing the following dependencies:&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dependency "AttachmentStore" (should be in state "Installed", but is actually in state "**ERROR**")&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Deployment "ProfileServiceDeployer" is missing the following dependencies:&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dependency "AttachmentStore" (should be in state "Installed", but is actually in state "**ERROR**")&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Deployment "ProfileService" is missing the following dependencies:&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dependency "ProfileServiceDeployer" (should be in state "Installed", but is actually in state "Instantiated")&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dependency "jboss.kernel:service=KernelController" (should be in state "Installed", but is actually in state "**ERROR**")&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Deployment "ProfileServiceBootstrap" is missing the following dependencies:&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dependency "ProfileService" (should be in state "Installed", but is actually in state "Instantiated")&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dependency "jboss.kernel:service=Kernel" (should be in state "Installed", but is actually in state "**ERROR**")&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.kernel.plugins.deployment.AbstractKernelDeployer.internalValidate(AbstractKernelDeployer.java:278)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.kernel.plugins.deployment.AbstractKernelDeployer.validate(AbstractKernelDeployer.java:174)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.bootstrap.microcontainer.ServerImpl.doStart(ServerImpl.java:142)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:450)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.Main.boot(Main.java:221)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.jboss.Main$1.run(Main.java:556)&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at java.lang.Thread.run(Thread.java:619)&amp;nbsp;&amp;nbsp; &lt;br /&gt;16:15:29,515 INFO&amp;nbsp; [ServerImpl] Runtime shutdown hook called, forceHalt: true&amp;nbsp; &lt;br /&gt;16:15:29,523 INFO&amp;nbsp; [ServerImpl] Shutdown complete&amp;nbsp;&amp;nbsp; &lt;br /&gt;Shutdown complete&amp;nbsp;&amp;nbsp; &lt;br /&gt;Halting VM&amp;nbsp;&amp;nbsp; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;此错误常在5.1版本中出现。&lt;br /&gt;这个错误是配置文件profile.xml内的一个bug，文件路径为：$JBOSS_HOME/server/&amp;lt;serverName&amp;gt;/conf/bootstrap/profile.xml&lt;br /&gt;把其中的节点：&lt;br /&gt;&amp;lt;bean name="AttachmentStore" &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;constructor&amp;gt;&amp;lt;parameter&amp;gt;&amp;lt;inject bean="BootstrapProfileFactory" property="attachmentStoreRoot" /&amp;gt;&amp;lt;/parameter&amp;gt;&amp;lt;/constructor&amp;gt;&lt;br /&gt;修改为：&lt;br /&gt;&amp;lt;bean name="AttachmentStore" &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;constructor&amp;gt;&amp;lt;parameter &amp;gt;&amp;lt;inject bean="BootstrapProfileFactory" property="attachmentStoreRoot" /&amp;gt;&amp;lt;/parameter&amp;gt;&amp;lt;/constructor&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;4.错误信息：&lt;br /&gt;ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] (main) Error installing to Start: name=jboss:service=NamingProviderURLWriter state=Create mode=Manual requiredState=Installed&lt;br /&gt;java.io.IOException: Access is denied&lt;/p&gt;&#xD;
&lt;p&gt;解决办法：停止windows的Indexing Service服务。出现错误原因如下：&lt;br /&gt;It seemed that a file was being locked for some reason, and that file was obviously necessary for JBoss to start. Some further investigation (ok, I admit, I just tried to delete all of JBoss with the faith that it would fail on the locked file), it turns out that file was some file called jnp-service.url in the data directory of the default server. After downloading and installing the handy Unlocker tool (&lt;a href="http://ccollomb.free.fr/unlocker/"&gt;http://ccollomb.free.fr/unlocker/&lt;/a&gt;), it turns out that cidaemon.exe (aka the Windows Indexing Service) was locking the file for some reason. Turning off the Indexing Service solved that problem.&lt;/p&gt;&#xD;
&lt;p&gt;The second issue came when I attempted to deploy my WAR file with my JAX-WS service into my new JBoss server. Again, I could not get it to deploy, and a review of the log files showed&lt;br /&gt;"vfsfile:/C:/dev/Workspaces/BeliefNet/.metadata/.plugins/org.jboss.ide.eclipse.as.core/JBoss_5.1_Server/deploy/RAFTSOA.war/" is in error due to the following reason(s): java.lang.StringIndexOutOfBoundsException: String index out of range: -1&lt;br /&gt;A strange and cryptic error indeed. As you can see, I was using the JBoss tools integration with Eclipse, so I tried just exporting the WAR file and copying it manually to the JBoss deploy directory, but still no luck. With nightmares of "pouring through source code to see what JBoss is doing when it throws this exception" dancing in my head, luckily Google gave a bunch of pieces to the puzzle to what might be causing this. It turns out that JBoss requires all servlets and such to be inside a package. This was not the case when I was just deploying in Tomcat alone, but luckily this is among the easiest problems to fix.&lt;br /&gt;Happy to say, after those issues were resolved, my sample JAX-WS application is up and running. Now I just have to unlock the puzzle of JAX-WS, JAXB, and how everything lives in harmony to create a viable SOA solution....&lt;/p&gt;&#xD;
&lt;p&gt;5.启动正常在但是使用JBoss Tool3.1的插件JBossAS Tool发布无效(JBoss5.1 Runtime Server发布无效)，但是在默认Runtime路径&amp;ldquo;workspace\.metadata\.plugins\org.jboss.ide.eclipse.as.core\JBoss_5.1_Runtime_ServerXXX&amp;rdquo;内可以看到发布的项目，启动JBoss却无法访问发布信息，这个问题郁闷了我两天，最终发现一个令人无语的问题，那就是在创建JBoss的项目的时候项目物理路径内不能存在空格，比如路径&amp;ldquo;Ejb3 Project&amp;rdquo;等带有空格目录的项目发布后将无法被JBoss正确加载(真佩服这帮程序员)。&lt;/p&gt;&#xD;
&lt;p&gt;解决办法：在开发JBoss的项目时候项目路径一定不要带空格或者其它比较少用的特殊字符，JBoss对路径特别敏感。&lt;/p&gt;&#xD;
&lt;p&gt;OK，可以正常启动了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhmore/aggbug/1834700.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhmore/archive/2010/09/25/1834700.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zhmore/archive/2010/09/01/1815045.html</id><title type="text">ADO连接池</title><summary type="text">Delphi做服务器端如果每次请求都创建一个连接就太耗资源了，而使用一个全局的连接那效率可想而知，这样就体现出了线程池的重要了。参考一些例子做了个ADO的连接池，用到项目中挺不错的，分享下。{ ******************************************************* }{ Description : ADO连接池 }{ Create Date : 2010-8...</summary><published>2010-09-01T09:11:00Z</published><updated>2010-09-01T09:11:00Z</updated><author><name>张皓</name><uri>http://www.cnblogs.com/zhmore/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zhmore/archive/2010/09/01/1815045.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zhmore/archive/2010/09/01/1815045.html"/><content type="html">&lt;p&gt;Delphi做服务器端如果每次请求都创建一个连接就太耗资源了，而使用一个全局的连接那效率可想而知，这样就体现出了线程池的重要了。参考一些例子做了个ADO的连接池，用到项目中挺不错的，分享下。&lt;/p&gt;&#xD;
&lt;p&gt;{ ******************************************************* }&lt;br /&gt;{ Description : ADO连接池&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;{ Create Date : 2010-8-31 23:22:09&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;{ Modify Remark :2010-9-1 12:00:09&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;{ Modify Date :&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;{ Version : 1.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;{ ******************************************************* }&lt;/p&gt;&#xD;
&lt;p&gt;unit ADOConnectionPool;&lt;/p&gt;&#xD;
&lt;p&gt;interface&lt;/p&gt;&#xD;
&lt;p&gt;uses&lt;br /&gt;&amp;nbsp; Classes, Windows, SyncObjs, SysUtils, ADODB;&lt;/p&gt;&#xD;
&lt;p&gt;type&lt;br /&gt;&amp;nbsp; TADOConnectionPool = class(TObject)&lt;br /&gt;&amp;nbsp; private&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FConnectionList:TThreadList;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //FConnList: TList;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FTimeout: Integer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FMaxCount: Integer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FSemaphore: Cardinal;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //FCriticalSection: TCriticalSection;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FConnectionString,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FDataBasePass,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FDataBaseUser:string;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function CreateNewInstance(AOwnerList:TList): TADOConnection;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function GetLock(AOwnerList:TList;Index: Integer): Boolean;&lt;br /&gt;&amp;nbsp; public&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; property ConnectionString:string read FConnectionString write FConnectionString;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; property DataBasePass:string read FDataBasePass write FDataBasePass;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; property DataBaseUser:string read FDataBaseUser write FDataBaseUser;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; property Timeout:Integer read FTimeout write FTimeout;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; property MaxCount:Integer read FMaxCount;&lt;/p&gt;&#xD;
&lt;p&gt;constructor Create(ACapicity:Integer=15);overload;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; destructor Destroy;override;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// 申请并一个连接并上锁，使用完必须调用UnlockConnection来释放锁&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function LockConnection: TADOConnection;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// 释放一个连接&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure UnlockConnection(var Value: TADOConnection);&lt;br /&gt;&amp;nbsp; end;&lt;/p&gt;&#xD;
&lt;p&gt;type&lt;br /&gt;&amp;nbsp; PRemoteConnection=^TRemoteConnection;&lt;br /&gt;&amp;nbsp; TRemoteConnection=record&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connection : TADOConnection;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InUse:Boolean;&lt;br /&gt;&amp;nbsp; end;&lt;/p&gt;&#xD;
&lt;p&gt;var&lt;br /&gt;&amp;nbsp; ConnectionPool: TADOConnectionPool;&lt;/p&gt;&#xD;
&lt;p&gt;implementation&lt;/p&gt;&#xD;
&lt;p&gt;constructor TADOConnectionPool.Create(ACapicity:Integer=15);&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; //FConnList := TList.Create;&lt;br /&gt;&amp;nbsp; FConnectionList:=TThreadList.Create;&lt;br /&gt;&amp;nbsp; //FCriticalSection := TCriticalSection.Create;&lt;br /&gt;&amp;nbsp; FTimeout := 15000;&lt;br /&gt;&amp;nbsp; FMaxCount := ACapicity;&lt;br /&gt;&amp;nbsp; FSemaphore := CreateSemaphore(nil, FMaxCount, FMaxCount, nil);&lt;br /&gt;end;&lt;/p&gt;&#xD;
&lt;p&gt;function TADOConnectionPool.CreateNewInstance(AOwnerList:TList): TADOConnection;&lt;br /&gt;var&lt;br /&gt;&amp;nbsp; p: PRemoteConnection;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; Result := nil;&lt;/p&gt;&#xD;
&lt;p&gt;New(p);&lt;br /&gt;&amp;nbsp; p.Connection := TADOConnection.Create(nil);&lt;br /&gt;&amp;nbsp; p.Connection.ConnectionString := ConnectionString;&lt;br /&gt;&amp;nbsp; p.Connection.LoginPrompt := False;&lt;br /&gt;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (DataBaseUser='') and (DataBasePass='') then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p.Connection.Connected:=True&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p.Connection.Open(DataBaseUser, DataBasePass);&lt;br /&gt;&amp;nbsp; except&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; p.Connection.Free;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dispose(p);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit;&lt;br /&gt;&amp;nbsp; end;&lt;br /&gt;&amp;nbsp; p.InUse := True;&lt;br /&gt;&amp;nbsp; AOwnerList.Add(p);&lt;br /&gt;&amp;nbsp; Result := p.Connection;&lt;br /&gt;end;&lt;/p&gt;&#xD;
&lt;p&gt;destructor TADOConnectionPool.Destroy;&lt;br /&gt;var&lt;br /&gt;&amp;nbsp; i: Integer;&lt;br /&gt;&amp;nbsp; ConnList:TList;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; //FCriticalSection.Free;&lt;br /&gt;&amp;nbsp; ConnList:=FConnectionList.LockList;&lt;br /&gt;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i := ConnList.Count - 1 downto 0 do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRemoteConnection(ConnList[i]).Connection.Free;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dispose(ConnList[i]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; except&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //忽略释放错误&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FConnectionList.UnlockList;&lt;br /&gt;&amp;nbsp; end;&lt;/p&gt;&#xD;
&lt;p&gt;FConnectionList.Free;&lt;br /&gt;&amp;nbsp; CloseHandle(FSemaphore);&lt;br /&gt;&amp;nbsp; inherited Destroy;&lt;br /&gt;end;&lt;/p&gt;&#xD;
&lt;p&gt;function TADOConnectionPool.GetLock(AOwnerList:TList;Index: Integer): Boolean;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; Result := not PRemoteConnection(AOwnerList[Index]).InUse;&lt;br /&gt;&amp;nbsp; if Result then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRemoteConnection(AOwnerList[Index]).InUse := True;&lt;br /&gt;end;&lt;/p&gt;&#xD;
&lt;p&gt;function TADOConnectionPool.LockConnection: TADOConnection;&lt;br /&gt;var&lt;br /&gt;&amp;nbsp; i,WaitResult: Integer;&lt;br /&gt;&amp;nbsp; ConnList:TList;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; Result := nil;&lt;br /&gt;&amp;nbsp; WaitResult:= WaitForSingleObject(FSemaphore, Timeout);&lt;br /&gt;&amp;nbsp; if WaitResult = WAIT_FAILED then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise Exception.Create('Server busy, please try again');&lt;/p&gt;&#xD;
&lt;p&gt;ConnList:=FConnectionList.LockList;&lt;br /&gt;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i := 0 to ConnList.Count - 1 do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if GetLock(ConnList,i) then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Result := PRemoteConnection(ConnList[i]).Connection;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ConnList.Count &amp;lt; MaxCount then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Result := CreateNewInstance(ConnList);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; except&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 获取信号且失败则释放一个信号量&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if WaitResult=WAIT_OBJECT_0 then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReleaseSemaphore(FSemaphore, 1, nil);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FConnectionList.UnlockList;&lt;br /&gt;&amp;nbsp; end;&lt;/p&gt;&#xD;
&lt;p&gt;if Result = nil then&lt;br /&gt;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if WaitResult=WAIT_TIMEOUT then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise Exception.Create('Timeout expired.Connection pool is full.')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { This&amp;nbsp;&amp;nbsp; shouldn 't&amp;nbsp;&amp;nbsp; happen&amp;nbsp;&amp;nbsp; because&amp;nbsp;&amp;nbsp; of&amp;nbsp;&amp;nbsp; the&amp;nbsp;&amp;nbsp; sempahore&amp;nbsp;&amp;nbsp; locks }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise Exception.Create('Unable to lock Connection');&lt;br /&gt;&amp;nbsp; end;&lt;br /&gt;end;&lt;/p&gt;&#xD;
&lt;p&gt;procedure TADOConnectionPool.UnlockConnection(var Value: TADOConnection);&lt;br /&gt;var&lt;br /&gt;&amp;nbsp; i: Integer;&lt;br /&gt;&amp;nbsp; ConnList:TList;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; ConnList:=FConnectionList.LockList;&lt;br /&gt;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i := 0 to ConnList.Count - 1 do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if Value = PRemoteConnection(ConnList[i]).Connection then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRemoteConnection(ConnList[I]).InUse := False;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReleaseSemaphore(FSemaphore, 1, nil);&lt;/p&gt;&#xD;
&lt;p&gt;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FConnectionList.UnlockList;&lt;br /&gt;&amp;nbsp; end;&lt;br /&gt;end;&lt;/p&gt;&#xD;
&lt;p&gt;initialization&lt;/p&gt;&#xD;
&lt;p&gt;ConnectionPool := TADOConnectionPool.Create();&lt;/p&gt;&#xD;
&lt;p&gt;finalization&lt;/p&gt;&#xD;
&lt;p&gt;ConnectionPool.Free;&lt;/p&gt;&#xD;
&lt;p&gt;end.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zhmore/aggbug/1815045.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zhmore/archive/2010/09/01/1815045.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
