Struts 原理(二) --- 3.3 简化Struts开发

来源:互联网 发布:外国人淘宝评论 编辑:程序博客网 时间:2024/05/16 12:17
 

 3.3 简化Struts开发

3 .3 . 1   使用动态FormBean简化开发

1 . 配置动态Form
    其实就是不需要什么ActionForm了 ,首先在struts-config.xml中进行配置 ,  例如下面 :
    <form-bean name="houseInfoDynaForm"
               type="org.apache.struts.action.DynaActionForm">
               <form-property name="title" type="java.lang.String"></form-property>           
               <form-property name="cityId" type="java.lang.Integer"></form-property>
               <form-property name="streetId" type="java.lang.Integer"></form-property>
               <form-property name="rent" type="java.lang.Double"></form-property>
               <form-property name="room" type="java.lang.Integer"></form-property>
               <form-property name="hall" type="java.lang.Integer"></form-property>
               <form-property name="houseType" type="java.lang.Integer"></form-property>
               <form-property name="houseInfo" type="java.lang.String"></form-property>
               <form-property name="telephone" type="java.lang.String"></form-property>
               <form-property name="contactName" type="java.lang.String"></form-property>
    </form-bean>

    在struts-config.xml中写这些足够了 , 如果需要修改ActionForm的参数也是只需要在这里修改的 ,  
    当然 对应的<action> 还需要修改其中的属性 name  = "value"  value 是 houseInfoDynaForm
    
2 . 取得动态Form中的值
    从动态Form中取值的方式与普通的FormBean getter方法取值不同 , 所以对应Action 代码也不同 ,
    所以对应的Action代码也不同  .

    DynaActionForm houseInfoDynaForm = (DynaActionForm)form ;
        
        HouseInfo houseInfo = new HouseInfo();
        houseInfo.setContactName(houseInfoDynaForm.getString("title"));
        houseInfo.setHall((Integer)houseInfoDynaForm.get("hall"));
        houseInfo.setHouseInfo(houseInfoDynaForm.getString("houseInfo"));
        houseInfo.setHouseType((Integer)houseInfoDynaForm.get("houseType"));
    
        houseInfo.setRent((Double)houseInfoDynaForm.get("rent"));
        houseInfo.setRoom((Integer)houseInfoDynaForm.get("room"));
        houseInfo.setStreetId((Integer)houseInfoDynaForm.get("streetId"));
        houseInfo.setTelephone(houseInfoDynaForm.getString("telephone"));
        houseInfo.setTitle(houseInfoDynaForm.getString("title"));

    可以使用get方法从动态Form中取值 , 这一般是针对非String类型的 ,比如 int  或者 double 类型的 , 而String类型的就只使用getString() 了 ,
    
    那么 象 houseInfoDynaForm.getString("title")  中的 title 是一个key 值 , 它是对应struts-config.xml中 FormBean中的 name 属性的 .

    但是还有注意 , get方法取到的值为Object类型 , 需要我们使用  ((Integer)houseInfoDynaForm.get("houseType")) 或者

    ((Double)houseInfoDynaForm.get("rent")) 来 转换成实际的类型 . 也可以通过getString()来直接获取String类型的值 .

    至此 , 我们已经完成了修改的工作 .

    使用动态FormBean可以不必创建对应FormBean类, 减少了编码工作, 也方便修改 .


3.3.2 使用实体对象作为FormBean属性简化开发

    问题:
        使用动态Form虽然省去了FormBean的编码工作 , 但ActionBean中的代码并没有因此变得简单 ; 而且业务逻辑的变化 , 数据库增减字段时 ,

        需要修改的地方也包括实体类 , FormBean定义 和 ActionBean 中相应代码 , 很容易漏掉某处而引入错误 .

    分析 :
        我们知道EL表达式可以通过${HouseInfoForm.title} 的方式显示数据 , 假如HouseInfo中有一个类型为HouseInfo 类型的 属性 ,
        
        如 下面示例所示 :


        public class HouseInfoForm extends ActionForm{
            private HouseInfo item = new HouseInfo();
            //下面就要生成get 和set 方法了
        }
        
            我们可以通过${HouseInfoForm.item.title}  来显示了 .

        总结到此, 我们使用FormBean 的主要目的是让表单提交的数据自动提交到FormBean中 ,  如果 ActionForm 如上面的例子那样定义 ,
        
        那么对应的表单域中那么属性要这样写呢?