当前位置: 首页 > 面试题库 >

JSTL c:forEach导致@ViewScoped bean在每个请求上调用@PostConstruct

韦飞尘
2023-03-14
问题内容

再次,我看到即使没有使用绑定属性,@ PostConstruct也会每次触发。看到这个代码:-

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:c="http://java.sun.com/jsp/jstl/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <c:forEach var="item" items="#{TestBean.listItems}">
                <h:outputText value="#{item}"/>
            </c:forEach>
            <h:commandButton value="Click" actionListener="#{TestBean.actionListener}"/>
        </h:form>
    </h:body>
</html>

这是JSF中最简单的bean:

package managedBeans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean(name="TestBean")
@ViewScoped
public class TestBean implements Serializable {

    private List<String> listItems;

    public List<String> getListItems() {
        return listItems;
    }

    public void setListItems(List<String> listItems) {
        this.listItems = listItems;
    }

    public TestBean() {

    }

    @PostConstruct
    public void init(){
        System.out.println("Post Construct fired!");
        listItems = new ArrayList<String>();
        listItems.add("Mango");
        listItems.add("Apple");
        listItems.add("Banana");
    }

    public void actionListener(){
        System.out.println("Action Listener fired!");
    }

}

您是否看到任何会导致每次触发postconstruct回调的行为?我认为JSF 2.0非常不稳定。如果每次都要触发PostConstruct
@ViewScoped的作用是什么。为什么不只使用@RequestScoped?我以为我在申请中犯了一些错误。但是,当我在JSF中创建最简单的方法时,仍然会收到此错误。我是否不了解JSF的范围?还是他们测试不正确?此外,如果删除c:forEach并将其替换为ui:repeat,则可以正常工作。

等待答复以确认是错误还是有意阻止程序员使用jstl?


问题答案:

这确实是JSF2中的错误。这是鸡肉问题。视图范围的Bean以JSF视图状态存储。因此,只有在恢复视图阶段之后,视图范围的Bean才可用。但是,JSTL标记在还原视图阶段运行,而视图范围的bean尚不可用。这将导致创建一个全新的视图范围bean实例,然后将其替换为存储在还原的JSF视图状态中的实际视图范围bean。

据报道,这是JSF问题1665和JSF规范问题787,该问题已针对JSF
2.2修复并移植回Mojarra 2.1.18。因此,只需升级到最低的Mojarra 2.1.18即可。

如果您不能升级,那么最好的选择是在请求/会话/应用程序范围的bean上专门使用JSTL标记,或者寻找满足特定功能要求的替代方法。您可以替换<c:forEach><ui:repeat>的你已经发现了。



 类似资料:
  • 我的观点是: 是我的豆子:

  • 问题内容: 我有一个带有可观察列表的ComboBox,该列表随用户键入字符或进行选择而更新。当我从ComboBox中选择一个项目并调用我的侦听器事件,然后从ComboBox的ObservableList中调用clear()方法时,引起了我遇到的问题。 完整代码 现在,当我收到错误消息时,ObservableList会按原样出现,但我仍然收到此异常。尝试调试此错误导致我的IDE在调用setAll(运

  • 问题内容: 如何在特定时间段内调用Ajax请求?我应该使用Timer插件还是jQuery为此提供插件? 问题答案: 您可以使用内置的javascript setInterval。 或者如果您是更简洁的类型…

  • 我有一个jersey服务器的例子,它适用于XML,但不适用于JSON。 如果我将此xml请求作为发送到服务器,则一切正常, 作为) 我在utilities-online.info将其翻译为JSON,并将其作为发送到相同的URL,具有相同的参数,但收到错误“400错误请求” 环境: Tomcat 7 球衣2.17 我尝试过的: 将添加到init-参数 启用init-参数为 添加了依赖项//

  • 在我的nodejs应用程序中,我有一个包含以下内容的文件: index.js目录: 向上编码most每60秒检查一次my功能。此代码正常工作,但存在一个问题,例如,当5名用户在我的应用程序中联机时,我在控制台中看到重复60秒后的

  • 如何在JMETER中创建一个测试,该测试将: 总共提出100个请求,但是使 每4次请求站点A和 每5次请求站点B