有一个JSF项目,项目名是initProp,web.xml文件的配置是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/show.jsp</welcome-file>
</welcome-file-list>
</web-app>
==================================
问题是:对应<url-pattern>/faces/*</url-pattern>这行的配置,是不是应该把initProp项目中所有jsp页面都放到一个faces文件夹中,运行的时候才会调用JSF的核心控制器(Faces Servlet)?

解决方案 »

  1.   

    上面的问题自己试了一下,结果如下:如果web.xml中像下面这样配置:
         <servlet>
              <servlet-name>Faces Servlet</servlet-name>
              <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
              <load-on-startup>1</load-on-startup>
         </servlet>
         <servlet-mapping>
              <servlet-name>Faces Servlet</servlet-name>
              <url-pattern>/aaa/aab/aac/*</url-pattern>
         </servlet-mapping>
         <session-config>
              <session-timeout>
                   30
              </session-timeout>
         </session-config>
         <welcome-file-list>
              <welcome-file>aaa/aab/aac/showBean.jsp</welcome-file>
         </welcome-file-list>
    星号前面的部分(/aaa/aab/aac/)只是一个前缀,而不是物理文件的文件夹。
    所以当在浏览器的地址栏中输入:
    http://localhost:9999/项目名
    时,直接打开的是项目根目录下的showBean.jsp,
    如果写成:
    <welcome-file>aaa/aab/aac/aad/showBean.jsp</welcome-file>
    的话,访问的就是:
    项目根目录/aad/showBean.jsp
    了。
      

  2.   

    只是个前缀,不是文件夹名,因为 faces/ 前缀只应该出错在第一次进入的时候,用来创建 FacesContext 之类的 Context 并跟踪这些状态值。相当于你从 /faces/进来的才是 JSF 页面,才有后台的 UIViewRoot 和 FacesContext 对象。没有使用 faces/ 前缀的页面和 Servlet 就没有这些,如果你这时候去拿 FacesContext.getCurrentInstance() 就会出错 RuntimeException 说当前线程没有绑定 FacesContext 实例。