【发布时间】:2020-12-03 14:20:51
【问题描述】:
我正在使用 Visual Studio Code 编写基于 Tomcat 的 java servlet 和 jsp 的培训项目。现在我正在做日志记录。我的项目结构如下:
webapps
|----ROOT
|----public
|----WEB-INF
|----classes
|----FamilyTask
|----filters
|----AccessFilter.java
|----compile_filter.bat
|----lib
|----Log.java
|----compile_class.bat
|----servlets
|----compile_servlet.bat
|----LoginServlet.java
|----lib
|----web.xml
AccessFilter.java 类实现日志系统。这是AccessFilter.java的代码:
package FamilyTask.filters;
import ...
import FamilyTask.lib.Log;
public class AccessFilter implements Filter
{
...
...
...
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String path = req.getServletPath();
FamilyTask.lib.Log.Info("#INFO - Path :" + path + ", URL =" + req.getRequestURL());
if( path.contains("/public") ||
path.equals("/") || path.isEmpty() || path.equals("/index.jsp") ||
(path.equals("/login") && req.getMethod().toLowerCase().equals("post")))
chain.doFilter(request, response);
else
res.sendRedirect("/");
return;
}
}
Log.java的代码:
包 FamilyTask.lib;
import ...
...
import java.util.*;
import java.util.logging.*;
import javax.naming.*;
public class Log
{
private static Boolean isInit = false;
private static Logger LOGGER = null;
private static Handler handler = null;
private static void Init()
{
if(isInit && LOGGER != null)
return ;
try
{
handler = new FileHandler("debug_log");
LOGGER.addHandler(handler);
handler.setLevel(Level.ALL);
handler.close();
}
catch(IOException exc)
{
System.out.println("Error: Couldn't create or open Log file. Error message: " + exc.getMessage());
}
isInit = true;
return;
}
public static void Info(String message)
{
if(!isInit)
Log.Init();
System.out.println("Info: " + message);
LOGGER.info("Info: " + message);
}
public static void Error(String message)
{
if(!isInit)
Log.Init();
System.out.println("Error: " + message);
LOGGER.warning("Error: " + message);
}
}
编译 servlet/过滤器类的命令:
javac --release 8 -cp "D:\path\to\my\project\webapps\ROOT\WEB_INF\classes\";"D:\path\to\my\project\lib\servlet-api.jar" "<servlet or filter name>.java"
编译简单类的命令:
javac --release 8 -cp "D:\path\to\my\project\webapps\ROOT\WEB_INF\classes\" "<class name>.java"
编译结束时没有错误,但在运行时出现此错误:
Exception
javax.servlet.ServletException: При выполнении фильтра выброшено исключение
Root Cause
java.lang.NoClassDefFoundError: FamilyTask/lib/Log
FamilyTask.filters.AccessFilter.doFilter(AccessFilter.java:42)
Root Cause
java.lang.ClassNotFoundException: FamilyTask.lib.Log
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
FamilyTask.filters.AccessFilter.doFilter(AccessFilter.java:42)
【问题讨论】:
-
AccessFilter.java 中的第 42 行是什么
-
FamilyTask.lib.Log.Info("#INFO - Path :" + path + ", URL =" + req.getRequestURL());
-
或 Log.Info("#INFO - Path :" + path + ", URL =" + req.getRequestURL());同样的错误信息,没关系
-
@vsrukshan 你有什么想法可以解决这个问题吗?
-
我认为你错过了一些导入
标签: java jsp tomcat servlets compilation