<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>zengsun</title>
    <description></description>
    <link>http://zengsun.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>降低updatedb的执行频率</title>
        <author>zengsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zengsun.javaeye.com">zengsun</a>&nbsp;
          链接：<a href="http://zengsun.javaeye.com/blog/161863" style="color:red;">http://zengsun.javaeye.com/blog/161863</a>&nbsp;
          发表时间: 2008年02月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          你可能会发现一个叫updatedb的进程在疯狂的运行，占用了你非常多的系统资源。<br />那么这个就是由[cron]自动运行的更新系统数据的脚本。<br />作用是为你系统里面的文件建立索引(whereis的速度快的原因)<br /><br />优化方法如下，仅供参考。<br /><br />    * #ls /etc/cron* <br /><br />你能看到cron.daily和cron.weekly等文件夹，并且在cron.daily里面应该有slocate等脚本。<br /><br />    * #sudo mv /etc/cron.daily/slocate /etc/cron.weekly/ <br /><br />把这个定时更新的工作频率从每天一次降低到每周执行一次。<br /><br />    * #sudo vi /etc/updatedb.conf <br /><br />找到PRUNEPATHS，在後面添加上你不想让这个updatedb建立索引的目录。
          <br/><br/>
          <span style="color:red;">
            <a href="http://zengsun.javaeye.com/blog/161863#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 11 Feb 2008 11:02:19 +0800</pubDate>
        <link>http://zengsun.javaeye.com/blog/161863</link>
        <guid>http://zengsun.javaeye.com/blog/161863</guid>
      </item>
      <item>
        <title>如何使Tomcat在Linux下自动启动</title>
        <author>zengsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zengsun.javaeye.com">zengsun</a>&nbsp;
          链接：<a href="http://zengsun.javaeye.com/blog/161711" style="color:red;">http://zengsun.javaeye.com/blog/161711</a>&nbsp;
          发表时间: 2008年02月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          由于想部署一个Grails应用在Tomcat上，所以希望Tomcat可以自动启动。<br /><br />首先参考官方文档：<a href="http://tomcat.apache.org/tomcat-6.0-doc/setup.html" target="_blank">Apache Tomcat 6.0 Tomcat Setup</a>的“Unix daemon”部分。<br /><div class="quote_title">Apache Tomcat 6.0 Tomcat Setup 写道</div><div class="quote_div">Tomcat can be run as a daemon using the jsvc tool from the commons-daemon project. Source tarballs for jsvc are included with the Tomcat binaries, and need to be compiled. Building jsvc requires a C ANSI compiler (such as GCC), GNU Autoconf, and a JDK.</div><br />Tomcat可以使用来自commons-daemon项目的jsvc工具作为一个Linux/Unix守护进程运行起来。jsvc的源码包已经包含在Tomcat的bin目录下，并且需要自己编译。编译需要标准C(ANSI C)的编译器(例如GCC)、GUN Autoconf 和JDK。<br /><br />自己准备编译环境，然后按照下面步骤编译项目。<br /><pre name="code" class="java">
    cd $CATALINA_HOME/bin
    tar xvfz jsvc.tar.gz
    cd jsvc-src
    autoconf
    ./configure --with-java=/usr/local/jdk1.5.0 (自己的JDK路径)
    make
    cp jsvc ..
    cd ..
</pre><br />好了，现在你可以通过jsvc将Tomcat作为守护进程运行起来。<br />命令可以参考官方文档：<br /><div class="quote_title">Apache Tomcat 6.0 Tomcat Setup 写道</div><div class="quote_div"><br />Tomcat can then be run as a daemon using the following commands.<br /><br /><pre name="code" class="java">
    cd $CATALINA_HOME
    ./bin/jsvc -cp ./bin/bootstrap.jar \
        -outfile ./logs/catalina.out -errfile ./logs/catalina.err \
        org.apache.catalina.startup.Bootstrap
