Gwt从服务器端登录到客户端UI
我已经创建了GWT应用程序,在其中我有一个垂直面板,可以记录详细信息 我正在使用logger进行客户端日志记录 示例代码是:Gwt从服务器端登录到客户端UI,gwt,logging,Gwt,Logging,我已经创建了GWT应用程序,在其中我有一个垂直面板,可以记录详细信息 我正在使用logger进行客户端日志记录 示例代码是: public static VerticalPanel customLogArea = new VerticalPanel(); public static Logger rootLogger = Logger.getLogger(""); logerPanel.setTitle("Log");
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??但是我会有很多方法和很多类,我想把每个方法的细节都记录到我的日志中。内奸