由侦听器触发的错误404

时间:2013-10-21 14:01:06

标签: java java-ee tomcat servlets

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

基本上,在尝试从我的java应用程序加载页面时,当我启用一个旨在初始化应用程序范围数据(My DAO)的侦听器时,我从Tomcat收到404错误。当我通过在web.xml中注释掉行来禁用监听器时,我得到一个500 on servlet调用(由于缺少通过监听器类的初始化而在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>
    ...

InitialisationDAOFactory.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();
        }
    ...
    }

当侦听器未处于活动状态(在web.xml中注释掉)并且因此不在servletContext中时,则发生500,然后尝试到达它返回null,因此在.getBookingDAO()调用上返回NPU。 但是,我完全不知道404来自哪里。

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

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

编辑2:正如评论中所述,我尝试使用无差异http://localhost/AppName/indexhttp://localhost/AppName来访问该页面,因为indexweb.xml中被声明为欢迎文件。调用的方法应该是doGet(request,response),它使用this.getRequestDispatcher("/WEB-INF/index.jsp").forward(request,response);将数据传递给JSP

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

正如David Levesque和Martin Strejc指出的那样,由于导致上下文失败的异常,webapp无法启动。

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

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