菜鸟,高分求解决方案!

lxpandsq 2012-03-09 02:29:40
前前后后我的小项目还是写了有2个月了。基本功能都达到了预期效果,但现在有三个问题没什么太好的办法,求思路和实现代码!,
我的数据处理方式是,servlet查询数据库,做成二维数组,然后传递给jsp页面,在jsp页面上循环打印,包括<tr></tr>和<td></td>都在循环之中。

两个问题,
1分页
考虑用循序定一个固定的下标,加判断,翻页就加倍数下标,显示当然还是页面。郁闷的是,这个翻页和上面的对应不起来。

2筛选

这个基本等于没有办法,我的数据已经由servlet做成二维数组了,如果要在当前页面做筛选效果,那我当期页面需要交互?不会吧。我不知道怎么处理!

3刷新
当前页的刷新如何处理,数据需要重新获取,是前一个servlet传过来的。这个该怎么办了?

菜鸟求救·····高人飞来啊!
...全文
190 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
wolf863292 2012-03-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 lxpandsq 的回复:]
1分页
2筛选
3刷新
[/Quote]
先明确:获取数据是servlet的职责,jsp负责的是条件的输入。
1、2其实是一个问题,就是把页码、条件传递到servlet。
3、不是问题,就是servlet重新查询数据,然后转到jsp。

分页、筛选的核心代码是这里:

String sql="select * from tujizhubiao";

要根据页码和条件,重新组合sql语句,如

sql += " where 借书人='张三'";


以上结论是建立在LZ现有代码的基础上的。
lxpandsq 2012-03-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 herozhang8555 的回复:]
引用 11 楼 lxpandsq 的回复:
引用 9 楼 herozhang8555 的回复:
查询翻页其实很简单,

第一步:先定义好你要查询的数据源》
1,如果页面上有查询的条件,在写SQL之前要预留参数(你在页面上要查姓名为A的人数据,姓名要作为一个参数组装到SQL中,),分页肯定还需要其他的参数,当前第几页,每页显示几条数据,都要作为参数
通过页面传入servlet再组装到SQ……
[/Quote]


不错,这是我唯一想到的办法,其实啊老大,你应该告诉我在不引用那些乱七八糟的框架的情况下,比较合理的方式,是什么,而不是实现俺们这不成熟的想法,我既然有想法,那么解决只是时间问题,但是思路很重要!
lxpandsq 2012-03-12
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 mengjunquan 的回复:]
慢慢来,别急,一步步来,把你能想到的方法就用上,不行了!我给代码参考!你看行吗?
[/Quote]

呵呵,我也这么想的。不是为解决问题而解决问题,解决问题是为了学习,搞明白一个WHY?
colie_li 2012-03-10
  • 打赏
  • 举报
回复
分页:

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";
}
@Override
public 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>


测试通过..仅供参考...
简易人 2012-03-09
  • 打赏
  • 举报
回复
慢慢来,别急,一步步来,把你能想到的方法就用上,不行了!我给代码参考!你看行吗?
cowboyhn 2012-03-09
  • 打赏
  • 举报
回复
为什么不用一些WEB框架呢?如JQuery,Extjs,这些框架都有筛选、分页、排序功能。
herozhang8555 2012-03-09
  • 打赏
  • 举报
回复
再说一个题外话,对你没有坏处。
你那种查询分页的方式,性能上会很差,几十上百条数据没啥感觉,要是超过千,万,十万,百万条数据,你的容器很快会宕掉。你的代码是把一张表里面的数据全部都放到内存中了,这样写程序,要是在公司的话,估计会被老大给骂死,哈哈。

多到CSND其他地方逛逛,多跟老鸟交流交流,会有很大收获的,嘿
herozhang8555 2012-03-09
  • 打赏
  • 举报
回复
JavaBean

package Bean;
//物品类
public class Goods
{
private int goodsid; // 物品编号
public String goodsname; // 物品名称
private float price; // 物品单件

public void setGoodsid(int goodsid)
{
this.goodsid = goodsid;
}
public int getGoodsid()
{
return goodsid;
}
// 物品名称
public void setGoodsname(String goodsname)
{
this.goodsname = goodsname;
}
public String getGoodsname()
{
return goodsname;
}
// 物品价格
public void setPrice(float price)
{
this.price = price;
}
public float getPrice()
{
return price;
}
}

