我在开发一个相当简单的应用程序时遇到了问题。我完全不知道它来自哪里。
基本上,在尝试从我的 Java 应用程序加载页面时,当我启用旨在初始化应用程序范围数据 (My DAO) 的监听器时,我从 Tomcat 收到 404 错误。当我通过注释掉 web.xml 中的行来禁用监听器时,我在 servlet 调用中收到 500(由于缺少通过监听器类进行初始化,由 NPE 在 init() 方法中触发)。
知道它可能来自哪里吗?
这里是代码摘录
web.xml
...
<listener>
<listener-class>com.mypackage.InitialisationDAOFactory</listener-class>
</listener>
...
<servlet>
<servlet-name>NewBooking</servlet-name>
<servlet-class>com.mypackages.NewBooking</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>NewBooking</servlet-name>
<url-pattern>/index</url-pattern>
</servlet-mapping>
...
初始化DAOFactory.java
public class InitialisationDAOFactory implements ServletContextListener
{
private static final String ATT_DAO_FACTORY = "daofactory";
private DAOFactory daoFactory;
...
@Override
public void contextInitialized(ServletContextEvent event)
{
ServletContext context = event.getServletContext();
this.daoFactory = DAOFactory.getInstance();
context.setAttribute(ATT_DAO_FACTORY, daoFactory);
}
}
NewBooking.java
public class NewBooking extends HttpServlet
{
private static final String CONF_DAO_FACTORY = "daofactory";
...
private BookingDAO = daoBooking;
private TripDAO = daoTrip;
public void init()
{
this.daoBooking = ( (DAOFactory) getServletContext().getAttribute(CONF_DAO_FACTORY)) .getBookingDAO();
this.daoBooking = ( (DAOFactory) getServletContext().getAttribute(CONF_DAO_FACTORY)) .getBookingDAO();
}
...
}
500 发生在监听器不活动时(在 web.xml 中被注释掉)因此 daofactory 不在 servletContext 中,然后尝试访问它返回 null,因此 NPU on .getBookingDAO() 调用。 但是,我完全不知道 404 是从哪里来的。
有人知道它的起源和可能的更正吗?谢谢
编辑:应用在 TomCat 7 上运行
编辑 2:如评论中所述,我尝试使用 http://localhost/AppName/index
或 http://localhost/AppName
因为 index
在 web.xml
中被声明为欢迎文件。调用的方法应该是 doGet(request, response),它使用 this.getRequestDispatcher("/WEB-INF/index.jsp").forward(request,response);
我确实检查了该文件是否存在并正确命名,可能值得一提的是另一个 servlet,它在此之前运行正常(均使用 doGet
和 doPost
)当过滤器处于 Activity 状态时不再响应
最佳答案
监听器在上下文启动之前运行。如果监听器抛出异常,您的上下文将失败并且您只会看到 404,因为请求的 URI 上实际上没有应用程序。请参阅 catalina.out 启用日志记录以查看发生了什么。
关于java - 监听器触发的错误 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19496617/