文件上传-使用JSF将参数传递给dropzone保存方法



我已经写了关于如何使用dropzone.js与JSF的问题(使用dropzone与JSF),它是由BalusC正确回答。

然而,我想传递一个参数到save()方法,我不能这样做。我有一个类似于这样的页面dropzone组件:http://localhost: 8080/应用程序/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而失败。

有解决这个问题的方法吗?

GET请求参数可以使用<f:viewParam>设置为bean属性。

<f:metadata>
    <f:viewParam name="albumId" value="#{bean.albumId}" />
</f:metadata>

如果您使用的是@ViewScoped bean,那么这将在同一视图上的所有JSF POST表单提交(回发)中被记住。如果你使用的是@RequestScoped bean,那么bean属性可以在使用<h:inputHidden>的回发中保留。

<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属性。不需要手动修改旧式JSF 1的getRequestParameterMap()。x。

参见:

  • 什么可以和& lt; f: viewAction>被用于?
  • 如何在验证失败后回发保留f:viewParam值
  • 如何选择合适的bean scope?

相关内容

  • 没有找到相关文章

最新更新