您的位置:首页 > 其它

form表单提交问题,name属性的getter\setter

2017-11-23 17:24 309 查看
问题出现背景:

当时在实际项目中,我是没注意到我有两个input标签的name属性变量同名了,于是在提交的时候总是报Can not find action ,并提示没定义这个文件路径,也就是form中action匹配不到struts.xml文件中定义的逻辑视图路径!

解决问题步骤:

刚开始我很看到那个错误的第一反应就是更改路径,让其匹配成功,谁知道各种路径方式都试过了,而且还和之前的有form标签的jsp文件进行对照,发觉我的路径问题没问题,提交还是报同样的错误,这个时候内心是非常烦躁的,我于是只能用出杀手锏了,一个页面也就那么多行代码,我就先只留form表单标签,并在后台相对应的action方法中直接给return success,然后提交,它是通过的!然后往中间一步步取出隐藏的块代码!再试的过程中,你还别说,有重大发现,于是就发现我的两个input标签的name属性变量名称相同,当我改完之后,问题解决!

错误分析:

我们都知道,往往name属性再提交的时候,都是以一个变量或对象中某个字段变量来提交的,之后action(Controller里有此对象字段变量或变量的getter和setter方法)获取值。当我唯独以变量的方式去提交的时候,获取的过程出现问题,它堆栈追踪就报获取不到路径问题!在form提交的时候,相同的两个变量名称各自换一下变成唯一,jsp就可以提交了,然后我到我后台action,发现有定义原先那个相同的变量名,并且设置了 getter和setter方法;于是我又试着用对象的两个相同字段变量测试了下,发现是提交通过的(而且我这个对象在action里面也是有getter和setter方法的),这时候引发我想对源码的分析,想知道到底底层源码在form提交之后,其页面的属性值是怎样去被action页面的getter和setter方法获取的!问题的出现和底层源码setter和getter具体实现过程是怎样的一个关系!

源码分析:

针对上面的问题,接下来就是源码的解剖了,(说到这里来句题外话,其实程序员做到最后,跟医生差不多,解剖知悉原理,应用于临床更加有经验,哈哈),言归正传!其实问题的根源就是:对象和变量getter和setter的区别

大家知道,内省是 Java 语言对 Bean 类属性、事件的一种处理方法(也就是说给定一个javabean对象,我们就可以得到/调用它的所有的get/set方法)。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则,这些 API 存放于包
java.beans 中。然而,我们单个属性去设置getter和setter的话,那么提交的时候,相当于同时setter两次,这时肯定会出错了,但是对象就不同了,查看源码和资料知道,通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo
来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。如果对象的name相同,但是它在action是以类的setter和getter,而且先获取类在通过类Introspector来获取类中属性信息,如果有此类属性字段就获取,无此类属性字段就不获取,所以真相解开!

总结:在stutrs2开发中jsp的设计,name属性值最好是对象.属性格式!好处理,规范化!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  setter和getter
相关文章推荐