2006年06月28日

总体来说donews是优秀的,迁窝只是为了学习WordPress以及使用客户端发布BLOG,虽然有爱搞搞支持,donews的客户端并不能令我满意。

鉴于本窝影响力甚微,特发此告!

新窝链接:http://my.donews.com/anjianping

欢迎光临!

2006年05月23日
一、今天用了下DisplayTag,挺好的一个东西。就是对中文支持有些问题。我在displaytag.properties里修改了一些设置,包含了一些中文,比如 paging.banner.item_name=记录 。显示的时候就出乱码了。把配置文件改成displaytag_zh.properties或者displaytag_zh_CN.properties也不行。配置文件改成UTF-8编码也不行。在网上一时也没找到好的办法。只好下了一份代码,修改 org.displaytag.properties.TableProperties ,把

    private String getProperty(String key)
    {
      return this.properties.getProperty(key);
    }


改成
    private String getProperty(String key)
    {
        String s = null;
        try {
          s = new String(this.properties.getProperty(key).getBytes("8859_1"), "GBK");
        }catch(Exception e) {
          s = null;
        }
      return s;
    }

编译后再一试就可以了。办法实在是龌龊了点儿,先凑和吧。

我的环境是Windows中文 + SUN JDK 1.42 + Tomcat 5.0.28 + DisplayTag 1.0
二、 解决DisplayTag有中文条件时的分页问题

很早就开始用DisplayTag了,真得很方便,不用考虑分页,表格等问题。

但是有一个问题一直困扰我,就是有中文作为表单提交内容的时候,翻页就不能用了,中文变成了乱码。

表单传送时, form的提交采用的是Post方法,这没错,但链接采用的是Get方法,问题就出在这里,因为和Tomcat4相比,Tomcat5的post和get采用的方式不再相同了,汉字编码的实现方式也不同了。

Post是将地址传送一次,将form的数据单独提交,而Get则是将地址和参数一起传送,传送的不止是form的数据。

 默认情况下,Tomcat对请求采用的默认编码是ISO-8859-1,这样我们提交的汉字被认为是ISO-8859-1的编码,所以在程序中接收时显示乱码。  在过滤器中调用request.setCharacterEncoding("GBK"),那么Post上来的汉字将被认为是GBK编码,而Tomcat5对于Get请求上来的编码并不根据过滤器的设定辨认编码方式,默认的依然是ISO-8859-1,所以,即使你的页面使用默认的编码方式进行编码,然后使用ISO-8859-1进行解码,得到的结果也不对

解决方法:
在Server.xml的connector部分设定URIEncoding的值,根据编码方式指定自己的值就可以了
例如:URIEncoding="GB2312"

三、

displaytag, 配合 Struts 使用多國語言(i18n)



     <meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
只在显示汉字时有用,而且这2种写法的作用在理论上应该时一致的,但是由于各个软件厂商对Web标准都按照自己的理解进行了修改,所以,常常这2种写法作用就不一致了,使我们在开发Web程序时备感混乱。如果你想了解详情,请查看《网站重构》一书。

 

这样我们提交的汉字被认为是ISO-8859-1的编码,所以在程序中接收时显示乱码,如果使用过滤器,在过滤器中调用request.setCharacterEncoding("GBK")的话,那么Post上来的汉字将被认为是GBK编码,而Tomcat5对于Get请求上来的编码并不根据过滤器的设定辨认编码方式,默认的依然是ISO-8859-1Tomcat5中处理Get请求的源代码如下:

 tomcat5中处理Get请求的函数

      上面的代码中,enc代表Tomcat5server.xmlConnector部分的URIEnocodeing项设定的值,可以看出,如果没有设定URIEncoding项的话,那么Tomcat5也并没有使用默认的ISO-8859-1编码,而是一段fast conversion,所以,即使你的页面使用默认的编码方式进行编码,然后使用ISO-8859-1进行解码,得到的结果也不对,这可能是Tomcat5的一个Bug。如果想绕过这个Bug,那么只有在server.xmlConnector部分设定URIEncoding的值,根据编码方式指定自己的值,在我的程序中我使用的是GBK,所以我修改后的部分如下:

    acceptCount="100"
    connectionTimeout="20000"
    disableUploadTimeout="true"
    port="80"
    redirectPort="8443"
    enableLookups="false"
    minSpareThreads="25"
    maxSpareThreads="75"
    maxThreads="150"
    maxPostSize="0"
    URIEncoding="GBK">

 

 

      这个问题我参考了这篇文章:

http://www.javaworld.com.tw/jute/post/view?age=0&bid=9&ppg=1&sty=1&id=44042&tpg=1

 

这样我们提交的汉字被认为是ISO-8859-1的编码,所以在程序中接收时显示乱码,如果使用过滤器,在过滤器中调用request.setCharacterEncoding("GBK")的话,那么Post上来的汉字将被认为是GBK编码,而Tomcat5对于Get请求上来的编码并不根据过滤器的设定辨认编码方式,默认的依然是ISO-8859-1Tomcat5中处理Get请求的源代码如下:

 tomcat5中处理Get请求的函数

      上面的代码中,enc代表Tomcat5server.xmlConnector部分的URIEnocodeing项设定的值,可以看出,如果没有设定URIEncoding项的话,那么Tomcat5也并没有使用默认的ISO-8859-1编码,而是一段fast conversion,所以,即使你的页面使用默认的编码方式进行编码,然后使用ISO-8859-1进行解码,得到的结果也不对,这可能是Tomcat5的一个Bug。如果想绕过这个Bug,那么只有在server.xmlConnector部分设定URIEncoding的值,根据编码方式指定自己的值,在我的程序中我使用的是GBK,所以我修改后的部分如下:

    acceptCount="100"
    connectionTimeout="20000"
    disableUploadTimeout="true"
    port="80"
    redirectPort="8443"
    enableLookups="false"
    minSpareThreads="25"
    maxSpareThreads="75"
    maxThreads="150"
    maxPostSize="0"
    URIEncoding="GBK">

 

 

      这个问题我参考了这篇文章:

http://www.javaworld.com.tw/jute/post/view?age=0&bid=9&ppg=1&sty=1&id=44042&tpg=1

http://www.javaworld.com.tw/jute/post/view?age=0&bid=9&ppg=1&sty=1&id=44042&tpg=1

      另外,对于编码解码的问题,我还有一句要说,理论上,如果编码的charset和解码的charset是一致的话,那么就应该没有乱码的问题,但是,对于某些特殊的字符来说,如果采用的charset不对,则可能在解码的时候不能显示,所以要选择好字符集,我推荐在处理简体汉字的时候使用GBK。网上也有推荐UTF-8的,具体使用哪种依情况而定。

 五、【摘 要】最近用exadel加eclipse做一个struts的项目,结果碰到了很多问题,其中一个重要的问题就是中文化的问题,这个问题在很多地方都碰到了,下面将介绍一种方法,可以让displaytag产生的报表列名变成中文的。

  最近用exadel加eclipse做一个struts的项目,结果碰到了很多问题,其中一个重要的问题就是中文化的问题,这个问题在很多地方都碰到了,下面将介绍一种方法,可以让displaytag产生的报表列名变成中文的。

  第一步是在网页中加入jstl的fmt的支持。

