后台分页的页码安全(超过总页数,页码为非数字)检查问题
解决办法使用校验器:
如果页码没大于接收页码参数类型的最大值,但是页码大于总页数。
就在业务层进行判断
// 如果当前页大于总页数,那么就把最后一页的就是当前页
if (page > pageBean.getTotalPage()) {
page = pageBean.getTotalPage();
pageBean.setPage(page);
}
if (page <= 0) {
page = 1;
pageBean.setPage(page);
}
如果当页码小于等于0并且是负数,那么就把当前页设置为第一页
// 如果当页码小于等于0并且是负数,那么就把当前页设置为第一页
if (page <= 0) {
page = 1;
pageBean.setPage(page);
}
如果页码为非数字,使用数据校验及类型转换器(我这是数校验并跳转到提示页面)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="page">
<field-validator type="conversion">
<message key="你输入的是无效的页码" />
</field-validator>
</field>
</validators>
完整代码
实体:
package cn.dental.domain;
/**
* 用户实体类
*
* @author 吕小刚
* @version V1.0
*/
public class User {
private Long id;//编号,统一long类型
private String name;//姓名
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
分页实体:
package cn.dental.utils;
import java.util.ArrayList;
import java.util.List;
/**
* 分页查询
*
* @author 吕小刚
* @version V1.0
* @param <T>
*/
public class PageBean<T> {
/** 当前页 */
private Integer page;
/** 每页显示/条数 */
private Integer limit;
/** 总页数 */
private Integer totalPage;
/** 总记录数 */
private Long totalCount;
/** 分页查询集合数据 */
private List<T> pageList = new ArrayList<T>();
// =============== getXxx()/setXxx()
/**
* 获取:当前页
*/
public Integer getPage() {
return page;
}
/** 设置:当前页 */
public void setPage(Integer page) {
this.page = page;
}
/** 获取:每页显示/条数 */
public Integer getLimit() {
return limit;
}
/** 设置:每页显示/条数 */
public void setLimit(Integer limit) {
this.limit = limit;
}
/** 获取:总页数 */
public Integer getTotalPage() {
return totalPage;
}
/** 设置:总页数 */
public void setTotalPage(Integer totalPage) {
this.totalPage = totalPage;
}
/** 获取:总记录数 */
public Long getTotalCount() {
return totalCount;
}
/** 设置:总记录数 */
public void setTotalCount(Long totalCount) {
this.totalCount = totalCount;
}
/** 获取:分页查询集合数据 */
public List<T> getPageList() {
return pageList;
}
/** 设置:分页查询集合数据 */
public void setPageList(List<T> pageList) {
this.pageList = pageList;
}
}
Dao层
package cn.dental.dao;
import java.util.List;
import cn.dental.domain.User;
/**
* User持久层接口
*
* @author 吕小刚
* @version V1.0
*/
public interface UserDao {
/**
* 查询所有用户信息
*
* @return 返回用户
*/
public List<User> findAll();
/**
* 分页查询
*
* @param page
* 页码(当前页)
* @param limit
* 每页显示条数
* @return 返回分页查询出来的数据
*/
public List<User> findAll(Integer page, Integer limit);
/** 查询总记录数 */
public Long findCount();
}
package cn.dental.dao.impl;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Repository;
import cn.dental.dao.UserDao;
import cn.dental.domain.User;
/**
* User持久层实现类
*
* @author 吕小刚
* @version V1.0
*/
@Repository("userDaoImpl")
@SuppressWarnings("unchecked")
public class UserDaoImpl implements UserDao {
@Resource
private SessionFactory sessionFactory;
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
public List<User> findAll() {
return getSession().createQuery("from User u").list();
}
public List<User> findAll(Integer page, Integer limit) {
if (page == null) {
return null;
}
List<User> list = getSession().createQuery(//
"from User u")//
.setFirstResult(page)//
.setMaxResults(limit)//
.list();
if (list != null && list.size() > 0) {
return list;
}
return null;
}
public Long findCount() {
Long count = (Long) getSession().createQuery(//
"select count(u) from User u")//
.uniqueResult();
if (count != null) {
return count;
}
return null;
}
}
Service层
package cn.dental.service;
import java.util.List;
import cn.dental.domain.User;
import cn.dental.utils.PageBean;
/**
* User服务层接口
*
* @author 吕小刚
* @version V1.0
*/
public interface UserService {
/** 查询所有用户信息 */
public List<User> findAll();
/**
* * 分页查询
*
* @param page
* 页码(当前页)
* @param limit
* 每页显示条数
* @return 返回分页查询出来的数据集合
*/
public PageBean<User> findAll(Integer page);
}
Action层
package cn.dental.action;
import javax.annotation.Resource;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import cn.dental.domain.User;
import cn.dental.service.UserService;
import cn.dental.utils.PageBean;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* User的Action类
*
* @author 吕小刚
* @version V1.0
*
*/
@SuppressWarnings("serial")
@Controller("userAction")
@Scope("prototype")
public class UserAction extends ActionSupport implements ModelDriven<User> {
// =================== Service实例
@Resource
private UserService userService;
// =================== 创建模型驱动对象
private User model = new User();
private int page;// 接收页码
public User getModel() {
return model;
}
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
// =================== Action处理方法
/** 查询所有信息 */
public String findAll() {
// List<User> userList = userService.findAll();
PageBean<User> pageBeanUser = userService.findAll(page);
// ActionContext.getContext().getValueStack().set("userList", userList);
ActionContext.getContext().getValueStack().set("pageBeanUser", pageBeanUser);
return "findAll";
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="page">
<field-validator type="conversion">
<message key="你输入的是无效的页码" />
</field-validator>
</field>
</validators>
jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<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">
</head>
<body>
<div align="center">
<table border="1">
<tr>
<td>编号</td>
<td>姓名</td>
</tr>
<s:iterator var="pageBeanUserList" value="pageBeanUser.pageList">
<tr>
<td><s:property value="#pageBeanUserList.id" />
</td>
<td><s:property value="#pageBeanUserList.name" /></td>
</tr>
</s:iterator>
</table>
<p>
第
<s:property value="pageBeanUser.page" />
/共
<s:property value="pageBeanUser.totalPage" />
页
</p>
<form action="user_findAll.action?page=${page}" enctype="multipart/form-data" method="post">
<input type="text" name="page" value="">
<input type="submit" value="添加"/>
</form>
</div>
</body>
</html>
<%@page import="com.opensymphony.xwork2.ActionContext"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<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">
</head>
<body>
<h1>错误</h1>
<!-- 数据校验提示 -->
<s:fielderror fieldName="page"/>
</body>
</html>