在 POST 请求后重新创建 ViewScoped bean 时重新执行 f:viewAction

2024-02-08

环境:JSF 2.2 与 Mojarra 2.2.12 & CDI ViewScoped beans &javax.faces.STATE_SAVING_METHOD set to client.

为了正确初始化我的bean,感谢<f:viewParam ... />,我想(重新)执行<f:viewAction action="#{bean.onLoad}" />当我的ViewScoped豆是重新创造了(视图被从 LRU 中推出,参见com.sun.faces.numberOfLogicalViews https://stackoverflow.com/questions/4105439/com-sun-faces-numberofviewsinsession-vs-com-sun-faces-numberoflogicalviews) 在 POST 请求之后。

<f:metadata>
    <f:viewParam maxlength="100" name="name" value="#{bean.file}" />
    <f:viewAction action="#{bean.onLoad}"  />
</f:metadata>

<o:form includeRequestParams="true">
     <!-- action can only work if onLoad has been called -->
     <p:commandButton action="#{bean.action}" />
</o:form>

有任何想法吗?

Notes:

  • 我知道postBack="true"但它不适合作为bean.onLoad()将会被召唤every发布请求。
  • 我不能打电话onLoad() in @PostConstruct方法,因为值尚未设置viewParam然而(参见何时使用 f:viewAction 与 PostConstruct? https://stackoverflow.com/questions/9844526/when-to-use-fviewaction-prerenderview-versus-postconstruct).

我知道postBack="true"但它不适合,因为每个 POST 请求都会调用 bean.onLoad() 。

你可以只使用 ELonPostback属性,您可以在其中检查模型值和/或请求参数是否存在。

如果需要模型值,则只需检查它是否存在:

<f:metadata>
    <f:viewParam maxlength="100" name="name" value="#{bean.file}" required="true" />
    <f:viewAction action="#{bean.onLoad}" onPostback="#{empty bean.file}" />
</f:metadata>

如果不需要模型值,则还要检查请求参数:

<f:metadata>
    <f:viewParam maxlength="100" name="name" value="#{bean.file}" />
    <f:viewAction action="#{bean.onLoad}" onPostback="#{empty bean.file and not empty param.name}" />
</f:metadata>

我不能打电话onLoad() in @PostConstruct方法,因为 viewParam 尚未设置值。

鉴于存在<o:form> http://showcase.omnifaces.org/components/form在你的代码片段中,我看到你正在使用OmniFaces http://omnifaces.org。同一个实用程序库提供了 CDI@Param http://showcase.omnifaces.org/cdi/Param注解的目的是在 HTTP 请求之前注入、转换和验证 HTTP 请求参数@PostConstruct runs.

整个<f:viewParam><f:viewAction>因此可以替换如下:

@Inject @Param(name="name", validators="javax.faces.Length", validatorAttributes=@Attribute(name="maximum", value="100"))
private String file;

@PostConstruct
public void onLoad() {
    if (!Faces.isValidationFailed()) {
        // ...
    }
}

或者,如果您手头有 Bean Validation(又名 JSR303):

@Inject @Param(name="name") @Size(max=100)
private String file;

@PostConstruct
public void onLoad() {
    if (!Faces.isValidationFailed()) {
        // ...
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 POST 请求后重新创建 ViewScoped bean 时重新执行 f:viewAction 的相关文章

  • 添加@Named时@SessionScoped不起作用

    考虑以下支持 bean import javax faces bean ManagedBean import javax faces bean SessionScoped ManagedBean SessionScoped public c
  • 将 Flash 文件上传与 JSF 集成

    我看到我们可以通过flash文件上传来上传多个文件 喜欢SWF上传 http code google com p swfupload or YUI上传器 http yuilibrary com yui docs uploader 是否可以将
  • 来自 jsp:include 的 JSF 1.2 自定义组件

    在开始回答我的问题之前 我先说一下我的不幸的局限性 我使用的是 JSF 1 2 而不是 2 所以没有复合组件 我使用 JSP 代替 Facelets 进行渲染 所以这些复合组件也没有 我不允许使用任何第三方标签库 richFaces ice
  • 使用条件渲染时,未在请求作用域 bean 中处理输入值

    我知道此类问题已在这里被问过数百万次 但我在相关帖子中找不到我的问题的解决方案 JSF 1 2 我有一个请求范围的 bean 其方法用作 valueChangeListener class DoStuff public void step1
  • 当用户使用相同的凭据登录两次时如何使用户会话无效

    我正在使用带有 Richfaces 和 Facelets 的 JSF 1 2 我有一个应用程序 其中包含许多会话范围的 Bean 和一些应用程序 Bean 假设用户使用 Firefox 登录 创建一个会话 ID A 然后他打开 Chrome
  • JSF - 实施受限页面过滤器

    我正在关注 BalusC 的回答JSF 2 0 如何获取在浏览器地址栏中输入的 URL https stackoverflow com questions 4105263 jsf 2 0 how to get the url that is
  • 如何在 h:outputText 中写入单引号和双引号

    如何在 value 属性中写入单引号和双引号h outputText 这应该适用于标准语法 JSP 和 XML 视图技术
  • 沉默 FullAjaxExceptionHandler

    所以在面对可怕的事情之后javax faces application ViewExpiredException 我不得不去互联网上寻找合适的解决方案 幸运的是 解决方案很容易获得 我继续采用了 OmniFacesFullAjaxExcep
  • JSF 定制转换器

    我有一个像这样的自定义转换器 Override public Object getAsObject FacesContext facesContext UIComponent component String str System out
  • 从 JavaScript 将参数传递给 p:remoteCommand

    我想将值传递给remoteCommand来自 JavaScript 如果这是可能的 我该如何做到这一点以及如何在支持 bean 中接收它们 对的 这是可能的 如何执行此操作取决于 PrimeFaces 版本 你可以在PrimeFaces 用
  • 如何让JSF渲染符合XHTML 1.0严格?

    我需要开发一个必须符合 斯坦卡法案 Legge Stanca 的网络应用程序 到目前为止 我已经使用了 jsf2 0 Mojarra primefaces 3 2 但在使用时遇到了验证问题 特别是对于空表单页面 生成以下 html 代码
  • JSF 2:如何在同一输入中显示不同的ajax状态?

    当每个字段失去焦点时 我想验证表单中的每个字段 当发生这种情况时 我希望发生以下操作 1 在字段的右侧出现一个图像 一个 gif 表示系统正在检查用户输入 2 完成后 会在右侧出现另一个 gif 取决于输入 例如 success gif 或
  • CDI Bean 访问 Spring bean?

    我知道这听起来很奇怪 将 CDI 焊接 和 Spring 混合用于控制器 但想象一下这种情况 有了CDI 我可以利用 ConversationScoped 这是我的要求之一 到目前为止我不知道我是否可以在这种范围内使用spring 因为如果
  • Logger,从@Inject转换为生产者

    我在实现像示例这样的登录界面时遇到问题使用 JSF 2 1 PrimeFaces 3 5 EJB 3 1 JPA ORM EclipseLink JAAS MySQL 的简单 CRUD Web 应用程序 http www simtay co
  • 如何保留primefaces数据表的排序顺序?

    在我的项目中 我使用 ViewScoped bean 并且有两个页面 一个是主页 另一个是详细信息页面 在主页中 我有一个具有排序和过滤功能的 primefaces 数据表 数据表的每一行都有一个链接 如果我对列进行排序 那么它就可以正常工
  • 身份验证后以编程方式添加角色

    我有以下 JSF 2 1 登录表单 在 Glassfish 3 1 中运行
  • JSF 2.0 request.getParameter 返回编码错误的字符串

    我正在用 JSF 2 0 编写一个应用程序 它支持多种语言 其中包括带有特殊字符的语言 我使用 String value request getParameter name 和 POST 方法 页面编码设置为 UTF 8 应用程序部署在 a
  • 之间有什么区别?

    有什么区别
  • JSF 将 ui:param 与复合组件结合起来

    你以前通过这个论坛救了我很多次 但现在我真的被困住了 现在不知道该去哪里搜索了 我总是收到以下错误消息 警告级别 但方法也未正确执行 javax el PropertyNotFoundException Target Unreachable
  • 未捕获的错误:语法错误,无法识别的表达式:不支持的伪:[重复]

    这个问题在这里已经有答案了 我有一个 txtBox 它的 id 是 beginDateTxt 但 jsf 做到了j idt8 beginDateTxt 在jquery中我尝试像那样达到它

随机推荐