JSF 自定义导航处理程序

JSF 自定义导航处理程序

Myfaces 和 Sun RI 表现出了两种不同的页面之间的导航方式,即:
1. Forwarding
2. Redirection

第一种方式并不是很好,问题在于 forwarding 将 request 转交但是并没有把新的URL通知给客户端,这样就会造成两种问题:
1. 这样看到的 URL 不一定是真实用到的 URL;
2. 刷新页面的时候,读取的是上一个页面。

大部分传统的 Web 应用的公司会首选使用 redirection 方法,但 redirection 效率有些低,因为它使用了两次 request。

另外,当在 JSF 中使用 forwarding 技术,程序员大概就需要通过以下方法来传递参数:
1. 作为 f:param tag
2. 在 request 作用范围设值

但这样还会带来以下的问题:
1. 在页面之间传递参数通过以下两种方式: request 参数、request 作用范围值。最好采用一种统一的方式来处理这些参数,否则就很难处理从多个不同的地方访问该页面的情况。
2. redirection 的方法并没有将这些 request 中的值传递到下个页面。

因此(也是为了解决复杂的动态导航的问题),假定 redirection 是首选的导航方案,我们就需要实现一个自定义导航处理程序,并使其具备以下的能力:
1. 可以自定义 redirection 到任何一个页面: 这样我们就可以直接在 return 中直接写一个我们想要导航的页面作为返回值,紧接着,导航处理程序将会直接将页面转向到这个页面,例如:

  function String saveAction()
  {
    ..
    ..
    return "redirect:save_ok.jsp"
  }

我们在返回时指定了一个前缀 "redirect:" 用以表明我们将要直接转向一个页面。这里我们将只能使用相对路径。

当动态的 URL 参数传入时:这样允许在页面间传递参数即便是用了 redirection 方式。
例如,为了从一个叫做 view.jsp 的页面导航到一个 edit.jsp,并传递了参数 objectId,我们将可以通过以下方式来配置这样的规则:

  <navigation-rule>
    <from-view-id>/view.jsp</from-view-id>
    <navigation-case>
      <from-outcome>edit</from-outcome>
      <to-view-id>/view.jsp?objectId=#{view.objectId}</to-view-id>
      <redirect />
    </navigation-case>
  </navigation-rule>

在 view.jsp 文件中,我们使用这样的 command link 来导航:   <h:commandLink value="Edit" action="edit" />

当然这只是一个设想,现在 JSF 还需要做很多事情才能进行正常的开发,这也只有通过慢慢的积累才能够达到的。

你可能感兴趣的:(JSF 自定义导航处理程序)