欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Struts Spring Hibernate学习杂记

程序员文章站 2022-04-12 16:04:58
...

Struts Spring Hibernate学习杂记

Web应用程序框架统一体:PHP、ASP → Struts → JSF、Shale → Ajax
从左至右与常规桌面应用程序相似度依次提高。

 


 

Struts:


Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate

Struts将用户表单使用FormBean打包,根据struts-config.xml里面mapping的配置送入ActionServlet,ActionServlet决定自己处理或者分发给更单一任务的Action处理。
事实上Struts的贡献主要在表示层上,对于用户输入的数据它可以很方便地进行前期处理,比如包装和验证。控制器继承Action父类,重载ActionForward方法就可以轻松实现请求转发。

 

FormBean通常是最普通的实体类,也就是说,Struts对Model层没什么贡献。
Action是无状态的,不许用它来保存数据资源。Struts管理着Action子类的创建,并且它们是被pool化了的,以便通过重用来提高服务的效率,因此不要使用实例变量。

validate()表单验证示例:
先在struts-config.xml的action-mappings里面设置:

<action
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
attribute="TestForm"
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernatename
="TestForm"
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernatepath
="/test"
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernatevalidate
="true"
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernatescope
="request"
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernatetype
="org.springframework.web.struts.DelegatingActionProxy"
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateinput
="error.jsp"
/>

然后在validate()方法里面设定

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateerrors.add(ActionErrors.GLOBAL_MESSAGE,newActionMessage(“form.err.xxxerror”));

再配置资源文件,最后在error.jsp里面添加标签<html:errors/>。

reset()方法:在每次填充FormBean之前调用,加上所有属性赋空值的语句,以保安全。

 



Spring:
Spring是一个从实际项目开发经验中抽取的,可高度重用的应用框架。

 


Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate

由applicationContext.xml来决定由哪一个类来实现父类接口。
这个接口可以手动来实现(我就实现了一次),引入spring.jar这个包以后,也可以用:

org.springframework.web.struts.DelegatingActionProxy

Spring不需要实现任何框架的制定接口,能够轻松将组件从Spring中脱离,而且,组件之间依赖关系减少,重用性增加。最后还有一个很大的好处:面向接口编程。

Spring的两个精髓结构就是控制反转(IoC)和依赖注入(DI)。IoC:由容器控制程序之间的关系,而非代码。DI:组件之间的依赖关系由容器在运行时期决定(由容器动态地将某种依赖关系注入到组件之中),目标是提升组件的重用率。

Spring在数据持久层也有杰出的贡献,它有两点显著优势:“可以将任意Java类纳入事务管理”和“事务管理并不依赖特定的事务资源”。当然这一次我更关注的是持久层的封装,即它和Hibernate的整合。

 


 

Spring和Struts的整合(SS):
Struts将Action管理权完全交给了Spring,由是,Action与Form都可以等价地视为Spring的Bean。不过,看起来Spring基本不对Struts中的Form有任何处理操作。无论如何,将Action视为Bean,与其他Bean放到一起统一管理,它就可以享受Spring提供的所有服务(依赖注入、实例管理、事务管理等)。


Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate

Jsp的表单由Struts负责打包,根据struts-config.xml中的信息打包成FormBean,传给接口,然后由Spring根据applicationContext.xml决定采取哪个子类来实现。

具体二者结合的主流方法有两个:1、利用第三方框架的扩展点,实现加载Spring的IoC容器,如:plugin扩展(我用的就是这个方法)。2、web.xml中定义Listener或者Servlet,让web应用程序一启动就自动加载Spring的IoC容器。

 


 

Hibernate

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate

Hibernate解决或减轻了很多以往传统JDBC遗留的问题,比如代码繁琐、多表连接问题、表间级联问题、层间耦合严重等。
Hibernate是一个OR mapping的工具,是一个轻量级的框架,它使得程序员不必关心数据库的具体内容,而只需专注于持久层之上完全面向对象的业务逻辑。

hibernate.cfg.xml配置数据库。表test和抽象类AbstractTest通过Test.hbm.xml关联。Test类是个继承AbstractTest的POJO。TestDAO为关于Test的数据库访问操作提供了一些便捷的方法,它扩展自BaseHibernateDAO。BaseHibernateDAO返回从HibernateSessionFactory获取的会话,而从会话中可以获得事务。IBaseHibernateDAO是BaseHibernateDAO的接口。HibernateSessionFactory是会话工厂,负责会话的产生、关闭等。

