- 浏览: 66530 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
sdylag:
0.double result = 6.0 / 83; //r ...
java对double型数字进行四舍五入 -
dyuan:
楼主,你好,能不能把ICTCLAS30.so这个库发给我呢,我 ...
ictclas linux开发注意事项 -
night_stalker:
lz 注定要杯具的,下面跑跑题:A话说,Ruby 1.9.2 ...
排列组合算法实现【学习】 -
yangtao309:
请看懂算法了的 给个留言好伐
不要看到标题 就投新手贴
只是希 ...
排列组合算法实现【学习】 -
downpour:
yangtao309 写道个人认为没有最好的方法来处理好主干与 ...
subversion 主干和分支 合并问题
J2EE开发中少不了要用到分页的。在持久层Hibernate中已支持了原生的分页查找记录。为了便于开发高效的进行。现将开发中用到的记录下来。一起讨论讨论
方法一:
页面分页用标签的形式
页面标签处理
以上没加上 样式,有些丑陋
定义了分页标签,肯定得需要定义标签
核心的处理分页记录的类
Page类操作
具体的ACTION应用和页面加载
页面部分加载
第一种方式即可实现分页
第二种方式是差不多的,只是没用到自定义的标签
Page帮助类
PaginationUtils类
具体应用上的
jsp页面直接用struts2的标签输出即可
方法一:
页面分页用标签的形式
页面标签处理
public class PageControllerTag extends BodyTagSupport { private String gotoUrl; private static final int DEFAULTPAGESIZE = Integer.parseInt(Constants.PAGE_DEFAULT_LIMIT); public static final String TOTAL = "total"; private static final String PAGE_NO = "pageNo"; private static final String RECORD_COUNT = "pageSize"; @SuppressWarnings("unchecked") @Override public int doStartTag() throws JspException { int pageNo = 1; int total = 0; int totalPage = 1; HttpServletRequest request = (HttpServletRequest)pageContext.getRequest(); StringBuffer sb = new StringBuffer(); sb.append("\r\n<form method=\"post\" action=\"\"").append( "name=\"pageController\">\r\n"); Enumeration enumeration = request.getParameterNames(); String name = null; String value = null; while (enumeration.hasMoreElements()) { name = (String) enumeration.nextElement(); value = request.getParameter(name); if (name.equals(RECORD_COUNT)) { continue; } if (name.equals(PAGE_NO)) { if (null != value && !"".equals(value)) { pageNo = Integer.parseInt(value); } continue; } sb.append("<input type=\"hidden\" name=\"").append(name). append("\" value=\"").append(value).append("\"/>\r\n"); } sb.append("<input type='hidden' name=\"").append(PAGE_NO).append( "\" value=\"").append(pageNo).append("\"/>\r\n"); String tot = (String)request.getAttribute(TOTAL); if (null != tot && !"".equals(tot)) { total = Integer.parseInt(tot); } totalPage = getTotalPage(total); sb.append("<br/>\r\n"); sb.append(" \r\n"); sb.append("共").append(totalPage).append("页 当前第"). append(pageNo).append("页\r\n"); sb.append(" \r\n"); if (pageNo == 1) { sb.append("首页"); sb.append(" "); sb.append("上一页\r\n"); } else { sb.append("<a href=\"#\" onclick=\"turnOverPage(1)\">首页</a>\r\n"); sb.append(" "); sb.append("<a href=\"#\" onclick=\"turnOverPage('").append((pageNo - 1)). append("')\">上一页</a>\r\n"); } sb.append(" "); if (pageNo == totalPage) { sb.append("下一页"); sb.append(" "); sb.append("尾页\r\n"); } else { sb.append("<a href=\"#\" onclick=\"turnOverPage("). append((pageNo + 1)).append(")\">下一页</a>\r\n"); sb.append(" "); sb.append("<a href=\"#\" onclick=\"turnOverPage("). append(totalPage).append(")\">尾页</a>\r\n"); } sb.append(" "); sb.append("跳转到<select onChange=\"turnOverPage(this.value)\">\r\n"); for (int i = 1; i <= totalPage; i++) { if (i == pageNo) { sb.append(" <option value=\"").append(i). append("\" selected>第").append(i).append("页</option>\r\n"); } else { sb.append(" <option value=\"").append(i). append("\">第").append(i).append("页</option>\r\n"); } } sb.append("</select>\r\n"); sb.append(" \r\n"); sb.append("</form>\r\n"); sb.append("<script language=\"javascript\">\r\n"); sb.append(" function turnOverPage(no){\r\n"); sb.append(" var form = document.pageController;\r\n"); sb.append(" //页号越界处理\r\n"); sb.append(" if (no").append(">").append(totalPage).append("){\r\n"); sb.append(" no=").append(totalPage).append(";\r\n"); sb.append(" }\r\n"); sb.append(" if (no").append("<=0){\r\n"); sb.append(" no=1;\r\n"); sb.append(" }\r\n"); sb.append(" form.").append(PAGE_NO).append(".value=no;\r\n"); sb.append(" form.action=\"").append(gotoUrl).append("\";\r\n"); sb.append(" form.submit();\r\n"); sb.append(" }\r\n"); sb.append("</script>\r\n"); try { pageContext.getOut().print(sb.toString()); } catch (IOException e) { e.printStackTrace(); } return super.doStartTag(); } public String getGotoUrl() { return gotoUrl; } public void setGotoUrl(String gotoUrl) { this.gotoUrl = gotoUrl; } /** * 根据总记录数得到总页数 * * @return int 总页数 */ private int getTotalPage(int total) { int totalPage = 1; if (total == 0) { totalPage = 1; } else { totalPage = (total % DEFAULTPAGESIZE == 0) ? (total / DEFAULTPAGESIZE) : (total / DEFAULTPAGESIZE + 1); } return totalPage; } }
以上没加上 样式,有些丑陋
定义了分页标签,肯定得需要定义标签
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <tlib-version>1.0</tlib-version> <short-name>pageControllerTag</short-name> <uri>http://code.google.com/samung/tag1.0</uri> <tag> <name>paginator</name> <tag-class>com.chinadim.cpa.core.dao.support.PageControllerTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>gotoUrl</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
核心的处理分页记录的类
/** * 分页查询函数,使用hql. * * @param pageNo 页号,从1开始. */ public Page pagedQuery(String hql, int pageNo, int pageSize, Object... values) { Assert.hasText(hql); Assert.isTrue(pageNo >= 1, "pageNo should start from 1"); int startIndex = Page.getStartOfPage(pageNo, pageSize); return pagedQueryWithStartIndex(hql, startIndex, pageSize, values); } /** * 分页查询函数,使用已设好查询条件与排序的<code>Criteria</code>. * * @param pageNo 页号,从1开始. * @return 含总记录数和当前页数据的Page对象. */ public Page pagedQuery(Criteria criteria, int pageNo, int pageSize) { Assert.notNull(criteria); Assert.isTrue(pageNo >= 1, "pageNo should start from 1"); int startIndex = Page.getStartOfPage(pageNo, pageSize); return pageQueryWithStartIndex(criteria, startIndex, pageSize); } /** * 分页查询函数,使用hql. * * @param pageNo 页号,从1开始. */ public Page pagedQueryWithStartIndex(String hql, int startIndex, int pageSize, Object... values) { Assert.hasText(hql); Assert.isTrue(startIndex >= 0, "pageNo should start from 1"); // Count查询 String countQueryString = " select count (*) " + removeSelect(removeOrders(hql)); List countlist = getHibernateTemplate().find(countQueryString, values); long totalCount = (Long) countlist.get(0); if (totalCount < 1) return new Page(); Query query = createQuery(hql, values); List list = query.setFirstResult(startIndex).setMaxResults(pageSize).list(); return new Page(startIndex, totalCount, pageSize, list); } /** * 分页查询函数,根据查询条件进行查询 使用startIndex作为参数进行查询 * @param criteria * @param start * @param pageSize * @return */ public Page pageQueryWithStartIndex(Criteria criteria, int startIndex, int pageSize){ Assert.notNull(criteria); Assert.isTrue(startIndex >= 0, "start index should start from 1"); CriteriaImpl impl = (CriteriaImpl) criteria; // 先把Projection和OrderBy条件取出来,清空两者来执行Count操作 Projection projection = impl.getProjection(); List<CriteriaImpl.OrderEntry> orderEntries; try { orderEntries = (List) BeanUtils.forceGetProperty(impl, "orderEntries"); BeanUtils.forceSetProperty(impl, "orderEntries", new ArrayList()); } catch (Exception e) { throw new InternalError(" Runtime Exception impossibility throw "); } // 执行查询 int totalCount = (Integer) criteria.setProjection(Projections.rowCount()).uniqueResult(); // 将之前的Projection和OrderBy条件重新设回去 criteria.setProjection(projection); if (projection == null) { criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); } try { BeanUtils.forceSetProperty(impl, "orderEntries", orderEntries); } catch (Exception e) { throw new InternalError(" Runtime Exception impossibility throw "); } // 返回分页对象 if (totalCount < 1) return new Page(); List list = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list(); return new Page(startIndex, totalCount, pageSize, list); } /** * 分页查询函数,根据entityClass和查询条件参数创建默认的<code>Criteria</code>. * * @param pageNo 页号,从1开始. * @return 含总记录数和当前页数据的Page对象. */ public Page pagedQuery(Class entityClass, int pageNo, int pageSize, Criterion... criterions) { Criteria criteria = createCriteria(entityClass, criterions); return pagedQuery(criteria, pageNo, pageSize); } /** * 分页查询函数,根据entityClass和查询条件参数,排序参数创建默认的<code>Criteria</code>. * * @param pageNo 页号,从1开始. * @return 含总记录数和当前页数据的Page对象. */ public Page pagedQuery(Class entityClass, int pageNo, int pageSize, String orderBy, boolean isAsc, Criterion... criterions) { Criteria criteria = createCriteria(entityClass, orderBy, isAsc, criterions); return pagedQuery(criteria, pageNo, pageSize); }
Page类操作
public class Page implements Serializable { private static final long serialVersionUID = 1L; private static final int DEFAULT_PAGE_SIZE = Integer.parseInt(Constants.PAGE_DEFAULT_LIMIT); private int pageSize = DEFAULT_PAGE_SIZE; // 每页的记录数 private long start; // 当前页第一条数据在List中的位置,从0开始 private Object data; // 当前页中存放的记录,类型一般为List private long totalCount; // 总记录数 /** * 构造方法,只构造空页. */ public Page() { this(0, 0, DEFAULT_PAGE_SIZE, new ArrayList()); } /** * 默认构造方法. * * @param start 本页数据在数据库中的起始位置 * @param totalSize 数据库中总记录条数 * @param pageSize 本页容量 * @param data 本页包含的数据 */ public Page(long start, long totalSize, int pageSize, Object data) { this.pageSize = pageSize; this.start = start; this.totalCount = totalSize; this.data = data; } /** * 取总记录数. */ public long getTotalCount() { return this.totalCount; } /** * 取总页数. */ public long getTotalPageCount() { if (totalCount % pageSize == 0) return totalCount / pageSize; else return totalCount / pageSize + 1; } /** * 取每页数据容量. */ public int getPageSize() { return pageSize; } /** * 取当前页中的记录. */ public Object getResult() { return data; } /** * 取该页当前页码,页码从1开始. */ public long getCurrentPageNo() { return start / pageSize + 1; } /** * 该页是否有下一页. */ public boolean hasNextPage() { return this.getCurrentPageNo() < this.getTotalPageCount() - 1; } /** * 该页是否有上一页. */ public boolean hasPreviousPage() { return this.getCurrentPageNo() > 1; } /** * 获取任一页第一条数据在数据集的位置,每页条数使用默认值. * * @see #getStartOfPage(int,int) */ protected static int getStartOfPage(int pageNo) { return getStartOfPage(pageNo, DEFAULT_PAGE_SIZE); } /** * 获取任一页第一条数据在数据集的位置. * * @param pageNo 从1开始的页号 * @param pageSize 每页记录条数 * @return 该页第一条数据 */ public static int getStartOfPage(int pageNo, int pageSize) { return (pageNo - 1) * pageSize; } }
具体的ACTION应用和页面加载
private String pageNo = "1"; private String total = "0"; public String getTotal() { return total; } public void setTotal(String total) { this.total = total; } public String getPageNo() { return pageNo; } public void setPageNo(String pageNo) { this.pageNo = pageNo; } @SuppressWarnings("unchecked") public String showJspTagList() throws Exception { Page page = cpaInfoTestManager.findPaginatorByAllConditions( Integer.parseInt(pageNo), Integer.parseInt(Constants.PAGE_DEFAULT_LIMIT)); total = String.valueOf(page.getTotalCount()); cpaInfoTestList = (List<CpaInfoTest>)page.getResult(); return SUCCESS; }
页面部分加载
<%@ taglib uri="http://code.google.com/samung/tag1.0" prefix="myTag" %> <myTag:paginator gotoUrl="${pageContext.request.contextPath}/cpatest/showJspTagList.action"></myTag:paginator>
第一种方式即可实现分页
第二种方式是差不多的,只是没用到自定义的标签
@SuppressWarnings("unchecked") public class Page { public static final int DEFAULT_PAGE_SIZE = 20; public static final int DEFAULT_PAGE = 1; private String url; private int currentPage = 1; private int pageSize = DEFAULT_PAGE_SIZE; private long totalCount = -1; private long totalPage; private List data; public Page() { super(); } public Page(int currentPage) { this.currentPage = currentPage; } public Page(int currentPage, int pageSize) { this.currentPage = currentPage; this.pageSize = pageSize; } public int getStart() { return (getCurrentPage() - 1) * pageSize; } public int getCurrentPage() { if (currentPage > getTotalPage()) { return (int) getTotalPage(); } else if (currentPage < 1) { return 1; } else { return currentPage; } } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public List getData() { return data; } public void setData(List data) { this.data = data; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public long getTotalCount() { return totalCount; } public void setTotalCount(long totalCount) { this.totalCount = totalCount; } public long getTotalPage() { if (totalCount % pageSize == 0) { totalPage = totalCount / pageSize; return totalPage; } else { totalPage = totalCount / pageSize + 1; return totalPage; } } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } }
Page帮助类
public class PageHelper { public static Page getPageFromRequest(HttpServletRequest request) { return getPageFromRequest(request, 0); } public static Page getPageFromRequest(HttpServletRequest request, int pageSize) { Page page = new Page(); int currentPage = 1; StringBuffer querySb = new StringBuffer(); Map paramMap = request.getParameterMap(); for (Iterator it = paramMap.keySet().iterator(); it.hasNext();) { String key = (String) it.next(); if (key.equals("page")) { String[] values = (String[]) paramMap.get(key); String str = values[0]; if (str.equals("")) continue; try { currentPage = Integer.parseInt(str); } catch (Exception e) { currentPage = Page.DEFAULT_PAGE; } continue; } String[] values = (String[]) paramMap.get(key); if (key.equals("pageSize")) { String str = values[0]; try { pageSize = Integer.parseInt(str); } catch (Exception e) { } } for (int i = 0; i < values.length; i++) { try { querySb.append("&" + key + "=" + URLEncoder.encode(values[i], "GBK")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } if (querySb.length() != 0) { querySb.setCharAt(0, '?'); querySb.append('&'); } else { querySb.append('?'); } page.setCurrentPage(currentPage); if (pageSize != 0) page.setPageSize(pageSize); page.setUrl(request.getRequestURL().append(querySb).toString()); return page; } }
PaginationUtils类
public class PaginationUtils { private static DateFormat FMT = new SimpleDateFormat("yyyy-MM-dd hh:mm"); public static String notNull(Object value, String out) { return value == null ? out : value.toString(); } public static String notNull(Object value) { return notNull(value, ""); } public static String notZero(int value, String out) { return value == 0 ? out : String.valueOf(value); } public static String notZero(int value) { return notZero(value, ""); } public static String formatDate(Calendar date) { return FMT.format(date.getTime()); } public static String createPageNavigator(Page page) { // 第?页 共?页上一页下一页 跳转到? StringBuffer sb = new StringBuffer(); sb.append("<span>").append("第 ").append(page.getCurrentPage()) .append(" 页 ").append("共 ").append( page.getTotalPage()).append(" 页 ").append( "共 ").append(page.getTotalCount()).append( " 条 "); if (page.getCurrentPage() > 1) { sb.append("<a href=\"").append(page.getUrl()).append("page=") .append(1).append("\">首页</a> "); sb.append("<a href=\"").append(page.getUrl()).append("page=") .append(page.getCurrentPage() - 1).append( "\">上一页</a> "); } if (page.getCurrentPage() < page.getTotalPage()) { sb.append("<a href=\"").append(page.getUrl()).append("page=") .append(page.getCurrentPage() + 1).append( "\">下一页</a> "); sb.append("<a href=\"").append(page.getUrl()).append("page=") .append(page.getTotalPage()).append("\">末页</a> "); } sb.append("</span>"); return sb.toString(); } public static void main(String[] args) { } }
具体应用上的
private Page pageList; @SuppressWarnings("unchecked") public String cpaAccountList() throws Exception { //填充到map对象,用于页面取 cpaUserKeyMap.clear(); cpaUserKeyMap.putAll(fillCpaUserKey()); pageList = PageHelper.getPageFromRequest(getRequest()); pageList = cpaAccountManager.fetchAllCpaAccountList(cpaAccount, pageList); return SUCCESS; }
jsp页面直接用struts2的标签输出即可
<ww:text name="%{@com.chinadim.cpa.utils.PaginationUtils@createPageNavigator(pageList)}"/>
发表评论
-
各种排序算法实现
2011-03-06 11:48 1468排序就是将一组杂乱无章的数据按一定的规律排列起来(递增或递减) ... -
排列组合算法实现【学习】
2010-08-16 11:56 1861一个从M个数字里面取N个数字的组合 没用到递归的实现,将选取的 ... -
ictclas linux开发注意事项
2010-01-08 14:04 2529ictclas linux开发注意事项 在windows上开发 ... -
Java使用Memcached
2009-09-11 13:30 936转载http://space.itpub.net/583467 ... -
web开发中公用组件的开发之一---------DateUtils
2009-07-24 11:39 922web开发中公用组件的开发之一---------DateUti ... -
java操作Oracle存储过程,以及生成Excel报表
2009-06-26 14:55 4520引子 在企业应用系统中,经常会要要求生成报表。 偶 ... -
ArrayList和LinkedList的用法区别
2009-06-16 16:54 15101.ArrayList是实现了基于动态数组的数据结构,Link ... -
struts2 token令牌
2009-06-11 10:34 1858为了 防止F5刷性重复提 ... -
一个不常见的异常或错误
2009-05-27 14:35 1075在eclipse控制台打印如下信息, JDK1.5 TOMCA ... -
在postgreSQL数据库上 SSH应用开发bug记录
2009-04-11 12:23 1059前言 : 把之前开发好的项目从oracle数据库移植 ... -
i++循环与i--循环的执行效率
2009-03-17 14:36 766转载时请注明出处和作者联系方式 文章出处:http://www ... -
多线程设计要点
2009-01-04 09:36 8561.多线程中有主内存和工作内存之分, 在JVM中,有一个主内存 ... -
使用模板模式简化DAO操作Hibernate
2008-12-25 11:24 900相信使用过Spring + Hibernate开发过的人,在写 ... -
选用ibatis和hibernate的区别
2008-12-25 10:29 2172Hibernate简介 Hibernate是一个开放源代码的对 ... -
java性能优化,从细节说起
2008-12-23 14:06 964一、避免在循环条件中 ...
相关推荐
J2EE开发环境搭建资源摘要 J2EE开发环境搭建是指创建一个完整的J2EE开发环境,包括安装JDK、Tomcat和Eclipse。下面将详细介绍J2EE开发环境搭建的过程。 一、JDK的环境变量设置 JDK是Java开发的基础环境,安装JDK...
《J2EE开发全程实录》是一本深入探讨J2EE平台开发的实践性书籍,旨在为读者提供全面、详尽的J2EE应用程序开发经验。J2EE(Java 2 Platform, Enterprise Edition)是Oracle公司提供的一个用于构建企业级分布式应用的...
4. **服务**:J2EE提供一系列服务,如事务管理、安全性、消息传递、目录服务等,这些服务可以被应用组件利用,简化开发工作。 5. **部署描述符**:XML格式的部署描述符文件用于配置应用组件,定义它们的属性、依赖...
J2EE开发手册和帮助文档是开发者在学习和实践J2EE技术时的重要参考资料,它们涵盖了J2EE的各个方面,旨在帮助开发者理解和掌握J2EE的架构、组件、设计模式以及开发流程。 **1. J2EE核心概念** - **容器**:J2EE平台...
在IT行业中,J2EE(Java 2 Platform, Enterprise Edition)是用于构建企业级应用程序的框架,它由Oracle公司提供并被广泛应用于大型分布式系统、Web应用和后端服务的开发。本实录将深入探讨J2EE开发的全过程,包括但...
J2EE开发全程实录 源码 part7 J2EE 开发 源码 part7 书名:J2EE开发全程实录; 作者:杨中科主编; 来源:清华大学出版社
### 快速搭建J2EE开发环境:JDK1.5+Tomcat5.5+MyEclipse 5.5 #### 一、JDK安装与环境...这对于初学者而言,是一个良好的起点,有助于快速上手J2EE开发流程,熟悉各组件间的协作关系,为进一步深入学习打下坚实的基础。
《J2EE专业项目实例开发》是一份涵盖了广泛J2EE技术应用的资源包,旨在为开发者提供实际项目开发中的经验和技巧。这份资料的核心价值在于它通过实例来讲解J2EE平台上的各种技术和最佳实践,使得学习者能够深入理解并...
j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发经验分享j2ee开发...
描述中提到的"一个简单的j2ee开发框架"可能是指一个轻量级的实现,它并不包含所有J2EE组件,而是专注于基础功能,如MVC(Model-View-Controller)设计模式、数据访问层、安全管理和会话管理等。这种框架通常易于理解...
《深入解析J2EE开发架构:从宏观到微观的全面剖析》 J2EE,即Java 2 Platform, Enterprise Edition,是Sun Microsystems公司为大型企业级应用开发而设计的平台,其核心价值在于提供了一套标准,使得开发者能够构建...
在IT领域,特别是软件开发行业中,Java 2 Platform, Enterprise Edition(简称J2EE)是一个极为...通过学习本书,开发者可以更好地理解和应用J2EE的各种组件和服务,从而提升其在复杂企业项目中的开发效率和代码质量。
6. **学习价值**:对于J2EE初学者来说,这个案例提供了一个完整的开发流程实例,涵盖了从前端到后端的主要技术,有助于理解J2EE组件间的协同工作方式,加深对J2EE架构的理解,为实际项目开发打下坚实的基础。...
总结来说,J2EE规范和EJB组件模型为企业级应用开发提供了强大的工具集和标准架构,确保了跨平台的兼容性、高效开发和可靠的系统性能。通过理解并熟练运用这些知识,开发者可以构建出满足大规模企业需求的复杂应用。
总结来说,J2EE单点登录组件通过整合认证中心、票据机制、会话共享和过滤器,实现了跨系统的一次性登录体验。在实际开发中,需要结合具体业务需求,确保安全性和易用性,同时考虑扩展性和可维护性。对源码的深入理解...
J2EE开发全程实录随书光盘,共6个文件(没办法,20M限制),第二部分 J2EE是目前企业级软件开发的首选平台。本书从架构的角度讲解了一个完整的J2EE系统的搭建。内容包括:正则表达式、JSP、Swing、XML等技术在实际中...
J2EE开发全程实录 源码 part1 <br>书名:J2EE开发全程实录; 作者:杨中科主编; 来源:清华大学出版社
"j2EE开发jar包大全"这个资源集合了用于j2EE开发的各种关键jar包,涵盖了从数据库连接到SSH(Spring、Struts和Hibernate)框架的常用组件。 首先,我们来看看数据库连接相关的jar包。在j2EE中,通常使用JDBC(Java ...