基于StrutsEJB框架下web开发

来源:互联网 发布:淘宝网男装休闲外套 编辑:程序博客网 时间:2024/06/06 01:00

摘  要

今天,越来越多的开发者想要编写企业级分布式的事务处理应用程序,而这些应用程序必须可以提供高性能、安全性和服务器端的可靠性。在这个高速发展、要求苛刻的电子商务和信息技术的世界中,企业级的应用程序必须具有以下特点:花费更少的金钱、具有更快的速度、占用更少的资源。

本文所研究的StrutsEJB是一个开放源码的类库,它使用StrutsEJBJSTL能够快速地创建基于J2EEweb应用。

StrutsEJB框架与MVC(Model/View/Controller)模式的对应关系是:EJBCommand就是ModelStrutsControllerJSP页面是View。它有如下特点:第一,只需要把业务逻辑添加到一个EJBCommand类中,而无需新创建一个会话bean。第二,基于镜像的DTO和反映射的ActionForm,无需不断的访问存取器。第三,StrutsEJBDTOFactory类能够自动的监测到各个域,并且在ActionFormDTO和实体Bean之间进行值的拷贝。第四,定位服务和业务代理能够减少在web层上的依赖于EJB的代码量。第五,数据库的访问十分简单,并且表的内容可以使用JSTL标签显示出来。第六,在安全方面,它具有基于角色的用户管理和个性化的工具。产品级的QA组织已经对StrutsEJB进行了无数次的精炼,现在已经应用到了商业项目中。它为J2EE应用提供了坚固而稳定的基础。

本论文将对StrutsEJB应用框架进行详细的研究分析。然后将其应用到一个稻田产业管理系统的开发中。本系统是日本某公司内部使用的系统,主要用于处理与国内外各公司的业务。

 

2 StrutsEJB框架

 

 

2.1使用StrutsEJB框架创建J2EE应用程序的步骤

 

 

使用StrutsEJB创建J2EE应用程序十分简单,大大加快了WEB应用的开发速度,步骤如下:

    创建一个新的EJBCommand类。

    struts-config.xml中加入一个路径来调用这个类。

    创建JSP页面。

每一个步骤与Model View ControllerMVC)模型中的元素的对应关系是:EJBCommandModelStrutsControllerJSP页面是View

第一步,创建一个新的EJBCommand类。

EJBCommand类就是一个Java类。StrutsEJB的会话外观(Session Facade)有两个通用组件——StatelessFacade StatefulFacade。这个Facade使业务逻辑开发更容易——不必为每个用例写一个完整的会话bean(或与之相关的接口和DD文件),只需把代码加入到EJBCommand中就可以了。下面是如何写一个EJBCommand类:

    创建一个net.java.dev.strutsejb.EJBCommand的子类。

    覆盖isStateful()方法。

    覆盖executeInStateless executeInStateful方法。

见下面的代码,isStateful方法返回一个布尔值,用它来判断EJBCommand是有状态的还是无状态的会话Bean。如果你的代码逻辑不使用任何会话信息,则这个方法返回false。然后StrutsEJB将调用executeInStateless( )方法;如果你想访问会话信息,则返回trueStrutsEJB将调用executeInStateful方法,在这里你能够访问客户端的会话信息。在这个模式中,StrutsEJB会管理会话信息。例如,保存HttpSession中的有状态会话Bean的参数、删除超时队列中的参数、再次执行等等。

        public class UserCmd extends EJBCommand {

            public void executeInStateless(SessionContext ctx) {

                //business logic goes here

                final String inMsg = (String) paramDTO.get("inMsg");

                  resultDTO.put("outMsg", inMsg);

            }

            public boolean isStateful() {

                return false;

           }

        }

paramDTOresultDTO都继承java.util.Map接口,这些Maps代表一个DTO(Data Transfer Object),用于在WEB层和EJB层传输值。如果想给一个JSP页面传值,或想接收来自JSP页面的值,那就把他加入到paramDTOresultDTO中。基于MapDTOStrutsEJB框架的关键元素。

第二步,struts-config.xml中加入一个路径。

struts-config.xml文件中添加一个路径,EJBCommand才能够被执行。StrutsEJB提供了一个通用的Action类,名字为DefaultAction。如下:

<action  path="/User"

type="net.java.dev.strutsejb.web.DefaultAction"

name="form"

         scope="request"

 parameter="UserCmd">

         <forward name="Success" path="/User.jsp"/>

</action>

通常,在Struts编程中,每一个工作流程步骤都有一个Action类。使用StrutsEJB,几乎所有的Actions都由一个的DefaultAction类处理,它可以调用任意的EJBCommand。对于大项目而言,潜在地会有上百个Action类,所以获得较高的工作效率是非常重要的。与一般的Action映射唯一不同的就是,你要在action标签的“parameter”属性中指定EJBCommand类的全名。DefaultAction会检查这个属性,并且执行相对应EJBCommand