某一次数据库访问的过程:获得一个TestDAO对象,根据这个TestDAO获取session,并且由此session获得transaction。再由TestDAO提供的一组方法将操作记入transaction,提交事务,关闭会话。

 


 

Struts+Spring+Hibernate和整合(SSH)
表示层:Struts 业务层:Spring 持久层:Hibernate
SS已经集成,Hibernate和Struts由于是表示层和持久层的关系,相互并不直接交互,之间的整合没有什么问题。

Hibernate和Spring的集成关键就在于配置一个sessionFactory的bean即可。而Hibernate其他类中的大部分,也应该让Spring来统一管理。

遇到的问题:
不知道为什么使用Eclipse建立Hibernate框架时,Eclipse无法发现已经存在的这个spring配置文件,害我手动添加。另一方面,我配置的SSH还是用到了hibernate.cfg.xml,将这个文件和applicationContext.xml关联起来,而一些更官方的说法应该是没有hibernate.cfg.xml的,因为其中的配置项都放到applicationContext.xml中了。

 


 

资源文件:
强烈建议配置好.properties资源文件,这是避免代码中出现资源字符串,提高移植能力的最好办法。与之类似的一个事情就是mapping.forward()方法里面的参数也要在struts-config.xml的global-forwards标签中配置好。当然,只有在标签库的标签才可以配合使用资源文件。
汉字必须转换成ascII码才能存入资源文件,JDK提供了一个工具,叫native2ascii,用法如下:
native2ascii ChineseInfo.txt target.txt

 


 

标签属性值动态设置:
在jsp中动态改变标签库中的标签属性值,参考如下:

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate<html:radiovalue="<%=String.valueOf(((News)newsList.get(i)).getId())%>"property="ID">
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
<%=((News)newsList.get(i)).getTitle()%>
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
</html:radio>

遇到的问题:
如果使用bean:message标签从资源文件里面取字符串,这样的动态方法就不行了,如:

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate<bean:messagekey="news.importance.<%=String.valueOf(news.getImportance())%>"/>

解决方案:
将属性key的值完全构造完毕以后,一次显示,而不要在标签内连结字符串:

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateStruts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate<%......Stringimportance="news.importance."+news.getImportance();%>
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
<bean:messagekey="<%=importance%>"/>

 


中文问题:
我解决中文问题的方法有四步。
第一, jsp页面contentType="text/html;charset=GBK"。
第二, web.xml里设置一个CharacterEncodingFilter,它对应的类实现javax.servlet.Filter接口,添加语句:

 

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernaterequest.setCharacterEncoding("gbk");
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernatechain.doFilter(request,response);

