UIForm与prependId =“假”符(UIForm with prependId=“fals

2019-09-30 09:14发布

我有一个关于这个事实背后的理念问题,只有UIForm得到了属性prependId 。 为什么属性没有指定NamingContainer接口? 现在,您可能会说这是因为其向后兼容性,但我会个优选打破了保持兼容,让它们实现该接口的用户,还实现了prependId事情的方法。

从我对prependId在透视图中的主要问题UIForm成分是,它将打破findComponent()我希望,如果我用prependId ,那么NamingContainer行为将发生变化,不仅关系到渲染,但也希望搜索时在组件树组件。

这里一个简单的例子:

<h:form id="test" prependId="false">
  <h:panelGroup id="group"/>
</h:form>

现在,当我想要得到的panelGroup中组件我希望到字符串传递"group"的方法findComponent()但它不会找到任何东西,我必须使用"test:group"代替。

与具体的问题是,使用Ajax和时prependId="false" 。 阿贾克斯标签预计的属性更新和工艺,该值命名关心容器。 这是一个有点奇怪的是,当我使用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将只包含ID "group"为renderIds的元素。 我不知道,如果这种预期,可能是,但我不知道该代码。 现在,我们来这里的方法点findComponent()无法找到组件,因为作为参数传递的表达式是"group" ,其中方法所期望的"test:group"找到组件。

一个解决办法是写自己的findComponent()这是我选择处理这个问题的方式。 在该方法我处理组件,它是一个NamingContainer并且具有属性prependId设置为假像一个正常UIComponent 。 我将不得不这样做,对于每一个UIComponent它提供了一个prependId属性,这是不好的。 思考将有助于让周围的类型的静态清晰度,但它仍然不是一个真正干净的解决方案。

另一种方法将是引入在所述prependId属性NamingContainer接口和改变的行为findComponent()类似于上述工作。

最后提出的解决方案将改变AJAX标签的行为,通过全ID,但是这只能解决AJAX的问题,而不是背后的纲领性问题findComponent()的实现。

你认为怎么样,为什么是啥玩意实现这样呢? 我不能成为第一有这个问题,但我没能找到相关的话题?

Answer 1:

事实上, UIComponent#findComponent()由完成<f:ajax render>使用时失败<h:form prependId="false"> 。 这个问题被称为是一个“不会解决”: JSF规范问题573 。

在我的愚见,他们不应该添加prependId属性的UIForm在JSF 1.2时代。 它只是做了保留j_security_check用户满意想用与该JSF输入组件JSF表单(谁j_security_check需要准确输入字段名称j_usernamej_password无法由配置进行修改)。 但是,他们并没有完全认识到JSF 1.2中的另一项改进是引入了使您能够只使用保留<form>为,而不是坚持<h:form> 。 然后CSS / jQuery的纯粹主义者开始滥用prependId="false" ,以避免逃逸的分隔符:在他们的选择不当的CSS选择器。

只要不使用prependId="false" ,永远。

对于j_security_check ,只要使用<form>或新的Servlet 3.0 HttpServletRequest#login() 另请参见使用j_security_check中的Java EE / JSF进行用户认证 。

对于CSS选择,如果你绝对需要ID选择(并因此不是可重复使用的多类选择器),简单地包装感兴趣的组分在一个普通的HTML <div><span>

也可以看看:

  • 如何使用jQuery选择JSF组件?
  • 如何使用JSF生成的HTML元素ID与结肠癌:在CSS选择器“”?
  • 默认情况下,JSF生成不可用的ID,这与Web标准的CSS部分不兼容


文章来源: UIForm with prependId=“false” breaks