name”属性指的是ActionForm的“form”。它是DefaultForm的一个实例,与DefaultAction共同合作。form实例在缺省的struts-config.xml文件中是按如下声明的:

       <form-bean name="form"

type="net.java.dev.strutsejb.web.DefaultForm"/>

DefaultForm是一个通用的Action Form,它能够接受HTML表单的任意参数,而不需要声明各个域是存储器还是在一个外部xml文件中。如果你想添加一个域,就尽管把它添加到HTML表单里,你可你通过paramDTOresultDTO访问他。

第三步,用JSTLJSP页面

我们推荐使用Struts标签写HTML表单(例如:<html:×××>命名空间的标签)。而其他的,我们强烈推荐使用JSTL标签。如下:

        <%@ page language="java" session="false"%>

        <%@ taglib uri="http://jakarta.apache.org/struts/tags-html-el" prefix="html" %>

        <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

        <html:form action="/User ">

               <html:text property="dto(inMsg)"/>

               <html:submit value="shout"/>

        </html:form>                         

        result = <c:out value="${dto.outMsg}"/>

    声明中的第2行所使用的是struts-html标签。尽管我们将使用JSTL标签,但是struts-html-el标签比原始的struts-html标签更有用。如果你愿意,你仍旧可以使用原始的struts-html标签和其他的标签库。

怎样访问DTO呢?让我们看看HTML表单中的“property”属性。给每个property都命名为“dto(xxx)”,这样,StrutsEJBDefaultForm就会自动地get/set这些域值。例如,如果使用一个html:text标签,并且把它的property属性的值设置为“dto(foo)”DefaultForm就会读取property“foo”,并把获得的值传给paramDTO。执行完EJBCommand以后,存储在resultDTO的所有property将会放到DefaultForm中。当访问HTML表单时,Struts将会读取这些property

<c:out>标签指的是一个“dto”属性。它是一个由DefaultAction设置的request-scope属性,使得用JSTL EL可以访问resultDTO。由于resultDTO是一个Map类型,EL表达式“${dto.msg}”指的是:从resultDTO中得到“msg”的值。

下面是StrutsEJB的事件顺序:

    用户向Struts发送一个HTTP GET/POST请求。

    Struts 指派一个 DefaultForm 去读取请求。

    DefaultForm读取所有的命名为“dto(xxx)”properties

    Struts 指派一个DefaultAction去执行一个 action

    DefaultAction执行在struts-config.xml 文件中所指定的一个EJBCommand

    DefaultAction DefaultForm中读取所有的properties,并把他们放在EJBCommand中的paramDTO里。

    DefaultAction 执行 EJBCommand

    DefaultAction从由EJBCommand返回的resultDTO中读取所有的properties并且把它们放在DefaultForm 和请求属性“dto”中。

    Struts DefaultForm 中读取properties,并把他们传递给HTML表单。

JSP页面中的JSTL标签也可以传递一些存储在请求属性“dto”中的值。

 

2 StrutsEJB框架

 

 

2.1使用StrutsEJB框架创建J2EE应用程序的步骤

 

 

使用StrutsEJB创建J2EE应用程序十分简单,大大加快了WEB应用的开发速度,步骤如下:

    创建一个新的EJBCommand类。

    struts-config.xml中加入一个路径来调用这个类。

    创建JSP页面。

每一个步骤与Model View ControllerMVC)模型中的元素的对应关系是:EJBCommandModelStrutsControllerJSP页面是View

第一步,创建一个新的EJBCommand类。

EJBCommand类就是一个Java类。StrutsEJB的会话外观(Session Facade)有两个通用组件——StatelessFacade StatefulFacade。这个Facade使业务逻辑开发更容易——不必为每个用例写一个完整的会话bean(或与之相关的接口和DD文件),只需把代码加入到EJBCommand中就可以了。下面是如何写一个EJBCommand类:

    创建一个net.java.dev.strutsejb.EJBCommand的子类。

    覆盖isStateful()方法。

    覆盖executeInStateless executeInStateful方法。

见下面的代码,isStateful方法返回一个布尔值,用它来判断EJBCommand是有状态的还是无状态的会话Bean。如果你的代码逻辑不使用任何会话信息,则这个方法返回false。然后StrutsEJB将调用executeInStateless( )方法;如果你想访问会话信息,则返回trueStrutsEJB将调用executeInStateful方法,在这里你能够访问客户端的会话信息。在这个模式中,StrutsEJB会管理会话信息。例如,保存HttpSession中的有状态会话Bean的参数、删除超时队列中的参数、再次执行等等。

        public class UserCmd extends EJBCommand {

            public void executeInStateless(SessionContext ctx) {

                //business logic goes here

                final String inMsg = (String) paramDTO.get("inMsg");

                  resultDTO.put("outMsg", inMsg);

            }

            public boolean isStateful() {

                return false;

           }

        }

