Struts Spring Hibernate学习杂记
Web应用程序框架统一体:PHP、ASP → Struts → JSF、Shale → Ajax
从左至右与常规桌面应用程序相似度依次提高。
Struts:
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
attribute="TestForm"
name="TestForm"
path="/test"
validate="true"
scope="request"
type="org.springframework.web.struts.DelegatingActionProxy"
input="error.jsp"
/>
然后在validate()方法里面设定
errors.add(ActionErrors.GLOBAL_MESSAGE,newActionMessage(“form.err.xxxerror”));
再配置资源文件,最后在error.jsp里面添加标签<html:errors/>。
reset()方法:在每次填充FormBean之前调用,加上所有属性赋空值的语句,以保安全。
Spring:
Spring是一个从实际项目开发经验中抽取的,可高度重用的应用框架。
由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提供的所有服务(依赖注入、实例管理、事务管理等)。
Jsp的表单由Struts负责打包,根据struts-config.xml中的信息打包成FormBean,传给接口,然后由Spring根据applicationContext.xml决定采取哪个子类来实现。
具体二者结合的主流方法有两个:1、利用第三方框架的扩展点,实现加载Spring的IoC容器,如:plugin扩展(我用的就是这个方法)。2、web.xml中定义Listener或者Servlet,让web应用程序一启动就自动加载Spring的IoC容器。
Hibernate
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中动态改变标签库中的标签属性值,参考如下:
<html:radiovalue="<%=String.valueOf(((News)newsList.get(i)).getId())%>"property="ID">
<%=((News)newsList.get(i)).getTitle()%>
</html:radio>
遇到的问题:
如果使用bean:message标签从资源文件里面取字符串,这样的动态方法就不行了,如:
<bean:messagekey="news.importance.<%=String.valueOf(news.getImportance())%>"/>
解决方案:
将属性key的值完全构造完毕以后,一次显示,而不要在标签内连结字符串:
<%......Stringimportance="news.importance."+news.getImportance();%>
<bean:messagekey="<%=importance%>"/>
中文问题:
我解决中文问题的方法有四步。
第一, jsp页面contentType="text/html;charset=GBK"。
第二, web.xml里设置一个CharacterEncodingFilter,它对应的类实现javax.servlet.Filter接口,添加语句:
request.setCharacterEncoding("gbk");
chain.doFilter(request,response);
对所有请求(/*)进行过滤操作。
第三, 在连接数据库的语句后绑定传入参数:jdbc:mysql://localhost:3306/test?characterEncoding=gbk
第四, 数据库设置字符集为gbk。
DAO和HQL:
在DAO里面写HQL语句时,可以用后置参数的方法来保证语句的连贯性:
StringqueryString="fromNewsasmodelwheremodel."+propertyName+"=?";//预留参数用问号代替
QueryqueryObject=getSession().createQuery(queryString);
queryObject.setParameter(0,value);//这里放置参数
上面的问号也可以用冒号加语句外的变量名代替,这样就相当于后置参数了。
DAO里写的方法不要放任何和事务相关的操作,让事务的获取、开始和提交都放到Action里面去,否则不统一就有可能产生两次提交事务的异常。
Blob:
Blob采用单字节存储,适合保存二进制数据;Clob采用多字节存储,适合保存大型文本数据。
Struts的文件上传和Blob的使用:
1、OR映射:实体类News设属性private Blob picture,News.hbm.xml的hibernate-mapping标签里面设置
<propertyname="picture"type="blob">
<columnname="picture"/>
</property>。
2、jsp里面:设置
<html:formaction="/addNews"enctype="multipart/form-data">
<html:fileproperty="picture"maxlength="1000000">
</html:file>
</html:form>
遗憾的是,这个标签库并没有提供限定上传文件类型的属性,当然可以使用脚本在客户端限定上传文件的类型:选择文件后,用触发onchange事件判断file文件的后缀名。
3、对应的FormBean:
importorg.apache.struts.upload.FormFile
//属性声明:
privateFormFilepicture。
4、Action里面:
//先获取FormFile对象:
FormFilepicture=addNewsForm.getPicture();
//然后取得输入流:
InputStreampicIS=picture.getInputStream();
//再用Blob包装(整个流的读入过程都被透明化了)
BlobpicBlob=Hibernate.createBlob(picIS);
//最后保存进对象:
news.setPicture(picBlob);
news.save();
5、从数据库中取出文件:
BlobpicBlob=news.getPicture();
InputStreamis=picBlob.getBinaryStream();
FileOutputStreamfos=newFileOutputStream("XXX.jpg");
byte[]buf=newbyte[10000];
intlen;
while((len=is.read(buf))!=-1)...{
fos.write(buf,0,len);
}
JUnit:
JUnit 是一个集成测试工具,能实现测试的自动化。
如果你要写一段代码:
先用 JUnit 写测试,然后再写代码。
写完代码,运行测试,测试失败。
修改代码,运行测试,直到测试成功。
这就是JUnit的测试思想。XP 中推崇的test first design就是基于以上技术。
“先写测试,再写代码”的好处:
1、从技术上强制你先考虑一个类的功能,也就是这个类提供给外部的接口,而不至于太早陷入它的细节。这是面向对象提倡的一种设计原则。
2、好的测试可以产生一个好的文档。特别的,如果你拿到别人的一个程序,对他写测试是了解这个程序功能的很好方法。xp的原则是make it simple,不是很推荐另外写文档。
3、需求变动可能会带来其他地方的错误。为此,除了设计好的结构以分割项目外(松耦合),如果有了测试,并已经建立了一个好的测试框架,对于需求的变动,可以即错即改,即地修改,非常方便。
publicclassSayHelloTestextendsTestCase...{
publicvoidtestSayHello()...{
SayHellosayHello=newSayHello();
assertEquals("Hello,world!",sayHello.sayHello());
//assertTrue(arg0,arg1)
//assertFalse(arg0,arg1)
//assertNotNull(arg0,arg1)
//assertNull(arg0,arg1)
//assertSame(arg0,arg1)
//assertNotSame(arg0,arg1)
}
/**//*
在Eclipse中以JUnit的方式运行,不用写别的代码了,eclipse会自动找到TestCast并执行
如果想用Application的方式执行,则要写如下代码:
publicstaticvoidmain(String[]args){
junit.textui.TestRunner.run(DbCheckTest1.class);
//有3种界面可选swingui,awtui,textui
}
*/
}
如果要用test suite:
publicstaticTestsuite()...{
TestSuitesuite=newTestSuite("Testforcom.XY.junit");
//$JUnit-BEGIN$
suite.addTestSuite(SayHelloTest.class);
//$JUnit-END$
returnsuite;
}
SSH的核心在于Spring的IoC模式,它可以统一管理各层,而又使得各层松散地耦合在一起,各层之间实现最大的解耦性,这也是web统一架构的追求。
在学习这些东西的时候,我认为最重要的是要理解其原理,包括架构、流程,以及一些精巧的构思,而不是钻在某个具体类方法或者某种IDE的便捷途径上。
文章系本人原创,转载请注明作者和出处
- 大小: 12.9 KB
- 大小: 18.6 KB
- 大小: 23.8 KB
- 大小: 15.9 KB
分享到:
相关推荐
Struts Hibernate Spring Ajax Struts Hibernate Spring Ajax
struts spring hibernate 登陆 SSH整合分页功能 SSH整合分页struts spring hibernate 登陆 SSH整合分页功能 SSH整合分页struts spring hibernate 登陆 SSH整合分页功能 SSH整合分页
Struts2 Spring Hibernate IBatis Struts2 Spring Hibernate IBatisStruts2 Spring Hibernate IBatisStruts2 Spring Hibernate IBatis 只需要导入相应的jar包就行了 ,数据库是mysql :数据库名叫做mydatabase,表名...
《Spring+Struts+Hibernate整合开发》是一本深入讲解企业级Java应用开发的书籍,它主要聚焦于三大著名开源框架——Spring、Struts和Hibernate的集成与应用。这些框架是Java Web开发中的基石,广泛应用于各种复杂的...
struts spring hibernate 帮助文档 chm struts spring hibernate 帮助文档 chm struts spring hibernate 帮助文档 chm struts spring hibernate 帮助文档 chm
《图书管理系统spring+struts+hibernate》是一款基于Java技术栈开发的图书管理软件,其核心框架包括Spring、...对于学习和理解Java Web开发,特别是Spring、Struts和Hibernate的集成应用,这是一个很好的实践案例。
【标签】"互相学习"表明这个项目可能是为了学习和分享目的而创建的,开发者或分享者希望通过这个项目帮助其他人理解如何在实际项目中整合和使用Struts、Spring和Hibernate这三个框架。 综上所述,"Struts Spring ...
在本章中,我们将深入探讨如何开发一个基于Struts、Spring、Hibernate和Ajax的网上信息发布平台。这四个技术是Java Web开发中的核心组件,它们各自承担着不同的职责,共同构建了一个强大而灵活的后端架构。 **...
Struts、Spring 和 Hibernate 是三个著名的 Java 开发框架,它们分别负责不同的职责。Struts 是一个 MVC(Model-View-Controller)框架,主要用于构建 web 应用的控制层,简化了Servlet和JSP的开发。Spring 是一个...
struts spring hibernate整合(二) struts spring hibernate整合(二)struts spring hibernate整合(二)
struts spring hibernate整合(三) struts spring hibernate整合(三) struts spring hibernate整合(三)
根据提供的标题、描述、标签及部分内容,我们可以总结出以下与Java、Java EE、Struts2、Spring、Hibernate相关的学习知识点: ### Java基础 - **Java语言特性**:介绍Java的基本语法,包括变量、数据类型、流程...
struts spring hibernate 登陆 SSH整合登陆功能struts spring hibernate 登陆 SSH整合登陆功能struts spring hibernate 登陆 SSH整合登陆功能
Java.Web开发 JSP Servlet. Struts Spring Hibernate Ajax
SSH整合,全称为Struts、Spring和Hibernate的集成,是一种常见的Java Web开发框架组合,用于构建高效、可维护的企业级应用程序。在这个例子中,我们看到的是一个基于SSH的用户注册功能的实现,使用的开发工具是...
对 struts spring hibernate 的整合 自己整理
整合Struts、Spring和Hibernate,虽然会增加一定的学习和配置成本,但其所带来的收益是显而易见的。这种整合不仅能够提升应用的性能和可扩展性,还能够简化开发流程,减少代码冗余,最终帮助开发团队构建出高质量、...
Struts、Spring和Hibernate是Java开发中的三大框架,它们分别负责MVC模式的视图、控制和持久化层。这篇文章将介绍如何将这三个框架整合在一起,以实现一个基础的用户登录和注册功能,并且自定义了一个显示所有用户...
一个spring+struts+hibernate的例子,是eclipse的工程,用tomcat5和mysql,文件夹下包含所有的源码和库,另外还有一个.sql的文件用于建立数据库。大家觉得它有什么不好,欢迎交流
Struts、Spring、Hibernate,这三大框架是Java Web开发中的基石,它们的集成极大地提高了开发效率,降低了代码的复杂性。SSH(Struts + Spring + Hibernate)框架集成旨在实现MVC(Model-View-Controller)设计模式...