单例类

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DbConnection {
private static Connection conn=null;
private String driver="com.mysql.jdbc.Driver";
private String url="jdbc:mysql://localhost:3306/mydata";
private String user="root";
private String password="1234567";

private DbConnection(){
try {
Class.forName(driver);
conn=DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} 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>
herozhang8555 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lxpandsq 的回复:]
引用 9 楼 herozhang8555 的回复:
查询翻页其实很简单,

第一步:先定义好你要查询的数据源》
1,如果页面上有查询的条件,在写SQL之前要预留参数(你在页面上要查姓名为A的人数据,姓名要作为一个参数组装到SQL中,),分页肯定还需要其他的参数,当前第几页,每页显示几条数据,都要作为参数
通过页面传入servlet再组装到SQL中,(解决数据筛选问题)

第二部: 以……
[/Quote]


兄弟,看你的代码,就知道你是个新手,呵呵。
你现在的问题就是采取分页的方式不对
,从网上找了个例子,给你看看,希望对你有所帮助,哈


小王爷 2012-03-09
  • 打赏
  • 举报
回复
跟楼主水平差不多,分页是把数据全部存到list里面,不是查询数据库分页
今儿起叫民工 2012-03-09
  • 打赏
  • 举报
回复
其实你这页面一开始显示的数据就要分页的吧!这样的话!你只有写分页的sql语句了!不然的话!就只有控制循环次数来间接达到分页效果!如假如你有10条记录!你可以让它默认显示5条!也就是循环5次!这种方式是不好的!最好还是改写成分页的sql语句!就好操作了!不关你是要分页,还是要按条件查询、以及刷新!都可以!
lxpandsq 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wzl413023 的回复:]
你这是jsp+servlet哦!你可以在servlet 查询出来的数据!放在list集合或者说是你的数据有对应关系 你就把他放在 map中!然后你在页面循环map!就好了嘛!这样代码也简洁些!当然,如果你会用jstl页面代码就会更加简洁!
这样的你的筛选问题和刷新都可以解决了!就是重新查询一次数据的事!然后,在页面循环显示!
[/Quote]

我是那么操作的,但是我的分页和刷新问题还是没解决,现在搞定的是按条件晒选啊
菖蒲老先生 2012-03-09
  • 打赏
  • 举报
回复
传到前台应该是List<PageBean>的结构,
PageBean就是含有画面上每行的所有列名。

然后用sql分页,把当前页的开始索引和结束索引值传进sql(比如10行分页,第二页传11, 20)

刷新其实就是再执行检索当前页的数据而已。
今儿起叫民工 2012-03-09
  • 打赏
  • 举报
回复
你这是jsp+servlet哦!你可以在servlet 查询出来的数据!放在list集合或者说是你的数据有对应关系 你就把他放在 map中!然后你在页面循环map!就好了嘛!这样代码也简洁些!当然,如果你会用jstl页面代码就会更加简洁!
这样的你的筛选问题和刷新都可以解决了!就是重新查询一次数据的事!然后,在页面循环显示!
lxpandsq 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 herozhang8555 的回复:]
查询翻页其实很简单,

第一步:先定义好你要查询的数据源》
1,如果页面上有查询的条件,在写SQL之前要预留参数(你在页面上要查姓名为A的人数据,姓名要作为一个参数组装到SQL中,),分页肯定还需要其他的参数,当前第几页,每页显示几条数据,都要作为参数
通过页面传入servlet再组装到SQL中,(解决数据筛选问题)

第二部: 以什么为载体在页面上呈现,如果有开源框架的话,这个完……
[/Quote]


你的意思,我在jsp整个窗体上面再加一个from action——servlet上面,预留sql查询语句及其参数。
完了以后,servlet-jap显示。筛选的话这么做应该是可以的。只是多请求了一次服务器!这个问可以算解决了。

分页,我还是没办法,我的数据来源是,servlet-jsp, 现在servlet的值变了,我在jsp上显示的是旧的数据,就需要一个刷新按钮!但是这个按钮又在jsp上面,我就不知道该怎么办了
lxpandsq 2012-03-09
  • 打赏
  • 举报
回复
我晕了,代码贴出来!请大家帮忙看下!
jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>借图明细</title>
<%String s1[][]=(String[][])request.getAttribute("jiechumingxi");%>

