当前位置: 首页 > 面试题库 >

如何在JSF 1.x中对页面加载进行重定向

张银龙
2023-03-14
问题内容

我有一个Web应用程序,可以将用户直接发送到某些特定页面(例如,他可以查看或编辑项目的页面)。为此,我们提供了一个特定的URL。这些网址位于
电流网络的应用程序(即,它们可以存在于另一网络的应用程序,或电子邮件)。

网址看起来像http://myserver/my-app/forward.jsf?action=XXX&param=YYY,其中:

  • action 表示将用户重定向到的页面。您可以将其视为中from-outcome的任何JSF操作navigation-casefaces-config.xml
  • actionParam 是上一个操作的参数(通常是商品ID)

因此,例如,我可以使用以下网址:

  • http://myserver/my-app/forward.jsf?action=viewItem&actionParam=1234
  • http://myserver/my-app/forward.jsf?action=editItem&actionParam=1234

当然,我有一个Java类(豆),将检查一些安全方面的限制(即是/允许查看用户编辑相应的项目吗?),然后将用户重定向到正确的页面(如edit.xhtmlview.xhtmlaccess- denied.xhtml)。

当前实施

当前,我们有一种基本的方法来完成转发。当用户单击链接时,将调用以下XHTML页面:

<html>
    <body id="forwardForm">
        <h:inputHidden id="myAction" binding="#{forwardBean.hiddenAction}"/>
        <h:inputHidden id="myParam" binding="#{forwardBean.hiddenActionParam}"/>
        <h:commandButton id="forwardBtn" actionListener="#{forwardBean.doForward}" style="display: none;"/>
    </body>
    <script type="text/javascript">
        document.getElementById('forwardForm:forwardBtn').click();
    </script>
</html>

如您所见,我<h:inputHidden>在Java
bean中绑定了两个组件。它们将用于存储actionactionParam请求参数的值(使用FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("actiontParam");)。我还提供了doForward在呈现页面时将立即调用的方法,该方法会将用户(再次)重定向到真实页面。方法是:

public void doForward(ActionEvent evt) {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    String redirect = // define the navigation rule that must be used in order to redirect the user to the adequate page...
    NavigationHandler myNav = facesContext.getApplication().getNavigationHandler();
    myNav.handleNavigation(facesContext, null, redirect);
}

此解决方案有效,但是我有两个问题:

  • 我不喜欢它的实现方式。我确定我可以使用一些简单的东西(使用Servlet?)。
  • 此解决方案使用的是Javascript,并且我一定不能使用Javascript(因为不支持Javascript的老Blackberry用户可能会使用此转发)。

所以我的问题是 如何重构此重定向/转发功能?

技术信息

Java 1.6,JSF 1.2,Facelets,Richfaces


问题答案:

将GET查询参数设置为托管属性,faces-config.xml以便您无需手动收集它们:

<managed-bean>
    <managed-bean-name>forward</managed-bean-name>
    <managed-bean-class>com.example.ForwardBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>action</property-name>
        <value>#{param.action}</value>
    </managed-property>
    <managed-property>
        <property-name>actionParam</property-name>
        <value>#{param.actionParam}</value>
    </managed-property>
</managed-bean>

这样,请求forward.jsf?action=outcome1&actionParam=123将使JSF将actionactionParam参数设置为action和的actionParam属性ForwardBean

创建一个小的视图forward.xhtml(如此之小,它在默认响应缓冲(通常2KB适合),这样它就可以通过navigationhandler被重置了,否则,你已经增加了servletcontainer的配置响应缓冲区),它调用bean方法上beforePhase的的f:view

<!DOCTYPE html>
<html xmlns:f="http://java.sun.com/jsf/core">
    <f:view beforePhase="#{forward.navigate}" />
</html>

ForwardBean可以是这样的:

public class ForwardBean {
    private String action;
    private String actionParam;

    public void navigate(PhaseEvent event) {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        String outcome = action; // Do your thing?
        facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, outcome);
    }

    // Add/generate the usual boilerplate.
}

navigation-rule不言自明的(注意,<redirect />这将做分录ExternalContext#redirect(),而不是ExternalContext#dispatch()在幕后):

<navigation-rule>
    <navigation-case>
        <from-outcome>outcome1</from-outcome>
        <to-view-id>/outcome1.xhtml</to-view-id>
        <redirect />
    </navigation-case>
    <navigation-case>
        <from-outcome>outcome2</from-outcome>
        <to-view-id>/outcome2.xhtml</to-view-id>
        <redirect />
    </navigation-case>
</navigation-rule>

另一种方法是forward.xhtml用作

<!DOCTYPE html>
<html>#{forward}</html>

并更新navigate()要在其上调用的方法@PostConstruct(将在bean的构造和所有托管属性设置之后调用):

@PostConstruct
public void navigate() {
    // ...
}

它具有相同的效果,但是视图方面并不是真正的自我记录。它基本上所做的就是打印ForwardBean#toString()(并在不存在时隐式构造bean)。

对于JSF2用户,请注意,有一种使用传递参数的更简洁的方法,<f:viewParam>以及一种通过处理重定向/导航的更可靠的方法<f:eventtype="preRenderView">



 类似资料:
  • 本文向大家介绍如何使用jQuery进行页面重定向?,包括了如何使用jQuery进行页面重定向?的使用技巧和注意事项,需要的朋友参考一下 要重定向到jQuery中的另一个网页,请使用。您可以尝试运行以下代码以重定向到另一个网页- 示例

  • 我有一个链接。当用户单击此链接时,页面将被重新加载。我是这样做的。。。。。。 html JS 在控制器中,我使用了javascript,这对我来说似乎很糟糕。我怎么能用angularjs做

  • 问题内容: 我已经通过Ajax调用通过隐藏的iframe读取了Facebook加载页面的地方…这是真的吗? 问题答案: Facebook使用他们称为BigPipe的东西,它将页面分成一堆小小的“小页面”,这些小页面分别通过AJAX加载。 在下图中,浅蓝色突出显示的区域是单个的小页面。

  • 问题内容: 我有一个PHP include,它需要一段时间才能加载,因为PHP必须获取很多数据。我不想放慢整个网页的加载,以等待包含此内容,那么如何使用ajax加载该包含内容呢?我不希望通过单击按钮来触发Ajax,而只是希望它在页面加载时加载包含,因此,如果您查看下面的示例,则会在显示内含代码的同时显示“更多HTML内容”。 php仍在加载中。 问题答案: 如果您使用的是jQuery,则可以使用他

  • 问题内容: 我正在用Node.js和猫鼬编写一个Webapp。如何对通话结果进行分页?我想要一个与SQL 相当的功能。 问题答案: 在通过Rodolphe提供的信息仔细研究了Mongoose API之后,我想出了以下解决方案:

  • 我想停止重新加载页面时,我没有选择类别和点击提交按钮。有人能帮我吗? null null