PrettyFaces 和 h:link 结果标签不会重定向到干净的 URL

Posted

技术标签:

【中文标题】PrettyFaces 和 h:link 结果标签不会重定向到干净的 URL【英文标题】:PrettyFaces and h:link outcome tag don't redirect to a clean URL 【发布时间】:2013-10-15 09:01:03 【问题描述】:

我用 PrettyFaces 重写的错误页面不适用于 h:link,我不明白为什么。

我的链接应该重定向到login.xhtml,它应该是/Login

发生了什么事,我错过了什么吗?

我的重写规则导航:

<navigation-rule>
    <from-view-id>/pageNotFound.xhtml</from-view-id> 
    <navigation-case>
        <from-outcome>login</from-outcome>
        <to-view-id>/login.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

我的 web.xml 用于错误页面处理和漂亮的过滤器配置:

<error-page>
    <error-code>404</error-code>
    <location>/pageNotFound.xhtml</location>
</error-page>
<filter>
    <filter-name>Pretty Filter</filter-name>
    <filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Pretty Filter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
</filter-mapping>

我的漂亮配置.xml:

    <url-mapping id="login">
    <pattern value="/Login" />
    <view-id value="/login.xhtml" />
</url-mapping>

我的页面NotFound.xhtml:

<rich:panel style="width:50%;margin-top:100px;" header="Page Not Found.">
    <h:link value="Login page" outcome="login" />
</rich:panel>

【问题讨论】:

如果您将 h:commandLink 与 action="login" 一起使用,它可以正常工作...但我想知道为什么它不适用于结果和 h:link... 【参考方案1】:

基本上,您将 Prettyfaces 的视图 ID 与 JSF 的视图 ID 混合在一起。你不能在 JSF 上下文中直接使用这个 id,你 need to tell 它是一个 pretty id。这应该有效:

<h:link value="Login page" outcome="pretty:login" />

另外,如果您更喜欢使用 JSF id,您可以直接使用 /login

<h:link value="Login page" outcome="/login" />

Prettyfaces 的过滤器应该考虑到它是一个映射的 id 并直接重定向到您的 /Login url。

【讨论】:

已经测试过了,我在第二个和你的第一个解决方案中遇到了同样的问题,它给我发回了一个奇怪的问题,比如 ocpsoft.mapping_id=login... 我决定使用命令链接反而。感谢您的评论。 多么奇怪的行为,你这样做时是否达到了 Prettyfaces 的过滤器? 你的意思是我的漂亮配置过滤器?我在下面发布配置。奇怪的行为,我同意:),它应该像你提到的那样工作,这就是为什么我不明白什么配置不好。 您的过滤器似乎配置正确。我告诉你只是在com.ocpsoft.pretty.PrettyFilter 类中放置一个断点并调试它。而且,顺便说一句,最好编辑您自己的问题,包括更新,以便发布答案。 Xtreme Biker 是正确的;您不能将 JSF 导航规则与 PrettyFaces 映射混合使用。您必须使用其中一个。【参考方案2】:

首先,您不能将 JSF 导航规则与 PrettyFaces 映射混合使用。您必须使用其中一个。

<rich:panel style="width:50%;margin-top:100px;" header="Page Not Found.">
    <h:link value="Login page" outcome="login" />
</rich:panel>

我认为“login”应该改为“/login”,否则 JSF 可能无法解决它。我可能是错的。

<rich:panel style="width:50%;margin-top:100px;" header="Page Not Found.">
    <h:link value="Login page" outcome="/login" />
</rich:panel>

【讨论】:

以上是关于PrettyFaces 和 h:link 结果标签不会重定向到干净的 URL的主要内容,如果未能解决你的问题,请参考以下文章

JSF 和 PrettyFaces - 如何限制直接 xhtml 请求

使用 JSF ajax 请求刷新 URL

Primefaces FileUpload 与 PrettyFaces 和 JSF 2.2.3

JSF2 和 PrettyFaces...如何获取原始 URL 或查询字符串?

使用 PrettyFaces 获取原始请求 URI

JSF2 <h:selectOneMenu 和 <f:ajax 侦听器在 PrettyFaces 过滤器导航之后未调用