【问题标题】:JSF - Passing Parameters to a view on click of Button [duplicate]JSF - 单击按钮将参数传递给视图[重复]
【发布时间】:2017-06-04 08:44:16
【问题描述】:

我正在使用 JSF 2.0 并且有一个简单的 TestButton.xhtml,如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"     
 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
  xmlns:ui="http://java.sun.com/jsf/facelets" 
  xmlns:f="http://java.sun.com/jsf/core" 
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:a4j="http://richfaces.org/a4j"
  xmlns:rich="http://richfaces.org/rich">

<h:body>
<h:form>
        <h:inputText value="#{employee.empName}"/><br/>
        <h:commandButton value="Derive" action="EmployeeTest2" >
            <f:param name="Name" value="#{employee.empName}"/>
        </h:commandButton>  
</h:form>
</h:body>
</ui:composition>

还有一个视图范围的托管 bean。

@ManagedBean(name="employee", eager=true)
@ViewScoped
public class Employee implements Serializable{

String empName;
String selectedEmployeeName;


public String getSelectedEmployeeName() {
    return selectedEmployeeName;
}
public void setSelectedEmployeeName(String selectedEmployeeName) {
    this.selectedEmployeeName = selectedEmployeeName;
}

public Employee() {
    super();
}

public String getEmpName() {
    return empName;
}
public void setEmpName(String empName) {
    this.empName = empName;
}
public void manipulate(){
    System.out.println("Manipulate called...");
    System.out.println(selectedEmployeeName);
    this.selectedEmployeeName = this.selectedEmployeeName + " Jr.";
}

现在单击按钮,我导航到 EmployeeTest2.xhtml,其中包含以下代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"  
 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
  xmlns:ui="http://java.sun.com/jsf/facelets" 
  xmlns:f="http://java.sun.com/jsf/core" 
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:a4j="http://richfaces.org/a4j"
  xmlns:rich="http://richfaces.org/rich">

<f:view>
    <f:metadata>
        <f:viewParam name="Name" value="#{employee.selectedEmployeeName}"/>
        <f:event type="preRenderView" listener="#{employee.manipulate}"/>
    </f:metadata>
</f:view>

<h:body>
        <h:inputText value="#{employee.selectedEmployeeName}"/>
</h:body>   
</ui:composition>

我正确导航到 EmployeeTest2.xhtml,但我的参数值为 null。我可以看到操作方法被调用(打印系统输出)但 selectedEmployeeName 为空。

请告知我缺少什么。

我已经提到了下面的线程并且做了同样的事情但没有帮助。

https://stackoverflow.com/questions/20880027/passing-parameters-to-a-view-scoped bean-in-jsf

更新 1: 更改

  <h:inputText value="Chris"/>

&lt;h:inputText value="#{employee.empName}"/&gt;

在 selectedEmployee 的 setter 方法处设置断点。 Setter 没有被调用,这意味着参数传递不起作用。

更新 2 请查看更新后的 testButton.xhtml

?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"    
  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
  xmlns:ui="http://java.sun.com/jsf/facelets" 
  xmlns:f="http://java.sun.com/jsf/core" 
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:a4j="http://richfaces.org/a4j"
  xmlns:rich="http://richfaces.org/rich">

<h:body>
<h:form>
        <h:inputText name = "Name" value="#{employee.empName}"/><br/>
        <h:commandButton value="Submit" action="EmployeeTest2" >
            <f:param name="Name" value="#{employee.empName}"/>
        </h:commandButton>  
</h:form>
</h:body>
</ui:composition>

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    代码看起来是正确的,在我看来,您将 null 发送到下一页,因为 employee.empName 的值实际上是 null。

    我会在加载 TestButton.xhtml 时调试 getEmpName() 方法,然后在您单击按钮并转到下一页后检查 url 中是否存在参数。

    更新

    好的,参数实际上是输入的值。在这种情况下,将名称添加到其定义中。您的表单应如下所示:

    <h:inputText name="Name" value="#{employee.empName}"/><br/>
    <h:commandButton value="Derive" action="EmployeeTest2" />
    

    更新 2

    这是一种解决方法,但您也可以试试这个:

    @PostConstruct
          public void postConstruct(){
    
          Map<String,String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
          setSelectedEmployeeName(params.get("Name"));
    }
    

    【讨论】:

    • 请看更新1
    • 请查看我更新的帖子
    • @Maciej Kowalski:做了同样的事,但没有帮助。仍然显示为空。请参阅更新 2
    • 好的,这个方法被调用了吗? listener="#{employee.manipulate}
    • 是的,它被调用了。
    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    相关资源
    最近更新 更多