Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 如何使用f:viewParam对GET请求执行操作?_Jsf_Jsf 2 - Fatal编程技术网

Jsf 如何使用f:viewParam对GET请求执行操作?

Jsf 如何使用f:viewParam对GET请求执行操作?,jsf,jsf-2,Jsf,Jsf 2,我目前正在尝试将记录的id从一个页面发送到另一个页面 在第1页,我有这样的内容: <p:column> <h:link value="#{rpb.map['transNum']}" outcome="TInput.xhtml"> <f:param name="id" value="#{rpb.map['id']}" /> </h:link> </p:column> 在目标页面(TInput.xhtm

我目前正在尝试将记录的id从一个页面发送到另一个页面

在第1页,我有这样的内容:

<p:column>
    <h:link value="#{rpb.map['transNum']}" outcome="TInput.xhtml">
        <f:param name="id" value="#{rpb.map['id']}" />
    </h:link>
</p:column>

在目标页面(TInput.xhtml)中,我有类似这样的内容来捕获id:

....
    xmlns:fn="http://java.sun.com/jsp/jstl/functions">

<f:metadata>
    <f:viewParam name="id" value="#{tInputBean.id}"></f:viewParam>
</f:metadata>

<h:head>
....
。。。。
xmlns:fn=”http://java.sun.com/jsp/jstl/functions">
....
现在,点击链接,转到第2页,第2页由一个视图范围的JSFbean处理。根据我的调试,这是发生的顺序:

  • 执行@PostConstruct方法
  • 使用从viewParam捕获的id更新模型(在appy请求+验证之后)
  • 我希望达到的目标是: 模型更新后,我想对该记录id执行一个查询,从业务服务获取其bean和详细信息列表。

    我想知道我应该把我的查询代码放在哪里:

  • 内部@PostConstruct方法是不可能的,因为在@PostConstruct方法完成后,从viewParam捕获的id被设置为模型
  • 模型更新后是否在上使用阶段侦听器
  • 使用系统事件?虽然我似乎找不到适合这个案子的
  • 请告诉我:)

    在列表中添加一个


    (顺便说一句,与文档相反,参数和异常是可选的,至少在我使用过的所有Mojarra 2.x版本中是如此)

    我使用了BalusC解决方案。谢谢;)

    我只想补充一点,如果您使用facelet,您需要:

     <f:metadata>
    
    
    
    在使用模板的每个页面中:

    mytemplate.xhtml:

    <html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    
    <ui:insert name="meta"/>
    
    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core">
    
    <ui:composition template="mytemplate">
    
     <ui:define name="meta">
        <f:metadata>
           <f:viewParam name="id" value="#{tInputBean.id}" />
           <f:event type="preRenderView" listener="#{tInputBean.init}" />
         </f:metadata>
      </ui:define>
    ...
    
    
    
    使用mytemplate.xhtml的mypage.xhtml:

    <html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    
    <ui:insert name="meta"/>
    
    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core">
    
    <ui:composition template="mytemplate">
    
     <ui:define name="meta">
        <f:metadata>
           <f:viewParam name="id" value="#{tInputBean.id}" />
           <f:event type="preRenderView" listener="#{tInputBean.init}" />
         </f:metadata>
      </ui:define>
    ...
    
    
    ...
    

    解决方案在:

    @BalusC:非常感谢!我今天才知道,我们可以将事件标记放在f:metadata中。因此,基本上,无论我使用GET还是POST,我都可以根据事件类型使用f:metadata中的f:event调用方法,对吗?不客气。是的,这与方法无关。但是,这样一个带有
    f:metadata
    的页面最好只用于GET请求。@BalusC:Hello!我想知道,如果f:metadata最好只用于GET方法,那么推荐的方法是什么,以便能够使用POST方法在pre-render事件上执行方法?命令链接/按钮操作方法。没有
    f:metadata
    。因此,“通常的方法”:)检查
    FacesContext#isPostback()
    是否返回true,则这是一个(ajax)回发请求。