2014-02-19 84 views
0

我想创建一个Log-File-Reader。我有一个上传字段和一个数据表。首先我选择日志文件并上传它。然后,程序将日志文件的每一行分割成单独的变量。现在日志文件应该是printet行,以便在表格中输入。但我不知道,我应该如何将线条放在桌子上。它的工作原理,当我定义行静态bevore。但是现在,当线条未定义为静态时,它不会更新表格。PrimeFaces向DataTable添加行

这里是我的index.xhtml:

<h:form xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head> 
    <title>LogReader</title> 
</h:head> 
<h:body> 
    <p:accordionPanel dynamic="true" cache="true" activeIndex="1" multiple="false"> 
     <p:tab title="Upload File"> 
      <h:panelGrid> 
       <p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}" mode="advanced" dragDropSupport="false" 
       update="messages" fileLimit="1" allowTypes="/(\.|\/)(log|txt|)$/" /> 

       <p:growl id="messages" showDetail="true"/> 
      </h:panelGrid> 
     </p:tab> 
    </p:accordionPanel> 

    <p:dataTable id="dataTable" var="log" value="#{fileUpload.logsSmall}" widgetVar="dataTable" 
       emptyMessage="No Log found with given criteria" filteredValue="#{tableBean.filteredLogs}" 
       rowKey="#{log.datetime}" paginator="true" rows="20" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15,20,50,100" selection="#{tableBean.selectedLog}" selectionMode="single"> 

    <f:facet name="header"> 
     <p:outputPanel> 
      <h:outputText value="Search all fields:" /> 
      <p:inputText id="globalFilter" onkeyup="dataTable.filter();" style="width:150px" /> 
     </p:outputPanel> 
    </f:facet> 

    <p:column id="datetimeColumn" filterBy="datetime" sortBy="datetime" 
      headerText="DateTime" footerText="" 
      filterMatchMode="contains"> 
     <h:outputText value="#{log.datetime}" /> 
    </p:column> 

    <p:column id="levelColumn" filterBy="level" 
      headerText="LogLevel" footerText="" 
      filterOptions="#{tableBean.levelOptions}" 
      filterMatchMode="exact" sortBy="level"> 
     <h:outputText value="#{log.level}" /> 
    </p:column> 

    <p:column id="categoryColumn" filterBy="category" sortBy="category" 
      headerText="Category" footerText="" 
      filterMatchMode="contains"> 
     <h:outputText value="#{log.category}" /> 
    </p:column> 

    <p:column id="messageColumn" filterBy="message" sortBy="message" 
      headerText="Message" footerText="" filterMatchMode="contains"> 
     <h:outputText value="#{log.message}" /> 
    </p:column> 
</p:dataTable> 
</h:body> 

这里我TableBean:

package com.rausch.logreader; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.UUID; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.faces.bean.ViewScoped; 
import javax.faces.model.SelectItem; 

import com.rausch.logreader.Log; 

@ViewScoped 
@ManagedBean(name = "tableBean") 
@SessionScoped 

public class TableBean implements Serializable { 

    private final static String[] level; 

    private SelectItem[] levelOptions; 

    private List<Log> filteredLogs; 

    private int i = 0; 

    private Log selectedLog; 

    private Log[] selectedLogs; 


    static { 
     level = new String[5]; 
     level[0] = "DEBUG"; 
     level[1] = "INFO"; 
     level[2] = "WARN"; 
     level[3] = "ERROR"; 
     level[4] = "FATAL"; 

    } 


    public TableBean() { 
     levelOptions = createLevelOptions(level); 
    } 

    public Log getSelectedLog() { 
     return selectedLog; 
    } 

    public void setSelectedLog(Log selectedLog) { 
     this.selectedLog = selectedLog; 
    } 

    public void listAdd(List<Log> list, String datetime, String level, String category, String message){ 
     list.add(new Log(datetime, level, category, message)); 
    } 


    public List<Log> getFilteredLogs() { 
     return filteredLogs; 
    } 

    public void setFilteredLogs(List<Log> filteredCars) { 
     this.filteredLogs = filteredCars; 
    } 

    private SelectItem[] createLevelOptions(String[] data) { 
     SelectItem[] options = new SelectItem[data.length + 1]; 

     options[0] = new SelectItem("", "Select"); 
     for(int i = 0; i < data.length; i++) { 
      options[i + 1] = new SelectItem(data[i], data[i]); 
     } 

     return options; 
    } 

    public SelectItem[] getLevelOptions() { 
     return levelOptions; 
    } 
} 

