命令按钮在JSF页面中不可见

时间:2013-07-30 02:06:21

标签: jsf

我试图测试一个示例JSF项目,但由于某种原因,未显示的命令按钮在下面的页面中显示,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:f="http://java.sun.com/jsf/core"    
   xmlns:h="http://java.sun.com/jsf/html">

   <h:body>
      <h2>Implicit Navigation</h2>
      <hr />
      <h:form>
         <h3>Using Managed Bean</h3>
         <h:commandButton action="#{navigationController.moveToPage1}" 
            value="Page1" />
         <h3>Using JSF outcome</h3>
         <h:commandButton action="page2" value="Page2" />                           
      </h:form> 
      <br/>
      <h2>Conditional Navigation</h2>
      <hr />
      <h:form>          
         <h:commandLink action="#{navigationController.showPage}"
            value="Page1">
            <f:param name="pageId" value="1" />
         </h:commandLink>   

         <h:commandLink action="#{navigationController.showPage}"
            value="Page2">
            <f:param name="pageId" value="2" />
         </h:commandLink>   

         <h:commandLink action="#{navigationController.showPage}" 
            value="Home">
            <f:param name="pageId" value="3" />
         </h:commandLink>   
      </h:form> 
      <br/>
      <h2>"From Action" Navigation</h2>
      <hr />
      <h:form>          
         <h:commandLink action="#{navigationController.processPage1}" 
         value="Page1" />               

         <h:commandLink action="#{navigationController.processPage2}" 
         value="Page2" />       

      </h:form> 
      <br/>
      <h2>Forward vs Redirection Navigation</h2>
      <hr />
      <h:form>          
         <h3>Forward</h3>
         <h:commandButton action="page1" value="Page1" />       
         <h3>Redirect</h3>
         <h:commandButton action="page1?faces-redirect=true" 
         value="Page1" />                   
      </h:form> 
   </h:body>
</html> 

的web.xml

<!DOCTYPE web-app PUBLIC
   "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
   "http://java.sun.com/dtd/web-app_2_3.dtd" >

   <web-app>
   <display-name>Archetype Created Web Application</display-name>

   <context-param>
      <param-name>javax.faces.PROJECT_STAGE</param-name>
      <param-value>Development</param-value>
   </context-param> 
   <context-param> 
      <param-name>javax.faces.CONFIG_FILES</param-name> 
      <param-value>/WEB-INF/faces-config.xml</param-value> 
   </context-param> 
   <servlet>
      <servlet-name>Faces Servlet</servlet-name>
      <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
   </servlet>
   <servlet-mapping>
      <servlet-name>Faces Servlet</servlet-name>
      <url-pattern>*.xhtm</url-pattern>
   </servlet-mapping>
</web-app>

在faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
   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-facesconfig_2_0.xsd"
   version="2.0">
   <navigation-rule>
      <from-view-id>home.xhtml</from-view-id>
      <navigation-case>
         <from-action>#{navigationController.processPage1}</from-action>
         <from-outcome>page</from-outcome>
         <to-view-id>page1.jsf</to-view-id>
      </navigation-case>
      <navigation-case>
         <from-action>#{navigationController.processPage2}</from-action>
         <from-outcome>page</from-outcome>
         <to-view-id>page2.jsf</to-view-id>
      </navigation-case>
   </navigation-rule>   
</faces-config>

查看源html文件                       的xmlns:H = “http://java.sun.com/jsf/html” &GT;

   <h:body>
      <h2>Implicit Navigation</h2>
      <hr />
      <h:form>
         <h3>Using Managed Bean</h3>
         <h:commandButton action="#{navigationController.moveToPage1}" 
            value="Page1" />
         <h3>Using JSF outcome</h3>
         <h:commandButton action="page2" value="Page2" />                           
      </h:form> 
      <br/>
      <h2>Conditional Navigation</h2>
      <hr />
      <h:form>          
         <h:commandLink action="#{navigationController.showPage}"
            value="Page1">
            <f:param name="pageId" value="1" />
         </h:commandLink>   

         <h:commandLink action="#{navigationController.showPage}"
            value="Page2">
            <f:param name="pageId" value="2" />
         </h:commandLink>   

         <h:commandLink action="#{navigationController.showPage}" 
            value="Home">
            <f:param name="pageId" value="3" />
         </h:commandLink>   
      </h:form> 
      <br/>
      <h2>"From Action" Navigation</h2>
      <hr />
      <h:form>          
         <h:commandLink action="#{navigationController.processPage1}" 
         value="Page1" />               

         <h:commandLink action="#{navigationController.processPage2}" 
         value="Page2" />       

      </h:form> 
      <br/>
      <h2>Forward vs Redirection Navigation</h2>
      <hr />
      <h:form>          
         <h3>Forward</h3>
         <h:commandButton action="page1" value="Page1" />       
         <h3>Redirect</h3>
         <h:commandButton action="page1?faces-redirect=true" 
         value="Page1" />                   
      </h:form> 
   </h:body>
</html> 

Navigationcontroller

package com.tutorialspoint.test;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;

@ManagedBean(name = "navigationController", eager = true)
@RequestScoped
public class NavigationController implements Serializable {

   private static final long serialVersionUID = 1L;

   @ManagedProperty(value="#{param.pageId}")
   private String pageId;

   public String moveToPage1(){
      return "page1"; 
   }

   public String moveToPage2(){
      return "page2"; 
   }

   public String moveToHomePage(){
      return "home"; 
   }

   public String processPage1(){
      return "page"; 
   }

   public String processPage2(){
      return "page"; 
   }

   public String showPage(){
      if(pageId == null){
         return "home";
      }
      if(pageId.equals("1")){
         return "page1";
      }else if(pageId.equals("2")){
         return "page2";
      }else{
         return "home";
      }     
   }

   public String getPageId() {
      return pageId;
   }

   public void setPageId(String pageId) {
      this.pageId = pageId;
   }
}

page1.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"   
   xmlns:h="http://java.sun.com/jsf/html">
   <h:body>
      <h2>This is Page1</h2>        
      <h:form>
         <h:commandButton action="home?faces-redirect=true" 
            value="Back To Home Page" />            
      </h:form>     
   </h:body>
</html> 

page2.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"   
   xmlns:h="http://java.sun.com/jsf/html">
   <h:body>
      <h2>This is Page2</h2>        
      <h:form>
         <h:commandButton action="home?faces-redirect=true" 
            value="Back To Home Page" />            
      </h:form>     
   </h:body>
</html> 

1 个答案:

答案 0 :(得分:1)

上面已经回答过,但我会具体说明。在您的web.xml中,&lt; url-pattern&gt;指定为* .xhtm,并且您的jsf文件具有.xhtml扩展名。注意模式规范中缺少的字母。因此,您的文件无法通过faces servlet进行识别和路由。只需将'l'添加到web.xml中的url-pattern,它就应该开始工作了。