簡體   English   中英

PrimeFaces將行添加到DataTable

[英]PrimeFaces add row to DataTable

我想做一個日志文件閱讀器。 我有一個Upload字段和一個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上傳文件。 文件上載控制器獲取日志文件,並將每一行拆分為值(日期時間,級別,類別和消息)。 然后,腳本應在表寬度上向日志文件行的數據添加新行。 然后轉到下一行並解析文本。 最后,表格應顯示日志文件的內容。 問題是該表不會重新加載。 或者我不知道我應該如何重新加載它。 當我上傳文件時,腳本會正確讀取日志文件的每一行。 但是桌子一直空着。

我完全不明白您的問題是什么,我發現對如何使用bean管理視圖缺乏了解。

首先,您同時聲明了@ViewScoped和@SessionScoped。 只能有一個。

其次,關於定義托管bean的事情是,系統不必管理托管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,也許您想查看新文件I / O。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM