Jakarta Struts应用的七个履历
当前位置:以往代写 > JAVA 教程 >Jakarta Struts应用的七个履历
2019-06-14

Jakarta Struts应用的七个履历

Jakarta Struts应用的七个履历

副标题#e#

编者按:本文论述了作者在运用Struts进程中来之不易的若干履历和心得。假如你是jsp和servlet开拓Web应用的Java措施员,而且也正在思量回收基于Struts的构建要领的话,那么你会在这里发明许多颇有见解同时也很有代价的信息。

1. 只在须要的时候才思量扩展Struts框架

一个好的framework有许多利益,首先,它必需可以或许满意用户的可预见的需求。为此 Struts为Web 应用提供了一个通用的架构,这样开拓人员可以把精神会合在如何办理实际业务问题上。其次,一个好的framework还必需可以或许在适当的处所提供扩展接口,以便应用措施能扩展该框架来更好的适应利用者的实际需要。

假如Struts framework在任何场所,任何项目中都能很好的满意需求,那真是太棒了。可是实际上,没有一个框架声称能做到这一点。必然会有一些特定的应用需求是框架的开拓者们无法预见到的。因此,最好的步伐就是提供足够的扩展接口,使得开拓工程师可以或许调解struts来更好的切合他们的非凡要求。

在Struts framework中有许多处所可供扩展和定制。险些所有的设置类都能被替换为某个用户定制的版本,这只要简朴的修改一下Struts的设置文件就可以做到。

其他组件如ActionServlet和 RequestProcessor 也能用自界说的版本取代. 甚至连Struts 1.1里才有的新特性也是凭据扩展的原则来设计的。譬喻,在异常处理惩罚机制中就答允用户定制异常处理惩罚的句柄,以便更好的对应用系统产生的错误做出响应。

作为框架的这种可调解特性在它更适合你的应用的同时也在很大的水平上影响了项目开拓的结果。首先,由于您的应用是基于一个现有的成熟的、不变的framework如Struts,测试进程中发明的错误数量将会大大淘汰,同时也能缩短开拓时间和淘汰资源的投入。因为你不再需要投入开拓气力用于编写基本框架的代码了。

然而, 实现更多的成果是要耗费更大的价钱的。我们必需小心制止不须要的滥用扩展机能, Struts是由焦点包加上许多东西包组成的,它们已经提供了许多已经实现的成果。因此不要盲目标扩展Struts框架,要先确定能不能回收其他要领利用现有的成果来实现。 在抉择编写扩展代码前务须要确认Struts简直没有实现你要的成果。不然反复的成果会导致杂乱未来还得耗费特另外精神排除它。

2. 利用异常处理惩罚声明

要界说应用措施的逻辑流程,成熟的履历是推荐在代码之外,用设置的要领来实现,而不是写死在措施代码中的。在J2EE中,这样的例子触目皆是。从实现EJB的安详性和事务性行为到描写JMS动静和目标地之间的干系,许多运行时的处理惩罚流程都是可以在措施之外界说的。

Struts 建设者从一开始就回收这种要领,通过设置Struts的设置文件来定制应用系统运行时的各个方面。这一点在版本1.1的新特性上获得延续,包罗新的异常处理惩罚成果。在Struts framework以前的版本中,开拓人员不得不本身处理惩罚Struts应用中产生的错误环境。在最新的版本中,环境大大的更改了,Struts Framework提供了内置的一个称为 ExceptionHandler 的类, 用于系统缺省处理惩罚action类运行中发生的错误。这也是在上一个能力中我们提到的framework很多可扩展接口之一。

Struts缺省的 ExceptionHandler类会生成一个ActionError工具并生存在适当的范畴(scope)工具中。这样就答允JSP页面利用错误类来提醒用户呈现什么问题。假如你认为这不能满意你的需求,那么可以很利便的实现你本身的ExcepionHandler类。

