J2EE剑侠行

直觉我的J2EE应用生涯,打造我心中的一把利剑。

常用链接

统计

技术链接

最新评论

struts表单 vs JSTL表现之多条件查询示例

    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.set
Loginid (loginid );
        }
        
        
if(sex != null && !sex.trim().equals("")){        
            userSearchCondition.setSex(
sex);
        }      

        
        
return userSearchCondition;
    }

     以后的方法,我就不用再做举例了吧,可以参考如上第一种方法的实现.
     第二种方法的好处就是:在页面上比较好控制,比如重置,又比如日期性数据等。
     (所有过程当中的代码没有经过测试,只是说明这种方法而已)

posted on 2006-07-21 11:20 @家军 阅读(2697) 评论(1)  编辑  收藏 所属分类: J2EE技术类

评论

# re: struts表单 vs JSTL表现之多条件查询示例[未登录] 2008-05-23 12:00 aa

qqq  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: