JSTL c: forEach bewirkt, dass @ViewScoped Bean bei jeder Anforderung @PostConstruct aufruf

Again Ich sehe, dass das @PostConstruct jedes Mal ausgelöst wird, obwohl kein Bindungsattribut verwendet wird. Siehe diesen Code: -

<?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>

Und dies ist die einfachste mögliche Bean in JSF: -

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!");
    }

}

Sehen Sie ein Verhalten, das dazu führen sollte, dass der Rückruf nach der Konstruktion jedes Mal ausgelöst wird? Ich denke, JSF 2.0 ist sehr instabil. Wenn PostConstruct jedes Mal ausgelöst werden muss, welchen Zweck erfüllt @ViewScoped? Warum nicht nur @RequestScoped verwenden? Ich dachte, ich hätte einen Fehler in meiner Bewerbung gemacht. Aber als ich das einfachste in JSF erstellt habe, erhalte ich immer noch diesen Fehler. Verstehe ich die Bereiche von JSF nicht? oder testen sie es nicht richtig? Wenn Sie außerdem c: forEach entfernen und durch ui: repeat ersetzen, funktioniert es einwandfrei.

Warten Sie auf Antworten, um zu bestätigen, ob es sich um einen Fehler handelt, oder um zu verhindern, dass die Programmierer jstl verwenden?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage