Java_SSH三大框架整合
Java
三大框架整合(HSS)Hibernate&Struts&Spring
Struts显示页面,做显示用的,Hibernate用来连接数据库,Spring用来连接Struts和Hibernate
Hibernate框架,通过映射,和数据库表之间建立对应关系,映射文件在
这是Hibernate框架的机制,例如,数据库中有表为User_Tb,这个文件里的User.java中的属性则只是一些get与set方法,如下图
设置完这些属性后,只需在配置文件(hibernate.cfg.xml)中把er.hbm.xml关联进去,就已经建立了和数据库的表的一一对应关系,如下图:
配置struts,首先配置struts.xml和struts.properties
struts.properties配置如下:
struts.action.extension=do(配置扩展名,如果你在*.xml中配置的action的name属性为register,那么就只有register.do才能激发其对应的action方法)
struts.multipart.parset=jakarta
struts.multipart.saveDir=/temp
struts.objectFactory=spring
struts.objectFactory.spring.autoWire=name
每次执行操作,都要按照这个部署;Structs框架,利用其配置文件(struts.xml,struts.propoties)及其所对应的action,则可以简化以上的部署,struts内部的一些封装的类,已经将这些与数据库的互动做了封装,其配置文件如下(为了便于管理,可以将*.xml配置文件单独写出来,最后直接利用import标签将其加载到struts.xml中,以useroper.xml为例)
Struts的作用就是显示作用,当其与web页面结合时,在*.xml中配置好后,可以在其对应的action方法中直接利用get,set方法取得页面中表单项的属性值,在这个三大框架整合中,最后就是利用这个方法获得表单中的username,;也可以说,struts负责的就是页面跳转时的动作,因为页面跳转时需要动态的获得一些值,而struts由于其内部封装的方法,可以很便捷的实现这些功能,如果要手写一些硬代码而不利用struts框架,则必须使用setAttribute或session来取得值
Action的class属性,对应的应该是action的类名(com.softeem.action.RegisterAction)这里利用了Spring框架的一些动作,在此写上useroperaction(它代表了com.softeem.action.RegisterAction)即可.
经由spring框架自动生成的配置文件(applicationContext.xml),和struts.xml一样,对于applicationContext.xml的配置,同样也是写在其他的*.xml中,然后导入applicationContext.xml,
以applicationContex_action.xml为例.
在此bean中,可以看到已经把class=”com.softeem.action.RegisterAction”配置到bean中,因此在以上的useroper.xml配置中,可以直接将class的属性写为此bean的id号,引进此bean,
Spring的用法大致如此,在三大框架整合的这个例子中,还有其他地方用到Spring框架的东西.
在struts.xml中,只需加入一行代码即可,如下图:
当在浏览器输入*.do(这里由于前面所配置,应该是register.do)后,即可激发此动作(执行此类中的execute()方法,当然,如果在*.xml中配置了方法名,则会执行你指定的方法,不指定的话,才会执行此默认的execute()方法
本例子是一个模板,有分层思想,如果不分层直接在后面加上this.getHibernateTemplate.save()就可以完成数据的插入了,在这里分层思想就是:struts模板只是负责页面,在此也就是负责了取得页面表单中的值,而具体与数据库交互,则交给Hibernate框架.
执行.addUser()这个方法是必须获得UserOperService对象才行,在此,此方法体中没有new实例的代码,这里利用了spring框架,在spring框架中配置bean,替代了new的方法,在之前的applicationContex_action.xml视图中,可以清晰的看见,其配置的bean中,已经将com.softeem.action.RegisterAction中的属性userOperService关联到id=”userservice
“的bean中,而此bean如下:applicationContex_service.xml
可以看到,次bean的配置,直接指向了com.softeem.dao.UserOperDaoImp类,spring的框架利用这种模式再加上其自身封装的类,实现了这种方式来代替new实例,
因此,action方法体中的useroperservice就是UserOperDaoImp的对象;
同样,在此bean中,他还为自己的一个属性(userOperDaoImp)用相同的形式将其实例化为UserOperDaoImp的一个对象,同样是利用的导入外部bean的形式,这种一层套一层的导入形式,是一种思想
然后,利用对象调用其自身方法,经过这一层,再次调用到以下的类中
publicclassUserOperDaoImpextendsHibernateDaoSupportimplementsIUserOperDao{
//Transactiontran=null;
//Sessionsession=null;
publicvoidaddUser(Useruser){
//TODOAuto-generatedmethodstub
//System.out.println("��service����!");
//session=HibernateSessionFactory.getSession();
//
//
//tran=session.beginTransaction();
//session.save(user);
//tran.commit();
////System.out.println("��ݲ���ɹ�!");
//if(session!=null){
//session.close();
//}
this.getHibernateTemplate().save(user);
System.out.println("被service调用!数据成功插入!");
}
在被调用的方法体只有一句代码,实现了数据的插入,也是利用了hibernate框架,被注释的是不用框架时插入数据的方式
在这个层次中,struts,hibernate,spring各司其职,,简要流程大概为:页面提交表单后,激发action动作,然后struts框架负责将其内容提取,提取后交给service(服务器)处理,service最终将其交给dao(hibernate框架中的dao),而在这些类之间相互跳转调用其方法时,spring在期间负责实例化类,获得对象,在hibernate于struts间起衔接作用
以下方法,是可以实现建表的功能,当配置好hibernate映射文件时,可以用此方法在数据库中建立表,可以将其看为hibernate反转的逆方法
publicclassExportDB{
publicstaticvoidmain(String[]args){
Configurationconfig=newConfiguration().configure();
SchemaExportexport=newSchemaExport(config);
export.create(true,true);
}
}
下面的配置文件是配置spring的事务,也就是在执行方法之前的一些另外执行的方法来提醒用户
这些网址声明就相当于java类中的导包,需要使用哪个标签,就必须把那个标签的地址给导进来
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd
">
<beanid="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<propertyname="configLocation"value="classpath:hibernate.cfg.xml">
</property>
</bean>
<!--
配置事务管理器
-->
<beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!--该sessionFactory是HibernateTransactionManager类的属性名,必须这么写-->
<propertyname="sessionFactory">
<!--指定需要管理事务的SessionFactory,即上面配置的-->
<refbean="sessionFactory"/>
</property>
</bean>
<!--
配置事务传播特性
配置自己的异常
-->
<tx:adviceid="txAdvice"transaction-manager="transactionManager">
<tx:attributes>
<tx:methodname="add*"propagation="REQUIRED"/>
<tx:methodname="del*"propagation="REQUIRED"/>
<tx:methodname="update*"propagation="REQUIRED"/>
<tx:methodname="*"read-only="true"/>
</tx:attributes>
</tx:advice>
<!--配置AOP,即使用AOP的方式将事务进行配置起来-->
<aop:config>
<aop:pointcutid="allManagerMethod"
expression="execution(*com.manager.*.*(..))"/>
<!--
定义通知者(即advisor,它与aspect一样,它是由Pointcut与Advice组成的),一般用于事务的配置
*pointcut-ref:指定要使用的Pointcut,这里指定id即可
*advice-ref:指定Advice,这里指定id即可
*<aop:advisor>的含义就是将哪个Advice应用到约定的范围(即Pointcut指定的)上去
-->
<aop:advisorid="daoAdvice"pointcut-ref="allManagerMethod"
advice-ref="txAdvice"/>
</aop:config>
</beans>