ActtionForm详解

Struts的视图组件:
Struts框架中的视图组件主要包括:
JSP页面。
ActionForm类
Struts自定义标签。
消息资源。
其中,ActionForm类是Struts框架的核心组件之一,是Struts的关键视图组件。在这篇文章中,将讨论ActionForm类及其作用。
ActionForm的作用机理:
ActionForm本质上是一种JavaBean,是专门用来传递表单数据的DTD(Data Transfer Object,数据传递对象)。它包括用于表单数据验证的validate()方法和用于数据复位的reset()方法。
Struts框架利用ActionForm对象来临时存放视图页面中的表单数据。例如,一个登录页面会有一个用户名输入框和一个密码输入框,以及用来提交登录请求的按扭。当用户提交登录请求后,Struts将 用户名和密码两个输入域的数据自动填充到相应的ActionForm对象中,然后控制层可以从该ActionForm对象中读取用户输入的表单数据,也可以把来自模型层的数据存放到ActionForm中,然后返回给视图显示。
ActionForm有(request)和(session)两种作用域(scope)。如果ActionForm的作用域设定为request,ActionForm实例将保存在request对象中,像其他保存在request对象中的属性一样,仅在当前请求范围内有效。如果ActionForm的作用域设定为session,那么ActionForm实例将被保存在session对象中,同一个ActionForm实例在整个HTTP会话中有效。
在Struts框架 中,ActionForm的作用机理如下图:

当验证ActionForm时,如果检测到一个或多个验证错误,Struts框架会把错误转发回配置文件struts-config.xml中元素的input属性所指定的输入页面。 
ActionForm的使用方法:
1.创建ActionForm
可以扩展Struts软件包的ActionForm类来创建具体的ActionForm。Struts软件包中的ActionForm类本身 是一个抽象类,在扩展的时候,为每一个要从HTML表单中捕获的输入域定义一个属性,使表单输入域与ActionForm属性一一对应,以使ActionForm能够捕获需要的表单输入。定义了具体的属性,就可以覆盖父类 的validate()和reset()方法,来实现具体的ActionForm验证规则和初始化方法。
下面是一个小例子


/**//*

* Generated by MyEclipse Struts

* Template path: templates/java/JavaClass.vtl

*/

package struts.form;


import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionMapping;



/** *//** 

* Struts框架的ActionForm对象,它可用来在用户和业务层之间舆用户的输入数据。

* ActionForm也叫FormBean.Struts框架会自动从请求中惧输入数据,再将 这些

* 数据交给一个使用FormBean的Action对象,接着FormBean可以再交给业务层

*/


public class LoginHandlerForm extends ActionForm 

{


    /**//*

      * Generated fields

     */



    /** *//** userName property */

    private String userName;



    /** *//** userPwd property */

    private String userPwd;


    //验证方法,主要用于验证视图上的数据,例如非空之类,

    //如果要进行业务验证,则应该在Action中进行!

    public ActionErrors validate(ActionMapping mapping,


             HttpServletRequest request) 

{

        

        return null;

     }

    //初始化首先调用的方法


    public void reset(ActionMapping mapping, HttpServletRequest request) 

{

        // TODO Auto-generated method stub

     }



    public String getUserName() 

{

        return userName;

     }



    public void setUserName(String userName) 

{

        this.userName = userName;

     }


    


    public String getUserPwd() 

{

        return userPwd;

     }



    public void setUserPwd(String userPwd) 

{

        this.userPwd = userPwd;

     }

}
在以上的loginActionForm中,validate()方法和reset()方法是ActionForm中两种可以覆盖的方法。validate()方法中定义具体的ActionForm验证规则。

