准备阶段
一次典型的编辑会话要求有一个动作处理器准备View,即一个作为View的JSP页面,还要求有第二个动作处理器存储更新后的View。当然,存储操作之后会有第二个属于View的页面被显示,例如一个“数据已经更新,点击此处继续”的页面(参见表1)。
表1:基于Form Bean的编辑过程要用到的部件
下面的代码片断显示了如何在struts-config.xml文件中配置准备阶段:
在准备阶段,容器尝试从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=”属性。
设置了“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传递给动作处理器。
一次典型的编辑会话要求有一个动作处理器准备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传递给动作处理器。
本文围绕Struts应用展开,介绍了编辑会话的准备、表现和存储阶段,阐述了各阶段对Form Bean的处理及相关操作。还说明了构造和运行Struts应用的方法,包括使用Ant工具、修改配置文件等,同时详细讲解了ActionForward的请求分配过程和ActionServlet使用Form Bean的步骤。
746

被折叠的 条评论
为什么被折叠?



