电商项目笔记之四:搜索功能的实现

时间:2021-03-07 08:59:12



一:前台

这个项目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>