struct2 学习之——action中定义的变量的理解
1、在action定义的变量,可直接被return到的jsp页面所引用,也就是在 action定义 book, 在jsp页面可直接使用 el表达式或structs标签 引用book,说明在页面中可以直接访问action中的所有变量,可以直接访问action上下文。
2、需要注意的是 页面中输入框等,比如<s:textfield name="aa" />,需要在action必须有对应的private String aa属性,并且实现getter、setter,这种方式将页面中相对应的值传递给action了。
3、如果action定义的是pojo的类型,如book,在页面要传递的值的name,要写成 book.xxx,的形式,其中 xxx 在book必须存在相应的属性值,以及 geter和seter。
(个人理解:在页面中设置name值为book.name时,提交后,会先实例化book对象,调用book.setName(页面中 book.name的值),此时book对象的name有值了,然后将此对象传递给action,然后调用action的setBook(book)方 法,这时action的book就有值了,然后在return的页面中可直接访问action中的book,如el表达式,structs标签,它们会自 动使用getBook()方法。)
接上边个人理解,经过试验,在action中去掉getBook方法后,执行程序,程序没有出现异常,但在跳转到页面显示时全部为空值,因为 get方法不存在,所以获取不到action中的属性值,但是在action中直接调用book.getName()时,该值也为空,说明book中还是 没有设置对象值,这个说明structs对aciton的seter和geter的方法的调用还是比较复杂的,猜测可能方案:
1、调用book.getName()时,会先调用getBook,来获取book对象。
2、把book对象设置到aciton中是,先会调用getBook来获取到book对象。
3、.......
最后说明的是structs中 :页面和后台程序的数据传递都是由 action来实现的(request、...除外,可参考我写的structs业务逻辑篇),页面表单中的输入域如文本框,在action中要有相应的 属性和对应的seter、geter方法,他们的name是和action中的属性名称必须相同(pojo是 ojb1.xxx的形式,action只放ojb1,),structs会对他们自动完成数据的传递。
就是说要自动传值,就在action定义属性,别的地方也传不了(request,session....除外),然后在业务层或页面中可 直接操作action属性,它自动完成了httpservletrequest中的取参数之类操作,抛弃了HttpServletReuest等,使开发 变得简单。
经试验得出:如果action定义了list等类型的属性并直接初始化,如果想在页面中使用(ognl表达式)它也必须在action中实现他的geter方法,也就是说如果想在其他地方使用action中的属性,就必须实现该属性的geter方法,别的地方使用它时,会自动调用geter方法,seter主要是用来被struts自动设置值时调用。