我在做分页是遇到了问题, 没有查询条件时分页功能完全实现了,但是添加上查询条件时就不知道如何是好了! 假如我页面上一开始列出的是所有学生的资料,当我查询所有山东青岛的学生时一开始列出了第一页的结果,在点击下一页时如何处理参数传递才能使第二页显示的也是山东青岛的学生。用什么方式处理查询参数才能得到想要的结果集? 求各位大侠帮忙,小弟感激不尽!!
解决方案 »
- jquery取值第一次能alert出值但是第二次alert就是undefined
- extjs form表单中需要提交的字段较多怎么办
- hibernate主键生成的错误
- 搜索页面(内容) 多个 关键字 着色 的问题 java jsp
- 服务器访问速度慢,请高手指点指点,急用!!!
- 请问下我WEB服务器是在LINUX上//数据库是同一台机器.我从WINDOW平台通过JSP传文件,并且把文件名输入数据库.怎么是问号呢....
- 能不能解释一下下面这段内容的意思(新手问题)
- 中文乱码问题
- tomcat 怎么不自动是占用的内存?
- 求一个JDK1.5编译的Spring2.5或者以上的Jar包
- 请问我这个程序输出本次和上次访问时间,为啥一个正确一个是乱码
- 关于文件下载和url记录问题
我用的是strut2中的<s:subset>在list中取出某页的相应数据。
如果用的是mysql数据库,你可以考虑用limit来逐页的提取,减少数据库的压力,提高查询速度
比如说你的list中总共有N条记录,每页显示5条记录,那么就可以先算出需要多少页,通过 i 参数来计算转到第几页, 比如说你开始进入的是第一页,则 i=1,在页面中显示1至1*5条记录,当你通过下一页或者是下拉列表传过来的 i为 4时,则显示4*5到(4+1)*5,即list封装列表中的第20条到25条记录,显示可用get(int i)方法来实现,你试试吧,我的以前就是这么做的
我以前就这样做的
后面用判断
if(tiaojian==null){
//无条件代码
}else{
//条件代码
}
其他应该和没条件差不多了
1:数据库分页比较老套,不建议使用
2:jsp标签分页,<c:foreach>
3:hibernate分页很方便建议你去看一下
<%
BookBean bs = new BookBean();
List books=bs.getAllBook();
BookBean rs=null;
int pageNo = 0; //将被显示的页面页码
int pageSize = 6; //每页显示的记录条数
int i = 0; //将被显示的记录行号
int totalPage = (books.size()-1)/pageSize; //总页数
if(request.getParameter("pageNo")!=null)
pageNo = Integer.parseInt(request.getParameter("pageNo"));
if(pageNo!=0)
i = pageNo*pageSize;
for(int j=0;i<books.size()&&j<pageSize;i++,j++){
rs =(BookBean) books.get(i);
String ISBN = rs.getID();
%>
<% if(pageNo!=0){ %>
<a href="booklist.jsp?pageNo=0">首 页</a>
<a href="booklist.jsp?pageNo=<%=pageNo-1%>">上一页</a>
<% }
if(pageNo!=totalPage){
%>
<a href="booklist.jsp?pageNo=<%=pageNo+1%>">下一页</a>
<a href="booklist.jsp?pageNo=<%=totalPage%>">末 页</a>
<% } %>
代码
有条件和没有条件有什么区别吗? 没有条件不就是条件为空么,比如
where id like '%%' where id like '%XXX%'
你已经取得结果集了,那只是显示的问题了也就是分页
//第1个?:本页从第几条符合要求的数据开始输出结果
//第2个?: 本页显示多少条数据Oracle: select B.rn,B.* from (select rownum rn,A.* from (select * from student where address='青岛') A where rownum<=?) where b.rn>?;
//第1个?:本页要显示的符合要求的最后一条数据行号
//第2个?: 本页要显示的符合要求的第一条数据行号Hibernate:
session.setFirstResult(a);//第一条记录号
session.setMaxResult(b);//本页显示最大记录数
* 查询记录总数
*/
public int recordCount ;
/**
*
* @param page
* 当前页
* @param pageSize
* 每页显示的记录数
* @return
*/
public List<CommonUser> search(int page,int pageSize)
{
List<CommonUser> list = new ArrayList<CommonUser>();
String sql = "select * from "+
"(select top "+page*pageSize+" * from commomuser order by id) as aa"+
" where id not in"+
"( select top "+((page-1)*pageSize)+" id from commomuser "+
" order by id)"; ......
}
<%
String pageString=request.getParameter("page");//获取当前页码字符串 System.out.println("pageString="+pageString);
String uidString=request.getParameter("uid");
if (pageString==null||pageString.length()==0)
{
pageString="1";
}
int currentpage=0;
currentpage=Integer.parseInt(pageString); //将当前页码字符串转换为整型
if (currentpage==0)
{
currentpage=1;
}
Manager manager=new Manager();
if (uidString!=null)
{
System.out.println("uidstring="+uidString);
Integer uid=Integer.valueOf(uidString);
System.out.println("uid="+uid);
manager.Delete(uid);
uidString=null;
}
List hbList=manager.getHbbyPage(currentpage); //读取指定的数据库记录
request.setAttribute("list", hbList);
request.setAttribute("hbcount",new Integer(manager.GetHBCount()));
request.setAttribute("pagecount",new Integer(manager.getTotalPage()));
request.setAttribute("currentPage", new Integer(currentpage));// 保存当前页码
%> /**
* 分页显示用户数据.
*
* @param currentPage
* 当前页码, 从 1 开始
* @param pageSize
* 每页显示数据量
* @return 用户数据
*/ public List getHbbyPage(int currentpage)
{
try
{
if (currentpage==0)
{
currentpage=1;
}
String hqlString="from Hb";
Query query =session.createQuery(hqlString);
query.setFirstResult(pagesize*(currentpage-1));
query.setMaxResults(pagesize);
return query.list();
}
catch (HibernateException e)
{
throw e;
}
}
参考代码:
第${currentPage}页/共${pagecount}页<br>
<c:if test="${currentPage > 1}">
[ <a href="${pageContext.request.contextPath}/show.jsp?page=${currentPage-currentPage}">首页</a> ]
[ <a href="${pageContext.request.contextPath}/show.jsp?page=${currentPage-1}">上一页</a> ]
</c:if>
<c:if test="${currentPage <= 1}">
[ 首页 ]
[ 上一页 ]
</c:if>
<c:if test="${currentPage < pagecount}">
[ <a href="${pageContext.request.contextPath}/show.jsp?page=${currentPage+1}">下一页</a> ]
[ <a href="${pageContext.request.contextPath}/show.jsp?page=${pagecount}">尾页</a> ]
</c:if>
<c:if test="${currentPage >= pagecount}">
[ 下一页 ]
[ 尾页 ]
</c:if>
当页面填好查询条件以后点查询的时候跳转到一个action
进到后台之后根据条件查询(这时可以将查询条件设置到session中)当点击某一页的时候跳转到另一个action:
1.如果之前没保存到session在跳转的时候把所有条件都组合好(写js用&组合)传到后台
2.如果保存到session的话就不用组合了......两个action都跳转到同一个页面
到时候把这个DTB放到session中去。点击下一页的时候,可以重新检索一次数据库嘛!只是多加了点判断页数的代码而已。
<a href="cityList.jsp?ParentId=2">山东</a> 架设点击了 江苏 那么 可以获取参数 ParentId的值,根据这个值 重新组合查询的sql语句, 你可以写一个 方法,把 request.getQuerString 作为这个方法的参数,然后 来自动 组合 查询语句的子条件比如 public String fieQuerySql(String queryStr){ //解析request.getQueryString
String []strs= queryStr.split("&"){
for(int i=0;i<strs.length;i++){
String[] tempStrs= strs[i].split("=");
String paraName=tempStrs[0]; //对应ParentId
String paraValue=tempStrs[0]; // 对应 2
}
// 自己组合下 字符串 就可以出来 子查询语句
} //希望对你有帮助 。。 }
allcount = list.size();
allpage = (int)Math.ceil(1.0*allcount/pagesize);
if(currpage>allpage)currpage = allpage;
if(currpage == 0)currpage = 1;
setCurrpage(currpage);
int from = (currpage-1)*pagesize;
int to = currpage*pagesize;
if(to>allcount)to=allcount;
this.list = list.subList(from, to);
}
list是查詢出的結果(是否有查詢條件都可以)
public class PageObj {
private int pagesize = 50;//每頁條數
private int currpage = 1;//默認第一頁
private int ppage;//上一頁
private int npage;//下一頁
private int allcount;//總記錄條數
private int allpage;//總頁數
private List list;
public int getAllpage(){
return allpage;
}
public int getAllcount(){
return allcount;
}
public int getCurrpage() {
return currpage;
} public void setCurrpage(int currpage) {
this.currpage = currpage;
ppage = currpage -1;
npage = currpage + 1;
if(ppage <= 0)ppage = 1;
if(npage >= allpage) npage = allpage;
} public List getList() {
return list;
} public void setList(List list) {
allcount = list.size();
allpage = (int)Math.ceil(1.0*allcount/pagesize);
if(currpage>allpage)currpage = allpage;
if(currpage == 0)currpage = 1;
setCurrpage(currpage);
int from = (currpage-1)*pagesize;
int to = currpage*pagesize;
if(to>allcount)to=allcount;
this.list = list.subList(from, to);
} public int getNpage() {
return npage;
} public void setNpage(int npage) {
this.npage = npage;
} public int getPagesize() {
return pagesize;
} public void setPagesize(int pagesize) {
this.pagesize = pagesize;
} public int getPpage() {
return ppage;
} public void setPpage(int ppage) {
this.ppage = ppage;
}
}
String currpagestr = Utils.getNotNull(request.getParameter("currpage")); if("".equals(currpagestr))currpagestr= "1";
int currpage = Integer.valueOf(currpagestr);
PageObj vo = new PageObj(); vo.setCurrpage(currpage); vo.setList(list);
request.setAttribute("po", vo);
JSP頁面﹕
<c:forEach items="${po.list}" var="listName" varStatus="status">
自己多选一吧。
把页面的参数(如 当前页 ,查询关键字等 用隐藏域)传到servlet
然后在servlet中 request.setAttribute(当前页) setAttribute(关键字)...这里不能用session这样就能解决问题
index.jsp?page=pb.currentPage+1&condition=条件
<form action="????" method="post">
<input name="name" value="张三" type="hidden"/>
<input name="sex" value="男"/>
....
</form>java代码可以用Hibernate的Criteria让它为你拼接sql语句 进行不定参数的查询 及其方便 例如:
public String query(){
HttpServletRequest request = ServletActionContext.getRequest();
List<Criterion> criterion = new ArrayList<Criterion>(); if(name != null && name.equals("")){
criterion.add(Restrictions.eq("name", name));
}
......and more List<Student> stus = xxxService.findByCritera(criterion); request.setAttribute("???", stus);
.........}
当然 你可以带分页的查 或者说 指定查多少条记录出来
我做过两种版本的查询后分页,非ajax形式的,就是查询后,显示分页结果时把查询条件写到客户端,在每次"前一页"、"后一页"操作时都提交到后台组合查询条件,比较麻烦;ajax形式的简单多了,因为页面不刷新,查询后查询条件一直保持在客户端,不用传到服务器→服务器写回客户端这么来回折腾,只要每次提交就是了.