1、将jstl需要的jstl.jar和standard.jar拷贝到WebContent\WEB-INF\lib目录下
2、将fmt.tld拷贝到WEB-INF目录下
3、修改WEB-INF目录下的web.xml文件,添加如下行到相应位置
   <taglib>
     <taglib-uri>/WEB-INF/fmt</taglib-uri>
     <taglib-location>/WEB-INF/fmt.tld</taglib-location>
   </taglib>
4、在要编辑的jsp文件头上添加<%@ taglib uri="/WEB-INF/fmt.tld" prefix="fmt" %>以支持fmt

  第二步是要在系统中加入resource文件的支持

1、在javaresoruce目录下面的任意一个包中(下面假定是sample包)创建resource文件,名称为test.properties
2、在其中输入如下一行内容测试
   test=中文内容
3、在sample目录下面创建一个bat文件,名字叫做encode.bat,编辑内容如下
   %JAVA_HOME%\bin\native2ascii -encoding gb2312 test.properties test_zh.properties
   然后保存退出
4、双击此bat文件执行,执行后会生成一个名称为test_zh.bat的文件
5、在struts-config.xml文件中 <controller/>后面加入下面这一行内容
   <message-resources parameter="sample.test.properties"/>
6、在需要编辑的jsp文件中编辑如下,其中titleKey是关键
   <fmt:bundle basename="sample.test_zh">
   <display:table…>
     <display:column property="name" <b>titleKey="test"</b> headerClass="sortable"/>
   </display:table>
   </fmt:bundle>

这样displaytag列名显示的就是“中文内容”了:)

  最近用exadel加eclipse做一个struts的项目,结果碰到了很多问题,其中一个重要的问题就是中文化的问题,这个问题在很多地方都碰到了,下面将介绍一种方法,可以让displaytag产生的报表列名变成中文的。

  第一步是在网页中加入jstl的fmt的支持。

1、将jstl需要的jstl.jar和standard.jar拷贝到WebContent\WEB-INF\lib目录下
2、将fmt.tld拷贝到WEB-INF目录下
3、修改WEB-INF目录下的web.xml文件,添加如下行到相应位置
   <taglib>
     <taglib-uri>/WEB-INF/fmt</taglib-uri>
     <taglib-location>/WEB-INF/fmt.tld</taglib-location>
   </taglib>
4、在要编辑的jsp文件头上添加<%@ taglib uri="/WEB-INF/fmt.tld" prefix="fmt" %>以支持fmt

  第二步是要在系统中加入resource文件的支持

1、在javaresoruce目录下面的任意一个包中(下面假定是sample包)创建resource文件,名称为test.properties
2、在其中输入如下一行内容测试
   test=中文内容
3、在sample目录下面创建一个bat文件,名字叫做encode.bat,编辑内容如下
   %JAVA_HOME%\bin\native2ascii -encoding gb2312 test.properties test_zh.properties
   然后保存退出
4、双击此bat文件执行,执行后会生成一个名称为test_zh.bat的文件
5、在struts-config.xml文件中 <controller/>后面加入下面这一行内容
   <message-resources parameter="sample.test.properties"/>
6、在需要编辑的jsp文件中编辑如下,其中titleKey是关键
   <fmt:bundle basename="sample.test_zh">
   <display:table…>
     <display:column property="name" <b>titleKey="test"</b> headerClass="sortable"/>
   </display:table>
   </fmt:bundle>

这样displaytag列名显示的就是“中文内容”了:)

displaytag的使用方法(用于数据表格的显示和功能控制)Displaytag1.1版本使用方法
一、   安装步骤
1.        下载displaytag-1.1-bin.zip后解压缩并将displaytag-examples-1.1.war中的WEB-INF/lib类包放入自己的web应用程序中的WEB-INF/lib目录下,并将WEB-INF/classes中的displaytag.properties放入到自己web应用程序中的WEB-INF/classes目录下。


2.        将displaytag-examples-1.1.war中的资源文件放置到与自己web应用程序同级的目录中,资源文件包括css,images,img三个文件夹下的所有内容。
二、   使用方法
1、 得到要显示的数据源
有四种范围
   pageScope
   requestScope (默认)  <display:table name="test" >
   sessionScope  <display:table name="sessionScope.sessiontest" > 注意,这里要指定范围   
  applicationScope 同上
2、 全部数据显示
<% request.setAttribute( "test", new TestList(20, false) ); %>
  <display:table name="test" ></display:table>
  标签将遍历List里的每一个对象,并将对象里的所有属性显示出来。
  name属性用来对应list对象的名称
3、 部分数据显示
<% request.setAttribute( "test", new TestList(20, false) ); %>
  <display:table name="test" >
      <display:column property="id" title="ID"/>
         <display:column property="name" title="姓名" />
      <display:column property="email" title="电子邮件"/>
      <display:column property="url" title="网址"/>
         <display:column property="money" title="Money"/>
  </display:table>
  property对应List里对象的属性(用getXXX()方法取得),title则对应表格表头里的列名。
4、 表格的样式定义
共有的表格样式为isis,its,mars,simple,report,mark五种,默认为isis
表格样式设定为mark后可以设定column的样式属性
<display:table name="test" class="isis" >
      <display:column property="id" title="ID"/>
         <display:column property="name" title="姓名"  />
      <display:column property="email" title="电子邮件" class="tableCellError"/>
      <display:column property="url" title="网址"/>
         <display:column property="money" title="Money"/>
  </display:table>
通过class属性来指定所要应用的样式。

5、 数据的自动连接功能
如果显示的数据中包含emal和ur时,可以通过设定display:column里的autolink="true"来直接连接
<display:table name="test" >
      <display:column property="id" title="ID"/>
         <display:column property="name" title="姓名"  />
      <display:column property="email" title="电子邮件" autolink="true" />
      <display:column property="url" title="网址" autolink="true"/>
         <display:column property="money" title="Money"/>
  </display:table>

6、 数据的排序
在需要排序的column里增加sortable="true"属性,headerClass="sortable"是指定显示的样式。
   defaultsort="1"    默认第一个column排序
   defaultorder="descending"    默认递减排序
<display:table name="test" defaultsort="1" defaultorder="descending">
  <display:column property="id" title="ID" sortable="true" headerClass="sortable" />
  <display:column property="name" sortable="true" headerClass="sortable"/>
  <display:column property="email" />
  <display:column property="status" sortable="true" headerClass="sortable"/>
