菜鸟,高分求解决方案!
前前后后我的小项目还是写了有2个月了。基本功能都达到了预期效果,但现在有三个问题没什么太好的办法,求思路和实现代码!,
我的数据处理方式是,servlet查询数据库,做成二维数组,然后传递给jsp页面,在jsp页面上循环打印,包括<tr></tr>和<td></td>都在循环之中。
两个问题,
1分页
考虑用循序定一个固定的下标,加判断,翻页就加倍数下标,显示当然还是页面。郁闷的是,这个翻页和上面的对应不起来。
2筛选
这个基本等于没有办法,我的数据已经由servlet做成二维数组了,如果要在当前页面做筛选效果,那我当期页面需要交互?不会吧。我不知道怎么处理!
3刷新
当前页的刷新如何处理,数据需要重新获取,是前一个servlet传过来的。这个该怎么办了?
菜鸟求救·····高人飞来啊!
[解决办法]
1、分页你最好用SQL分页 这样数据能够稳定
2、我没看懂什么意思(我发现我很菜)
3、想刷新可以用异步刷新 也就是AJAX来做
[解决办法]
select *from (select rownum rown,e.* from emp e)
where rown>=11 and rownum<=5
SQL分页语句
[解决办法]
查询翻页其实很简单,
第一步:先定义好你要查询的数据源》
1,如果页面上有查询的条件,在写SQL之前要预留参数(你在页面上要查姓名为A的人数据,姓名要作为一个参数组装到SQL中,),分页肯定还需要其他的参数,当前第几页,每页显示几条数据,都要作为参数
通过页面传入servlet再组装到SQL中,(解决数据筛选问题)
第二部: 以什么为载体在页面上呈现,如果有开源框架的话,这个完全可以不用考虑,把你需要的数据直接放在一个map或者list中传到前台就行了。框架有很多处理的标签。为什么要用二维数组呢,找麻烦。就算没有使用到框架,用原生的servert类,也没必要用二维数组吧,自己组装自定义标签,在页面用就OK了,再变态一点,直接在JSP页面上引用JAVA了。关于翻页,你当前页面要保存当前页面的一些数据,比如当前页是第几页,多少条数据,上一页就是 当前页-1 ,下一页就是当前页+1 然后传入后台进行查询(翻页问题)
页面刷新:这个无关紧要吧,这个问题没必要考虑。当你刷新页面的时候,就重新开始分页查询了。如果整体框架没有用到AJAX的话,最好不要考虑用它,
[解决办法]
传到前台应该是List<PageBean>的结构,
PageBean就是含有画面上每行的所有列名。
然后用sql分页,把当前页的开始索引和结束索引值传进sql(比如10行分页,第二页传11, 20)
刷新其实就是再执行检索当前页的数据而已。
[解决办法]
其实你这页面一开始显示的数据就要分页的吧!这样的话!你只有写分页的sql语句了!不然的话!就只有控制循环次数来间接达到分页效果!如假如你有10条记录!你可以让它默认显示5条!也就是循环5次!这种方式是不好的!最好还是改写成分页的sql语句!就好操作了!不关你是要分页,还是要按条件查询、以及刷新!都可以!
[解决办法]
} catch (SQLException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
if(conn==null){
new DbConnection();
}
return conn;
}
}
数据库访问实现
package DAO;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import Bean.Goods;
import util.DbConnection;
public class Dao {
private static Connection conn;
private static ResultSet rs;
private static Statement stmt;
private static int pagesize=5;
static{
conn=DbConnection.getConnection();
}
//通用的查询方法
public static ResultSet ExecuteQuery(String sql) {
try {
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
//分页逻辑
public static ArrayList<Goods> getGoodsList(int currentpageno){
ArrayList<Goods> GoodsList=new ArrayList<Goods>();
int BeginRecord=(currentpageno-1)*pagesize;
int EndRecord=currentpageno*pagesize;
rs=ExecuteQuery("select * from goods limit "+BeginRecord+","+EndRecord);
try {
while(rs.next()){
Goods goods=new Goods();
goods.setGoodsid(rs.getInt(1));
goods.setGoodsname(rs.getString(2));
goods.setPrice(rs.getFloat(3));
GoodsList.add(goods);
}
} catch (SQLException e) {
e.printStackTrace();
}
return GoodsList;
}
//统计记录数
public static int getPageCount(){
int total=0;
int PageCount=0;
rs=ExecuteQuery("select count(*) from goods");
try {
if(rs.next()){
total=rs.getInt(1);
PageCount=(total-1)/pagesize+1;
}
} catch (SQLException e) {
e.printStackTrace();
}
return PageCount;
}
}
servlet控制器
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import Bean.Goods;
import DAO.Dao;
public class GetLimiteGoods extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
String pageno= request.getParameter("currentpageno");
int currentpageno=1;
if(pageno!=null){
currentpageno=Integer.parseInt(pageno);
}
ArrayList<Goods> GoodsList=Dao.getGoodsList(currentpageno);
request.setAttribute("GoodsList", GoodsList);
request.setAttribute("currentpageno", currentpageno);
request.setAttribute("PageCount", Dao.getPageCount());
request.getRequestDispatcher("/LimiteGoods.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out
.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the POST method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>GetLimiteGoods</servlet-name>
<servlet-class>servlet.GetLimiteGoods</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetLimiteGoods</servlet-name>
<url-pattern>/servlet/GetLimiteGoods</url-pattern>
</servlet-mapping>
</web-app>
表现层jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<c:if test="${currentpageno>=1}">
<a href="GetLimiteGoods?currentpageno=1">首页</a>
<a href="GetLimiteGoods?currentpageno=${currentpageno-1}">上一页</a>
</c:if>
<c:if test="${currentpageno==1}">
<a href="GetLimiteGoods?currentpageno=${currentpageno+1}">下一页</a>
<a href="GetLimiteGoods?currentpageno=${PageCount}">尾页</a>
</c:if>
<table width="80%" border="1" height="56">
<tr align="center">
<td>
商品编号
</td>
<td>
商品名称
</td>
<td>
商品价格
</td>
</tr>
<c:forEach var="goods" items="${GoodsList}">
<tr align="center">
<td>
${goods.goodsid}
</td>
<td>
${goods.goodsname}
</td>
<td>
${goods.price}
</td>
</tr>
</c:forEach>
</table>
</center>
</body>
</html>
[解决办法]
慢慢来,别急,一步步来,把你能想到的方法就用上,不行了!我给代码参考!你看行吗?
[解决办法]
分页:
public class Serch extends ActionSupport{ private String bid; private String bname; private int number; private int k;//储存最大页面数 private int pageNow=1; //页码数,初始为1 private int pageSize = 5 ; //页面行数 private int intRowCount;//总行数 private int intPageCount;//总页数 private int lastPage; private int p=1;.....set/get;public String execute() throws Exception { List list=new List(); java.util.List L=new ArrayList(); L=list.list(); intRowCount=L.size(); System.out.println("链表的长度:"+L.size()); if(L.size()%pageSize==0) //判断分多少页 this.lastPage=L.size()/pageSize; else this.lastPage=L.size()/pageSize+1; this.setIntPageCount(this.lastPage);//存入总页数 if(this.pageNow<1)//如果当前页码是第一页在点第一页的时候也跳转到第一页 this.pageNow=1; if(this.pageNow>this.lastPage)//同理只不过是最后一页 this.pageNow=this.lastPage; /* * * 假设取其中20-25条 * * * */ int startIndex=(this.pageNow-1)*pageSize;//截止条目开始,第20条 int endIndex=startIndex+pageSize;//截止条目结束 第25条 if(endIndex>=L.size()) endIndex=L.size(); L= L.subList(startIndex, endIndex); System.out.println("执行"); ActionContext.getContext().put("list", L); return "success";}@Overridepublic void validate() { // TODO Auto-generated method stub super.validate();}}前台显示:共<s:property value="intRowCount"/>记录 共<s:property value="intPageCount"/>页 第<s:property value="pageNow"/>页 <s:url action="Serch.action" id="url"> <s:param name="pageNow"> <s:property value="1" /> </s:param> </s:url> <s:a href="%{url}">首页</s:a> <s:url action="Serch.action" id="url"> <s:param name="pageNow"> <s:property value="%{pageNow-1}" /> </s:param> </s:url> <s:a href="%{url}">上一页</s:a> <s:url action="Serch.action" id="url"> <s:param name="pageNow"> <s:property value="%{pageNow+1}" /> </s:param> </s:url> <s:a href="%{url}">下一页</s:a> <s:url action="Serch.action" id="url"> <s:param name="pageNow"> <s:property value="lastPage" /> </s:param> </s:url> <s:a href="%{url}">尾页</s:a>
[解决办法]