画面入力项目名称与Struts ActionForm自动填充的关系
  在Qware项目中发现有很多JSP中画面入力项的命名随心所欲,项目中的很多BUG最终原因也都来源于此。
  在Struts框架中,画面项目的命名与ActionForm是有紧密联系的,相信大多数人都碰到过这样的情况:画面中的入力项目,在Action中有些可以从Form中直接取得,而有些却无法取得。这其实是由于画面项目命名错误而引起。
  画面入力项目的html标签中通常有name属性和id属性,这两个属性都可作为项目的名字,它们的区别是:
  1、在页面javascript中使用getElementById(控件名) 方法取得控件时,以控件的id属性为准,name属性无效
  2、在页面javascript中使用document.all.item(控件名) 方法取得控件时,以控件的id属性为优先,如id属性不存在则以name属性为准
  3、在struts框架中,name属性为控件名称,id属性无效
下面简单说明一下画面入力项名的名称与ActionForm的关系。jsp中文全称
  在Struts框架中,用户在画面中入力的项目是会被自动填充到画面对应的ActionForm Bean中的,这个填充过程是由Struts框架自动完成的,但是这个“自动”是有前提条件的——画面项目的命名必须符合以下规则(注意上述的第二点,这里的画面项目名称为画面控件的name属性):
1、当画面项目名称中不含“.”(英文半角句号,即平常说的“点”)时,如果ActionForm中不含有同名的属性或没有相应的set方法时,则画面的入力值不会被存入ActionForm(但可以通过Paramete)
2、当画面项目名称中不含“.”(英文半角句号,即平常说的“点”)时,如果ActionForm中含有同名的属性且含有该属性相应的set方法(注意这里所说的“同名”指大小写完全匹配,下同),该入力项目的值将会通过调用ActionForm中该属性的set方法将画面的入力值存入ActionForm
上述两种情况是我们用得最多的。下面几种情况在日常使用中也比较常见,如果使用得当,会给开发带来极大的便利。
竖版边框素材模板图片
web前端3、当画面项目名称中含“.”时,Struts的处理会比较复杂,通过例子进行说明:
假设画面项目名称为bean.tblLocation.id
第一步,Struts会以“.”为分隔符,将该名称拆分成三个字符串(即三个属性名):beantblLocationid
第二步,依次调用前两个属性的get方法取得要填充的对象,然后调用最后一个属性的set方法填入画面入力值,即:Bean().getTblLocation().setId(画面入力值)
从上述过程中可以看出可能会有以下几种情况:
1)ActionForm中不含有手机怎么安装linux系统getBean()方法,那么该入力值不会被填充到ActionForm中
2)ActionForm中含有小程序开发教程图书getBean()方法,但调用getBean()方法时返回值为null,会出现Null Pointer异常。不过在Struts框架中这个异常将会便转换成另外一个异常——“No Bean Specified”(相信有很多人已经见过这个异常了)
3)ActionForm中含有getBean()方法,调用getBean()方法时返回值一个对象A,但对象A
不存在getTblLocation()方法或getTblLocation()方法返回null,此时也会出现异常,该异常也会被Struts转换成“No Bean Specified
4)ActionForm中含有getBean()方法,调用getBean()方法时返回值一个对象A,对象A存在getTblLocation()方法返回对象B,且对象B中存在setId()方法,那么该入力值将会被正常填充到ActionForm中
5)ActionForm中含有getBean()方法,调用getBean()方法时返回值一个对象A,对象A存在getTblLocation()方法返回对象B,但对象B中不存在setId()方法,那么该入力值不会被填充到ActionForm中
4、还有一种情况在Qware项目中也是比较常见的,即画面项目被命名为bean.arrBean[0].id这种形式(项目名称中含有“[0]”)。这种命名会被Struts框架作为数组处理,它的处理过程与3基本相似,只是在对arrBean[0]进行处理时,会调用getArrBean(0)方法(特别注意该方法带有一个整形参数)获得对象。
王烁
2008/01/29
>angular2生命周期

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。