</pre><br /><br />jsvc has other useful parameters, such as -user which causes it to switch to another user after the daemon initialization is complete. This allows, for example, running Tomcat as a non privileged user while still being able to use privileged ports. jsvc --help will return the full jsvc usage information. In particular, the -debug option is useful to debug issues running jsvc.<br /><br />The file $CATALINA_HOME/bin/jsvc/native/tomcat.sh can be used as a template for starting Tomcat automatically at boot time from /etc/init.d. The file is currently setup for running Tomcat 4.1.x, so it is necessary to edit it and change the classname from BootstrapService to Bootstrap.<br /></div><br />上面的英文比较容易懂了，就不翻译了。<br /><br />我们可以看一下$CATALINA_HOME/bin/jsvc/native/tomcat.sh 这个文件(因为我们需要根据自己的环境修改这个文件)。<br />但是实际的启动文件和它有些不同，主要是需要支持chkconfig。<br /><div class="quote_title">tomcat 写道</div><div class="quote_div"><br />#!/bin/sh<br />#<br /># Startup Script for Tomcat6<br />#<br /># chkconfig: 345 88 14<br /># description: Tomcat Daemon<br /># processname: jsvc<br /># pidfile: /var/run/jsvc.pid<br /># config:<br />#<br /># Source function library.<br />. /etc/rc.d/init.d/functions<br />#<br />prog=tomcat<br />#<br />JAVA_HOME= <span style="color: red">你的JDK目录(例如：/usr/local/jdk-1.5.0)</span><br />CATALINA_HOME= <span style="color: red">你的tomcat目录</span><br />DAEMON_HOME= <span style="color: red">你的jsvc目录(本例中其实就是Tomcat的bin目录)</span><br />TOMCAT_USER=tomcat6 <span style="color: red">启动Tomcat的用户名！</span><br /><br /># for multi instances adapt those lines.<br />TMP_DIR=/var/tmp<br />PID_FILE=/var/run/jsvc.pid<br />CATALINA_BASE= <span style="color: red">你的tomcat目录</span><br /><br />CATALINA_OPTS=<br />CLASSPATH=\<br />$JAVA_HOME/lib/tools.jar:\<br />$CATALINA_HOME/bin/commons-daemon.jar:\<br />$CATALINA_HOME/bin/bootstrap.jar<br /><br />case "$1" in<br />  start)<br />    #<br />    # Start Tomcat<br />    #<br />    $DAEMON_HOME/jsvc-src/jsvc \<br />    -user $TOMCAT_USER \<br />    -home $JAVA_HOME \<br />    -Dcatalina.home=$CATALINA_HOME \<br />    -Dcatalina.base=$CATALINA_BASE \<br />    -Djava.io.tmpdir=$TMP_DIR \<br />    -wait 10 \<br />    -pidfile $PID_FILE \<br />    -outfile $CATALINA_HOME/logs/catalina.out \<br />    -errfile '&1' \<br />    $CATALINA_OPTS \<br />    -cp $CLASSPATH \<br />    org.apache.catalina.startup.Bootstrap<br />    #<br />    # To get a verbose JVM<br />    #-verbose \<br />    # To get a debug of jsvc.<br />    #-debug \<br />    exit $?<br />    ;;<br /><br />  stop)<br />    #<br />    # Stop Tomcat<br />    #<br />    $DAEMON_HOME/jsvc-src/jsvc \<br />    -stop \<br />    -pidfile $PID_FILE \<br />    org.apache.catalina.startup.Bootstrap<br />    exit $?<br />    ;;<br /><br />  *)<br />    echo "Usage tomcat.sh start/stop"<br />    exit 1;;<br />esac<br /></div><br /><br />将上面的这个文件复制到/etc/init.d且文件名为tomcat。<br />按照下面步骤在系统中添加启动脚本：<br /><pre name="code" class="java">
#useradd tomcat6     //添加用户
#groupadd tomcat　　//添加组
#usermod -G tomcat tomcat6　　//把tomcat5加入tomcat组
#chown -R tomcat6 <span style="color: red">你的tomcat目录</span>   //设置用户tomcat6对目录的权限
#chkconfig --add tomcat  //把这个脚本设置成系统启动时自动执行，系统关闭时自动停止
</pre><br /><br />如果这些步骤完成了，那我们的Tomcat服务就可以在Linux中自动启动了。
          <br/><br/>
          <span style="color:red;">
            <a href="http://zengsun.javaeye.com/blog/161711#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 08 Feb 2008 18:33:14 +0800</pubDate>
        <link>http://zengsun.javaeye.com/blog/161711</link>
        <guid>http://zengsun.javaeye.com/blog/161711</guid>
      </item>
      <item>
        <title>强！Extjs Gui Builder</title>
        <author>zengsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zengsun.javaeye.com">zengsun</a>&nbsp;
          链接：<a href="http://zengsun.javaeye.com/blog/161624" style="color:red;">http://zengsun.javaeye.com/blog/161624</a>&nbsp;
          发表时间: 2008年02月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          偶然在网页上找的<a href="http://tof2k.com/ext/formbuilder/" target="_blank">http://tof2k.com/ext/formbuilder/</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zengsun.javaeye.com/blog/161624#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 07 Feb 2008 21:41:05 +0800</pubDate>
        <link>http://zengsun.javaeye.com/blog/161624</link>
        <guid>http://zengsun.javaeye.com/blog/161624</guid>
      </item>
      <item>
        <title>Jmagick</title>
        <author>zengsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zengsun.javaeye.com">zengsun</a>&nbsp;
          链接：<a href="http://zengsun.javaeye.com/blog/155325" style="color:red;">http://zengsun.javaeye.com/blog/155325</a>&nbsp;
          发表时间: 2008年01月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://blog.csdn.net/sanshiqiduer/archive/2007/11/30/1909536.aspx" target="_blank">http://blog.csdn.net/sanshiqiduer/archive/2007/11/30/1909536.aspx</a><br /><a href="http://www2.matrix.org.cn/thread.shtml?topicId=46202&forumId=19&fid=19" target="_blank">http://www2.matrix.org.cn/thread.shtml?topicId=46202&forumId=19&fid=19</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zengsun.javaeye.com/blog/155325#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 12 Jan 2008 22:45:47 +0800</pubDate>
        <link>http://zengsun.javaeye.com/blog/155325</link>
        <guid>http://zengsun.javaeye.com/blog/155325</guid>
      </item>
      <item>
        <title>string的replace方法</title>
        <author>zengsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zengsun.javaeye.com">zengsun</a>&nbsp;
          链接：<a href="http://zengsun.javaeye.com/blog/155322" style="color:red;">http://zengsun.javaeye.com/blog/155322</a>&nbsp;
          发表时间: 2008年01月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          以前也是用replace方法的，但今天才知道原来replace方法的第二个参数可以是函数！<br /><pre name="code" class="javascript">