</head>
<form action="./Tuji?leibie=jiechuguihuan" id="form2" name="form2" method="post" >
<input type="hidden" name="text" id="text" >
</form>
<body>
<table width="740" border="1" align="center">
<tr>
<td width="66">图籍序号</td>
<td width="66">借出部门</td>
<td width="65">借出人</td>
<td width="66">借图日期</td>
<td width="66">借出数量</td>
<td width="241">备注</td>
<td width="56">操作</td>
<td width="62">数量</td>
</tr>
<%
for(int i=0;i<s1.length;i++)
{ %>
<tr>
<%
for(int j=0;j<s1[0].length;j++)
{%>

<%
if(j==0)
{
%><td><form action="./Tuji?leibie=xiangxi&bianhao=<%=s1[i][j]%>" id="form1" name="form1" method="post" target="_blank">
<input type="submit" value="<%=s1[i][j]%>"></form></td><%

}
else
{
%><td align="left" valign="middle" ><textarea rows="3" cols="35" style= "overflow-y:hidden"><%
out.print(s1[i][j]);
%></textarea></td><%
}
}
%>
<td><form action="./Tuji?leibie=jiechuguihuan&shu=<%=s1[i][4]%>&xvhao=<%=i%>" method="post" ><input type="submit" value="归还"></form></td>
<td><input type="text" name="text" id="text" name="text2" value="<%=s1[i][4]%>"></td>
</tr>
<%} %>
</table>

</body>
</html>

servlet代码

if(leibie.equals("tujichaxun"))
{
String sql="select * from tujizhubiao";
rs=null;
rs=connsqlserver.executeQuery(sql,strDBlogo);
try {
rs.last(); //得到行数 last会把指针移动到最后,所以必须在用beforeFirst移动回来!
int rowCount=rs.getRow();
rs.beforeFirst();
ResultSetMetaData rsmd=rs.getMetaData(); //得到列数
int colCount=rsmd.getColumnCount();

String str[][]=new String[rowCount][colCount];

if(rs!= null)
{ int j=0;

while (rs.next())
{

for(int i=1;i<=colCount;i++)
{
str[j][i-1]=rs.getString(i);
}
j++;
}

System.out.print(leibie);
request.setAttribute("tujijieguo",str );
request.getRequestDispatcher("mokuai/logo/xiangmu/tuji/tujichaxun.jsp?tujijieguo=str").forward(request,response);
}
} catch (SQLException e) {
e.printStackTrace();
}

}


herozhang8555 2012-03-09
  • 打赏
  • 举报
回复
查询翻页其实很简单,

第一步:先定义好你要查询的数据源》
1,如果页面上有查询的条件,在写SQL之前要预留参数(你在页面上要查姓名为A的人数据,姓名要作为一个参数组装到SQL中,),分页肯定还需要其他的参数,当前第几页,每页显示几条数据,都要作为参数
通过页面传入servlet再组装到SQL中,(解决数据筛选问题)

第二部: 以什么为载体在页面上呈现,如果有开源框架的话,这个完全可以不用考虑,把你需要的数据直接放在一个map或者list中传到前台就行了。框架有很多处理的标签。为什么要用二维数组呢,找麻烦。就算没有使用到框架,用原生的servert类,也没必要用二维数组吧,自己组装自定义标签,在页面用就OK了,再变态一点,直接在JSP页面上引用JAVA了。关于翻页,你当前页面要保存当前页面的一些数据,比如当前页是第几页,多少条数据,上一页就是 当前页-1 ,下一页就是当前页+1 然后传入后台进行查询(翻页问题)

页面刷新:这个无关紧要吧,这个问题没必要考虑。当你刷新页面的时候,就重新开始分页查询了。如果整体框架没有用到AJAX的话,最好不要考虑用它,
unbelievable2010 2012-03-09
  • 打赏
  • 举报
回复
select *from (select rownum rown,e.* from emp e)
where rown>=11 and rownum<=5
SQL分页语句
今儿起叫民工 2012-03-09
  • 打赏
  • 举报
回复
不的你这么麻烦的嘛!你查询出来的数据可以直接放到list集合中就可以了嘛!页面用jstl循环就可以了三!
至于筛选嘛!可以重新访问一次数据库嘛!根据筛选条件重新查询一次!结果就是你想要的!
herozhang8555 2012-03-09
  • 打赏
  • 举报
回复
二维数组?为什么要用二维数组?有什么意义吗,说下你的思路
加载更多回复(5)

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