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

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

       ActionServlet:struts的控制器,负责截取URL或分发。提供Model(模型层)和View(视图层)使用,因此可将它看

作是模型和视图之间的中介。

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

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

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

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

       我们知道我们不适用框架的时候,在MVC中典型的控制器是servlet,servlet可以获取参数和逻辑模型的调用和

转向功能。而struts对它做了封装,为什么要进行封装?当我们请求到一个servlet,我们在这个servlet中取得参数、

调用业务逻辑、转向,我们在servlet中写死了转向页面,当我们想要换一个转向页面的时候就需要改动代码了,改动

代码后还要重新进行编译。

        而且从表单中传递过来的数据全是字符串形式,我们还需要根据实际的需求把字符串转换为我们需要的类型,如

果很多地方需要转换,并且每次使用每次都要进行转换,有没有一种机制,把表单中的字符串拿过来自动转换为相应

的类型呢?不需要我们再进行手动转换呢?

        基于上述的不便,转向不灵活,表单中的字符串每次都要进行转换等一系列的原因,struts把这些做了封装。提

取出重复的操作,转向信息放到了配置文件中,这样更加灵活了。在上述问题中,阐述了struts对表单的封装,在

web应用程序开发过程中,开发人员需要大量的时间来处理表单问题,有的时候是通过表单提交一些新的问题,有的

是通过表单修改数据,所有这些表单在处的处理在传统web开发中是非常复杂的。本篇重点说说struts中的表单处理

器ActionForm。

       ActionForm

       问题的提出

       在传统的web应用程序开发中,繁杂的表单处理给开发工作人员带来了巨大的困难,在传统的开发语言中,没有

组建可以自动收集用户输入的表单内容,开发人员不得不在程序中手动提取表单的值。例如在表单中有这样的一个文

本输入域: 要在程序中取得这个文本输入域的值,只能用这样的方

法:request.getParameter(“password”);这样的处理方法在表单比较小的时候是可以使用的,但是当表单输入项

较多的时候就不得不大量重复类似上面的处理。

       问题的解决

       在Struts中就是使用ActionForm来解决这个问题,对于每一个用户的表单,需要提供一个ActionForm,这个

ActionForm自动把客户提交的表单保存在这个ActionForm中,然后把这个ActionForm传递给Action,从而在

Action中可以通过这个ActionForm取出用户信息,然后根据这些信息完成对应的业务逻辑处理。

       例如在Struts中用struts的html标签表述成下述形式:

       

       在这种情况下表单提交后,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.xml中form-beans配置:

[html] view plain copy print?
  1. <form-beans>  
  2.            <form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm">  
  3.                   <form-property name="username" type="java.lang.String" />  
  4.                   <form-property name="age" type="java.lang.Integer"/>  
  5.            form-bean>  
  6.     form-beans>  


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

[java] view plain copy print?
  1. /** 
  2.  * 测试动态ActionForm. 
  3.  * @author summer 
  4.  * 
  5.  */  
  6. public classDynaActionFormTestAction extends Action {  
  7.    
  8.     @Override  
  9.     publicActionForward execute(ActionMapping mapping, ActionForm form,  
  10.                   HttpServletRequestrequest, HttpServletResponse response)  
  11.                   throwsException {  
  12.             
  13.            DynaActionFormdaf = (DynaActionForm)form;  
  14.             
  15.            //取出map中key值为name,value为类名.  
  16.            Stringusername = (String)daf.get("username");  
  17.            Integerage = (Integer)daf.get("age");  
  18.             
  19.            System.out.println("username"+username);  
  20.            System.out.println("username"+age);  
  21.             
  22.            returnmapping.findForward("success");  
  23.     }  
  24.    
  25. }  


        静态ActionForm方式,使用get/set方法,而动态ActionForm方式,使用map的getkey方式,其中key就是标

签name的值。

       使用动态ActionForm优点:若更改表单和ActionForm时不需要重新编译,而静态的需要更改静态的

ActionForm.Java文件,必须重新编译。缺点:静态返回的是对应的值,动态ActionForm返回的是对象,我们还要

把这个对象进行强制转换。

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



你可能感兴趣的:(Struts,Java,Web学习之路)