eth*_*jyx 6 jsf primefaces query-string
f:param很好用h:link,但不用p:commandLink或h:commandLink.
例如,我有两页test_first.xhtml和test_second.xhtml,和背部的java bean TestBean.java.
我开始跑步了test_first.xhtml.
如果我单击link1,这是一个h:link,页面将重定向到test_second.xhtml.借助于f:param,浏览器的地址栏将显示.../test_second.xhtml?id=1.在该页面上,testBean.userId打印出来.
如果我单击link2或link3,页面重定向到test_second.xhtml.但是,地址栏只显示.../test_second.xhtml,没有?id=#!并且testBean.userId不会在该页面上打印.
我怎样才能commandLink合作f: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>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
TestBean.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;
}
}
Run Code Online (Sandbox Code Playgroud)
你曲解了这两个标签,即意义<h:link>和<h:commandLink>,因此,您也曲解的意义<f:param>附着到两个.无论如何,在提出问题以获得更多见解之前,始终阅读文档是值得的.
<h:link>呈现HTML"a"锚元素.组件的值呈现为锚文本,组件的结果用于确定在"href"属性中呈现的目标URL.任何子UIParameter组件都附加到String,作为"href"属性的值作为查询参数输出,然后再渲染...
<h:commandLink>渲染一个HTML"a"锚元素,当单击时表现为表单提交按钮*...如果禁用的属性不存在,或者其值为false.它将"#"呈现为"href"属性的值,将组件的当前值呈现为链接文本(如果已指定),并且*将与功能上等同于以下内容的JavaScript呈现为"onclick"属性的值:Run Code Online (Sandbox Code Playgroud)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()"其中
hiddenFieldName如上所述,CLIENT_ID是UICommand组件的的clientId,PARAM _NAME和PARAM _value分别是任何嵌套UIParameter儿童的名称和值,.
换句话说,在<h:link>标记内嵌套<f:param>将最终作为生成的URL的查询参数,而<h:commandLink>嵌套的标记内<f:param>最终将作为具有给定值的请求参数.
虽然第一个是明确的,但第二个值得更好的阐述.要了解它的作用,请考虑如果我们从详细信息中抽象出来<h:commandLink>发送POST请求并将所有嵌套<f:param>标记作为请求参数附加.但由您完全掌握导航功能,由您决定如何处理它们.
因此,第一个选项是设置一个硬编码action属性,该用例是可疑的,就像在action="second-page",你没有传递任何查询参数.将要做的是POST到相同的视图并转发到第二个视图而不进行任何操作.相当愚蠢的行动.
第二个选项是指定一个动作方法,如in action="#{bean.action}".在这种情况下,您必须在提供的操作方法中处理导航,即返回null/ void从方法返回,或返回导航案例结果作为字符串以转发到指定的视图.至于你通过该请求的参数<f:param>,他们将提供与标准JSF意味着像@ManagedProperty("#{param.name}")在请求范围豆,或致电ExternalContext#getRequestParameterMap()任何作用域的bean,例如,在操作方法,就像在String param = externalContext.getRequestParameterMap().get("name").所以现在你有了参数in action方法,你可以随意使用你喜欢的方式,只需遵守一套存在的URL规则.
剩下两件事值得一提.请记住,通过调用命令链接传递的请求参数只能在同一个请求中使用,因为您可能希望它能够存活faces-redirect=true,基本上会触发另一个请求.另一种选择是指定includeviewparams=true通过当前视图的参数,如果需要的话,如另一个答案中所述.
| 归档时间: |
|
| 查看次数: |
13517 次 |
| 最近记录: |