我有两个<f:viewParam>
标签包含在<f:metaData>
JSF 页面上的标签中,如下所示。
index.xhtml 文件:
<h:form id="form" prependId="true">
<f:metadata>
<f:viewParam name="userId" id="paramId" rendered="#{not empty param.userId}" converter="#{userRoleConverter}" value="#{testManagedBean.userTable}"/>
<f:viewParam name="userRoleId" id="userParamId" rendered="#{not empty param.userRoleId}" converter="#{userAuthorityRowSelectionConverter}" value="#{testManagedBean.entity}"/>
<f:event type="preRenderView" listener="#{testManagedBean.preRenderEvent}" />
</f:metadata>
<p:messages id="messages" globalOnly="false" showDetail="true" showSummary="false" autoUpdate="false" closable="true"/>
</h:form>
converter
它们中的每一个都与属性指定的转换器相关联。
当两个参数即userId
和userRoleId
作为查询字符串附加到 URL 时,两个属性即userTable
和entity
被设置为关联的托管 bean -testManagedBean
在指定的转换器进行转换之后。
托管bean:
@ManagedBean
@ViewScoped
public final class TestManagedBean implements Serializable
{
private UserRoles entity; //Both are POJOs.
private UserTable userTable;
public TestManagedBean(){}
//Setters and getters of both the properties entity and userTable.
public void preRenderEvent(ComponentSystemEvent event) throws AbortProcessingException
{
System.out.println((entity==null)+" : "+(userTable==null));
}
}
当其中一个属性的转换失败时,或者userId
或userRoleId
,另一个属性以及失败的属性也不会设置为托管 bean(预计会设置,因为该其他属性的转换不太可能失败)并且两者其中为空。
例如,如果我输入了这样的 URL,
/index.jsf?userId=100&userRoleId=12
然后,方法中的以下语句preRenderEvent()
(与 关联<f:event>
),
System.out.println((entity==null)+" : "+(userTable==null));
显示true : true
.
在这种情况下,转换userId
失败(数据库中不存在值 100)但转换userRoleId
应该成功(但没有成功)并且不应该为空(存在于数据库中)。
同样,以下网址,
/index.jsf?userId=1&userRoleId=120
再次显示true : true
。
这是前一个的相反情况。userId
存在于数据库中,但userRoleId
不存在。
最后,以下网址,
/index.jsf?userId=1&userRoleId=12
显示false : false
。在这种情况下,两个参数的值都存在于数据库中它们各自的表中。
转换失败通过抛ConverterException
来通知就不用说了。
那么,当其中一个属性的转换失败时,为什么这两个属性的值都设置为 null?当其中一个转换器的转换失败时,是否只执行其中一个转换器?