Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF 2.0中的文件上载自定义组件中没有调用Ajax loader_Ajax_Jsf 2_Custom Component - Fatal编程技术网

JSF 2.0中的文件上载自定义组件中没有调用Ajax loader

JSF 2.0中的文件上载自定义组件中没有调用Ajax loader,ajax,jsf-2,custom-component,Ajax,Jsf 2,Custom Component,在我当前的项目中,我试图创建一个文件上传自定义组件,因为我们有一个约束,即我们不能使用任何组件库。我们的要求是创建单个文件上载,选择并上载文件后,它将显示在该组件下方的数据表中。用户将能够下载上传的文件,如果需要,还可以删除上传的文件。将有一个ajax加载程序需要在上传文件时启动。从图形上看,UI如下所示 ________________________ __________ ____________ | | | Browse | | Uploa

在我当前的项目中,我试图创建一个文件上传自定义组件,因为我们有一个约束,即我们不能使用任何组件库。我们的要求是创建单个文件上载,选择并上载文件后,它将显示在该组件下方的数据表中。用户将能够下载上传的文件,如果需要,还可以删除上传的文件。将有一个ajax加载程序需要在上传文件时启动。从图形上看,UI如下所示

 ________________________ __________  ____________
|                       | | Browse  | | Upload    |
|_______________________| |_________| |___________|

______________________________________________
|                                      |      |
|  File1.pdf                            |  *  |
|_______________________________________|_____|
|                                       |     |
|   File2.pdf                           |  *  |
|_______________________________________|_____|
为了创建这个组件,我从CoreJavaServerPages(3e)中获得了创建自定义组件的帮助&BalusC的博客可以从jsf页面(jsf.ajax.addOnEvent)触发ajax调用。下面是渲染器、xhtml和managedbean的完整代码。目前,我使用h:outputtext而不是h:datatable来更新页面

     <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:corejsf="http://corejsf.com">
     <h:head>
    <title>A file upload test</title>
        <h:outputScript name="jsf.js" library="javax.faces" target="head"/>
        <script>
             jsf.ajax.addOnEvent(function(data) {
                var ajaxstatus = data.status; 
                var ajaxloader = document.getElementById("ajaxloader");

                switch (ajaxstatus) {
                case "begin": // This is called right before ajax request is been sent.
                    ajaxloader.style.display = 'block';
                    break;

                case "complete":
                    ajaxloader.style.display = 'none';
                    break;

                case "success":                 // NOOP.
                     break;
             } });
    </script>
      </h:head>
      <h:body>
       <h:form>
            <h:commandButton value="hello"></h:commandButton>
       </h:form>
        <h:form enctype="multipart/form-data">
              Upload a photo of yourself: 
              <corejsf:upload uploadButton="upload"/>
              <h:outputText id="updateText" value="#{user.value}"></h:outputText>
            <h:commandButton action="#{user.submit}" value="Initiate"></h:commandButton>
             </h:form>
                <img id="ajaxloader" src="ajax-loader.gif" style="display: none;" />
        </h:body>
     </html>

