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 2 如何使用应用程序范围的bean初始化DB?_Jsf 2 - Fatal编程技术网

Jsf 2 如何使用应用程序范围的bean初始化DB?

Jsf 2 如何使用应用程序范围的bean初始化DB?,jsf-2,Jsf 2,下面的bean代码来自一个。此练习旨在解决以下问题: 当您在第二个浏览器中打开项目时,将再次执行init(),因为bean是会话作用域,因此将创建重复的DB条目。 提示是使用应用程序范围的bean将数据初始化到DB中。 我找到了,但我就是想不出来。如果我使用@ManagedBean(eager=true)JSF页面将保持为空,数据库似乎没有初始化 package hoho; import java.io.Serializable; import java.util.GregorianCalen

下面的bean代码来自一个。此练习旨在解决以下问题:
当您在第二个浏览器中打开项目时,将再次执行
init()
,因为bean是会话作用域,因此将创建重复的DB条目。 提示是使用应用程序范围的bean将数据初始化到DB中。
我找到了,但我就是想不出来。如果我使用
@ManagedBean(eager=true)
JSF页面将保持为空,数据库似乎没有初始化

package hoho;

import java.io.Serializable;
import java.util.GregorianCalendar;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.UserTransaction;

@ManagedBean
@SessionScoped
public class ComedianHandler implements Serializable {

    @PersistenceContext
    private EntityManager em;

    @Resource
    private UserTransaction utx;


    private DataModel<Comedian> comedians;
    private Comedian currentComedian = new Comedian();

    public ComedianHandler() {
        Logger.getAnonymousLogger().log(Level.INFO, "Constructor ComedianHandler() called");    
    }

    /*
     * Known mistake: method is called per session, i.e. data will be
     * written into DB for EACH session
     * possible fix: put into application scoped bean
     */
    @PostConstruct
    public void init() {
        Logger.getAnonymousLogger().log(Level.INFO, "'init()' called");
        try {
            utx.begin();
            em.persist(new Comedian("Mario", "Barth", new GregorianCalendar(1972, 10, 1).getTime()));
            em.persist(new Comedian("Atze", "Schröder", new GregorianCalendar(1965, 8, 27).getTime()));
            em.persist(new Comedian("Dieter", "Nuhr", new GregorianCalendar(1960, 9, 29).getTime()));
            em.persist(new Comedian("Anke", "Engelke", new GregorianCalendar(1965, 11, 21).getTime()));
            em.persist(new Comedian("Kaya", "Yanar", new GregorianCalendar(1973, 4, 20).getTime()));
            comedians = new ListDataModel<Comedian>();
            comedians.setWrappedData(em.createNamedQuery("SelectComedians").getResultList());
            utx.comwith();          
        } catch (Exception e) {
            Logger.getAnonymousLogger().log(Level.SEVERE, "'init()' did not work", e.getMessage());
        }
    }

    public String save() {
        Logger.getAnonymousLogger().log(Level.INFO, "save() [1] with " + currentComedian +  "' called");
        try {
            utx.begin();
            currentComedian = em.merge(currentComedian);
            Logger.getAnonymousLogger().log(Level.INFO, "save() [2] with " + currentComedian+  "' called");
            em.persist(currentComedian);
            comedians.setWrappedData(em.createNamedQuery("SelectComedians").getResultList());
            utx.comwith();
        } catch (Exception e) {
            Logger.getAnonymousLogger().log(Level.SEVERE, "'save()' did not work", e.getMessage());
        }
        return "/display-comedians.xhtml";
    }


    public String change() {
        currentComedian = comedians.getRowData();
        Logger.getAnonymousLogger().log(Level.INFO, "change() with " + currentComedian);
        return "/comedian.xhtml";
    }

    public String newEntry() {
        currentComedian = new Comedian();
        Logger.getAnonymousLogger().log(Level.INFO, "newEntry()");
        return "/comedian.xhtml";
    }

    public String delete() {
        currentComedian = comedians.getRowData();
        Logger.getAnonymousLogger().log(Level.INFO, "delete() with " + currentComedian);
        try {
            utx.begin();
            currentComedian = em.merge(currentComedian);
            em.remove(currentComedian);
            comedians.setWrappedData(em.createNamedQuery("SelectComedians").getResultList());
            utx.comwith();
        } catch (Exception e) {
            Logger.getAnonymousLogger().log(Level.SEVERE, "'delete()' did not work", e.getMessage());
        }
        return null;
    }

    public DataModel<Comedian> getComedians() {
        return comedians;
    }


