首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 ><f:metadata>、<f:viewParam>和<f:viewAction>有什么用途?

<f:metadata>、<f:viewParam>和<f:viewAction>有什么用途?
EN

Stack Overflow用户
提问于 2011-06-17 03:56:21
回答 2查看 135.3K关注 0票数 156

有没有人能说明一下,我们如何在一般情况下,或者在现实世界中使用这个片段?

代码语言:javascript
复制
<f:metadata>
    <f:viewParam id="id" value="#{bean.id}" />
    <f:viewAction action="#{bean.init}" />
</f:metadata>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-17 04:08:14

进程获取参数

管理GET参数的设置、转换和验证。它类似于<h:inputText>,但用于GET参数。

下面的例子

代码语言:javascript
复制
<f:metadata>
    <f:viewParam name="id" value="#{bean.id}" />
</f:metadata>

基本上执行以下操作:

  • 通过名称id.
  • Convert获取请求参数值,并在必要时进行验证(您可以像<h:inputText>)
  • If转换一样使用requiredvalidatorconverter属性并在其中嵌套<f:converter><f:validator>,验证成功后,将其设置为#{bean.id}值表示的bean属性,或者如果缺少value属性,则将其设置为名称上的请求属性,以便视图中的D19可用。<代码>H220F221

因此,当您以foo.xhtml?id=10打开页面时,就在呈现视图之前,以这种方式在bean中设置参数值10

对于验证,下面的示例将参数设置为required="true",并且只允许10到20之间的值。任何验证失败都将导致显示一条消息。

代码语言:javascript
复制
<f:metadata>
    <f:viewParam id="id" name="id" value="#{bean.id}" required="true">
        <f:validateLongRange minimum="10" maximum="20" />
    </f:viewParam>
</f:metadata>
<h:message for="id" />

对GET参数执行业务操作

为此,您可以使用。

代码语言:javascript
复制
<f:metadata>
    <f:viewParam id="id" name="id" value="#{bean.id}" required="true">
        <f:validateLongRange minimum="10" maximum="20" />
    </f:viewParam>
    <f:viewAction action="#{bean.onload}" />
</f:metadata>
<h:message for="id" />

使用

代码语言:javascript
复制
public void onload() {
    // ...
}

然而,<f:viewAction>是JSF2.2之后的新特性( <f:viewParam>从JSF2.0就已经存在了)。如果你不能升级,那么你最好的选择就是使用。

代码语言:javascript
复制
<f:event type="preRenderView" listener="#{bean.onload}" />

但是,在每次请求时都会调用它。您需要显式检查请求是否不是回发:

代码语言:javascript
复制
public void onload() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // ...
    }
}

当您还想跳过“转换/验证失败”的情况时,请执行以下操作:

代码语言:javascript
复制
public void onload() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {
        // ...
    }
}

以这种方式使用<f:event>本质上是一种变通方法,这正是JSF2.2中引入<f:viewAction>的原因。

将视图参数传递给下一个视图

您可以通过将includeViewParams属性设置为true或添加includeViewParams=true请求参数来“传递”导航链接中的视图参数。

代码语言:javascript
复制
<h:link outcome="next" includeViewParams="true">
<!-- Or -->
<h:link outcome="next?includeViewParams=true">

在上面的<f:metadata>示例中,它基本上生成以下链接

代码语言:javascript
复制
<a href="next.xhtml?id=10">

使用原始参数值。

这种方法只要求next.xhtml在同一个参数上也有一个<f:viewParam>,否则它不会被传递。

在JSF中使用GET表单

<f:viewParam>也可以与“普通超文本标记语言”GET表单结合使用。

代码语言:javascript
复制
<f:metadata>
    <f:viewParam id="query" name="query" value="#{bean.query}" />
    <f:viewAction action="#{bean.search}" />
</f:metadata>
...
<form>
    <label for="query">Query</label>
    <input type="text" name="query" value="#{empty bean.query ? param.query : bean.query}" />
    <input type="submit" value="Search" />
    <h:message for="query" />
</form>
...
<h:dataTable value="#{bean.results}" var="result" rendered="#{not empty bean.results}">
     ...
</h:dataTable>

基本上使用这个@RequestScoped bean:

代码语言:javascript
复制
private String query;
private List<Result> results;

public void search() {
    results = service.search(query);
}

请注意,<h:message>是用于<f:viewParam>的,而不是普通的HTML <input type="text">!还要注意,当#{bean.query}为空时,输入值显示为#{param.query},因为如果不这样做,当出现验证或转换错误时,提交的值根本不会显示。请注意,这个构造对于JSF输入组件是无效的(它已经“在幕后”这样做了)。

另请参阅:

票数 295
EN

Stack Overflow用户

发布于 2020-09-12 23:41:06

使用viewParam和includeViewParams=true将参数从视图发送到其他视图,从发送者视图发送到接收者视图

发件人中的

  1. 声明要发送的参数。我们可以发送String,Object,…

Sender.xhtml

代码语言:javascript
复制
<f:metadata>
      <f:viewParam name="ID" value="#{senderMB._strID}" />
</f:metadata>

单击按钮我们将发送参数ID,它将包含在带有senderMB._arrData返回字符串

  1. event的“includeViewParams=true”中单击按钮触发senderMB.clickBtnDetail( dto )

Sender.xhtml

代码语言:javascript
复制
<p:dataTable rowIndexVar="index" id="dataTale"value="#{senderMB._arrData}" var="dto">
      <p:commandButton action="#{senderMB.clickBtnDetail(dto)}" value="見る" 
      ajax="false"/>
</p:dataTable>

在senderMB.clickBtnDetail(dto)中,我们使用从按钮事件(dto)中获得的参数来赋值_strID,这里是Sender_DTO并赋值给senderMB._strID

代码语言:javascript
复制
Sender_MB.java
    public String clickBtnDetail(sender_DTO sender_dto) {
        this._strID = sender_dto.getStrID();
        return "Receiver?faces-redirect=true&includeViewParams=true";
    }

单击该链接时,该链接将变为http://localhost:8080/my_project/view/Receiver.xhtml?*ID=12345*

接收器中的

  1. Get viewParam Receiver.xhtml In Receiver我们声明f:viewParam要从get request (receive)中获取参数,接收方的参数名称必须与
  2. (ViewParam)

相同

Receiver.xhtml

代码语言:javascript
复制
<f:metadata><f:viewParam name="ID" value="#{receiver_MB._strID}"/></f:metadata>

它将从发送者视图中获取参数ID并分配给receiver_MB._strID

  1. 在接收器中使用viewParam,我们希望在页面渲染之前在sql查询中使用这个参数,这样我们就可以使用preRenderView事件。我们将不使用构造函数,因为构造函数将在接收到viewParam之前被调用,因此我们添加了

Receiver.xhtml

代码语言:javascript
复制
<f:event listener="#{receiver_MB.preRenderView}" type="preRenderView" />

into f:metadata标签

Receiver.xhtml

代码语言:javascript
复制
<f:metadata>
<f:viewParam name="ID" value="#{receiver_MB._strID}" />
<f:event listener="#{receiver_MB.preRenderView}"
            type="preRenderView" />
</f:metadata>

现在我们想在我们的read数据库方法中使用这个参数,它可以使用

代码语言:javascript
复制
Receiver_MB.java
public void preRenderView(ComponentSystemEvent event) throws Exception {
        if (FacesContext.getCurrentInstance().isPostback()) {
            return;
        }
        readFromDatabase();
    }
private void readFromDatabase() {
//use _strID to read and set property   
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6377798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档