我正在使用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>
我确信这有一个非常简单的解决方案,我现在只是想念它。帮助将受到高度赞赏。我希望这个问题很清楚。
答案 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>