当前位置: 代码迷 >> 综合 >> Action 3 ActionForm(未整理)
  详细解决方案

Action 3 ActionForm(未整理)

热度:63   发布时间:2023-12-08 04:33:17.0

JavaBean的子类 可以自动的对输入进行效验  Struts标签也允许任何javabean来填充某个Html组件

1 ActionForm的创建

1 由于ActionForm本身不能实例化 所以必须是ActionForm的子类

2 必须对每个Html控件定义一个公共的属性

另外 如果想发给Action之前就进行效验 可以实现validate方法 如果想重置数据可以实现reset方法 这两个方法都会在ActionForm填充前被调用

 void reset(ActionMapping mapping, javax.servlet.http.HttpServletRequest request)
          Reset bean properties to their default state, as needed.
 void reset(ActionMapping mapping, javax.servlet.ServletRequest request)
          Reset all bean properties to their default state.

 ActionErrors validate(ActionMapping mapping, javax.servlet.http.HttpServletRequest request)
          Validate the properties that have been set for this HTTP request, and return an ActionErrors object that encapsulates any validation errors that have been found.
 ActionErrors validate(ActionMapping mapping, javax.servlet.ServletRequest request)
          Validate the properties that have been set for this non-HTTP request, and return an ActionErrors object that encapsulates any validation errors that have been found.

例子 Action 1 里的LogonForm.java

         public  ActionErrors validate(ActionMapping mapping, HttpServletRequest request) 
        
{

            ActionErrors errors 
= new ActionErrors();
    
            
if ((username == null|| (username.length() < 1))
                errors.add(
"username",
                    
new ActionError("error.username.required"));
    
            
if ((password == null|| (password.length() < 1))
                errors.add(
"password",
                    
new ActionError("error.password.required"));
    
            
return errors;

        }

那么它在struts-config.xml中的映射就比较简单

  < form-beans >
           
< form-bean  name ="logonForm"  type ="ergal.LogonForm" />
 
</ form-beans >

 

另外还有一个DynaActionForm是ActionForm的子类 它是通过配置文件来定义属性的

< form-bean   name ="myForm"
                    type
="org.apache.struts.action.ActionForm" >
                    
< form-property  name ="name"
                                            type
="java.long.string" />

                    
< form-property  name ="password
                                            type="
java.long.string" />
</ form-bean >

这样不需要编码来实现JavaBean可以更快更安全

2 ActionForm的主要工作

填充自己的域 数据缓存 数据效验 类型转换和对象传递

 填充自己的域

html表单通过web传到服务器时是 文本格式 表单里的元素变成了 名字-数值 对 都是字符串 而不是二进制

html上传文件和附件也都是经过转化成文本数据 然后再转化回去的方法

那么Struts是将输入域转化成javabean的属性 当ActionForm的某个属性和请求中的某个参数名一致时 Struts会自动的将参数值赋给javabean的相应的属性

数据缓存

ActionForm可以充当HTML控件中缺少的缓存区 在传给其他的域之前 ActionForm会保存数据 还可以进行简单的验证

数据效验

前面所讲的validate方法可以简单效验是否符合基本标准 如果不对可以全部返回 让用户修改 也就时效验类型是否符合真正的业务层的需求

类型转换

可以在ActionForm内部进行一些类型转换 但是ActionForm只能使用stringboolean属性的值 所以可以附加一些函数来对数据进行转换

简单的例子

 

public  String keyDisplay = null ;
public  String getKeyDisplay()
{
        
return keyDisplay;
}

public  Integer getKey()
{
        
return new Integer(getKeyDisplay());
}

然后业务层就可以使用getKey()方法来得到需要的数据类型

ActionForm可以内含其他bean

Struts标签和自动填充机制可以支持用点分隔语法来访问ActionForm中的其他bean

如:

 

< html:text  property ="values.telephoneText"
                size
="4"
                 maxlength
="14" >

可以使用ActionServlet的包装类ActionServletWrapper来进行保护 这个包装类里面的

protected  ActionServlet servlet
          The servlet instance to which we are attached.

受到保护

3 使用ActionForm

1 实现业务逻辑

如果业务层有接口可用 可以实现这个接口 这样就可以直接传递给业务层

2 当内含bean数据对象时 属性可以用点分隔来引用

3 设置不可改变的数据对象

暂略...

4 设置可改变的数据对象

暂略...

5 使用工厂方法

要在ActionForm中来完成这个转换过程 如果必须创建数据对象 好方法就是工厂方法

例子:

 

public  A getA()
{
        A bean
=new A(this.getA1(), this.getA2(), this.getA3())
        
return bean;
}

还可以传递一个存在的数据对象

6 传递一个Map对象

首先将一个属性添加到ActionForm中

 

private  Map map = null ;
public   void  setMap(Map map)
{
        
this.map=map;
}

public  Map getMap()
{
        
return this.map;
}

然后添加一个属性来访问Map

 

public   void  setValue(String key, Object value) throws  Exception
{
        getMap().put(key, value);
}

public  Object getValue(String key) throws  Exception
{
        
return getMap.get(Key);
}

在Struts标签中可以用下面方法来访问Map的元素

 

< html:text  property ="value(key)" />
< bean:write  name ="formbean"  property ="value(key)" />

 

 

  相关解决方案