`
ghy_20081010
  • 浏览: 5172 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Struts 用户指南(3)

阅读更多

4. 创建Controller组件 

 

4.1 概述 

 

现在我们理解了怎样构造你的应用程序的Model和View组件,现在是集中到 Controller 组件的时候了。Struts包括一个实现映射一个请求URI到一个行为类的主要功能的Servlet。因此你的与Controller有关的主要责任是: 

 

为每一个可能接收的逻辑请求写一个 Action 类(也就是,一个 Action 接口的实现) 

 

写一个定义类名和与每个可能的映射相关的其它信息的 ActionMapping 类(也就是,一个 ActionMapping 接口的实现) 

 

写行为映射配置文件(用XML)用来配置controller servlet。 

 

为你的应用程序更新Web应用程序展开描述符文件(用XML)用来包括必需的Struts组件。 

 

给你的应用程序添加适当的Struts组件。 

 

4.2 Action类 

 

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

 

public ActionForward perform(ActionServlet servlet,

ActionMapping mapping,

ActionForm form,

HttpServletRequest request,

HttpServletResponse response)

throws IOException, ServletException;

 

一个 Action 类的目标是处理这个请求,然后返回一个标识JSP页面的 ActionForward 对象,控制应该重定向这个JSP页面以生成相应的响应。在 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 类中仅仅使用局部变量而不是实例变量。局部变量创建于一个分配给(由你的JVM)每个请求线程的栈中,所以没有必要担心会共享它们。 

 

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

 

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

 

作为一个通用的规则,分配很少的资源并在来自同一个用户(在用户的session中)的请求间保持它们会导致可伸缩性的问题。你应该在将控制重定向到适当的View组件前努力释放这样的资源(例如数据库联接) -- 甚至在你调用的一个bean抛出了一个违例时。 

 

另外,你将会想要防止出现非常大的 Action 类。最简单的实现途径是将你的功能逻辑嵌入到 Action 类本身,而不是将其写在独立的商业逻辑beans中。除了使 Action 类难于理解和维护外,这种方法也使得难于重用这些商业逻辑代码,因为代码被嵌入到一个组件(Action类)中并被捆绑运行于web应用程序环境中。 

 

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

 

4.3 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 类中,所有的这些类也需要被修改。 

 

4.4 Action映射配置文件 

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

 

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

 

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

 

<action-mappings>

<forward name="logon" path="/logon.jsp"/>

<action path="/logon"

acti

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会自动为你查找全局定义的逻辑名。 

 

4.5 Web应用程序展开描述符 

 

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

 

4.5.1 配置Action Servlet实例 

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

 

<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] 

 

4.5.2 配置Action Servlet映射 

 

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

 

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

 

<servlet-mapping>

<servlet-name>action</servlet-name>

<url-pattern>/execute/*</url-pattern>

</servlet-mapping>

 

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

 

http://www.mycompany.com/myapplication/execute/logon 

 

这里 /myapplicationis 是你的应用程序展开所在的上下文路径。 

 

另一方面,扩展映射基于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.mycompany.com/myapplication/logon.do 

 

4.5.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.5.4 添加Struts组件到你的应用程序中 

 

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

分享到:
评论

相关推荐

    Struts 用户指南.CHM

    Struts 用户指南.CHM

    Struts 用户指南.rar

    这个“Struts 用户指南”压缩包包含了一份详细的PDF文档,旨在帮助开发者理解和掌握Struts框架的核心概念、设计模式以及实际应用。以下是对Struts框架及其用户指南的详细解释。 1. **Struts框架介绍**:Struts是...

    struts1.3用户指南

    通过阅读《Struts1.3用户指南》,开发者可以深入了解如何配置和使用Struts1.3框架,从而更高效地开发Java Web应用。指南中可能包含各种实例和步骤,帮助读者逐步掌握框架的使用方法,解决实际开发中遇到的问题。无论...

    Struts中文用户指南

    Struts中文用户指南旨在帮助中文用户理解和应用Struts框架,以便构建高效、可维护的Web应用程序。 **1. MVC设计模式** MVC模式是一种将业务逻辑、数据模型与用户界面分离的设计方式。在Struts中: - **Model(模型...

    Struts用户指南

    Struts用户指南

    Struts Menu用户指南

    Struts Menu用户指南

    Struts2权威指南完整版

    3. **Action类和结果类型**:讲解Action类的作用,它是处理用户请求的核心组件。同时,会涉及Result的概念,它是Action执行后的跳转目标,包括内部重定向和外部URL重定向。 4. **拦截器(Interceptors)**:Struts2...

    Struts精要指南Word格式

    3. **Actions和ActionServlet**:Action类是处理用户请求的核心组件,而ActionServlet作为Struts的入口点,负责分发请求。这部分可能会讲解如何编写自定义的Action类,并配置在struts-config.xml中。 4. **JSP标签...

    Struts2权威指南.pdf 清晰中文完整版

    3. **Action类**:在Struts2中,Action类是业务逻辑的主要载体,它处理用户的请求并返回结果。每个Action类对应一个特定的业务操作,可以映射到URL路径。 4. **结果类型与Result**:Action执行后,会返回一个结果...

    Struts2权威指南(全).pdf

    1. **Struts2基础**:Struts2的核心是Action类,它是处理用户请求并执行业务逻辑的主要组件。每个Action都与一个特定的视图关联,通过Result来展示。Struts2使用配置文件(如struts.xml)来定义Action、结果类型和...

    Struts2权威指南 加源码

    3. **插件系统**:Struts2有丰富的插件支持,如Struts2-dojo-plugin、Struts2-json-plugin,它们扩展了框架的功能,便于开发富客户端应用。 4. **异常处理**:Struts2提供了全局异常处理机制,可以统一处理应用程序...

    struts2和struts1 API及使用指南 chm

    "struts2.pdf"可能是关于Struts2的使用指南,涵盖了从基础到高级的使用案例和最佳实践。 学习和使用这两个框架,需要理解MVC设计模式,熟悉Java Web开发,同时掌握Servlet和JSP的基础知识。对XML配置的理解和使用也...

    struts2权威指南源代码

    3. **结果类型与视图**:Struts2支持多种结果类型,如JSP、FreeMarker、Velocity等。结果类型定义了Action执行后如何展示结果页面。通过源代码,我们可以了解不同结果类型的配置和使用。 4. **Interceptor(拦截器...

    Struts 用户指南

    通过本《Struts用户指南》,你将逐步掌握如何利用Struts构建健壮、高效的Web应用,从项目初始化、配置管理到业务逻辑实现,再到视图展示,全方位了解和实践Struts框架。无论是初学者还是有经验的开发者,都能从中...

    STRUTS 指南(chm)

    3. **Action类**:Action类是Struts的核心组件,它实现了用户的业务逻辑。当用户发送请求时,控制器会调用相应的Action类方法来处理。 4. **Form Bean**:Form Bean是Struts中的数据载体,用于在Action和视图之间...

Global site tag (gtag.js) - Google Analytics