paramDTOresultDTO都继承java.util.Map接口,这些Maps代表一个DTO(Data Transfer Object),用于在WEB层和EJB层传输值。如果想给一个JSP页面传值,或想接收来自JSP页面的值,那就把他加入到paramDTOresultDTO中。基于MapDTOStrutsEJB框架的关键元素。

第二步,struts-config.xml中加入一个路径。

struts-config.xml文件中添加一个路径,EJBCommand才能够被执行。StrutsEJB提供了一个通用的Action类,名字为DefaultAction。如下:

<action  path="/User"

type="net.java.dev.strutsejb.web.DefaultAction"

name="form"

         scope="request"

 parameter="UserCmd">

         <forward name="Success" path="/User.jsp"/>

</action>

通常,在Struts编程中,每一个工作流程步骤都有一个Action类。使用StrutsEJB,几乎所有的Actions都由一个的DefaultAction类处理,它可以调用任意的EJBCommand。对于大项目而言,潜在地会有上百个Action类,所以获得较高的工作效率是非常重要的。与一般的Action映射唯一不同的就是,你要在action标签的“parameter”属性中指定EJBCommand类的全名。DefaultAction会检查这个属性,并且执行相对应EJBCommand

name”属性指的是ActionForm的“form”。它是DefaultForm的一个实例,与DefaultAction共同合作。form实例在缺省的struts-config.xml文件中是按如下声明的:

       <form-bean name="form"

type="net.java.dev.strutsejb.web.DefaultForm"/>

DefaultForm是一个通用的Action Form,它能够接受HTML表单的任意参数,而不需要声明各个域是存储器还是在一个外部xml文件中。如果你想添加一个域,就尽管把它添加到HTML表单里,你可你通过paramDTOresultDTO访问他。

第三步,用JSTLJSP页面

我们推荐使用Struts标签写HTML表单(例如:<html:×××>命名空间的标签)。而其他的,我们强烈推荐使用JSTL标签。如下:

        <%@ page language="java" session="false"%>

        <%@ taglib uri="http://jakarta.apache.org/struts/tags-html-el" prefix="html" %>

        <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

        <html:form action="/User ">

               <html:text property="dto(inMsg)"/>

               <html:submit value="shout"/>

        </html:form>                         

        result = <c:out value="${dto.outMsg}"/>

    声明中的第2行所使用的是struts-html标签。尽管我们将使用JSTL标签,但是struts-html-el标签比原始的struts-html标签更有用。如果你愿意,你仍旧可以使用原始的struts-html标签和其他的标签库。

怎样访问DTO呢?让我们看看HTML表单中的“property”属性。给每个property都命名为“dto(xxx)”,这样,StrutsEJBDefaultForm就会自动地get/set这些域值。例如,如果使用一个html:text标签,并且把它的property属性的值设置为“dto(foo)”DefaultForm就会读取property“foo”,并把获得的值传给paramDTO。执行完EJBCommand以后,存储在resultDTO的所有property将会放到DefaultForm中。当访问HTML表单时,Struts将会读取这些property

<c:out>标签指的是一个“dto”属性。它是一个由DefaultAction设置的request-scope属性,使得用JSTL EL可以访问resultDTO。由于resultDTO是一个Map类型,EL表达式“${dto.msg}”指的是:从resultDTO中得到“msg”的值。

下面是StrutsEJB的事件顺序:

    用户向Struts发送一个HTTP GET/POST请求。

    Struts 指派一个 DefaultForm 去读取请求。

    DefaultForm读取所有的命名为“dto(xxx)”properties

    Struts 指派一个DefaultAction去执行一个 action

    DefaultAction执行在struts-config.xml 文件中所指定的一个EJBCommand

    DefaultAction DefaultForm中读取所有的properties,并把他们放在EJBCommand中的paramDTO里。

    DefaultAction 执行 EJBCommand

    DefaultAction从由EJBCommand返回的resultDTO中读取所有的properties并且把它们放在DefaultForm 和请求属性“dto”中。

    Struts DefaultForm 中读取properties,并把他们传递给HTML表单。

JSP页面中的JSTL标签也可以传递一些存储在请求属性“dto”中的值。

 

2 StrutsEJB框架

 

 

2.1使用StrutsEJB框架创建J2EE应用程序的步骤

 

 

使用StrutsEJB创建J2EE应用程序十分简单,大大加快了WEB应用的开发速度,步骤如下:

    创建一个新的EJBCommand类。

    struts-config.xml中加入一个路径来调用这个类。

    创建JSP页面。

每一个步骤与Model View ControllerMVC)模型中的元素的对应关系是:EJBCommandModelStrutsControllerJSP页面是View

