一:前台
这个项目namespace分的比较多, 所以struts的form要指定
这个namespace就是struts.xml里package配置的namespace
提交按钮用了一个背景图片
<s:form action="product_findByName" method="post" namespace="/product">
<s:textfield name="name"></s:textfield><br>
<s:submit type="image" src="%{context_path}/css/images/index_09.gif" value="搜索"></s:submit>
</s:form>
二:action
因为之前分析过项目里find封装的非常好, 所以业务视线里只要组装一下传参就行了
find会根据川河泛型组装HQL的
public String findByName() throws Exception {这里边先检查了一下传值是否为空 ,为空也并不是错误 因为直接点网页上的"搜索" 就去显示最新商品好了
if(product.getName() != null){
String where = "where name like ?";//查询的条件语句
Object[] queryParams = {"%" + product.getName() + "%"};//为参数赋值
pageModel = productDao.find(pageNo, pageSize, where, queryParams );//执行查询方法
}
image.put("url", "04.gif");
return LIST;//返回列表首页
}
image是一个Map ,这个map存储了跳转后的背景图片, 这个情况下 主页的主显示区的背景图片被设置成"搜索结果是XX"相关的图案
三:处理空搜索
这是组装HQL时候的语句,
String hql = new StringBuffer().append("from ")
.append(where == null ? "" : where)如果搜索的内容是空 也没有问题, 其他选项比如 class , 排序等仍然生效
查完之后顺便把分页也一起做了:
list = query.setFirstResult(getFirstResult(pageNo, maxResult))//设置分页起始位置
.setMaxResults(maxResult)//设置每页显示的记录数
.list();//将查询结果转化为List对象
这个是查找出来的总数:
hql = new StringBuffer().append("select count(*) from ")//添加hql语句
交给page类记录总数, 其余的分页信息会在用的时候, 由page生成
pageModel.setTotalRecords(totalRecords);//设置总记录数
四:结果的分页显示
搜索结果的显示页中先准备好各个页码的数值:
</s:url> <s:url var="next" action="product_list" namespace="/admin/product">页面最下边包含分页的显示页面
<s:param name="pageNo" value="pageModel.pageNo+1"></s:param>
</s:url>
<s:include value="/WEB-INF/pages/common/page.jsp"></s:include>最后调用之前准备的数值, 显示成链接
<s:if test="pageModel.pageNo > 1">
<a href="${first}">首页</a> <a href="${previous}">上一页</a>
</s:if>
<s:else>
首页 上一页
</s:else>
<SPAN style="color: red;">
[<s:property value="pageModel.pageNo"/>]
</SPAN>
<s:if test="pageModel.pageNo < pageModel.bottomPageNo">
<a href="${next}">下一页</a> <a href="${last}">尾页</a>
</s:if>
<s:else>
下一页 尾页
</s:else>