Struts旅程(三)Struts表单处理器ActionForm(静态动态)

来源:互联网 发布:淘宝店铺简历和介绍 编辑:程序博客网 时间:2024/04/29 17:06

 


上篇我们以登录为例讲解了struts配置,实现了使用struts框架进行登录的示例。一些名词已经在脑海中飘荡了。

ActionServletstruts的控制器,负责截取URL或分发。提供Model(模型层)View(视图层)使用,因此可将它看作是模型和视图之间的中介。

ActionForm:用于封装用户的请求参数,而请求参数是通过JSP页面的表单域传递过来的。

Action:用户请求和和业务逻辑的桥梁,每个Action作为业务逻辑的代理,可以调用业务逻辑。

一些问题是有必要再次提起的。

使用基本的MVC和使用struts框架区别,使用struts好处在哪里?

我们知道我们不适用框架的时候,在MVC中典型的控制器是servletservlet可以获取参数和逻辑模型的调用和转向功能。而struts对它做了封装,为什么要进行封装?当我们请求到一个servlet,我们在这个servlet中取得参数、调用业务逻辑、转向,我们在servlet中写死了转向页面,当我们想要换一个转向页面的时候就需要改动代码了,改动代码后还要重新进行编译。

而且从表单中传递过来的数据全是字符串形式,我们还需要根据实际的需求把字符串转换为我们需要的类型,如果很多地方需要转换,并且每次使用每次都要进行转换,有没有一种机制,把表单中的字符串拿过来自动转换为相应的类型呢?不需要我们再进行手动转换呢?

基于上述的不便,转向不灵活,表单中的字符串每次都要进行转换等一系列的原因,struts把这些做了封装。提取出重复的操作,转向信息放到了配置文件中,这样更加灵活了。

在上述问题中,阐述了struts对表单的封装,在web应用程序开发过程中,开发人员需要大量的时间来处理表单问题,有的时候是通过表单提交一些新的问题,有的是通过表单修改数据,所有这些表单在处的处理在传统web开发中是非常复杂的。本篇重点说说struts中的表单处理器ActionForm

ActionForm

问题的提出

在传统的web应用程序开发中,繁杂的表单处理给开发工作人员带来了巨大的困难,在传统的开发语言中,没有组建可以自动收集用户输入的表单内容,开发人员不得不在程序中手动提取表单的值。例如在表单中有这样的一个文本输入域:<inputtype=”text” name=”password”> 要在程序中取得这个文本输入域的值,只能用这样的方法:request.getParameter(“password”);这样的处理方法在表单比较小的时候是可以使用的,但是当表单输入项较多的时候就不得不大量重复类似上面的处理。

问题的解决

Struts中就是使用ActionForm来解决这个问题,对于每一个用户的表单,需要提供一个ActionForm,这个ActionForm自动把客户提交的表单保存在这个ActionForm中,然后把这个ActionForm传递给Action,从而在Action中可以通过这个ActionForm取出用户信息,然后根据这些信息完成对应的业务逻辑处理。

例如在Struts中用strutshtml标签表述成下述形式:

<html:text property=”password”/>

在这种情况下表单提交后,struts框架会自动把表单中的这个输入项赋值到ActionForm中的password属性中,从而把表单中的内容保存在ActionForm中,整个过程由struts自动完成,不需要开发人员干涉。我们在创建ActionForm时要遵循以下规范:

(1)每个ActionForm都要继承org.apache.struts.action.ActionForm类,而且需要为每一个表单提供一个ActionForm

(2)ActionForm中每个属性要与表单中的输入项一一对应。

(3)AcitonForm每个属性都要提供的getter方法和setter方法。Struts框架就是通过这些方法来保存表单的值,然后在Action中通过这些方法取得表单的值。

(4)如果表单需要验证,就需要在ActionForm中提供validate方法,这个方法中提供对表单的具体验证逻辑。这个方法不仅实现了数据验证同时实现了数据缓冲的作用,在validate方法中验证用户提交表单的有效性,当表单验证失败时会自动返回用户输入页面,这时候用户输入的值都保存在ActionForm中,返回页面时struts框架会取出AcitonForm中的数据并输出到对应的用户输入项中,保证了用户开始输入的表单信息。


问题的提出

以上所说的是静态ActionForm,当我们为每个表单都创建一个AcitonForm的时候,会导致ActionForm数量过多。每个ActionForm过强的聚合性也会使代码难以维护和重用。怎么样不用去创建过多的ActionForm?而且当提交表单的属性名字相同时,不用再重复创建AcitonForm(例如登录和注册)?

问题的解决

Struts中可以使用动态ActionForm来解决上述问题。动态ActionForm不需要创建自己的ActionForm,需要在创建自己Action的时候直接把execute方法中传递过来的form对象转化为DynaActionForm

我们需要更改struts-config.xmlform-beans配置:

<form-beans>           <form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm">                  <form-property name="username" type="java.lang.String" />                  <form-property name="age" type="java.lang.Integer"/>           </form-bean>    </form-beans>


Action中使用get方法取得表单中的值。

/** * 测试动态ActionForm. * @author summer * */public classDynaActionFormTestAction extends Action {     @Override    publicActionForward execute(ActionMapping mapping, ActionForm form,                  HttpServletRequestrequest, HttpServletResponse response)                  throwsException {                     DynaActionFormdaf = (DynaActionForm)form;                     //取出map中key值为name,value为类名.           Stringusername = (String)daf.get("username");           Integerage = (Integer)daf.get("age");                     System.out.println("username"+username);           System.out.println("username"+age);                     returnmapping.findForward("success");    } }


静态ActionForm方式,使用get/set方法,而动态ActionForm方式,使用mapgetkey方式,其中key就是标签name的值。

使用动态ActionForm优点:若更改表单和ActionForm时不需要重新编译,而静态的需要更改静态的ActionForm.java文件,必须重新编译。缺点:静态返回的是对应的值,动态ActionForm返回的是对象,我们还要把这个对象进行强制转换。

下一篇MVC向struts MVC框架演变过程

 

 

 

 

 

 

 

 

7 0
原创粉丝点击