【问题标题】:JSF managed upload bean?JSF托管上传bean?
【发布时间】:2025-12-06 10:00:01
【问题描述】:

我有一个适用于 servlet 的上传例程。现在我试图把这个例程放在这样的 jsf 托管 bean 中:

 public void uploadFile() throws IOException, ServletException{

    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();


    Part filePart = request.getPart("item");
    String filename = getFilename(filePart);
    InputStream filecontent = filePart.getInputStream();

    //persist the data here

}

当尝试在服务器上运行它时,当然会出现错误消息:“PWC4016: Request.getPart is called without multipart configuration.要么将@MultipartConfig添加到servlet,要么将multipart-config元素添加到web。 xml”

但是我不知道在哪里放置这个注释,我也没有我的托管 bean 的 jsf 生成的 servlet 的名称,所以我也不能把它放到 web.xml 中。 将此例程放入托管 bean 通常是一个坏主意,还是应该坚持使用 servlet 变体?

【问题讨论】:

    标签: jsf jakarta-ee upload multipart managed-bean


    【解决方案1】:

    @MultipartConfig 基本上需要放在FacesServlet 上。你不能自己做,但 the upcoming JSF 2.2 已经这样做了,并配有一个支持 ajax 的新标准 <h:inputFile> 组件,另请参阅 JSF spec issue 802

    在那之前,您最好的选择是获取 3rd 方组件库或自制自定义组件。

    【讨论】:

    • 目前我正在使用 JUpload Applet 上传文件,所以上传不是问题。而是目前似乎无法使用托管 bean 处理上传
    • 如果源不是 JSF 视图,那为什么还需要 JSF 模型呢?确实,只需使用一个简单的 servlet。即使使用 JSF 2.2 也不可能(很好)。
    • 因为我的 jsf 中有一个文件下载链接和一个提供文件下载的 managedbean(根据您在 link 的帖子),我认为将上传例程也放在一个好主意在这个豆子里。但我认为那是错误的决定,对吧?
    • 取决于 JSF 是否绝对强制提供文件。例如,您需要通过 JSF POST 请求而不是简单的 GET 请求来下载文件,因为您希望执行 JSF 验证等涉及一些输入字段。