【问题标题】:PrimeFaces add row to DataTablePrimeFaces 向 DataTable 添加行
【发布时间】:2014-03-19 23:06:20
【问题描述】:

我想做一个日志文件阅读器。我有一个上传字段和一个数据表。首先我选择日志文件并上传它。然后程序将日志文件的每一行拆分为单独的变量。现在日志文件应该是逐行打印到表中的。但我不知道,我应该如何将线条放在表格中。当我定义 Lines Static 之前,它可以工作。但是现在,当行未定义为静态时,它不会更新表格。

这是我的 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>

【问题讨论】:

    标签: primefaces datatable row add


    【解决方案1】:

    我完全不明白你的问题是什么,我认为对如何使用 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

    【讨论】:

    • 我编辑了我的问题,希望您能理解我的问题:)
    猜你喜欢
    • 1970-01-01
    • 2012-06-29
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多