</display:table>

7、 数据的动态连接
实现数据的动态连接有两种方法。第一种为使用标签库的属性值来设置连接地址,这种方法实现的动态连接比较简单,只能实现类似 xxx.jsp?id=1的连接样式。第二种方法为通过自定义一个Wrapper类继承TableDecorator来实现表格中动态连接的数据内容,这样就可以实现类似xxx.jsp?id=1&action=add的连接样式。

第一种动态连接使用方法:在<display:column/>里通过增加href、paramId、paramName、paramScope、paramProperty属性
      href             基本的URL 地址
      paramId          加在URL 地址后的参数名称
      paramName        数据bean的名称,一般为null(即使用当前List里的对象)
      paramScope       数据bean的范围,一般为null
      paramProperty    数据bean的属性名称,用来填充URL 地址后的参数值
<display:table name="test">
      <display:column property="id" title="ID" href="details.jsp" paramId="id" />
      <display:column property="email" title="电子邮件"
href="details.jsp" paramId="action" />
      <display:column property="url" title="网址"
href="details.jsp" paramId="id" paramProperty="email"  />
</display:table>
第一列的连接地址为details.jsp?id=1
第二列的连接地址为details.jsp?action=ss@sfd.com
第三列的连接地址为details.jsp?id=ss@sfd.com

第二种动态连接使用方法:首先编写MyWrapper.java文件,代码如下

    import org.displaytag.decorator.TableDecorator;
import com.module.DateModule;   // DateModule为将来要在tag中进行显示的数据bean。

public class MyWrapper extends TableDecorator{
      
    public MyWrapper ()
    {
        super();
    }
   
    public String getLink2()
    {
        DateModule myModule = (DateModule) getCurrentRowObject();
        int id = DateModule.getId().intValue();

        return "<a href=\"details.jsp?id=" //$NON-NLS-1$
            + id
            + "&amp;action=view\">查看</a> | " //$NON-NLS-1$
            + "<a href=\"details.jsp?id=" //$NON-NLS-1$
            + id
            + "&amp;action=edit\">编辑</a> | " //$NON-NLS-1$
            + "<a href=\"details.jsp?id=" //$NON-NLS-1$
            + id
            + "&amp;action=delete\">删除</a>"; //$NON-NLS-1$
    }
}

   然后编写jsp页面,首先在页面中import一下自己定义的MyWrapper,在<display:table>中增加decorator=” MyWrapper”属性,在数据显示的列种添加
<display:column property="link2" title="Actions" />

三、      备注说明
此文档只列举了一些经常用到的表格显示例子,其他的功能暂没进行详细列举。
关于此标签的分页功能说明: 此标签还有的功能包括实现对list的数据分页,但是由于对海量数据支持的不完善性暂不介绍,在进行分页的时候我们仍然用hibernate的分页方法实现分页,传递数据时只传递当前页的List对象数据。
关于样例程序的说明:在displaytag-examples-1.1.war中的例子基本上包含了所有displaytag所有能做到的效果显示。其中所有例子都是基于JSP XML syntax这种格式的页面文件编写的。当用普通的jsp页面进行测试时应该在文件顶部加入标签库信息<%@ taglib uri="http://displaytag.sf.net" prefix="display" %> 同时应当将标签库要用到的css样式导入到页面中
  <style type="text/css" media="all">
      @import url("css/maven-base.css");
      @import url("css/maven-theme.css");
      @import url("css/site.css");
      @import url("css/screen.css");
  </style>

2006年05月22日

http://issues.appfuse.org/browse/APF-10 

“Here is an e-mail I received from Javier Muguruza (jmuguruza-AT-galeonsoftware.com) about how to setup MyEclipse for AppFuse. We should try this ourselves, refine it and make it into a HowTo on the wiki. If it’s simple enough – maybe even include out-of-the-box support.”

这是我从Javier Muguruza (jmuguruza-AT-galeonsoftware.com) 收到的关于"如何设置MyEclipse for AppFuse"的邮件.我们将亲自尝试,推敲它并把它编进WIKI HOWTO.如果它足够简单,或许还包括out-of-the-box支持.

I am using appfuse to set a standard way to implement our new projects. We use
Myeclipse heavily, so I wanted to be able to deploy the apps with myeclipse so
we can debug with it (the main reason to use myeclipse for us). I saw in your
blog (or wiki I dont remember anymore) that appfuse and myeclipse are not
integrated yet, you mentioned if someone could get it done you would like to
hear it. I guess it has already been done, but I have not found anything… I
got it working after some work, so in case it helps here it is (probably it can
be done much elegantly than my way!!):

我正在使用appfuse作为我们的新项目的标准方法.我们习惯使用Myeclipse,所以我想能够使用Myeclipse发布程序这样我样就可以调试(主要原因是我们使用Myeclipse).我看到在你的blog(也许是WIKI我记不清了),appfuse and myeclipse还没有结合起来,你提到你很愿意听到某个人能够完成它.我猜这件事已经被完成了,不过我没发现.我完成了一些工作,希望会帮上一些忙(可能它可以被完成得更漂亮,比起我的方法).

1. First I wanted to start from deploy-web, but in the build dir I could not see
any class or jar, I dont know if that’s ok or I did something wrong. So instead
I created a new target (myeclipse-web) based on deploy target. It simply creates
a war and unpacks it to ${basedir}/webroot.
1.首先我想从发布web开始,只是我在构建路径里没有看到任何类或者jar包,我不知道该怎么弄好,也许我什么地方做错了.于是我创建了一个基于发布对象的新对象(myeclipse-web).它可以简单地创建一个WAR包并且解包到${basedir}/webroot.

2. Copy the files in webroot\WEB-INF\classes\ (only the ones in that dir, not
recursively) to a new dir: src\properties\. This is needed cause all the files
(all but xml files) that are under webroot\WEB-INF\classes are deleted by
myeclipse during deploying.
2.拷贝webroot\WEB-INF\classes\ (只是这个目录下的,不递归)目录下的文件到一个新目录:src\properties\.这需要产生所有的位于webroot\WEB-INF\classes目录下被myeclipse在发布时删除的文件(所有除了xml文件的).


3. Now import the project into eclipse. Add the src\properties as another source
folder.
3.现在把工程导入到eclispe.添加src\properties目录做为另一个源文件夹.


4. In the myeclipse contextual menu select Add WebProject capabilities:
       - select webroot as the web root folder
       - uncheck create web.xml and select None in j2ee radio buttons
       - finish
4.在myeclipse上下文菜单选择"添加WebProject"

-选择webroot作为web根文件夹

-uncheck创建web.xml并去掉J2EE前的单选