"Student {name}'s age is ${age}".replace(/\{(\w+)\}/g, function(a, b) {console.log(a + ',' + b);})
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zengsun.javaeye.com/blog/155322#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 12 Jan 2008 22:13:43 +0800</pubDate>
        <link>http://zengsun.javaeye.com/blog/155322</link>
        <guid>http://zengsun.javaeye.com/blog/155322</guid>
      </item>
      <item>
        <title>在ubuntu 7.10上安装imagemagick-dev</title>
        <author>zengsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zengsun.javaeye.com">zengsun</a>&nbsp;
          链接：<a href="http://zengsun.javaeye.com/blog/155285" style="color:red;">http://zengsun.javaeye.com/blog/155285</a>&nbsp;
          发表时间: 2008年01月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          想安装JMagick处理网站上的缩略图。<br />但是要安装imagemagick、imagemagick-dev，但是在ubuntu使用：<br /><pre name="code" class="java">
$ sudo apt-get install imagemagick-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package imagemagick-dev is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package imagemagick-dev has no installation candidate
</pre><br />解决方法：<br /><pre name="code" class="java">
$ apt-cache showpkg imagemagick-dev
Package: imagemagick-dev
Versions: 

Reverse Depends: 
  libmagick9-dev,imagemagick-dev

</pre><br />接下来通过<br /><pre name="code" class="java">$ sudo apt-get install libmagick9-dev</pre>安装库文件就可以了。
          <br/><br/>
          <span style="color:red;">
            <a href="http://zengsun.javaeye.com/blog/155285#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 12 Jan 2008 17:24:02 +0800</pubDate>
        <link>http://zengsun.javaeye.com/blog/155285</link>
        <guid>http://zengsun.javaeye.com/blog/155285</guid>
      </item>
      <item>
        <title>在JSP页面中使用自定义标记调用javabean的方法</title>
        <author>zengsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zengsun.javaeye.com">zengsun</a>&nbsp;
          链接：<a href="http://zengsun.javaeye.com/blog/90135" style="color:red;">http://zengsun.javaeye.com/blog/90135</a>&nbsp;
          发表时间: 2007年06月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          不知道大家在调用JavaBean的方法时，是不是像我一样感觉很是不爽？<br />看下面这段代码：<br /><pre name="code" class="java">
