`

Struts框架之构建Controller组件

 
阅读更多

一、概述

  在Struts 架构中,Controller主要是ActionServlet,但是对于业务逻辑的操作则主要由Action、ActionMapping、ActionForward这几个组件协调完成。其中,Action扮演了真正的业务逻辑的实现者,而ActionMapping和ActionForward则指定了不同业务逻辑或流程的运行方向。

应用程序的 Controller 部分集中于从客户端接收请求(典型情况下是一个运行浏览器的用户),决定执行什么商业逻辑功能,然后将产生下一步用户界面的责任委派给一个适当的View组件。在Struts中,controller的基本组件是一个ActionServlet 类的servlet。这个servlet通过定义一组映射(由Java接口 ActionMapping 描述)来配置。每个映射定义一个与所请求的URI相匹配的路径和一个 Action 类(一个实现 Action 接口的类)完整的类名,这个类负责执行预期的商业逻辑,然后将控制分派给适当的View组件来创建响应。

  Struts也支持使用包含有运行框架所必需的标准属性之外的附加属性的 ActionMapping 类的能力。这允许我们保存特定于我们的应用程序的附加信息,同时仍可利用框架其余的特性。另外,Struts允许我们定义控制将重定向到的逻辑名,这样一个行为方法可以请求"主菜单"页面,而不需要知道相应的JSP页面的实际名字是什么。这个功能极大地帮助我们分离控制逻辑(下一步做什么)和显示逻辑(相应的页面的名称是什么)。

二、创建Controller组件

  Struts包括一个实现映射一个请求URI到一个行为类的主要功能的servlet。因此我们的与Controller有关的主要责任是:

  为每一个可能接收的逻辑请求写一个 Action 类(也就是,一个 Action 接口的实现);写一个定义类名和与每个可能的映射相关的其它信息的 ActionMapping 类(也就是,一个 ActionMapping 接口的实现);写行为映射配置文件(用XML)用来配置controller servlet。

  为应用程序更新web应用程序展开描述符文件(用XML)用来包括必需的Struts组件,我们给应用程序添加适当的Struts组件。

  1、Action 实现

  Action 接口定义一个单一的必须由一个 Action 类实现的方法,就象下面这样:

public ActionForward perform(ActionServlet servlet,
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException;


  一个 Action 类的目标是处理这个请求,然后返回一个标识JSP页面的 ActionForward 对象,控制应该重定向这个JSP页面以生成相应的响应。Struts 架构为应用系统中的每一个Action类只创建一个实例。因为所有的用户都使用这一个实例,所以你必须确定你的Action 类运行在一个多线程的环境中。

注意,客户自己继承的Action子类,必须重写execute()方法,因为Action类在默认情况下是返回null的。

  在 Model 2 设计模式中,一个典型的 Action 类将在它的 perform() 方法中实现下面的逻辑:

  验证用户session的当前状态(例如,检查用户已经成功地注册)。如果 Action 类发现没有注册存在,请求应该重定向到显示用户名和口令用于注册的JSP页面。应该这样做是因为用户可能试图从"中间"(也就是,从一个书签)进入我们的应用程序,或者因为session已经超时并且servlet容器创建了一个新的session。如果验证还没有发生(由于使用一个实现 ValidatingActionForm 接口的form bean),验证这个 form bean 的属性是必须的。如果发现一个问题,当作一个请求属性保存合适的出错信息关键字,然后将控制重定向回输入表单这样错误可以被纠正。

  执行要求的处理来处理这个请求(例如在数据库里保存一行)。这可以用嵌入 Action 类本身的代码来完成,但是通常应该调用一个商业逻辑bean的一个合适的方法来执行。更新将用来创建下一个用户界面页面的服务器端对象(典型情况下是request范围或session范围beans,定义我们需要在多长时间内保持这些项目可获得)。返回一个标识生成响应的JSP页面的适当的 ActionForward 对象,基于新近更新的beans。典型情况下,我们将通过接收到的 ActionMapping 对象(如果我们使用一个局部于与这个映射上的逻辑名)或者在controller servlet 本身(如果我们使用一个全局于应用程序的逻辑名)上调用 findForward() 得到一个对这样一个对象的引用。

  当为 Action 类编程时要记住的设计要点包括以下这些:

  controller servlet仅仅创建一个我们的 Action 类的实例,用于所有的请求。这样我们需要编写我们的 Action 类使其能够在一个多线程环境中正确运行,就象我们必须安全地编写一个servlet的 service() 方法一样。

  帮助线程安全编程的最重要的原则就是在我们的 Action 类中仅仅使用局部变量而不是实例变量。局部变量创建于一个分配给每个请求线程的栈中,所以没有必要担心会共享它们。

  尽管不应该,代表我们的系统中Model部分的的beans仍有可能抛出违例。我们应该在我们的 perform() 方法的逻辑中捕捉所有这样的违例,并且通过执行以下语句将它们记录在应用程序的日志文件中(包括相应的栈跟踪信息):

servlet.log("Error message text", exception);


  作为一个通用的规则,分配很少的资源并在来自同一个用户(在用户的session中)的请求间保持它们会导致可伸缩性的问题。另外,我们将会想要防止出现非常大的 Action 类。最简单的实现途径是将我们的功能逻辑嵌入到 Action 类本身,而不是将其写在独立的商业逻辑beans中。除了使 Action 类难于理解和维护外,这种方法也使得难于重用这些商业逻辑代码,因为代码被嵌入到一个组件(Action 类)中并被捆绑运行于web应用程序环境中。

  包括在Struts中的例子程序某种程度上延伸了这个设计原则,因为商业逻辑本身是嵌入到 Action 类中的。这应该被看作是在这个样本应用程序设计中的一个bug,而不是一个Struts体系结构中的固有特性,或者是一个值得仿效的方法。

2、ActionMapping实现

  为了成功地运行,Struts的controller servlet需要知道关于每个URI该怎样映射到一个适当的 Action 类的几件事。需要了解的知识封装在一个叫做 ActionMapping 的Java接口中,它有以下属性:

  actionClass :用于这个映射的 Action 类完整的Java类名。第一次一个特定的映射被使用,一个这个类的实例将被创建并为以后重用而保存。

  formAttribute :session范围的bean的名字,当前的这个映射的 ActionForm 被保存在这个bean之下。如果这个属性没有被定义,没有 ActionForm 被使用。

  formClass :用于这个映射的 ActionForm 类完整的Java类名。如果我们在使用对form beans的支持,这个类的一个实例将被创建并保存(在当前的用户会话中)

  path :匹配选择这个映射的请求的URI路径。看下面如何匹配的例子。

  Struts在一个叫做 ActionMappingBase 的类中包括了一个 ActionMapping 接口的方便的实现。如果我们不需要为我们自己的映射定义任何附加的属性,尽管把这个类作为我们的 ActionMapping 类好了,就向下面部分描述的那样配置。然而,定义一个 ActionMapping 实现(多半是扩展 ActionMappingBase 类)来包含附加的属性也是可能的。controller servlet知道怎样自动配置这些定制属性,因为它使用Struts的Digester模块来读配置文件。

  包括在Struts的例子程序中,这个特性用来定义两个附加的属性:

  failure :如果Action类检测到它接收的输入字段的一些问题,控制应该被重定向到的上下文相关的URI。典型情况下是请求发向的JSP页面名,它将引起表单被重新显示(包含Action类设置的出错消息和大部分最近的来自ActionForm bean的输入值)。

  success :如果Action类成功执行请求的功能,控制应该被重定向到的上下文相关的URI。典型情况下是准备这个应用程序的会话流的下一个页面的JSP页面名。

  使用这两个额外的属性,例子程序中的 Action 类几乎完全独立于页面设计者使用的实际的JSP页面名。 这个页面可以在重新设计时被重命名,然而几乎不会影响到 Action 类本身。如果"下一个"JSP页面的名字被硬编码到 Action 类中,所有的这些类也需要被修改。

  3、ActionForward实现

  目的是控制器将Action类的处理结果转发至目的地。

  Action类获得ActionForward实例的句柄,然后可用三种方法返回到ActionServlet,所以我们可以这样使用ActionForward():ActionServlet根据名称获取一个全局转发;ActionMappin实例被传送到perform()方法,并根据名称找到一个本地转发。

  另一种是调用下面的一个构造器来创建它们自己的一个实例:

public ActionForward()
public ActionForward(String path)
public ActionForward(String path,Boolean redirect)

  4、Action映射配置文件

  controller servlet怎样知道我们想要得到的映射?写一个简单地初始化新的 ActionMapping 实例并且调用所有适当的set方法的小的Java类是可能的(但是很麻烦)。为了使这个处理简单些,Struts包括一个Digester模块能够处理一个想得到的映射的基于XML的描述,同时创建适当的对象。

  开发者的责任是创建一个叫做 action.xml 的XML文件,并且把它放在我们的应用程序的WEB-INF目录中。(注意这个文件并不需要 DTD,因为实际使用的属性对于不同的用户可以是不同的)最外面的XML元素必须是<action-mappings>,在这个元素之中是嵌入的0个或更多的 <action> 元素 -- 每一个对应于我们希望定义的一个映射。

  来自例子程序的 action.xml 文件包括"注册"功能的以下映射条目,我们用来说明这个需求:

<action-mappings>
 <forward name="logon" path="/logon.jsp"/>
 <action path="/logon" actionClass="org.apache.struts.example.LogonAction"
formAttribute="logonForm" formClass="org.apache.struts.example.LogonForm" inputForm="/logon.jsp">
  <forward name="success" path="/mainMenu.jsp"/>
 </action>
</action-mappings>

  就象我们所看到的,这个映射匹配路径 /logon (实际上,因为例子程序使用扩展匹配,我们在一个JSP页面指定的请求的URI结束于/logon.do)。当接收到一个匹配这个路径的请求时,一个 LogonAction 类的实例将被创建(仅仅在第一次)并被使用。controller servlet将在关键字 logonForm 下查找一个session范围的bean,如果需要就为指定的类创建并保存一个bean。

  这个 action 元素也定义了一个逻辑名"success",它在 LogonAction 类中被用来标识当一个用户成功注册时使用的页面。象这样使用一个逻辑名允许将 action 类隔离于任何由于重新设计位置而可能发生的页面名改变。

  这是第二个在任何 action 之外宣告的 forward 元素,这样它就可以被所有的action全局地获得。在这个情况下,它为注册页面定义了一个逻辑名。当我们调用 mapping.findForward() 时在我们的 action 代码中,Struts首先查找这个action本地定义的逻辑名。如果没有找到,Struts会自动为我们查找全局定义的逻辑名。
5、Web应用程序展开描述符

  设置应用程序最后的步骤是配置应用程序展开描述符(保存在文件WEB-INF/web.xml中)以包括所有必需的Struts组件。作为一个指南使用例子程序的展开描述符,我们看到下面的条目需要被创建或修改。

  1)配置ActionServlet实例

  添加一个条目定义actionservlet本身,同时包括适当的初始化参数。这样一个条目看起来象是这样:

<servlet>
 <servlet-name>action</servlet-name>
 <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
 <init-param>
  <param-name>application</param-name>
  <param-value>org.apache.struts.example.ApplicationResources</param-value>
 </init-param>
 <init-param>
  <param-name>config</param-name>
  <param-value>/WEB-INF/action.xml</param-value>
 </init-param>
 <init-param>
  <param-name>debug</param-name>
  <param-value>2</param-value>
 </init-param>
 <init-param>
  <param-name>mapping</param-name>
  <param-value>org.apache.struts.example.ApplicationMapping</param-value>
 </init-param>
 <load-on-startup>2</load-on-startup>
</servlet>

  controller servlet支持的初始化参数在下面描述,拷贝自 ActionServlet 类的 Javadocs 。方括号描述如果我们没有为那个初始化参数提供一个值时假设的缺省值。

  application :应用程序资源包基类的Java类名。[NONE]

  config :包含配置信息的XML资源的上下文相关的路径。[/WEB-INF/action.xml]

  debug :这个servlet的调试级别,它控制记录多少信息到日志中。[0]

  digester : 我们在 initMapping() 中利用的Digester的调试级别,它记录到System.out而不是
servlet的日志中。[0]

  forward :使用的ActionForward实现的Java类名。[org.apache.struts.action.ActionForward]

  mapping :使用的ActionMapping实现的Java类名。[org.apache.struts.action.ActionMappingBase]

  nocache : 如果设置为 true,增加HTTP头信息到所有响应中使浏览器对于生成或重定向到的任何响应不做缓冲。[false]

  null :如果设置为 true,设置应用程序资源使得如果未知的消息关键字被使用则返回 null。否则,一个包括不欢迎的消息关键字的出错消息将被返回。[true]

  2)配置ActionServlet映射

  有两种通常的方法来定义将被controller servlet处理的URL:前缀匹配和扩展匹配。每种方法的一个适当的映射条目将在下面被描述。

  前缀匹配意思是我们想让所有以一个特殊值开头(在上下文路径部分之后)的URL传递给这个servlet。这样一个条目看起来可以象是这样:

<servlet-mapping>
 <servlet-name>action</servlet-name>
 <url-pattern>/execute/*</url-pattern>
</servlet-mapping>

  它意味着一个匹配前面描述的 /logon 路径的请求的URL看起来象是这样:
http://www.mystudy.com/myapplication/execute/logon

  这里 /myapplication是我们的应用程序展开所在的上下文路径。

  另一方面,扩展映射基于URL以一个跟着定义的一组字符的句点结束的事实而将URL匹配到action servlet 。例如,JSP处理servlet映射到 *.jsp 模式这样它在每个JSP页面请求时被调用。为了使用 *.do 扩展(它意味着"做某件事")映射条目看起来应该象是这样:

<servlet-mapping>
 <servlet-name>action</servlet-name>
 <url-pattern>*.do</url-pattern>
</servlet-mapping>

  并且一个匹配以前描述的 /logon 路径的请求的URI可以看起来象是这样:
http://www.mystudy.com/myapplication/logon.do

  3)配置Struts标记库

  下一步,我们必须添加一个定义Struts标记库的条目。这个条目看起来应该象是这样:

<taglib>
 <taglib-uri>/WEB-INF/struts.tld</taglib-uri>
 <taglib-location>/WEB-INF/struts.tld</taglib-location>
</taglib>

  它告诉JSP系统到哪里去找这个库的标记库描述符(在我们的应用程序的WEB-INF目录)。

  4)添加Struts组件到我们的应用程序中

  为了在我们的应用程序运行时使用Struts,我们必须将 struts.tld 文件拷贝到我们的 WEB-INF 目录,将struts.jar 文件拷贝到我们的 WEB-INF/lib 。
分享到:
评论

相关推荐

    Struts框架之构建Controller组件.rar

    Struts框架是Java Web开发中广泛使用的一个开源MVC(Model-View-Controller)框架,它简化了构建...通过学习并掌握以上知识点,开发者能够有效地利用Struts框架构建Controller组件,创建出高效、可维护的Java Web应用。

    Struts 框架之构建 Model组件.rar

    通过以上讲解,我们可以看到构建Model组件在Struts框架中的重要性。一个良好的Model设计能够提高代码的可读性、可维护性和可扩展性,从而提升整个应用的质量。在实际开发中,根据项目需求选择合适的方式构建Model...

    struts框架原理图

    Struts框架的核心组件包括ActionServlet、ActionForm、Action和ActionForward等,它们共同协作完成业务逻辑处理和视图展示。 ### Struts框架工作原理详解 #### 1. 请求处理流程 当用户通过浏览器向服务器发送请求...

    struts框架与标签.doc

    总之,Struts框架为构建企业级的Java Web应用提供了一种强大且结构化的解决方案,它的组件和标签库让开发者能够快速、高效地开发出可维护的Web应用。同时,它鼓励社区参与,不断更新和完善,以适应开源软件的快速...

    Struts框架分析与应用.pdf

    - **struts-config.xml**:Struts框架的核心配置文件,用于定义ActionServlet如何处理用户请求,以及ActionForm Bean和其他组件的配置。 #### 四、Struts框架的缺点 尽管Struts框架拥有许多优点,但也存在一些...

    struts框架详细介绍

    Struts框架是一个基于MVC(模型-...总之,Struts框架通过提供一套规范和组件,简化了Java Web应用的开发过程,增强了代码的可维护性和可扩展性。理解并熟练运用Struts的组件和配置,能够有效地提升开发效率和应用质量。

    Struts框架应用于jsp中

    Struts框架是Java Web开发中的一个关键组件,它在JSP(JavaServer Pages)基础上提供了一种更规范、更易维护的MVC(Model-View-Controller)架构。标题"Struts框架应用于jsp中"表明我们将探讨如何在JSP应用程序中...

    Struts框架(Struts框架详细介绍)

    Struts框架旨在提供一种结构化的、可维护性高的开发方式,帮助开发者构建动态的、数据驱动的Web应用。 1. **Struts压缩包内容** Struts框架的下载通常包含以下部分: - `struts.jar`:核心库,包含所有必要的类和...

    Struts框架的学习

    Struts框架是Java Web开发中的一个关键组件,它遵循MVC(Model-View-Controller)设计模式,旨在简化Web应用程序的构建。以下是Struts框架的核心知识点及其详细解释: 1. **MVC模式**:MVC模式是软件设计的一种架构...

    Struts框架讲解

    Struts框架是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它在1990年代末由Apache软件基金会的Jakarta项目推出。MVC模式是一种将业务逻辑、用户界面和数据访问分离开来的方法,使得代码更...

    struts框架\Struts框架的使用.ppt

    Struts框架是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在JSP Model2设计模式的基础上进行了进一步的抽象和优化,旨在提供更清晰的职责划分和更好的可扩展性,尤其适合大型项目的开发...

    重构mvc实现struts框架

    **标题解析:** "重构mvc实现struts框架" 这个标题表明了我们要探讨的主题是关于软件开发中的重构过程,特别关注的是如何从一个简单的MVC(Model-View-Controller)模型出发,逐步演进到实现Struts框架的初步形态。...

    Java开发struts框架包

    Struts框架的核心设计理念是分离控制逻辑(Controller)与业务逻辑(Action)以及视图(View),从而实现模型-视图-控制器(MVC)的设计模式。 标题中的“Java开发struts框架包”通常指的是包含了Struts框架所需的...

    struts框架的最简单应用,懂的就不用下了

    Struts框架是Java Web开发中的一个关键工具,它基于Model-View-Controller(MVC)设计模式,旨在简化Web应用程序的构建。这个压缩包可能是为了帮助初学者理解并开始使用Struts框架的基础知识。 首先,Struts框架的...

    自己构建Struts框架的基本思路

    构建Struts框架是一个复杂而有趣的过程,涉及到对MVC(模型-视图-控制器)设计模式的理解和实际应用。在本文中,我们将探讨如何自己构建一个基于Struts2的简单框架,了解其基本思路和主要步骤。 首先,Struts2是...

    struts框架写的房屋销售管理系统

    Struts框架是一个基于MVC...通过这个项目,开发者可以学习到如何使用Struts框架构建一个实际的Web应用,包括数据库设计、用户界面开发、业务逻辑处理等多个方面。同时,对于团队协作和项目管理也有一定的实践价值。

    struts,struts,struts框架

    总结起来,Struts框架是Java Web开发中实现MVC模式的重要工具,它通过提供控制器、模型和视图的组件,以及一套完整的生命周期管理机制,帮助开发者构建结构清晰、易于维护的Web应用。Struts不仅包含控制器组件,还...

    基于Struts框架的网上书店毕业论文

    这篇“基于Struts框架的网上书店毕业论文”可能深入探讨了如何使用Struts来构建一个完整的在线图书销售系统。以下是该主题可能涉及的一些核心知识点: 1. **Struts框架基础**:首先,论文可能会介绍Struts的基本...

    struts框架及校验框架详解

    Struts框架是Java Web开发中的一个关键组件,它属于Java EE(J2EE)平台的一部分,主要用于构建MVC(Model-View-Controller)模式的应用程序。这个框架的主要目的是提高开发效率,提供更好的结构管理和控制流程,...

    基于struts框架mvc模式应用的实现

    本文主要探讨Struts框架在MVC(Model-View-Controller)模式下的应用实现,旨在为读者提供一个深入理解Struts框架及其在Web开发中作用的机会。通过详细解析MVC模式的基本原理以及Struts框架的核心组成部分,本文旨在...

Global site tag (gtag.js) - Google Analytics