对所有请求(/*)进行过滤操作。
第三, 在连接数据库的语句后绑定传入参数:jdbc:mysql://localhost:3306/test?characterEncoding=gbk
第四, 数据库设置字符集为gbk。

DAO和HQL:
在DAO里面写HQL语句时,可以用后置参数的方法来保证语句的连贯性:

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateStringqueryString="fromNewsasmodelwheremodel."+propertyName+"=?";//预留参数用问号代替
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
QueryqueryObject=getSession().createQuery(queryString);
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernatequeryObject.setParameter(
0,value);//这里放置参数

上面的问号也可以用冒号加语句外的变量名代替,这样就相当于后置参数了。
DAO里写的方法不要放任何和事务相关的操作,让事务的获取、开始和提交都放到Action里面去,否则不统一就有可能产生两次提交事务的异常。

 



Blob:
Blob采用单字节存储,适合保存二进制数据;Clob采用多字节存储,适合保存大型文本数据。
Struts的文件上传和Blob的使用:

 

1、OR映射:实体类News设属性private Blob picture,News.hbm.xml的hibernate-mapping标签里面设置

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate<propertyname="picture"type="blob">
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
<columnname="picture"/>
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
</property>

2、jsp里面:设置

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate<html:formaction="/addNews"enctype="multipart/form-data">
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
<html:fileproperty="picture"maxlength="1000000">
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
</html:file>
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
</html:form>

遗憾的是,这个标签库并没有提供限定上传文件类型的属性,当然可以使用脚本在客户端限定上传文件的类型:选择文件后,用触发onchange事件判断file文件的后缀名。

3、对应的FormBean:

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateimportorg.apache.struts.upload.FormFile
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
//属性声明:
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
privateFormFilepicture。

4、Action里面:

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate//先获取FormFile对象:
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
FormFilepicture=addNewsForm.getPicture();
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
//然后取得输入流:
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
InputStreampicIS=picture.getInputStream();
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
//再用Blob包装(整个流的读入过程都被透明化了)
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
BlobpicBlob=Hibernate.createBlob(picIS);
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
//最后保存进对象:
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
news.setPicture(picBlob);
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernatenews.save();

5、从数据库中取出文件:

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateBlobpicBlob=news.getPicture();
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateInputStreamis
=picBlob.getBinaryStream();
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateFileOutputStreamfos
=newFileOutputStream("XXX.jpg");
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
byte[]buf=newbyte[10000];
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
intlen;
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateStruts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
while((len=is.read(buf))!=-1)...{
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernatefos.write(buf,
0,len);
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate}

 


 

JUnit:
JUnit 是一个集成测试工具,能实现测试的自动化。
如果你要写一段代码:
先用 JUnit 写测试,然后再写代码。
写完代码,运行测试,测试失败。
修改代码,运行测试,直到测试成功。
这就是JUnit的测试思想。XP 中推崇的test first design就是基于以上技术。
“先写测试,再写代码”的好处:
1、从技术上强制你先考虑一个类的功能,也就是这个类提供给外部的接口,而不至于太早陷入它的细节。这是面向对象提倡的一种设计原则。
2、好的测试可以产生一个好的文档。特别的,如果你拿到别人的一个程序,对他写测试是了解这个程序功能的很好方法。xp的原则是make it simple,不是很推荐另外写文档。
3、需求变动可能会带来其他地方的错误。为此,除了设计好的结构以分割项目外(松耦合),如果有了测试,并已经建立了一个好的测试框架,对于需求的变动,可以即错即改,即地修改,非常方便。

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateStruts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernatepublicclassSayHelloTestextendsTestCase...{
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateStruts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
publicvoidtestSayHello()...{
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateSayHellosayHello
=newSayHello();
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateassertEquals(
"Hello,world!",sayHello.sayHello());
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
//assertTrue(arg0,arg1)
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
//assertFalse(arg0,arg1)
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
//assertNotNull(arg0,arg1)
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
//assertNull(arg0,arg1)
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
//assertSame(arg0,arg1)
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
//assertNotSame(arg0,arg1)
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
}

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateStruts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
/**//*
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate在Eclipse中以JUnit的方式运行,不用写别的代码了,eclipse会自动找到TestCast并执行
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate如果想用Application的方式执行,则要写如下代码:
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernatepublicstaticvoidmain(String[]args){
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernatejunit.textui.TestRunner.run(DbCheckTest1.class);
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate//有3种界面可选swingui,awtui,textui
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate}
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
*/

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate}

如果要用test suite:

Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateStruts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernatepublicstaticTestsuite()...{
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernateTestSuitesuite
=newTestSuite("Testforcom.XY.junit");
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
//$JUnit-BEGIN$
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
suite.addTestSuite(SayHelloTest.class);
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
//$JUnit-END$
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
returnsuite;
Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate}

 


 

SSH的核心在于Spring的IoC模式,它可以统一管理各层,而又使得各层松散地耦合在一起,各层之间实现最大的解耦性,这也是web统一架构的追求。
在学习这些东西的时候,我认为最重要的是要理解其原理,包括架构、流程,以及一些精巧的构思,而不是钻在某个具体类方法或者某种IDE的便捷途径上。

 

文章系本人原创,转载请注明作者和出处

  • Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
  • 大小: 12.9 KB
  • Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
  • 大小: 18.6 KB
  • Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
  • 大小: 23.8 KB
  • Struts Spring Hibernate学习杂记
            
    
    博客分类: Framework SSHSpringStrutsHibernate
  • 大小: 15.9 KB