&lt;jsp:useBean id="memberBean" class="org.jforum.bbean.MemberBean" scope="session">
&lt;/jsp:useBean>
&lt;c:choose>
    &lt;c:when test="${param.Submit=='注 销'}">
        &lt;% memberBean.loginOut(); %>
        &lt;c:redirect url="index.jsp" />
    &lt;/c:when>
    &lt;c:when test="${param.Submit=='登 录'}">
        &lt;% memberBean.login(request.getParameter("username"), request.getParameter("password")); %>
        &lt;c:if test="${memberBean.logined}">
            &lt;c:redirect url="index.jsp" />
        &lt;/c:if>
    &lt;/c:when>
&lt;/c:choose>
</pre><br /><span style="color: red">&lt;% memberBean.login(request.getParameter("username"), request.getParameter("password")); %></span><br />自己写出来，都觉得很费力！<br />但是还有更糟的：<br /><pre name="code" class="java">
&lt;ul>
            &lt;c:forEach items="${categoryBean.categoryList}" var="category">
                &lt;li>${ category.name }&lt;/li>
                &lt;ul>
                    &lt;c:forEach items="&lt;%= categoryBean.getSubCategoryList((Category)pageContext.getAttribute("category")) %>" var="subCategory">
                        &lt;li>
                            &lt;a href="category.jsp?id=${ subCategory.id }">${ subCategory.name }&lt;/a>&lt;br />
                            ${ subCategory.description }
                        &lt;/li>
                    &lt;/c:forEach>
                &lt;/ul>
            &lt;/c:forEach>
        &lt;/ul>
</pre><br />大家都看到了：&lt;% %>中想要使用标签库定义的对象真是痛苦！<br />我只是恨JSP2没有调用javabean方法的标签！！！（该死的JSP，总有一天要淘汰你。）<br />但是想想要通过反射调用bean的方法应该也不是什么难事，就自己翻参考书写了两个标签解决了这个问题！<br />现将成果公布一下，和大家分享！<br />主要的标记处理代码：Call.java<br /><pre name="code" class="java">
/*
 * Call.java
 *
 * Created on June 11, 2007, 12:03 PM
 */

package learnjsp2.tags;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import org.apache.taglibs.standard.lang.jstl.Coercions;
import org.apache.taglibs.standard.lang.jstl.ELException;

/**
 *
 * @author  zsun
 * @version
 */

public class Call extends SimpleTagSupport implements DynamicAttributes, StrictTypeParams  {
    
    /**
     * Initialization of bean property.
     */
    private java.lang.Object bean;
    
    /**
     * Initialization of method property.
     */
    private java.lang.String method;
    
    /**
     * Initialization of var property.
     */
    private java.lang.String var = null;
    
    /**
     * Initialization of scope property.
     */
    private int scope = PageContext.PAGE_SCOPE;
    private List dynamicAttrValues = new ArrayList();
    private List typeList = null;
    
    /**Called by the container to invoke this tag.
     * The implementation of this method is provided by the tag library developer,
     * and handles all tag processing, body iteration, etc.
     */
    public void doTag() throws JspException {
        JspWriter out=getJspContext().getOut();
        try {
            JspFragment f=getJspBody();
            if (f != null) f.invoke(out);
        } catch (java.io.IOException ex) {
            throw new JspException(ex.getMessage());
        }
        
        Class cls = bean.getClass();
        Method[] methods = cls.getMethods();
        Method m = null;
        Class[] paramTypes = null;
        
        search: for (int i = 0; i &lt; methods.length; i++ ) {
            Method t = methods[i];
            paramTypes = t.getParameterTypes();
            if (t.getName().equals(method) &&
                    paramTypes.length == dynamicAttrValues.size()) {
                if (typeList != null)
                    for (int j = 0; j &lt; paramTypes.length; j++)
                        if (!paramTypes[j].getName().equals(typeList.get(j)))
                            continue search;
                m = t;
                break;
            }
        }
        if (m == null)
            throw new JspException("JavaBean Object hasn't no method named '" + method + "'");
        
        try {
            Object coercedValues[] = new Object[paramTypes.length];
            Iterator paramIterator = dynamicAttrValues.iterator();
            for (int i = 0; i &lt; paramTypes.length; i++) {
                Object paramValue = paramIterator.next();
                Class paramClass = paramTypes[i];
                System.out.println(paramClass);
                if (paramValue == null || paramValue.getClass() != paramClass)
                    try {
                        paramValue = Coercions.coerce(paramValue, paramClass, null);
                    } catch (ELException e) {
                        throw new JspException(e.getMessage(), e.getRootCause());
                    }
                coercedValues[i] = paramValue;
            }
            Object returnVal = m.invoke(bean, coercedValues);
            if (var != null)
                if (returnVal != null)
                    getJspContext().setAttribute(var, returnVal, scope);
                else
                    getJspContext().removeAttribute(var, scope);
            
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new JspException("Call method is Error!");
        }
        
    }
    
