计算机网络,利用开源框架Struts+Hibernate实现Web应用程序

2016-11-12

一、概述

大多数Web应用在职责上至少可被分成四层,表示层、持久层、业务层和域模块层,每一层相互独立,在功能上与其他层互不混合,这样为程序的后期维护及扩充提供了方便,而在Web应用的分层设计中,MVC模式成为一种十分流行的结构,Struts则是MVC模式的一种具体实现,他让开发人员可以把主要精力集中在如何解决实际业务处理问题上,同时Struts框架也允许开发人员根据实际需求进行扩展和定制,从而更好地适应用户的需要。在数据持久层上,Hibernate是目前最好的框架之一,Hibernate不仅管理Java类到数据库表的映射,还提供数据查询和获取数据的方法,可以大幅减少开发时人工使用SQL和JDBC处理数据的时间。Struts架构与Hibernate相结合实现Web应用已成为Web Service十分流行的解决方案。下面我们将简要介绍一下采用Struts+Hibernate实现Web应用的主要方法。

二、数据库设计及持久化

大多数Web应用都要涉及到数据库,数据库的设计是系统设计首先要考虑的问题,数据库设计得是否合理对系统的设计有着直接的影响,数据库如果设计的不好,有可能会使整个系统在最后阶段推倒重建。这里我们不打算详细讨论数据库的设计细节,只要遵循一般的数据库设计原则即可。包括找出所有实体,建立关系,画ER图,建立数据库表等。持久化是通过Hibernate来实现的,Hibernate对数据库的增加、删除、更新、查找操作进行了封装,使程序员可以使用面向对象的方式来设计程序,而不用为写大量的SQL语句而苦恼。因此我们需要建立相应的配置文件来帮助程序完成数据持久化,其中包括一个Hibernate基本配置文件和若干个数据库表与基本Java类对应的配置文件,以用户登录系统为例,二配置文件主要内容如下:

hibernate.cfg.xml:(使用Mysql数据库)

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE hibernate-configuration

PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"

"//hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

<property name="hibernate.connection.url">jdbc:mysql:///user</property>

<property name="hibernate.connection.username">root</property>

<property name="hibernate.connection.password"></property>

<property name="hibernate.connection.pool_size">100</property>

<property name="dialect"> org.hibernate.dialect.MySQLDialect</property>

<!-- Mapping files -->

<mapping resource="user.hbm.xml"/>

</session-factory>

</hibernate-configuration>

User.hbm.xml:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 2.0//EN"

"//hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >

<hibernate-mapping>

<class

name=" hibernate.User"

table="user"

> <id

name="id"

type="java.lang.String"

column="id"

> <generator class="assigned" />

</id>

<property

name="name"

type="java.lang.String"

column="name"

not-null="true"

length="20"

/>

<property

name="psw"

type="java.lang.String"

column="psw"

not-null="true"

length="20"

/>

</class>

</hibernate-mapping>

三、视图(View)组件的实现

当用户提交表单时(如当用户登录时)Struts会把请求参数封装到动作表单(Form Bean)里,所以我们需要建立一个动作表单类,它继承ActionForm类,这个表单类实际上是一个JavaBean,类中需要创建与HTML提交表单中字段对应的相同名称的属性,并创建每一个属性的set和get方法,如登录表单中有用户名(name)和密码(psw)两个字段,则在表单类中应创建与之对应的属性name和psw,同时创建对应的方法setName()、getName()、setPsw()、getPsw(),另外还可以有Validate方法对输入字段进行验证。

其他的视图页面文件只需使用简单的Jsp文件即可。

四、控制器(Control)组件的实现

控制器是Struts的核心,主要负责接受客户端的HTTL请求,更新属性以及生成Jsp页面呈现在客户端浏览器上,它位于试图组件(V)与模型组件(M)之间,将二者有机地联系起来,发挥协调作用。控制器组件的核心是一个Action类,它主要负责访问业务逻辑层,类中的execute方法负责处理用户的请求,所以我们主要的工作就是改写execute方法,在其中添加相关的业务逻辑处理代码。

五、配置struts-config.xml与Web.xml文件

在设计完数据层、视图层和控制层后,还要对struts-config.xml与Web.xml文件进行配置,struts-config.xml文件是MVC各层联系的纽带,它主要定义了form表单的名称及对应的具体类,配置了与表单对应的处理Action类及执行后转发的页面,配置了请求范围和错误提示页面等。只有一个登录模块的struts-config.xml文件可能会象下面这样:

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"

"//jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>

<form-beans>

<form-bean type="form.LoginActionForm" name="loginActionForm"/>

</form-beans>

<action-mappings>

<!-- *************** login **************** -->

<action path="/login"

type="action.LoginAction"

name="loginActionForm"

scope="request"

input="/login.jsp">

<forward name="success" path="/main.jsp"/>

</action>

……

</struts-config>

Web.xml是一个通用的配置文件,适用于所有Web应用,它主要配置了ActionServlet的声明和初始化,系统启动是创建Servlet的实例数目,系统初始化参数配置,默认显示的页面等。鉴于篇幅具体文件内容在此省略。

六、中文问题

由于浏览器与Java采用的字符编码不同,所以在进行中文存储与显示时常出现乱码,常用的解决方法是编写一个过滤器组件,进行编码的转换,然后在Web.xml文件中对过滤器进行配置。

七、其他问题

由于数据源的多样性,如:Oracle,MySQL,SQL Server等,一旦数据源发生变化,或将来由于某种原因而不再使用Hibernate,在数据层会有较大改动,为保证系统的灵活性,通常的做法是在数据层使用DAO模式,即在业务核心方法与具体数据源之间再增加一层,用这一层来连接业务逻辑与数据源,实现二者的解藕。

八、结束语

通过对一个通用的Web应用程序的设计,我们可了解使用Struts+Hibernate框架设计Web应用系统的一般过程,表面看来使用Struts+Hibernate框架比单独使用Jsp+JavaBean方式还要复杂,但这样做的好处也显而易见,那就是设计的程序层次清晰,程序的可维护性与可扩充性大大加强,各层次间的耦合性非常小,将来一旦有需求变化,可以很容易更改。我想在程序设计的初期多做一些工作来换取程序良好的可维护性、可扩充性及可移植性是值得的。

更多相关阅读

最新发布的文章