-完成
5. Be sure ‘ant setup-tomcat’ has been run at least once so that the context xml
file is put into ${tomcat.base}/conf/Catalina/localhost/${webapp.name}.xml (more
on that later)
确认’ant setup-tomcat’ 已经运行至少一次, context xml文件放到${tomcat.base}/conf/Catalina/localhost/${webapp.name}.xml
6. Deploy the project with myeclipse
用myeclipse发布工程
7. Start tomcat and set a breakpoint
启动tomcat并设置断点
8. When you hit the breakpoint, you can edit the java source and the new code
gets redeployed as usual.
当你击中断点时,你可以编辑JAVA源程序并且新代码已经被重新发布.
I have noticed that more jars than needed are deployed by myeclipse (the ones
for checkstyle etc), it does not bother me for now. I am using eclipse 3.0.1,
myeclipse 3.8.4 and appfuse1.7 (+ appfusegen1.7.2)
我已经注意到通过myeclipse发布需要更多JAR包,现在已经不再困扰我.我正在使用的是eclipse3.0.1,myeclipse 3.8.4 and appfuse1.7 (+ appfusegen1.7.2)

While doing all this I have noticed that appfuse does not take into account
CATALINA_BASE if you have it defined in your environment. I suppose you know
what CATALINA_BASE does. I have modified properties.xml and build.xml in order
to take into account CATALINA_BASE.
当所有这些完成时,我注意到appfuse没有考虑CATALINA_BASE,如果你已经在环境变量中定义了它.假设你知道CATALINA_BASE是什么的.我已经修改了properties.xml 和build.xml 以便考虑CATALINA_BASE.
In properties.xml I have added a task setTomcatBase that sets tomcat.base to
CATALINA_BASE or CATALINA_HOME (if CATALINA_BASE is not set), and in build.xml I
added a dependency to setup-tomcat on setTomcatBase. Also I replace every
"if="tomcat.home"" with a depends=setTomcatBase. Then I changed tomcat.home to
tomcat.base where I thought it should be changed (I was not sure in the testing
tasks).It works in my env, both with CATALINA_BASE set and unset.
在properties.xml 里我添加了一项setTomcatBase任务以设置tomcat.base 为CATALINA_BASE 或CATALINA_HOME,并在build.xml…..