运行一个JSP时,服务器端执行哪些组件和方法,可执行哪些自定义方法。
1、对于一个JSP请求,服务器端自动调用ActionServlet、ActionMapping、ActionForm、Action、ActionForward等组件和运行它们相应的方法。
ActionServlet的方法主要有:process(),InitApplication(),InitMapping(),InitDigester(),InitOther();
ActionServlet提供了公共方法,可以被Action类实例使用。本节我们简要讨论一些方法:关于ActionServlet方法的更详细信息,请参数在http://jakarta.apache.org/struts中的Struts文档。
ActionServlet有允许我们增加或删除ActionForm beans、ActionForwards和ActionMappings的方法。这些方法的基本形式如下所示:
public void addFormBean(ActionFormBean formBean)
public void removeBean(ActionFormBean formBean)
public void addForward(ActionForward forward)
public void removeForward(ActionForward formward)
public void addMapping(ActionMapping mapping)
public void removeMapping(ActionMapping mapping)
每个定义显示了方法的范围(都是public)、方法返回的对象(都为void)以及方法的参数,下列方法根据名字找到这些对象:
public ActionFormBean findFormBean(String name)
public ActionForward findForward(String name)
public ActionMapping findMapping(String name)
接下来的两个方法用于处理数据源:
public void addDataSource(String key,DataSource ds)
public Datasource findDataSource(String key) – trturns a DataSource instance
findDataSource()方法用名字查找数据源。数据源可能是在Struts配置文件中静态定义的,也可能是用addDataSource()方法动态增加的。
最后,我们可以用下列的destroy()方法很优雅地关闭ActionServlet,并用reload()方法从Struts配置文件中重新装入信息到ActionServlet。
ActionForm是抽象类,用于定义用户Bean,在这里,用户可自定义各种方法;
ActionForm类提供的一些公共方法:
public void setMultipartRequestHandler(MultipartTequestHandler multipartRequestHandler)
public MultipartRequestHandler getMultipartRequestHandler()
上面这些方法用于读取或设置上载文件的多部分的请求处理程序。
public ActionErrors validate(ActionMapping mapping,ServletRequest request)
public ActionErrors validate(ActionMapping mapping,HttpServletRequest request)
Action类的目的是执行请求的商业逻辑,入口函数主要有perform()和execute():
Action类定义的各种受保护的访问方法,它可以被应用程序开发者提供的专用子类使用。
下列方法读取或设置与一个指定的请求相关联的现场(表示应该显示的与应用程序关联的消息的语言):
protected Locale getLocale(HttpServletRequest request)
protected void setLocale(HttpServletRequest request,Locale locale)
下面的方法读取应用程序的消息资源:
protected MessageResource getResources()
如果按下表单上与动作关联的取消按钮的话,该方法返回true。
protected Boolean isCancelled(HttpServletRequest request)
当应用程序出错时,Action类可以用saveErrors()方法来保存出错消息:
Protected void saveErrors(HttpServletRequest request, ActionErrors errors)
3、在应用中,通常只扩展ActionForm、Action两个类.
对于自定义的方法,可放在ActionForm、Action两个类的扩展类中,对于ActionForm的方法,以Bean的形式调用;对于Action的方法,可在perform()和execute()等入口方法中调用。
在新版的JSPStudio中,在execute()方法中定义各种消息处理函数,从而实现了类似于ASP.NET的事件驱动程序设计方法。
在新版的JSPStudio中,利用JSP的可视化编辑页面作为类似于ASP.NET的WinForm页,从而实现了类似于ASP.NET的WinForm程序设计方法。
4.在Action类的execute()方法中直接访问ActionForm ,如果配置了ActionForm和Action映射,Struts框架就会把ActionForm作为参数传给Action类的execute()方法,在execute()方法中,可以直接读取或设置ActionForm属性。
5.ActionErrors类封装了一组验证错误,它的用法类似 Map类。而ActionMessage类封装了单个验证错误,它的构造函数内的参数就指向资源文件内的一个错误文本。例如语句"ActionMessage("error.login.userName")"中的参数"error.login.userName" 其实就是资源文件ApplicationResources.properties中的一条错误文本的键(key)。通过ActionErrors对象的add()方法,可以把ActionMessage对象加入到ActionErrors对象中。
6.设置资源文件在struts的资源文件ApplicationResources.properties中设置可能的验证错误的标识:在资源文件中我们不能直接写中文,否则会出现乱码,有两种解决方式:一是安装相应的插件(可以在网上找找);二是可以使用JDK安装目录/bin下的native2ascii可执行文件,将中文翻译成ASCII形式放入到ApplicationResources.properties相应的Key下。
7.修改配置文件struts-config.xml将配置文件struts-config.xml中元素的validate属性设置为true,此处,还需要元素,以指明资源文件的路径。如下:资源文件书写类似JAVA文件,有包之分,注意是点号,不要写成反斜杠/
8.在页面 中加入错误标记:是struts的一个自定义标记。它能根据它的property属性从资源文件中取出相应的验证错误,并输入页面中指定的位置显示验证错误。  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值