JSF - 单击Button时将参数传递给视图

时间:2017-01-19 15:18:04

标签: jsf jsf-2

我使用的是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。我可以看到调用操作方法(sysouts得到打印)但selectedEmployeeName为null。

请告知我缺少的是什么。

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

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

更新1:已更改

  <h:inputText value="Chris"/>

要       <h:inputText value="#{employee.empName}"/>

在selectEmployee的setter方法上放置一个断点。 Setter没有被调用,这意味着param传递不起作用。

更新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>

1 个答案:

答案 0 :(得分:0)

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

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

<强>更新

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

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