0

我在开发一个相当简单的应用程序时遇到了问题。我完全不知道它是从哪里来的。

基本上,在尝试从我的 java 应用程序加载页面时,当我启用旨在初始化应用程序范围数据(My DAO)的侦听器时,我从 Tomcat 收到 404 错误。当我通过注释 web.xml 中的行来禁用侦听器时,我在 servlet 调用上得到 500(由于缺少通过侦听器类进行的初始化,由 init() 方法中的 NPE 触发)。

任何想法从哪里来?

以下是代码摘录

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,因此在 .getBookingDAO() 调用上出现 NPU。但是,我完全不知道 404 来自哪里。

任何人都知道它的起源和潜在的更正吗?谢谢

编辑:该应用程序在 TomCat 7 上运行

编辑 2:如评论中所述,我尝试通过使用冷漠http://localhost/AppName/indexhttp://localhost/AppName在. 调用的方法应该是 doGet(request, response) ,它将数据传递给 JSPindexweb.xmlthis.getRequestDispatcher("/WEB-INF/index.jsp").forward(request,response);

我确实检查了该文件是否存在并且是否正确命名,并且可能值得一提的是另一个 servlet,它在过滤器处于活动状态时不再响应,它之前表现正常(使用doGet和)doPost

4

2 回答 2

1

侦听器在上下文开始之前运行。如果侦听器抛出异常,则您的上下文失败并且您只会看到 404,因为请求的 URI 上确实没有应用程序。请参阅 catalina.out 启用日志记录以查看发生了什么。

于 2013-10-21T16:49:21.183 回答
0

正如 David Levesque 和 Martin Strejc 所指出的,webapp 无法启动是因为异常导致上下文失败。

通过日志探索,我发现这是由于数据库驱动程序未正确加载导致DAOFactory.getInstance()方法失败并传播异常引起的。

由于这完全是由于一开始没有正确设置我的项目,我不确定这个问题是否相关。

于 2013-10-29T15:17:52.797 回答