详细定制异常处理惩罚的要领和机制

要定制本身的异常处理惩罚机制,第一步是担任org.apache.struts.action.ExceptionHandler类。这个类有2个要领可以包围,一个是excute()别的一个是storeException(). 在大都环境下,只需要包围个中的excute()要领。下面是ExceptionHandler类的excute()要领声明:

Jakarta Struts应用的七个经历


#p#副标题#e#

正如你看到的,该要领有好几个参数,个中包罗原始的异常。要领返回一个ActionForward工具,用于异常处理惩罚竣事后将controller类带到请求必需转发的处所去。

虽然您可以实现任那里理惩罚,但一般而言,我们必需查抄抛出的异常,并针对该范例的异常举办特定的处理惩罚。缺省的,系统的异常处理惩罚成果是建设一个堕落信息,同时把请求转发到设置文件中指定的处所去。 定制异常处理惩罚的一个常见的例子是处理惩罚嵌套异常。假设该异常包括有嵌套异常,这些嵌套异常又包括了其他异常,因此我们必需包围本来的execute()要领,对每个异常编写堕落信息。

一旦你建设了本身的ExceptionHandler 类,就应该在Struts设置文件中的部门声明这个类,以便让Struts知道改用你自界说的异常处理惩罚代替缺省的异常处理惩罚.

#p#分页标题#e#

可以设置你本身的ExceptionHandler 类是用于Action Mapping特定的部门照旧所有的Action工具。假如是用于Action Mapping特定的部门就在元素中设置。假如想让这个类可用于所有的Action工具,可以在 元素中指定。譬喻,假设我们建设了异常处理惩罚类CustomizedExceptionHandler用于所有的Action类, 元素界说如下所示:

Jakarta Struts应用的七个经历

在元素中可以对许多属性举办配置。在本文中,最重要的属性莫过于handler属性, handler属性的值就是自界说的担任了ExceptionHandler类的子类的全名。 如果该属性没有界说,Struts会回收本身的缺省值。虽然,其他的属性也很重要,但假如想包围缺省的异常处理惩罚的话,handler无疑是最重要的属性。

最后必需指出的一点是,你可以有差异的异常处理惩罚类来处理惩罚差异的异常。在上面的例子中,CustomizedExceptionHandler用来处理惩罚任何java.lang.Exception的子类. 其实,你也可以界说多个异常处理惩罚类,每一个专门处理惩罚差异的异常树。下面的XML片段表明白如何设置以实现这一点。

Jakarta Struts应用的七个经历

在这里,一旦有异常抛出,struts framework将试图在设置文件中找到ExceptionHandler,假如没有找到,那么struts将沿着该异常的父类链一层层往上找直到发明匹配的为止。因此,我们可以界说一个条理型的异常处理惩罚干系布局,在设置文件中已经浮现了这一点。

3. 利用应用模块(Application Modules)

Struts 1.1的一个新特性是应用模块的观念。应用模块答允将单个Struts应用分别成几个模块,每个模块有本身的Struts设置文件,JSP页面,Action等等。这个新特性是为了办理大中型的开拓步队诉苦最多的一个问题,即为了更好的支持并行开拓答允多个设置文件而不是单个设置文件。

注:在早期的beta版本中,该特性被称为子应用(sub-applications),最近的更款式的是为了更多地反应它们在逻辑上的分工。

显然,当许多开拓人员一起介入一个项目时,单个的Struts设置文件很容易引起资源斗嘴。应用模块答允Struts凭据成果要求举办分别,很多环境已经证明这样更贴近实际。譬喻,假设我们要开拓一个典范的商店应用措施。可以将构成部门分别成模块好比catalog(商品目次), customer(顾主), customer service(顾主处事), order(订单)等。每个模块可以漫衍到差异的目次下,这样各部门的资源很容易定位,有助于开拓和陈设。图1 显示了该应用的目次布局。

Jakarta Struts应用的七个经历