    /**
     * Setter for the bean attribute.
     */
    public void setBean(java.lang.Object value) throws JspException {
        if (value == null)
            throw new JspException("Null 'bean' attribute in 'Call' tag");
        this.bean = value;
    }
    
    /**
     * Setter for the method attribute.
     */
    public void setMethod(java.lang.String value) throws JspException {
        if (value == null)
            throw new JspException("Null 'method' attribute in 'Call' tag");
        this.method = value;
    }
    
    /**
     * Setter for the var attribute.
     */
    public void setVar(java.lang.String value) throws JspException {
        if (value == null)
            throw new JspException("Null 'var' attribute in 'Call' tag");
        this.var = value;
    }
    
    /**
     * Setter for the scope attribute.
     */
    public void setScope(java.lang.String value) {
        if (value.equalsIgnoreCase("page"))
            scope = PageContext.PAGE_SCOPE;
        else if (value.equalsIgnoreCase("request"))
            scope = PageContext.REQUEST_SCOPE;
        else if (value.equalsIgnoreCase("session"))
            scope = PageContext.SESSION_SCOPE;
        else if (value.equalsIgnoreCase("application"))
            scope = PageContext.APPLICATION_SCOPE;
    }
    
    public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {
        dynamicAttrValues.add(value);
    }

    public void addStrictTypeParameter(String type, Object value) {
        if (typeList == null)
            typeList = new ArrayList();
        typeList.add(type);
        dynamicAttrValues.add(value);
    }
}
</pre><br />定义父子标签协作接口：StrictTypeParams.java<br /><pre name="code" class="java">
/*
 * StrictTypeParams.java
 *
 * Created on June 14, 2007, 9:35 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package learnjsp2.tags;

/**
 *
 * @author zsun
 */
public interface StrictTypeParams {
    void addStrictTypeParameter(String type, Object value);
}
</pre><br />参数标记：ParamTag.java<br /><pre name="code" class="java">
package learnjsp2.tags;
/*
 * ParamTag.java
 *
 * Created on June 14, 2007, 10:35 AM
 */

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;

/**
 *
 * @author  zsun
 * @version
 */

public class ParamTag extends SimpleTagSupport {

    /**
     * Initialization of class property.
     */
    private java.lang.String _class;
    
