实习记——(六)关于数据分页

    周末小努力了一番把两个任务的基本页面都写好调好了,周一给领导看基本上满意。然后叫我找安姐商量翻译网的事宜,安姐也基本上满意,提了点小意见。其实他们对开发都不了解(当然我也是不了解)提出的功能之类的都很简单也不实用,比如说要做好一个网站最重要的就是用户体验,就是什么都应该为用户着想,而安姐好像不理解这层面,只要客户能查找到翻译信息条目,能联系上她就行。而我想的是能直接把标准信息和翻译的部分显示给客户,另外用户管理也是必要的,而最重要的是能通过这一平台能完成整个交易流程而不需要另外更多的东西。比如说客户注册后自己在库里找到信息后可以直接购买,系统根据确认订单后也自动发给翻译信息而不需要人的参与。现在安姐想的是只通过此平台让客户找到她再让客户与她谈更多事宜,其它的什么都是线下完成。当然按我的想法那是一个完整的系统,不是那么容易完成,涉及安全维护等很多问题,不是我一个人能完成的。按他们的们的想法完成的只是小的设计,没有什么意思。

    我当然不会像去做自己一个人做不了的事。我只好优化现有的部分。现在需要的做的是查询关键词的校验,查询信息显示的分页。其实我早就做了这方面的工作只是不知道问题出在哪里加上校验和分页后数据的搜索会出问题。搜索校验是用简单的js完成的,我不知道这样的方式有什么问题,但加上校验后搜索不能从form表单中读取到传入的关键字。我确定js是没有问题的,也不知道哪个过程有问题。我重点说一下分页的问题。

  分页本身没有问题,但加上分页后点击上下分页再从搜索框中输入搜索信息也是不能读出数据。我想是我整个分页过程有问题。列出部分代码:

   分页类:public class Pager {
private int pageNow;//当前页数
private int pageSize=10;//每页显示多少条记录
private int totalPage;//共有多少页
private int totalSize;//一共多少记录
private boolean hasFirst;//是否有首页
private boolean hasPre;//是否有前一页
private boolean hasNext;//是否有下一页
private boolean hasLast;//是否有最后一页
public Pager(int pageNow,int totalSize){
//利用构造函数为变量赋值
this.pageNow=pageNow;
this.totalSize=totalSize;
}
public int getPageNow() {
return pageNow;
}
public void setPageNow(int pageNow) {
this.pageNow = pageNow;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalPage() {
//一共多少页的算法
totalPage=getTotalSize()/getPageSize();
if(totalSize%pageSize!=0)
totalPage++;
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getTotalSize() {
return totalSize;
}
public void setTotalSize(int totalSize) {
this.totalSize = totalSize;
}
public boolean isHasFirst() {
//如果当前为第一页就没有首页
if(pageNow==1)
return false;
else return true;
}
public void setHasFirst(boolean hasFirst) {
this.hasFirst = hasFirst;
}
public boolean isHasPre() {
//如果有首页就有前一页,因为有首页就不是第一页
if(this.isHasFirst())
return true;
else return false;
}
public void setHasPre(boolean hasPre) {
this.hasPre = hasPre;
}
public boolean isHasNext() {
//如果有尾页就有下一页,因为有尾页表明不是最后一页
if(isHasLast())
return true;
else return false;
}
public void setHasNext(boolean hasNext) {
this.hasNext = hasNext;
}
public boolean isHasLast() {
//如果不是最后一页就有尾页
if(pageNow==this.getTotalPage())
return false;
else return true;
}
public void setHasLast(boolean hasLast) {
this.hasLast = hasLast;
}
}

action类:

public class StandAction extends ActionSupport {
private IStandService standService;
private Cestand stand;
private int pageNow=1;
private int pageSize=10;
public int getPageNow() {
return pageNow;
}
public void setPageNow(int pageNow) {
this.pageNow = pageNow;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public IStandService getStandService() {
return standService;
}
public void setStandService(IStandService standService) {
this.standService = standService;
}
public Cestand getStand() {
return stand;
}
public void setStand(Cestand stand) {
this.stand = stand;
}
public String execute() throws Exception{
List  stands=standService.find(stand.getStandId(),pageNow, pageSize);//
分页查找
Pager page=new Pager(getPageNow(),standService.findSize(stand.getStandId()));//构造分页对象
if(stands.size()>0) {
Map request=(Map)ActionContext.getContext().get("request");
request.put("stands", stands);
request.put("page", page);
return SUCCESS;
}
else {
return ERROR;
}
}
}

dao类:

public class StandDao extends HibernateDaoSupport implements IStandDao{
public List  find(String standId,int pageNow,int pageSize) {
if(standId==null)
throw new IllegalArgumentException();
try{
Session session = getHibernateTemplate().getSessionFactory().openSession();
Transaction ts=session.beginTransaction();
Query query=session.createQuery("from Cestand where standId like'%"+standId+"%' or cstandName like'%"+standId+"%'or estandName like'%"+standId+"%'");
int firstResult=(pageNow-1)*pageSize;
query.setFirstResult(firstResult);
query.setMaxResults(pageSize);
List list=query.list();
ts.commit();
session.close();
session=null;
return list;

}catch(Exception e){
e.printStackTrace();
}
return null;
}
public int findSize(String standId) {//获得总记录数
return getHibernateTemplate().find("from Cestand where standId like'%"+standId+"%' or cstandName like'%"+standId+"%'or estandName like'%"+standId+"%' ").size();
}
}

视图层:<!--分页搜索-->

<form method="post" action="search.action" name="form"><!--全部问题就出在这-->
<fieldset>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span >国内外标准搜索:</span><input type="text"id="stand.standId"  name="stand.standId"
style="height:20px; width:398px;"/>
<input type="submit" id="x" value=""  />  
</fieldset>
</form>

<!--迭代输出-->

<s:iterator value="#request.stands" id="stands">
<div class="bzinfo">
标 准   号    :<s:property value="#stands.standId"/><br>
中文名称 :<s:property value="#stands.cstandName"/><br>
英文名称 :<s:property value="#stands.estandName"/><br>
字     数(字) :<s:property value="#stands.words"/><br>
页     数(页):<s:property value="#stands.pages"/><br>
类       型 :<s:property value="#stands.type"/><br>
价    格(元):<s:property value="#stands.pric"/><br>
代理价格(元) :<s:property value="#stands.agentPric"/><br>
</div>
</s:iterator>
<s:set name="page" value="#request.page"></s:set>
  <s:if test="#page.hasFirst">
<s:a href="search.action?pageNow=1">首页</s:a>
</s:if>
<s:if test="#page.hasPre">
<a href="search.action?pageNow=<s:property value="#page.pageNow-1"/>">上一页</a>
</s:if>
<s:if test="#page.hasNext">
<a href="search.action?pageNow=<s:property value="#page.pageNow+1"/>">下一页</a>
</s:if>
<s:if test="#page.hasLast">
<a href="search.action?pageNow=<s:property value="#page.totalPage"/>">尾页</a>
</s:if>
第[<s:property value="#page.pageNow"/>]页/共[<s:property value="#page.totalPage"/>]页
<!--   第[${page.pageNow} ]页/共[${page.totalPage} ]页-->

    都说request的生命周期只是一次访问,在我的页面中点击上下翻页是响应search action,再通过service层调用dao层的 find(String standId,int pageNow,int pageSize) 方法,方法需要三个参数,但是表单中的name为stand.standId的text域我并没有给它值,它响应action后也能找到结果,(其实from表单中的值是在整个session中存在,现在才理解)可以在action中加上控制台中加System.out.println("from:"+stand.getStandId());测试。打印点击上下翻页能打印出之前要搜索的关键字,这时也没有什么问题。但当你再在搜索框中输入搜索信息后,点击搜索,发现不能从数据库中读取到信息,但是控制台中也能正确打印得到stand.standId中的关键字。问题就出在这。奇怪的是,每当你点击首页之后再搜索,一切又会变得正常。

   数据库是SqlServer2008,dao层这些代码:

Query query=session.createQuery("from Cestand where standId like'%"+standId+"%' or cstandName like'%"+standId+"%'or estandName like'%"+standId+"%'");
int firstResult=(pageNow-1)*pageSize;
query.setFirstResult(firstResult);
query.setMaxResults(pageSize);
List list=query.list();

     使用hibernate的自带分页查询也应该没有问题。认真思考之后,我想最主要的问题是参数传递引起的。点击其它分页后pageNow参数改变了,当你再从搜索框中输入搜索信息后PageNow是原先的值而没有从1开始,因此没有结果。当你再点击首页后pageNow初始化为1,因此再搜索就可以的到结果。好,改造一下搜索form action中加入参数action="search.action?pageNow=1"。部署运行,测试果真没有任何问题了。我靠,就是这个小条件让我写了一遍又一遍,我以为是逻辑错了,都绝望了。

    写程序不能盲目,有时得冷静下来思考。over。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值