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经验的。
Global site tag (gtag.js) - Google Analytics