struts表单主要是利用actionform来取得JSP页面所有的request的,所有的Struts标签无非在取得request当中的所有INPUT,并赋值回标签值的,同理,JSTL能够在JSP表单当中轻易的表现要输出的结果。
    如果你是高手,你就知道这个标题有误,是的,struts表单与JSTL表现没有可比性,但是如果我们要在实现一个多条件的查询页面时,这个比较就比较有效了。
    我不妨比较一下利用struts表单的查询实现 和 利用JSTL做为表现而实现的查询功能有什么不同,让读者寻其方便。
    示例说明:
    用户表-USER
    username  用户名称
    loginid   登录ID
    sex        性别
    一、利用struts表单的查询实现
        实现步骤:
        创建多条件的序列化对象(java)->在struts.config当中申明actionform->Action当中实现->输出结果        
    /** The value of the simple userName property. */
    private java.lang.String userName;
    /** The value of the simple loginId property. */
    private java.lang.String loginId;
    /** The value of the simple sex property. */
    private java.lang.String sex;
    /**
     * Return the value of the USER_NAME column.
     * @return java.lang.String
     */
    public java.lang.String getUserName()
    {
        return this.userName;
    }
    /**
     * Set the value of the USER_NAME column.
     * @param userName
     */
    public void setUserName(java.lang.String userName)
    {
        this.userName = userName;
    /**
     * Return the value of the LOGIN_ID column.
     * @return java.lang.String
     */
    public java.lang.String getLoginId()
    {
        return this.loginId;
    }
    /**
     * Set the value of the LOGIN_ID column.
     * @param loginId
     */
    public void setLoginId(java.lang.String loginId)
    {
        this.loginId = loginId;
    }
    /**
     * Return the value of the sex column.
     * @return java.lang.String
     */
    public java.lang.String getSex()
    {
        return this.sex;
    }
    /**
     * Set the value of the sex column.
     * @param loginId
     */
    public void setSex(java.lang.String sex)
    {
        this.sex = sex;
    }
<!-- struts_fonfig -->
        <form-bean name="UserActionForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="userCondition" type="com.antbee.searchCondition.UserFindCondition" />        
        </form-bean>
Action当中
DynaValidatorForm UserForm = (DynaValidatorForm) form;
        UserFindCondition Condition = (UserFindCondition) UserActionForm
                .get("userCondition");// 取得查询条件
List user = userManager.find(Condition,
                (iCurPageNo - 1) * pageCon.PAGE_SIZE, pageCon.PAGE_SIZE);//呵呵,加入了hibernate的分页
具体实现:
    public List find(UserFindCondition Condition, int begin,
            int count) {
        StringBuffer sql = new StringBuffer("from User as a where 1=1");               
        if (Condition != null) {
            makeSql(sql, shipmentFindCondition);
        }
        String fsql = sql.toString();
        Query query = this.getSession().createQuery(fsql);
        if (Condition != null) {
            setParameter(query, Condition);
        }
        query.setFirstResult(begin);
        query.setMaxResults(count);
        List tt = query.list();
        return tt;
    }
--
    /**
     * 根据条件生成一个sql语句
     * 
     * @author 和
     * @param sql
     *            初始的sql语句(一般为select a from A as a where 1=1)
     * @param condition
     *            查询的条件
     * @return
     * @version 1.0
     */
private void makeSql(StringBuffer sql, UserFindCondition condition) {
        if (condition.getUsername() != null
                && !condition.getUsername().toString().equals("")) {
            sql
                    .append(" and a.username like :username");
        }
        if (condition.getLoginid() != null
                && !condition.getLoginid(().equals("")) {
            sql
                    .append(" and a.loginid( = :loginid(");
        }
        if (condition.getSex() != null
                && !condition.getSex().equals("")) {
            sql.append(" and a.sex = :sex");
        }
    }
    /**
     * 根据条件设置query的值
     * 
     * @author 和
     * @param query
     *            一个hibernate的Query对象
     * @param condition
     *            查询的条件
     * @return
     * @version 1.0
     */
    private void setParameter(Query query, UserFindCondition condition) {
        if (condition.getUsername() != null
                && !condition.getUsername().equals("")) {
            query.setString("username", "%" + condition.getUsername()
                    + "%");
        }
        if (condition.getLoginid() != null
                && !condition.getLoginid().equals("")) {
            query.setString("loginid", condition.getLoginid());
        }
        if (condition.getSex() != null
                && !condition.getSex().equals("")) {
            query.setString("sex", condition.getSex());
        }       
    }
呵呵,笑死人了,这个方法很通用,我才在我的第二个项目当中才用到,真是可惜,当然了,使用Actionform有一个毛病就是对date类型要转换成STRING类型来处理,这是actionform的一个死穴。还有对Actionform不能够重置,只能够回来从前。不知道这群设计者怎么想的,真是由于这一点,所以我们有必要使用最原始的方法来解决问题了。使用页面当中的input,我们来拼request如何?
   二、利用JSTL做为表现而实现的查询功能
     步骤:在JSP页面布置很多的input,当然,你可以加入value了。(省略了...)
           创建查询条件的序列化对象(同样user.java)
           在action当中拼个condition了,做为查询条件,后面的处理类同第一种方式。
     UserSearchCondition userSearchCondition = null;
     userSearchCondition = makeUserSearchCondition(request);
private UserSearchCondition makeUserSearchCondition(HttpServletRequest request) throws Exception{
        UserSearchCondition userSearchCondition = new OrderSearchCondition();
        String username = request.getParameter("Username");
        String loginid = request.getParameter("Loginid");
        String sex = request.getParameter("Sex");   
        
                
        if(username!= null && !username.trim().equals("")){
            usernameSearchCondition.setUsername(username);
        }
        
        if(loginid  != null && !loginid.trim().equals("")){
            userSearchCondition.setLoginid (loginid );
        }
        
        if(sex != null && !sex.trim().equals("")){        
            userSearchCondition.setSex(sex);
        }        
        
        return userSearchCondition;
    }
     以后的方法,我就不用再做举例了吧,可以参考如上第一种方法的实现.
     第二种方法的好处就是:在页面上比较好控制,比如重置,又比如日期性数据等。
     (所有过程当中的代码没有经过测试,只是说明这种方法而已)