f:param值使用commandButton和commandLink返回null

时间:2015-05-08 12:06:00

标签: jsf mojarra http-request-parameters

我在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>

Navigation.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只是用于导航我 提前致谢

1 个答案:

答案 0 :(得分:3)

仔细查看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:前缀。这基本上导致这些标签根本无法正确解释。它被误解为<ui:param>,其含义与真实<f:param>完全不同。

修复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">