哇,今天啊,老师讲的真是听不懂,因为自己研究一下工具类中分页查询工具类,等在想听的时候结果发现跟不上了。。。。
这真是一个悲催的故事,不过还好自己看了下跟上了,今天就来写一下,分页查询和按 key 查询。
不得不说,我觉得用jsp来编写java代码真的很方便,因为可以直接将值带回到jsp页面中(比如查询),而不需要经过action,但是这种方式显然已经过时了,没人用了。。。。
下面我们就来简单的看一下今天的代码。
一.分页查询工具类
我先贴一下代码:
package com.base.util;
/**
* 翻页类
*
* @author Administrator
*
*/
public class TurnPage {
private int MAX;// 页面最大数量,每页的最大显示数据
private int pageNum;// 当前页
private int pageMax;// 最大页号,计算得
private int counNum;// 总数量
private int pageOrder;// 显示的页码数量 ,自己指定
/**
* 初始化函数
*
* @param max
* 单页最大行数
* @param pageNum
* 当前页号
* @param countNum
* 数据总数量
* @param pageline
* 显示的行号数量
*/
public TurnPage(int max, int pageNum, int countNum, int pageline) {
this(max, pageNum, countNum, pageline, 200);
}
/**
* 初始化函数
*
* @param max
* 单页最大行数
* @param pageNum
* 当前页号
* @param countNum
* 数据总数量
* @param pageline
* 显示的行号数量
* @param PageMax
* 可以显示出来的最大的页号
*/
//创建对象
public TurnPage(int max, int pageNum, int countNum, int pageline,
int PageMax) {
//页面显示的最大行数
this.MAX = max;
//数据库中的数据总数
this.counNum = countNum;
//按照每页最大行数显示要显示几页
this.pageMax = countNum % max == 0 ? countNum / max
: (countNum / max + 1);
//当所自定义的最大页码数,小于pageMax时,我们就将最大页码数定义为自定义的页码数量。(显然这是很合理的)
if (this.pageMax > PageMax)
this.pageMax = PageMax;
//如果传进来的当前页数<=0,就将当前页数设为0,防止传入的页数为负数。
if (pageNum <= 0) {
pageNum = 0;
//如果传进来的当前页数>0并且大于所规定的最大页码数,那么就将这个pageNum = this.pageMax - 1。
}else if (pageNum >= this.pageMax) {
pageNum = this.pageMax - 1;
}
//定义成员变量的值
this.pageNum = pageNum;
this.pageOrder = pageline;
}
/**
* 根据传参-返回翻页信息
*
* @param query
* @return
* url要提交的路径,query查询的条件(也就是查询的name名)
*
*/
public String getPage(String url, String query){
// int showLN=5;//页号数量
// int showN=pageNum;//当前页号
//查询条件为空时,我们定义查询条件恒为true(1=1)。
if (query == null) {
query = "1=1";
}
// int pnS = pageNum - pageNum % pageOrder;// 起始页号
//当前页数
int pnS = pageNum;
//如果当前页数小于1,那么就使当前页面为1。
if (pnS < 1)
pnS = 1;
//显示的最大页数
int pnE = pnS + pageOrder - 1;
if (pnE > pageMax)
pnE = pageMax;
//通过流来将文本写入到jsp中。
StringBuilder sb = new StringBuilder("<div class='page'><ul>");
if (pageNum <= 0) {
sb.append("<li class='no'>First</li> <li class='no'>Prev</li>");
} else {
if(url.startsWith("javascript")){
sb.append("<li><a href='").append(url.replace("[pageNum]","0")).append("'>First</a></li> ");
sb.append("<li><a href='").append(url.replace("[pageNum]",(pageNum-1)+"")).append("'>Prev</a></li>");
}else{
sb.append("<li><a href='").append(url).append("?pageNum=0&").append(query).append("'>First</a></li> ");
sb.append("<li><a href='").append(url).append("?pageNum=").append(pageNum-1).append("&").append(query).append("'>Prev</a></li>");
}
}
for (int i = pnE - pnS + 1 == pageOrder ? pnS-1 : pnE-pageOrder < 0 ? 0 : pnE-pageOrder; i < pnE; i++) {
if (pageNum == i) {
sb.append("<li class='checked'><a>").append(i + 1).append("</a></li> ");
} else {
if(url.startsWith("javascript")){
sb.append("<li><a href='").append(url.replace("[pageNum]",i+"")).append("'>").append(i + 1).append("</a></li> ");
}else{
sb.append("<li><a href='").append(url).append("?pageNum=").append(i).append("&").append(query).append("'>").append(i + 1).append("</a></li> ");
}
}
}
if (pageNum >= pageMax - 1) {
sb.append("<li class='no'>Next</li> <li class='no'>Last</li>");
} else {
if(url.startsWith("javascript")){
sb.append("<li><a href='").append(url.replace("[pageNum]",(pageNum+1)+"")).append("'>Next</a></li> ");
sb.append("<li><a href='").append(url.replace("[pageNum]",(pageMax-1)+"")).append("'>Last</a></li>");
}else{
sb.append("<li><a href='").append(url).append("?pageNum=").append(pageNum+1).append("&").append(query).append("'>Next</a></li> ");
sb.append("<li><a href='").append(url).append("?pageNum=").append(pageMax-1).append("&").append(query).append("'>Last</a></li>");
}
}
sb.append("</ul></div>");
return sb.toString();
}
/**
* 查询起始数量
*
* @return
*/
public int getStart() {
return pageNum * MAX;
}
/**
* 查询结束数量
*
* @return
*/
public int getEnd() {
return MAX;
}
public int getCounNum() {
return counNum;
}
public int getMAX() {
return MAX;
}
public int getPageMax() {
return pageMax;
}
public int getPageNum() {
return pageNum;
}
public void setCounNum(int counNum) {
this.counNum = counNum;
}
public void setMAX(int max) {
MAX = max;
}
public void setPageMax(int pageMax) {
this.pageMax = pageMax;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public static void main(String[] args) {
}
}
说实话,我还是不清楚这个标签是怎么拼接的,但是有一些其他的代码我们是可以看懂的。我们首先定义了几个成员变量,这些成员变量都是和分页查询有关的,比如:当前页,每页显示的最大行数,最大页号,数据库中的总数据数,自定义的页码数量。
并且通过这个类的4个参数的构造方法,就可以调用这个类的5个参的构造方法。
也就是在一个构造方法中通过this()方法传入的不同的参数,来指定调用哪一个具体的构造方法。在5个参的构造方法中,我们初始化了最大行数MAX(pageSize),数据库中的数据总数(countNum) ,并且按照每页最大行数显示要显示几页的pageMax。
这个工具类的作用就是显示分页按钮和传递要查询的页数和每页显示的行数。
二.显示数据的jsp页面
昨天其实写了一部分,今天贴一下完整的jsp代码:
<%@page import="com.base.util.TurnPage"%>
<%@page import="com.base.util.SessionTools"%>
<%@page import="com.limit.emp.dao.EmpInterface"%>
<%@page import="com.base.util.StringTools"%>
<%@page import="com.base.statics.YesNoType"%>
<%@page import="com.base.util.DateTools"%>
<%@page import="com.limit.role.bean.T_limit_Role"%>
<%@page import="com.limit.role.dao.T_limit_RoleDao" %>
<%@page import="com.limit.role.dao.RoleInterface"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<% //获取当前项目的相对路径(项目名)
String path = request.getContextPath();
//创建Dao层的对象
T_limit_RoleDao t_limit_RoleDao=new T_limit_RoleDao();
//构建分页工具
//定义pageSize,每页最大显示行数
int pageSize=3;
//定义pageNum,当前页码
String pageNum=request.getParameter("pageNum");
if(pageNum==null){
pageNum="0";
}
//定义数据库中数据的总数
int dataCount=t_limit_RoleDao.getDataCount();
//定义显示的最大页码数
int pageLine=5;
//创建分页类对象
TurnPage turnPage = new TurnPage(pageSize,Integer.parseInt(pageNum),dataCount,pageLine);
//查询所有角色信息
List<T_limit_Role> list_2=t_limit_RoleDao.selectAllRole();
//分页查询的结果
List<Map> list_map=null;
//得到查询的roleName
String roleName=request.getParameter("roleName");
if(roleName==null || roleName==""){
//说明查询条件为空
list_map=t_limit_RoleDao.selectRolePagination(Integer.parseInt(pageNum), pageSize);
}else{
//通过角色名来查询
list_map=t_limit_RoleDao.selectRoleByName(roleName);
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link href="../../skin/css/style.css" rel="stylesheet" type="text/css" />
<title>menu</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8;" />
<script language='javascript'>var curopenItem = '1';</script>
<script language="javascript" type="text/javascript" src="<%=path %>/js/jquery.min.js"></script>
<script language="javascript" type="text/javascript" src="<%=path %>/js/JSTools.js"></script>
<%@include file="/js/jquery-ui.jsp" %>
<base target="main" />
<script type="text/javascript">
</script>
<jsp:include page="/validMessage_decode.jsp"></jsp:include>
<!-- 表单的提交和验证 -->
<script>
//进行页面加载事件
$(function(){
$("#name").blur(function(){
checkRoleName();
});
$("#btnAddRole").click(function(){
//进行提交前验证,调用这个方法
var con1=checkRoleName();
//是数字
var con2=!isNaN($("#selPid option:selected").val());
if(con1 && con2 ){
$("#formAddRole").submit();
}else{
$.alert("提交失败");
}
});
});
function checkRoleName(){
var name=$("#name").val();
//不能将a转换正int类型
// var id=$("#selPid option:selected").val();
var flag=false;
/*进行验证*/
$.ajax({
//需要传入的参数
data:{"name":name}, // ,"pid":id
url:'<%=path%>/checkRoleIsExistAction.action',
async:false,
dataType:"json",
success:function(req){
$("#roleMessege").html(req.data.value);
if(req.data.key.trim()=="success"){
flag=true;
}
if(req.data.key.trim()=="error"){
flag=false;
}
},
error:function(){
alert("action 执行失败了");
}
});
return flag;
}
//----------------------------------------------------------------------------------------------------------------------------
$(function(){
});
function queryRole(){
//ajax查询
$.ajax({
url:'<%=path%>/queryRoleBean.action',
async:false,
});
}
</script>
</head>
<body leftmargin="8" topmargin="8">
<!-- 弹出层 开始 -->
<center>
<div id="d1" style="display:none;width:97%;height:97%;position:absolute;z-index:100;background-color:white;margin:0 0 0 0px;filter:alpha(Opacity=80);-moz-opacity:0.5;opacity: 0.5;">
<!-- <div id="d2" style="border: 0px solid blue;margin:10% 0 0 20%; width:50%;height:400px; background-color: #EAE8E4;"> -->
<!-- </div> -->
</div>
<div id="d2" style="display:none;border: 0px solid green;margin:15% 0 0 15%; width:70%;height:50%;z-index: 101;position: absolute;">
</div>
<div id="d3" style="display:none;border: 0px solid red;z-index: 102;position:absolute;margin:16% 0 0 65%;" align="right">
<a href=" javascript:void(0);" id="closeDIV">关闭</a>
</div>
</center>
<!-- 弹出层 结束 -->
<!-- 标题 -->
<div class="wdjh_b" style=" padding-left:1%; width:98%">
<table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="" align="center">
<tr>
<td height="26" align="center"><br /><h1 style=" color:#226411;">添加角色</h1></td>
</tr>
</table>
<!-- 添加角色表单 -->
<table width='100%' border='0' align="center" style="margin-top:8px">
<tr>
<td align='center'>
<!-- 添加角色表单 -->
<form id="formAddRole" action="addRoleAction.action" method="post">
<table border='0' cellpadding='5' cellspacing='0' style="margin-top: 10px;">
<tr>
<td width='170px' align="right">角色名:</td>
<td width='170px'>
<input type='text' id="name" name='name' value='' style='width:150px' />
</td>
<td width="10px">
<span id="roleMessege"></span>
</td>
</tr>
<tr>
<td align="right">所属上级角色名:</td>
<td>
<select id="selPid" name="pid" style="width:155px;">
<option value="a">--请选择角色--</option>
<%
if(list_2!=null || list_2.size()>0){
for(T_limit_Role t:list_2){
%>
<option value="<%=t.getId() %>"><%= t.getName() %></option>
<%
}
}
%>
<option value="0">-- 顶级角色 --</option>
</select>
</td>
<td>
<span id="roleRightMessege"></span>
</td>
</tr>
<tr>
<td colspan="3" align="center" height="50px">
<input type="button" id="btnAddRole" value="添加"/>
</td>
</tr>
</table>
</form>
</td>
</tr>
</table>
<!-- 标题################################################################################################################ -->
<table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="" align="center">
<tr>
<td height="26" align="center"><br /><h1 style=" color:#226411;">管理角色</h1>
</td>
</tr>
</table>
<form name="form1" id="form1" method="post" action="manageT_limit_Role.jsp">
<table width="98%" border="0" cellpadding="2" align="center" style="margin-top:8px">
<tr>
<td align="center">角色名:<input type="text" name="roleName" id="txtRoleName" value=""> <input type="submit" name="sub" id="sub" value="查询" class="button"></td>
</tr>
</table>
<!-- 按照角色名查询的表单 -->
<script>
$(function(){
$("#form1").submit(function(){
if($("#txtRoleName").val==null ||("#txtRoleName").val=="" ){
//说明没有查询条件,查询所有
$("#txtRoleName").attr("action","manageT_limit_Role.jsp");
}else{
$(this).attr('action','manageT_limit_Role.jsp?rolename='+roleName);
}
});
});
</script>
</form>
<div class="wdjh_b">
<!-- 内容列表 -->
<table width="100%" border="0" cellpadding="2" cellspacing="1" bgcolor="#D1DDAA" align="center" style="margin-top:8px;">
<tr bgcolor="#FFFFFF" class="wdjh_ba">
<td height="40" colspan="7" style="text-align:center;"> 角色列表 </td>
</tr>
<tr align="center" bgcolor="#E7E7E7" class="wdjh_ba">
<td width="5%">序号</td>
<td width="20%">角色名</td>
<td width="20%">所属上级角色名</td>
<td width="5%">生效状态</td>
<td width="10%">操作时间</td>
<td width="10%">操作人</td>
<td width="">操作</td>
</tr>
<%
if(list_map.size()>0 && list_map!=null){
for(Map map:list_map){
%>
<tr align='center' bgcolor="#FFFFFF" onMouseMove="javascript:this.bgColor='#FCFDEE';" onMouseOut="javascript:this.bgColor='#FFFFFF';">
<td><%= map.get("id")%></td>
<td><%= map.get("name")%></td>
<td><%= map.get("pname")%></td>
<td><%= map.get("valid")%></td>
<td><%= map.get("operateTime")%></td>
<td><%= map.get("trueName")%></td>
<td>
<a id="modiRole" href="" onclick="">修改</a> |
<a href="" onclick="return del()">删除</a> |
<a href="">设置</a> |
<a href=""></a>
</a>
</td>
</tr>
<%
}
}
%>
</table>
<center>
<div class="ym width_">
<%= turnPage.getPage("manageT_limit_Role.jsp", "rolename="+roleName) %>
</div>
</center>
</div>
</body>
</html>
在这个页面中,我们一共查询数据库3次,一次是以list<>返回的,另外两次通过list<Map>集合来返回的,以为后两次我们需要通过key来遍历出value并显示到页面中。我们没有通过action,而是直接在 jsp 中编写java代码,将查询结果直接返回到jsp页面中。流程是:我们通过分页按钮的前一页或者后一页,来确定所要查询的页码,而pageSize(每页显示的行数)已经确定,所以我们就相当于将这两个参数又发送到了当前页面,并把查询的条件也带到了当前页面。然后就通过我们定义的方法就可以查询数据库了。
还有在进行表单提交到的时候,如果按下提交按钮,那么先执行的表单提交事件代码,然后在发送请求。
三.sql语句
我们知道ibatis在查询数据库的时候,在方法中是先定义索引和参数的,然后将参数作为查询条件并找到索引对应的sql。
这里我写一个sql语句,因为我不知道还可以这么写,所以记一下:
<select id="selectRoleByName" parameterClass="java.lang.Object" resultClass="java.util.HashMap">
select id,name,operateTime,operator,
(select trueName from t_limit_emp where id = t1.operator) as trueName,
valid,
(select name from t_limit_role where id = t1.pid) as pname
from t_limit_role as t1 where name=#name#;
</select>
也就是在一个表中查所需要的列,如果需要别的数据,就可以在对应位置上在查询一次,并且这次查询可以两表联查。。。
在码一个问题:只有对象类型才有包,基本类型是没有包的,在查询数据库中的数据总数时,如果返回值为object会出错,我们应该返回Integer类型。(使用ibatis框架时)