`

开发者突击的配套Struts2SpringHibernate集成项目学习笔记2

阅读更多
开发者突击SSH2OA项目学习笔记,这里的登陆注册界面和之前学习过的SSH项目

框架相同,这里不再赘述
一、首先我们进入主界面Welcome.jsp,我们看其中的个人通讯录选项
(一)
1.点击个人通讯录选项,请求提交给AddressAction类的init()方法,发现其中

有clearErrorsAndMessages方法,我们查看相应的API,
引用
Clears all errors and

messages. Useful for Continuations and other situations where you

might want to clear parts of the state on the same action.
这个函数对

于同一个Action类的继续使用以及清除该类部分状态是有用的。

(二)
public Pager findPagerByUsername(final String username, final int 

pageSize,
			final int pageNo) {		
		Session session = getHibernateTemplate

().getSessionFactory().openSession();
		
		// set query condition
		Criteria criteria = session.createCriteria

(Address.class);
		criteria.add(Restrictions.eq("username", username));
		
		// get total count
		int rowCount = ((Integer) criteria.setProjection(
				Projections.rowCount()).uniqueResult

()).intValue();
		criteria.setProjection(null);
		
		// get current page list
		int startIndex = pageSize * (pageNo - 1);
		criteria.addOrder(Order.asc("name"));
		criteria.setFirstResult(startIndex);
		criteria.setMaxResults(pageSize);
		List result = criteria.list();
		
		session.close();

		return new Pager(pageSize, pageNo, rowCount, result);
	}
1Criteria是一种更加面向对象的查询语言
2Criteria criteria = session.createCriteria(Address.class)是根据给定的

映射类生成相应的criteria对象。
而criteria.add(Restrictions.eq("username", username))注意是判断

username这个属性名字给定的属性值和username这个变量所代表的值是否相同。

3.
int rowCount = ((Integer) criteria.setProjection(
				Projections.rowCount()).uniqueResult

()).intValue();
criteria.setProjection(null);
注意统计完以后要把条件设为null,方能开始新的查询,否则就带着这个条件继

续查询了。
org.hibernate.criterion.Projections是 Projection 的实例工厂,我们通过调

用setProjection()应用Projections对象进行一个查询. 通过Criteria对象可以

使用setProjection的方法,该方法将进行一个Projections的查询,这里介绍一下

Projections类,我们可以使用org.hibernate.criterion.Projections的avg()

、rowCount()、count()、max()、min()、 countDistinct()等方法,再搭配

Criteria的setProjection()方法加入条件设定,对查询结果进行统计动作,例

如对查询结果的"age"作平均:

Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.avg("age"));
List users = criteria.list();
详见[url]http://www.blogjava.net/jjshcc/archive/2010/08/16/329046.html?

opt=admin[/url]
上面的程式将由Hibernate自动产生SQL的avg函数进行平均计算:

4.
// get current page list这个就是分页的使用方法
int startIndex = pageSize * (pageNo - 1);
criteria.addOrder(Order.asc("name"));//给查询结果加入一个排序顺序
criteria.setFirstResult(startIndex);//定义第一个返回的数据
criteria.setMaxResults(pageSize);//定义最大可以返回的数据
List result = criteria.list();//注意最后返回return new Pager(pageSize, pageNo, rowCount, result);


也就是把这个查询结果当做是result这个参数,来构造一个新的pager
二进入个人通信录页面
(一)点击进入增加联系人界面
1.填写相应的信息,然后提交
,<s:form name="form1" action="addressadd!

insert.do" method="post">
调用AddressAction的insert方法

public String insert() throws Exception {
		// 清除错误消息
		clearErrorsAndMessages();

		// 判断姓名是否已经存在
		boolean b = this.getAddressDAO().isExist

(super.getLoginUsername(), this.getName());
		if (!b) {
			// 插入数据表
			Address address = new Address();
			address.setUsername(super.getLoginUsername());
			address.setName(this.getName());
			address.setSex(this.getSex());
			address.setMobile(this.getMobile());
			address.setEmail(this.getEmail());
			address.setQq(this.getQq());
			address.setCompany(this.getCompany());
			address.setAddress(this.getAddress());
			address.setPostcode(this.getPostcode());
			this.getAddressDAO().insert(address);
		}

		// 取得缓存的分页参数
		Pager pagerSession = (Pager) getSession

(Constants.PAGER_ADDRESS);
		super.pageSize = pagerSession.getPageSize();
		super.pageNo = pagerSession.getPageNo();

		// 查询当前页的数据
		super.pager = this.getAddressDAO

().findPagerByUsername(super
				.getLoginUsername(), super.pageSize, 

super.pageNo);

		if (!b) {
			// 保存成功信息
			saveActionMessage

("address.message.add.success");
			return Constants.LIST_KEY;
		} else {
			// 保存失败信息
			saveActionError("address.message.add.failed");
			return Constants.ADD_KEY;
		}

	}
首先判断名字是否存在,这个和前面的判断类似,这里不再赘述。
(二)显示联系人
1.注意这里的一页显示多少记录数的功能
<s:select name="pageSize" key="pager.pageSize" 

list="pager.pageSizeIndexs" value="pager.pageSize" 

onchange="document.all.pageNo.value='1';document.all.form1.submit

();"/>
这里form1就代表这个可以改变一页中显示联系人数量的表单,其中

onchange = document.all.form1.submit()
代表如果一个下拉菜单中的属性值被

改变,那么我们就提交表单。注意,list="pager.pageSizeIndexs"是必须要有

的属性,用来显示下拉菜单中可供选择的值。
2.
<a href="javascript:document.all.pageNo.value='<s:property 

value="pager.firstPageNo" />';document.all.form1.submit();"><s:text 

name="pager.firstPageNo" /></a>
			<a 

href="javascript:document.all.pageNo.value='<s:property 

value="pager.prePageNo" />';document.all.form1.submit();"><s:text 

name="pager.prePageNo" /></a>
			<a 

href="javascript:document.all.pageNo.value='<s:property 

value="pager.nextPageNo" />';document.all.form1.submit();"><s:text 

name="pager.nextPageNo" /></a>
			<a 

href="javascript:document.all.pageNo.value='<s:property 

value="pager.lastPageNo" />';document.all.form1.submit();"><s:text 

name="pager.lastPageNo" /></a>
<s:select name="pageNo" list="pager.pageNoIndexs" value="pager.pageNo" 

onchange="document.all.form1.submit();"/>
这里的javascript:的前缀意思是告诉浏览器以javascript来解析里面的内容,

而不是以链接来解析这些内容。这句话的意思就是当我们点击这个链接是,其

pageNo就发生变化,而这个变换体现在名为pageNo的下拉菜单中,同时,我们也

可以通过下拉菜单更改显示第几页。
3.return new Pager(pageSize, pageNo, rowCount, result);由于我们把查询

的结果当做是第四个参数构造Pager,所以我们直接使用
<s:iterator value="pager.resultList">来返回联系人,而pager这个属性出现

在AddressAction的父类PagerAction中。
三自定义拦截器

1.这里一定要注意,若<action/>没有引用任何一个拦截器,那么默认的

defaultStack会自动附加到<action/>中
2.如果我们要使用自己的拦截器,那么就要使用手工方式把拦截器加入进来。
:<interceptors>
			<!-- 定义一个包含权限控制的拦截器栈 -->
			<interceptor name="authority"
				

class="com.demo.struts2.common.AuthorizationInterceptor" />

			<!-- 定义一个包含权限控制的拦截器栈 -->
			<interceptor-stack name="mydefault">
				<interceptor-ref name="defaultStack" 

/>
				<interceptor-ref name="authority" />
			</interceptor-stack>
		</interceptors>

		<!-- 定义默认拦截器 -->
		<default-interceptor-ref name="mydefault" />
3.如果我们要实现自定义拦截器,一般继承AbstractInterceptor抽象类
详见http://lib.open-open.com/view/open1337756874027.html其中ActionInvocation 为
引用
An ActionInvocation represents the execution

state of an Action. It holds the Interceptors and the Action instance.

By repeated re-entrant execution of the invoke() method, initially by

the ActionProxy, then by the Interceptors, the Interceptors are all

executed, and then the Action and the Result.
分享到:
评论

相关推荐

    Struts2SpringHibernate框架整合.doc

    Struts2SpringHibernate框架整合是Java Web开发中的经典组合,常用于构建大型的企业级应用。这个框架集成的主要目的是实现MVC(Model-View-Controller)设计模式,提高代码的可维护性和可扩展性。下面将详细阐述每个...

    Struts2SpringHibernate人力资源管理系统.rar

    本文将深入探讨以"Struts2SpringHibernate人力资源管理系统.rar"为例,如何通过这三大框架的集成实现一个高效、稳定的人力资源管理解决方案。 首先,Struts2作为Action层框架,负责处理HTTP请求并调度业务逻辑。它...

    Struts2SpringHibernate实现简单的添加,分页显示功能例子

    在这个"Struts2SpringHibernate实现简单的添加,分页显示功能例子"中,开发者通过整合这三大框架,实现了基本的数据添加功能以及数据的分页显示。以下是对这个例子中的关键知识点的详细解释: 1. **Struts2**:作为...

    传智播客视频struts2springhibernate ppt

    本资源“传智播客视频struts2springhibernate ppt”提供了由知名教育机构传智播客制作的关于这三个框架的培训材料,旨在帮助学习者快速入门并深入理解这些技术。 1. **Struts2**:Struts2是一个基于MVC(Model-View...

    Struts1SpringHibernate实例

    这个"Struts1SpringHibernate实例"很可能是为了展示这三个框架如何协同工作,以实现一个完整的Web应用程序。下面将详细阐述这三个框架的主要功能和结合使用时的关键知识点。 Struts1是一个基于MVC设计模式的开源...

    struts2springhibernate环境搭建教程

    本文将详细介绍如何搭建一个基于Struts2、Spring和Hibernate的集成环境。 首先,我们来看如何进行Struts2与Spring的整合。Struts2作为控制器层,提供了强大的MVC架构支持,而Spring则是一个全面的轻量级应用框架,...

    Compass与Struts2SpringHibernate的整合示例

    1. 添加依赖:首先在项目中引入Compass、Struts2、Spring和Hibernate的相应依赖库。 2. 配置Compass:在Spring配置文件中定义Compass的bean,包括设置数据源、索引路径、搜索引擎类型等。 3. 配置Hibernate:在...

    Struts2SpringHibernate升级三合一(精益求精)

    Struts2.3.16.3升级到Struts2.5.12注意事项(必须) Spring 4.1.2升级到Spring 4.3.10注意事项(必须) hibernate 3升级到hibernate5.2.9注意事项(必须) 最新SSH升级必备

    Struts2SpringHibernate整合,一个HelloWorld版的在线书店(项目源码+详尽注释+单元测试)

    Struts2,Spring,Hibernate是Java Web开发中最为常见的3种框架,掌握这3种框架是每个Java Web开发人员的基本功。 然而,很多初学者在集成这3个框架的时候,总是会遇到各种各样的问题。 我在读大学刚刚学习SSH的...

    Struts1SpringHibernate整合总结

    为了实现Struts1与Spring的集成,首先需要创建一个Spring容器。Spring容器能够帮助我们管理业务逻辑层的Bean,并且可以自动装配这些Bean,减少手动实例化的繁琐工作。Spring容器的创建通常有多种方式,其中使用`...

    基于struts2 spring hibernate整合

    在这个“基于Struts2 Spring Hibernate整合”的项目中,我们看到开发者使用了Maven作为构建工具,这使得依赖管理和项目构建变得更加规范和便捷。 1. **Struts2**:Struts2是一个开源的MVC框架,它继承了Struts1的...

    Struts1SpringHibernate简单整合

    这里我简单编写了一个Struts1 Spring Hibernate 整合例子,以后复习的时候方便查找复习

    权限管理系统Struts2+Spring+Hibernate整合升级版

    【权限管理系统Struts2+Spring+Hibernate整合升级版】是一个基于经典的Java开发框架组合——Struts2、Spring和Hibernate的高级应用。这个系统主要用于企业级的客户关系管理(CRM),并在此基础上进行了优化和增强,...

    开发基于Struts SpringHibernate 的网上信息发布平台阶段五

    总的来说,"开发基于Struts SpringHibernate 的网上信息发布平台阶段五"涵盖了Java Web开发的诸多核心技能,从设计模式到具体的技术实现,都需要开发者具备扎实的基础和实践经验。在实际操作中,开发者应不断学习和...

    开发基于Struts SpringHibernate 的网上信息发布平台阶段六

    开发基于Struts SpringHibernate 的网上信息发布平台阶段六

    开发基于Struts SpringHibernate 的网上信息发布平台阶段二

    开发基于Struts SpringHibernate 的网上信息发布平台阶段二

    Struts1.x+Spring+Hibernate开发实例

    这个"Struts1.x+Spring+Hibernate开发实例"是一个综合性的学习资料,旨在帮助开发者理解如何将这三个框架整合在一起,构建一个完整的Web应用程序。 Struts1.x是Apache软件基金会的开源MVC(Model-View-Controller)...

    开发基于Struts SpringHibernate 的网上信息发布平台阶段三

    在本项目中,我们主要探讨的是使用Struts、Spring和Hibernate三大框架开发一个网上信息发布平台的第...通过对这些代码的学习和理解,你可以更深入地掌握如何在实际项目中整合和运用Struts、Spring和Hibernate三大框架。

Global site tag (gtag.js) - Google Analytics