QQK's profileQQK的空间BlogListsNetwork Tools Help

Blog


    April 15

    C/S 与 B/S 区别

    C/S 与 B/S 区别
    Client/Server是建立在局域网的基础上的,Browser/Server是建立在广域网的基础上的。
    (1)、硬件环境不同:
    C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务。
    B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例如电话上网, 租用设备, 信息自己管理, 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行。
    (2)、对安全要求不同
    C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强。 一般高度机密的信息系统采用C/S 结构适宜,可以通过B/S发布部分可公开信息。
    B/S 建立在广域网之上, 对安全的控制能力相对弱, 面向是不可知的用户群。
    (3)、对程序架构不同
    C/S 程序可以更加注重流程,可以对权限多层次校验,对系统运行速度可以较少考虑。
    B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上。 比C/S有更高的要求,B/S结构的程序架构是发展的趋势,从MS的.Net系列的BizTalk 2000 Exchange 2000等,全面支持网络的构件搭建的系统。SUN和IBM推的JavaBean构件技术等,使B/S更加成熟。
    (4)、软件重用不同
    C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好。
    B/S 对的多重结构,要求构件相对独立的功能。 能够相对较好的重用。就如买来的餐桌可以再利用,而不是做在墙上的石头桌子。
    (5)、系统维护不同
    系统维护是软件生存周期中,开销大,相当重要
    C/S 程序由于整体性,必须整体考察,处理出现的问题以及系统升级难, 可能是再做一个全新的系统。
    B/S 构件组成方面构件个别的更换,实现系统的无缝升级。 系统维护开销减到最小,用户从网上自己下载安装就可以实现升级。
    (6)、处理问题不同
    C/S 程序可以处理用户面固定,并且在相同区域, 安全要求高的需求,与操作系统相关, 应该都是相同的系统。
    B/S 建立在广域网上, 面向不同的用户群,分散地域, 这是C/S无法作到的,与操作系统平台关系最小。
    (7)、用户接口不同
    C/S 多是建立在Window平台上,表现方法有限,对程序员普遍要求较高。
    B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流, 并且大部分难度减低,降低开发成本。
    (8)、信息流不同
    C/S 程序一般是典型的中央集权的机械式处理,交互性相对低。
    B/S 信息流向可变化, B-B、 B-C、 B-G等信息流向的变化, 更象交易中心
    参考资料:http://zhidao.baidu.com/question/12962713.html

    使用myeclipse集成struts,hibernate,spring的一个示例程序

    使用myeclipse集成struts,hibernate,spring的一个示例程序(2008-04-14 16:17:27)

    标签:it

    在java 企业应用领域,ejb的功能强大同ejb的配置复杂,难于学习一样出名。但在以前我们又有什么办法呢?只有硬着头皮来学ejb。真有点“明知山有虎,偏向虎山行”的精神。现在形式有了乐观的变化,java开源的持续走红,使得开发java企业级应用不再局限于ejb领域。这里我主要介绍一下怎样采用开源的 Spring,Hibernate以及Struts构建一个轻量级的架构。

    一、整体架构介绍

    在软件工程领域,为了降低模块耦合度,提高模块的可重用性,分层一直是广为采纳的一个方法。其实分层还可以使开发人员专注于某一层进行开发,使得软件开发的分工变细,提高生产效率(这一点上堪比福特发明的流水线生产汽车的做法,各个工人负责特定部件的生产,最后组装)。

    一个企业级的java应用,通常分为以下几层:UI层,业务逻辑层,数据持久层,域对象层。下面对这几层分别作简要介绍:

    1. UI层:负责与用户交互,包括:接受用户的请求,把处理结果返回给用户。这里我们采用struts来UI层,虽然比起Tapestry以及JSF这些事件驱动的表现层技术而言,Struts的设计显得有些老土,但它目前仍是表现层事实上的标准,所以我们还是选用它。

    2.业务逻辑层:主要负责具体的业务处理。通过Spring的IOC以及AOP实现各个功能的耦合相连

    3.数据持久层:主要负责与底层的数据库打交道。这里我们采用Spring封装的Hibernate操作来简化实际的编码。主要的操作为CRUD(create ,read,update,delete)

    4.域对象层:具体的实体类,如老师,学生等等这些具体的类(注意:需要与数据库中的某一标对应)。
    以上只是简单介绍了各个层的划分以及各层所对应的开源框架,要详细了解各层的具层信息,需要访问 struts,hibernate,spring的官方网站。

    二、实例分析

    实例说明:一个网站登录的例子,比较简单,但能说明各层是如何协调工作的。

    工具:jdk1.5,eclipse3.2,myeclipse5.0GA,mysql5.0,tomcat5.5,至于这几个工具到底该怎么装这里我就不多说了,大家不清楚的可以到网上搜搜。下面是具体操作步骤:

    预备工作:用mysql创建一个test数据库,再创建一个user表,再创建两个字段username和password。脚本如下

    DROP DATABASE IF EXISTS `test`;
    CREATE DATABASE `test`
    USE `test`;

    CREATE TABLE `user` (
    `id` int(11) NOT NULL auto_increment,
    `username` varchar(30) NOT NULL default '',
    `password` varchar(30) default '',
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

    打开myeclipse的database explore透视图

    右键单击左侧的空白区域 ,点击 new 按钮

    单击“configure database driver”来配置数据库的驱动,你必须有mysql的jdbc驱动,没有的到mysql的官方网站上下载。

    测试数据库配置是否成功。

    1. 新建一个myeclipse的web工程

    2. 引入Spring包

    右键工程名

    注意:这里为了省得以后再添加spring的相关包,所以一次性的选中了所有的包。选中Copy选项,它会把这些包拷贝到/WebRoot/WEB-INF/lib目录下,方便以后的实际部署。

    3.添加hibernate包

    系统会检测到该工程已经添加了Spring包,选择使用Spring的配置文件

    点击 next

    点击 next

    点击 next

    最后点击Finish按钮即可。

    4切换到database explore视图,右键 点击 user 表的“Hibrnate Reverse Engineering”

    弹出如下窗口

    点击 “next”

    再单击finish

    在包视图中 可以看到 src下多了一个名为vo的package以及该包下的四个文件

    为了更加直观地显示分层,我另建了一个名为dao的package,并把UserDAO.java移到dao中

    同时注意在applicationContext.xml中把对UserDAO的引用部分也作相应修改。

    5. 建立业务逻辑层代码

    新建一个名为service的包,再在里面建立一个Service类,代码如下

    package service;
    import java.util.List;
    import vo.User;
    import dao.UserDAO;
    public class Service {
    private UserDAO userDao;
    public UserDAO getUserDao() {
    return userDao;
    }
    public void setUserDao(UserDAO userDao) {
    this.userDao = userDao;
    }
    public boolean isValid(User user) {//判断用户是否合法
    List result = userDao.findByExample(user);
    if (result.size() > 0)
    return true;
    else
    return false;
    }
    }

    同时在applicationContext.xml中添加如下配置
    <bean id="service" class="service.Service" singleton="false">
    <property name="userDao">
    <ref bean="userDao" />
    </property>
    </bean>

    6.配置UI层

    添加struts包,方法同添加spring一样

    配置struts-config.xml文件,在空白区域右键单击 new 一个 action ,actionForm ,jsp

    下一步

    对forward作设置,增加succeed转到welcome.jsp,fail转到login.jsp

    在WebRoot目录下建立一个welcome.jsp文件,显示用户登录成功后的欢迎信息。

    6. 把struts和spring连接起来

    6.1修改struts-config.xml注意红色字体部分

    <action
    attribute="loginForm"
    input="/login.jsp"
    name="loginForm"
    path="/login"
    scope="request"
    type="org.springframework.web.struts.DelegatingActionProxy">
    <forward name="fail" path="/login.jsp" />
    <forward name="succeed" path="/welcome.jsp" />
    </action>

    再在strut-config.xml中添加如下代码

    <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml" />
    </plug-in>>
    6.2修改applicationContext,增加以下内容
    <bean name="/login" class="web.action.LoginAction"
    singleton="false">
    <property name="service">
    <ref bean="service" />
    </property>
    </bean>

    6.3修改LoginAction.java部分代码,增加一个service变量,以及其 get/set方法(主要用于Spring IOC)。代码如下:

    package web.action;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import web.form.LoginForm;
    import service.Service;
    import vo.User;
    public class LoginAction extends Action {
    private Service service;
    public void setService(Service service) {
    this.service = service;
    }
    public Service getService() {
    return service;
    }
    public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
    LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method
    // stub
    User user = new User();
    user.setPassword(loginForm.getPassword());
    user.setUsername(loginForm.getUserName());
    if (service.isValid(user))
    return mapping.findForward("succeed");
    else
    return mapping.findForward("fail");
    }
    }

    至此一个简单的登录已经做成。剩下的工作就是打包并发布你的应用了。

    二、实例分析
    实例说明:一个网站登录的例子,比较简单,但能说明各层是如何协调工作的。
    工具:jdk1.5,eclipse3.2,myeclipse5.0GA,mysql5.0,tomcat5.5,至于这几个工具到底该怎么装这里我就不多说了,大家不清楚的可以到网上搜搜。下面是具体操作步骤:
    预备工作:用mysql创建一个test数据库,再创建一个user表,再创建两个字段username和password。脚本如下
    DROP DATABASE IF EXISTS `test`;
    CREATE DATABASE `test`
    USE `test`;
    CREATE TABLE `user` (
    `id` int(11) NOT NULL auto_increment,
    `username` varchar(30) NOT NULL default '',
    `password` varchar(30) default '',
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
    打开myeclipse的database explore透视图

    右键单击左侧的空白区域 ,点击 new 按钮

    单击“configure database driver”来配置数据库的驱动,你必须有mysql的jdbc驱动,没有的到mysql的官方网站上下载。

    测试数据库配置是否成功。
    1.   新建一个myeclipse的web工程

    2.   引入Spring包
    右键工程名


    注意:这里为了省得以后再添加spring的相关包,所以一次性的选中了所有的包。选中
    Copy选项,它会把这些包拷贝到/WebRoot/WEB-INF/lib目录下,方便以后的实际部署。

    3.添加hibernate包

    系统会检测到该工程已经添加了Spring包,选择使用Spring的配置文件

    点击 next

    点击 next

    点击 next

    最后点击Finish按钮即可。
    4切换到database explore视图,右键 点击 user 表的“Hibrnate Reverse Engineering”

    弹出如下窗口

    点击 “next”

    再单击finish
    在包视图中 可以看到 src下多了一个名为vo的package以及该包下的四个文件

    为了更加直观地显示分层,我另建了一个名为dao的package,并把UserDAO.java移到dao中

    同时注意在applicationContext.xml中把对UserDAO的引用部分也作相应修改。
    5.   建立业务逻辑层代码
    新建一个名为service的包,再在里面建立一个Service类,代码如下

     

    package service;
    import java.util.List;
    import vo.User;
    import dao.UserDAO;
    public class Service {
    private UserDAO userDao;
    public UserDAO getUserDao() {
    return userDao;
    }
    public void setUserDao(UserDAO userDao) {
    this.userDao = userDao;
    }
    public boolean isValid(User user) {//判断用户是否合法
    List result = userDao.findByExample(user);
    if (result.size() > 0)
    return true;
    else
    return false;
    }
    }


    同时在applicationContext.xml中添加如下配置
    <bean id="service" class="service.Service" singleton="false">
    <property name="userDao">
    <ref bean="userDao" />
    </property>
    </bean> 

    6.配置UI层
    添加struts包,方法同添加spring一样

    配置struts-config.xml文件,在空白区域右键单击 new 一个 action ,actionForm ,jsp



    下一步
    对forward作设置,增加succeed转到welcome.jsp,fail转到login.jsp
    在WebRoot目录下建立一个welcome.jsp文件,显示用户登录成功后的欢迎信息。

    6. 把struts和spring连接起来
    6.1修改struts-config.xml注意红色字体部分

     

    <action
    attribute="loginForm"
    input="/login.jsp"
    name="loginForm"
    path="/login"
    scope="request"
    type="org.springframework.web.struts.DelegatingActionProxy">
    <forward name="fail" path="/login.jsp" />
    <forward name="succeed" path="/welcome.jsp" />
    </action>


    再在strut-config.xml中添加如下代码

     

    <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml" />
    </plug-in>>
    6.2修改applicationContext,增加以下内容
    <bean name="/login" class="web.action.LoginAction"
    singleton="false">
    <property name="service">
    <ref bean="service" />
    </property>
    </bean>


    6.3修改LoginAction.java部分代码,增加一个service变量,以及其 get/set方法(主要用于Spring IOC)。代码如下:

     

    package web.action;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import web.form.LoginForm;
    import service.Service;
    import vo.User;
    public class LoginAction extends Action {
    private Service service;
    public void setService(Service service) {
    this.service = service;
    }
    public Service getService() {
    return service;
    }
    public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
    LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method
    // stub
    User user = new User();
    user.setPassword(loginForm.getPassword());
    user.setUsername(loginForm.getUserName());
    if (service.isValid(user))
    return mapping.findForward("succeed");
    else
    return mapping.findForward("fail");
    }
    }


    至此一个简单的登录已经做成。剩下的工作就是打包并发布你的应用了

    SSH框架

    SSH框架

    最近在弄j2ee,发现还是学到了很多东西,心情happy啊!昨天看到了一个文章是关于ssh的,就弄下来了,后面加点自己的东西,很感谢网上的各位前辈的总结。一个spring2.5+hibernate3.2+struts2.0组合框架,使用spring的IoC来管理应用的所有bean,包括struts2的action,充分发挥了spring轻量级框架的优势。
    摘 要:针对当前Web应用程序开发面临的问题,结合目前比较流行的开源框架Spring、Struts和Hibernate,提出了一种开发J2EE Web应用的轻量级解决方案,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。并且,通过案例具体说明了如何将这一方案应用到实际项目中。
    关键词:J2EE MVC Struts Spring Hibernate
        大型企业级Web应用系统的开发通常要求有一个良好的软件架构、便于协作开发和扩展升级,而传统的开发模式不能很好地满足这些要求。本文针对当前Web应用程序开发面临的问题,结合目前比较流行的开源框架SSH(Spring、Struts、Hibernate),提出一种开发J2EE 企业级Web应用的轻量级解决方案,并通过案例具体说明如何将这一方案应用到实际项目中。
    1 框架技术
        著名的软件大师Ralph Johnson对框架(Framework)进行了如下的定义: 框架是整个系统或系统的一部分的可重用设计,由一组抽象的类及其实例间的相互作用方式组成[1]。
        框架一般具有即插即用的可重用性、成熟的稳定性以及良好的团队协作性。J2EE复杂的多层结构决定了大型的J2EE项目需要运用框架和设计模式来控制软件质量。目前,市场上出现了一些商业的、开源的基于J2EE的应用框架,其中主流的框架技术有:基于MVC模式的Struts框架和基于IoC模式的Spring框架以及对象/关系映射框架Hibernate等。
    1.1 表示层框架Struts
         Struts是一个在JSP Model2基础上实现的MVC框架,主要分为模型(Model)、视图(Viewer)和控制器(Controller)三部分,其主要的设计理念是通过控制器将表现逻辑和业务逻辑解耦,以提高系统的可维护性、可扩展性和可重用性[2]。Struts框架的体系结构如图1所示。

      下面就图1所示的体系结构图分析Struts框架中的MVC组件。
        (1)视图:视图部分主要由JSP页面组成,其中没有流程逻辑、业务逻辑和模型信息,只有标记。Struts自身包含了一组标记库(TagLib),这也是Struts的精华之一,灵活运用它们可以简化JSP页面的代码,提高开发效率。
        (2)控制器:Struts中的Controller主要是其自身提供的ActionServlet。ActionServlet接收所有来自客户端的请求并根据配置文件(struts-config.xml)中的定义将控制转移到适当的Action对象。
        (3)模型:Struts没有定义具体Model层的实现,Model层通常是和业务逻辑紧密相关的,有持续化的要求。目前在商业领域和开源世界,都有一些优秀的工具可以为Model层的开发提供便利。
    1.2 业务逻辑层框架Spring
         Spring是一个解决了许多J2EE开发中常见问题并能够替代EJB技术的强大的轻量级框架。这里所说的轻量级指的是Spring框架本身,而不是指Spring只能用于轻量级的应用开发。Spring的轻盈体现在其框架本身的基础结构以及对其他应用工具的支持和装配能力。与EJB这种庞然大物相比,Spring可使程序研发人员把各个技术层次之间的风险降低。
         Spring框架的核心是控制翻转IoC(Inversion of Control)/依赖注入DI(Dependence Injection)机制。IoC是指由容器中控制组件之间的关系(这里,容器是指为组件提供特定服务和技术支持的一个标准化的运行时的环境)而非传统实现中由程序代码直接操控,这种将控制权由程序代码到外部容器的转移,称为“翻转”[3]。DI是对IoC更形象的解释,即由容器在运行期间动态地将依赖关系(如构造参数、构造对象或接口)注入到组件之中[3]。Spring采用设值注入(使用Setter方法实现依赖)和构造子注入(在构造方法中实现依赖)的机制,通过配置文件管理组建的协作对象,创建可以构造组件的IoC容器。这样,不需要编写工厂模式、单例模式或者其他构造的方法,就可以通过容器直接获取所需的业务组件。Spring框架的结构如图2所示。

      Spring框架由七个定义明确的模块组成,且每个模块或组件都可以单独存在,或者与其他一个或多个模块联合实现。Spring Core Container是一个用来管理业务组件的IoC容器,是Spring应用的核心;Spring DAO和Spring ORM不仅提供数据访问的抽象模块,还集成了对Hibernate、JDO和iBatis等流行的对象关系映射框架的支持模块,并且提供了缓冲连接池、事务处理等重要的服务功能,保证了系统的性能和数据的完整性;Sprnig Web模块提供了Web应用的一些抽象封装,可以将Struts、Webwork等Web框架与Spring整合成为适用于自己的解决方案。
        Spring框架可以成为企业级应用程序一站式的解决方案,同时它也是模块化的框架,允许开发人员自由地挑选适合自己应用的模块进行开发。Spring框架式是一个松耦合的框架,框架的部分耦合度被设计为最小,在各个层次上具体选用哪个框架取决于开发者的需要。
    1.3 数据持久层框架Hibernate
        O/R mapping技术是为了解决关系型数据库和面向对象的程序设计之间不匹配的矛盾而产生的。Hibernate是目前最为流行的O/R mapping框架,它在关系型数据库和Java对象之间做了一个自动映射,使得程序员可以以非常简单的方式实现对数据库的操作。Hibernate工作原理如图3所示。

      Hibernate通过对JDBC的封装,向程序员屏蔽了底层的数据库操作,使程序员专注于OO程序的开发,有助于提高开发效率。程序员访问数据库所需要做的就是为持久化对象编制xml映射文件[4]。
         底层数据库的改变只需要简单地更改初始化配置文件(hibernate.cfg.xml或者hibernate.properties)即可,不会对应用程序产生影响。
         Hibernate有自己的面向对象的查询语言HQL,HQL功能强大,支持目前大部分主流的数据库,如Oracle、DB2、MySQL、Microsoft SQL Server等,是目前应用最广泛的O/R映射工具。Hibernate为快速开发应用程序提供了底层的支持。
    2 基于SSH组合框架的Web应用模型设计与实现
    2.1 集成SSH的新型J2EE框架
      前面分析了基于J2EE的三种框架技术,下面通过集成以上三种框架技术来对传统的J2EE Web开发模型加以改进,以形成一种新的、轻量型的J2EE架构。
      集成SSH框架的系统框架图如图4所示,系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,利用Hibernate框架对持久层提供支持,业务层用Spring支持。具体做法是:用面向对象的分析方法根据需求提出一些模型,将这些模型实现为基本的Java对象,然后编写基本的DAO接口,并给出Hibernate的DAO实现,采用Hibernate架构实现的DAO类来实现Java类与数据库之间的转换和访问,最后由Spring完成业务逻辑。

      系统的基本业务流程是: 在表示层中,首先通过JSP页面实现交互界面,负责传送请求(Request)和接收响应(Response),然后Struts根据配置文件(struts-config.xml)将ActionServlet接收到的Request委派给相应的Action处理。在业务层中,管理服务组件的Spring IoC容器负责向Action提供业务模型(Model)组件和该组件的协作对象数据处理(DAO)组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性。而在持久层中,则依赖于Hibernate的对象化映射和数据库交互,处理DAO组件请求的数据,并返回处理结果。
      采用上述开发模型,不仅实现了视图、控制器与模型的彻底分离,而且还实现了业务逻辑层与持久层的分离。这样无论前端如何变化,模型层只需很少的改动,并且数据库的变化也不会对前端有所影响,大大提高了系统的可复用性。而且由于不同层之间耦合度小,有利于团队成员并行工作,大大提高了开发效率。
    2.2 基于SSH框架的Web应用系统的实现
      下面将通过一个实际的系统来展示如何进行基于SSH框架的Web应用开发。该系统是为某通信公司运营部开发的一个问答式系统,功能类似于百度知道和新浪爱问。由于系统的模块较多,下面就以一个用户管理模块为例来说明系统的开发实现过程,并将按照数据持久层、业务逻辑层、表示层的顺序说明系统构建过程。
      (1)数据持久层
      数据持久层由Java对象持久化类和数据访问对象(DAO)组成。每个数据库表都对应着一个持久化对象,这样就给予了开发者使用OO思想设计和开发的便利,同时也屏蔽了具体的数据库和具体的数据表、字段,消除了对数据库操作的硬编码在重用性上的弊端。用户信息表的部分结构如表1所示。

      Hibernate通过映射(Mapping)文件将对象(Object)与关系型数据(Relational)相关联,因此需要编写和数据库表相对应的Java持久化类以及对应的映射文件。有了Java持久化类后就可以在此基础上实现数据访问类。在Spring框架中,数据访问类可以从辅助类HibernateDaoSupport继承,这极大地方便了Hibernate框架在Spring中的使用,相应的部分代码如下:
         public class UserDao
              extends HibernateDaoSupport {
           public int add(User user) {
             return Integer.ParseInt(this.getHibernateTemplate().save(user).toString());
           }
           public List findAll() {
             return this.getHibernateTemplate().loadAll(User.class);
           }
         }
      具体的Hibernate数据源、session工厂、事务管理、缓冲连接池等功能都由业务层的Spring容器提供。
      (2)业务逻辑层
      业务逻辑层由Spring框架支持,提供了处理业务逻辑的服务组件。开发者需要对业务对象建模,抽象出业务模型并封装在Model组件中。由于数据持久层实现了Java持久化类并且封装了数据访问对象(DAO),因此可以在Model组件中方便地调用DAO组件来存取数据。Spring的IoC容器负责统一管理Model组件和DAO组件以及Spring所提供的事务处理、缓冲连接池等服务组件。
      在用户管理模块中,通过业务建模创建了用户模型UserService类,封装了对用户的权限管理以及积分管理等功能。UserService类通过调用数据访问类UserDao实现对用户数据的操作。这些组件的关系将通过配置Spring框架的applicationContext.xml联系起来,配置文件的主要内容如下:

         (3)表示层
         表示层结合JSP和Struts的TagLib库处理显示功能,利用ActionServlet将请求(*.do)映射到相应的Action,并由Action调用业务逻辑的服务组件,然后根据处理结果跳转到Forword对象指定的响应页面。
         业务流程的部署由struts-config.xml完成。下面以一个显示所有用户信息的请求(ListUser.do)为例来说明配置文件的使用。

        基于J2EE的Web应用以其层次性、平台无关性的优势已经逐渐成为了电子商务、电子政务主要的解决方案。本文针对传统的J2EE Web应用开发的弊端,提出了一种利用轻量级框架来快速搭建Web应用的解决方案,并且通过其在实际项目中的应用,证明了采用此方案可以帮助开发人员在短时间内建立结构清晰、可重用性好、维护扩展方便的Web应用程序。
    参考文献
    [1] GAMMA E, HELM R, JOHNSON R, et al. Design patterns:Elements of reusable object-oriented software[m]. Addison Wesley, 1994.
    [2] 孙卫琴.精通Struts:基于MVC的Java Web设计与开发[m]. 北京:电子工业出版社,2004.
    [3] JOHNSON R, HOELLER J, ARENDSEN A, et al. Java/J2EE application framework reference document. V1.1.
    2004.
    [4] 徐长盛,戴超.一种快速开发Web应用程序方法的研究[J]. 计算机工程与设计,2004,(12):2237-2239.
    [5] 夏昕,曹晓钢,唐勇.深入浅出Hibernate[m]. 北京:电子工业出版社,2005.
    [6] JOHNSON R.Expert one-on-one J2EE design and development[m]. 魏海萍译.北京:电子工业出版社,2003.
    在用ssh开发web应用时,需要对生成的各个类文件进行组织,下面就对一个可行的目录方案进行介绍:
    譬如应用中有一个用户管理模块,则在公共包下建立一个user包,如该公共包可以为com.simon.oa,
    在user包下包括如下子包
    1、controler包
    该包放置各种struts的action。
    2、dao包
    该包放置各类dao(data access object),也就是放置对数据库访问的实现类,在用myeclipse中的“Hibernate Reverse Engineering”进行反向操作时在某一个目录中就会生成对应某个表的DAO,生成后可将该DAO拖到dao包中。在某些应用中将DAO作为接口,在该接口中包括所有对数据库的操作方法,然后在dao包建立一个hibernate包,在hibernate包中放置对DAO接口的实现,譬如:UserDAO接口有一个实现类为UserDaoImpl,将该类放置到hibernate包中,实际的开发倾向于后一种方式,因为对这个DAO接口可以实现spring的IoC操作。(不知道myeclipse对此是怎么考虑的,这个问题让我纠缠了很久,误将DAO理解成一个能够进行实际操作的类,而不是一个接口,以后开发要注意)
    3、model包
    该包中放置hibernate反向工程生成的bean和该bean对应的.hbm.xml文件。
    4、service包
    该包放置业务操作类,譬如用户服务类,一般情况将该用户操作类提取一个接口,然后在service包下生成一个impl包,在impl包中才放置用户操作接口的实现类。该用户接口实现类中调用DAO接口对数据库进行操作,而调用该实现类的方法在struts的action中。
    5、vo包(value object)
    vo包中的中包括struts中使用的POJO及actionform等信息。
    VO: Value Object
    DTO: Data Transfer Object
    个人理解VO和DTO是类似的东西,原则上VO和DTO只有Public Fields,主要用于进程之间数据传递的问题,VO和DTO不会传递到表示层,在业务层就会被吸收。但看到很多人在建立VO和DTO时,也含有Setter,Getter属性和一些其它的辅助方法,这也无可厚非,我自己也不能确定这对不对。

    转载:http://hi.baidu.com/ashinehan/blog/item/ac42af0ba15eb336b0351d37.html