【问题标题】:JSF Templating: f:event works, f:viewParam doesn'tJSF 模板:f:event 有效,f:viewParam 无效
【发布时间】:2013-03-06 12:55:00
【问题描述】:

按照the spec的例子,我有一个模板和一个模板客户端。

default.xhtml(模板):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
  <title>...</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <h:outputStylesheet name="css/screen.css" />
</h:head>
<h:body>
  <f:view>
    <ui:insert name="metadata" />
    <div id="container">
      <div id="header">
        <img src="resources/gfx/logo.png" />
      </div>
      <div id="content">
        <ui:insert name="content" />
      </div>
      <div id="footer">
        <p>
          This is a project.<br />
        </p>
      </div>
    </div>
  </f:view>
</h:body>
</html>

edit.xhtml(模板客户端):

<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  template="/WEB-INF/templates/default.xhtml">

  <ui:define name="metadata">
    <f:metadata>
      <f:viewParam name="id" value="#{myBean.id}" />
      <f:event type="preRenderView" listener="#{myBean.init}"/>
    </f:metadata>
  </ui:define>

  <ui:define name="content">
    ...
  </ui:define>
</ui:composition>

list.xhtml(编辑视图的调用者)包含:

<h:commandLink action="edit" value="#{msgs.edit}">
  <f:param name="id" value="#{myentity.id}" />
</h:commandLink>

f:event 被调用,但 id (viewParam) 没有分配给 bean。然而,该 id 存在于请求参数映射中,并且可以像这样检索:

FacesContext ctx = FacesContext.getCurrentInstance();
Map<String, String> parameters = ctx.getExternalContext().getRequestParameterMap();
if (parameters.containsKey("id")) {
  this.id = Long.valueOf(parameters.get("id"));
}

但这就是&lt;f:viewParam ...&gt; 应该处理的事情(据我所知)。

可能出了什么问题?

【问题讨论】:

  • 如何称呼您的编辑站点?如果你这样称呼它../edit?id=123 它应该可以工作。
  • @pepuch 请看我的编辑

标签: jsf jsf-2 viewparams


【解决方案1】:

这是错误的。

<h:commandLink action="edit" value="#{msgs.edit}">
  <f:param name="id" value="#{myentity.id}" />
</h:commandLink>

这会发送一个 POST 请求,而不是一个 GET 请求。

您需要改用&lt;h:link&gt;

<h:link outcome="edit" value="#{msgs.edit}">
  <f:param name="id" value="#{myentity.id}" />
</h:link>

另见:

【讨论】:

  • 我真的不知道 viewParam 不适用于 POST 请求。
  • 没问题。请注意,一般来说,通过 POST 导航对用户和 SEO 都不友好。这个事实与 JSF 无关。
  • 是的,我通常更喜欢对 SEO 友好的 GET,但 JSF 给我留下了“我更喜欢 POST”的印象(如果这有意义的话)。 :) 还是谢谢
  • 这可能是 JSF 1.x 的遗产。没有可用于生成纯 GET 链接/按钮的标准组件,无知的开发人员不知道您可以在 JSF 页面中使用纯 HTML,如 &lt;a&gt;&lt;button&gt;,或者它们过于纯粹并且不想要在 JSF 页面中使用纯 HTML。
猜你喜欢
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多