java.lang.UnsupportedOperationException:无法设置ServletRequest参数

时间:2012-12-27 05:37:00

标签: jsf jsf-1.2 http-request-parameters

我正在开发一个JSF 1.1项目。

JSP:

<h:column>
        <f:facet name="header"> <h:outputText value="Edit" />     </f:facet>

        <h:commandLink rendered="#{(Table1_var.status == 'CONFIRMED') or (Table1_var.status == 'CHECKED_IN')}"
            action="#{Table1_var.onEditReservation}">
            <h:graphicImage id="view-details-link" alt="Drill Down on the Dynamic Link!"
                    url="images/editReservationSmall.png" styleClass="view-details-img"/>
           <f:param
                name="VastuId"
                value="#{Table1_var.id}" />                 
        </h:commandLink>

        <f:facet name="footer"><h:outputText value="Edit" /> </f:facet>                
    </h:column>

<f:param>中,VastuId参数已分配给id。由于var=Table1_var,我不知道它与类的映射位置。但是我通过手动搜索它得到了类/方法,其值可以来自:

public void navReservationDetail(final ActionEvent e) {
    Calendar cal1 = Calendar.getInstance();
    String rowId = FacesHelper.getRequestParameter("VastuId");
    System.out.println("ID :"+rowId);
}

FacesHelper.getRequestParameter

public static String getRequestParameter(String parameter) {
    return (String) FacesContext.getCurrentInstance().getExternalContext()
            .getRequestParameterMap().get(parameter);
}

我想在不使用UI的情况下通过Java手动设置该参数。我试过用这个:

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().put("#{VastuId}", reservationBean.getParentReservationProperty());              
String rowId = FacesHelper.getRequestParameter("VastuId");
System.out.println("selectedVastuId = "+rowId);

它在getRequestParameterMap().put()

处抛出异常
java.lang.UnsupportedOperationException: Cannot set ServletRequest Parameter
at org.apache.myfaces.context.servlet.RequestParameterMap.setAttribute
(RequestParameterMap.java:44)
at org.apache.myfaces.context.servlet.AbstractAttributeMap.put(AbstractAttributeMap.java:104)

这是如何引起的?如何解决?

1 个答案:

答案 0 :(得分:3)

parameter map是只读的。在servlet环境中,此数据结构表示URL的查询部分中的值(例如http://foo/bar?queryValue=queryKey。)服务器只能通过向浏览器发出重定向调用来更改这些值。

基本JSF 1.1 / 1.2实现中可用的每用户读/写范围是requestsession

将数据放入范围时,您应该使用文字名称而不是EL表达式:

FacesContext.getCurrentInstance()
            .getExternalContext()
            .getRequestMap()
            .put("VastuId", reservationBean.getParentReservationProperty()); 

然后可以使用表达式#{VastuId}#{requestScope.VastuId}在视图中解析此值。