查看页面的JSF链接

查看页面的JSF链接,jsf,hyperlink,managed-bean,Jsf,Hyperlink,Managed Bean,我有一个带有数据表的页面。我希望表中的某些项链接到相应的视图页 例如,现在我有一个没有链接的表: <h:dataTable var="bean" value="#{beanServiceImpl.beans}" border="1"> <h:column>#{bean.id}</h:column> </h:dataTable> #{bean.id} 我想向某些条目添加超链接,并让它们转到查看页面,根据其id显示更多信息: &l

我有一个带有数据表的页面。我希望表中的某些项链接到相应的视图页

例如,现在我有一个没有链接的表:

<h:dataTable var="bean" value="#{beanServiceImpl.beans}" border="1">
    <h:column>#{bean.id}</h:column>
  </h:dataTable>

#{bean.id}
我想向某些条目添加超链接,并让它们转到查看页面,根据其id显示更多信息:

  <h:dataTable var="bean" value="#{beanServiceImpl.beans}" border="1">
    <h:column>
        <a href="viewBean.xhtml?id=#{bean.id}">#{bean.id}</a>
    </h:column>
  </h:dataTable>

ViewBean.xhtml将包含如下内容:

ViewBean.xhtml

<ul>
  <li>ID: #{bean.id}</li>
  <li>Field 1: #{bean.field1}</li>
  <li>Field 2: #{bean.field2}</li>
</ul>
  • ID:#{bean.ID}
  • 字段1:#{bean.field1}
  • 字段2:#{bean.field2}

我如何在JSF中完成类似的事情?我知道我必须编写一个控制器来查询其他字段的id。但是如何让viewBean.xhtml运行业务逻辑来获取其他字段并呈现它呢?

我将假设JSF 2.x。将此添加到您的
Bean

@ManagedProperty(value="#{param.id}")
private Long id;
(这基本上是一个
bean.setId(request.getParameter(“id”))
视图加载时)

它将在
@PostConstruct
方法的
Bean
中提供

@PostConstruct
public void init() {
    // Fill model based on id.
}

BalusC的答案几乎不错,但不起作用(编辑:它现在起作用了)

您已经知道如何将值添加到参数。顺便说一句,如果我是你,我不会使用
,而是:

<h:link outcome='viewBean'>
    <f:param name='id' value='#{bean.id}' />
</h:link>
最后一件事:有一个名为“bean”的变量比称它为“variable”(或者有一只狗叫dog,猫叫cat)没有意义。它不携带任何信息,更糟糕的是,它使应用程序中的所有bean都无法区分(除非您构建了豆类管理器)。

这就是我所做的

    <h:form>
        <h:commandLink action="#{bean.populateBean}" value="#{bean.id}">
            <f:setPropertyActionListener target="#{bean.id}" value="#{bean.id}" />
        </h:commandLink>
    </h:form>
我的ViewBean.xhtml是相同的:

<ul>
  <li>ID: #{bean.id}</li>
  <li>Field 1: #{bean.field1}</li>
  <li>Field 2: #{bean.field2}</li>
</ul>
  • ID:#{bean.ID}
  • 字段1:#{bean.field1}
  • 字段2:#{bean.field2}

Uhm。答案显然是错误的-视图参数是标准faces生命周期的一部分,因此当调用@PostConstruct时,请求中的任何值都将不可用。我们需要等待,直到模型值更新。嗨,巴卢斯克,谢谢你的回答。我在下面发布了我的解决方案,因为我认为我们可能解决了不同的问题。您现在触发的是POST请求(带有假链接的表单),而不是GET请求(链接)。这和你最初问的完全不同。但是,如果功能需求确实是发出POST请求,那么请继续您的请求。你永远无法通过(即,它不可书签)调用它。我不是一个可以抱怨的人(好吧,我撒谎了——我现在抱怨得很厉害,不要理我),但BalusC的答案是错误的,只有在我将我的答案发布到同一个答案后才得到修复。然而,我没有得到占我目前状态近1%的15分。巴卢斯的答案是有标记的,这使他获得了他已经得到的0.00000001%的预付款。我有祸了…@BalusC:好多了,虽然我有点惭愧:-)对不起,我希望能弥补这一点。谢谢你的回答+1至于名为“Bean”的变量,我只是将其重命名为更通用的变量,以便我可以将其作为示例发布(甚至field1和field2也是通用的)。我对SO很陌生,但我认为在任何公共论坛上询问编程问题时,这都是正确的。谢谢
public String populateBean(){
    Bean bean = BeanServiceImpl.getBean(id); //id was injected by the commandLink
    this.field1 = tenure.getField1();
    this.field2 = tenure.getField2();

    return("viewBean");
}
<ul>
  <li>ID: #{bean.id}</li>
  <li>Field 1: #{bean.field1}</li>
  <li>Field 2: #{bean.field2}</li>
</ul>