    /**Called by the container to invoke this tag.
     * The implementation of this method is provided by the tag library developer,
     * and handles all tag processing, body iteration, etc.
     */
    public void doTag() throws JspException {
        StrictTypeParams parent = (StrictTypeParams)findAncestorWithClass(this, StrictTypeParams.class);
        if (parent == null) {
            throw new JspException("The Param tag is not enclosed by a supported tag type");
        }
        parent.addStrictTypeParameter(this._class, this.value);
        
    }
    /**
     * Initialization of value property.
     */
    private java.lang.Object value;
    /**
     * Setter for the class attribute.
     */
    public void setParamclass(java.lang.String value) {
        this._class = value;
    }
    /**
     * Setter for the value attribute.
     */
    public void setValue(java.lang.Object value) {
        this.value = value;
    }
}
</pre><br />部署描述符：<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
  &lt;tlib-version>1.0&lt;/tlib-version>
  &lt;short-name>utils&lt;/short-name>
  &lt;uri>/WEB-INF/tlds/utils&lt;/uri>
  &lt;tag>
    &lt;name>Call&lt;/name>
    &lt;tag-class>learnjsp2.tags.Call&lt;/tag-class>
    &lt;body-content>scriptless&lt;/body-content>
    &lt;attribute>
      &lt;name>bean&lt;/name>
      &lt;required>true&lt;/required>
      &lt;rtexprvalue>true&lt;/rtexprvalue>
      &lt;type>java.lang.Object&lt;/type>
    &lt;/attribute>
    &lt;attribute>
      &lt;name>method&lt;/name>
      &lt;required>true&lt;/required>
      &lt;rtexprvalue>true&lt;/rtexprvalue>
      &lt;type>java.lang.String&lt;/type>
    &lt;/attribute>
    &lt;attribute>
      &lt;name>var&lt;/name>
      &lt;rtexprvalue>true&lt;/rtexprvalue>
      &lt;type>java.lang.String&lt;/type>
    &lt;/attribute>
    &lt;attribute>
      &lt;name>scope&lt;/name>
      &lt;rtexprvalue>true&lt;/rtexprvalue>
      &lt;type>java.lang.String&lt;/type>
    &lt;/attribute>
    &lt;dynamic-attributes>true&lt;/dynamic-attributes>
  &lt;/tag>
  &lt;tag>
    &lt;name>Param&lt;/name>
    &lt;tag-class>learnjsp2.tags.ParamTag&lt;/tag-class>
    &lt;body-content>empty&lt;/body-content>
    &lt;attribute>
      &lt;name>paramclass&lt;/name>
      &lt;required>true&lt;/required>
      &lt;rtexprvalue>true&lt;/rtexprvalue>
      &lt;type>java.lang.String&lt;/type>
    &lt;/attribute>
    &lt;attribute>
      &lt;name>value&lt;/name>
      &lt;required>true&lt;/required>
      &lt;rtexprvalue>true&lt;/rtexprvalue>
      &lt;type>java.lang.Object&lt;/type>
    &lt;/attribute>
  &lt;/tag>
&lt;/taglib>
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://zengsun.javaeye.com/blog/90135#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 14 Jun 2007 13:57:11 +0800</pubDate>
        <link>http://zengsun.javaeye.com/blog/90135</link>
        <guid>http://zengsun.javaeye.com/blog/90135</guid>
      </item>
      <item>
        <title>忘了讲怎么用了！</title>
        <author>zengsun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zengsun.javaeye.com">zengsun</a>&nbsp;
          链接：<a href="http://zengsun.javaeye.com/blog/90116" style="color:red;">http://zengsun.javaeye.com/blog/90116</a>&nbsp;
          发表时间: 2007年06月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先在页面中导入标签描述符：<br /><pre name="code" class="java">&lt;%@ taglib uri="/WEB-INF/tlds/utils" prefix="b"%></pre><br />现在就可以调用页面里javabean的方法了!<br />无返回值方法调用：<br /><pre name="code" class="java">
&lt;b:Call bean="javabean对象" method="方法名" />
</pre><br />有返回值方法调用：<br /><pre name="code" class="java">
&lt;b:Call bean="javabean对象" method="方法名" var="返回值变量名" scope="返回值作用域" />
</pre><br />Call标记支持动态参数：<br /><pre name="code" class="java">
&lt;b:Call bean="javabean对象" method="方法名" var="返回值变量名" scope="返回值作用域" 
属性名1="属性值1" 属性名2="属性值2"... />
</pre><br />属性值1就是调用函数的第一个参数，属性值2就是……。其实属性名是随便写的，比如：p1 p2 ……。<br /><br />但是如果javabean中有同名且参数个数相同的重载方法时，上面的调用方法就不行了。<br />需要使用下面的调用：<br /><pre name="code" class="java">
&lt;b:Call bean="javabean对象" method="方法名" var="返回值变量名" scope="返回值作用域" >
            &lt;b:Param paramclass="变量类型全称" value="变量值" />
            ...
&lt;/b:Call>
</pre><br />注意：动态属性传参和标签传参不能同时使用！
          <br/><br/>
          <span style="color:red;">
            <a href="http://zengsun.javaeye.com/blog/90116#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 14 Jun 2007 12:43:47 +0800</pubDate>
        <link>http://zengsun.javaeye.com/blog/90116</link>
        <guid>http://zengsun.javaeye.com/blog/90116</guid>
      </item>
  </channel>
</rss>