表单提交和通过URL传递参数

时间:2011-12-06 02:41:49

标签: jsp jsf

我有一个窗口,用户可以搜索数据库中的所有汽车并能够编辑汽车的详细信息,当用户点击给定汽车上的编辑按钮(下面的代码)时,调用以下JavaScript来打开新窗口:

  <!--EDIT BUTTON -->  
  <h:commandLink value=""
        onclick="return CarEditCrud(this);" title="Edit Car">
        <t:graphicImage rendered="true" value="/imgs/edit.gif"
            styleClass="edit" />
        <f:param value="#{car.carPK}" name="carCode" />
    </h:commandLink>

 <!--FUNCTION TO OPEN NEW WINDOW TO EDIT CAR DETAIL -->  
 function CarEditCrud(val) {   
 ....    
 window.open("EditCarCrud.faces?carPK=" + pk);
 }

所以新的窗口打开,网址为localhost:80/jsp/EditCarCrud.faces?carPK=" + pk(注意:PK会是一个像935533这样的数字) 在EditCarCrud Backbean的构造函数中,我执行以下操作来检索汽车的信息并填充字段:

Map requestMap = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
String code = (String) requestMap.get("carCode");

这一切都很好。问题是,当用户按提交时,Backbean具有Request范围,我丢失了所有信息(carCode),因此URL现在为localhost:80/jsp/EditCarCrud.faces

UPDATE:

此外,还有selectOneItem

  ....
  valueChangeListener="#{carEditCurd.countrycodechange}"
  onchange="submit()"

我有没有办法将carCode保存在URL中,就像最初使用URL中的PK打开窗口一样?

1 个答案:

答案 0 :(得分:3)

我假设你还在使用JSF 1.x。

您需要在<f:param>之后的后续表单中保留request参数:

<h:commandLink value="Submit" ...>
    <f:param name="carCode" value="#{param.carCode}" />
</h:commandLink>

这不会在URL中结束,但它通常以POST请求参数的形式提供。顺便说一下,<managed-property>让JSF将任意请求参数设置为bean属性。

另一种方法是在表单中添加纯HTML <input type="hidden">,以便在同一表单中的onchange="submit()"下拉列表更改后也会提交:

<input type="hidden" name="carCode" value="<h:outputText value="#{param.carCode}" />" />

(是的,丑陋的<h:outputText>嵌套为值,只是为了防止可能的XSS攻击)

请注意,<h:inputHidden>不可用,因为当表单上的验证失败时,它会丢失其值。