Struts2和Hibernate整合
- 格式:doc
- 大小:966.50 KB
- 文档页数:13
Struct2、Hibernate3、Spring3框架搭建实战采⽤⽬前最新的struts-2.3.1.2、hibernate3.6.10.Final、spring-framework-3.1.1.RELEASE开发包,以及eclipse-jee-indigo-SR2-win32、apache-tomcat-7.0.27服务器、JDK6和mysql5做开发环境,参考了前辈的⼀篇相关⽂章,改正了其中的错误和疏漏,克服了公司分配的“新”机器每⼩时⾃动重启三次的困难,终于把环境给搭好了。
整个过程中遵循的⼀个原则是,避免引⼊⽤不到的jar包,以求搭建⼀个最⼩的SSH 运⾏环境。
⾸先创建⼀个Dynamic web project 输⼊任意名字如SSHBase。
第⼀步:加载Spring环境我们需要引⼊的包有:org.springframework.asm-3.1.1.RELEASE.jarorg.springframework.beans-3.1.1.RELEASE.jarorg.springframework.context-3.1.1.RELEASE.jarorg.springframework.core-3.1.1.RELEASE.jarorg.springframework.expression-3.1.1.RELEASE.jarorg.springframework.jdbc-3.1.1.RELEASE.jarorg.springframework.web-3.1.1.RELEASE.jarorg.springframework.orm-3.1.1.RELEASE.jar由于spring默认开启了⽇志,还需要加⼊commons-logging的jar包,否则会报错。
建议不要⼀次性加⼊应该先加最核⼼的运⾏代码看缺少什么加什么,这样就不会加多余的包进来了,spring3已经把包按功能分开,不像以前⼀个包,这样更灵活,只要运⾏我们需要的功能,⽽没⽤到的就不⽤在硬性的添加进来。
Struts2+Spring3+Hibernate4+Maven整合目录1.建立Maven工程2.搭建Spring33.搭建Struts2并整合Spring34.搭建Hibernate4并整合Spring3内容1.建立Maven工程第一步:第二步:第三步:第四步:注意:这里的JDK要选择默认的,这样别人在使用的时候,如何JDk不一致的话也不会出错,如下图所示:第五步:Maven标准目录src/main/javasrc/main/resourcessrc/test/javasrc/test/resources第六步:发布项目:Maven install清除编译过的项目:Maven cleanOK,Mean 工程创建成功!2. 搭建 Spring3(1)下载Spring3需要的jar包1.spring-core2.spring-context3.spring-jdbc4.spring-beans5.spring-web6.spring-expression7.spring-orm在pom.xml中编写Spring3需要的包,maven会自动下载这些包。
<!-- spring3 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>3.1.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>3.1.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>3.1.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>3.1.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>3.1.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>3.1.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>3.1.2.RELEASE</version></dependency>(2)编写Spring配置文件<?xml version="1.0"encoding="UTF-8"?><beans xmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd /schema/context/schema/context/spring-context-3.0.xsd "><!-- 引入属性文件 --><context:property-placeholderlocation="classpath:config.properties"/><!-- 自动扫描dao和service包(自动注入) --><context:component-scan base-package="com.zc.dao,com.zc.service" /></beans>(3)编写测试首先,在src/main/java中创建com.zc.service包,在包中编写一个UserService 接口,代码如下:package com.zc.service;/*** 测试* @author ZC* */public interface UserService {public void test();}然后,在src/main/java中创建com.zc.service.imple包,在包中编写UserServiceImple 实现类,代码如下:package com.zc.service.impl;import org.springframework.stereotype.Service;import erService;@Service("userService")public class UserServiceImpl implements UserService {@Overridepublic void test() {System.out.println("Hello World!");}}注意:@Service("userService")使用junit注解完成service 注入,所以还要在pom.xml中配置junit注解。
一搭建三大框架步骤1 搭建s2sh步骤分析:1.1在MyEclipse 里面新建一个 java web project1.2新建三个 Source Folder :src : 源文件config : 存放配置文件 : hibernate , spring , struts2test: 测试类1.3 导入环境需要的jar 包 : WebRoot/WEB-INF/lib (一共64个)2 搭建Hibernate 和Spring 整合(*根据搭建需求谁能先测试就先搭建谁)2.1 在 src 源文件里面建立一个 cola.s2sh.domain[并且在该包下创建一个持久类和该类的映射文件] .2.2 配置核心文件在 config 里面建立一个hibernate 文件夹里面创建hibernate.cfg.xml配置文件(里面的内容拷贝就可以)2.3 在spring 文件夹里面创建并且把sessionFactory 交给spring 来管理: [applicationContext-db.xml中引入][<bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation"><value>classpath:hibernate/hibernate.cfg.xml</value> </property></bean>]在 applicationContext.xml 中 : 导入<import resource="applicationContext-db.xml"/>2.4 测试sessionFactory[编写SpringUtils 然后继承这个][public class SpringUtils {public static ApplicationContext context;static {context = newClassPathXmlApplicationContext("spring/applicationContext.xml" );}}]2.5 编写 dao .service 的包类和接口;PersonDaoImpl 要继承HibernateDaoSupport[public class PersonDaoImpl extends HibernateDaoSupport implements PersonDao {public void savePerson(Person person) {this.getHibernateTemplate().save(person);}}]2.6 把 dao ,service 放在spring 容器中:[<bean id="personDao"class="cola.s2sh.daoImpl.PersonDaoImpl"> <property name="sessionFactory"><ref bean="sessionFactory"/></property></bean><bean id="personService"class="cola.s2sh.service.impl.PersonServiceImpl"><property name="personDao"><ref bean="personDao"/></property></bean>]2.7 完成 spring 声明式处理 :[<!-- 事务管理 --><bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory"><ref bean="sessionFactory"/></property></bean><tx:advice id="tx"transaction-manager="transactionManager"><tx:attributes><tx:method name="save*"read-only="false"/><tx:method name="update*"read-only="false"/><tx:method name="delete*"read-only="false"/><!--除了上面三种情况以外的情况--><tx:method name="*"read-only="true"/></tx:attributes></tx:advice><aop:config><aop:pointcutexpression="execution(* cola.s2sh.service.impl.*.*(..))"id="perform"/><aop:advisor advice-ref="tx"pointcut-ref="perform"/> </aop:config>]2.8 整合struts 创建 action 类包 ;2.9 把action 放在spring 容器中* 注意在personAction的spring的配置中一定要写一个属性scope="prototype"[<bean id="personAction"class="cola.s2sh.action.PersonAction" scope="prototype"><property name="personService"><ref bean="personService"/></property></bean>]在这个中引入下面3.0 编写struts2中配置文件Struts –person.xml中Struts.xml3.1 编写web .xml文件[<?xml version="1.0"encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance"xmlns="/xml/ns/javaee"xmlns:web="/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID"version="3.0"><display-name>cola.s2sh</display-name><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener><!—将srping放在SrvletContext中进行加载当servlet加载时 spring 也完成加载 --> <context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/applicationContext.xml</param-value> </context-param><filter><filter-name>OpenSessionInViewFilter</filter-name><filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class></filter><filter-mapping><filter-name>OpenSessionInViewFilter</filter-name><url-pattern>*.action</url-pattern></filter-mapping><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter -class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>]二原理分析:一、 Struts 2框架整合Spring步骤1、复制文件。
Struts2+Spring3+hibernate3整合(2011年7月末,最新)上次下载了一个教程,上面写着:“献给我亲爱的老婆!”(羡慕不已)。
想了想,我没老婆,难道没什么好写了!不难…献给我暗恋过的每一个女人!(嘿嘿…)如果在你遇到的女生中有一个幽默豁达的女生,不要犹豫,追上去,就娶她了!一,需要的框架包二,建立project,添加相应的.jar文件(重点)1,eclipse中建立dynamic web project,这里是ssh_integrate_0100。
2,src中创建需要的类,这里以一个域模型为user的例子说明。
(现在建立这些类,可以方便我们在搭建时候随时测试!)User.javaIUserDao.javaUserDaoImpl.javaIUserService.javaUserServiceImpl.java3,拷贝spring-framework-3.1.0\dist目录下的所有jar包,注意有一个不是jar的文件,当然拷过去也没事。
4,拷贝spring运行中需要的其他jar文件,主要是mons-logging,可以从spring-framework-3.0.2.RELEASE-dependencies中找到。
ii.Aspectjrt.jar和aspect-waver.jar,可以从spring-framework-2.5.6-with-dependencies/lib/aspectj下面找到(不知道为什么,spring-framework-3.0.2.RELEASE-dependencies中没有aspectjrt的jar包)iii.aopalliance.Jar,apache-dbcp.jar,apache-pool.jar,可以从spring-framework-3.0.2.RELEASE-dependencies中找到。
5,建立beans.xml,这里使用的是annotation和component-scan,这样配置可以大大简化配置,所以是best-practice,其他配置请参考spring文档。
整合Struts和Hibernate的Web系统应用
方巍;孙涌;张书奎
【期刊名称】《计算机与现代化》
【年(卷),期】2005(000)012
【摘要】根据关系型数据库的特点,提出了整合Struts和Hibernate数据持久层框架的Web系统解决方案,结合实例介绍了对关系数据库进行对象关系映射的实现过程.
【总页数】4页(P39-41,61)
【作者】方巍;孙涌;张书奎
【作者单位】苏州大学计算机科学与技术学院,江苏,苏州,215006;苏州大学计算机科学与技术学院,江苏,苏州,215006;苏州大学计算机科学与技术学院,江苏,苏
州,215006
【正文语种】中文
【中图分类】TP311.13
【相关文献】
1.基于Struts2与Hibernate框架的Java Web应用研究 [J], 欧阳宏基;葛萌
2.基于Struts+Hibernate+Spring的整合架构及其在Web开发中的应用 [J], 田秀彦;李忠;罗士美;邓力强
3.基于struts2-hibernate-spring的Java Web系统国际化设计与实现 [J], 李敏
4.整合Struts和Hibernate框架的Web应用开发 [J], 邹俊
5.基于Struts和Hibernate框架的Web应用研究与实现 [J], 钱新杰;胡桂香;付秋林;李龙
因版权原因,仅展示原文概要,查看原文内容请购买。
ssh框架实验报告《SSH框架实验报告》SSH框架是指Struts2 + Spring + Hibernate的整合框架,它将三大框架有机地结合在一起,为Java开发人员提供了一种高效、稳定的开发方式。
在本实验中,我们对SSH框架进行了深入的研究和实验,以期能够更好地理解和掌握这一框架的使用方法和特点。
在实验中,我们首先进行了环境搭建,包括安装和配置Struts2、Spring和Hibernate框架,以及建立数据库连接等。
接着,我们创建了一个简单的Web应用程序,包括前端页面和后端业务逻辑,以便于对SSH框架进行测试和验证。
在这个过程中,我们深入了解了SSH框架的各个组成部分,包括Struts2的MVC模式、Spring的依赖注入和AOP特性,以及Hibernate的ORM映射和持久化操作。
通过实验,我们发现SSH框架具有以下几个特点:1. 结构清晰:SSH框架将前端页面、业务逻辑和数据持久化分离,使得应用程序的结构更加清晰和模块化,方便于开发和维护。
2. 灵活性强:由于整合了Struts2、Spring和Hibernate三大框架,SSH框架具有很强的灵活性,可以根据实际需求进行定制和扩展。
3. 性能优秀:通过对SSH框架进行性能测试,我们发现其在处理大规模数据和高并发访问时表现优秀,能够保持稳定的性能和响应速度。
4. 社区支持:由于SSH框架是目前Java开发领域最流行的整合框架之一,拥有庞大的用户群体和活跃的社区支持,能够及时获取到最新的技术资讯和解决方案。
总的来说,SSH框架是一种非常成熟和稳定的Java开发框架,具有广泛的应用前景和市场需求。
通过本次实验,我们对SSH框架有了更深入的了解和体验,相信在今后的开发工作中能够更加熟练地运用这一框架,为企业应用程序的开发和维护提供更好的技术支持。
Struts笔记1.Hibernate和struts整合 (2)2.ResultType (2)3.OGNL (3)4.拦截器 (4)5.Action和result (5)6.i18n国际化 (7)7.Struts标签 (8)8.类型转换类的三种配置形式: (9)9.struts2中方法验证的三种形式 (10)10.MVC思想及其优势 (11)1.Hibernate和struts整合1.Hibernate的作用是针对数据表的操作,对JDBC进行封装。
一张表就是一个对象,存进表的数据就是一个一个的对象。
2.核心配置文件Hibernate.cfg.xml3.struts2 他是比较标准的MVC模式:分别只带的是模型视图控制器hibernate和struts在一起写一个增删查改的操作1.创建工程2.导入hibernate Jar包Struts Jar包3.核心配置文件Hibernate.cfg.xml的核心文件和数据库连接上4.创建POJO 创建POJO.hbm.xml 映射到核心的配置文件中5.通过创建一个创表的类把表创建出来6.创建客户端的JSP页面7.配置web.xml 创建Action 创建struts.xml8.在Tomcate上发布在运行2.ResultType如果一个或者多个action 中有同样的结果,可以配置全局结果集,减少重复代码3.OGNL访问Action值栈中的普通属性:<s:property value="dog"/><br>获取值栈中对象的属性:<s:property value="dog.people.pname"/><br>调用对象中的普通方法:<s:property value="dog.people.getMsg()"/><br>访问action中的方法:<s:property value="show()"/><br>访问action中的静态方法:<s:propertyvalue="@com.softeem.action.ActionDemo@getMsg()"/><br/>Math类的中方法:<s:property value="@@max(6,7)"/><br>访问普通类中的构造器:<s:property value="new com.softeem.pojo.People()"/><hr/><br>访问list集合长度:<s:property value="list.size()"/><br>访问list集合中对象的属性:<s:property value="list.get(0)"/>|<s:propertyvalue="list.{pname}[0]"/><br>访问set集合:<s:iterator value="set" var="dog"><s:property value="#dog.dname"/></s:iterator><br>访问map集合:<s:property value="map"/><br>获取map集合中所有的键:<s:property value="map.keys"/><br>获取map集合中所有的值:<s:property value="map.values"/><br>访问map集合中指定对象:<s:property value="map.get('来福')"/>|<s:propertyvalue="map[\"来福\"].dcolor"/><br><hr><br>获取值栈中的普通属性:<s:property value="dog"/><br>获取值栈中对象的属性:<s:property value=""/><br>调用对象中的普通方法:<s:property value="dog.p.getMsg()"/><br>访问action中的方法:<s:property value="show()"/><br>访问action中的静态方法:<s:property value="@com.softeem.action.OgnlAction@getMsg()"/><br/>Math类的中方法:<s:property value="@@max(6,7)"/><br>访问普通类中的构造器:<s:property value="new com.softeem.action.People()"/><hr/><br>访问list集合:<s:property value="list.size()"/><br>访问list集合中对象的属性:<s:property value="list.get(0)"/>|<s:property value="list.{name}[0]"/><br>访问set集合:<s:iterator value="set" var="dog"><s:property value="#"/></s:iterator><br>访问map集合:<s:property value="map"/><br>获取map集合中所有的键:<s:property value="map.keys"/><br>获取map集合中所有的值:<s:property value="map.values"/><br>访问map集合中指定对象:<s:property value="map.get('小黑')"/>|<s:property value="map[\"小黑\"].color"/><br><hr><br>投影(过滤):<br>取出age>18所有对象<s:property value="list.{?#this.age>18}"/><br>取出所有age>18的对象的第一个<s:property value="list.{^#this.age>18}"/><br>取出所有age>18的对象的最后一个<s:property value="list.{$#this.age>18}"/><br>取出所有名字为'来福'的狗<s:property value="list.{?#=='来福'}"/><br>取出值栈中的对象:<s:property value="[0]"/><s:debug></s:debug>4.拦截器自定义一个拦截器<interceptors><interceptorname="proInterceptor"class="com.softeem.intercepter.ProInterceptor" ></interceptor>配置拦截器栈<interceptor-stack name="myStack"><interceptor-ref name="proInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors>拦截器和过滤器的区别:①过滤器在首次请求的时候就会执行,拦截器在任意时候都可以执行②过滤器对所有的请求(servlet/jsp)都会过滤,拦截器可以精确的拦截任何一个action<action name="testAction" class="com.softeem.action.TestAction"><result>/main.jsp</result>引入指定拦截器:配置其他拦截器之前,需要引入struts2提供的默认拦截器defaultStack,否则当前拦截器会将默认拦截器覆盖<interceptor-ref name="defaultStack"></interceptor-ref>自定义拦截器:使用自定义拦截器,需要现在当前包中配置拦截器<interceptor-ref name="myInterceptor"></interceptor-ref></action>创建拦截器的步骤:1:创建一个类实现Interceptor接口,实现三个方法(destory、init、intercept) 2:在struts.xml中进行配置,声明当前过滤器声明拦截器:当一个拦截器声明之后,可以被多个action使用<interceptors><interceptorname="interceptor01"class="com.softeem.type.intercept ors.MyInterceptor"></interceptor><interceptorname="interceptor02"class="com.softeem.type.intercept ors.MySecondInterceptor"></interceptor>我们可以将多个拦截器定义成一个“拦截器组”,可以通过引用这个拦截器组从而达到引用这个组中所有的拦截器的目的<interceptor-stack name="stack1"><interceptor-ref name="interceptor01"></interceptor-ref><interceptor-ref name="interceptor02"></interceptor-ref></interceptor-stack>我们同样可以将多个拦截器和已经存在“拦截器组”放在一起生成一个新的“拦截器组”<interceptor-stack name="stack2"><interceptor-ref name="stack1"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><action name="user" class="erAction"> <result name="index">/index.jsp</result>如果当前action没有手动的引用其他的拦截器,则默认引用了Struts2的defaultStack 拦截器一旦我们手动引用了拦截器,则defaultStack拦截器组就不被自动引用,我们需要手动引用拦截器的执行顺序和被引用的顺序一致<interceptor-ref name="stack2"></interceptor-ref></action>5.Action和result1,Struts2配置文件中的模块包含将另外一个xml配置文件作为struts.xml文件的一部分引入到struts.xml<include file="name.xml"/>意义在于项目开发时的并行开发(版本控制工具同步管理)2,struts2的默认Action:当用户访问的页面不存在的时候跳转到默认action页面访问index.actionstruts.xml配置文件<default-action-ref name="index"></default-action-ref><action name="index"><result>/error.jsp</result></action>3,Action总结:action类三种方式DMI动态调用方法!通配符配置*-*jsp页面值传递到action中的接收三种方式简单的参数验证访问web元素包含文件配置默认action处理4,struts.xml中的result的类型配置<result type=""></result>默认类型dispatcher,运用服务器跳转(视图页面)5,全局的result配置(GlobalResult)package标签下<global-results><result name=""></result></global-results>思考:如果一个package要使用另一个package中的result?6,结果集:result的类型(主要两种)全局结果集动态结果传递参数7,struts2的动态结果集在配置文件中:<result name="">${attrName}</result>$可以在配置文件中从action中取值在action添加attrName属性,并赋值8,带参数的结果集在rusult中使用$取到action中的值传递到action跳转的页面<result type="redirect">/xxx.jsp?abc=${attrName}</result>6.i18n国际化国际化的解释ResourceBandle实例Struts实例native2ascii 源文件名目标文件名properties级别问题action:文件名要和Action的类名一致package:名字必须是package_..._....propertiesapplication:名字可以随意,但是需要配置struts.custom.i18n.resoutces 处理资源文件中的参数 login.message=welcome:{0}<s:text value="login.message"><param value="username"></param></s:text>国际化语言动态切换request_locale=en_US/zh_CN<a href="language?request_locale=en_US">EN</a><a href="language?request_locale=zh_CN">CN</a>---------------------------------------------------------1,i18n的原理:根据参数不同的值,根据相同的key在不同的文件中取到不同的value2,实例运行3,properties文件的级别action级别:配置文件的前缀名必须和类名保持一致,只在访问这一个action的时候加载package级别:配置文件的前缀名必须是package,在访问当前包下面的action都会加载application:配置文件的前缀名没有要求,需要在struts.xml中进行配置,在服务器启动时加载4,使用国际化步骤:①创建全局的properties资源文件(注意命名)②在struts.xml中加载properties资源文件③在页面使7.Struts标签1,struts标签分为:通用标签控制标签UI标签(展现)2,通用标签:propertyproperty标签中的value属性默认是一个object<s:propertyvalue="username"/>表示根据在值栈中根据username取到一个对象显示property取值为字符串<s:property value="'哈哈'"/>表示直接显示一个"哈哈"字符串,直接显示的字符串要加上单引号property的默认值:<s:property value="admin" default="管理员"/>如果根据admin在值栈中取值没有取到,则显示默认值property设定HTML:<s:property value="'<hr/>'" escape="true"/> 如果没有加上escape="true",表示直接显示字符串set在request或者ActionContext中存入信息:<s:set var="user" value="Obj"/> 默认存放在request和ActionContext中,value值为对象从request中取值:<s:property value="#er"/>从ActionContext中取值:<s:property value="#user"/>默认取值空间为ActionContext范围的设置:<s:set name="key" value="password" scope="page"/>beanbean 定义bean,使用param来设定新的属性值<s:bean name="er" var="user1"><s:param name="username" value="'张三'"></s:param></s:bean>var表示新创建的对象的名字,如果没有var属性就不能在Context stack中找到s:param给新创建的对象属性赋值,注意valueinclude(解决中文问题很麻烦)包含静态文件:<s:include value="/test.jsp"></s:include>用%包含文件:<s:set var="incPage" value="'/test.jsp''}"/><s:include value="incPage"></s:include><s:include value="#incPage"></s:include><s:include value="%{#incPage}"></s:include>paramdebug3,控制标签:if elseif elseiteratorsubset(截取集合的一部分)4,UI标签:theme(主题)struts.xml中控制theme,默认为xhtml,可以设置为simple/css_htm/ajax <constant name="struts.ui.theme" value="css_htm"/>5,$#%的区别$用于i18n和struts的配置文件中#用于取ActionContext的值%将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用8.类型转换类的三种配置形式:actin级别:配置文件的名字:action-conversion.properties内部配置:ation对应的属性名=转换类的路径配置文件的存放位置:和action位置相同说明:当用户访问这个action中这个属性的时候才调用类型转换类pojo级别:配置文件的名字:pojo-conversion.properties配置文件的存放位置:和pojo的位置相同内部配置:pojo对应的属性名=类型转换类的路径说明:当用户访问任何action,只要提交了这个pojo中的这个属性的时候就会调用类型转换类src级别:配置文件的名字:xwork-conversion.properties配置文件的存放位置:直接存放在src下内部配置:属性类型(+包名)=类型转换类的路径说明:用户访问任何action,只要提交了对应类型的属性的时候就会调用类型转换类当我们转换类继承的是StrutsTypeConverter,需要重写两个方法:convertFromString(在用户向action提交数据的时候调用)convertToString,将指定类型的数据转换成String类型(在action向页面跳转的时候调用)struts2数据校验分为手工验证和自动验证手工验证:指的是在对应的action里面通过validate方法对这个action里面的属性进行校验validate方法是重写,它是在ValidateAble接口中定义的所以我们这个action要实现ValidateAble接口才能完成校验但是ActionSupport已经实现了ValidateAble接口,所以我们创建的action只要继承了ActionSupport,就可以重写validate自动验证:使用xwork里面提供的验证,通过配置文件对action的属性进行验证9.struts2中方法验证的三种形式1,采用注解annotation形式:在不需要验证的方法前加上@SkipValidation2,正对每一个需要验证的方法单独生成一个配置文件,例如在UserAction中有两个方法add()和delete()并且我们假设只对add()方法进行校验,配置如下:-----------------struts.xml------------------------------------- <!-- 需要对add()方法单独添加一个配置,并且要以这个action标签的那么属性“user_add”作为alias添加一个验证配置文件,如下: --><action name="user_add" class="erAction" method="add"><result>/success.jsp</result><result name="input">/index.jsp</result></action><!-- 配置这个action主要是为了让其他的请求能进入其他的方法 --><action name="user_*" class="erAction" method="{1}"><result>/success.jsp</result><result name="input">/index.jsp</result></action>---------------------------------------------------------------- 新创建一个validation.xml配置文件,命名为【UserAction-user_add-valication.xml】3,采用拦截器形式(验证框架的配置文件UserAction-validation.xml):即,给默认拦截器配置拦截参数,配置如下:<action name="user_*" class="erAction" method="{1}"><result>/success.jsp</result><result name="input">/index.jsp</result><interceptor-ref name="defaultStack"><param name="validation.excludeMethods">*</param><param name="validation.includeMethods">delete</param> </interceptor-ref></action>在<param name="validation.includeMethods"></param>标签里面写出需要验证的方法名字如果有多个方法,方法名以“,”隔开,例如要验证add和delete方法:<param name="validation.includeMethods">add,delete</param> 10.MVC思想及其优势MVC并不是Java语言所特有的设计思想,也并不是Web应用所特有的思想,它是所有面向对象程序设计语言都应该遵守的规范。
Struts2+Spring3+Hibernate3 集成 目 录 1.Struts2集成 ..................................................... 11.1. 把Struts提供的jar包拷贝到/WEB-INF/lib/目录下 (1)1.2. 在web.xml中配置Struts的过滤器 (2)2.Struts2开发 ..................................................... 22.1 编写Struts Action程序,需要继承ActionSupport (2)2.2 创建struts.xml的Action映射文件 (3)3.Struts2+Spring集成 .............................................. 33.1 按第1步“Struts2集成”方法集成Struts2 (3)3.2 再把Struts的Spring插件把拷贝到/WEB-INF/lib/目录下 (3)3.3 把Spring提供的jar拷贝到/WEB-INF/lib/目录下 (3)3.4 web.xml配置Spring的过滤器 (3)3.5 创建applicationContext.xml配置文件 (4)4.Struts2+Spring+Hibernate集成 ..................................... 54.1 先按照“Struts2+Spring集成”方法执行 (5)4.2 导入Apache Commons几个jar包 (5)4.3 导入Hibernate几个jar包 (5)4.4 数据库的JDBC驱动 (5)4.5 在applicationContext.xml中加入如下的配置 (5)4.6 创建hibernate.cfg.xml文件 (6)5.Struts2+Spring+Hibernate开发 ..................................... 65.1 编写Model类 (6)5.2 编写Model类的HBM映射文件 (7)5.3 在applicationContext.xml中指定HBM映射文件路径 (8)5.4 编写DAO接口和实现类程序,并继承HibernateDaoSupport (8)5.5 在applicationContext.xml中配置DAO Bean (10)6.注意事项 ....................................................... 101. Struts2集成1.1.把Struts提供的jar包拷贝到/WEB-INF/lib/目录下Struts需要如下几个包:解压:struts-2.2.3.1-lib.zip需要:struts2-core-2.2.3.1.jarxwork-core-2.2.3.1.jarognl-3.0.1.jarfreemarker-2.3.16.jarjavassist-3.11.0.GA.jar和所有以“commons-”开头的包。
完美Spring2.5、Hibernat e3.0、Struts2整合配置实例,自己动手实践的哦1.所要的jar包有,可以找对应的官网下载2.对应的配置文件applicationContext.xml<?xml version="1.0" encoding="UTF-8"?>< beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSche ma-instance"xmlns:aop="/schema/aop"xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-2.0.xsd http://www.springframewor /schema/tx/schema/tx/spring-tx-2.0.xsd/schema/aop/schema/aop/spring-aop-2.0.xsd" default-lazy-init="true"><bean id="dataSource"class="boPooledDataSource"destroy-method="close"><property name="driverClass"><value>org.gjt.mm.mysql.Driver</value></property><property name="jdbcUrl"><value>jdbc:mysql://localhost:3306/huiyou?characterEncoding=UTF-8</ value></property><property name="user"><value>root</value></property><property name="password"><value>root</value></property><property name="minPoolSize"><value>1</value></property><property name="maxPoolSize"><value>20</value></property><property name="maxIdleTime"><value>1800</value></property><property name="acquireIncrement"><value>2</value></property><property name="maxStatements"><value>0</value></property><property name="initialPoolSize"><value>2</value></property><property name="idleConnectionTestPeriod"><value>1800</value></property><property name="acquireRetryAttempts"><value>30</value></property><property name="breakAfter AcquireFailure"><value>true</value></property><property name="testConnectionOnCheckout"><value>false</value></property></bean><bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property><property name="hibernatePropert ies"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><!--设置二级缓冲--><prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop><!--设置二级缓冲,打开查询缓冲--><prop key="e_query_cache">true</prop> <prop key="hibernate.show_sql">false</prop><prop key="hibernate.connection.release_mode">auto</prop><prop key="hibernate.autoReconnect">true</prop><prop key="e_reflection_opt imizer">true</prop></props></property><property name="mappingResources"><list><value>com/product/bean/Yuancheng.hbm.xml</value></list></property></bean><bean id="dao" class="com.product.dao.impl.DaoImpl"scope="prototype"><property name="sessionFactory"><ref bean="sessionFactory" /></property></bean><bean id="service" class="com.product.service.impl.ServiceImpl"scope="prototype"><property name="dao"><ref bean="dao" /></property></bean><!-- action配置--><bean id="Saveorder Action" class="com.product.action.SaveorderAction" scope="prototype"><property name="service"><ref bean="service" /></property></bean><!-- 配置事务管理器--><bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManage r"><property name="sessionFactory"><ref local="sessionFactory"/></property></bean><!-- 配置事务特性,配置add、delete和update开始的方法,事务传播特性为required--><tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes><tx:method name="insert*" propagation="REQUIRED"/><tx:method name="delete*" propagation="REQUIRED"/><tx:method name="update*" propagation="REQUIRED"/><tx:method name="*" read-only="true"/></tx:attributes></tx:advice><!-- 配置那些类的方法进行事务管理,当前.jobedu.oa.service包中的子包、类中所有方法需要,还需要参考tx:advice的设置--> <aop:config><aop:pointcut id="allManager Method" expression="execution (* com.nizi.service.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="allManager Method"/> </aop:config>< /beans>url重写urlrewrite.xml<?xml version="1.0" encoding="utf-8"?>< !DOCTYPE urlrewrite PUBLIC "-////DTD UrlRewrite 2.6//EN""/res/dtds/urlrewrite2.6.dtd">< urlrewrite><rule><from>/findfengge_([0-9]\d*)_([0-9]\d*).html</from><to>/BproductAction!findfengge.action?fenggeid=$1&cur=$2</to ></rule><rule><from>/getnews-([0-9]\d*).html</from><to>/BproductAction!getnews.action?id=$1</to></rule><rule><from>/newshangchuan.html</from><to>/BproductAction!newshangchuan.action</to></rule><rule><from>/userhuiproduct_([0-9]\d*)_(\w*)_([0-9]\d*).html</from><to>/BproductAction!listuserhuiproduct.action?userid=$1&englis h=$2&cur=$3</to></rule><rule><from>/userxianchang_([0-9]\d*)_(\w*)_([0-9]\d*).html</from><to>/BproductAction!xianchang.action?userid=$1&english=$2&a mp;cur=$3</to></rule>< /urlrewrite>struts.xml<?xml version="1.0" encoding="UTF-8" ?>< !DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><constant name="struts.locale" value="en_GB" /><constant name="struts.multipart.maxSize"value="104857600"></constant><package name="pro" extends="struts-default"><action name="Makecar Action" class="MakecarAction"><result name="success">/jsp/buy.jsp</result><result name="login">/jsp/login.jsp</result><result name="input">/W EB-INF/page/sorry.jsp</result></action></package>< /struts>web.xml<?xml version="1.0" encoding="UTF-8"?>< web-app version="2.5" xmlns="/xml/ns/javaee" xmlns:xsi="/2001/XML Schema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd"><error-page><error-code>404</error-code><location>/html/404error.html</location></error-page><error-page><error-code>500</error-code><location>/html/500error.htm</location></error-page><jsp-config><jsp-property-group><description>jsp encoding example</description><display-name>JSPConfiguration</display-name><url-pattern>/shtm l/main.jsp</url-pattern><el-ignored>true</el-ignored><page-encoding>UTF-8</page-encoding><scripting-invalid>false</scripting-invalid><include-prelude></include-prelude><include-coda></include-coda></jsp-property-group><jsp-property-group><description>html encoding example</description><display-name>JSPConfiguration</display-name><url-pattern>*.html</url-pattern><el-ignored>true</el-ignored><page-encoding>UTF-8</page-encoding><scripting-invalid>false</scripting-invalid><include-prelude></include-prelude><include-coda></include-coda></jsp-property-group><taglib><taglib-ur i>/W EB-INF/outtime</taglib-uri><taglib-location>/W EB-INF/outtime.tld</taglib-location></taglib><taglib><taglib-ur i>/W EB-INF/outtimecha</taglib-uri><taglib-location>/W EB-INF/outtimecha.tld</taglib-location> </taglib></jsp-config><context-param><param-name>log4jConfigLocation</param-name><param-value>/W EB-INF/log4j.properties</param-value></context-param><context-param><param-name>contextConfigLocation</param-name><param-value>/W EB-INF/applicationContext.xml</param-value> </context-param>< context-param><param-name>webAppRootKey</param-name><param-value>huiyou.root</param-value></context-param><session-config><session-timeout>60</session-timeout></session-config><listener><listener-class>org.springframework.web.util.Log4jConfigListener</listener-class></listener><listener><listener-class>org.springframework.web.context.ContextLoaderListener </listener-class></listener><!--<listener><listener-class>huan.lin.caiji.FindnewsListener</listener-class></listener>--><filter><filter-name>CacheFilter</filter-name><filter-class>com.opensymphony.oscache.web.filter.CacheFilter </filter-class><init-param><param-name>time</param-name><param-value>60</param-value></init-param><init-param><param-name>scope</param-name><param-value>application</param-value></init-param></filter><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class></filter><filter><filter-name>struts-cleanup</filter-name><filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp </filter-class></filter><filter-mapping><filter-name>struts-cleanup</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>UrlRewriteFilter</filter-name><filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter </filter-class><init-param><param-name>logLevel</param-name><param-value>W ARN</param-value></init-param></filter><filter-mapping><filter-name>CacheFilter</filter-name><url-pattern>/</url-pattern></filter-mapping><filter-mapping><filter-name>UrlRewriteFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter-mapping><filter-name>struts2</filter-name><url-pattern>*.action</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORW ARD</dispatcher><dispatcher>INCLUDE</dispatcher></filter-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file><welcome-file>index.html</welcome-file></welcome-file-list></web-app>log4j.propertieslog4j.root Logger=DEBUG,ROLLING_F ILElog4j.appender.ROLLING_F ILE=org.apache.log4j.RollingFileAppenderlog4j.appender.ROLLING_F ILE.Threshold=ERRORlog4j.appender.ROLLING_F ILE.File=zhuwei.htmllog4j.appender.ROLLING_F ILE.Append=truelog4j.appender.ROLLING_F ILE.MaxFileSize=10KBlog4j.appender.ROLLING_F ILE.MaxBackupIndex=1log4j.appender.ROLLING_F yout=org.apache.log4j.HT MLLayoutoscache.propertiescache.capacity=1000Cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceList cache.memory=true。
实验五Struts2和Hibernate3整合应用一、目的和要求本实验是为了让学生对持久化技术有一个初步了解,并熟悉在Eclipse + Hibernate 的集成环境下,如何建立一个持久化技术的简单的应用。
通过本实验1.掌握在企业Java应用开发中Struts的作用;2.熟悉在Eclipse+MyEclipse环境中综合使用Hibernate和Struts的方法和步骤;3.掌握Hibernate的核心思想。
4.掌握Struts和Hibernate整合思想。
二、实验内容创建数据库test,在数据库中创建一张表users,包括id,username和password,通过hibernate建立与表users对应的类Users。
在Struts框架创建的index.jsp的表单中输入users信息,将此信息转换成一个对象,通过struts的action将对象存入数据库中。
三、实验原理简介持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘),持久化的主要应用是将内存中的数据存储在关系型的数据库中。
要在Hibernate中实现数据的持久化,就是要建立对象中的属性与数据库中的表的映射关系,具体实现是利用两个xml配置文件,在其中的一个hibernate.cfg.xml文件中指定了数据库的连接的相关参数和映射文件的名称,而另一个文件*.hbm.xml(在此例中为users.hbm.xml)定义了对象(Users.class)中的属性与数据库表(Users)中的字段的对应关系。
这样当对象中的方法(在此例中对象的方法定义在Users.java中)对对象中的某些属性进行操作的时候,属性在数据库中对应的字段也就相应的发生了改变。
四、实验环境实验室环境。
五、实验步骤1.创建Web工程,名为TestS2H。
2.按实验四的实验步骤配置好struts2环境(参照实验四),例如添加Struts2所需的包,并配置web.xml,struts.xml,struts.properties,messageResource_zh_CN.properties,创建包和类等都和实验四相同。
3.在SQL Server 2000中创建数据库test,和表users。
SQL脚本如下:CREATE DATABASE test;USE test;CREATE TABLE [dbo].[users] ([id] [int] IDENTITY (1, 1) NOT NULL ,[username] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,[password] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL) ON [PRIMARY]GO建立好的表结构如图5-1。
图5-1 users表结构4.打开myeclipse的database explore透视图,如图5-2。
图5-2 打开数据库浏览器透视图5.新建数据库连接,如图5-3。
jtds-1.2.jar包在C:\java\ jdbc for SQL Server目录下可以找到。
点击Add JARS,把该包包含进去即可。
注意,实验室环境的密码是111111。
图5-3 新建数据库连接6.连接test数据库,如图5-4。
将test数据库展开后,如图5-5。
图5-5 数据库连接展开后7.生成映射文件。
操作如图5-6。
图5-6 生成映射文件8.Hibernate映射引擎,操作如图5-7.。
图5-7Hibernate Reverse Engineering 点击下一步,ID Generater项选择native。
点击下一步,Finished。
9.切换到MyEclipse窗口,操作如图5-8。
图5-8切换到MyEclipse窗口10.添加Hibernate所需的包以及创建Hibernate工程。
操作方法如图5-9到图5-13。
图5-9添加Hibernate所需的包(1)图5-10添加Hibernate所需的包(2)图5-11添加Hibernate所需的包(3)图5-12 New Hibernate Project(1)图5-13 New Hibernate Project(2)11.添加日志配置。
在src/目录下添加文件:log4j.properties。
其具体配置如下:log4j.rootLogger=INFO, CONSOLElog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d [%t] %-5p %c - %m%n# Print only messages of level WARN or above in the package com.foo. # .foo=WARN#.sa.health.oacis=DEBUG#.apache.struts2=DEBUG#.apache=INFO#.hibernate=INFO#log4j.logger.ca.uhn=INFO### log HQL query parser activity#.hibernate.hql.ast.AST=debug### log just the SQL.hibernate.SQL=debug### log JDBC bind parameters ###.hibernate.type=INFO#.hibernate.type=debug### log schema export/update ###.hibernate.tool.hbm2ddl=DEBUG### log cache activity ####.hibernate.cache=debug### log transaction activity#.hibernate.transaction=debug### log JDBC resource acquisition#.hibernate.jdbc=debug### enable the following line if you want to track down connection ### ### leakages when using DriverManagerConnectionProvider ####.hibernate.connection.DriverManagerConnectionProvide r=trac e12.工程目录结构,如图5-14。
图5-14 工程目录结构13.修改LoginAction.java,源码如下:package com.jee;import ers;import com.opensymphony.xwork2.ActionSupport;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;public class LoginAction extends ActionSupport{private static final long serialVersionUID = 1L;private String username;private String password;public String getUsername(){return username;}public void setUsername(String username){ername = username;}public String getPassword(){return password;}public void setPassword(String password){this.password = password;}public String execute() throws Exception{t ry{//实例化SessionFactorySessionFactory sf = newConfiguration().configure().buildSessionFactory();//实例化SessionSession session = sf.openSession();//开始事务Transaction tx = session.beginTransaction();//创建消息实例Users user = new Users();user.setUsername(getUsername());user.setPassword(getPassword());//将实例数据保存到数据库session.save(user);mit();session.close();return SUCCESS;}catch (HibernateException e) {e.printStackTrace();return ERROR;}}}14.创建表现层。
将index.jsp改为如下:<%@ page language="java" contentType="text/html; charset=UTF-8"%><%@taglib prefix="s" uri="/struts-tags"%><html><head><title><s:text name="loginPage"/></title></head><body>将用户名和密码保存到数据库test中。
<br><s:form action="login"><s:textfield name="username" key="user"/><s:password name="password" key="pass"/><s:submit key="save"/></s:form></body></html>同时在messageResource_zh_CN.properties里添加一条: save=保存,这样就会成功显示中文。