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