我有一个窗口,用户可以搜索数据库中的所有汽车并能够编辑汽车的详细信息,当用户点击给定汽车上的编辑按钮(下面的代码)时,调用以下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
。
此外,还有selectOneItem
....
valueChangeListener="#{carEditCurd.countrycodechange}"
onchange="submit()"
我有没有办法将carCode保存在URL中,就像最初使用URL中的PK打开窗口一样?
答案 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>
不可用,因为当表单上的验证失败时,它会丢失其值。