It's not a problem. This is the expected behavior. You just don’t understand how the basic Servlet API works. You have configured the JSF standard FacesServletto listen for URLs matching /faces/*and you have configured specific MyFacesServletto listen for URls matching *.jsfand *.faces.
JSF, URL-, FacesServlet. , index.jsp, Graph, JSF URL-, JSP URL-:
, . MyFacesServlet URL ( faces). FacesServlet . *.jsf.
<servlet>
<servlet-name>facesServlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
http://localhost:8080/Graph/index.jsf.
, welcome-file . Tomcat HTTP 404 (/ ). index.jsf welcome-file , index.jsf , index.jsp. , Tomcat , , http://localhost:8080/Graph.
, JSF *.jsp, RuntimeException: FacesContext not found, JSP , , JSP web.xml:
<security-constraint>
<display-name>Restrict direct access to JSP files</display-name>
<web-resource-collection>
<web-resource-name>JSP files</web-resource-name>
<url-pattern>*.jsp</url-pattern>
</web-resource-collection>
<auth-constraint />
</security-constraint>
( JSF 2.0 , , , Facelets FacesServlet *.xhtml, Facelets)