第一步,创建一个新的EJBCommand类。

EJBCommand类就是一个Java类。StrutsEJB的会话外观(Session Facade)有两个通用组件——StatelessFacade StatefulFacade。这个Facade使业务逻辑开发更容易——不必为每个用例写一个完整的会话bean(或与之相关的接口和DD文件),只需把代码加入到EJBCommand中就可以了。下面是如何写一个EJBCommand类:

    创建一个net.java.dev.strutsejb.EJBCommand的子类。

    覆盖isStateful()方法。

    覆盖executeInStateless executeInStateful方法。

见下面的代码,isStateful方法返回一个布尔值,用它来判断EJBCommand是有状态的还是无状态的会话Bean。如果你的代码逻辑不使用任何会话信息,则这个方法返回false。然后StrutsEJB将调用executeInStateless( )方法;如果你想访问会话信息,则返回trueStrutsEJB将调用executeInStateful方法,在这里你能够访问客户端的会话信息。在这个模式中,StrutsEJB会管理会话信息。例如,保存HttpSession中的有状态会话Bean的参数、删除超时队列中的参数、再次执行等等。

        public class UserCmd extends EJBCommand {

            public void executeInStateless(SessionContext ctx) {

                //business logic goes here

                final String inMsg = (String) paramDTO.get("inMsg");

                  resultDTO.put("outMsg", inMsg);

            }

            public boolean isStateful() {

                return false;

           }

        }

paramDTOresultDTO都继承java.util.Map接口,这些Maps代表一个DTO(Data Transfer Object),用于在WEB层和EJB层传输值。如果想给一个JSP页面传值,或想接收来自JSP页面的值,那就把他加入到paramDTOresultDTO中。基于MapDTOStrutsEJB框架的关键元素。

第二步,struts-config.xml中加入一个路径。

struts-config.xml文件中添加一个路径,EJBCommand才能够被执行。StrutsEJB提供了一个通用的Action类,名字为DefaultAction。如下:

<action  path="/User"

type="net.java.dev.strutsejb.web.DefaultAction"

name="form"

         scope="request"

 parameter="UserCmd">

         <forward name="Success" path="/User.jsp"/>

</action>

通常,在Struts编程中,每一个工作流程步骤都有一个Action类。使用StrutsEJB,几乎所有的Actions都由一个的DefaultAction类处理,它可以调用任意的EJBCommand。对于大项目而言,潜在地会有上百个Action类,所以获得较高的工作效率是非常重要的。与一般的Action映射唯一不同的就是,你要在action标签的“parameter”属性中指定EJBCommand类的全名。DefaultAction会检查这个属性,并且执行相对应EJBCommand

name”属性指的是ActionForm的“form”。它是DefaultForm的一个实例,与DefaultAction共同合作。form实例在缺省的struts-config.xml文件中是按如下声明的:

       <form-bean name="form"

type="net.java.dev.strutsejb.web.DefaultForm"/>

DefaultForm是一个通用的Action Form,它能够接受HTML表单的任意参数,而不需要声明各个域是存储器还是在一个外部xml文件中。如果你想添加一个域,就尽管把它添加到HTML表单里,你可你通过paramDTOresultDTO访问他。

第三步,用JSTLJSP页面

我们推荐使用Struts标签写HTML表单(例如:<html:×××>命名空间的标签)。而其他的,我们强烈推荐使用JSTL标签。如下:

        <%@ page language="java" session="false"%>

        <%@ taglib uri="http://jakarta.apache.org/struts/tags-html-el" prefix="html" %>

        <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

        <html:form action="/User ">

               <html:text property="dto(inMsg)"/>

               <html:submit value="shout"/>

        </html:form>                         

        result = <c:out value="${dto.outMsg}"/>

    声明中的第2行所使用的是struts-html标签。尽管我们将使用JSTL标签,但是struts-html-el标签比原始的struts-html标签更有用。如果你愿意,你仍旧可以使用原始的struts-html标签和其他的标签库。

怎样访问DTO呢?让我们看看HTML表单中的“property”属性。给每个property都命名为“dto(xxx)”,这样,StrutsEJBDefaultForm就会自动地get/set这些域值。例如,如果使用一个html:text标签,并且把它的property属性的值设置为“dto(foo)”DefaultForm就会读取property“foo”,并把获得的值传给paramDTO。执行完EJBCommand以后,存储在resultDTO的所有property将会放到DefaultForm中。当访问HTML表单时,Struts将会读取这些property

<c:out>标签指的是一个“dto”属性。它是一个由DefaultAction设置的request-scope属性,使得用JSTL EL可以访问resultDTO。由于resultDTO是一个Map类型,EL表达式“${dto.msg}”指的是:从resultDTO中得到“msg”的值。