图 1. 一个典范的商店应用措施的目次布局

注:假如你无需将项目分别成多个模块,Struts框架支持一个缺省的应用模块。这就使得应用措施也可以在1.0版本下建设,具有可移植性,因为应用措施会自行动为缺省的应用模块。

为了利用多应用模块成果,必需执行以下几个筹备步调:

· 为每个应用模块建设独立的Struts设置文件。

· 设置Web 陈设描写符 Web.xml文件。

· 利用org.apache.struts.actions.SwitchAction 来实现措施在模块之间的跳转.

#p#副标题#e#

建设独立的Struts设置文件

每个Struts应用模块必需拥有本身的设置文件。答允建设本身的独立于其他模块的Action,ActionForm,异常处理惩罚甚至更多。

继承以上面的商店应用措施为例,我们可以建设以下的设置文件:一个文件名为struts-config-catalog.xml,包括catalog(商品目次)、items(商品清单)、和其它与库存相关的成果的设置信息;另一个文件名为struts- config-order.xml, 包括对order(订单)和order tracking(订单跟踪)的配置。第三个设置文件是struts-config.xml,个中含有属于缺省的应用模块中的一般性的成果。

设置Web陈设描写符

在Struts的早期版本中,我们在Web.xml中指定Struts设置文件的路径。亏得这点没变,有助于向后兼容。但对付多个应用模块,我们需要在Web陈设描写符中增加新的设置文件的设定。

对付缺省的应用(包罗Struts的早期版本),Struts framework 在Web.xml文件中查找带有config的元素,用于载入Action mapping 和其它的应用措施设定。作为例子,以下的XML片段揭示一个典范的元素:

Jakarta Struts应用的七个经历

注:假如在现有的元素中找不到"config"要害字,Struts framework将缺省地利用/WEB/struts-config.xml

#p#分页标题#e#

为了支持多个应用模块(Struts 1.1的新特性),必需增加附加的元素。与缺省的元素差异的是,附加的元素与每个应用模块对应,必需以config/xxx的形式定名,个中字符串xxx代表该模块独一的名字。譬喻,在商店应用措施的例子中,元素可界说如下(留意粗体字部门):

Jakarta Struts应用的七个经历

第一个 元素对应缺省的应用模块。第二和第三个元素别离代表非缺省应用模块catalog 和 order。

当Struts载入应用措施时,它首先载入缺省应用模块的设置文件。然后查找带有字符串config/xxx 形式的附加的初始化参数。对每个附加的设置文件也举办理会并载入内存。这一步完成后,用户就可以很随意地用config/后头的字符串也就是名字来挪用相应的应用模块。

多个应用模块之间挪用Action类

在为每个应用模块建设独立的设置文件之后,我们就有大概需要挪用差异的模块中Action。为此必需利用Struts框架提供的SwitchAction类。Struts 会自动将应用模块的名字添加到URL,就如Struts 自动添加应用措施的名字加到URL一样。应用模块是对框架的一个新的扩充,有助于举办并行的团队开拓。假如你的团队很小那就没须要用到这个特性,不必举办模块化。虽然,就算是只有一个模块,系统照旧一样的运作。

4. 把JSP放到WEB-INF后以掩护JSP源代码

为了更好地掩护你的JSP制止未经授权的会见和窥视, 一个好步伐是将页面文件存放在Web应用的WEB-INF目次下。

凡是JSP开拓人员会把他们的页面文件存放在Web应用相应的子目次下。一个典范的商店应用措施的目次布局如图2所示。跟catalog (商品目次)相关的JSP被生存在catalog子目次下。跟customer相关的JSP,跟订单相关的JSP等都凭据这种要领存放。

Jakarta Struts应用的七个经历

图 2.基于差异的成果 JSP 被安排在差异的目次下

