struts中的formbean主要是用来封装(通过反射)浏览器或使用http协议的客户端提交的表单数据,我想大家在这一点上已达成共识,没什么好说的,在这层意义上,<html:text>之类表单struts tag,似乎没有什么用武之地,实际上也确实如此,使用普通的html tag可达到同样效果.但有一点很重要的是:struts tag可以自动从后台获取数据来填充页面.
下面举个例子来探讨这种机制:
现有两个action类,AAction,BAction
两个Form类,AForm,BForm
一个页面:A.jsp
这五个元素关系如下:
AAction 使用AForm,BAction使用BForm,AAction对应A.jsp,AForm和BForm都含有x和y属性,A.jsp的部分关键代码如下:
<html:form action="/BAction">
<html:text property="x" />
<html:text property="y"/>
</html:form>
当点击AAction(假设在其中使用request.setAttribute("VO",AForm),并且AForm.x=10,AForm.y=20时),出现A.jsp,但输入框x,和y空白,但如果AForm就是BForm的话,两个输入框会出现10和20,其实此时并不需要写request.setAttribute("VO",AForm),Struts有个很重要的特点是:当启动一个action时,struts实例化相应的form(如果有的话),并在forward的时候,会自动写上request.setAttrbute(formname,form),formname即你在配置文件中定义的form名,在本例中点击AAction,当AAction forward的时候,会自动写上request("AForm",AForm),所以当你想偷懒直接将form 传到页面上填充数据时,就不需要显式的这样写了.
当然如果AForm并不是BForm,你也可以这样写达到这种效果
<html:text name="VO" property="x"/>
<html:text name="VO" property="y"/>
由以上可以推断:
<html:form action="/BAction">
<html:text property="x" />
<html:text property="y"/>
</html:form>
实际上就是
<html:form action="/BAction">
<html:text name="BForm" property="x" />
<html:text name="BForm" property="y"/>
</html:form>
值得注意的是BForm可以为空,如果你将name="BForm" 改为name="VO"当然也可以是别的名,VO不能为空
由此当AForm并不是BForm的时候,我们有一种更简便的方案,即写上request.setAttribute("BForm" ,AForm),
这样就不用改页面了,但必须注意AForm必须有相应的属性
后记:
j2ee的常规做法并不推荐返回form作为jsp的数据,而应该返回一个value object或data transfer object
相关资源:2021美赛A题思路