下面是StrutsEJB的事件顺序:

    用户向Struts发送一个HTTP GET/POST请求。

    Struts 指派一个 DefaultForm 去读取请求。

    DefaultForm读取所有的命名为“dto(xxx)”properties

    Struts 指派一个DefaultAction去执行一个 action

    DefaultAction执行在struts-config.xml 文件中所指定的一个EJBCommand

    DefaultAction DefaultForm中读取所有的properties,并把他们放在EJBCommand中的paramDTO里。

    DefaultAction 执行 EJBCommand

    DefaultAction从由EJBCommand返回的resultDTO中读取所有的properties并且把它们放在DefaultForm 和请求属性“dto”中。

    Struts DefaultForm 中读取properties,并把他们传递给HTML表单。

JSP页面中的JSTL标签也可以传递一些存储在请求属性“dto”中的值。

 

 

 

 

 

 

 

 

 

关键词:StrutsEJBMVCDTO

Abstract

Today, distributed and transaction-processing enterprise application which provides high performance, security and server-side reliability is more and more popular. In the world of requesting high speed and rigor, the enterprise is provided with less money, high speed and less resource.

StrutsEJB discussed in this paper is an open source class library that tames building J2EE-based web applications using Struts, EJB and JSTL.

Each part corresponds to an element of the Model View Controller (MVC) pattern. The EJBCommand is the Model, Struts is the Controller, and the JSP page is the View. Features are: First, Just write a new EJB Command class to add business logic. You don't have to create a whole new Session Bean. Second, Reflection-based DTO and Map-backed ActionForm: No more struggling with accessors. Third, StrutsEJB's DTOFactory automatically detects fields and copies values between ActionForm, DTO and Entity Bean. Fourth, Service Locator and Business Delegate: to minimize your EJB-dependent code on Web tier. Fifth, DB access: simple DB access utility to show table contents by JSTL tags. Finally, Security: Role-based user management and personalization tools.

This article makes a detailed research and analyzes StrutsEJB framework. Based on these, it is applied in a Management system of Inada's industry, which is an internal system used by a Japanese company. This system mainly handles business with other companies at home and abroad.

 

 

 

 

 

Key WordsStrutsEJBMVCDTO

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


目  录

引言. 1

1 StrutsEJB相关的基本理论及概念. 2

1.1 框架. 2

1.2 Struts框架理论简介. 2

1.3 用于业务逻辑层的EJB技术简介. 6

2 StrutsEJB框架. 8

2.1使用StrutsEJB框架创建J2EE应用程序的步骤. 8

3章 稻田产业管理系统的设计. 13

3.1需求分析. 13

3.1.1需求分析的目的. 13

3.1.2 需求分析要实现的目标. 13

3.2 稻田产业管理系统的需求分析及业务描述. 13

3.2.1 申请部分. 14

3.2.2 承认部分. 14

3.3稻田产业管理系统的数据库设计. 14

3.3.1 数据库设计的特点. 15

3.3.2数据库的逻辑设计. 15

