jsf动态表单
j2sej2ee
2011-01-19
大家应该遇到过这样的情况,用户可以通过一些操作来控制表单。就是说通过javascript会往form里插入一些输入控件。
例如: <?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <title>Facelet Title</title> <script type="text/javascript"> // <![CDATA[ function add(){ var o = document.getElementById("nametd"); o.innerHTML=o.innerHTML+"<input id=\"form:name\" type=\"text\" name=\"form:name\" />"; } // ]]> </script> </h:head> <h:body> <h:form id="form"> <table> <tr> <td>用户名:<a href="#" onclick="add()">添加</a></td> <td id="nametd"> <h:inputText value="#{accountFace.name}" id="name"/> </td> </tr> <tr> <td colspan="2" align="center"> <h:commandButton id="submit" value="Create" action="#{accountFace.add}"/> </td> </tr> </table> </h:form> </h:body> </html> 我现在的问题是,当表单提交时得不到用户通过js插入的那个文本框的值,如果#{accountFace.name}的数据类型为数组,或集合时,则jsf页面会报错。请问大家我该怎么做? |
|
kidneyball
2011-01-20
两个方案:
1. 不要直接用JS添加组件,把<a href="#" onclick="add()">添加</a>改为<h:commandLink action="#{accountFace.addName}">,然后在MBean中用操作组件树的方式插入新组件。这个方案在添加组件时需要一次额外的postback,好处是新组件能进入JSF的正常处理周期。 2. 仍然用JS添加组件,在MBean中用FacesContext.getCurrentInstance().getExternalContext().getRequestParamMap().get("form:name")来获取到提交值。好处是添加组件时不需要额外的postback,坏处是新组件没有进入服务器端的组件树,无法享受到JSF提供的校验、转换和与MBean绑定等功能。 |
|
j2sej2ee
2011-01-20
kidneyball 写道 两个方案:
1. 不要直接用JS添加组件,把<a href="#" onclick="add()">添加</a>改为<h:commandLink action="#{accountFace.addName}">,然后在MBean中用操作组件树的方式插入新组件。这个方案在添加组件时需要一次额外的postback,好处是新组件能进入JSF的正常处理周期。 2. 仍然用JS添加组件,在MBean中用FacesContext.getCurrentInstance().getExternalContext().getRequestParamMap().get("form:name")来获取到提交值。好处是添加组件时不需要额外的postback,坏处是新组件没有进入服务器端的组件树,无法享受到JSF提供的校验、转换和与MBean绑定等功能。 谢谢了,喜欢这种回帖,给出多个选择。一看就是有jsf经验的。 |