- 浏览: 39171 次
- 性别:
- 来自: 北京
最新评论
-
on-the-way:
很精辟啊
最近仔细研究了一下Java的NIO以及线程并发,搞清了点思路,特作笔记如下(NIO篇) -
wdlfellow:
现在需要在项目中做单元测试了,学习mock中。。。
junit 中的mock 使用摘记
我的方法是,根据用户点击导航条上的页号(offset),到DB中读取该页的数据(不是一次全部读出),点到哪页读哪页的数据,JBX + tomcat + oracle下测试通过,数据库用的表是oracle的emp表。
********分页类Pager.java,负责生成分页导航条********
package page;
/**
* 分页代码
* <p>Title: 分页</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: BCS</p>
* @author Alex
* @version 1.0
*/
public class Pager {
private int offset;
private int size;
private int length;
private String url;
private String pageHeader;
public Pager(int offset, int size, int length, String url, String pageHeader) {
this.offset = offset;
this.size = size;
this.length = length;
this.url = url;
this.pageHeader = pageHeader;
}
/**
* 返回分页导航条
* @param offset int 起始记录的位置
* @param size int 总记录数
* @param length int 步长
* @param url String .do的url
* @param pageHeader String 导航条的前缀文字提示
* @return String
*/
public String getPageNavigation() {
String pageNavigation = ""; //最终返回的分页导航条
//记录数超过一页,需要分页
if (size > length) {
String pref; //前缀
if (url.indexOf("?") > -1) {
//如果url中已经包含了其他的参数,就把offset参数接在后面
pref = "&";
}
else {
//如果url中没有别的参数
pref = "?";
}
//如果导航条包含header
if (pageHeader != null && pageHeader.length() > 0) {
pageNavigation = pageHeader + " : ";
}
//如果不是第一页,导航条将包含“<<”(第一页)和“<”(前一页)
if (offset > 0) {
pageNavigation += "<a href='" + url + pref + "offset=0'>[<<]</a>\n" +
"<a href='" + url + pref + "offset=" + (offset - length) +
"'>[<]</a>\n";
}
//导航条中,排头的那一页的offset值
int startOffset;
//位于导航条中间的那一页的offset值(半径)
int radius = constants.MAX_PAGE_INDEX / 2 * length;
//如果当前的offset值小于半径
if (offset < radius || this.pageCount() <= constants.MAX_PAGE_INDEX) {
//那么第一页排头
startOffset = 0;
}
else if (offset < size - radius) {
startOffset = offset - radius;
}
else {
startOffset = (size / length - constants.MAX_PAGE_INDEX) * length;
}
for (int i = startOffset;
i < size && i < startOffset + constants.MAX_PAGE_INDEX * length;
i += length) {
if (i == offset) {
//当前页号,加粗显示
pageNavigation += "<b>" + (i / length + 1) + "</b>\n";
}
else {
//其他页号,包含超链接
pageNavigation += "<a href='" + url + pref + "offset=" + i + "'>" +
(i / length + 1) + "</a>\n";
}
}
//如果不是最后一页,导航条将包含“>”(下一页)和“>>”(最后一页)
if (offset < size - length) {
pageNavigation += "<a href='" + url + pref + "offset=" +
(offset + length) + "'>[>]</a>\n" +
"<a href='" + url + pref + "offset=" + lastPageOffset() +
"'>[>>]</a>\n";
}
// System.out.println("radius : " + radius);
// System.out.println("start offset : " + startOffset);
return pageNavigation;
}
//记录不超过一页,不需要分页
else {
return "";
}
}
/**
* 返回分页后的总页数
* @param size int 总记录数
* @param length int 每页的记录数
* @return int
*/
public int pageCount() {
int pagecount = 0;
if (size % length == 0) {
pagecount = size / length;
}
else {
pagecount = size / length + 1;
}
return pagecount;
}
/**
* 返回最后一页的记录数
* @param size int 总记录数
* @param length int 每页的记录数
* @return int
*/
public int lastPageSize() {
int lastpagesize = 0;
if (size % length == 0) {
lastpagesize = length;
}
else {
lastpagesize = size % length;
}
return lastpagesize;
}
/**
* 返回最后一页的起始记录位置
* @param size int 总记录数
* @param length int 每页的记录数
* @return int
*/
public int lastPageOffset() {
return size - lastPageSize();
}
public int getOffset() {
return offset;
}
public void setOffset(int offset) {
this.offset = offset;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getPageHeader() {
return pageHeader;
}
public void setPageHeader(String pageHeader) {
this.pageHeader = pageHeader;
}
}
********数据处理类empDAO.java,负责访问DB,获取当前页面需要显示的记录********
package page;
import java.sql.*;
import java.util.*;
public class empDAO {
public empDAO() {
}
/**
* 从offset位置起始,返回length条记录
* @param offset int 起始的记录位置
* @param length int 步长
* @param conn Connection 数据库连接
* @return ArrayList
*/
public ArrayList findAllEmp(int offset, int length, Connection conn) throws
SQLException {
PreparedStatement ps = null;
ResultSet rs = null;
ArrayList emps = new ArrayList();
empVO empvo = null;
String strSql = "select empno, ename from emp where rowid not in (select rowid from emp where rownum <= ?) and rownum <= ?";
try {
ps = conn.prepareStatement(strSql);
ps.setInt(1, offset); //起始记录的位置
ps.setInt(2, length); //步长
rs = ps.executeQuery();
while (rs != null && rs.next()) {
empvo = new empVO();
empvo.setEmpno(rs.getInt("empno"));
empvo.setEname(rs.getString("ename"));
emps.add(empvo);
}
}
catch (SQLException ex) {
ex.printStackTrace();
throw ex;
}
return emps;
}
/**
* 返回总的记录数
* @param conn Connection
* @throws SQLException
* @return int
*/
public int getRsTotalCount(Connection conn) throws SQLException {
PreparedStatement ps = null;
ResultSet rs = null;
int rsCount = 0;
String strSql = "select count(empno) as empCount from emp";
try {
ps = conn.prepareStatement(strSql);
rs = ps.executeQuery();
if (rs != null && rs.next()) {
rsCount = rs.getInt("empCount");
}
}
catch (SQLException ex) {
ex.printStackTrace();
throw ex;
}
return rsCount;
}
}
********业务类empBO.java,调用empDAO类********
package page;
import java.util.*;
/**
* BO类
* <p>Title: 分页</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: BCS</p>
* @author Alex
* @version 1.0
*/
public class empBO {
private DBPool db = DBPool.newInstance();
private empDAO empdao = new empDAO();
public empBO() {
}
/**
* 从offset位置起始,返回length条记录
* @param offset int 起始
* @param length int 步长
* @throws Exception
* @return ArrayList
*/
public ArrayList findAllEmp(int offset, int length) throws Exception {
ArrayList emps = new ArrayList();
try {
emps = empdao.findAllEmp(offset, length, db.getConnection());
}
catch (Exception ex) {
throw ex;
}
finally {
db.release();
}
return emps;
}
/**
* 返回总的记录数
* @throws Exception
* @return int
*/
public int getRsTotalCount() throws Exception {
int rsCount = 0;
try {
rsCount = empdao.getRsTotalCount(db.getConnection());
}
catch (Exception ex) {
throw ex;
}
finally {
db.release();
}
return rsCount;
}
}
********ActionForm类empForm.java********
package page;
import javax.servlet.http.*;
import org.apache.struts.action.*;
public class empForm
extends ActionForm {
private int offset; //起始记录的位置//每页显示的记录数
public ActionErrors validate(ActionMapping actionMapping,
HttpServletRequest httpServletRequest) {
/**@todo: finish this method, this is just the skeleton.*/
return null;
}
public void reset(ActionMapping actionMapping,
HttpServletRequest httpServletRequest) {
this.offset = 0; //记录默认从第一条开始显示
}
public int getOffset() {
return offset;
}
public void setOffset(int offset) {
this.offset = offset;
}
}
********Action类empAction.java,控制器,调用BO类,Pager类********
package page;
import java.util.*;
import javax.servlet.http.*;
import org.apache.struts.action.*;
/**
* 分页测试的Action
* <p>Title: 分页</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: BCS</p>
* @author Alex
* @version 1.0
*/
public class empAction
extends Action {
public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
empForm empform = (empForm) actionForm;
return performList(actionMapping, actionForm, httpServletRequest,
httpServletResponse);
}
private ActionForward performList(ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest request,
HttpServletResponse response) {
try {
empBO empbo = new empBO();
//获取外部传进来的起始记录号
int offset = ( (empForm) actionForm).getOffset();
//获取每页的记录数
int pagesize = constants.PAGE_SIZE;
//获取记录集合,从offset开始,取length条记录
ArrayList emps = empbo.findAllEmp(offset, pagesize);
//计算所有记录的条数(总记录数)
int size = empbo.getRsTotalCount();
//外部url地址,得到形如: http://localhost:8088/bugMIS/showlist.do 的String
String url = request.getContextPath() + actionMapping.getPath() + ".do";
//实例化分页类
Pager p = new Pager(offset, size, pagesize, url, "Page Navigation");
//获取分页导航条
//String pageNavigation = p.getPageNavigation();
//将url字符串和记录集合,存入request中
request.setAttribute("pager", p);
request.setAttribute("emps", emps);
}
catch (Exception e) {
e.printStackTrace();
return actionMapping.findForward("failure");
}
return actionMapping.findForward("success");
}
}
********数据库连接池类DBPool.java,可以使用tomcat的连接池,也可以不用,这里关闭了********
package page;
import java.sql.*;
import javax.naming.*;
import javax.sql.*;
import org.apache.commons.logging.*;
/**
* 系统连接池类
* <p>Title: Gantoo@91.com</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: BCS</p>
* @author Alex
* @version 1.0
*/
public class DBPool {
Log log = LogFactory.getLog("DBPool"); //日志机
private DBPool() {
}
private Connection conn = null;
/* true:使用连接池
false:不使用连接池,采用JDBC直接连接 */
private final static boolean USE_DB_POOL = false;
private final static String jndi_DataSource = "jdbc/BugMIS_ora";
private final static String jdbcdriver =
"oracle.jdbc.driver.OracleDriver";
private final static String url =
"jdbc:oracle:thin:@localhost:1521:myo9";
private final static String user = "scott";
private final static String pass = "tiger";
public static DBPool newInstance() {
return new DBPool();
}
/**
* 切换是否使用连接池
* */
public Connection getConnection() {
if (USE_DB_POOL) {
conn = getConnectionByDBPool();
}
else {
conn = getConnectionDirect();
}
return conn;
}
/**
* 直接采用JDBC连接数据库
* */
private Connection getConnectionDirect() {
try {
Class.forName(jdbcdriver).newInstance();
conn = DriverManager.getConnection(url, user, pass);
}
catch (SQLException ex) {
log.error("Error Connection! " + ex.getMessage());
}
catch (ClassNotFoundException ex) {
log.error("Driver Not Found! " + ex.getMessage());
}
catch (IllegalAccessException ex) {
log.error(ex.getMessage());
}
catch (InstantiationException ex) {
log.error(ex.getMessage());
}
return conn;
}
/**
* 采用连接池
* */
private Connection getConnectionByDBPool() {
try {
Context initCtx = new InitialContext();
Context ctx = (Context) initCtx.lookup("java:/comp/env");
DataSource ds = (DataSource) ctx.lookup(jndi_DataSource);
conn = ds.getConnection();
}
catch (NamingException ex) {
log.error("Data Source Not Found! " + ex.getMessage());
//System.out.println("未找到数据源" + ex.getMessage());
}
catch (SQLException ex1) {
log.error("Error Connection! " + ex1.getMessage());
//System.out.println("错误的数据连接" + ex1.getMessage());
}
return conn;
}
/**
* 释放连接
* */
public void release() {
try {
if (!conn.isClosed()) {
conn.close();
}
}
catch (SQLException ex) {
log.error("Connection Closing Error! " + ex.getMessage());
//System.out.println("连接关闭失败" + ex.getMessage());
}
}
}
********包含常量的类constants.java,常量********
package page;
/**
* 定义工程中公用的常量
* <p>Title: 分页</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: BCS</p>
* @author Alex
* @version 1.0
*/
public final class constants {
public static final int MAX_PAGE_INDEX = 5; //页脚显示多少页
public static final int PAGE_SIZE = 2; //每页的记录数
}
********测试jsp页面index.jsp,为了方便测试,嵌入了java代码,能显示就行********
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ page contentType="text/html; charset=GBK" import="java.util.*,page.*"%>
<html:html>
<head>
<title></title>
<style type="text/css">
.pt9 { font: 10pt "宋体"}
body { font: 10pt "宋体" ; margin: 15px}
td { font-size: 10pt}
a:hover { font-size: 10pt; color: red; text-decoration: underline}
a:link { font-size: 10pt; color: blue; text-decoration: underline}
a:active { font-size: 10pt; color: blue; text-decoration: underline}
a:visited { font-size: 10pt; color: blue; text-decoration: underline }
</style>
</head>
<body bgcolor="#ffffff">
<p><a href="http://localhost:8088/page/showEmp.do?offset=0">Show Me All Of The Emps</a></p>
<logic:present name="emps">
<%
ArrayList emps = (ArrayList)request.getAttribute("emps");
Iterator it = emps.iterator();
empVO empvo;
while(it!=null && it.hasNext()){
empvo = (empVO)it.next();
out.print(empvo.getEmpno() + " ");
out.print(empvo.getEname() + "<br>");
}
out.print("当前页有 " + emps.size() + " 条记录<br>");
out.print("<p>");
%>
</logic:present>
<logic:present name="pager">
<%
Pager pager = (Pager)request.getAttribute("pager");
out.print(pager.getPageNavigation() + "<p>");
out.print("共有记录 " + pager.getSize() + " 条<br>");
out.print("每页有 " + pager.getLength() + " 条记录<br>");
out.print("共分 " + pager.pageCount() + " 页<br>");
%>
</logic:present>
</body>
</html:html>
********配置文件struts-config.xml********
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<form-beans>
<form-bean name="empForm" type="page.empForm" />
</form-beans>
<action-mappings>
<action input="/index.jsp" name="empForm" path="/showEmp" scope="request" type="page.empAction" validate="false">
<forward name="faiure" path="/index.jsp" />
<forward name="success" path="/index.jsp" />
</action>
</action-mappings>
</struts-config>
相关推荐
下面将详细解释如何在一个高效简洁的方式下实现Struts分页。 首先,我们需要理解分页的基本原理。分页通常是通过在数据库中限制查询结果的数量,每次只加载一定数量的数据(称为一页),然后根据用户的交互(如点击...
struts分页实例
在Struts中,通常有一个专门的Action类处理插入操作,接收前端提交的数据,调用模型层的方法进行数据验证和持久化操作,如插入数据库。在JSP页面上,用户填写表单,提交后由Struts框架处理表单数据并调用相应的...
本资源详细介绍了如何在Struts2中自定义分页标签,使得开发过程更加便捷。 在Struts2中,分页通常涉及到以下几个关键步骤: 1. **创建Action类**:首先,你需要创建一个Action类,该类将处理用户的请求,包括获取...
struts分页struts分页struts分页struts分页struts分页struts分页struts分页struts分页struts分页struts分页struts分页struts分页struts分页struts分页struts分页struts分页struts分页struts分页struts分页struts分页
总的来说,Struts分页的优势在于其模块化的设计,通过ActionForm、Action、标签库和拦截器等组件,能够将分页逻辑从业务逻辑中解耦,使代码更易于维护和扩展。同时,其提供的各种功能,如国际化、主题支持和性能优化...
本代码示例专注于Struts中如何实现分页功能。 首先,我们需要了解分页的基本概念。分页是将大量数据分为多个较小的、易于管理的部分,每次只加载一部分数据到客户端。这通常通过两个主要部分实现:前端(用户界面)...
这个“struts分页,数据查询资料”可能包含了如何在Struts框架下实现高效、灵活的分页查询方法。 首先,Struts框架的核心是Action类,它是业务逻辑和视图之间的桥梁。在实现分页功能时,我们需要创建一个Action类,...
通过以上步骤,我们可以构建出一个完整的Struts分页系统。这个过程中,关键是理解Struts的MVC架构以及如何在各层之间传递和处理分页信息。熟练掌握分页技术不仅能够提升用户体验,也有助于优化应用的性能和可维护性...
Struts分页是Java Web开发中的一个重要概念,主要用于在用户界面上展示大量数据时进行有效管理,提升用户体验。Struts框架,由Apache软件基金会开发,是一个用于构建MVC(Model-View-Controller)架构的开源Java框架...
经典Struts2分页方法是Java Web开发者需要掌握的核心技能之一。 分页的实现通常涉及到以下几个关键知识点: 1. **Action类**:在Struts2中,Action类是处理用户请求的中心。为了实现分页,我们需要创建一个包含...
Struts分页是Java Web开发中的一个重要概念,它在处理大量数据展示时尤为关键,能够有效地提高用户体验。Struts框架,作为一个MVC(Model-View-Controller)模型的开源Java库,提供了对分页功能的良好支持。在这个...
在Ajax+Struts分页中,主要涉及以下几个步骤: 1. **前端页面**:使用JavaScript和HTML构建用户界面。当用户点击分页链接时,会触发Ajax请求,而不是传统的页面跳转。 2. **Ajax请求**:通常使用JavaScript库如...
### Struts2分页方法详解 #### 知识点一:Struts2框架与分页概念 Struts2是Apache软件基金会的一个开源Web应用框架,它继承了Struts1的优点并改进了许多不足之处,提供了更丰富的插件和标签库,支持拦截器、结果...
在Action类中,我们需要处理来自用户的请求参数,如当前页码和每页显示记录数等,并调用DAO中的分页查询方法获取数据。然后将这些数据传递给视图层进行展示。 #### 示例代码分析 下面是一个简化的示例代码片段,...
Struts分页算法是Java Web开发中常用的一种技术,它主要用于处理大数据集合的展示,提高网页的加载速度和用户体验。在Struts框架下,我们通常会结合Servlet、JSP和数据库查询来实现分页功能。以下将详细讲解Struts...
用Struts2+mysql实现的简单信息录入,分页查询
在探讨Struts2框架下的增删改查以及分页查询功能时,我们首先需要理解Struts2框架本身。Struts2是Apache软件基金会的一个开源Web应用框架,它继承了Struts1的一些特性,并在此基础上进行了大量的改进和扩展,提供了...
这里我们将深入探讨“分页大全”,包括JDBC分页、Struts分页以及分页标签的使用。 首先,让我们了解什么是分页。在网页或应用中,分页是指将大量数据分割成若干小部分,每次只加载一部分,用户可以逐页浏览,而不是...