动态ActionForm,文件上传与转换器

动态ActionForm

动态ActionForm是为了避免标准ActionForm膨胀而设计的,使用动态ActionForm可以获得标准ActionForm的所有功能,动态ActionForm(DynaActionForm)继承ActionForm

* 在struts-config.xml文件中定义动态ActionForm,如:

<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中使用动态ActionForm

DynaActionForm daf = (DynaActionForm)form;

String username = (String)daf.get("username");

Integer age = (Integer)daf.get("age");

动态ActionForm其实是把页面中的html元素的名字和值放到了map中,所以通过get方法可以取出相应的值

动态ActionForm采用EL表达式的输出方式,${dynabean.map.prop},

原因:DynaActionForm无getDynaValues()方法,只有getMap()方法。采用el表达式导航时要使用map来导航。

protected HashMap dynaValues = new HashMap();

public Map getMap() {

     return (dynaValues);

}

动态Action的验证,通常使用动态验证框架validator

采用struts上传文件

* 页面的配置,如:

  <form action="upload.do" method="post" enctype="multipart/form-data">

   标题:<input type="text" name="title"><br>

   文件:<input type="file" name="myfile"><br>

         <input type="submit" value="提交">

   </form>

  * ActionForm中使用FormFile来接收上传的文件,参见:UploadActionForm.java

  * 在Action中调用FormFile取得上传文件数据,采用流输出,即完成上传

    UploadActionForm uaf = (UploadActionForm)form;
    FormFile myFile = uaf.getMyfile();
    if (myFile != null) {

        FileOutputStream fos = new FileOutputStream("c://" + myFile.getFileName());
        fos.write(myFile.getFileData());
        fos.flush();
        fos.close();
  }

  * 采用<controller/>标签配置上传参数,如:<controller maxFileSize="10M"/>

 

空字段测试

* 在表单中没有input输入域,jsp脚本接收到的值为null,el表达式接收到的值为空串

* 如果表单中的值,没有输入,那么jsp脚本和el表达式接收到的值都为空串

测试ActionForm类型的自动转换

* boolean:yes,1,on,true都会转换成True类型,而且忽略大小写,其他情况转换成false

* Date类型的转换:

* 如果是java.sql.Date,页面日期的格式必须为yyyy-mm-dd,才可以转换

* 如果是java.util.Date,默认情况下struts无法转换

 自定义转换器的实现步骤

* 实现converter接口,实现convert方法

如:

public class UtilDateConverter implements Converter {

  public Object convert(Class type, Object value) {
  if (value == null) {
   return value;
  }
  if (value instanceof Date) {
   return value;
  }
  Date d = null;
  if (value instanceof String) {
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
   try {
       d = sdf.parse((String)value);
   } catch (ParseException e) {
       e.printStackTrace();
   }
  }
  return d;
 }

* 将实现的conerter注册,通常情况采用servlet注册

* 采用servlet注册需要注意标签的配置,<load-on-startup>10</load-on-startup>

如:

public class UtilDateConverterInitWithServlet extends HttpServlet {

   @Override
   public void init() throws ServletException {
      ConvertUtils.register(new UtilDateConverter(), Date.class);//注册自定义转化器
   }

}

web.xml

<servlet>
   <servlet-name>UtilDateConverterInitWithServlet</servlet-name>
   <servlet-class>com.bjsxt.struts.UtilDateConverterInitWithServlet</servlet-class>
   <load-on-startup>10</load-on-startup>
</servlet>

采用struts plugin注册

struts-config.xml加入

<plug-in className="com.bjsxt.struts.UtilDateConverterInitWithPlugin"/>

public class UtilDateConverterInitWithPlugin implements PlugIn {

 public void destroy() {
 }

 public void init(ActionServlet servlet, ModuleConfig config)
   throws ServletException {
   ConvertUtils.register(new UtilDateConverter(), Date.class);
 }
}

Struts对ActionForm的自动搜集过程:

  * 将页面数据放到map中,其中map中的key为页面中的名称,map中的value为页面中的value值

  * 调用BeanUtils.setProperties方法,将map中的值逐个设置到ActionForm实例上,对于ActionForm中的每个属性

    根据类型调用相应的Converter,然后调用相应的convert方法,将相应的字符串转换成ActionForm中指定的类型

    

可以通过BeanUtils.copyProperties(目标对象,源对象)方法进行对象值的复制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值