我有以下代码: <ui:repeat var="class2" value="#{bean.list}" varStatus="status"> <h:form id="#{class2.name}"> <h:outputText value="#{class2.name}" /> </h:form> </ui:repeat> 但是,当我打开页面时,它的错误如下: 组件标识符不能是零长度的string 但它正确地打印在<h:outputText> 。 这是如何造成的,我该如何解决?
我不是在询问完整的电子邮件validation。 我只是想知道什么是电子邮件地址的user-name和server部分允许的字符。 这可能过于简单,也许电子邮件地址可以采取其他forms,但我不在乎。 我只问这个简单的forms: user-name@server (例如wild.wezyr@best-server-ever.com)和允许在这两个部分的字符。
我想知道是否有人可以给“最佳做法”的回应,使用空白HTML表单操作回发到当前页面。 有一个post询问一个空白的HTML表单动作在这里做了什么 ,一些这样的页面表明这是好的,但我想知道人们的想法。
我对这个事实背后的想法有个疑问,那就是只有UIForm得到了prependId属性。 为什么在NamingContainer接口中没有指定属性? 您现在可能会说这是因为向后兼容性,但我宁愿打破compability,让实现该接口的用户也实现prependId事物的方法。 从我的观点来看,关于UIForm组件中的UIForm的主要问题是,它会打破findComponent()我期望,如果我使用prependId ,那么NamingContainer行为将改变,不仅涉及到渲染,而且还希望搜索组件树中的组件。 这里有个简单的例子: <h:form id="test" prependId="false"> <h:panelGroup id="group"/> </h:form> 现在,当我想要得到panelGroup组件,我希望传递字符串"group"到方法findComponent() ,但它不会找到任何东西,我不得不使用"test:group" 。 具体的问题是,使用prependId="false"时使用ajax。 ajax标签期望在属性更新和过程中,值关心命名容器。 有一点奇怪,当我使用prependId="false" ,我必须指定完整的id或路径,但是没关系。 <h:form id="test" prependId="false"> <h:panelGroup id="group"/> </h:form> <h:form id="test1" prependId="false"> <h:commandButton value="go"> <f:ajax render="test:group"/> </h:commandButton> </h:form> 那么这段代码将呈现没有问题,但它不会更新panelGroup,因为它找不到它。 PartialViewContext将仅包含作为renderIds元素的id "group" 。 我不知道这是否预期,可能是但我不知道的代码。 现在我们来到findComponent()方法找不到组件的地方,因为作为参数传递的表达式是方法期望"test:group"查找组件的"test:group" 。 一种解决方法是编写你自己的findComponent() ,这是我选择处理这个问题的方式。 在这个方法中,我处理一个NamingContainer组件,并且像普通的UIComponent一样将属性prependId设置为false。 我将不得不为每个提供prependId属性的UIComponent都这样做,这是不好的。 反射将有助于解决类型的静态定义,但它仍然不是一个真正干净的解决方案。 另一种方法是在NamingContainer接口中引入prependId属性,并改变findComponent()的行为以像上面描述的那样工作。 最后提出的解决方案是改变ajax标签的行为来传递整个id,但这只会解决ajax问题,而不是findComponent()实现背后的程序性问题。 你怎么看待这个问题?为什么这个问题会被实现? 我不能成为第一个有这个问题,但我无法找到相关的主题?!