使用渲染时不会调用JSF CommandButtons的操作

时间:2014-02-08 13:25:38

标签: jsf jsf-2 cdi

使用?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;
    }
}

1 个答案:

答案 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的注释。

另见: