我正在尝试从JSF中的h:commandLink
调用托管bean。但我在呈现的HTML href
标记中看不到a
属性。
我错过了什么吗?
有一个名为AccountSetupController
的ManagedBean,其中包含signUp
方法。
这是我在JSF中使用的标签:
<h:form prependId="false">
<h:commandLink action="#{accountSetupController.signUp()}"
value="#{msg['homepage.createaccount']}" styleClass="button large">
</h:commandLink>
</h:form>
这是呈现的标记。请参阅href属性中没有任何内容。
<a href="#" onclick="mojarra.jsfcljs(document.getElementById('j_idt15'),
{'j_idt33':'j_idt33'},'');return false"
class="button large">CREATE MY ACCOUNT</a>
这是生成的表单标记
<form id="j_idt15" name="j_idt15"
method="post" action="/myproject/faces/homepage/homepage.xhtml"
enctype="application/x-www-form-urlencoded"> .... </form>
正如您所看到的,表单操作指向了一些我不需要的地方。
我错过了什么吗?
答案 0 :(得分:2)
JSF中的命令链接以这种方式呈现。表单将由JSF使用JSF JS库通过JavaScript的onclick
方法提交,而href
将始终保持#
。
此外,由于可理解的原因,您将无法在浏览器工具中找到绑定的操作/操作侦听器方法名称。相反,JSF将在服务器上找到被点击链接的id,并将触发所有组件的操作(侦听器)。
总而言之,阅读<h:commandLink>
文档毫不奇怪地帮助了很多(所有强调我的):
一般行为:编码和解码行为都需要能够获取隐藏字段的 id / name,该字段可以在标记中呈现,也可以通过客户端DOM操作以编程方式添加,其值已设置通过JavaScript表单提交(进一步称为hiddenFieldName。
解码行为:获取组件的“clientId”属性。 从ExternalContext的“requestParameterMap”属性获取Map。如上导出hiddenFieldName。获取hiddenFieldName键下的Map中的条目。如果没有条目,或者条目是空String,或者条目不等于“clientId”属性的值,则返回立即。 如果有一个条目,并且其值等于“clientId”属性的值,则在组件周围创建一个新的javax.faces.event.ActionEvent实例,并在组件上调用queueActionEvent() ,通过活动。
编码行为:将“#”渲染为“href”属性的值。如果指定了组件的当前值,则将其呈现为链接文本。 渲染与“onclick”属性的值在功能上等效的JavaScript:document.forms ['CLIENT_ID'] ['hiddenFieldName']。value ='CLIENT_ID'; 。ocument.forms [ 'CLIENT_ID'] [ 'PARAM1_NAME']值= 'PARAM1_VALUE'; 。document.forms [ 'CLIENT_ID'] [ 'PARAM2_NAME']值= 'PARAM2_VALUE';返回false; document.forms ['CLIENT_ID']。submit()“其中hiddenFieldName如上所述,CLIENT_ID是UICommand组件的clientId,PARAM * _NAME和PARAM * _VALUE分别是任何名称和值嵌套的UIParameter孩子。