1)ActionServlet
ActionServlet是Javax.servlet.http.HttpServlet的子类,是Struts框架的主控制器,根据用户的请求和配置文件和描述将请求转发给相应的Action,Servlet必须在HttpApplication的Web.xml的配置文件中声明,因此在Struts中同样也在Web.xml中对ActionServlet进行了配置:
actionorg.apache.struts.action.ActionServlet
config
/WEB-INF/struts-config.xml
debug
3
detail
3
0
action
*.do
ActionServlet会匹配所有的以.do结尾的请求,并读取配置文件里配置的Config对应的Struts的配置文件中的Action,从而将请求转交给对应的Action调用相应的业务处理方法进行处理。
2)Action
当ActionServlet得到用户的请求后,将请求转发给Action,然后由Action调用相应的业务逻辑处理方法进行处理。
3)ActionMapping
当Action进行业务处理后会返回一个ActionMapping的对象,该对象包含了Action的请求对象,决定WebContainer该返回个对象给用户。
4)ActionForm
当ActionServlet接收到用户的请求时,会根据struts-config.xml描述将数据封装到相应的ActionForm中,然后由Action根据struts-config.xml的描述读取相应的ActionForm中的数据,进行处理,将处理后的结果返回给用户。
5)标签库
Struts提供了功能强大的标签库,只有充分使用这些标签才能最大限度发挥Struts的作用,真正实现MVC模式。
有了这些标签库开发人员无需在JSP页面添加任何的Java脚本就可以实现非常复杂的逻辑处理,从而实现了开发人员的美工人员的工作的分离。
减少了美工人员的难度。
2.2.2Struts的工作过程
图2-2
Struts的工作过程如图2-2,当用户向WebServer发出请求时,WebServer将请求转交给ActionServlet,由Servlet决定调用哪些Action,然后根据Struts-config.xml的配置对应相应的Form来读取数据,并调用相应的业务逻辑处理方法进行处理,然后将处理后的结果传递到JSP提供给用户。
2.3Struts的国际化
在过去,软件开发者在开发应用程序时,将注意力集中于实现具体的业务逻辑。
软件面向的用户群是固定的,软件只需要支持一种语言,但是随着跨国业务的迅猛发展,需要同一软件能同时支持多种语言。
对于一个已经开发好的软件如果要支持新的语言就要对软件进行国际化。
国际化指的是在软件设计阶段就应该使软件具有支持多种语言和地区的功能。
这样,当需要在应用中添加对一种新的语言和国家的支持时,不需要对已有的软件进行重新编码。
一个应用程序支持国际化应该具备以下特征:
1)当应用程序需要支持一种新的语言时无需修改源码。
2)应用程序中的文本及图片资源从代码中分离出来,存储在外部。
3)根据用户的语言和地理位置进行正确的格式化。
4)可以方便快捷地对应用做出调整,使它适应新的语言和地区。
Struts对国际化的支持体现在能够输出和用户Locale相符合的文本和图片上。
当Struts配置文件的元素的Local属性为True时,Struts框架把用户的Locale实例保存在Session范围内,宁产,Struts框架能自动根据这一Locale实例来从ResourceBundle中选择合适的资源文件,当用户的Locale为英文时,Struts框架就会向用户返回来自于Application_en.properties文件的文本内容,当用户的Locale为中文时,Struts框架就会向用户返回来自于Application_ch_properties文件的文本内容。
第三章 Hibernate框架介绍
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲地使用面向对象编程思维来操纵数据库,Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序中使用,也可以在Servlet/JSP的Web应用中使用。
Hibernate的作用就是介于Java与JDBC之间的一个持久层,它通过建立与数据库表之间的映射来操纵数据库,Hibernate是基于JDBC之上的。
3.1数据库操作的3个阶段
1)JDBC操作阶段
在使用Java进行数据库开发的最初数据库开发的最初阶段,都是使用JDBC类来操作数据库的:
Stringsql=“select*fromuserwhereusername=’”+username+”’andpassword=’”+password+”’”。
Try{
Class.forName(“com.mysql.jdbc.Driver”>.newInstance(>。
Connectionconn=DriverManager.getConnection(“jdbc:
mysql:
//localhost:
3306/OA”,”root”,”root”>。
Statementstmt=conn.createStatement(>。
ResultSetrs=stmt.executeQuery(sql>。
While(rs.next(>>{
System.out.println(rs.getString(1>>。
}
}catch(Exceptione>{
e.printStackTrace(>。
}finally{
Rs.close(>。
Stmt.close(>。
Conn.close(>。
}
这一段操作代码很具有代表性,几乎所有的使用JDBC进行数据库操作的代码都需要开发如下过程的代码:
定义查询或更新的SQL语句;
加载数据库驱动程序;
创建数据库连接;
创建申明对象;
执行查询或更新;
关闭结果集对象,申明对象,数据连接对象。
使用这种方法的缺点是:
代码重用度小,数据库处理的代码过多,不能突出业务处理逻辑。
2)封装JDBC的阶段
为了改进JDBC操作的不足,我们可以将JDBC的不同操作封装成不同的函数。
PublicBooleancreateConn(>:
加载驱动程序,创建连接对象
PublicBooleanupdate(Stringsql>:
执行更新操作
Publicvoidquery(Stringsql>:
执行查询操作
Publicvoidclosers(>:
关闭结果集对象
PublicvoidcloseStm(>:
关闭申明对象
PublicvoidcloseConn(>:
关闭连接对象
这样我们就可以直接调用这些函数来创建数据连接,这样就避免了以上不足,实现了对JDBC封装,并能够对JDBC事务进行管理。
并且在这个基础上,可以通过配置连接池来减少对数据库操作的时间。
3)ORM阶段
在对JDBC进行封装之后,能够方便地实现数据库的操作,但是,在面向对象的编程开发中,数据库的操作与普通的面向对象的Java代码不同,而ORM则是减少了这种区别。
真正实现了数据库操作的对象化。
3.2ORM对象关系映射
ORM是ObjectRelationalMapping的简称,即对象关系映射,它是一种为了解决面向对象与关系数据库存在的不匹配的技术,ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中,实际上就是将Java中的Class与数据库中的Table对应起来。
关系图如图3-1:
图3-1
图中依次包含了数据实体的3种不同表示形式,即数据实体,数据表,映射对象。
用户实体是数据库概念设计阶段的产物,表示在系统设计的最初阶段所抽象的基本数据对象,每一个数据实体都包含一些信息段。
将数据实体映射为数据表,信息映射为数据表的字段,就形成了数据库中的可表示的对象——数据表。
数据表由表名和字段表示基本的信息。
映射对象是普通的Java类,它用Java类来代表数据实体,类名与表名对应,属性名与表的字段对应,ORM就是数据表与映射对象之间的映射关系。
3.3Hibernate介绍及工作过程
3.3.1Hibernate的组成
Hibernate是一个实现了ORM映射的开发框架,主要实现数据库表与Class的映射。
主要组成部分有:
对应每个数据库表有一个对应的hbm.xml文件和持久化类以及对数据库进行操作的DAO类,Hibernate有一个Hibernate.cfg.xml文件,用来描述数据库的连接信息以及关联这些hbm.xml配置文件,在Hibernate中利用一个Factory辅助类来获得与数据库之间的会话和面向用户的Servers层。
1>Hibernate配置文件
Hibernate的数据库连接信息是从配置文件中加载的,这要增加了Hibernate和数据库连接信息的灵活性,在配置文件中包含了一系列属性的配置,Hibernate将根据这些属性来连接数据库。
Hibernate的配置文件有两种形式:
一种是XML格式的文件,一种是Properties属性文件。
2)映射文件.hbm.xml
Hibernate映射文件包含了对象/关系映射元数据包含持久化类的声明和属性到数据库的映射<指向字段和其他实体的外键关联)。
映射文件是XML格式的文件,它负责持久化类与数据库表之间的映射。
其根元素是Hibernate-mapping,并通过属性Package指定类所在的包。
每一个表使用一个Class定义,Name表示类的名称,Table表示关联的表名,通过Property子元素来映射类的变量名与数据库表字段名之间的映射。
3)持久化类
持久化类是指其实例需要被Hibernate持久化到数据库中的类。
持久化类通常都是域模型中的实体或类,一般都是一张数据库表对应一个持久化类。
但并不是所有的持久化类的实例都是持久化状态。
Hibernate使用简单的Java对象4)辅助类:
HibernateSessionFactry
Hibernate的Session是一个持久化管理器,我们通过它来从数据库中存取数据,我们需要通过SessionFactory获取一个Session:
SessionFactorysessionFactory=newConfiguration(>.configure(>.buildSessionFactory(>。
通过对Configure(>的调用来装载Hibernate.cfg.xml配置文件,并初始化成一个Configuration实例,然后通过这个实例来获得Session的一个生成器。
通过Session我们就可以进行和数据库之间的会话。
5)DAO类:
DAO类存在于Project的DAO层,就是数据访问接口,为了基于Hibernate的开发中,通常将业务层与数据层分开,DAO层只负责调用HibernateAPI实现对数据库的操作,Servers层面向用户负责调用DAO层的代码,这样数据层的代码不用关心业务服务,可以更好的实现移植。
6)Servers层:
Servers层即服务层,就是面向用户服务,它定义的方法都是与实际的业务相关的,通过调用DAO层的方法来实现与数据库的交互。
3.3.2Hibernate的工作过程
当需要与数据库进行的交互时,用户将需要处理的数据封装到数据持久化类,但这是这个类并没有被持久化,通过Hibernate的Transction接口开启事务处理过程,将含有数据的类持久化,即与数据库中的数据建立映射关系,然后通过Transction的Commit方法将持久化类中的数据与数据库中的数据进行同步,然后关闭会话Session,此时,实例化对象的状态由持久转变为脱管,Hibern