将参数传递给 JSF 操作 [英] Passing parameter to JSF action

查看:17
本文介绍了将参数传递给 JSF 操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

beans.xml

faces-config.xml

ManagedBean 类

package actionParam;导入 javax.enterprise.context.RequestScoped;导入 javax.inject.Named;@Named("bean")@RequestScoped公共类 ActionParam {公共动作参数(){极好的();}公共字符串提交(int param){System.out.println("使用值提交" + param);返回空;}}

最后,

查看

<!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:头><meta http-equiv="内容类型"content="text/html; charset=ISO-8859-1"/><title>测试动作参数</title></h:head><h:body><h:form id="actionForm"><h:commandButton id="actionButton" value="提交"action="#{bean.submit}"><f:param name="param" value="123"></f:param></h:commandButton></h:form></h:body>

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

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

<预><代码>.:<h:commandButton id="actionButton" value="提交"action="#{bean.submit(123)}"></h:commandButton>:.

它工作正常.

但我认为第一种方法(使用 f:param)是正确的.

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

提前致谢.

解决方案

设置 HTTP 请求参数,而不是操作方法参数.要获得它,您需要使用 @ManagedProperty.在这种特殊情况下,后者更合适.您只需将 CDI 注释替换为 JSF 注释即可使 @ManagedProperty 工作:

@ManagedBean(name="bean")@RequestScoped公共类 ActionParam {@ManagedProperty("#{param.param}")私有整数参数;公共字符串提交(){System.out.println("使用值提交" + param);返回空;}}

当您使用 web.xml 定位 Servlet 3.0 容器(Tomcat 7、Glassfish 3、JBoss AS 6 等)时> 根声明定义了 Servlet 3.0,那么您应该能够通过 EL 将参数直接传递到操作方法中,因为 EL 2.2(它是 Servlet 3.0 的一部分)支持:

</h:commandButton>

public String submit(Integer param) {System.out.println("使用值提交" + param);返回空;}

如果您的目标是旧的 Servlet 2.5 容器,那么您应该仍然可以使用 JBoss EL 执行此操作.另请参阅此答案以了解安装和配置详细信息:调用直接方法或带有参数的方法/EL 中的变量/参数

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.

解决方案

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

这篇关于将参数传递给 JSF 操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