JDBC学生管理系统--处理分页显示
分页的思想:
假设一共有104条数据,每页显示10条数据:
select * from student limit 0,10;
页数是index,第index页,对应的sql语句是:
select * from student limit (index-1) * 10, 10;
页面上需要的数据: 第n页 / 共m页 上一页 第 1 2 3 4 5 6 页 下一页 跳转到第n页 选择第n页
需要创建一个类Page来存放分页的数据:
package student.web.formbean; import java.io.Serializable;
import java.util.List; import student.bean.Student; public class Page implements Serializable{ private int currentPageIndex; //当前页的索引 private int pageCount; //共有多少页 private int count = ; //每一页显示的数据 private int totalDataCount; //表中共有多少条数据 private int startIndex = ; //页面索引的起始索引 private int endIndex = ; //页面的结束索引 //增加一个页面上要显示的所有的数据的集合
private List<Student> list; public List<Student> getList() {
return list;
} public void setList(List<Student> list) {
this.list = list;
} public Page(int totalCount, int count){
this.totalDataCount = totalCount;
this.count = count;
//计算有多少页
pageCount = (totalCount + count - ) /count;
} public int getCurrentPageIndex() {
return currentPageIndex;
} public void setCurrentPageIndex(int currentPageIndex) {
this.currentPageIndex = currentPageIndex;
} public int getPageCount() {
return pageCount;
} public void setPageCount(int pageCount) {
this.pageCount = pageCount;
} public int getCount() {
return count;
} public void setCount(int count) {
this.count = count;
} public int getTotalDataCount() {
return totalDataCount;
} public void setTotalDataCount(int totalDataCount) {
this.totalDataCount = totalDataCount;
} public int getStartIndex() {
return startIndex;
} public void setStartIndex(int startIndex) {
this.startIndex = startIndex;
} public int getEndIndex() {
return endIndex;
} public void setEndIndex(int endIndex) {
this.endIndex = endIndex;
}
}
cellphone数据类型最好都是String类型。
然后改造StudentDaoImpl中的listAll ,将原来的listAll 废弃掉 @Deprecated
package student.dao; import java.util.List; import student.bean.Student; public interface StudentDao { /**
* 添加一个学生
* @param student
* @return
*/
public boolean add(Student student); /**
* 删除一个学生
* @param id
* @return boolean
*/
public boolean delete(String id); /**
* 更新
* @param student
* @return
*/
public boolean update(Student student); /**
* 获取所有的学生
* @return
*/
@Deprecated //废弃的方法
public List<Student> getAllStudent(); /**
* 根据客户的编号查询客户
* @param id
* @return 成功则返回此用户,否则返回null
*/
public Student findStudentById(String id); /**
* 根据页面的索引查询此页面的数据
* @param currentPageIndex 当前页的索引
* @param count 每页要显示的记录数
* @return 返回次页面的一个集合
*/ //新增加的方法
public List<Student> getPageList(int currentPageIndex,int count); /**
* 获取数据的个数
* @return 返回表中数据的数量
*/
public int getTotalCount();
}
修改StudentDao.java方法
@Override
public List<Student> getPageList(int currentPageIndex, int count) {
//拿到连接对象
Connection conn = JdbcUtils.getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
List<Student> list = new ArrayList<Student>();
//创建预处理命令对象 try {
pstmt = conn.prepareStatement("select id,name,gender,birthday,cellphone,email,hobby,type,description from student limit ?,?");
//执行sql语句
pstmt.setInt( ,(currentPageIndex-)*count);
pstmt.setInt(, count);
rs = pstmt.executeQuery();
System.out.println("---rs---" + rs);
/**
* ResultSet 光标最初位于第一行之前;第一次调用 next 方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推。
* 当调用 next 方法返回 false 时,光标位于最后一行的后面。任何要求当前行的 ResultSet 方法调用将导致抛出 SQLException。
*/
while(rs.next()){
//封装数据, 在service中将数据封装到page对象的list中
Student s = new Student();
try {
//指定编码,否则在网络传输中会出错
String id = URLEncoder.encode(rs.getString("id"),"UTF-8");
s.setId(id);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
s.setName(rs.getString("name"));
s.setGender(rs.getString("gender"));
s.setBirthday(rs.getDate("birthday"));
s.setCellphone(rs.getString("cellphone"));
s.setEmail(rs.getString("email")) ;
s.setHobby(rs.getString("hobby")) ;
s.setType(rs.getString("type")) ;
s.setDescription(rs.getString("description")) ; list.add(s);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JdbcUtils.release(rs, pstmt, conn);
} return list;
} @Override
public int getTotalCount() {
//拿到连接对象
Connection conn = JdbcUtils.getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
//创建预处理命令对象
try {
pstmt = conn.prepareStatement("select count(*) from student");
//执行sql语句
rs = pstmt.executeQuery();
/**
* ResultSet 光标最初位于第一行之前;第一次调用 next 方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推。
* 当调用 next 方法返回 false 时,光标位于最后一行的后面。任何要求当前行的 ResultSet 方法调用将导致抛出 SQLException。
*/
while(rs.next()){
return rs.getInt(); }
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JdbcUtils.release(rs, pstmt, conn);
} return ;
} }
然后改造ServiceDao,需要将dao层获取的数据都放到Page对象中,然后从page中拿取: (新添加的方法)
/**
* 根据传递过来的索引数和每页显示的数据确定当前页的数据
* @param currentPageIndex 索引页
* @param count 每页的数据
* @return
*/
public Page getPageList(int currentPageIndex, int count);
/**
* 得到数据库中所有的数据的条数
* @return
*/
public int getTotalCount();
/**
*
* 得到页面的数量
* @param count
* @return
*/
public int getPageCount(int count); //用在Controller.java中因为页面需要单独获取数据库中的总数目(页数)
修改ServiceDaoImpl.java
@Override
public Page getPageList(int currentPageIndex, int count) {
//获取总的数据的个数
int totalCount = sd.getTotalCount();
//创建并初始化Page对象
Page page = new Page(totalCount,count);
//给page中的currentPageIndex赋值。
page.setCurrentPageIndex(currentPageIndex);
//获取数据
page.setList(sd.getPageList(currentPageIndex, count));
return page; } @Override
public int getTotalCount() {
return sd.getTotalCount();
}
@Override
public int getPageCount(int count) {
int totalCount = sd.getTotalCount();
return (totalCount + count - 1) /count;
}
修改 Controller.java 控制
package student.web.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import student.bean.Student;
import student.service.StudentService;
import student.service.impl.StudentServiceImpl;
import student.utils.WebTools;
import student.utils.WebUtils;
import student.web.formbean.Page;
import student.web.formbean.StudentFromBean;
public class Controller extends HttpServlet {
StudentService ss = new StudentServiceImpl();
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//拿到页面传递的数据
String op = request.getParameter("op");
System.out.println("--op--" + op);
//根据页面数据做判断
if("all".equals(op)){
listAll(request,response);
}else if("add".equals(op)){
addStudent(request,response);
}else if("update".equals(op)){
update(request,response);
}else if("delete".equals(op)){
delete(request,response);
}else if("delmore".equals(op)){
delmore(request,response);
}else if("toupdate".equals(op)){
toupdate(request,response);
}else if("page".equals(op)){
listpage(request,response);
}
}
private void listpage(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException{
//拿到页面传递的页面索引
String currentPageIndex = request.getParameter("currentPageIndex");
System.out.println("get currentPageIndex=" + currentPageIndex);
//给session中设置两个属性,记录循环开始结束的值
HttpSession session = request.getSession();
//调用service层查询第一页的数据
//需要将string类型转换成int类型
int pageIndex = Integer.parseInt(currentPageIndex);
//首先查询需要多少页
int pageCount = ss.getPageCount(10);//因为这个时候还没有创建page对象,所以只能先用这个方法得到页面的数量
System.out.println("------------pageCount="+pageCount);
if(pageIndex < 1){
pageIndex = 1;
}
if(pageIndex > pageCount){
pageIndex = pageCount;
}
//这一步没有设定每一页应该显示的数据是多少,可以然后再页面上重新设定该参数。
Page page = ss.getPageList(pageIndex, 10);
//根据传递的索引页来判断是否需要改变page队形的startIndex,endIndex
//判断是不是两个·极端
/* 这个方法不可行,需要使用session来保存已有的数值
if(pageIndex == page.getStartIndex() && pageIndex != 1){
//最左边
page.setStartIndex(page.getStartIndex() - 1);
page.setEndIndex(page.getEndIndex() - 1);
}
if(pageIndex == page.getEndIndex() && pageIndex != pageCount){
//最右边
page.setStartIndex(page.getStartIndex() + 1);
page.setEndIndex(page.getEndIndex() + 1);
}
*/
/**
* 由于每次点击都会产生一个新的pageIndex对象,对象中的startIndex和endIndex都会恢复到1,5,不能保存上次的page对象
* 需要给session中设置属性,记录循环的开始和结束的值
*/
Integer start = (Integer)session.getAttribute("startIndex");
Integer end = (Integer)session.getAttribute("endIndex");
if(start == null){
session.setAttribute("startIndex", 1);
}
if(end == null){
if(pageCount < 5){
session.setAttribute("endIndex", 5);
}
session.setAttribute("endIndex", 5);
}
if(pageIndex == (Integer)session.getAttribute("startIndex") && pageIndex != 1){
//点击最左边的页数
session.setAttribute("startIndex", (Integer)session.getAttribute("startIndex") - 1);
session.setAttribute("endIndex", (Integer)session.getAttribute("endIndex") - 1);
}
if(pageIndex == (Integer)session.getAttribute("endIndex") && pageIndex != pageCount){
//最右边的页数
session.setAttribute("startIndex", (Integer)session.getAttribute("startIndex") + 1);
session.setAttribute("endIndex", (Integer)session.getAttribute("endIndex") + 1);
}
if(pageIndex < (Integer)session.getAttribute("startIndex") ){
System.out.println("pageIndex < startIndex =" +pageIndex);
if(pageIndex == 1){//如果等于1,那就不需要再减少一个了
session.setAttribute("startIndex", pageIndex);
session.setAttribute("endIndex", pageIndex + 3);
}else{
//最右边
session.setAttribute("startIndex", pageIndex - 1);
session.setAttribute("endIndex", pageIndex + 3);
}
}
if(pageIndex > (Integer)session.getAttribute("endIndex") ){
//最右边
if(pageIndex == 10){
session.setAttribute("startIndex", pageIndex - 3 );
session.setAttribute("endIndex", pageIndex);
}else{
session.setAttribute("startIndex", pageIndex - 3);
session.setAttribute("endIndex", pageIndex + 1);
}
}
//接着,将page对象存入session中
request.getSession().setAttribute("page", page);
response.sendRedirect(request.getContextPath() + "/list.jsp");
}
private void toupdate(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 封装页面传递过来的数据
//封装页面数据
StudentFromBean sfb = WebUtils.fillFormBean(StudentFromBean.class, request);
System.out.println("---formbean---" + sfb.toString());
//检测数据
System.out.println("===validate===" + sfb.validate());
if(sfb.validate()){
//验证通过,将forbean中的数据拷贝到javabean中
Student s = new Student();
//由于时间是date类型,需要注册一个时间转换器
ConvertUtils.register(new DateLocaleConverter(), Date.class);
try {
BeanUtils.copyProperties(s, sfb);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("---update封装了进来的数据---" + s);
//根据formbean对象的id来封装数据,应该是已经封装进来了
// s.setId(WebTools.createNewId());
//其次由于hobby的类型不同,所以不会拷贝数据,需要收到拷贝
//拿到页面的爱好数组,将数组拼接成一个字符串
String[] hobby = sfb.getHobby();
if(hobby != null && hobby.length > 0){
StringBuffer sf = new StringBuffer(hobby[0]);
for (int i = 1; i < hobby.length; i++) {
sf.append("," + hobby[i]);
}
s.setHobby(sf.toString());
}
//此时应该是已经封装完成了 student对象s
System.out.println("---封装了全部数据,准备写入数据库---" + s);
//调用service层完成业务逻辑,更新数据
boolean flag = ss.update(s);
if(flag){
//说明添加成功,转向主页面,
//先重新查询数据库,拿取数据后在转向主页
listpage(request,response); //此处不用listAll ,使用listpage()时要注意将页面上的currenPageIndex传递过来
}else{
//添加失败
request.setAttribute("errors", "修改失败");
request.getRequestDispatcher(request.getContextPath() + "/update.jsp");
}
}else{
//验证失败,踢回去,sfb对象存入request对象中,错误信息显示到页面上
//算是数据回显
request.setAttribute("user", sfb);
//给页面传递的
request.getRequestDispatcher("/update.jsp").forward(request, response);
}
}
private void delmore(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 获取传递的ids
String all = request.getParameter("ids");
System.out.println("--all---" + all);
//由于ids后面多了一个逗号,记得去掉 ----> 测试没有这一步也没有问题
//ids = ids.substring(0, ids.length()-1) ;
//拿到了ids,拆分后多次调用
String [] ids = all.split(",") ;
for (int i = 0; i < ids.length; i++) {
System.out.println("id" +i+"---"+ ids[i]);
if(!ss.delete(ids[i])){
//删除失败
request.getSession().setAttribute("error", "删除失败");
System.out.println("删除失败");
}
}
//listAll(request, response);
listpage(request,response);
}
private void delete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据id删除对应的行
String id = request.getParameter("id");
System.out.println("--id--" + id);
System.out.println("getparameter -currentPageIndex" + request.getParameter("currentPageIndex"));
//拿到了页面传递过来的id,根据id来删除用户
if(!ss.delete(id)){
//删除失败
request.getSession().setAttribute("error", "删除失败");
}
//listAll(request, response);
listpage(request,response);
}
private void update(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
//获取id
String id = request.getParameter("id");
//根据id来更新内容
//根据id找到该用户,将该用户信息发送到更新页面上,提交到数据库
System.out.println("--update--" + id);
Student s = ss.findStudentById(id);
System.out.println("--find--" + s);
if(s != null){
//请求重定向,必须存放到session中,为什么不使用重定向 ??? 拭目以待
request.getSession().setAttribute("s", s);
// response.sendRedirect(request.getContextPath() + "/update.jsp");
request.getRequestDispatcher("/update.jsp").forward(request, response);
}
}
private void addStudent(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//封装页面数据
StudentFromBean sfb = WebUtils.fillFormBean(StudentFromBean.class, request);
System.out.println("---formbean---" + sfb.toString());
//检测数据
System.out.println("===validate===" + sfb.validate());
if(sfb.validate()){
//验证通过,将forbean中的数据拷贝到javabean中
Student s = new Student();
//由于时间是date类型,需要注册一个时间转换器
ConvertUtils.register(new DateLocaleConverter(), Date.class);
try {
BeanUtils.copyProperties(s, sfb);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("---封装了一部分内容---" + s);
//此时的s对象中没有id属性,需要通过一个类来生成id
s.setId(WebTools.createNewId());
//其次由于hobby的类型不同,所以不会拷贝数据,需要收到拷贝
//拿到页面的爱好数组,将数组拼接成一个字符串
String[] hobby = sfb.getHobby();
if(hobby != null && hobby.length > 0){
StringBuffer sf = new StringBuffer(hobby[0]);
for (int i = 1; i < hobby.length; i++) {
sf.append("," + hobby[i]);
}
s.setHobby(sf.toString());
}
//此时应该是已经封装完成了 student对象s
System.out.println("---封装了全部数据,准备写入数据库---" + s);
//调用service层完成业务逻辑
boolean flag = ss.add(s);
if(flag){
//说明添加成功,转向主页面,
//先重新查询数据库,拿取数据后在转向主页
//listAll(request, response);
listpage(request,response);
}else{
//添加失败
request.setAttribute("errors", "添加失败");
request.getRequestDispatcher(request.getContextPath() + "/add.jsp");
}
}else{
//验证失败,踢回去,sfb对象存入request对象中,错误信息显示到页面上
//算是数据回显
request.setAttribute("user", sfb);
//给页面传递的
request.getRequestDispatcher("/add.jsp").forward(request, response);
}
}
private void listAll(HttpServletRequest request,
HttpServletResponse response) throws IOException {
//显示所有的数据
//拿到所有的数据
/**
* 分层思想,表现层调用业务逻辑层来完成,不需要管他们怎么实现。
*/
// List<Student> list = ss.getAllStudent();
Page page = ss.getPageList(1, 10);
//将数据存放到session中
/**
* 为什么要放到session中而不是request中 ?
* 这个地方如果采用请求转发,增加或改动之后,就会转发到这里来重新查询,但是当转发过来之后,又是一次。算了,自己试一次就知道了。
*
*
* 重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。
* 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL,
* 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重 定向后,
* request内的对象将无法使用。 怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,
* 浏览器中URL仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果你不想看到这样的情况,则选择转发。
*/
//请求重定向,必须存放到session中
request.getSession().setAttribute("page", page);
response.sendRedirect(request.getContextPath() + "/list.jsp");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
修改list.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>学生管理系统</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<style type="text/css">
#t1{
width=900px;
}
#t2{
border:1px solid gray;
border-collapse: collapse <!--表格的边框合并成一个单一的边框 -->
font-size:15px;
text-align:center;
}
#t2 td,tr,th{
border:1px,solid gray
}
#t2 tr:hover{
background-color: ffccff; <!-- 鼠标移动后变色 -->
}
a{
text-decoration: none;
}
</style>
<script type="text/javascript">
/* 对于javascript很不了解,需要重新学习javascript视频 */
function checkAll(flag){
//拿到所有的记录
alert(flag);
var ids = document.getElementsByName("ids");
//循环设置每一个复选框
for (var i = 0; i < ids.length; i++) {
ids[i].checked = flag;
}
}
function delmore(){
//拿到所有的记录的复选框
var ids =document.getElementsByName("ids");
//构建id字符串,循环判断每一个复选框是否选中
var s = "";
for(var i = 0; i <ids.length; i++){
if(ids[i].checked == true){
//拿到复选框的value
s += ids[i].value + ",";
}
}
//数据传递到服务端进行删除
window.location = "${pageContext.request.contextPath}/servlet/Controller?op=delmore&ids=" + s + "¤tPageIndex=${page.currentPageIndex}"; //此处要加上当前页数,通过pagelist(request,response) 函数查询时还是要返回当前页
}
/* 现在开始写javascript代码,给跳转用 */
/* 两种情况:1.输入第几页,然后点击跳转; 2.点击下拉框跳转到指定页面 */
function jump(index){
/* 需要判断是从超链接过来的还是select过来的,方法 : alert(index); 看参数是什么 ,页面提示undefined*/
/* alert(index); */
if("undefined" == typeof(index) ){
//需要拿到文本框中的超链接 ,根据id来拿
/* alert("index"); */
var n = document.getElementById("pageIndex").value;
/* alert(n); */
//判断拿到的内容是否为数字
if(isNaN(n) ){
alert("必须填写数字");
return;
}
if(n == ""){
alert("不能为空");
return;
}
index = n;
}
window.location.href="${pageContext.request.contextPath}/servlet/Controller?op=page¤tPageIndex=" + index;
}
</script>
<body>
学生管理系统 <br>
<h1 align="center">学生信息</h1>
<hr>
<font color =red>${error }</font>
<table id="t1" border=1>
<tr>
<td>
<a href="${pageContext.request.contextPath }/add.jsp">添加</a>
<a href="javascript:delmore()">删除</a>
</td>
</tr>
<tr>
<td>
<table id = "t2" width="100%"> <!-- 占据单元格的100% -->
<tr>
<th><input type="checkbox" id="all" onclick="checkAll(this.checked)">全选全不选</th>
<th>姓名</th>
<th>性别</th>
<th>生日</th>
<th>电话</th>
<th>邮箱</th>
<th>爱好</th>
<th>类型</th>
<th>描述</th>
<th>操作</th>
</tr>
<c:choose>
<c:when test="${empty page.list}">
<tr>
<td colspan="10" align = "center">暂时没有数据</td>
</tr>
</c:when>
<c:otherwise>
<c:forEach items="${page.list}" var="c">
<tr>
<td><input type="checkbox" name="ids" value="${c.id }"></td>
<td>${c.name }</td>
<td>${c.gender == "1" ? "男" : "女"}</td>
<td>${c.birthday }</td>
<td>${c.cellphone }</td>
<td>${c.email }</td>
<td>${c.hobby }</td>
<td>${c.type == "vip" ? "贵宾" : "会员" }</td>
<td>${c.description }</td>
<td><a href="${pageContext.request.contextPath }/servlet/Controller?op=update&id=${c.id}">修改</a> <a href="${pageContext.request.contextPath }/servlet/Controller?op=delete&id=${c.id}¤tPageIndex=${page.currentPageIndex} ">删除</a></td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
</td>
</tr>
</table>
<table border=1>
<td width="20%"><font> 第${page.currentPageIndex}页/共${page.pageCount}页</font></td>
<!-- 此时页面上显示的是第0页,是因为这个page对象中的currentPageIndex没有数据导致,所以需要给他赋值。需要在service中赋值。 -->
<td width="45%"><a href="${pageContext.request.contextPath}/servlet/Controller?op=page¤tPageIndex=${page.currentPageIndex-1}">|<</a>
<c:forEach begin="${startIndex}" end="${endIndex}" var = "n"><!-- 现在改成从session中拿取,不需要page对象了 -->
<a href="${pageContext.request.contextPath}/servlet/Controller?op=page¤tPageIndex=${n}">${page.currentPageIndex == n?"<font color=red>":"<font>"}${n}</font> </a>
</c:forEach>
<a href="${pageContext.request.contextPath}/servlet/Controller?op=page¤tPageIndex=${page.currentPageIndex + 1}">>|</a>
</td>
<!-- <td width="40%"></td> -->
<td width="20%"><input type="text" size="5" name="currentPageIndex" id="pageIndex"><a href="javascript:jump()"> 跳转 </a></td>
<td width="20">
<select name="currentPageIndex" onchange="jump(this.value)">
<c:forEach begin="1" end="${page.pageCount}" var="n">
<option value="${n}" ${page.currentPageIndex == n?"selected":"" }> 第${n}页</option>
</c:forEach>
</select>
</td>
</table>
</body>
</html>
index.jsp
<a href="${pageContext.request.contextPath }/servlet/Controller?op=page¤tPageIndex=1">显示分页数据</a>
update.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fun" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>添加学生信息</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> <script type="text/javascript"
src="${pageContext.request.contextPath }/js/Birthday-Calendar.js"></script>
</head> <body>
<h1 align="center">修改学生信息</h1>
<hr>
<form action="${pageContext.request.contextPath }/servlet/Controller?op=toupdate¤tPageIndex=${page.currentPageIndex}" method="post">
<table align="center" border="">
<tr>
<td align="left" colspan = ""><input type="hidden" name="id" value="${s.id}"></td>
</tr>
<tr>
<td align="right" width="40%">姓名</td>
<td align="left"><input type="text" name="name" value="${s.name }"></td>
<td ><font color="red">${user.errors.name}</font></td>
</tr>
<tr>
<td align="right" width="40%">性别</td>
<td align="left"><input type="radio" name="gender" value="" ${s.gender == "" ? "checked" : ""} >男<input type="radio" name="gender" value="" ${s.gender == "" ? "checked" : ""} >女</td>
</tr>
<tr>
<td align="right" width="40%">生日</td>
<td align="left"><input type="text" name="birthday" onfocus="new Calendar().show(this)" readonly="readonly" value="${s.birthday}"></td>
<!-- 这一段不明白如何添加日期 -->
</tr>
<tr>
<td align="right" width="40%">电话:</td>
<td align="left"><input type="text" name="cellphone" value="${s.cellphone }"></td>
</tr>
<tr>
<td align="right" width="40%">邮箱:</td>
<td align="left"><input type="text" name="email" value="${s.email}"></td>
</tr>
<tr>
<td align="right" width="40%">爱好</td><!-- 由于hobby传递过来的是一个字符串,所以: -->
<td align="left"><input type="checkbox" name="hobby" value="骑行" ${fun:contains(s.hobby,"骑行")?"checked":""}>骑行<input type="checkbox" name="hobby" value="游泳" ${fun:contains(s.hobby,"游泳")?"checked":""}>游泳
<input type="checkbox" name="hobby" value="看电影" ${fun:contains(s.hobby,"看电影")?"checked":""}>看电影</td>
</tr>
<tr>
<td align="right" width="40%">类型</td>
<td align="left"><input type="radio" name="type" value="vip" ${s.type == "vip" ? "checked" : "" }>贵宾<input type="radio" name="type" value="common" ${s.type == "common" ? "checked" : "" }>会员</td>
</tr>
<tr>
<td align="right" width="40%">描述</td>
<td align="left"><textarea rows="" cols="" name="description">${s.description}</textarea></td>
</tr>
<tr>
<td align="center" colspan=""><input type="submit" value="保存"></td>
</tr>
</table>
</form>
</body>
</html>
select * from student limit 0,10; --检索记录1-10
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.--测试mysql5.5不能用
//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行
//换句话说,LIMIT n 等价于 LIMIT 0,n。
数据库中插入多条语句
package student.insert; import java.util.Date; import student.bean.Student;
import student.dao.StudentDao;
import student.dao.impl.StudentDaoImpl;
import student.utils.WebTools; public class Insert { public static void main(String[] args) {
// TODO Auto-generated method stub StudentDao dao = new StudentDaoImpl(); for (int i = ; i < ; i++) {
Student s = new Student();
s.setId(WebTools.createNewId());
s.setName("崔佛-菲利普" + (i + ));
s.setCellphone("" + i);
s.setBirthday(new java.sql.Date(new Date().getTime()));
s.setEmail("崔佛-菲利普"+ i +"@163.com");
s.setGender("");
s.setHobby("看电影");
s.setType("vip");
s.setDescription("一万年太久,只争朝夕"); dao.add(s);
}
}
}
JDBC学生管理系统--处理分页显示的更多相关文章
- 第83节:Java中的学生管理系统分页功能
第83节:Java中的学生管理系统分页功能 分页功能一般可以做成两种,一种是物理分页,另一种是逻辑分页.这两种功能是有各自的特点的,物理分页是查询的时候,对数据库进行访问,只是查一页数据就进行返回,其 ...
- jdbc简单学生管理系统
这个是java连接mysql数据库的一个简单学生系统,通过jdbc连接数据库. 工具类 JDBCuntils. package Student; import java.io.IOException; ...
- Django项目:CRM(客户关系管理系统)--19--11PerfectCRM实现King_admin分页显示条数
登陆密码设置参考 http://www.cnblogs.com/ujq3/p/8553784.html list_per_page = 2 #分页条数 list_per_page = 2 #分页条数 ...
- 学生管理系统(SSM简易版)总结
之前用 Servlet + JSP 实现了一个简易版的学生管理系统,在学习了 SSM 框架之后,我们来对之前写过的项目重构一下! 技术准备 为了完成这个项目,需要掌握如下技术: Java 基础知识 前 ...
- SSh结合Easyui实现Datagrid的分页显示
近日学习Easyui,发现非常好用,界面很美观.将学习的心得在此写下,这篇博客写SSh结合Easyui实现Datagrid的分页显示,其他的例如添加.修改.删除.批量删除等功能将在后面的博客一一写来. ...
- java版本的学生管理系统
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Frame; import java.awt.event.Ac ...
- Java+Mysql+学生管理系统
最近正在学java和数据库,想起以前写的学生管理系统,都是从网上下载,敷衍了事.闲来无事,也就自己写了一个,不过功能实现的不是很多. 开发语言:java: 开发环境:Mysql, java: 开发工具 ...
- JDBC-简单的学生管理系统-增删改查
结构:三层架构--mvc 三层是为了解决整个应用程序中各个业务操作过程中不同阶段的代码封装的问题,为了使程序员更加专注的处理某阶段的业务逻辑. 比如将数据库操作代码封装到一层中,提供一些方法根据参数直 ...
- 实例:SSh结合Easyui实现Datagrid的分页显示
近日学习Easyui,发现非常好用,界面很美观.将学习的心得在此写下,这篇博客写SSh结合Easyui实现Datagrid的分页显示,其他的例如添加.修改.删除.批量删除等功能将在后面的博客一一写来. ...
随机推荐
- Logstash同步Oracle数据到ElasticSearch
最近在项目上应用到了ElasticSearch和Logstash,在此主要记录了Logstash-input-jdbc同步Oracle数据库到ElasticSearch的主要步骤,本文是对环境进行简单 ...
- 【网络流24题】No.16 数字梯形问题 (不相交路径 最大费用流)
[题意] 给定一个由 n 行数字组成的数字梯形如下图所示. 梯形的第一行有 m 个数字.从梯形的顶部的 m 个数字开始,在每个数字处可以沿左下或右下方向移动, 形成一条从梯形的顶至底的路径.规则 1: ...
- [wikioi]没有上司的舞会
树形DP.用F[k][0]和F[k][1]表示某节点不选和选了之后子树的最大值.那么:f[i][0]=sigma(max(f[k][0],f[k][1]))f[i][1]=sigma(f[k][0]) ...
- C51 的编程规范
编程首要是要考虑程序的可行性,然后是可读性.可移植性.健壮性以及可测试性.这是总则.但是很多人忽略了可读性.可移植性和健壮性(可调试的方法可能歌不相同),这是不对的. 1.当项目比较大时,最好分模块编 ...
- bzoj1570
购买的机票限制和数据范围很容易想到是网络流不难想到每个城市按时刻拆点,这也是一个经典模型由于时间不会太大,我们穷举时间,不断在残留网络上建图,跑最大流直至总流量为k即可 ; type node=rec ...
- createElement
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 阮老师讲解TF-IDF算法
TF-IDF与余弦相似性的应用(一):自动提取关键词 作者: 阮一峰 日期: 2013年3月15日 这个标题看上去好像很复杂,其实我要谈的是一个很简单的问题. 有一篇很长的文章,我要用计算机提取它 ...
- Linux libtins 库安装教程
因为工作原因需要用到libtins网络库, 所以今天去装一下. 很尴尬,由于本人对linux理解比较浅, 所以在中途遇到了一些问题. 虽然只是简单的安装步骤,但是阻挡不了自己菜啊. 一. 下载lib ...
- Hay Points
Hay Points TimeLimit: 1 Second MemoryLimit: 32 Megabyte Totalsubmit: 1022 Accepted: 602 Descript ...
- 报错:Cannot insert explicit value for identity column in table 't' when identity_insert is set to OFF
通常情况下,不能向 SQL Server 自增字段插入值,如果非要这么干的话,SQL Server 就会好不客气地给你个错误警告: Server: Msg 544, Level 16, State 1 ...