f:setPropertyActionListener设置空值而不是预期值

时间:2011-11-14 01:34:27

标签: jsf jsf-2

我的观点是:

<h:commandLink value="BookFlight" action="#{bookSeatController.doLoginOrCC}">
   <f:setPropertyActionListener target="#{bookSeatController.flightNumber}" 
                  value="#{flightInfoController.flight.number}" />
</h:commandLink>

我的二传手是:

public void setFlightNumber(String flightNumber) {
   this.flightNumber = flightNumber;
}

当我使用调试器时,我在setter中得到flightNumber null。但是,如果我将视图更改为以下内容:

<h:commandLink value="BookFlight" action="#{bookSeatController.doLoginOrCC}">
   <f:setPropertyActionListener target="#{bookSeatController.flightNumber}" 
                  value="122334" />
</h:commandLink>

flightNumber属性设置为122334.这是如何导致的,如何设置目标值而不是null

2 个答案:

答案 0 :(得分:7)

如果#{flightInfoController.flight.number}是请求作用域,则在处理表单提交请求期间,它必须保留与显示表单请求期间完全相同的flight。这必须发生在bean的(post)构造函数中。

如果这不是一个选项,因为它取决于一些基于请求的变量,那么你最好的办法就是将bean放在视图范围内(但我仍然认为你的bean设计得恰到好处而且不做在getter中的任何业务/预加载工作。)

如果将bean放在视图范围中而不是一个选项,那么您需要将其作为一个完整的请求参数传递。你可以<f:param>

来做到这一点
<h:commandLink value="BookFlight" action="#{bookSeatController.doLoginOrCC}">
   <f:param name="flightNumber" value="#{flightInfoController.flight.number}" />
</h:commandLink>

您可以让JSF在@ManagedProperty中按BookSeatController或在当前视图中按<f:viewParam>进行设置。

另见:

答案 1 :(得分:0)

如果它在分配“122334”时有效但在分配flightInfoController.flight.number时它是“空”并且由于您没有收到任何异常,那么这意味着您的flightInfoController可能未正确初始化(关于它的字段) flight中的numberflight。{/ p>

确保bean已正确初始化(或使用bean代码更新您的OP)。