为什么<h:link>将目标扩展名从.html更改为.xhtml?</h:link>

时间:2013-12-01 08:07:32

标签: jsf hyperlink facelets

我正在使用JSF 2.1,我遇到了<h:link>标记的一些问题。我正在尝试将链接的结果点从我的XHTML文件转换为纯HTML文件。但是,当我运行自己的网络应用程序时,链接生成的网址中的.html扩展名会自动转换为.xhtml扩展名。

这是我的Facelet文件:

<h:body>
    <h:form>        
        <h:link value="animation" outcome="#{contentForm.ccAnimationLink}"/>            
    </h:form>
<h:body>

这是我的contentForm bean:

package my.app.content;

import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class ContentForm implements Serializable {
    private static final long serialVersionUID = -8463354828156798513L; 
    private String ccAnimationLink = "";    

    @PostConstruct
    public void init() {        
        ccAnimationLink = "/content/cc/CC_animation/story.html";        
    }

    public String getCcAnimationLink() {
        return ccAnimationLink;
    }

    public void setCcAnimationLink(String ccAnimationLink) {
        this.ccAnimationLink = ccAnimationLink;
    }
}

现在,当我运行此应用程序时,出现以下错误:

  

无法从视图ID'/content/modifiedcc.xhtml'中找到匹配的导航案例,用于结果'/content/cc/CC_animation/story.html'

我确保我的网址正确,因此我也在该位置创建了story.xhtml文件。使用该文件,它运行没有错误。

如果我为生成的页面提取源代码,我可以看到<h:link>已正确更改为“a href”标记,如下所示:

<a href="/MyWebApp/content/cc/CC_animation/story.xhtml">animation</a>

出于某种原因,虽然网址从story.html更改为我在我的bean中更改为story.xhtml

如何确保它保留为story.html而不是将其更改为xhtml?

以下是我的web.xml文件:

  <display-name>MyWebApp</display-name>
  <context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
  </context-param>
  <welcome-file-list>
    <welcome-file>jsf/login/login.xhtml</welcome-file>
  </welcome-file-list>
  <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>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
  </servlet-mapping>
</web-app>

我尝试将以下内容添加到web.xml,这没有什么区别:

  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>

我确信这有一个非常简单的解决方案,我现在只是想念它。帮助将受到高度赞赏。我希望这个问题很清楚。

1 个答案:

答案 0 :(得分:5)

JSF 2.0+引入了<h:link>组件,该组件在其outcome属性中获取导航案例结果,自行生成正确的URL 。这就是为什么你没有为faces servlet添加另一个映射的错误:只需重新读取错误。它对于创建JSF间应用程序导航非常有用。

或者,始终有<h:outputLink>组件在其value属性中使用网址。它对于创建JSF应用程序外部的导航非常有用。

请务必阅读BalusC关于此问题的经典:When should I use h:outputLink instead of h:commandLink?

尽管如此,请考虑以下内容:

<h:link outcome="/destination" value="link" />
<h:outputLink value="/destination.html">
    outputLink
</h:outputLink>

前一个组件会将其结果转换为实际的URL,方法是附加一个faces servlet映射,而后一个组件将保持其值不变。

因此,您的问题将通过使用以下组件解决:

<h:outputLink value="#{contentForm.ccAnimationLink}">
    Animation
</h:outputLink>