??? struts表單主要是利用actionform來取得JSP頁面所有的request的,所有的Struts標簽無非在取得request當中的所有INPUT,并賦值回標簽值的,同理,JSTL能夠在JSP表單當中輕易的表現要輸出的結果。
??? 如果你是高手,你就知道這個標題有誤,是的,struts表單與JSTL表現沒有可比性,但是如果我們要在實現一個多條件的查詢頁面時,這個比較就比較有效了。
??? 我不妨比較一下利用struts表單的查詢實現 和 利用JSTL做為表現而實現的查詢功能有什么不同,讓讀者尋其方便。
??? 示例說明:
??? 用戶表-USER
??? username? 用戶名稱
??? loginid?? 登錄ID
??? sex?????? 性別
??? 一、利用struts表單的查詢實現
??????? 實現步驟:
??????? 創(chuàng)建多條件的序列化對象(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了。(省略了...)
?????????? 創(chuàng)建查詢條件的序列化對象(同樣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;
????}
???? 以后的方法,我就不用再做舉例了吧,可以參考如上第一種方法的實現.
???? 第二種方法的好處就是:在頁面上比較好控制,比如重置,又比如日期性數據等。
???? (所有過程當中的代碼沒有經過測試,只是說明這種方法而已)