我正在尝试实现一个简单的RichFaces 4皮肤切换器,因此所有代码都会在bean上设置一个新的String属性并重新呈现整个视图。这是JSF:
<rich:panel styleClass="shadow">
...
<h:form style="float: right;">
<h:outputText value="Skin: " />
<h:selectOneMenu value="#{skinBean.skin}" id="skin-selector">
<f:ajax event="change" execute="@form" render="@all" listener="#{skinBean.listener}" />
<f:selectItem itemValue="DEFAULT" itemLabel="Default" />
<f:selectItem itemValue="classic" itemLabel="Classic" />
<f:selectItem itemValue="blueSky" itemLabel="Blue Sky" />
<f:selectItem itemValue="deepMarine" itemLabel="Deep Marine" />
<f:selectItem itemValue="emeraldTown" itemLabel="Emerald Town" />
<f:selectItem itemValue="japanCherry" itemLabel="Japan Cherry" />
<f:selectItem itemValue="ruby" itemLabel="Ruby" />
<f:selectItem itemValue="wine" itemLabel="Wine" />
</h:selectOneMenu>
</h:form>
</rich:panel>
这是皮肤bean:
@Named
@SessionScoped
public class SkinBean implements Serializable
{
private static final long serialVersionUID = 7477768262527797286L;
private static final Logger log = Logger.getLogger(SkinBean.class);
private String skin;
@PostConstruct
public void init()
{
log.info("Initializing skin bean!");
// default
this.skin = "wine";
}
@PreDestroy
public void remove()
{
log.info("Removing skin bean!");
}
public String getSkin()
{
return skin;
}
public void setSkin(String skinName)
{
log.info("Setting skin to " + skinName);
this.skin = skinName;
}
public void listener(AjaxBehaviorEvent abe)
{
// log.info("Skinning event!" + abe);
}
}
登录选择更改:
07:34:49,869 INFO [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After RESTORE_VIEW 1
07:34:49,870 INFO [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) Before APPLY_REQUEST_VALUES 2
07:34:49,871 INFO [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After APPLY_REQUEST_VALUES 2
07:34:49,871 INFO [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) Before PROCESS_VALIDATIONS 3
07:34:49,871 INFO [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After PROCESS_VALIDATIONS 3
07:34:49,871 INFO [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) Before UPDATE_MODEL_VALUES 4
07:34:49,872 INFO [com.company.project.skin.SkinBean] (http--127.0.0.1-8080-5) Setting skin to classic
07:34:49,872 INFO [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After UPDATE_MODEL_VALUES 4
07:34:49,872 INFO [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) Before INVOKE_APPLICATION 5
07:34:49,872 INFO [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After INVOKE_APPLICATION 5
07:34:49,872 INFO [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) Before RENDER_RESPONSE 6
07:34:50,226 INFO [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After RENDER_RESPONSE 6
我的日志清楚地显示新值已正确设置,但它不会更新视图。它只在重新加载整个页面时更新(这有点无意义)。
有人知道为什么视图没有更新吗?我还尝试了一些ID,而不是render="@all"
,例如render=":repo-form"
(在切换器的表单外部),但没有任何反应。寻找错误也没有透露任何有用的东西。即使是明确的ID也无法更新,这让我觉得它有所不同......?
注意:我在JBoss AS 7.0.1上使用Mojarra 2.0.4。
由于
答案 0 :(得分:1)
尝试使用完整请求设置外观,而不是使用Ajax:
<rich:panel styleClass="shadow">
...
<h:form style="float: right;">
<h:outputText value="Skin: " />
<h:selectOneMenu value="#{skinBean.skin}" id="skin-selector" onchange="submit()">
<f:selectItem itemValue="DEFAULT" itemLabel="Default" />
<f:selectItem itemValue="classic" itemLabel="Classic" />
<f:selectItem itemValue="blueSky" itemLabel="Blue Sky" />
<f:selectItem itemValue="deepMarine" itemLabel="Deep Marine" />
<f:selectItem itemValue="emeraldTown" itemLabel="Emerald Town" />
<f:selectItem itemValue="japanCherry" itemLabel="Japan Cherry" />
<f:selectItem itemValue="ruby" itemLabel="Ruby" />
<f:selectItem itemValue="wine" itemLabel="Wine" />
</h:selectOneMenu>
</h:form>
</rich:panel>
此致 帕洛阿
答案 1 :(得分:0)
我猜你正试图做here之类的事情。很抱歉问,但您确定已使用“org.richfaces.skin”参数和EL将您的“SkinBean”连接到web.xml中的RichFaces皮肤吗?
因为,你的代码看起来很不错。也许我会尝试“onchange”事件而不是“更改”,但因为你已经记录了属性更新......