【问题标题】:Pass a parameter to dropzone save method using JSF使用 JSF 将参数传递给 dropzone 保存方法
【发布时间】:2016-06-25 18:06:29
【问题描述】:

我已经写了关于如何在 JSF (Use dropzone with JSF) 中使用 dropzone.js 的问题,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() 方法被调用了 3 次,第一次的值为 1,另外两次的值为 null,因此它因 NullPointerException 而失败。

有什么解决方法吗?

【问题讨论】:

  • 对不起,我不知道该怎么做。

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


【解决方案1】:

可以使用&lt;f:viewParam&gt;将GET请求参数设置为bean属性。

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

如果您使用的是@ViewScoped bean,那么在同一视图上的所有 JSF POST 表单提交(回发)中都会记住这一点。但是,如果您使用的是 @RequestScoped bean,则可以使用 &lt;h:inputHidden&gt; 跨回发保留 bean 属性。

<h:form ...>
    <h:inputHidden value="#{bean.albumId}" />
    ...
</h:form>

这仅在表单上出现转换/验证失败时无法正常工作。如果您在同一个表单上使用转换/验证,那么最好使用纯 HTML &lt;input type="hidden"&gt;

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

&lt;f:viewParam&gt; 将负责正确设置 bean 属性。无需手动摆弄 getRequestParameterMap() 老式 JSF 1.x 方式。

另见:

【讨论】:

    猜你喜欢
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多