3.3.3数据库的物理设计` 15

3.4系统功能的设计. 22

3.4.1企业信息管理(SBAW010. 24

4章 稻田产业管理系统的详细设计. 25

4.1详细设计分析说明. 25

5章 企业Master申请功能模块的实现. 31

5.1运行环境. 31

5.2企业检索功能的实现. 31

5.2.1业务逻辑实现. 31

5.2.2配置struts-config.xml文件. 39

5.2.3企业检索功能视图实现. 41

5.3出错信息的处理. 45

5.3.1录入错误. 45

5.3.2系统错误. 47

结束语. 49

致谢. 50

参考文献. 51

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

引言

 

 

 

 

 

在目前国内外的面向中小企业的Web应用程序设计中,以单纯ASP/JSP/Servlet代码构建的基于服务器端运行的系统占大多数。但上述系统有一个共同的缺陷,就是当业务逻辑越来越复杂的时候,系统构建所带来的复杂度和所耗费的成本将进一步提升,由于结构的不清晰所带来的系统可读性也进一步降低,后期的维护和扩展难度进一步增加。鉴于此,在J2EE领域,业界通常采用在Server集成一些可复用的组件比如EJB等以及FrameWork技术来使得系统结构清晰化,以及实现软件的可复用、可扩展和高效率。在这里,我们采用StrutsEJB技术,快速构建一个可复用、可扩展的、结构清晰的Web应用程序稻田产业管理系统。

事实证明,作为一个日渐成熟的优秀的FrameWork技术,StrutsEJB在构建的基于MVC设计模式的Web系统方面有得天独厚的优势。HjStruts框架是日本日立公司基于StrutsEJB开发的以导入Model层为目的扩展Framework Struts,这样使得针对Model层编成量大大较少,从而缩短了系统开发周期,同时实现规格化的编程风格。

本系统是运用StrutsEJB框架,快速构建了一个结构清晰、可复用、可扩展的Web系统。是企业在全球范围内应用的、高度集成的WEB应用系统。数据在各业务系统之间高度共享,所有源数据只需在某一个系统中输入一次,保证了数据的一致性。对公司内部业务流程和管理过程进行了优化,主要的业务流程实现了自动化。采用了计算机最新的主流技术和体系结构:B/SINTERNET体系结构,WINDOWS界面。在能通信的地方都可以方便地接入到系统中来。集成性、先进性、统一性、完整性、开放性。

第1章                     StrutsEJB相关的基本理论及概念

 

 

 

 

StrutsEJB 是一个开放源代码的类库,它使用StrutsEJBJSTL来快速地创建基于J2EEWEB应用,大大减少了WEB应用的开发时间。目前,StrutsEJB已经成为了用Java创建WEB应用的非常流行的框架工具,StrutsEJB所实现的 MVC 模式给WEB应用带来了良好的层次划分,同时也提供了一系列的工具来简化WEB应用的开发。

 

 

 

 

1.1 框架

 

 

 

 

什么是框架呢?英文词典中对“FrameWork”的定义是“支持或封装其他的东西的一种结构,特别是一个骨架性支持,用来作为构造其他事物的基础。”这个定义非常准确地描述了StrutsEJB:一套Java代码的集合,这些代码被设计用来帮助你建立坚固的应用程序,同时节省时间。你不需要花费时间在整个应用上。你可以把精力集中在编写应用程序的业务逻辑和表示层代码上,而不必关心和业务逻辑、表示层无关的事项。

一个成熟的框架包含了前人的最佳实践经验,不用你再去苦苦探索. 使用框架后能够使工程更加规范。使用框架的一个非常重要的好处是——特别是当一个新手进行WEB开发时——StrutsEJB提供了一个起点,从一个简单的程序开始比从头构造一个要容易很多。StrutsEJB的这个基本功能可以节省花在策划和开发上的若干天或若干星期。

 

 

 

 

1.2 Struts框架理论简介

 

 

 

 

Struts框架是基于Model 2的架构。它提供一个控制器servlet来处理导航流和一些特殊类来帮助数据存取。此框架也提供一个充实的标签库,以使Struts易于和JSP一起使用。

使用Struts的应用开发使用了大量的技术。这些技术并不是专门针对Struts,而是所有Java WEB应用都可以使用的。开发者使用Struts之类的框架是为了隐藏在诸如HTTPCGI,以及JSP之类技术后面的繁琐的细节。作为一个Struts开发者,你并不需要知晓所有的相关知识,但是这些基本技术的工作原理可能有助于你针对棘手问题设计出创造性的方案。

StrutsActionServlet控制导航流。其他Struts类,比如Action, 用来访问业务逻辑类。当 ActionServlet从容器接收到一个请求,它使用URI(或者路径“path”)来决定哪个Action将用来处理请求。一个Action可以校验输入,并且访问业务层以从数据库或其他数据服务中检索信息。为校验输入或者使用输入来更新数据库,Action需要知道什么只被提交上来。并不是强制每个Action从请求中抓取这些值,而是由ActionServlet将输入绑定到JavaBean中。输入beanStruts ActionForm类的子类。ActionServlet通过查找请求的路径可以决定使用哪个ActionFormAction也是通过同样的方法选取的。ActionForm扩展org.apache.struts.action.ActionForm类。每个都必须以HTTP响应进行应答。 通常, Struts Action并不自行加工响应信息,而是将请求转发到其他资源,比如JSP 页面。Struts 提供一个ActionForward类,用来将一个页面的路径存储为逻辑名称。当完成业务逻辑后,Action 选择并向Servlet返回一个ActionForwardServlet然后使用存储在ActionForward对象中的路径来调用页面完成响应。

Struts将这些细节都绑定在一个ActionMapping对象中。每个ActionMapping相对于一个特定的路径。当某个路径被请求时,Servlet就查询ActionMapping对象。ActionMapping对象告诉servlet,哪个ActionsActionFormsActionForwards将被使用。所有这些细节,关于ActionActionFormActionForwardActionMapping,以及其他一些东西,都在struts-config.xml文件中定义。ActionServlet在启动时读取这个配置

1.1Struts组件

Fig. 1.1 Struts Component

文件,并创建一个配置对象数据库。在运行时,Struts应用根据

文件创建配置对象,而不是文件本身。下图显示了这些组件是如何一起工作的。Struts的核心是一个MVC风格的控制器。Struts控制器搭起了ModelView之间的桥梁。框架也包括开发人员想用来开发可伸缩的、先进的应用的其他组件。Struts是一个“隐藏支柱”的集合,帮助开发人员将分散的材料如数据库和页面,结合成整体的应用程序。我们再来介绍一下Struts的控制流,图 1.2UML次序图的方式展示了Struts 请求-响应流程。

我们来按这个请求-响应流程走一遍:

客户请求匹配Action URI 样式的路径 (1)

容器将请求传递给ActionServlet

如果这个是模块化应用,ActionServlet 选择响应的模块。

ActionServlet 查询路径的映射。

如果映射标明了一个Form BeanActionServlet 看是否已经有一个实例,或者创建一个新的实例 (1.1)。如果已经有一个Form BeanActionServlet 重设它,并根据HTTP请求重新组装它。

如果 mapping validate 属性设置为 true, 它将调用 Form Bean validate 方法(1.2)

如果失败,Servlet 将控制转发到input 属性标明的路径,控制流终止。

如果mapping 标明一个Action 类型,如果它已经存在或已经实例化,它将被重用(1.3)

Actionperform execute 方法被调用,并传递一个实例化的form bean (或者null)

Action 可以组装Form Bean, 调用业务对象,以及其他需要做的事情。 (1.3.1-1.3.4)

Action 返回一个ActionForward ActionServlet (1.3.5)

如果ActionForward 指向另一个 Action URI,重新开始; 否则,显示页面或者其他资源,流程结束。通常,结果是一个JSP页面,或者Jasper, 或其它类似技术 ( Struts)加工的页面。 (2, 3).

1.2 Struts事件顺序图

Fig. 1.2 Struts Sequence Figure

     如果JSP 使用Struts HTML 标记, 并且在请求中看到正确的ActionForm (1.1),他们会从ActionForm中组装HTML控件。否则,<html:form>标记将创建一个。从Struts 1.1开始, 如果form 标记自行创建一个ActionForm ,它将调用ActionFormReset方法。如果你只是想创建一个空白的表单 (1.1),你可以使用标准的ForwardAction来通过Action传递控制,然后离开页面。

 

 

 

1.3 于业务逻辑层的EJB技术简介

 

 

 

J2EEJava 2 Enterprise Bean)环境以企业服务的形式提供了支撑企业应用的各种基石,例如邮件、数据库连接、消息和事务处理等。这些最基本的服务以接口、类库、驱动程序、适配器等形式提供。就像一个操作系统一样,J2EE提供了在各种服务之上的一个公共的Java接口。各个底层服务的实现细节不尽相同,可能存在细微的差别,公共的Java接口使得应用的代码完全脱离了细节问题的纠缠。

WEB容器和EJB容器之内的应用组件通过调用J2EE企业服务,来访问企业系统内可用的资源和服务。这类资源和服务的范围相当广泛,从简单的数据库访问到通过消息/CICS环境执行的大型主机访问,应有尽有。

J2EE框架下,EJBEnterprise java bean)逐渐成为分布式可伸缩的业务逻辑组件,它们封装了企业Java工程的核心业务逻辑和数据模型元素。EJB驻留在称为EJB容器的特殊环境之内,EJB容器由应用服务器提供。J2EE规范定义了开发者编写的应用EJB与容器环境的关系(contract)。

开发EJB必须符合一定的接口要求,这些接口中的一部分方法由开发者实现,一部分由EJB容器提供者(或应用服务器厂商)实现。从某个方面来看,我们可以把EJB的这种接口要求看成一种隔离业务逻辑实现(开发者编写的方法)与应用基础结构(容器实现的方法)的途径。

EJB组件可以与任意其他EJB交互——不管对方是位于同一个容器之内,还是位于一个远程服务器的不同容器之内。EJB不仅可以调用所有的企业服务,还可以调用所有的自定义组件库和服务访问库。

2 StrutsEJB框架

 

2.1使用StrutsEJB框架创建J2EE应用程序的步骤

 

使用StrutsEJB创建J2EE应用程序十分简单,大大加快了WEB应用的开发速度,步骤如下:

    创建一个新的EJBCommand类。

    struts-config.xml中加入一个路径来调用这个类。

    创建JSP页面。

每一个步骤与Model View ControllerMVC)模型中的元素的对应关系是:EJBCommandModelStrutsControllerJSP页面是View

第一步,创建一个新的EJBCommand类。

EJBCommand类就是一个Java类。StrutsEJB的会话外观(Session Facade)有两个通用组件——StatelessFacade StatefulFacade。这个Facade使业务逻辑开发更容易——不必为每个用例写一个完整的会话bean(或与之相关的接口和DD文件),只需把代码加入到EJBCommand中就可以了。下面是如何写一个EJBCommand类:

    创建一个net.java.dev.strutsejb.EJBCommand的子类。

    覆盖isStateful()方法。

    覆盖executeInStateless executeInStateful方法。

见下面的代码,isStateful方法返回一个布尔值,用它来判断EJBCommand是有状态的还是无状态的会话Bean。如果你的代码逻辑不使用任何会话信息,则这个方法返回false。然后StrutsEJB将调用executeInStateless( )方法;如果你想访问会话信息,则返回trueStrutsEJB将调用executeInStateful方法,在这里你能够访问客户端的会话信息。在这个模式中,StrutsEJB会管理会话信息。例如,保存HttpSession中的有状态会话Bean的参数、删除超时队列中的参数、再次执行等等。

        public class UserCmd extends EJBCommand {

            public void executeInStateless(SessionContext ctx) {

                //business logic goes here

                final String inMsg = (String) paramDTO.get("inMsg");

                  resultDTO.put("outMsg", inMsg);

            }

            public boolean isStateful() {

                return false;

           }

        }

paramDTOresultDTO都继承java.util.Map接口,这些Maps代表一个DTO(Data Transfer Object),用于在WEB层和EJB层传输值。如果想给一个JSP页面传值,或想接收来自JSP页面的值,那就把他加入到paramDTOresultDTO中。基于MapDTOStrutsEJB框架的关键元素。

第二步,在struts-config.xml中加入一个路径。

struts-config.xml文件中添加一个路径,EJBCommand才能够被执行。StrutsEJB提供了一个通用的Action类,名字为DefaultAction。如下:

<action  path="/User"

type="net.java.dev.strutsejb.web.DefaultAction"

name="form"

         scope="request"

 parameter="UserCmd">

         <forward name="Success" path="/User.jsp"/>

</action>

通常,在Struts编程中,每一个工作流程步骤都有一个Action类。使用StrutsEJB,几乎所有的Actions都由一个的DefaultAction类处理,它可以调用任意的EJBCommand。对于大项目而言,潜在地会有上百个Action类,所以获得较高的工作效率是非常重要的。与一般的Action映射唯一不同的就是,你要在action标签的“parameter”属性中指定EJBCommand类的全名。DefaultAction会检查这个属性,并且执行相对应EJBCommand

name”属性指的是ActionForm的“form”。它是DefaultForm的一个实例,与DefaultAction共同合作。form实例在缺省的struts-config.xml文件中是按如下声明的:

       <form-bean name="form"

type="net.java.dev.strutsejb.web.DefaultForm"/>

DefaultForm是一个通用的Action Form,它能够接受HTML表单的任意参数,而不需要声明各个域是存储器还是在一个外部xml文件中。如果你想添加一个域,就尽管把它添加到HTML表单里,你可你通过paramDTOresultDTO访问他。

第三步,用JSTL写JSP页面

我们推荐使用Struts标签写HTML表单(例如:<html:×××>命名空间的标签)。而其他的,我们强烈推荐使用JSTL标签。如下:

        <%@ page language="java" session="false"%>

        <%@ taglib uri="http://jakarta.apache.org/struts/tags-html-el" prefix="html" %>

        <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

        <html:form action="/User ">

               <html:text property="dto(inMsg)"/>

               <html:submit value="shout"/>

        </html:form>                         

        result = <c:out value="${dto.outMsg}"/>

    声明中的第2行所使用的是struts-html标签。尽管我们将使用JSTL标签,但是struts-html-el标签比原始的struts-html标签更有用。如果你愿意,你仍旧可以使用原始的struts-html标签和其他的标签库。

怎样访问DTO呢?让我们看看HTML表单中的“property”属性。给每个property都命名为“dto(xxx)”,这样,StrutsEJBDefaultForm就会自动地get/set这些域值。例如,如果使用一个html:text标签,并且把它的property属性的值设置为“dto(foo)”DefaultForm就会读取property“foo”,并把获得的值传给paramDTO。执行完EJBCommand以后,存储在resultDTO的所有property将会放到DefaultForm中。当访问HTML表单时,Struts将会读取这些property

<c:out>标签指的是一个“dto”属性。它是一个由DefaultAction设置的request-scope属性,使得用JSTL EL可以访问resultDTO。由于resultDTO是一个Map类型,EL表达式“${dto.msg}”指的是:从resultDTO中得到“msg”的值。

下面是StrutsEJB的事件顺序:

    用户向Struts发送一个HTTP GET/POST请求。

    Struts 指派一个 DefaultForm 去读取请求。

    DefaultForm读取所有的命名为“dto(xxx)”properties

    Struts 指派一个DefaultAction去执行一个 action

    DefaultAction执行在struts-config.xml 文件中所指定的一个EJBCommand

    DefaultAction DefaultForm中读取所有的properties,并把他们放在EJBCommand中的paramDTO里。

    DefaultAction 执行 EJBCommand

    DefaultAction从由EJBCommand返回的resultDTO中读取所有的properties并且把它们放在DefaultForm 和请求属性“dto”中。

    Struts DefaultForm 中读取properties,并把他们传递给HTML表单。

JSP页面中的JSTL标签也可以传递一些存储在请求属性“dto”中的值。