`
yangtao309
  • 浏览: 66488 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

J2EE开发中分页组件总结

阅读更多
J2EE开发中少不了要用到分页的。在持久层Hibernate中已支持了原生的分页查找记录。为了便于开发高效的进行。现将开发中用到的记录下来。一起讨论讨论

方法一:
页面分页用标签的形式

页面标签处理
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("&nbsp;\r\n");
		sb.append("共").append(totalPage).append("页&nbsp;&nbsp;当前第").
			append(pageNo).append("页\r\n");
		sb.append("&nbsp;\r\n");
		
		if (pageNo == 1) {
			sb.append("首页");
			sb.append("&nbsp;");
			sb.append("上一页\r\n");
		} else {
			sb.append("<a href=\"#\" onclick=\"turnOverPage(1)\">首页</a>\r\n");
			sb.append("&nbsp;");
			sb.append("<a href=\"#\" onclick=\"turnOverPage('").append((pageNo - 1)).
				append("')\">上一页</a>\r\n");
		}
		
		sb.append("&nbsp;");
		if (pageNo == totalPage) {
			sb.append("下一页");
			sb.append("&nbsp;");
			sb.append("尾页\r\n");
		} else {
			sb.append("<a href=\"#\" onclick=\"turnOverPage(").
				append((pageNo + 1)).append(")\">下一页</a>\r\n");
			sb.append("&nbsp;");
			sb.append("<a href=\"#\" onclick=\"turnOverPage(").
				append(totalPage).append(")\">尾页</a>\r\n");
		}
		
		sb.append("&nbsp;");
		
		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("&nbsp;\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("第&nbsp;").append(page.getCurrentPage())
				.append("&nbsp;页&nbsp;").append("共&nbsp;").append(
						page.getTotalPage()).append("&nbsp;页&nbsp;").append(
						"共&nbsp;").append(page.getTotalCount()).append(
						"&nbsp;条&nbsp;");

		if (page.getCurrentPage() > 1) {
			sb.append("<a href=\"").append(page.getUrl()).append("page=")
					.append(1).append("\">首页</a>&nbsp;");
			sb.append("<a href=\"").append(page.getUrl()).append("page=")
					.append(page.getCurrentPage() - 1).append(
							"\">上一页</a>&nbsp;");
		}

		if (page.getCurrentPage() < page.getTotalPage()) {
			sb.append("<a href=\"").append(page.getUrl()).append("page=")
					.append(page.getCurrentPage() + 1).append(
							"\">下一页</a>&nbsp;");
			sb.append("<a href=\"").append(page.getUrl()).append("page=")
					.append(page.getTotalPage()).append("\">末页</a>&nbsp;");
		}

		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)}"/>
1
0
分享到:
评论

相关推荐

    J2EE开发环境搭建

    J2EE开发环境搭建资源摘要 J2EE开发环境搭建是指创建一个完整的J2EE开发环境,包括安装JDK、Tomcat和Eclipse。下面将详细介绍J2EE开发环境搭建的过程。 一、JDK的环境变量设置 JDK是Java开发的基础环境,安装JDK...

    J2EE开发全程实录

    《J2EE开发全程实录》是一本深入探讨J2EE平台开发的实践性书籍,旨在为读者提供全面、详尽的J2EE应用程序开发经验。J2EE(Java 2 Platform, Enterprise Edition)是Oracle公司提供的一个用于构建企业级分布式应用的...

    j2ee开发手册.pdf

    4. **服务**:J2EE提供一系列服务,如事务管理、安全性、消息传递、目录服务等,这些服务可以被应用组件利用,简化开发工作。 5. **部署描述符**:XML格式的部署描述符文件用于配置应用组件,定义它们的属性、依赖...

    J2EE开发手册和帮助文档

    J2EE开发手册和帮助文档是开发者在学习和实践J2EE技术时的重要参考资料,它们涵盖了J2EE的各个方面,旨在帮助开发者理解和掌握J2EE的架构、组件、设计模式以及开发流程。 **1. J2EE核心概念** - **容器**:J2EE平台...

    j2ee开发全程的实录

    在IT行业中,J2EE(Java 2 Platform, Enterprise Edition)是用于构建企业级应用程序的框架,它由Oracle公司提供并被广泛应用于大型分布式系统、Web应用和后端服务的开发。本实录将深入探讨J2EE开发的全过程,包括但...

    J2EE开发全程实录 源码 part7

    J2EE开发全程实录 源码 part7 J2EE 开发 源码 part7 书名:J2EE开发全程实录; 作者:杨中科主编; 来源:清华大学出版社

    快速搭建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开发...

    j2ee开发框架

    描述中提到的"一个简单的j2ee开发框架"可能是指一个轻量级的实现,它并不包含所有J2EE组件,而是专注于基础功能,如MVC(Model-View-Controller)设计模式、数据访问层、安全管理和会话管理等。这种框架通常易于理解...

    J2EE开发架构小结.doc

    《深入解析J2EE开发架构:从宏观到微观的全面剖析》 J2EE,即Java 2 Platform, Enterprise Edition,是Sun Microsystems公司为大型企业级应用开发而设计的平台,其核心价值在于提供了一套标准,使得开发者能够构建...

    开发J2EE Web应用

    在IT领域,特别是软件开发行业中,Java 2 Platform, Enterprise Edition(简称J2EE)是一个极为...通过学习本书,开发者可以更好地理解和应用J2EE的各种组件和服务,从而提升其在复杂企业项目中的开发效率和代码质量。

    一个j2ee的开发案例程序

    6. **学习价值**:对于J2EE初学者来说,这个案例提供了一个完整的开发流程实例,涵盖了从前端到后端的主要技术,有助于理解J2EE组件间的协同工作方式,加深对J2EE架构的理解,为实际项目开发打下坚实的基础。...

    第18章 J2EE规范和EJB组件模型.ppt

    总结来说,J2EE规范和EJB组件模型为企业级应用开发提供了强大的工具集和标准架构,确保了跨平台的兼容性、高效开发和可靠的系统性能。通过理解并熟练运用这些知识,开发者可以构建出满足大规模企业需求的复杂应用。

    J2EE单点登录组件源码

    总结来说,J2EE单点登录组件通过整合认证中心、票据机制、会话共享和过滤器,实现了跨系统的一次性登录体验。在实际开发中,需要结合具体业务需求,确保安全性和易用性,同时考虑扩展性和可维护性。对源码的深入理解...

    J2EE开发全程实录附盘2

    J2EE开发全程实录随书光盘,共6个文件(没办法,20M限制),第二部分 J2EE是目前企业级软件开发的首选平台。本书从架构的角度讲解了一个完整的J2EE系统的搭建。内容包括:正则表达式、JSP、Swing、XML等技术在实际中...

    J2EE开发全程实录 源码 part1

    J2EE开发全程实录 源码 part1 &lt;br&gt;书名:J2EE开发全程实录; 作者:杨中科主编; 来源:清华大学出版社

    j2EE开发jar包大全

    "j2EE开发jar包大全"这个资源集合了用于j2EE开发的各种关键jar包,涵盖了从数据库连接到SSH(Spring、Struts和Hibernate)框架的常用组件。 首先,我们来看看数据库连接相关的jar包。在j2EE中,通常使用JDBC(Java ...

Global site tag (gtag.js) - Google Analytics