CSDN博客

img Explorerwen

一个掌握Struts企业级Web开发框架的实例(二)

发表于2004/10/28 15:48:00  787人阅读

 准备阶段

  一次典型的编辑会话要求有一个动作处理器准备View,即一个作为View的JSP页面,还要求有第二个动作处理器存储更新后的View。当然,存储操作之后会有第二个属于View的页面被显示,例如一个“数据已经更新,点击此处继续”的页面(参见表1)。

   表1:基于Form Bean的编辑过程要用到的部件

部件 说明
CatalogForm Form Bean
EditCategoryAction 准备阶段
EditCategory.jsp 编辑
SaveCategoryAction 存储阶段
EditDone.jsp 确认数据已经保存
EditFailed.jsp “数据没有保存”错误


  下面的代码片断显示了如何在struts-config.xml文件中配置准备阶段:

<action path="/editCategory"
   scope="request"
   name="catForm"
   type="com.strutsdemo.EditCategoryAction"
   unknown="false"
   validate="false">
   <forward name="success"
   path="/EditCategory.jsp"/>
</action>


  在准备阶段,容器尝试从Session或Request找出指定的Form Bean,这是因为在动作中指定了“name=...”。ActionServlet在struts-config.xml文件的区域寻找Form Bean的别名,利用Form Bean的别名寻找对应的Java类。如果用户的请求带有参数,其名字匹配Form Bean属性名字的参数将被设置为属性值。Struts扩展了“属性名字”的含义,使得访问Form Bean内嵌对象的属性成为可能。本文的例子也用到了Struts的这一优点。

  准备好Form Bean之后,ActionServlet接着调用动作的process()方法,Form Bean作为参数之一传入process()方法。在这里,我们对Form Bean的属性作最后的调整,调用业务方法,委派作为View的EditCategory,从而生成一个以Form Bean中合适数据为基础的HTML页面。这个页面被传递给客户端,接下来就进入了“表现”阶段。

  表现阶段

  这一阶段用户编辑表单并提交。如果服务器端的应用认为用户提交的内容存在问题,它把表单再次显示给用户,加上适当的提示信息;重复该过程,直至用户提交了合法的表单,或取消了表单处理过程。编辑过程的中止可能是由于用户跳转到了其他页面,或者启动了一个取消动作(例如点击了一个由html:cancel标记定义的按钮)。虽然在理论上,View的验证和再次显示操作应该属于表现阶段,但在Struts应用中,这部分功能在存储阶段实现最方便。

  存储阶段

  准备阶段创建了一个带有“name=”属性定义的动作CatForm,存储阶段要加入另外两个属性,即:“validate=‘true’”和“input=”属性。

<action path="/saveCategory"
   scope="request"
   name="catForm"
   type="com.strutsdemo.SaveCategoryAction"
   unknown="false"
   input="/EditCategory1.jsp"
      validate="true">
   <forward name="success"
      path="/CategoryUpdated.jsp"/>
</action>


  设置了“validate=‘true’”属性选项之后,服务器端就会增加一个处理步骤。重新用来自View的数据构造出Form Bean,或更新From Bean的时候,Form Bean的validate()方法会被调用。validate()方法执行必要的合法性验证操作。如果用户的输入数据中存在错误,validate()方法就创建一个或多个ActionError对象。这些ActionError对象包含了错误信息源ID和表单输入域的名称。这些ActionError对象被收集和整理到一个ActionErrors对象,随后ActionErrors对象由validate()方法返回。如果用户输入的数据不包含错误,validate()返回null。

  由于指定了“input=”属性,一旦出现了错误,动作会被忽略,而“input=”指定的View被显示。这个View既包含Form Bean,也包含当前出现的错误对象集合。一般地,这个输入页面就是原来执行编辑功能的JSP页面。

  大多数Struts的html标记有对应的HTML标记,但Struts有一个HTML没有的标记,即标记。要中止表单编辑过程,用户既可以手工输入URL,也可以点击不指向存储动作处理器的链接。因此,用标记定义的“取消”按钮,不是取消编辑操作的唯一方法。

  假设validate()方法没有发现任何错误,且用户没有点击“取消”按钮,存储动作的process()方法将被调用。在本例的process()方法中,我们调用了Form Bean的save()方法把数据写入持久性存储设备,然后根据写入操作是否成功,显示“存储操作成功”或“存储操作失败”的View。