    public Comedian getCurrentComedian() {
        return currentComedian;
    }
    public void setCurrentComedian(Comedian currentComedian) {
        this.currentComedian = currentComedian;
    }


}
package-hoho;
导入java.io.Serializable;
导入java.util.GregorianCalendar;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.annotation.PostConstruct;
导入javax.annotation.Resource;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.SessionScoped;
导入javax.faces.model.DataModel;
导入javax.faces.model.ListDataModel;
导入javax.persistence.EntityManager;
导入javax.persistence.PersistenceContext;
导入javax.transaction.UserTransaction;
@ManagedBean
@会议范围
公共类ComdisianHandler实现可序列化{
@持久上下文
私人实体管理者;
@资源
私有用户事务utx;
私人喜剧演员;
私人喜剧演员currentComedian=新喜剧演员();
公共喜剧演员{
Logger.getAnonymousLogger().log(Level.INFO,“调用构造函数ComdianHandler()”);
}
/*
*已知错误:每个会话调用方法,即数据将
*为每个会话写入数据库
*可能的修复方法:放入应用程序范围的bean
*/
@施工后
公共void init(){
Logger.getAnonymousLogger().log(Level.INFO,“'init()'调用”);
试一试{
utx.begin();
em.persist(新喜剧演员(“马里奥”、“巴特”、新格雷戈里安·卡伦达(1972,10,1).getTime());
em.persist(新喜剧演员(“Atze”,“Schröder”,新格雷戈里安·卡伦达(1965,8,27).getTime());
em.persist(新喜剧演员(“迪特”、“努尔”、新格雷戈里安·卡伦达(1960、9、29).getTime());
em.persist(新喜剧演员(“Anke”,“Engelke”,新格雷戈里安·卡伦达(1965,11,21).getTime());
em.persist(新喜剧演员(“卡娅”、“亚纳尔”、新格雷戈里安·卡伦达(1973,4,20).getTime());
喜剧演员=新ListDataModel();
comedians.setWrappedData(em.createNamedQuery(“SelectComedians”).getResultList();
utx.comwith();
}捕获(例外e){
Logger.getAnonymousLogger().log(Level.SEVERE,“'init()'未工作”,例如getMessage());
}
}
公共字符串保存(){
Logger.getAnonymousLogger().log(Level.INFO,“save()[1]带“+currentComedian+”'调用”);
试一试{
utx.begin();
currentComedian=em.merge(currentComedian);
Logger.getAnonymousLogger().log(Level.INFO,“save()[2]带“+currentComedian+”'调用”);
em.persist(现任喜剧演员);
comedians.setWrappedData(em.createNamedQuery(“SelectComedians”).getResultList();
utx.comwith();
}捕获(例外e){
Logger.getAnonymousLogger().log(Level.SEVERE,“'save()'不起作用”,例如getMessage());
}
return“/显示喜剧演员.xhtml”;
}
公共字符串更改(){
currentComedian=comedians.getRowData();
Logger.getAnonymousLogger().log(Level.INFO,“change()”和“+currentComedian”);
return“/喜剧演员.xhtml”;
}
公共字符串newEntry(){
当前喜剧演员=新喜剧演员();
Logger.getAnonymousLogger().log(Level.INFO,“newEntry()”);
return“/喜剧演员.xhtml”;
}
公共字符串删除(){
currentComedian=comedians.getRowData();
Logger.getAnonymousLogger().log(Level.INFO,“delete()”和“+currentComedian”);
试一试{
utx.begin();
currentComedian=em.merge(currentComedian);
em.remove(现任喜剧演员);
comedians.setWrappedData(em.createNamedQuery(“SelectComedians”).getResultList();
utx.comwith();
}捕获(例外e){
Logger.getAnonymousLogger().log(Level.SEVERE,“'delete()'不起作用”,例如getMessage());
}
返回null;
}
公共数据模型getComedians(){
回归喜剧演员;
}
公共喜剧演员{
喜剧演员;
}
公共喜剧演员(喜剧演员){
this.currentComedian=currentComedian;
}
}
facelets代码:

<!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:f="http://java.sun.com/jsf/core">

<head>
    <title>Display Comedians</title>
    <link rel="stylesheet" href="style.css" type="text/css" />
</head>

<body>
    <h:form>
        <h:dataTable value="#{comedianHandler.comedians}" var="comedian"
                rowClasses="odd,even" headerClass="header" footerClass="footer">
            <f:facet name="header">Display all Comedians</f:facet>
            <f:facet name="footer">#{resourceBundle.copyright}</f:facet>
            <h:column>
                <f:facet name="header">First Name</f:facet>
                #{comedian.firstName}
            </h:column>
            <h:column>
                <f:facet name="header">Last Name</f:facet>
                #{comedian.lastname}
            </h:column>
            <h:column>
                <f:facet name="header">Day of Birth</f:facet>
                <h:outputText value="#{comedian.dayOfBirth}">
                    <f:convertDateTime pattern="dd.MM.yyyy"/>
                </h:outputText>
            </h:column>
            <h:column>
                <h:commandButton action="#{comedianHandler.change}" value="Change" />
            </h:column>
            <h:column>
                <h:commandButton action="#{comedianHandler.delete}" value="Delete" />
            </h:column>
        </h:dataTable>
        <h:commandButton action="#{comedianHandler.newEntry}" value="new Entry" style="width: 80px; margin: 10px 2px 2px 2px;" />
    </h:form>
</body>

</html>

表演喜剧演员
展示所有喜剧演员
#{resourceBundle.版权所有}
名字
#{喜剧演员的名字}
姓
#{喜剧演员,姓氏}
出生日期

如果希望bean位于应用程序范围而不是会话范围,那么只需将
@SessionScoped
更改为
@ApplicationScoped
?@BalusC-Hmm。。。听起来绝对合理。重新加载页面时数据仍在复制,这有什么意义吗?我在问题中添加了facelets代码。