也许有人可以启发我.
如果放
<f:metadata>
<f:viewParam name="test" value="#{test.value}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
在模板内,设置者
setValue永远不会被调用,即调用preRender方法'call()'而不事先调用setter(参见下面的代码示例以供参考).
但是,如果将元数据块放在合成中,则会按预期调用它.
这是正常行为还是我做错了什么?
非常感谢任何见解.
Hanspeter
供参考,这里是非工作版本的完整代码示例:
testtemplate.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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:ui="http://java.sun.com/jsf/facelets">
<f:metadata>
<f:viewParam name="test" value="#{test.value}"/>
</f:metadata>
<f:event type="preRenderView" listener="#{test.call}" />
<h:head>
<title>Test Template</title>
</h:head>
<h:body>
<ui:insert name="text" />
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
testcomposition.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="/templates/testtemplate.xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<ui:define name="text">
some text
</ui:define>
</ui:composition>
Run Code Online (Sandbox Code Playgroud)
这里是工作 …
我有一个<f:viewParam>驱动的搜索屏幕.我正在尝试实现它以获取单个的多个值<f:viewParam>.
我相信正确的URL看起来像
<url>?state=COMPLETE&state=PENDING
Run Code Online (Sandbox Code Playgroud)
XHTML部分如下:
<f:metadata>
<f:viewParam name="state"
value="#{backingBean.state}"
converter="#{stateNameConverter}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
我在backingBean上尝试了以下2个方法签名:
public void setState(State... state)
Run Code Online (Sandbox Code Playgroud)
希望JSF实现为值构建一个数组并在依赖bean上设置.JSF实现失败,错误表明它无法将枚举转换为枚举数组.
public void setState(State state)
Run Code Online (Sandbox Code Playgroud)
认为可能JSF实现会设置转换后的值,因为它在URL中找到它们.仅设置了第一个值.
该stateNameConverter之间的转换String和enum价值.
<f:viewParam>在JSF 2中可以有多个值吗?
假设我们得到了一个接受一个参数的简单页面:
<f:viewParam name="name" value="#{bean.name}"/>
Run Code Online (Sandbox Code Playgroud)
当用户进入时http://localhost/myapp/?name=Joe,则#{bean.name}设置为Joe.然后,如果用户去http://localhost/myapp/或http://localhost/myapp/?something=Else,然后#{bean.name}仍然设置Joe,但我希望它null.怎么做到这一点?
当我单击下面页面上的命令按钮时,导航失败.(单击该按钮刷新页面,删除URL参数并显示所需的错误消息,而不是导航到索引页面)
但是,如果我删除所需的属性或删除f:ajax标记导航工作正常.
使用com.sun.faces JSF 2.1.13和primefaces 3.4.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head></h:head>
<f:metadata>
<f:viewParam name="product"
required="true" requiredMessage="Bad request. Please use a link from within the system."/>
</f:metadata>
<body>
<h:form id="form">
<h:selectBooleanCheckbox>
<f:ajax update="form" />
</h:selectBooleanCheckbox>
<h:commandButton value="buy" action="/index.xhtml?faces-redirect=true" />
</h:form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud) 我有一个视图范围的 JSF托管bean,支持xhtml视图,我使用f:viewParam从URL读取一个参数.
该视图向用户呈现表单.但是,当用户通过按p:commandButton提交表单时,似乎重新创建了视图范围的bean(我添加了@PostConstruct注释来验证这一点),因此不记得从f:viewParam读取的实例变量(见下面的代码).
我最初使用GET导航到视图,其中包含URL参数,但是当用户按下p时发送的POST消息:commandButton不包含URL参数.所以我认为当JSF运行时没有在POST上看到URL参数时,它认为这是一个不同的视图,并且正在重新创建JSF管理的bean.当我将视图范围更改为session-scoped时,代码可以正常工作.
这是代码:
<f:metadata>
<f:viewParam name="invId" value="#{registerBean.invId}"/>
</f:metadata>
<h:form id="registrationForm">
....
<p:commandButton value="register" action="#{registerBean.register}"
icon="ui-icon ui-icon-newwin" ajax="false"/>
</h:form>
Run Code Online (Sandbox Code Playgroud)
@ManagedBean
@ViewScoped
public class RegisterBean implements Serializable {
@ManagedProperty(value="#{invId}")
private String invId;
...
Run Code Online (Sandbox Code Playgroud)
事实证明,这与URL参数根本没有关系.在下面的BalusC建议之后,我删除了c:when我的视图使用的标签(依赖于渲染的属性而不是相同的效果),现在不再重新创建视图范围的bean并正确保留invId字段.
我正在尝试使用Glassfish 4.0和Java EE 7 XML命名空间来测试下面的示例.
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Title</title>
</h:head>
<h:body>
<h:form>
<ul>
<ui:repeat value="#{appLoad.movieList}" var="movie">
<li>
<h:link value="#{movie.title}" outcome="movie" includeViewParams="true">
<f:param name="id" value="#{movie.id}"/>
</h:link>
</li>
</ui:repeat>
</ul>
</h:form>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
它链接到以下页面movie.xhtml:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<f:metadata>
<f:viewParam name="id" value="#{appLoad.movieId}"/>
<f:event listener="#{appLoad.movieDetail()}" type="preRenderView"/>
</f:metadata>
</h:head>
<h:body>
<h:form>
<h:panelGrid columns="2">
<h:panelGrid columns="1" width="400">
<h:panelGrid columns="1">
Title : <h:outputLabel value="#{appLoad.movie.title}"/>
</h:panelGrid>
</h:panelGrid>
</h:panelGrid>
</h:form>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
该#{appLoad}支持bean是
@ManagedBean
@RequestScoped
public class AppLoad { …Run Code Online (Sandbox Code Playgroud) 如果a f:viewParam为空,我会进行重定向(或错误)吗?
<f:metadata>
<f:viewParam name="accountId" value="#{accountMB.id}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
当我添加时required="true",没有任何反应.有什么选择?
我有这个f:viewParam,我尝试绑定验证,并转换userId成Player和我得到了一个意想不到的结果.
<f:metadata>
<f:viewParam name="userId" value="#{myBean.selectedPlayer}" converter="pConverter"
converterMessage="Bad Request. Unknown User" required="true"
requiredMessage="Bad Request. Please use a link from within the system" />
</f:metadata>
<h:body>
<p:messages id="msgs"/>
<h:form>
<ul>
<li><a href="index2.xhtml?userId=1">Harry</a></li>
<li><a href="index2.xhtml?userId=2">Tom</a></li>
<li><a href="index2.xhtml?userId=3">Peter</a></li>
</ul>
</h:form>
<h:form>
<h:panelGrid columns="2" rendered="#{not empty myBean.selectedPlayer}">
<h:outputText value="Id: #{myBean.selectedPlayer.id}"/>
<h:outputText value="Name: #{myBean.selectedPlayer.name}"/>
</h:panelGrid>
</h:form>
<h:form id="testForm">
<h:inputText value="#{myBean.text}"/>
<p:commandButton value="Switch" update=":msgs testForm"/>
<h:outputText value="#{myBean.text}" rendered="#{not empty myBean.text}"/>
</h:form>
</h:body>
Run Code Online (Sandbox Code Playgroud)
我的转换器看起来像这样
@FacesConverter(value="pConverter")
public class PConverter implements Converter …Run Code Online (Sandbox Code Playgroud) 我有一个JSF页面,由URL打开test.xhtml?a=15&b=20.
我有一个链接,应该将所有URL参数传递到下一页.
<h:link outcome="index" includeViewParams="true" value="Include all url parameters" />
Run Code Online (Sandbox Code Playgroud)
我期待当我点击链接时它会转到 index.xhtml?a=15&b=20
但我在URL中没有看到任何内容.我明白了includeViewParams吗?
我目前的环境是JRE 1.7,JSF 2.2,Eclipse Luna.在entity_index.xhtml我的应用程序的某个页面()中,我有以下(PrimeFaces)按钮:
<p:commandButton value="Details" action="entity_details"
ajax="false" onclick="this.form.target='_blank'">
<f:param name="id" value="#{entity.id}" />
</p:commandButton>
Run Code Online (Sandbox Code Playgroud)
我们的想法是提供一个按钮,以便用户可以单击它,当前实体的一些细节将显示在另一个浏览器选项卡(页面entity_details.xhtml)中.这是许多的一个按钮,因此entity_index.xhtml页面显示实体的许多实例,每个实例都有一个详细信息按钮.
按钮的工作方式是新选项卡打开并显示正确的页面(entity_details.xhtml),但实体ID永远不会到达处理详细信息页面的bean(EntityDetailsMB).详情页面如下:
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui" xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:dsi="http://www.cce.ufpr.br"
template="/private/template/sbadmin.xhtml">
<f:metadata>
<f:viewParam name="id" value="#{entityDetailsMB.id}"/>
</f:metadata>
<ui:define name="content">
<h2 class="page-header">#{entityDetailsMB.entity.name}</h2>
<h:form id="form">
...
</ui:composition>
Run Code Online (Sandbox Code Playgroud)
请注意,有一个<f:metadata/>元素专门用于捕获从索引页面发送的参数并将其转发到id属性中EntityDetailsMB,其中包含以下内容:
public Entity getEntity() {
return entityById(id);
}
public Long getId() {
return id;
}
public void setId(Long value) {
id = value;
}
Run Code Online (Sandbox Code Playgroud)
因为setId()从不调用该方法,所以 …
我试图将一个对象从一个页面传递到另一个页面,其中每个页面都在不同的视图中.
在第一页上我有一个输入文本,其中myBean是ViewScoped Bean,名称是一个对象.
<h:inputText value="#{myBean.name}"/>
第二页包含,
<f:metadata>
<f:viewParam name="userId" value="#{myBean.name}"/>
</f:metadata>
我得到错误转换错误设置值mypackage.myBean@257100b'为'null Converter'.我们可以传递String值以外的对象来查看参数吗?
viewparams ×11
jsf ×7
jsf-2 ×5
jsf-2.2 ×2
ajax ×1
composition ×1
facelets ×1
java ×1
mojarra ×1
navigation ×1
omnifaces ×1
primefaces ×1
redirect ×1
validation ×1