JSF上呈现相同的ID

JSF上呈现相同的ID,jsf,duplicates,identifier,illegalstateexception,Jsf,Duplicates,Identifier,Illegalstateexception,假设我使用rendered作为case语句。我有一个输入字段的标签和消息,但我希望字段本身根据情况而改变。因此: <p:inputText id="foo" value="#{myBean.params[paramKey]}" rendered="#{paramIsInput}" /> <p:calendar id="foo" value="#{myBean.params[paramKey]}" rendered="#{paramIsCalendar}" /&

假设我使用rendered作为case语句。我有一个输入字段的标签和消息,但我希望字段本身根据情况而改变。因此:

<p:inputText id="foo" value="#{myBean.params[paramKey]}" 
   rendered="#{paramIsInput}" />
<p:calendar  id="foo" value="#{myBean.params[paramKey]}" 
   rendered="#{paramIsCalendar}" />
如果这样做,则会出现以下错误:java.lang.IllegalStateException:Component ID j_idt64:foo已在视图中找到

作为一种解决方法,我为每种参数类型创建了许多标签/消息,并更改了它们的ID。但这带来了我的问题。如果只呈现了一个id为的组件,那么在jsf文件中定义多个组件又有什么关系呢?有没有办法让他们的身份保持一致

如果只呈现了一个id为的组件,那么在jsf文件中定义多个组件又有什么关系呢

JSF如何知道只呈现一个组件?在渲染中使用EL,两者都可以计算为true。下面是一个示例,说明在命名容器中不能有重复的ID

指定的标识符在所有组件中必须是唯一的,包括作为最近祖先UIComponent(NamingContainer)的后代的方面,或者如果没有作为NamingContainer的祖先,则在整个组件树的范围内

-

有没有办法让他们的身份保持一致

如果您仍然希望在多个组件上具有相同的ID,则需要分离命名容器

您可以将其用作命名容器

如果只呈现了一个id为的组件,那么在jsf文件中定义多个组件又有什么关系呢

JSF如何知道只呈现一个组件?在渲染中使用EL,两者都可以计算为true。下面是一个示例,说明在命名容器中不能有重复的ID

指定的标识符在所有组件中必须是唯一的,包括作为最近祖先UIComponent(NamingContainer)的后代的方面,或者如果没有作为NamingContainer的祖先,则在整个组件树的范围内

-

有没有办法让他们的身份保持一致

如果您仍然希望在多个组件上具有相同的ID,则需要分离命名容器


您可以将其用作命名容器。

JSF组件ID在视图构建期间应该是唯一的,而不仅仅是在视图渲染期间。通过这种方式,您将得到两个具有相同ID的JSF组件,这实际上是无效的。在视图构建之后,您希望在JSF组件树中得到一个具有所需ID的JSF组件

您可以通过在视图构建期间填充组件来实现这一点,而不是在视图呈现期间有条件地生成其HTML输出。您可以为此使用JSTL标记

然而,这有一个警告:条件不能依赖于只有在JSF渲染时才知道的变量。因此,它不必依赖于JSF迭代组件的var,也不必是视图范围bean的属性,等等

另见:
JSF组件ID在视图构建期间应该是唯一的,而不仅仅是在视图呈现期间。通过这种方式,您将得到两个具有相同ID的JSF组件,这实际上是无效的。在视图构建之后,您希望在JSF组件树中得到一个具有所需ID的JSF组件

您可以通过在视图构建期间填充组件来实现这一点,而不是在视图呈现期间有条件地生成其HTML输出。您可以为此使用JSTL标记

然而,这有一个警告:条件不能依赖于只有在JSF渲染时才知道的变量。因此,它不必依赖于JSF迭代组件的var,也不必是视图范围bean的属性,等等

另见:
考虑PARAMISPORT和PARAMISNALL都是真的使用情况…更改您或您的ID。即使未呈现控件,它们也不能具有相同的id。@SiB I实际上对每个控件都执行paramType==检查,因此它们只能有1个true。这不是问题所在issue@DMoses你知道。。。这不能用于编写规范时的决策:考虑这样一个用例,其中paramIsInput和paramIsCalendar都是真的……更改您或您的id。即使未呈现控件,它们也不能具有相同的id。@SiB I实际上对每个控件都执行paramType==检查,因此它们只能有1个true。这不是问题所在issue@DMoses你知道。。。在编写规范时,这不能用于决策:谢谢。我想我所希望的是一个真正的switch语句,它将被识别为这样的语句,以便JSF知道它们不可能是重复的。namingcontainer是有意义的,但因为我希望消息和标签在同一个id上匹配,所以这不起作用。我想我会保留多个标签/消息和di
PanelGrid不是命名容器Hanks。我想我所希望的是一个真正的switch语句,它将被识别为这样的语句,以便JSF知道它们不可能是重复的。namingcontainer是有意义的,但因为我希望消息和标签在同一个id上匹配,所以这不起作用。我想我会用我拥有的多个标签/消息和不同的ID来保存它。PanelGrid不是一个命名容器好的信息,但条件是在一个视图范围的bean上,因为我有一个更改输入字段的SelectListiner。然后你必须让条件依赖于一个请求参数,而不是视图范围的bean属性。例如,只有在提交时使用选项值someValue,才会计算true。再次感谢您提供的信息,我阅读了JSF2中的JSTL。我的整个问题都在一个复述器中,这使得jstl解决方案不可行,但我从你的回答中学到了很多。很好的信息,但是条件是在一个视图范围的bean上,因为我有一个更改输入字段的select listiner。然后,您必须让条件依赖于一个请求参数,而不是视图范围的bean属性。例如,只有在提交时使用选项值someValue,才会计算true。再次感谢您提供的信息,我阅读了JSF2中的JSTL。我的整个问题都在重复中,因此jstl解决方案不可行,但我从您的回答中学到了很多。