程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如果h:form的enctype =“ multipart / form-data”,则h:commandButton不会触发动作大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如果h:form的enctype =“ multipart / form-data”,则h:commandButton不会触发动作?

开发过程中遇到如果h:form的enctype =“ multipart / form-data”,则h:commandButton不会触发动作的问题如何解决?下面主要结合日常开发的经验,给出你关于如果h:form的enctype =“ multipart / form-data”,则h:commandButton不会触发动作的解决方法建议,希望对你解决如果h:form的enctype =“ multipart / form-data”,则h:commandButton不会触发动作有所启发或帮助;

这里,

for (fileItem item : items) {
    if (!item.isFormFIEld()) {
        files.add(item);
    }
}

您将忽略所有表单字段,例如按钮本身。当继续这样的请求时,JsF将不知道按钮已被调用,因此根本不会排队任何操作。

您需要添加一个,else以将中的所有表单字段收集@H_902_5@map<String, String[]>起来,并使用来包装请求,该请求httpServletrequestWrapper在所有getParameterXxx()调用中均委托给该映射,最后使用已包装的请求继续过滤链。这样,JsF将发现按钮已被调用,然后排队执行适当的操作。

解决方法

JSF: 1.2

服务器: Weblogic

我正在尝试实现多个文件上传。由于需要支持IE7,因此无法使用HTML5输入文件。因此,我计划添加一个按钮,单击该按钮将在页面中添加一个输入文件。

首先,我开始使用ADF Faces工作。但这没有用。那表现出意想不到的方式。

我还尝试了Tomahawk的文件上传组件,但是问题在于该组件,从后端添加了新文件上传后,以前创建的文件上传字段为空。不是UploadedFile实例。但这不能满足我的要求。因为我需要显示文件上传器中的所有路径,直到单击最后一个“提交表单”按钮。

然后,我得到了Apache Commons Fileupload的帮助。

我已经使用纯JSP尝试了此操作,并安装了fileupload,效果很好。

但是我想用apches文件上传来用JSF来实现它,而当我试图这样做时,它开始引起问题。

jspx页面如下:

<?xml version='1.0' encoding='utf-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:h="http://java.sun.com/jsf/html">
  <jsp:output omit-xml-declaration="true" doctype-root-element="HTML"
              doctype-system="http://www.w3.org/TR/html4/loose.dtd"
              doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"/>
  <jsp:directive.page contentType="text/html;charset=utf-8"/>
  <f:view>
    <html>
      <head>
        <meta http-equiv="Content-Type"
              content="text/html; charset=utf-8"/>
        <title>home</title>
      </head>
      <body>
        <h:form enctype="multipart/form-data">
            <input type="file" name="file"/>
            <h:commandButton value="Upload" action="#{uploadBean.uploaD}" />
        </h:form>
      </body>
    </html>
  </f:view>
</jsp:root>

我创建了一个过滤器,因为无法从action事件中获取正确的多部分请求。

web.xml是:

<?xml version = '1.0' encoding = 'windows-1252'?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLscheR_887_11845@a-instance"
         xsi:scheR_887_11845@aLOCATIOn="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
  <context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
  </context-param>
  <filter>
    <filter-name>UploadFilter</filter-name>
    <filter-class>com.edfx.massupload.filter.UploadFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>UploadFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
  </filter-mapping>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>/home.jspx</welcome-file>
  </welcome-file-list>
</web-app>

UploadFilter:

import java.io.IOException;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.Servletrequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.httpServletrequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


public class UploadFilter implements Filter {
    private FilterConfig _filterConfig = null;

    public void init(FilterConfig filterConfig) throws ServletException {
        _filterConfig = filterConfig;
    }

    public void destroy() {
        _filterConfig = null;
    }

    public void doFilter(Servletrequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException {
        System.out.println("Filter");
        if (!(request instanceof httpServletrequest)) {
            chain.doFilter(request,responsE);
            return;
        }

        httpServletrequest httprequest = (httpServletrequest)request;

        Boolean isMultipartContent = ServletFileUpload.isMultipartContent(httprequest);

        if (!isMultipartContent) {
            chain.doFilter(request,responsE);
            return;
        }

        long maxFileSize = (1024 * 1024 * 1024);
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setHeaderEncoding("UTF-8");
        upload.setSizeMax(maxFileSizE);
        upload.setFileSizeMax(maxFileSizE);

        try {
            List<FileItem> items = upload.parserequest(httprequest);
            System.out.println(items.size());
            List<FileItem> files = new ArrayList<FileItem>();            
            for (FileItem item : items) {
                if (!item.isFormField()) {
                    files.add(item);
                }
            }

            httprequest.setAttribute("files",files);
        } catch (FileUploadException eX) {
            ex.printStackTrace();
        }

        chain.doFilter(request,responsE);
    }
}

最后是托管bean:

import javax.faces.context.FacesContext;

import javax.servlet.http.httpServletrequest;

public class UploadBean {
    public UploadBean() {
        super();
    }

    public String upload() {
        System.out.println("====Jym");
        httpServletrequest httprequest = (httpServletrequest)FacesContext.getCurrenTinstance().getExternalContext().getrequest();
        System.out.println(httprequest.getAttribute("files"));
        return "";
    }
}

我的目标是通过JavaScript或jQuery动态添加输入文件字段,在JSP中效果很好,我想在JSF中获得它。

如果我enctype="multipart/form-data"从中删除,h:form则该action方法正在执行,否则不会执行。

任何建议对我都会很有帮助。

大佬总结

以上是大佬教程为你收集整理的如果h:form的enctype =“ multipart / form-data”,则h:commandButton不会触发动作全部内容,希望文章能够帮你解决如果h:form的enctype =“ multipart / form-data”,则h:commandButton不会触发动作所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。