Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
952 views
in Technique[技术] by (71.8m points)

jsf 2 - Passing parameter to JSF action

I'm using GlassFish 3.1, and trying to pass parameter to commandButton action. Following is my code:

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" />

faces-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 class

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;
    }

}

and finally,

View

<?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>

When I click submit button, I get javax.el.MethodNotFoundException.

If I remove <f:param ... /> and pass parameter as follows,

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

it works OK.

But I was thinking first way (using f:param) is correct one.

Which is the correct way to pass parameter?

Thanks in advance.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The <f:param> sets a HTTP request parameter, not an action method parameter. To get it, you would need to use <f:viewParam> or @ManagedProperty. In this particular case, the latter is more suitable. You only have to replace CDI annotations by JSF annotations in order to get @ManagedProperty to work:

@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;
    }

}

When you're targeting a Servlet 3.0 container (Tomcat 7, Glassfish 3, JBoss AS 6, etc) with a web.xml whose <web-app> root declaration definies Servlet 3.0, then you should be able to just pass the parameter straight into the action method by EL as that's supported by EL 2.2 (which is part of Servlet 3.0):

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

with

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

If you target an old Servlet 2.5 container, then you should still be able to do this using JBoss EL. See also this answer for installation and configuration details: Invoke direct methods or methods with arguments / variables / parameters in EL


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...