使用JSF将参数传递给dropzone save方法

时间:2016-06-25 18:06:30

标签: jsf file-upload parameter-passing dropzone.js

我已经写过关于如何将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而失败。

对此有任何解决方法吗?

1 个答案:

答案 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方式。

另见: