2014-02-19 85 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