使用 GlassFish 的 netbeans 中的文件结构

Files' structure in netbeans using GlassFish

我学习 jsp 使用 netbeans 8 和 GlassFish Server。我有 MyLog.java

package MyClass;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.IOException;
public class MyLog {

    private static final SimpleDateFormat TIME_FMT= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
    private static PrintWriter log=null;
    public MyLog(String logpath) throws IOException{
        log=new PrintWriter(new FileWriter(logpath,true));   
    }

    public static synchronized void println(String s)
    {
        log.println(TIME_FMT.format(new java.util.Date())+" - "+s);
        log.flush();
    }
    public static synchronized void close(){
    log.close();
    }
}

我的 class 用法是

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="MyClass.*" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Switch the log ON</title>
    </head>
    <body>
        <% 
            MyLog log =(MyLog) application.getAttribute("logfile");

            if (log==null)
            {
                try{
                    log=new MyLog("log/mylog.log");
                    application.setAttribute("logfile", log);
                    log.println("Logging enabled");
                    out.println("Logging enabled");
                }
                catch (Exception e) {
                    out.println(e.getMessage());
                }
            }
            else 
            {
                log.println("Attempt to enable logging");
                out.println("Logging was already enabled");
            }
        %>
    </body>
</html>

所以我收到找不到文件 "log/mylog.log" 的错误。

我在 web 文件夹甚至应用程序文件夹中创建了 log/mylog.log(带目录),但找不到该文件。

我尝试使用

new File (filename).exists () 正在调试我现有的文件,但它总是给出 false。

所以我的问题是,我应该将文件放在哪里以便 netbeans(或 glassfish)可以找到它?

查找始终在您的当前工作目录中完成,一旦您的应用程序部署在容器中取决于目标应用程序服务器。但是,即使找到了,您也不能完全依赖它,否则您的应用程序将不再具有便携性。

因此,您可以将 log 目录移动到 Web 应用程序的 WEB_INF 目录中,并在运行时通过 ServletContext like

访问绝对目录位置
log = new MyLog(application.getRealPath("/WEB-INF/log/mylog.log"));

警告:您必须将 log 目录存储在 WEB-INF 中,否则它们将可以通过浏览器访问万维网看看。

如果您不希望日志文件进入 Web 应用程序的目录,或者您有其他中心位置用于该服务器上的所有日志,另一种选择是将您喜欢的任何绝对目录位置配置为 你的 web.xml.

中的上下文参数
<web-app>
  ...
  <context-param>
    <param-name>LogPath</param-name>
    <param-value>/absolute/log/dir/path/file.log</param-value>
  </context-param>

然后可以再次通过 ServletContext 访问该值。

log = new MyLog(application.getInitParam("LogPath"));

对于临时日志记录,另一种选择是仅使用您的容器已经实现的 Servlet 规范附带的日志记录功能。下面将记录错误消息和相关异常的堆栈跟踪到日志文件,其名称和位置将取决于您的 servlet 容器,但将在其文档中提供。

application.log("Error message", throwable);

在 Tomcat 上,日志默认应该转到 ${TOMCAT_HOME}/logs/catalina.out


这里没有虚拟路径。两条路径都是相对的;使用 getRealPath() 你只是解决了 relativeness (如果这是一个词)对你的 web 应用程序的根目录。使用您的方法,相对路径也得到解决,但针对您的应用程序服务器的当前工作目录。只是你找不到它在哪里。它不是一个固定的位置,并且会随着不同的应用服务器甚至同一服务器的不同版本而变化。