PrimeFaces向DataTable添加行

时间:2014-02-19 14:32:00

标签: primefaces datatable row add

我想制作一个Log-File-Reader。我有一个上传字段和一个dataTable。首先,我选择日志文件和上传它。然后程序在单独的变量中拆分Log-File的每一行。现在,Log-File应该是printtet行以进入表格。但我不知道,我应该如何把线放在桌子上。当我定义Lines Static bevore时,它可以工作。但是现在当行没有定义为静态时,它不会更新表。

这是我的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,有一个空表。比我用&lt;:pFileUpload上传文件。文件上载控制器获取日志文件并拆分值(日期时间,级别,类别和消息)中的每一行。然后脚本应该在表格宽度上添加一个新行,Log-File-Line的数据。然后它转到下一行并解析文本。在结束时,表应显示日志文件的内容。 问题是,表不重新加载。或者我不知道我应该怎么重装它。当我上传文件时,脚本正确读取了日志文件的每一行。但桌子一直空着。

1 个答案:

答案 0 :(得分: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