Gwt从服务器端登录到客户端UI

Gwt从服务器端登录到客户端UI,gwt,logging,Gwt,Logging,我已经创建了GWT应用程序,在其中我有一个垂直面板,可以记录详细信息 我正在使用logger进行客户端日志记录 示例代码是: public static VerticalPanel customLogArea = new VerticalPanel(); public static Logger rootLogger = Logger.getLogger(""); logerPanel.setTitle("Log");

我已经创建了GWT应用程序,在其中我有一个垂直面板,可以记录详细信息

我正在使用logger进行客户端日志记录

示例代码是:

         public static VerticalPanel customLogArea = new VerticalPanel();
         public static Logger rootLogger = Logger.getLogger("");
                    logerPanel.setTitle("Log");
        scrollPanel.add(customLogArea);
        logerPanel.add(scrollPanel);
        if (LogConfiguration.loggingIsEnabled()) {
        rootLogger.addHandler(new HasWidgetsLogHandler(customLogArea));

        }
我正在用这个代码更新我的垂直日志面板

         rootLogger.log(Level.INFO,
                        "Already Present in Process Workspace\n");
但现在我的问题是,我还必须将服务器端的详细信息记录到我的垂直日志面板中

我的服务器端问候ServiceImpl代码是:

      public boolean createDirectory(String fileName)
             throws IllegalArgumentException {
    Boolean result = false;
    try {
        rootLogger.log(Level.INFO,
                 "I want to log this to my UI vertical log Panel");

        system.out.println("log this to UI");
        File dir = new File("D:/GenomeSamples/" + fileName);
        if (!dir.exists()) {
            result = dir.mkdir();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}
现在,我想从这里将sysoutprt语句记录到我的UI中。我怎样才能做到这一点。现在使用rootLogger.log(Level.INFO, “我想将其记录到我的UI垂直日志面板”);它将此代码记录到eclipse控制台。但如何在客户端将其记录到我的UI


如果这个问题有任何错误,请告诉我。

您应该创建一个日志servlet,它与您的日志框架具有相同的方法,可以通过RPC向服务器发送日志消息

以下是您可以使用的一些RPC日志方法示例:

public interface LogService extends RemoteService {
    public void logException(String logger, String priority, String message, String error, StackTraceElement[] stackTrace, String nativeStack);
}

public interface LogServiceAsync {
    public void logException(String logger, String priority, String message, String error, StackTraceElement[] stackTrace, String nativeStack, AsyncCallback<Void> callback);
}

public class LogServiceImpl extends RemoteServiceServlet implements LogService {

    public void logException(String loggerName, String priority, String logMessage, String errorMessage, StackTraceElement[] stackTrace, String nativeStack) {      
        Logger logger = getLogger(loggerName);
        Level level = getLevel(priority);
        // Create a Throwable to log
        Throwable caught = new Throwable();
        if (errorMessage != null && stackTrace != null) {
            caught = new Throwable(errorMessage);
            caught.setStackTrace(stackTrace);
        }
        //do stuff with the other passed arguments (optional)
        logger.log(level, message, caught);
    }
}
公共接口日志服务扩展了远程服务{
公共无效日志异常(字符串记录器、字符串优先级、字符串消息、字符串错误、StackTraceElement[]stackTrace、字符串nativeStack);
}
公共接口LogServiceAsync{
public void logException(字符串记录器、字符串优先级、字符串消息、字符串错误、StackTraceElement[]stackTrace、字符串nativeStack、AsyncCallback回调);
}
公共类LogServiceImpl扩展RemoteServiceServlet实现LogService{
public void logException(字符串loggerName、字符串优先级、字符串logMessage、字符串errorMessage、StackTraceElement[]stackTrace、字符串nativeStack){
Logger=getLogger(loggerName);
级别=获取级别(优先级);
//创建一个可丢弃的日志
一次性捕获=新的一次性捕获();
if(errorMessage!=null&&stackTrace!=null){
捕获=新的可丢弃(错误消息);
捕获。setStackTrace(stackTrace);
}
//使用其他传递的参数进行填充(可选)
logger.log(级别、消息、捕获);
}
}

如果我理解正确,您希望在web界面中查看服务器日志条目。当然,java logger和printStackTrace()在这方面帮不了你:你的gwt代码被编译成JavaScript,与控制台和日志文件无关。此外,您的服务器不能将日志条目“推送”到客户机-由客户机发出请求。所以,若要跟踪新的日志条目并将其移动到客户端,则需要轮询服务器以查找新条目。还有一个问题:您可能有许多客户机轮询您的servlet,您应该记住这种多线程

这就是我如何看待可能的实现(这只是一个概念,可能包含一些错误和拼写错误):

远程接口:

public interface GreetingService extends RemoteService {
    List<String> getLogEntries();
    boolean createDirectory(String fileName)throws IllegalArgumentException;

}
public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService {

public static final String LOG_ENTRIES = "LogEntries";

public List<String> getLogEntries() {

    List<String> entries = getEntriesFromSession();
    List<String>copy = new ArrayList<String>(entries.size());
    copy.addAll(entries);
    //prevent loading the same entries twice
    entries.clear();
    return copy;

}



public boolean createDirectory(String fileName)throws IllegalArgumentException {
    Boolean result = false;
    try {

        log("I want to log this to my UI vertical log Panel");

        log("log this to UI");
        File dir = new File("D:/GenomeSamples/" + fileName);
        if (!dir.exists()) {
            result = dir.mkdir();
        }
    } catch (Exception e) {
        log("Exception occurred: " + e.getMessage());
    }
    return result;
}

private List<String> getEntriesFromSession()    {
    HttpSession session= getThreadLocalRequest().getSession();
    List<String>entries = (List<String>)session.getAttribute(LOG_ENTRIES);
    if (entries == null)    {
        entries = new ArrayList<String>();
        session.setAttribute(LOG_ENTRIES,entries);
    }

    return entries;

}

private void log(String message)  {
    getEntriesFromSession().add(message);
}
Timer t = new Timer() {
  @Override
  public void run() {
    greetingAsyncService.getLogEntries(new AsyncCallBack<List<String>>() {
       void onSuccess(List<String>entries) {
         //put entries to your vertical panel
       }

       void onFailure(Throwable caught){
           //handle exceptions
       }
    });
  }
};

// Schedule the timer to run once in second.
t.scheduleRepeating(1000);

greetingAsyncService.createDirectory(fileName, new AsyncCallBack<Void>(){
    void onSuccess(List<String>entries) {
          //no need to poll anymore
          t.cancel();
       }

       void onFailure(Throwable caught){
           //handle exceptions
       }
});
公共接口欢迎服务扩展了RemoteService{
列出getLogEntries();
布尔createDirectory(字符串文件名)抛出IllegalArgumentException;
}
远程Servlet:

public interface GreetingService extends RemoteService {
    List<String> getLogEntries();
    boolean createDirectory(String fileName)throws IllegalArgumentException;

}
public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService {

public static final String LOG_ENTRIES = "LogEntries";

public List<String> getLogEntries() {

    List<String> entries = getEntriesFromSession();
    List<String>copy = new ArrayList<String>(entries.size());
    copy.addAll(entries);
    //prevent loading the same entries twice
    entries.clear();
    return copy;

}



public boolean createDirectory(String fileName)throws IllegalArgumentException {
    Boolean result = false;
    try {

        log("I want to log this to my UI vertical log Panel");

        log("log this to UI");
        File dir = new File("D:/GenomeSamples/" + fileName);
        if (!dir.exists()) {
            result = dir.mkdir();
        }
    } catch (Exception e) {
        log("Exception occurred: " + e.getMessage());
    }
    return result;
}

private List<String> getEntriesFromSession()    {
    HttpSession session= getThreadLocalRequest().getSession();
    List<String>entries = (List<String>)session.getAttribute(LOG_ENTRIES);
    if (entries == null)    {
        entries = new ArrayList<String>();
        session.setAttribute(LOG_ENTRIES,entries);
    }

    return entries;

}

private void log(String message)  {
    getEntriesFromSession().add(message);
}
Timer t = new Timer() {
  @Override
  public void run() {
    greetingAsyncService.getLogEntries(new AsyncCallBack<List<String>>() {
       void onSuccess(List<String>entries) {
         //put entries to your vertical panel
       }

       void onFailure(Throwable caught){
           //handle exceptions
       }
    });
  }
};

// Schedule the timer to run once in second.
t.scheduleRepeating(1000);

greetingAsyncService.createDirectory(fileName, new AsyncCallBack<Void>(){
    void onSuccess(List<String>entries) {
          //no need to poll anymore
          t.cancel();
       }

       void onFailure(Throwable caught){
           //handle exceptions
       }
});
公共类GreetingServiceImpl扩展RemoteServiceServlet实现GreetingService{
公共静态最终字符串LOG\u ENTRIES=“LogEntries”;
公共列表getLogEntries(){
列表条目=getEntriesFromSession();
Listcopy=newarraylist(entries.size());
副本.addAll(条目);
//防止两次加载相同的条目
条目。清除();
返回副本;
}
公共布尔createDirectory(字符串文件名)引发IllegalArgumentException{
布尔结果=假;
试一试{
日志(“我想将此记录到我的UI垂直日志面板”);
日志(“将此记录到UI”);
File dir=新文件(“D:/GenomeSamples/”+文件名);
如果(!dir.exists()){
结果=dir.mkdir();
}
}捕获(例外e){
日志(“发生异常:+e.getMessage());
}
返回结果;
}
私有列表getEntriesFromSession(){
HttpSession session=getThreadLocalRequest().getSession();
Listentries=(List)session.getAttribute(日志项);
if(条目==null){
entries=newarraylist();
session.setAttribute(日志项、条目);
}
返回条目;
}
私有无效日志(字符串消息){
getEntriesFromSession().add(消息);
}
轮询的简单实现(gwt客户端):

public interface GreetingService extends RemoteService {
    List<String> getLogEntries();
    boolean createDirectory(String fileName)throws IllegalArgumentException;

}
public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService {

public static final String LOG_ENTRIES = "LogEntries";

public List<String> getLogEntries() {

    List<String> entries = getEntriesFromSession();
    List<String>copy = new ArrayList<String>(entries.size());
    copy.addAll(entries);
    //prevent loading the same entries twice
    entries.clear();
    return copy;

}



public boolean createDirectory(String fileName)throws IllegalArgumentException {
    Boolean result = false;
    try {

        log("I want to log this to my UI vertical log Panel");

        log("log this to UI");
        File dir = new File("D:/GenomeSamples/" + fileName);
        if (!dir.exists()) {
            result = dir.mkdir();
        }
    } catch (Exception e) {
        log("Exception occurred: " + e.getMessage());
    }
    return result;
}

private List<String> getEntriesFromSession()    {
    HttpSession session= getThreadLocalRequest().getSession();
    List<String>entries = (List<String>)session.getAttribute(LOG_ENTRIES);
    if (entries == null)    {
        entries = new ArrayList<String>();
        session.setAttribute(LOG_ENTRIES,entries);
    }

    return entries;

}

private void log(String message)  {
    getEntriesFromSession().add(message);
}
Timer t = new Timer() {
  @Override
  public void run() {
    greetingAsyncService.getLogEntries(new AsyncCallBack<List<String>>() {
       void onSuccess(List<String>entries) {
         //put entries to your vertical panel
       }

       void onFailure(Throwable caught){
           //handle exceptions
       }
    });
  }
};

// Schedule the timer to run once in second.
t.scheduleRepeating(1000);

greetingAsyncService.createDirectory(fileName, new AsyncCallBack<Void>(){
    void onSuccess(List<String>entries) {
          //no need to poll anymore
          t.cancel();
       }

       void onFailure(Throwable caught){
           //handle exceptions
       }
});
Timer t=new Timer(){
@凌驾
公开募捐{
greetingAsyncService.getLogEntries(新的AsyncCallBack(){
成功时作废(列表项){
//将条目放入垂直面板
}
失效时无效(可丢弃捕获){
//处理异常
}
});
}
};
//安排计时器每秒运行一次。
t、 时间表(1000);
greetingAsyncService.createDirectory(文件名,新的AsyncCallBack(){
成功时作废(列表项){
//不再需要投票了
t、 取消();
}
失效时无效(可丢弃捕获){
//处理异常
}
});
}

正如您所看到的,我使用会话来保存日志条目,因为会话是特定于客户端的,所以不同的客户端将接收不同的日志。由您决定使用什么-您可以创建自己的Logger类来跟踪用户本身,并将适当的日志提供给适当的客户端


此外,您可能希望保存消息的级别(信息、错误等),然后以不同的颜色显示消息(例如,红色表示错误)。要做到这一点,您需要保存的不是列表,而是一些自定义类。

尽管这些实现非常好,但请忘记计时器和重复的服务器查询。我们现在有更好的


可以使用支持将数据从服务器推送到客户端。

谢谢,我想根据您的示例代码,它会将字符串列表从服务器发送到客户端,我必须使用该列表更新垂直日志面板ryt??但是我会有很多方法和很多类,我想把每个方法的细节都记录到我的日志中。内奸