【问题标题】:f:param value is returning null both with commandButton and also commandLinkf:param 值在 commandButton 和 commandLink 中都返回 null
【发布时间】:2015-05-08 12:06:00
【问题描述】:

因为我是初学者,所以我在 jsf 中做一个简单的导航示例。使用 ManagedProperty 访问 managedBean 中的 f:param 值时,我总是得到 null

home.xhtml

    <!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://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/facelets">
<head>
<title>JSF Tutorial!</title>
</head>
<body>
    <h3>Using JSF outcome</h3>
    <h:form>
        <h:commandButton action="#{navigation.show}" value="Page1">
            <f:param name="pageId" value="1" />
        </h:commandButton>
        <h:commandLink action="#{navigation.show}" value="Page2">
            <f:param name="pageId" value="2" />
        </h:commandLink>
        <h:commandLink action="#{navigation.show}" value="Home">
            <f:param name="pageId" value="3" />
        </h:commandLink>
    </h:form>

导航.java

    package com.jason.jsf;

import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

@ManagedBean(name = "navigation", eager = true)
@RequestScoped
public class Navigation {

    @ManagedProperty(value = "#{param.pageId}")
    private String pageId;

    public String show() {

        System.out.println("page id" + value);
        if (pageId == null) {
            return "home";
        }
        if (pageId.equals("1")) {
            return "page1";
        } else if (pageId.equals("2")) {
            return "page2";
        } else {
            return "home";
        }
    }

    public String getPageId() {
        return pageId;
    }

    public void setPageId(String pageId) {
        System.out.println("page id set" + pageId);

        this.pageId = pageId;
    }
}

这是如何引起的,我该如何解决?我正在使用 jsf2.2 Mojarra 2.0.3。还有其他示例 page1.xhtml 和 page2.xhtml 仅用于与我一起导航 提前致谢

【问题讨论】:

    标签: jsf mojarra http-request-parameters


    【解决方案1】:

    仔细查看 XML 命名空间前缀和 URI,并与一本像样的 JSF 书籍/教程/资源中显示的内容进行比较:

    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/facelets">
    

    是的,f: 前缀的 XML 命名空间 URI 错误。您声明它是 Facelets 标记之一,通常具有 ui: 前缀。这基本上会导致这些标签根本无法正确解释。它被误解为&lt;ui:param&gt;,其含义与真正的&lt;f:param&gt; 完全不同。

    修复 taglib URI。它必须是http://java.sun.com/jsf/core。这是完整的集合:

    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:ui="http://java.sun.com/jsf/facelets">
    

    另见:


    与具体问题无关,Mojarra 2.0.3 不是 JSF 2.2。这是JSF 2.0。还有一个相当古老的实现,已经超过 5 年了。您可以在http://javaserverfaces.java.net 获取最新的 Mojarra 2.2(当前为 2.2.11)。之后,您可以将 taglib URI 中的域从 java.sun.com 更改为 xmlns.jcp.org

    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:f="http://xmlns.jcp.org/jsf/core"
        xmlns:h="http://xmlns.jcp.org/jsf/html"
        xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
    

    【讨论】:

    • 谢谢@Balus C 这样一个愚蠢的错误。但我想问你一个问题,我们不能这样改变xmlns:yash="http://java.sun.com/jsf/core" xmlns:gui="http://java.sun.com/jsf/facelets" 这样的前缀吗?
    • 当然可以。然后,您应该只使用 &lt;yash:param&gt; 等。对于其他尊重标准的 JSF 开发人员来说,它只会使代码变得不那么明显和自我记录(因此更难阅读/维护/解释/错误修复)。换句话说,在公共领域这样做是一种不尊重。如果你想赢得尊重,最好不要这样做:)
    • 和 'modern' EL,你可以做 ` 所以完全放松参数
    • @Kukeltje:服务器端 EL 方法参数和客户端 HTTP 请求参数具有完全不同的语义(a.o. 解析时刻和 HTTP 有效负载中的 ab/存在),通常不会盲目地互换。所以这应该小心和理解。
    • @BalusC:如果打算将它们实际用作请求参数,我同意也在 URL 中,但由于问题的性质,我怀疑这是有意的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2016-08-10
    相关资源
    最近更新 更多