【问题标题】:JSF h:outputLink call bean method before GETJSF h:outputLink 在 GET 之前调用 bean 方法
【发布时间】:2015-04-28 12:48:07
【问题描述】:

我需要将一些参数从一个 xhtml 发送到另一个,但我不希望这些参数出现在 URL 中。怎么做?我可以使用p:commandLink,但是我不知道如何从bean 方法打开目标页面。目标页面应该可以通过友好的 URL 访问,而不是通过 xhtml 名称。 此代码将打开页面 /users/view。如何发送参数而不出现在 URL 中?

   <h:outputLink value="/users/view">
      <h:outputText value="#{entry.employee}" />
   </h:outputLink>

【问题讨论】:

  • 您希望如何在请求之前呈现页面?如果它是一个请求范围的 bean,那么您可能可以使用 @PostConstruct 方法。但我不确定真正的问题是什么。如果您告诉我们真正的问题是什么,也许会有所帮助。这看起来像是您想多了一些您没有想到的简单解决方案。
  • 不看代码很难猜到,但是您可以在执行操作之前使用commandLinkprocess 属性将值提交给支持bean。
  • 您可以使用 p:commandLink。只需在支持 bean 中实现 action 方法,它将返回 String "/users/view"
  • 问题是我无法使用 bean 方法返回的字符串“/users/view”。

标签: jsf primefaces


【解决方案1】:

忽略strange design,您可以使用将数据放入flash scope 并在&lt;h:commandLink&gt; 操作方法中发送redirect

public void view() throws IOException {
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.getFlash().put("employee", employee);
    ec.redirect(ec.getRequestContextPath() + "/users/view");
}

然后在与目标页面关联的backing bean中:

@PostConstruct
public void init() {
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    employee = (Employee) ec.getFlash().get("employee");
}

另见:

【讨论】:

  • 你最好在以后的每一个问题中明确提到你在 Liferay 上的问题。 Liferay 是一个 portlet 环境,与 servlet 环境相比,它是一个天壤之别,当问题中没有任何其他暗示时,我将始终假设。 Portlet 非常罕见,我对它们一无所知。您最好不要接受答案,以便我删除它。
  • 您是对的,但是对于基于普通 Servlet 的环境来说,答案是正确的。我们不要删除它,因为它工作正常。谢谢
  • ec.getFlash() 不起作用:stackoverflow.com/questions/10595760/…
  • 该问题涉及在 preRenderView 事件期间调用的操作,而不是通过例如&lt;h:commandLink&gt; 因此不适用于您的情况。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多