我已经写过关于如何将dropzone.js与JSF(Use dropzone with JSF)一起使用的问题,而BalusC正确地回答了这个问题。
但是我想将参数传递给save()方法,我无法做到。我在页面中有dropzone组件,类似于: http://localhost:8080/application/image-album.xhtml?albumId=1
在那个页面中我有:
<h:form id="uploadForm" enctype="multipart/form-data" styleClass="dropzone">
<div class="fallback">
<h:inputFile id="file" value="#{uploadImageController.part}"/>
<h:commandButton id="submit" value="submit" />
</div>
</h:form>
在UploadImageController中我有:
@PostConstruct
public void init() {
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
albumId = Long.valueOf(externalContext.getRequestParameterMap().get("albumId"));
}
所以理论上我可以在save()方法中使用albumId。但是,init()方法被调用三次,第一次使用值1,另外两个使用值null,因此它会因NullPointerException而失败。
对此有任何解决方法吗?
答案 0 :(得分:2)
可以使用<f:viewParam>
将GET请求参数设置为bean属性。
<f:metadata>
<f:viewParam name="albumId" value="#{bean.albumId}" />
</f:metadata>
如果您正在使用@ViewScoped
bean,那么将在同一视图上的所有JSF POST表单提交(回发)中记住这一点。但是,如果您正在使用@RequestScoped
bean,则可以使用<h:inputHidden>
在回发中保留bean属性。
<h:form ...>
<h:inputHidden value="#{bean.albumId}" />
...
</h:form>
当表单上的转换/验证失败时,这只能正常工作。如果您在同一表单上使用转换/验证,那么最好使用纯HTML <input type="hidden">
。
<h:form ...>
<input type="hidden" name="albumId" value="#{bean.albumId}" />
...
</h:form>
<f:viewParam>
将注意正确设置bean属性。没有必要手动摆弄getRequestParameterMap()
旧式的JSF 1.x方式。