2006年05月18日
  • 刚想看看Ajax,发现已经热得烫手,索性拿来主义,抄文一篇,看起来方便。
  • 这里是原文http://www.didaman.com/ShowBlog.asp?BlogID=206
  • 作者:杰少 发表时间:2006-2-25 16:57:00
  • 由于在研究web即时通技术(TRACQ,网眼,网站商务通),所以对Ajax感兴趣起来,最近好像Ajax很火,从搜索引擎的结果可见一斑。baidu找到181,000篇相关文档,google找到了6,790,000篇。我觉得,在没有提出Ajax这个概念以前,肯定有人已经在利用这些技术做事情了,只是在最近才被炒的热闹起来。我先把网上找的资料整理在这里。

      1、定义

      Ajax最早是由Jesse James Garrett提出来的,原文:Ajax: A New Approach to Web Applications
      网上公认的定义:Ajax是Asynchronous JavaScript   XML的缩写,它也不是单一技术,而是几种技术的强有力组合。它包括
      使用XHTML和CSS标准化呈现;
      使用DOM实现动态显示和交互
    ;
      使用XML和XSLT进行数据交换与处理
    ;
      使用XMLHttpRequest进行异步数据读取
    ;
      最后用JavaScript绑定和处理所有数据
    ;

      2、为什么用Ajax


      就我自己而言,我是因为想让web即时通客户端不受不断刷新页面的烦扰。
      1、通过适当的Ajax应用达到更好的用户体验;2、把以前的一些服务器负担的工作转嫁到客户端,利于客户端闲置的处理能力来处理,减轻服务器和带宽的负担,从而达到节约ISP的空间及带宽租用成本的目的。

      3、已有的Ajax应用

            msn space
            Orkut
            Gmail
            Google Groups
            Google Suggest
            Google Maps

      4、Ajax的相关文章和资源
      5、学习ajax要看的书 原文
      1)、XHTML 教程(XHTML)
      2)、JavaScript 权威指南第四版(JavaScript: The Definitive Guide)

      3)、XML 高级编程(Professional XML)

      4)、网站重构(Designing with Web Standards)
  •  台湾钓法是一种现代的、设计科学的双钩长脑线悬坠垂钓方法。其超长的专用立漂上可反应出比通常七星漂多好几倍的信号反应,这可能也是吸引成千上万钓友如痴如醉学习、研究台湾钓法的魅力所在。台湾钓法中,在不同的环境下浮漂信号反应变幻莫测。这里就入门时,以基本的‘调四目,钓二目’常见的浮漂12种反应及处理办法作一介绍,供初学者参考。

      1)抛竿后,按理数秒钟后浮漂受铅坠重力影响会慢慢立直,但在应立直时还平浮躺着不动,这一般是小鱼在中上层接住钩饵(排除钩坠、钱被水草等搁住),应及时扬竿。

      2)竿抛出后,浮漂在还末立直时就发现快速地向河心方向移位。这是中、上层鱼抢食而走的信号,且很可能是较大的草的、鳊鱼吞钩,应立即扬竿。

      3)抛竿后,浮漂开始立直,自然慢慢下沉,但还未到稳定“钓二目”时就见漂尾上、下跳动。这种信号反应是鱼在中下层咬钩。处理办法:一是在浮漂短促有力下顿的瞬间扬竿。二是见漂尾回升数目不再上浮(停顿)时扬竿。

      4)浮漂稳定露出水面二目,但突然下沉不见。大多数不是鱼咬钩信号,而是鱼的身体、尾巴擦到鱼线所致。如果在风浪中垂钓,这种信号也有可能表示鱼知食。处理办法是可稍等1~2秒钟,若不见浮漂冒出水面,即扬竿。

      5)浮漂立直,漂尾露出水面稳定二目,不时冉冉升为三目或目半后又缓慢沉到二目。这是鱼在钩饵周围吃食、活动索引 起水流水压变化,不是鱼儿咬钩,不可扬 竿。但说明这时浮漂 感觉好,很敏感。

      6)浮漂稳定“钓二目”时,先发现徐徐上升一目左右,而后短促有号.应在见浮漂缓慢上升时,作好扬竿准备,当浮漂短促有力下沉 的瞬间即 扬竿。

      7)抛竿后,浮漂立直稳定钓二目,只见慢慢上升至三目,但在上升还未停顿时又有短促有力下沉的信号出现。这很可能是两条鱼分别先后咬双钩饵,应在短促有力下沉时迅速扬竿,往往一竿上双鱼。人门后,有经验的钓手可专门钓双鱼。

      8)浮漂稳定钓二目时,未见正常“下顿”信号,漂尾徐徐上升到三目、四目,直到上升停顿。这大部分是鱼咬钩信号,不管其上升至几目,只要认定上升已停顿即扬竿。但要注意,钓者应有耐心,浮漂还在上升时不要扬竿。

      9)浮漂稳定约二目,只见慢慢露一目或全部沉入水中,但不是短促下沉。而后又渐渐回升到二目。这是“假信号”不是咬钩真信号。常是由于母线本压入水中,受风力影响牵压浮漂;或因水有缓流使浮漂不稳定。此时不要扬竿,应设法把母线压入水中等稳定浮漂。

      10)抛竿后,副漂下沉到两目,又缓缓升到三目或四目,这共有三种情况:一 是双钩上的饵化掉一个粉饵,漂 会露三目;二是双钩上的二粒粉饵都已化教完,漂 露四;三是小鱼来吃饵,但只是顶在口上,吃不进嘴里。处理的办法是将竿子稍向身边移动20厘米左右,将浮漂压入水中。移位漂下压入水后又回到露四目,说明双钩已 无饵,应起竿重新装食;如移动时发现浮漂有短促有力下沉的信号,说明鱼已吞约,应迅速扬竿.

      11)抛竿后,浮漂立直下沉,但一直沉不到二目,而在四目,也不见上浮或移位。这可能是饵料太松软,已在下沉过程中化散掉;或下沉时被鱼咬掉(常见于有风浪环境);也有可能因池底不平造成。处理的办法是轻轻后移一下浮漂,将漂压至露二目,如一忽儿又回到四目,则应起竿装食,再抛竿。

      12)浮漂在稳定钓二目时,不见上下浮动,而是不断左右慢慢摇摆,时而为漂尾小幅度抖动。这不是鱼儿咬钩的信号。前者是鱼在水体中下层游动、觅食引起水流、水压变化影响到悬坠移位带动浮漂出现的信号;后者则是上层的小鱼在戏线、戏漂,均不可扬竿。

    2006年05月17日
    从接触J2EE框架到现在前后差不多有两年时间,真正开始学习是在二OO五年底,由于项目中并没有使用开源框架,所以一直处于自学习状态,而且时断时续.一开始的学习很初级,只是在一个WEB工程中把STRUTS/HIBERNATE/SPRING/LOG4J等流行的框架合到一起配置,看了一眼他们都长什么样子.
    直到昨天,见到了AppFuse,用框架搭建的框架.看过下文中的描述,可以大致了解AppFuse的样子,它把Hibernate、Struts、Spring、DBUnit、Ant、Log4J、Struts Menu、Xdoclet、SiteMesh、Velocity、JUnit、JSTL、WebWork这些框架都集成到了一起,这不正是我要做的吗,哈哈.
    我想,在国内很多项目的开发中,应该用到类似的方式,拿几个需要的框架过来搭一个自己想要的东东,但是国内的开源气氛太差了,大家各自为政,其实是个极大的浪费。没办法,谁叫我们的人才多呢。现在,我们又浪费了一个机会,框架之上的框架又被别人先走一步,总是被人牵着鼻子走的感觉总是不爽。所以,还是好好学习啦。
    [转]使用AppFuse进行开发的总结
    AppFuse是一个集成了当前最流行的Web应用框架的一个更高层次的Web开发框架,也可以说是一个Web开发基础平台,它与它所集成的各种框架相比,它提供了一部分所有Web系统开发过程中都需要开发的一些功能,如登陆、用户密码加密,用户管理、根据不同的用户可以展现不同的菜单,可以自动生成40%-60%左右的代码,自带了默认的一些在CSS中设定的样式,使用这些样式能很快的改变整个系统的外观,还有自动化测试的功能。

    它最大的价值就是为我们提供了一个Web开发的新的方式和思路,尽管这些技术在国外都已进很流行了,但在国内能够将Hibernate、Struts、Spring、DBUnit、Ant、Log4J、Struts Menu、Xdoclet、SiteMesh、Velocity、JUnit、JSTL、WebWork这些技术集成到一个框架中的还不多见,所以即使不使用它的全部功能,它也给我们提供了一个很好的借鉴、学习的机会。

    通过关注AppFuse,我们可以看到目前国外的主流开发都使用了哪些技术,开发方式是什么样的,可能达到什么样的结果,而在以前,是很少能够看到这样完整的例子的。
    AppFuse的另一个启示是:我们可以依靠开源软件的功能降低开发成本,而且可以阅读开源软件的代码提高所在团队的整体实力。

    AppFuse的作者 matt raible是当今开源世界一个比较活跃的开发者,它是AppFuse、Struts Menu的作者,也是XDoclet、DisplayTag等一些著名开源项目的积极参与者,《Hibernate In Action》的作者就在感谢的名单里面提到他,XDoclet的下载版本中所带的Hibernate标签部分的例子就是他写的,他还是2004年Apache技术年会的主讲人之一。(这些都是我这2个多月来搜集到的,呵呵)

    但是通过2个月的实际学习和使用,我也遇到一系列的问题,因为AppFuse是将其他的一些类库或者框架集成在一起的,集成的技术众多,而且有一些技术在国内甚至很少有人知道,资料也比较少,所以虽然作者经过了一些测试,但都是基于英文编码的,而对于中文编码来说,还潜在的存在着一些问题,虽然不是AppFuse的问题,但却降低了开发速度,下面是我在开发过程中遇到过的问题,有些解决了,有些还没有解决:
    一.Struts
    1. AppFuse中默认的MVC框架是Struts,而且使用的是LookupDispatchAction,并且使用的是按钮(button),在XP下用IE浏览效果还可以,但如果在2000或者98下,就使外观很难看,而且当时我还遇到一个问题:如果按钮显示中文,则在DisplayTag中翻页失灵,而且报错,后来我把BaseAction的相关方法改变了,才可以使用,因为国内的客户都比较重视界面,所以后来我将那些按钮都改成图片了,当然也要添加一些方法了,有点麻烦!
    2. Struts中的标签如今推荐使用的只有html部分的标签了,其他的标签或者可以使用JSTL替代,或者已经不推荐使用了,而且AppFuse中推荐使用JSTL,而JSTL和struts的标签的联合使用时,需要的不是<标签>,而是<标签>,这个问题曾经困扰了我整整2天。
    3. Struts的Validation的校验规则并不完善,比如如果使用客户端的javascript校验,则在邮箱中输入汉字根本校验不出来,到了服务器端报错。
    4. 最严重的问题是AppFuse生成的Struts的validation.xml文件中有许多多余的“.”,如果你去掉了,常常在执行ant的deploy任务时又恢复原样。这样是提交表单的时候经常会报javascript的脚本错误或者缺少对象或者缺少value,所以我会手工的修改这个文件,然后把修改后的文件备份,当重新生成有错误的文件时,我会用备份的没有错误的文件去覆盖。
    5. Struts的validatioin对于使用同一个FormBean的Action的校验方式比较复杂。(待解决)。

    二.Hibernate
    1. Hibernate是现在受到越来越多的人推崇的一个ORM工具(框架、类库),它将我们从繁琐的使用JDBC的开发过程中解放出来,但同时也带来了新的问题,如学习曲线,执行效率,数据库设计优化,还有最重要的灵活性。Hibernate不是一个很容易上手的东西,要完全驾驭它还需要读很多资料,但好的资料却很少。
    2. 使用Xdoclet可以很方便的生成Hibernate中的持久类的配置文件(*.hbm.xml),但对一些特殊的映射却无能为力,如使用序列的id生成规则,序列的名字没有地方写,所以也只好先利用它生成主要的内容,然后手工修改。
    3. 同样还是id的生成策略问题,如果使用序列、hilo等需要一些数据库机制支持的策略时,schemaExport并不能自动生成序列或者保存当前id的表,这项工作仍然要手工解决。
    4. Hibernate中提供了几种关联,一对一、一对多、多对多,但对于怎样调整效率却没有一个很明确的提示,还要根据情况判定,这就带来和一些弹性的设计。
    5. Hibernate中可以选择的操作数据库的方式有3种,其中HQL功能最强大,但有些功能使用标准查询可能会更方便,但会有一些限制,所以虽然它很灵活,但易用性不如JDBC好。

    三.Spring
    在AppFuse的过程中,Spring完全隐藏在幕后,除了一些配置外,几乎感觉不到它的存在,所以我在使用它的过程中并没有遇到什么麻烦,这里只是简单的介绍一下它在AppFuse中起到的作用。
    1. Spring在AppFuse中起到的主要作用是对Hibernate的Session和事务的管理,利用Spring封装的Hibernate模板类,我们大大地减少了实现DAO的代码行数。
    2. Spring还起到了连接映射文件和类之间的关联,及接口和实现类之间的关联,这些都依赖于Spring的IoC的机制的实现。
    3. 对于字符进行编码和解码部分用到了Spring自带的Filter,只需要在配置文件中配置就好了。

    四.SiteMesh
    SiteMesh是一个基于Decorator模式的技术,它可以修饰返回的网页文件,它的工作方式受到越来越多的人的推崇,这点从Manning出版的一些技术书籍中可以看出来。
    我在使用SiteMesh的过程中并不顺利,我参考了《Java Open Source Programming》,这本书中说SiteMesh在默认的情况下不对下载文件进行装饰,但我在下载文件时发现,我的文件内容被丢弃了,取而代之的是SiteMesh的模板的内容,后来我通过修改SiteMesh的配置文件解决了这个问题,但感觉还有一些不太清楚的地方需要学习。

    五.DisplayTag
    DisplayTag是一个优秀的显示内容的标签,从SourceForge的访问量来看,它是很活跃的项目,仅次于Ant、Hibernate、Xdoclet等几个著名的项目,我总结,它的主要功能有4项:显示、分页、排序、将显示的数据写入指定类型的文件中,然后下载。
    1. 据我使用的情况看,我只使用了分页和显示的功能,因为当时我没有很好的解决中文编码的问题,所以排序会有问题,直到昨天,我在朋友的帮助下解决了这个问题,至此我可以放心使用的功能又增加了排序(我昨天简单的测试了一下是可以的)。

    2. 但对于将显示的内容生成到一个指定格式的文件中的功能却有着很多缺陷,如:
    (1) 生成的文件中只有显示的数据,那些没有显示在界面上的的数据,则不会被写到文件中。
    (2) 如果修改了DisplayTag的显示的内容,比如添加一列,在这列中的内容不是字符,而是HTML的标签,则生成的文件只有这些HTML标签,而没有数据。
    (3) 即使DisplayTag中没有我们定制的HTML脚本,生成的文件偶尔也有问题,比如:它会把“007”生成为“7”,把字符串自动的转换为整型值。有时候还生成空白内容的文件。
    (4) DisplayTag生成的Excel文件兼容性不好,有时在Excel2003中不能正常打开,或者在XP下打开报错。
    后来,我看了作者写的《Spring Live》,书中说如果想实现稳定的Excel,推荐使用POI,于是我使用POI生成Excel,稳定性和兼容性都不错。

    六.DBUnit
    DBUnit是一个可以被Ant集成的向数据库中添加数据和备份数据的一个类库,配置很方便,因为AppFuse已经集成好了,所以使用也很容易。
    但是如果你使用EditPlus之类的工具手工修改了AppFuse生成的内容,则执行Ant的setup、setup-db或者deploy的任务时,常常报错,说无效的格式,这是因为这个被手工修改的文件再次被AppFuse执行后,它的第一行的文件声明的前几个字母是无效的,是因为本地的字符集编码的原因而引起了乱码,如果把这几个无效的字母去掉,问题就解决了。

    七.Struts Menu
    Struts Menu也是AppFuse的作者开发的一个开源软件,它可以根据配置文件读取当前用户可以使用的功能菜单,这个功能是我一直以来都想要的,我也找到了一些代码,但实现的都不如这个完善,没什么好说的,使用简单,配置容易,很好的解决了我的问题。
    问题是我只使用了AppFuse提供的2个角色,对于多个角色的实验我还没有做。
    2006年05月16日
    错误信息如下
    Parsing of JSP File ‘/example-styles.jsp’ failed:
    ——————————————————————————–
     /example-styles.jsp(1): Could not parse deployment descriptor: java.io.IOException: cannot resolve ‘urn:jsptld:http://displaytag.sf.net’ into a valid tag library
    probably occurred due to an error in /example-styles.jsp line 1:
    <jsp:root version="1.2" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:display="urn:jsptld:http://displaytag.sf.net">
    ——————————————————————————–
    Tue May 16 11:12:30 CST 2006
    web.xml配置如下
        <taglib>
            <taglib-uri>http://displaytag.sf.net</taglib-uri>
            <taglib-location>/WEB-INF/displaytag.tld</taglib-location>
        </taglib>
       
    GOOGLE,只找到下面这个贴子,没有解决方案,但给了我提示.
    首先在TOMCAT下发布运行,果然没有cannot resolve 的问题,为什么Weblogic就是不行呢?
    我一直不明白’urn:jsptld’是什么意思,再查,说它表示相对路径,于是想到既然相对路径有问题,在我搞明白之前先用绝对路径不行吗?
    所以,将xmlns:display="urn:jsptld:http://displaytag.sf.net"换成xmlns:display="http://displaytag.sf.net",一试,哈哈,果然OK了,
    再于是,换成xmlns:display="/WEB-INF/displaytag.tld",也没有问题.
    好累,查了半天的资料,休息一下吧.
       Problem with Weblogic and tag library   
    Dec 6, 2005 9:08 AM
     
     
      we are trying to deploy an application that we have currently only deployed to tomcat.
    we are trying under WebLogic 8.1 SP2.
    We are getting the following error.
    /jsp/standardInputBA.jsp(1): Error in using tag library uri=’/WEB-INF/displaytag.tld’ prefix=’display’: The Tag class ‘org.displaytag.tags.ColumnTag’ has no setter method corresponding to TLD declared attribute ‘value’, (JSP 1.1 spec, 5.4.1)
    probably occurred due to an error in /jsp/standardInputBA.jsp line 1:
    <%@ taglib uri="/WEB-INF/displaytag.tld" prefix="display"%>
    Does anyone have any ideas on this?
    Again, this deploys just fine under tomcat.   
     gmachamer
    Posts:365
    Registered: 9/23/04  Re: Problem with Weblogic and tag library   
    Dec 6, 2005 9:14 AM (reply 1 of 5)
     
     
      my jsp has these taglibs declared in this way.

    <%@ taglib uri="/WEB-INF/displaytag.tld" prefix="display"%>
    <%@ taglib uri="/WEB-INF/struts-menu.tld" prefix="menu"%>
    <%@ taglib uri="/WEB-INF/fmt.tld" prefix="fmt"%>
    <%@taglib uri="/WEB-INF/c.tld" prefix="c"%>
      
     David_Waddell
    Posts:112
    Registered: 28/11/05  Re: Problem with Weblogic and tag library   
    Dec 6, 2005 10:58 AM (reply 2 of 5)
     
     
      means what it says.
    If you look in the file WEB-INF/displaytag.tld you’ll see it
    has a definition for a custom tag, I’m guessing it’s called column.
    The tld states that this tag has an attribute called "value". ie that
    in a jsp file you would write
       <display:column value="SomeSuperValue" />
    However the java class that implements that custom tag
    does not have a setter method for value. ie. the class
    org.displaytag.tags.ColumnTag is missing the method
    public void setValue(String value) { …. }
      
     gmachamer
    Posts:365
    Registered: 9/23/04  Re: Problem with Weblogic and tag library   
    Dec 6, 2005 11:38 AM (reply 3 of 5)
     
     
      yes that would be the obvious answer… but why would this work on tomcat and not Weblogic?
    I believe the answer must be that weblogic is more strict in its tld’s and tomcat will ignore an "Extra" attribute as long as it isn’t used.   
     gmachamer
    Posts:365
    Registered: 9/23/04  Re: Problem with Weblogic and tag library   
    Dec 6, 2005 11:40 AM (reply 4 of 5)
     
     
      as a continuation… this attribute is not in the TLD that is found in source forge.. so someone on the development team added it without updating the jars. after doing a search through the JSP’s no page seems to be using the attribute, so removing it should fix the problem.   
     David_Waddell
    Posts:112
    Registered: 28/11/05  Re: Problem with Weblogic and tag library   
    Dec 7, 2005 2:35 AM (reply 5 of 5)
     
     
      weblogic probably validates that the method is present when parsing the tld.
    tomcat probably doesn’t do this, and would just throw an exception at runtime
    when someone tried to use the attributein a tag. Since it wasn’t being used then
    it wouldn’t cause a prob in tomact.   

    DisplayTag是一个非常好用的表格显示标签,适合MVC模式,其主页在http://displaytag.sourceforge.net
      
      一、最简单的情况,未使用<display:column/>标签
      
      <%request.setAttribute( "test", new ReportList(6) );%>
      <display:table name="test" />
      
      标签遍历List里的每一个对象,并将对象里的所有属性显示出来。一般用于开发的时候检查对象数据的完整性。
      
      二、使用<display:column/>标签的情况
      
      <display:table name="test">
      <display:column property="id" title="ID" />
      <display:column property="name" />
      <display:column property="email" />
      <display:column property="status" />
      <display:column property="description" title="Comments"/>
      </display:table>
      
      property对应List里对象的属性(用getXXX()方法取得),title则对应表格表头里的列名。定义列有两种方式:
      
      A、<display:column property="email" />
      
      使用<display:column/>标签里的property属性来定义
      
      B、<display:column title="email">email@it.com</display:column>
      
      在<display:column/>标签体里增加内容,可以是常量,也可以用其他标签等等
      
      两种方式比较,用property属性来定义更加快速和利于排序。
      
      三、表格显示样式的定义
      
      A、在<display:table/>和<display:column/>标签里指定标准的html属性,烦琐
      
      B、修改样式表
      <display:table name="test" class="mars">
      <display:column property="id" title="ID" class="idcol"/>
      <display:column property="name" />
      <display:column property="email" />
      <display:column property="status" class="tableCellError" />
      <display:column property="description" title="Comments"/>
      </display:table>
      
      通过class属性来指定所要应用的样式。可以在其默认样式表里(./css/screen.css)直接修改
      
      四、标签取得数据的数据源
      
      有四种范围
      
      pageScope
      requestScope (默认) <display:table name="test2" >
      sessionScope <display:table name="sessionScope.holder.list" > 注意,这里要指定范围,非默认
      applicationScope
      
      五、通过增加id属性创建隐含的对象
      
      <display:table name="test" id="testit">
      <display:column property="id" title="ID" />
      <display:column property="name" />
      <display:column title="static value">static</display:column>
      <display:column title="row number (testit_rowNum)"><%=pageContext.getAttribute("testit_rowNum")%></display:column>
      <display:column title="((ListObject)testit).getMoney()"><%=((ListObject)pageContext.getAttribute("testit")).getMoney()%></display:column>
      </display:table>
      
      注意到在<display:table/>里增加了id属性,这时就在page context里创建了一个隐含对象,指向List里的当前对象,
      
      可以通过(ListObject)pageContext.getAttribute("id")来捕获这个对象。同时还创建了一个id_rowNum对象,同样,可
      
      通过pageContext.getAttribute("testit_rowNum")来捕获,它仅仅代表当前行的行数。
      
      有了这两个隐含对象,就可以通过其他标签来访问,例如Jstl:
      
      <display:table id="row" name="mylist">
      <display:column title="row number" >
      <c:out value="${row_rowNum}"/>
      </display:column>
      <display:column title="name" >
      <c:out value="${row.first_name}"/>
      <c:out value="${row.last_name}"/>
      </display:column>
      </display:table>
      
      六、显示部分数据
      
      显示开始五条数据:通过设定length属性
      
      <display:table name="test" length="5">
      <display:column property="id" title="ID" />
      <display:column property="email" />
      <display:column property="status" />
      </display:table>
      
      显示第三到第八条数据:通过设定offset和length属性
      
      <display:table name="test" offset="3" length="5">
      <display:column property="id" title="ID" />
      <display:column property="email" />
      <display:column property="status" />
      </display:table>
      
      七、对email和url地址的直接连接
      
      <display:table name="test" >
      <display:column property="id" title="ID" />
      <display:column property="email" autolink="true" />
      <display:column property="url" autolink="true" />
      </display:table>
      
      如果要显示的对象里包含email和url地址,则可以在display:column里直接设定autolink="true"来直接连接
      
      八、使用装饰模式转换数据显示(写自己的 decorator )
      
      A、对整个表格应用decorator
      
      <display:table name="test" decorator="org.displaytag.sample.Wrapper" >
      <display:column property="id" title="ID" />
      <display:column property="email" />
      <display:column property="status" />
      <display:column property="date" />
      <display:column property="money" />
      </display:table>
      org.displaytag.sample.Wrapper即自己写的decorator,它要继承TableDecorator类,看看它的一个方法:
      public String getMoney()
      {
      return this.moneyFormat.format(((ListObject) this.getCurrentRowObject()).getMoney());
      }
      
      很明显,它通过父类的getCurrentRowObject()方法获得当前对象,然后对其getMoney()方法进行‘油漆’
      
      B、对单独的column应用decorator
      
      <display:table name="test">
      <display:column property="id" title="ID" />
      <display:column property="email" />
      <display:column property="status" />
      <display:column property="date" decorator="org.displaytag.sample.LongDateWrapper" />
      </display:table>
      org.displaytag.sample.LongDateWrapper要实现ColumnDecorator接口,它的方法:
      public final String decorate(Object columnValue)
      {
      Date date = (Date) columnValue;
      return this.dateFormat.format(date);
      }
      
      显然,它获得不了当前对象(因为它实现的是接口),仅仅是获得该对象的columnValue,然后‘油漆’
      
      九、创建动态连接
      
      有两种方法创建动态连接:
      
      A、在<display:column/>里通过增加href、paramId、paramName、paramScope、paramProperty属性
      
      href       基本的URL 地址
      paramId     加在URL 地址后的参数名称
      paramName    数据bean的名称,一般为null(即使用当前List里的对象)
      paramScope    数据bean的范围,一般为null
      paramProperty  数据bean的属性名称,用来填充URL 地址后的参数值
      <display:table name="sessionScope.details">
      <display:column property="id" title="ID" href="details.jsp" paramId="id" />
      <display:column property="email" href="details.jsp" paramId="action" paramName="testparam" paramScope="request" />
      <display:column property="status" href="details.jsp" paramId="id" paramProperty="id" />
      </display:table>
      
      这种方法简便直接,但缺点是无法产生类似details.jsp?id=xx&action=xx的复合URL
      
      B、应用decorator 创建动态连接:
      
      <display:table name="sessionScope.details" decorator="org.displaytag.sample.Wrapper" >
      <display:column property="link1" title="ID" />
      <display:column property="email" />
      <display:column property="link2" title="Actions" />
      </display:table>
      org.displaytag.sample.Wrapper里的方法:
      public String getLink1()
      {
      ListObject lObject= (ListObject)getCurrentRowObject();
      int lIndex= getListIndex();
      return "<a href=\"details.jsp?index=" + lIndex + "\">" + lObject.getId() + "</a>";
      }
      
      public String getLink2()
      {
      ListObject lObject= (ListObject)getCurrentRowObject();
      int lId= lObject.getId();
      
      return "<a href=\"details.jsp?id=" + lId
      + "&action=view\">View</a> | "
      + "<a href=\"details.jsp?id=" + lId
      + "&action=edit\">Edit</a> | "
      + "<a href=\"details.jsp?id=" + lId
      + "&action=delete\">Delete</a>";
      }
      
      十、分页
      
      实现分页非常的简单,增加一个pagesize属性指定一次想显示的行数即可
      
      <display:table name="sessionScope.test" pagesize="10">
      <display:column property="id" title="ID" />
      <display:column property="name" />
      <display:column property="email" />
      <display:column property="status" />
      </display:table>
      
      十一、排序
      
      排序实现也是很简单,在需要排序的column里增加sortable="true"属性,headerClass="sortable"仅仅是
      
      指定显示的样式。column里的属性对象要实现Comparable接口,如果没有的话可以应用decorator
      
      defaultsort="1"       默认第一个column排序
      defaultorder="descending"  默认递减排序
      <display:table name="sessionScope.stest" defaultsort="1" defaultorder="descending">
      <display:column property="id" title="ID" sortable="true" headerClass="sortable" />
      <display:column property="name" sortable="true" headerClass="sortable"/>
      <display:column property="email" />
      <display:column property="status" sortable="true" headerClass="sortable"/>
      </display:table>
      
      注意的是,当同时存在分页时排序仅仅针对的是当前页面,而不是整个List都进行排序
      
      十二、column 分组
      
      分组只是需要在column里增加group属性
      
      <display:table name="test" class="simple">
      <display:column property="city" title="CITY" group="1"/>
      <display:column property="project" title="PROJECT" group="2"/>
      <display:column property="amount" title="HOURS"/>
      <display:column property="task" title="TASK"/>
      </display:table>
      
      十三、导出数据到其他格式(页面溢出filter??)
      
      在<display:table/>里设定export="true"
      
      在<display:column/>里设定media="csv excel xml pdf" 决定该字段在导出到其他格式时被包不包含,不设定则都包含
      
      <display:setProperty name="export.csv" value="false" />
      
      决定该种格式能不能在页面中导出
      
      <display:table name="test" export="true" id="currentRowObject">
      <display:column property="id" title="ID"/>
      <display:column property="email" />
      <display:column property="status" />
      <display:column property="longDescription" media="csv excel xml pdf" title="Not On HTML"/>
      <display:column media="csv excel" title="URL" property="url"/>
      <display:setProperty name="export.pdf" value="true" />
      <display:setProperty name="export.csv" value="false" />
      </display:table>
      
      十四、配置属性,覆盖默认
      
      两种方法:
      
      A、在程序classpath下新建displaytag.properties文件
      
      B、对于单个表格,应用<display:setProperty>标签
      
      具体可配置的属性:http://displaytag.sourceforge.net/configuration.html
      
      十五、一个完整的例子
      
      <display:table name="test" export="true" sort="list" pagesize="8">
      <display:column property="city" title="CITY" group="1" sortable="true" headerClass="sortable"/>
      <display:column property="project" title="PROJECT" group="2" sortable="true" headerClass="sortable"/>
      <display:column property="amount" title="HOURS"/>
      <display:column property="task" title="TASK"/>
      </display:table>
      
      sort="list" 对整个list进行排序
      
      导出数据到其他格式时,group无效