文件上传测试
addOnEvent(函数(数据){
var ajaxstatus=data.status;
var ajaxloader=document.getElementById(“ajaxloader”);
开关(AJAX状态){
case“begin”://这是在发送ajax请求之前调用的。
ajaxloader.style.display='block';
打破
案例“完成”:
ajaxloader.style.display='none';
打破
案例“成功”://NOOP。
打破
} });
上传你自己的照片:
渲染器:

  package com.corejsf;

  import java.io.File;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.UnsupportedEncodingException;
  import java.util.Map;

  import javax.el.ELContext;
  import javax.el.ValueExpression;
  import javax.faces.FacesException;
  import javax.faces.application.ResourceDependencies;
  import javax.faces.application.ResourceDependency;
  import javax.faces.component.EditableValueHolder;
  import javax.faces.component.UIComponent;
  import javax.faces.component.UIForm;
  import javax.faces.context.ExternalContext;
  import javax.faces.context.FacesContext;
  import javax.faces.context.ResponseWriter;
  import javax.faces.render.FacesRenderer;
  import javax.faces.render.Renderer;
  import javax.servlet.ServletContext;
  import javax.servlet.http.HttpServletRequest;
  import org.apache.commons.fileupload.FileItem;

  @FacesRenderer(componentFamily="javax.faces.Input",
      rendererType="com.corejsf.Upload")
   public class UploadRenderer extends Renderer {
        public void encodeBegin(FacesContext context, UIComponent component)  
            throws IOException {
         if (!component.isRendered()) return;
         ResponseWriter writer = context.getResponseWriter();
         String ajax = "jsf.ajax.request(this, event,{render:'j_idt11:updateText'}); return false";
         String clientId = component.getClientId(context);
         System.out.println("parentid>>>>>>"+component.getParent().getClientId(context));
         System.out.println(clientId);
         System.out.println("upload button >>>>>>"+(String)component.getAttributes().get("uploadButton"));
          writer.startElement("input", component);
         writer.writeAttribute("type", "file", "type");
         writer.writeAttribute("name", clientId+":INPUT_FILE", "clientId");
         writer.endElement("input");
         writer.startElement("input", component);
         writer.writeAttribute("type", "submit", null);
         writer.writeAttribute("name", clientId + ":FILE_UPLOAD", null);
         writer.writeAttribute("value", "Upload", "value");
         writer.writeAttribute("onclick", ajax, null);
         writer.endElement("input");
         writer.flush();
    }

    public void decode(FacesContext context, UIComponent component) {



   Map<String,String> requestMap = context.getExternalContext ().getRequestParameterMap();
   String clientId = component.getClientId(context);
   System.out.println("getId>>>>>>>"+component.getId());
   if(requestMap.containsKey(clientId+":FILE_UPLOAD")){

       try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
       System.out.println("true");
       ExternalContext external = context.getExternalContext();
       HttpServletRequest request = (HttpServletRequest) external.getRequest();
       //String clientIdFile = component.getClientId(context);
       FileItem item = (FileItem) request.getAttribute(clientId+":INPUT_FILE");
       System.out.println("filename>>>>"+item.getName()+">>>");
       System.out.println("file blank>>>>"+item.getName().equals(""));
       ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        UserBean userBean = (UserBean) FacesContext.getCurrentInstance().getApplication()
        .getELResolver().getValue(elContext, null, "user");
        try {
            userBean.setUploadedFile(item.getInputStream());
            userBean.setValue(userBean.getUploadedFileList().size());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
   }
   else
       System.out.println("false");
     }   
  }
package com.corejsf;
导入java.io.File;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.UnsupportedEncodingException;
导入java.util.Map;
导入javax.el.ELContext;
导入javax.el.ValueExpression;
导入javax.faces.FacesException;
导入javax.faces.application.ResourceDependencies;
导入javax.faces.application.ResourceDependency;
导入javax.faces.component.EditableValueHolder;
导入javax.faces.component.UIComponent;
导入javax.faces.component.UIForm;
导入javax.faces.context.ExternalContext;
导入javax.faces.context.FacesContext;
导入javax.faces.context.ResponseWriter;
导入javax.faces.render.facesrender;
导入javax.faces.render.Renderer;
导入javax.servlet.ServletContext;
导入javax.servlet.http.HttpServletRequest;
导入org.apache.commons.fileupload.FileItem;
@facesrender(componentFamily=“javax.faces.Input”,
RenderType=“com.corejsf.Upload”)
公共类上载渲染器扩展渲染器{
public void encodeBegin(FacesContext上下文,UIComponent)
抛出IOException{
如果(!component.isRendered())返回;
ResponseWriter=context.getResponseWriter();
String ajax=“jsf.ajax.request(这个事件,{render:'j_idt11:updateText'});返回false”;
字符串clientId=component.getClientId(上下文);
System.out.println(“parentid>>>>>”+component.getParent().getClientId(上下文));
System.out.println(clientId);
System.out.println(“上传按钮>>>>>>”+(字符串)组件.getAttributes().get(“上传按钮”);
startElement(“输入”,组件);
writeAttribute(“类型”、“文件”、“类型”);
writeAttribute(“name”,clientId+”:INPUT_FILE,“clientId”);
编写器。输入(“输入”);
startElement(“输入”,组件);
writer.writeAttribute(“type”、“submit”、null);
writer.writeAttribute(“name”,clientId+”:FILE\u UPLOAD,null);
writeAttribute(“值”、“上传”、“值”);
writeAttribute(“onclick”,ajax,null);
编写器。输入(“输入”);
writer.flush();
}
公共无效解码(FacesContext上下文,UIComponent){
Map requestMap=context.getExternalContext().getRequestParameterMap();
字符串clientId=component.getClientId(上下文);
System.out.println(“getId>>>>>>”+component.getId());
if(requestMap.containsKey(clientId+“:文件上传”)){
试一试{
睡眠(4000);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
System.out.println(“真”);
ExternalContext external=context.getExternalContext();
HttpServletRequest=(HttpServletRequest)external.getRequest();
//字符串clientIdFile=component.getClientId(上下文);
FileItem=(FileItem)request.getAttribute(clientId+“:INPUT_FILE”);
System.out.println(“文件名>>>”+item.getName()+“>>>”);
System.out.println(“文件空白>>>>”+item.getName().equals(“”);
ELContext ELContext=FacesContext.getCurrentInstance().getELContext();
UserBean UserBean=(UserBean)FacesContext.getCurrentInstance().getApplication()
.getELResolver().getValue(elContext,null,“用户”);
试一试{
setUploadedFile(item.getInputStream());
setValue(userBean.getUploadedFileList().size());
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
其他的
System.out.println(“假”);
}   
}
托管bean:

  package com.corejsf;

  import java.io.Serializable;

  import javax.el.ELContext;
  import javax.faces.bean.ManagedBean; 
  //import javax.faces.bean.SessionScoped;
  import javax.faces.bean.ViewScoped;
  import javax.faces.context.FacesContext;
  import javax.faces.event.ActionEvent;
  import javax.faces.event.AjaxBehaviorEvent;

  import java.io.InputStream;
  import java.util.ArrayList;

  @ManagedBean(name="user")
  @ViewScoped
  public class UserBean implements Serializable {

private static final long serialVersionUID = 1L;
private String id;
private ArrayList<InputStream> uploadedFileList = new ArrayList<InputStream>();

public ArrayList<InputStream> getUploadedFileList() {
    return uploadedFileList;
}
public void setUploadedFileList(ArrayList<InputStream> uploadedFileList) {
    this.uploadedFileList = uploadedFileList;
}
private int value = 0;

public int getValue() {
    return value;
}
public void setValue(int value) {
    this.value = value;
}
public String getId() { return id; }
public void setId(String newValue) { id = newValue; }

public void setUploadedFile(InputStream inputStream){
    uploadedFileList.add(inputStream);
}
  }
package com.corejsf;
导入java.io.Serializable;
导入javax.el.ELContext;
导入javax.faces.bean.ManagedBean;
//导入javax.faces.bean.SessionScoped;
导入javax.faces.bean.ViewScoped;
导入javax.faces.context.FacesContext;
导入javax.faces.event.ActionEvent;
导入javax.faces.event.AjaxBehaviorEvent;
导入java.io.InputStream;
导入java.util.ArrayList;
@ManagedBean(name=“user”)
@视域
公共课
   package com.corejsf;

   import java.io.File;
   import java.io.IOException;
   import java.util.Collections;
   import java.util.Enumeration;
   import java.util.HashMap;
   import java.util.List;
   import java.util.Map;
   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 javax.servlet.http.HttpServletRequestWrapper;
   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 int sizeThreshold = -1;
        private String repositoryPath;

        public void init(FilterConfig config) throws ServletException {
           repositoryPath = config.getInitParameter(
              "com.corejsf.UploadFilter.repositoryPath");
           try {
           String paramValue = config.getInitParameter(
               "com.corejsf.UploadFilter.sizeThreshold");
           if (paramValue != null) 
               sizeThreshold = Integer.parseInt(paramValue);
           }
           catch (NumberFormatException ex) {
               ServletException servletEx = new ServletException();
               servletEx.initCause(ex);
               throw servletEx;
           }
        }

         public void destroy() {
         }

 public void doFilter(ServletRequest request, 
  ServletResponse response, FilterChain chain) 
  throws IOException, ServletException {

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

  DiskFileItemFactory factory = new DiskFileItemFactory();
  if (sizeThreshold >= 0)
     factory.setSizeThreshold(sizeThreshold);
  if (repositoryPath != null) 
     factory.setRepository(new File(repositoryPath));
  ServletFileUpload upload = new ServletFileUpload(factory);

  try {
     @SuppressWarnings("unchecked") List<FileItem> items 
        = (List<FileItem>) upload.parseRequest(httpRequest);
     final Map<String, String[]> map = new HashMap<String, String[]>();
     for (FileItem item : items) {
        String str = item.getString();
        if (item.isFormField())
           map.put(item.getFieldName(), new String[] { str });
        else
           httpRequest.setAttribute(item.getFieldName(), item);
     }

     chain.doFilter(new 
        HttpServletRequestWrapper(httpRequest) {
           public Map<String, String[]> getParameterMap() {
              return map;
           }                   
           // busywork follows ... should have been part of the wrapper
           public String[] getParameterValues(String name) {
              Map<String, String[]> map = getParameterMap();
              return (String[]) map.get(name);
           }
           public String getParameter(String name) {
              String[] params = getParameterValues(name);
              if (params == null) return null;
              return params[0];
           }
           public Enumeration<String> getParameterNames() {
              Map<String, String[]> map = getParameterMap();
              return Collections.enumeration(map.keySet());
           }
        }, response);
  } catch (FileUploadException ex) {
     ServletException servletEx = new ServletException();
     servletEx.initCause(ex);
     throw servletEx;
  }      
 }   
}
<facelet-taglib version="2.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee">
    <namespace>http://corejsf.com</namespace>
    <tag>
       <tag-name>upload</tag-name>
       <component>
           <component-type>javax.faces.Input</component-type>
           <renderer-type>com.corejsf.Upload</renderer-type>
       </component>
    </tag>
 </facelet-taglib>
<h:outputScript name="jsf.js" library="javax.faces" target="head"/>