使用?mode = test查看此页面时,该按钮不起作用。它加载此页面时没有?mode = test,但是h:panelGroup被渲染(因为模式被设置在其他地方)。我使用两种发送模式的方法(h:inputHidden f:param)和服务器,没有任何帮助。 CDI中不提供查看范围的bean。这有什么可能的解决方案?
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://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<f:view>
<f:metadata>
<f:viewParam name="mode" value="#{test.mode}" />
</f:metadata>
<h:panelGroup layout="block" rendered="#{test.mode.equals('test')}">
<h:form>
<h:inputHidden value="#{test.mode}" />
<h:commandButton value="Run a method" action="#{test.method}">
<f:param name="mode" value="#{test.mode}" />
</h:commandButton>
</h:form>
</h:panelGroup>
<h:messages />
</f:view>
</html>
爪哇
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named("test")
@RequestScoped
public class TestBean {
private String mode;
public void method() {
System.out.print(mode);
}
public String getMode() {
return mode;
}
public void setMode(String mode) {
this.mode = mode;
}
}
答案 0 :(得分:2)
你有各种各样的可能性。最简单的方法是不将view参数绑定到backing bean,只需将其绑定到视图:
<强> test.xhtml 强>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<f:view>
<f:metadata>
<f:viewParam name="mode" value="#{mode}" />
</f:metadata>
<h:form rendered="#{mode eq 'test'}">
<h:commandButton value="Run a method" action="#{test.method(mode)}" />
</h:form>
<h:messages />
</f:view>
</html>
<强> Test.java 强>
@Named
@RequestScoped
public class Test {
public void method(String mode) {
System.out.print(mode);
}
}
如果您想切换到@ViewScoped
,CDI兼容的注释现在可以在JSF 2.2版本中使用。您正在使用的命名空间建议您使用该版本,因此请使用它。对于JSF早期版本,还有机会使用自定义Omnifaces的注释。
另见: