gpt4 book ai didi

jsf - f :param does not work with p:commandLink or h:commandLink on query string

转载 作者:行者123 更新时间:2023-12-04 14:14:11 26 4
gpt4 key购买 nike

f:paramh:link 配合使用效果很好,但不是 p:commandLinkh:commandLink .

例如,我有两页 test_first.xhtmltest_second.xhtml , 和一个支持 java bean TestBean.java .

我开始运行 test_first.xhtml .

如果我点击 link1 ,这是一个 h:link ,页面将重定向到 test_second.xhtml .在 f:param 的帮助下,浏览器地址栏会显示.../test_second.xhtml?id=1 .在该页面上,testBean.userId被打印出来。

如果我点击 link2link3 ,页面重定向到 test_second.xhtml .但是地址栏只显示.../test_second.xhtml ,没有 ?id=# !和 testBean.userId不会打印在该页面上。

我该如何制作 commandLinkf:param 一起工作?有时我希望链接不要重定向到另一个页面,而是根据数据调用 bean 的一些方法。

test_first.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head/>
<h:body>
<h:form>
<h:link value="link1" outcome="test_second" >
<f:param name="id" value="1"/>
</h:link>
<br/><br/>
<h:commandLink value="link2" action="test_second?faces-redirect=true" >
<f:param name="id" value="2" />
</h:commandLink>
<br/><br/>
<p:commandLink value="link3" action="test_second?faces-redirect=true">
<f:param name="id" value="3" />
</p:commandLink>
<br/><br/>
</h:form>
</h:body>
</html>

test_second.xhtml:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<f:metadata>
<f:viewParam name="id" value="#{testBean.userId}" />
</f:metadata>
<h:head/>
<h:body>
<h:form>
This is the second page.
<h:outputText value="Selected id is #{testBean.userId}" />
<h:commandButton value="Print page id" action="#{testBean.print()}" />
</h:form>
</h:body>
</html>

测试Bean.java
@ManagedBean
@SessionScoped
public class TestBean implements Serializable{
private Integer userId;

public void print() {
System.out.println(userId);
}

public Integer getUserId() {
return userId;
}

public void setUserId(Integer userId) {
this.userId = userId;
}
}

最佳答案

您误解了这两个标签的含义,即 <h:link> <h:commandLink> 所以,你也误解了<f:param>的意思连接到两者中的任何一个。无论如何,在提出问题以获取更多见解之前,始终阅读文档是值得的。

<h:link> renders an HTML "a" anchor element. The value of the component is rendered as the anchor text and the outcome of the component is used to determine the target URL rendered in the "href" attribute. Any child UIParameter components are appended to the String to be output as the value of the "href" attribute as query parameters before rendering...

<h:commandLink> render an HTML "a" anchor element that acts like a form submit button* when clicked ... if the disabled attribute is not present, or its value is false. It renders "#" as the value of the "href" attribute, renders the current value of the component as the link text if it is specified and *renders JavaScript that is functionally equivalent to the following as the value of the "onclick" attribute:

document.forms['CLIENT_ID']['hiddenFieldName'].value='CLIENT_ID';    
document.forms['CLIENT_ID']['PARAM1_NAME'].value='PARAM1_VALUE';
document.forms['CLIENT_ID']['PARAM2_NAME'].value='PARAM2_VALUE'; return false;
document.forms['CLIENT_ID'].submit()"

where hiddenFieldName is as described above, CLIENT_ID is the clientId of the UICommand component, PARAM_NAME and PARAM_VALUE are the names and values, respectively, of any nested UIParameter children.



换句话说,在 <h:link>内标签嵌套 <f:param>最终将作为生成 URL 的查询参数,而在 <h:commandLink> 内标签嵌套 <f:param>最终将作为具有给定值的请求参数。

虽然第一个很清楚,但第二个值得更好地阐述。要理解它的作用,请考虑如果我们从细节中抽象出来 <h:commandLink>发送 POST 请求并附加所有嵌套的 <f:param>标签作为请求参数。但这取决于您如何处理它们,如 导航完全在您手中 .

因此,第一个选项是设置硬编码 action属性, 哪个用例可疑 ,就像在 action="second-page" ,以何种方式 你根本没有传递任何查询参数 .将要做的是发布到同一个 View 并转发到第二个 View 而不采取任何操作。相当愚蠢的举动。

第二个选项是指定一个操作方法,如 action="#{bean.action}" .在这种情况下 您必须在提供的操作方法中处理导航 ,即返回 null/ void从用于回发的方法中,或将导航案例结果作为字符串返回以转发到指定的 View 。至于 您通过 <f:param> 传递的请求参数它们将通过标准 JSF 方式提供 喜欢 @ManagedProperty("#{param.name}")在请求范围的 bean 上,或通过调用 ExternalContext#getRequestParameterMap() 例如,在任何作用域的 bean 中,在 action 方法中,如 String param = externalContext.getRequestParameterMap().get("name") .所以现在你有了你的参数 in action 方法,你可以随意使用你喜欢的方式,只需遵守一组存在于 URL 的规则。

还有两件事值得一提。请记住,通过调用命令链接传递的请求参数仅在同一请求中可用,因为您可能期望它在 faces-redirect=true 中幸存下来。这基本上会触发另一个请求。另一个选项是指定 includeviewparams=true传递当前 View 的参数,如果需要,如另一个答案中所述。

关于jsf - f :param does not work with p:commandLink or h:commandLink on query string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18347995/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com