===================================================================================

构造和运行Struts应用

  要构造和运行本文的示例应用,你必须了解如何使用Jakarta的Ant工具。如果你还不了解Ant,现在该是学习它的时候了!赶紧到网站下载Ant,通常要解开压缩,设置一下ANT_HOME环境变量,然后把Ant加入到执行路径就可以了。

本文示例的build.xml需要稍微定制一下,修改指示本地Tomcat位置的配置,使它能够找到在Tomcat下编译所必需的类。另外,你还要有一份Struts的JAR。你可以去下载最新的版本。

  struts-config.xml文件是粘合Struts应用各个部分的配置文件。在部署完成后的Web应用中,struts-config.xml在Web-INF目录下。你应该修改一下数据源配置,使之符合你当前使用的DBMS环境。数据模型和SQL模式文件在下载包的DBMS目录下,SQL文件针对PostgreSQL DBMS编写。

  示例中src/com/strutsdemo/ShowCategoriesAction. java是一个简单的分配器。ActionForward()是请求分配方法,从ActionServlet调用。该方法可以完成主要的工作,例如分析请求参数、执行计算,以及构造出View使用的JavaBean。另外,该方法还要根据处理结果,确定下一个要显示的是什么页面:可能是预设的多个页面之一,也可能是一个错误信息页面。

  ActionForward()的请求分配过程

  当然,最复杂的处理过程与表单有关。ActionForward方法的请求分配过程是:

  1. ActionServlet,对请求进行解码。由于为动作指定了Form Bean,ActionServlet处理Form Bean(参见下面有关“ActionServlet如何使用Form Bean”的说明)。然后,请求传递给了EditCategoryAction。

  2. EditCategoryAction;准备处理View,或者从数据库装入现有数据,或者创建新的数据项。动作处理器利用Mapping.findForward把控制传递给EditCategory.jsp。

  3. DitCategory.jsp,显示出Form Bean,允许用户编辑数据。用户提交数据后,控制转到ActionServlet。

  4. ActionServlet,对请求进行解码。这一次,Form Bean将从View的数据初始化,因为它是一个Struts的JSP表单页面。由于有Form Bean,且struts-config.xml中指定了“validate=‘true’”,名为“catForm”的Form Bean的validate()方法被调用。如果用户提交的数据未能通过合法性验证,则控制转到EditCategory1.jsp。

  5. EditCategory1.jsp,它只是EditCategory.jsp略加修改后的一个版本。如果有必要,原始编辑页面和带有错误提示的编辑页面可以使用同一个View。Struts的JSP标记能够帮助我们轻松地办到这一点。该页面提交给/saveCategory.do。这样,用户就在这几个页面之间绕圈子,直到他跳转到一个与编辑操作无关的页面,或者他提交的数据通过了合法性验证。

  6. 如果Form Bean合法性验证通过,ActionServlet把请求(包括Form Bean)传递给SaveCategoryAction。在这个例子中,“save”可能意味着创建操作,也可能意味着更新操作,具体由URL提供的选项决定。写入数据的操作通过调用Form Bean的store()方法完成。注意:实际的应用应当使用某种类型的事务管理机制(或使用EJB,因为EJB有内建的事务管理机制),以避免并发访问带来的问题。

  ActionServlet如何使用Form Bean

  涉及Form Bean的ActionServlet处理过程包含六个步骤:

  1. 找到或创建Form Bean;

  2. 据从HTTP请求传入的相应数据,更新Form Bean的各个属性;

  3. 检查用户是否点击了“取消”按钮。如是,跳过步骤4和步骤5;

  4. 验证Form Bean数据的合法性;

  5. 如数据未能通过合法性验证,发送“input=”参数中指定的View;

  6. 否则,把Form Bean传递给动作处理器。
阅读全文
0 0

相关文章推荐

img
取 消
img