在这里,我FileUploadController:

import java.util.List; 
import javax.faces.application.FacesMessage; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.faces.bean.ViewScoped; 
import javax.faces.context.FacesContext; 

import org.primefaces.event.FileUploadEvent; 
import org.primefaces.model.UploadedFile; 

@ViewScoped 
@ManagedBean(name = "fileUploadController") 
@SessionScoped 

public class FileUploadController { 

    public List<Log> logsSmall; 
    public void handleFileUpload(FileUploadEvent event) { 

     FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded."); 
     FacesContext.getCurrentInstance().addMessage(null, msg); 

     try { 
      copyFile(event.getFile().getFileName(), event.getFile().getInputstream()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private String destination="C:\\Java\\"; 

    public void copyFile(String fileName, InputStream in) { 
     try {   
      // write the inputStream to a FileOutputStream 
      OutputStream out = new FileOutputStream(new File(destination + fileName)); 

      int read; 
      byte[] bytes = new byte[1024]; 

      while ((read = in.read(bytes)) != -1) { 
       out.write(bytes, 0, read); 
      } 

      in.close(); 
      out.flush(); 
      out.close(); 

      readFile(destination + fileName); 
     } catch (IOException e) { 
       System.out.println(e.getMessage()); 
     } 
    } 


    public void readFile(String filePath){ 
       try 
     { 
      String sCurrentLine; 


      BufferedReader br = new BufferedReader(new FileReader(filePath));   
      String output; 
      String datetime = ""; 
      String level = ""; 
      String category = ""; 
      String message; 

      TableBean table = new TableBean(); 

      while ((sCurrentLine = br.readLine()) != null) { 
       //System.out.println(sCurrentLine.charAt(4) + "" + sCurrentLine.charAt(7) + sCurrentLine.charAt(13) + "" +sCurrentLine.charAt(16)); 
       if(sCurrentLine.length()<1){     
       } 
       else{ 
        if (sCurrentLine.length() >= 16 && sCurrentLine.charAt(4)=='-' && sCurrentLine.charAt(7)=='-' && sCurrentLine.charAt(13)==':' && sCurrentLine.charAt(16)==':'){ 
         output = ""; 
         message = ""; 
         String[] leerzeichen = sCurrentLine.split(" "); 

         datetime = leerzeichen[0] + " " + leerzeichen[1]; 
         level = leerzeichen[2]; 
         category = leerzeichen[4]; 

         int arraylength = leerzeichen.length; 

         for (int l=5; l<arraylength; l++){ 
          message = message.concat(leerzeichen[l] + " "); 
         } 
         output = datetime + level + category + message; 
        } else { 
         message = sCurrentLine;  
         output = message; 
        } 
        logsSmall = new ArrayList<Log>(); 
        table.listAdd(logsSmall, datetime, level, category, message); 
        System.out.println(output); 
       } 

      } 


     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

对不起,我的英语不好。我尝试以其他方式提问: 我想要一个程序,我可以在其中上载* .log文件并在表格中读取它。我打开xhtml,并有一个空表。比我上传文件与<:pFileUpload。文件上传控制器采用日志文件并将每行分割为值(日期时间,级别,类别和消息)。然后,脚本应该向表格宽度添加一行新的日志文件行的数据。然后它转到下一行并分析文本。在最后,表格应该显示日志文件的内容。 问题是,表格不能重新加载。或者我不知道我应该如何重新加载它。当我上传文件时,脚本正确读取日志文件的每一行。但桌子保持空着。

回答

0

我完全不明白什么是你的问题我看到一些对如何使用bean来管理视图缺乏理解。

首先,您同时声明了@ViewScoped和@SessionScoped。一定只有一个。第二,关于定义托管bean的事情就是你不必管理它们的创建或销毁,系统就会这样做。这就是为什么他们被称为托管。所以这样做:

TableBean table = new TableBean(); 

是无用的。你正在一个函数内创建一个对象的实例。在该函数之外,对象是不可缓存的,因为如果在代码中创建对象,则不会考虑注释。

我将有一个管理的bean来处理视图上的事件,就像这样:

@ViewScoped 
@ManagedBean(name = "logViewController") 

public class LogViewController{ 

private List<Log> filteredLogs; 
private List<Log> logsSmall; 
public void handleFileUpload(FileUploadEvent event) {....} 

// other private functions 
//public getters and setters 
} 

此外,如果您正在使用Java 7的工作,也许你想看看新file I/O

+0

我编辑我的问题,所以我希望你明白我的问题是什么:) – sagschni