JSF将params传递给另一个视图

时间:2015-01-28 10:51:44

标签: jsf parameters

我有一个页面,其中有一个表格,其中包含指向编辑项目页面的链接

<h:dataTable rendered="#{cc.attrs.data.size() ne 0}" border="1" value="#{cc.attrs.data}" var="req">
        <h:column>
            <f:facet name="header">Тема</f:facet>
            <h:link outcome="/pages/request" value="#{req.topic}">
                <f:param name="reqId" value="#{req.id}"/>
            </h:link>
        </h:column>
...

编辑页面:

<f:metadata>
        <f:viewParam name="reqId" value="#{requests.currentRequest}" converter="#{reqParamConverter}"/>
    </f:metadata>
    <center>
        <h:panelGroup id="requestContent" style="text-align: left;display:block;max-width:450px;">
            <h:outputText value="Автор: #{requests.currentRequest.customer.email}"/><br/>
... other fields

我的转换器是:

@Named("reqParamConverter")
@RequestScoped
public class RequestParamConverter implements Converter{

@Inject
private RequestBoundary boundary;

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    ... //null checks
    Long id=Long.valueOf(value);
    Request request= boundary.getRequest(id);
    return request;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
   ... // null checks
    Long id = ((Request) value).getId();
    String result= (id!=null)? String.valueOf(id):null;
    return result;
}
}

和支持bean:

@ManagedBean(name = "requests")
@RequestScoped
public class Requests {
private Request currentRequest;
... getters setters

问题是currentRequest为空,在方法getAsString的转换器中,Object value参数为null; 因此,在页面上编辑所有字段都是空的 我没有看到那里有什么问题,我也试过@FacesConverter但是当我从BalusC文章中读到时,我不能使用@Inject

UPD:我通过为currentRequest字段添加getter方法来解决这个问题: 检查currentRequest是否为null然后我从请求URL获取参数(因为url仍然有?reqId = ..参数)然后从边界获取请求:

public Request getCurrentRequest() {
    if(currentRequest==null) {
       String param=FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("reqId");
       if(param!=null && !param.isEmpty()){
       Long id=Long.valueOf(param);
       currentRequest=boundary.getRequest(id);
       }
       else {
           System.out.println("Request parameter is null");
       }
    }
    return currentRequest;
}

但我不认为getter中的逻辑是个好主意:o

0 个答案:

没有答案