我在开发一个相当简单的应用程序时遇到了问题。我完全不知道它来自哪里。
基本上,在尝试从我的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/index
或http://localhost/AppName
来访问该页面,因为index
在web.xml
中被声明为欢迎文件。调用的方法应该是doGet(request,response),它使用this.getRequestDispatcher("/WEB-INF/index.jsp").forward(request,response);
将数据传递给JSP
我确实检查过该文件是否存在且是否已正确命名,并且可能值得一提的是,另一个表现正常的servlet(包括doGet
和doPost
)之前不再响应过滤器处于活动状态
答案 0 :(得分:1)
侦听器在上下文启动之前运行。如果侦听器抛出异常,则上下文失败,您只看到404,因为请求的URI上确实没有应用程序。请参阅catalina.out启用日志记录以查看发生的情况。
答案 1 :(得分:0)
正如David Levesque和Martin Strejc指出的那样,由于导致上下文失败的异常,webapp无法启动。
通过日志探索,我发现它是由于数据库驱动程序未正确加载而导致DAOFactory.getInstance()
方法失败并传播异常。
由于这完全是由于首先没有正确设置我的项目,我不确定这个问题是否相关。