问题:在web.xml中配置了default的servlet后,超链接跳转出现404和NullPointerException
笔者在学习Tomcat的时候,创建了一个默认的Servlet,DefaultServlet
public class DefaultServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("---------------doGet");
req.getRequestDispatcher("/Login.html").forward(req, resp);
}
}
然后在web.xml中设置了该Servlet
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.example.servlet.DefaultServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/default</url-pattern>
</servlet-mapping>
在触发直接访问<a href="/Login.html">login html</a>的时候,直接报错404
在触发Servlet转发<a href="/default">default</a>的时候,浏览器报错500
排查
首先是确保了路径上是对的。然后尝试了不经过Servlet直接访问jsp和html,发现访问jsp是没有问题的,但是访问html是有问题的。
接着我重新创建了web项目,没有加任何的Servlet。这时直接访问jsp和html都是正常的。我再按照上面的方式添加servlet,发现直接访问和Servlet转发都出问题了。因此我确认问题是在Servlet上。
最后尝试改名之类的情况才发现了这个问题的原因。
解决:
研究了发现,只要servlet-name不为default就可以了。
因为Tomcat有一个默认的Servlet,叫DefaultSevelet。在web.xml中设置了servlet-name为default时,操作的是Tomcat的这个默认的Servlet。该Servlet是默认用来处理静态资源的。因为重新设置了该Servlet的url-pattern,导致了正常的功能出现问题。