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

Pass a parameter to dropzone save method using JSF

我已经写了关于如何使用 dropzone.js 和 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 而失败。

有什么解决方法吗?

GET请求参数可以设置为bean 属性 using <f:viewParam>.

<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>

只有当表单出现 conversion/validation 错误时,这才会正常工作。如果你在同一个表格上使用 conversion/validation,那么最好使用普通的 HTML <input type="hidden">.

<h:form ...>
    <input type="hidden" name="albumId" value="#{bean.albumId}" />
    ...
</h:form>

<f:viewParam> 将注意正确设置 bean 属性。无需使用 getRequestParameterMap() 老式的 JSF 1.x 方式手动 fiddle。

另请参阅:

  • What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?
  • How to retain f:viewParam values after postback with validation failed
  • How to choose the right bean scope?