繁体   English   中英

带有prependId =“ false”的UIForm中断<f:ajax render>

[英]UIForm with prependId=“false” breaks <f:ajax render>

我对事实背后的想法有一个疑问,那就是只有UIForm才具有属性prependId 为什么在NamingContainer接口中未指定属性? 您现在可能会说这是由于向后兼容性,但是我更希望破坏兼容性,让实现该接口的用户也为prependId事情实现方法。

从我的角度来看,关于UIForm组件中的UIForm的主要问题是,它将破坏findComponent()我希望如果我使用prependId ,则NamingContainer行为将发生变化,不仅与呈现有关,而且还与想要搜索时有关组件树中的组件。

这里有个简单的例子:

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

现在,当我想获取panelGroup组件时,我希望将字符串"group"传递给方法findComponent() ,但找不到任何东西,我必须改用"test:group"

具体的问题是,将ajax与prependId="false" 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将仅包含id "group"作为renderIds的元素。 我不知道这是否可以预期,可能是这样,但是我不知道代码。 现在我们到了点,因为方法作为参数传递的表达式是"group" ,所以方法findComponent()找不到组件,该方法希望"test:group"找到组件。

一种解决方案是编写自己的findComponent() ,这是我选择处理此问题的方式。 在这种方法中,我像正常的UIComponent一样处理一个组件NamingContainer并将其prependId属性设置为false。 我将必须为每个提供prependId属性的UIComponent这样做,这很糟糕。 反射将有助于绕过类型的静态定义,但它仍然不是一个真正干净的解决方案。

另一种方法是在NamingContainer接口中引入prependId属性,并将findComponent()的行为更改为如上所述。

最后提出的解决方案是更改ajax标记的行为以传递整个id,但这只能解决ajax问题,不能解决findComponent()实现背后的编程问题。

您对此有何看法,为什么会这样实施? 我不能成为第一个遇到此问题的人,但找不到相关主题?

实际上,当使用<h:form prependId="false">时,由<f:ajax render>完成的UIComponent#findComponent()失败。 此问题是已知的,并且是“无法解决”的问题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>

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM