jsf - 为什么 <h :link> change destination extension from . html 到 .xhtml?

标签 jsf hyperlink facelets

我正在使用 JSF 2.1,但在使用 <h:link> 时遇到了一些问题。标签。我试图将链接的结果点从我的 XHTML 文件转换为纯 HTML 文件。但是,当我运行我的 Web 应用程序时,.html链接生成的 URL 中的扩展名会自动转换为 .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;
    }
}

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

Unable to find matching navigation case from view ID '/content/modifiedcc.xhtml' for outcome '/content/cc/CC_animation/story.html'



我确保我的 URL 正确,所以我创建了一个 story.xhtml文件也在该位置。有了那个文件,它就可以正常运行了。

如果我拉取生成页面的源代码,我可以看到 <h:link>已正确更改为“a href”标签,如下所示:
<a href="/MyWebApp/content/cc/CC_animation/story.xhtml">animation</a>

出于某种原因,虽然 URL 从 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>

我确定这有一个非常简单的解决方案,我现在只是缺少它。帮助将不胜感激。我希望这个问题很清楚。

最佳答案

JSF 2.0+ 引入了 <h:link> 在其 outcome 中采用导航案例结果的组件属性并自动生成正确的 URL。这就是为什么您在没有为 faces servlet 添加另一个映射的情况下出现错误的原因:只需重新阅读错误。它对于创建 JSF 应用程序间导航很有用。

或者,一直有一个 <h:outputLink> 在其 value 中采用 URL 的组件属性代替。它对于在 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>

前一个组件将通过附加一个 faces servlet 映射将其结果转换为实际的 URL,而后一个组件将保留其值原样。

因此,您的问题将通过使用以下组件来解决:
<h:outputLink value="#{contentForm.ccAnimationLink}">
    Animation
</h:outputLink>

关于jsf - 为什么 <h :link> change destination extension from . html 到 .xhtml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20310091/

相关文章:

xml - JSP 与 Facelets 作为 JSF 的 View 技术

jsf - 如何将参数传递给 JSF 2 中的模板?

jsf - 如何以 1 秒的间隔对组件进行 ajax 更新?

linux - 按照符号链接(symbolic link)从当前目录运行

javascript - 如何将 JavaScript 和 jQuery 与 JSF 混合使用?

java - JSF Facelets 许可证

jsf - Omnifaces TagAttribute Id 不能用作 id

jsf - PrimeFaces dataTable 在 Ajax 请求后未更新

html - 让html链接打开文件夹的方法有哪些

java - 为什么我被告知不能从静态上下文引用非静态变量?