将参数传递给JSF操作

时间:2011-09-13 12:21:31

标签: jsf-2

我正在使用GlassFish 3.1,并尝试将参数传递给commandButton操作。以下是我的代码:

的beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd" />

面-config.xml中

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" />

ManagedBean类

package actionParam;

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@Named("bean")
@RequestScoped
public class ActionParam {

    public ActionParam() {
        super();
    }

    public String submit(int param) {
        System.out.println("Submit using value " + param);
        return null;
    }

}

最后,

查看

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.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">
<h:head>
    <meta http-equiv="Content-Type"
        content="text/html; charset=ISO-8859-1" />
    <title>Test Action Param</title>
</h:head>
<h:body>
    <h:form id="actionForm">
        <h:commandButton id="actionButton" value="Submit"
            action="#{bean.submit}">
            <f:param name="param" value="123"></f:param>
        </h:commandButton>
    </h:form>
</h:body>
</html>

当我点击提交按钮时,我得到 javax.el.MethodNotFoundException

如果我删除<f:param ... />并按如下方式传递参数,

.
:
        <h:commandButton id="actionButton" value="Submit"
            action="#{bean.submit(123)}">
        </h:commandButton>
:
.

它运作正常。

但我在想第一种方法(使用f:param)是正确的。

传递参数的正确方法是什么?

提前致谢。

1 个答案:

答案 0 :(得分:5)

<f:param>设置HTTP请求参数,而不是操作方法参数。要获得它,您需要使用<f:viewParam>@ManagedProperty。在这种特殊情况下,后者更合适。您只需要通过JSF注释替换CDI注释,以使@ManagedProperty起作用:

@ManagedBean(name="bean")
@RequestScoped
public class ActionParam {

    @ManagedProperty("#{param.param}")
    private Integer param;

    public String submit() {
        System.out.println("Submit using value " + param);
        return null;
    }

}

当您使用web.xml <web-app>根声明定义Servlet 3.0的<h:commandButton id="actionButton" value="Submit" action="#{bean.submit(123)}"> </h:commandButton> 定位Servlet 3.0容器(Tomcat 7,Glassfish 3,JBoss AS 6等)时,您应该能够只需将参数直接传递给EL的动作方法,因为EL 2.2支持它(它是Servlet 3.0的一部分):

public String submit(Integer param) {
    System.out.println("Submit using value " + param);
    return null;
}

{{1}}

如果你的目标是旧的Servlet 2.5容器,那么你仍然可以使用JBoss EL来做到这一点。有关安装和配置详细信息,请参阅此答案:Invoke direct methods or methods with arguments / variables / parameters in EL