这种要领的问题是这些页面文件容易被偷看到源代码,或被直接挪用。某些场所下这大概不是个大问题,但是在特定景象中却大概组成安详隐患。用户可以绕过Struts的controller直接挪用JSP同样也是个问题。

为了淘汰风险,可以把这些页面文件移到WEB-INF 目次下。基于Servlet的声明,WEB-INF不作为Web应用的民众文档树的一部门。因此,WEB-INF 目次下的资源不是为客户直接处事的。我们仍然可以利用WEB-INF目次下的JSP页面来提供视图给客户,客户却不能直接请求会见JSP。

回收前面的例子,图3显示将JSP页面移到WEB-INF 目次下后的目次布局

Jakarta Struts应用的七个经历

图 3. JSP存放在 WEB-INF 目次下更为安详

假如把这些JSP页面文件移到WEB-INF 目次下,在挪用页面的时候就必需把"WEB-INF"添加到URL中。譬喻,在一个Struts设置文件中为一个logoff action写一个Action mapping。个中JSP的路径必需以"WEB-INF"开头。如下所示:请留意粗体部门.

这个要领在任何环境下都不失为Struts实践中的一个好要领。是独一要留意的能力是你必需把JSP和一个Struts action接洽起来。纵然该Action只是一个很根基的很简朴JSP,也老是要挪用一个Action,再由它挪用JSP。

最后要说明的是,并不是所有的容器都能支持这个特性。WebLogic早期的版本不能表明Servlet声明,因此无法提供支持,据报道在新版本中已经改造了。总之利用之前先查抄一下你的Servlet容器。

#p#副标题#e#

5. 利用 Prebuilt Action类晋升开拓效率

Struts framework带有好几个prebuilt Action类,利用它们可以大大节减开拓时间。个中最有用的是org.apache.struts.actions.ForwardAction 和 org.apache.struts.actions.DispatchAction.

利用 ForwardAction

在应用措施中,大概会常常呈现只要将Action工具转发到某个JSP的环境。在上一点中曾提到老是由Action挪用JSP是个好习惯。假如我们不必在Action中执行任何业务逻辑,却又想遵循从Action会见页面的话,就可以利用ForwardAction,它可以使你免除建设很多空的Action类。运用ForwardAction的长处是不必建设本身的Action类,你需要做的仅仅是在Struts设置文件中设置一个Action mapping。

举个例子,假定你有一个JSP文件index.jsp ,并且不能直接挪用该页面,必需让措施通过一个Action类挪用,那么,你可以成立以下的Action mapping来实现这一点:

Jakarta Struts应用的七个经历

正如你看到的,当 /home 被挪用时, 就会挪用ForwardAction 并把请求转发到 index.jsp 页面.

再接头一下不通过一个Action类直接转发到某个页面的环境,必需留意我们仍然利用元素中的forward属性来实现转发的方针。这时元素界说如下:

Jakarta Struts应用的七个经历

以上两种要领都可以节减你的时间,并有助于淘汰一个应用所需的文件数。

利用 DispatchAction

#p#分页标题#e#

DispatchAction是Struts包括的另一个能大量节减开拓时间的Action类。与其它Action类仅提供单个execute()要领实现单个业务差异,DispatchAction答允你在单个Action类中编写多个与业务相关的要领。这样可以淘汰Action类的数量,而且把相关的业务要领荟萃在一起使得维护起来更容易。

要利用DispatchAction的成果,需要本身建设一个类,通过担任抽象的DispatchAction获得。对每个要提供的业务要领必需有特定的要领signature。譬喻,我们想要提供一个要领来实现对购物车添加商品清单,建设了一个类ShoppingCartDispatchAction提供以下的要领:

Jakarta Struts应用的七个经历

那么,这个类很大概还需要一个deleteItem()要领从客户的购物车中删除商品清单,尚有clearCart()要领排除购物车等等。这时我们就可以把这些要领荟萃在单个Action类,不消为每个要领都提供一个Action类。

