带prependId的UIForm=";假;休息<;f:ajax渲染>;
我对这个事实背后的想法有一个疑问,即只有带prependId的UIForm=";假;休息<;f:ajax渲染>;,ajax,forms,jsf,naming-containers,Ajax,Forms,Jsf,Naming Containers,我对这个事实背后的想法有一个疑问,即只有UIForm获得了属性prependId。为什么在NamingContainer界面中未指定该属性?你现在可能会说这是因为向后兼容,但我更愿意打破这种兼容,让实现该接口的用户也实现prependId的方法 从我的角度来看,UIForm组件中prependId的主要问题是,它将破坏findComponent() 我希望如果我使用prependId,那么NamingContainer行为将发生变化,不仅与渲染有关,而且在希望在组件树中搜索组件时也会发生变化 这
UIForm
获得了属性prependId
。为什么在NamingContainer
界面中未指定该属性?你现在可能会说这是因为向后兼容,但我更愿意打破这种兼容,让实现该接口的用户也实现prependId的方法
从我的角度来看,UIForm
组件中prependId的主要问题是,它将破坏findComponent()
我希望如果我使用prependId
,那么NamingContainer
行为将发生变化,不仅与渲染有关,而且在希望在组件树中搜索组件时也会发生变化
这里有一个简单的例子:
<h:form id="test" prependId="false">
<h:panelGroup id="group"/>
</h:form>
这段代码将毫无问题地呈现,但它不会更新panelGroup,因为它找不到它。PartialViewContext
将只包含id“group”
作为渲染元素。我不知道这是否是预期的,可能是,但我不知道代码。现在我们到了方法findComponent()
找不到组件的地步,因为作为参数传递的表达式是“group”
,方法希望“test:group”
找到组件
一种解决方案是编写自己的findComponent()
,这是我选择的处理此问题的方法。在这个方法中,我处理一个组件,它是NamingContainer
,属性prependId设置为false,就像普通UIComponent
一样。对于每个提供prependId属性的UIComponent
,我都必须这样做,这很糟糕。反射将有助于绕过类型的静态定义,但它仍然不是一个真正干净的解决方案
另一种方法是在NamingContainer
接口中引入prependId属性,并将findComponent()
的行为更改为如上所述
最后提出的解决方案是更改ajax标记的行为以传递整个id,但这只会解决ajax问题,而不会解决findComponent()
实现背后的编程问题
你是怎么想的?为什么要这样实施?我不可能是第一个有这个问题的人,但我找不到相关的话题 实际上,
执行的UIComponent#findComponent()
在使用
时失败。这个问题是已知的,是一个“无法修复的”:
在我看来,在JSF1.2时代,他们不应该在UIForm
中添加prependId
属性。这样做仅仅是为了让想要使用JSF表单和JSF输入组件的用户感到高兴(j_security_check
需要精确的输入字段名j_用户名
和j_密码
,配置无法修改)。但他们并没有完全意识到,在JSF1.2中引入了另一个改进,使您能够继续使用
而不是坚持使用
。然后CSS/jQuery纯粹主义者开始滥用prependId=“false”
,以避免在错误选择的CSS选择器中转义分隔符:
永远不要使用prependId=“false”
对于j_security\u check
,只需使用
或新的Servlet 3.0HttpServletRequest#login()
。另见
对于CSS选择器,如果您绝对需要一个ID选择器(因此不是一个更可重用的类选择器),只需将感兴趣的组件包装在一个普通的HTML
或
中即可
另见:
执行的UIComponent#findComponent()
在使用
时失败。这个问题是已知的,是一个“无法修复的”:
在我看来,在JSF1.2时代,他们不应该在UIForm
中添加prependId
属性。这样做仅仅是为了让想要使用JSF表单和JSF输入组件的用户感到高兴(j_security_check
需要精确的输入字段名j_用户名
和j_密码
,配置无法修改)。但他们并没有完全意识到,在JSF1.2中引入了另一个改进,使您能够继续使用
而不是坚持使用
。然后CSS/jQuery纯粹主义者开始滥用prependId=“false”
,以避免在错误选择的CSS选择器中转义分隔符:
永远不要使用prependId=“false”
对于j_security\u check
,只需使用
或新的Servlet 3.0HttpServletRequest#login()
。另见
对于CSS选择器,如果您绝对需要一个ID选择器(因此不是一个更可重用的类选择器),只需将感兴趣的组件包装在一个普通的HTML
或
中即可
另见:
<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>