在挪用ShoppingCartDispatchAction里的某个要领时,只需在URL中提供要领名作为参数值。就是说,挪用addItem()要领的 URL看起来大概雷同于:

http://myhost/storefront/action/cart?method=addItem

个中method参数指定ShoppingCartDispatchAction中要挪用的要领。参数的名称可以任意设置,这里利用的"method"只是一个例子。参数的名称可以在Struts设置文件中自行设定。

#p#副标题#e#

6.利用动态ActionForm

在Struts framework中,ActionForm工具用来包装HTML表格数据(包罗请求),并返回返回动态显示给用户的数据。它们必需是完全的JavaBean,并担任.Struts 内里的ActionForm类,同时,用户可以有选择地包围两个缺省要领。

该特机能节减许多时间,因为它可以协助举办自动的表示层的验证。ActionForm的独一缺点是必需为差异的HTML表格生成多个ActionForm 类以生存数据。譬喻,假如有一个页面含有用户的注册信息,另一个页面则含有用户的先容人的信息,那么就需要有两个差异的ActionForm类。这在大的应用系统中就会导致过多的ActionForm类。Struts 1.1对此做出了很好的改造,引入了动态ActionForm类观念

通过Struts framework中的DynaActionForm类及其子类可以实现动态的ActionForm ,动态的ActionForm答允你通过Struts的设置文件完成ActionForm的全部设置;再也没有须要在应用措施中建设详细的ActionForm类。详细设置要领是:在Struts的设置文件通过增加一个元素,将type属性设定成DynaActionForm或它的某个子类的全名。下面的例子建设了一个动态的ActionForm名为logonForm,它包括两个实例变量:username 和 password.

Jakarta Struts应用的七个经历

动态的ActionForm可以用于Action类和JSP,利用要领跟普通的ActionForm沟通,只有一个小不同。假如利用普通的ActionForm工具则需要提供get 和 set要领取得和配置数据。以上面的例子而言,我们需要提供getUsername() 和 setUsername()要领取得和配置username变量,同样地有一对要领用于取得和配置password变量.

这里我们利用的是DynaActionForm,它将变量生存在一个Map类工具中,所以必需利用DynaActionForm 类中的get(name) 和 set(name)要领,个中参数name是要会见的实例变量名。譬喻要会见DynaActionForm中username的值,可以回收雷同的代码:

String username = (String)form.get("username");

由于值存放在一个Map工具,所以要记得对get()要领返回的Object工具做强制性范例转换。

DynaActionForm有好几个很有用的子类。个中最重要的是DynaValidatorForm ,这个动态的ActionForm和Validator 一起操作民众的Validator包来提供自动验证。这个特性使你得以在措施代码之外指定验证法则。将两个特性团结利用对开拓人员来说将很是有吸引力。

7. 利用可视化东西

自从Struts 1.0 漫衍以来,就呈现了不少可视化东西用于协助建设,修改和维护Struts的设置文件。设置文件自己是基于XML名目,在大中型的开拓应用中会增大变得很鸠拙。为了更利便的打点这些文件,一旦文件大到你无法一目了然的时候,发起试着回收个中的一种GUI 东西协助开拓。贸易性的和开放源代码的东西都有不少,表1列出了可用的东西和其相关链接,从哪里可以获取更多信息。

表 1. Struts GUI 东西

应用措施 性质 网址
Adalon 贸易软件 http://www.synthis.com/products/adalon
Easy Struts 开放源码 http://easystruts.sourceforge.net/
Struts Console 免费 http://www.jamesholmes.com/struts/console
JForms 贸易软件 http://www.solanasoft.com/
Camino 贸易软件 http://www.scioworks.com/scioworks_camino.html
Struts Builder 开放源码 http://sourceforge.net/projects/rivernorth/
StrutsGUI 免费 http://www.alien-factory.co.uk/struts/struts-index.html

    关键字:

在线提交作业