Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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
Java 简单的单例EJB示例_Java_Ejb - Fatal编程技术网

Java 简单的单例EJB示例

Java 简单的单例EJB示例,java,ejb,Java,Ejb,我正在学习EJB,并使用GlassFish 4编写了一个示例程序,但由于某些原因,它不起作用 index.jsp: <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ page import="javax.ejb.EJB" %> <%@ page import="ejbtest.utility.Utility" %> <%@ page import="ejbtest.action.*" %

我正在学习EJB,并使用GlassFish 4编写了一个示例程序,但由于某些原因,它不起作用

index.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ page import="javax.ejb.EJB" %>
<%@ page import="ejbtest.utility.Utility" %>
<%@ page import="ejbtest.action.*" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>EJB Test</title>
    </head>
    <body>
        <%
            try {
                Utility utility = new Utility();
                out.println("count: " + utility.getCount() + "<br/><br/>");
                Trigger1 trigger1 = new Trigger1();
                out.println("trigger1 count: " + trigger1.getTriggerCount());
            } catch (NullPointerException npe) {
                out.println("Nullpointer caught");
            }
        %>
    </body>
</html>
package ejbtest.utility;

import javax.ejb.Singleton;
import javax.ejb.Startup;

@Startup
@Singleton
public class Utility {

    int count;

    public Utility() throws NullPointerException {
        count = 0;
        count++;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}
package ejbtest.action;

import ejbtest.utility.Utility;
import javax.faces.bean.ApplicationScoped;
import javax.inject.Inject;

@ApplicationScoped
public class Trigger1 {

    @Inject
    Utility utility;

    public Integer getTriggerCount() {
        return utility.getCount();
    }

}
触发器1.java

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ page import="javax.ejb.EJB" %>
<%@ page import="ejbtest.utility.Utility" %>
<%@ page import="ejbtest.action.*" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>EJB Test</title>
    </head>
    <body>
        <%
            try {
                Utility utility = new Utility();
                out.println("count: " + utility.getCount() + "<br/><br/>");
                Trigger1 trigger1 = new Trigger1();
                out.println("trigger1 count: " + trigger1.getTriggerCount());
            } catch (NullPointerException npe) {
                out.println("Nullpointer caught");
            }
        %>
    </body>
</html>
package ejbtest.utility;

import javax.ejb.Singleton;
import javax.ejb.Startup;

@Startup
@Singleton
public class Utility {

    int count;

    public Utility() throws NullPointerException {
        count = 0;
        count++;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}
package ejbtest.action;

import ejbtest.utility.Utility;
import javax.faces.bean.ApplicationScoped;
import javax.inject.Inject;

@ApplicationScoped
public class Trigger1 {

    @Inject
    Utility utility;

    public Integer getTriggerCount() {
        return utility.getCount();
    }

}
不需要的输出

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ page import="javax.ejb.EJB" %>
<%@ page import="ejbtest.utility.Utility" %>
<%@ page import="ejbtest.action.*" %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>EJB Test</title>
    </head>
    <body>
        <%
            try {
                Utility utility = new Utility();
                out.println("count: " + utility.getCount() + "<br/><br/>");
                Trigger1 trigger1 = new Trigger1();
                out.println("trigger1 count: " + trigger1.getTriggerCount());
            } catch (NullPointerException npe) {
                out.println("Nullpointer caught");
            }
        %>
    </body>
</html>
package ejbtest.utility;

import javax.ejb.Singleton;
import javax.ejb.Startup;

@Startup
@Singleton
public class Utility {

    int count;

    public Utility() throws NullPointerException {
        count = 0;
        count++;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}
package ejbtest.action;

import ejbtest.utility.Utility;
import javax.faces.bean.ApplicationScoped;
import javax.inject.Inject;

@ApplicationScoped
public class Trigger1 {

    @Inject
    Utility utility;

    public Integer getTriggerCount() {
        return utility.getCount();
    }

}
计数:1

空指针捕捉


我认为您只能在其他
会话bean
消息驱动bean
中注入
EJB
。在您的代码中,您尝试将它们注入到简单的java类中。您可以使用
JNDI查找
在java类中引用它们

如果类
Trigger1
Trigger2
Utility
Bean不在同一(
JavaEE
)应用程序中,那么您需要
Remote
访问,因此需要一个接口视图。然后,您可以按如下方式访问
Singleton
Bean:


如果您的
Trigger1
Trigger2
类与您的
实用工具
Bean处于相同的应用程序中,那么您已经提供的本地无接口视图就足够了。您可以像这样通过
Injection
访问
Singleton
Bean,但必须使类
会话
Bean(最好是无状态的)。然后您应该再次通过
JNDI查找
从主方法访问它们

首先,在标准JVM中启动EJB。但是EJB只能存在于EJB容器中。当您仅使用main方法启动应用程序时,将忽略所有EJB注释。您需要像glassfish或JBoss这样的应用服务器来测试您的应用程序。
这里是您的改进示例:

Trigger1.java

package ejbtest.action;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import ejbtest.utility.Utility;

@Stateless
public class Trigger1 {

    @EJB
    private Utility utility;

    public Integer getTriggerCount() {
        return utility.getCount();
    }
}
package ejbtest.utility;

import javax.annotation.PostConstruct;
import javax.ejb.Singleton;

@Singleton
public class Utility {
    int count = 0;

    @PostConstruct
    public void init() {
        count++;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}
Utility.java

package ejbtest.action;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import ejbtest.utility.Utility;

@Stateless
public class Trigger1 {

    @EJB
    private Utility utility;

    public Integer getTriggerCount() {
        return utility.getCount();
    }
}
package ejbtest.utility;

import javax.annotation.PostConstruct;
import javax.ejb.Singleton;

@Singleton
public class Utility {
    int count = 0;

    @PostConstruct
    public void init() {
        count++;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}
index.jsp

<%@page import="ejbtest.action.Trigger1"%>
<%@page import="ejbtest.utility.Utility"%>
<%@page import="javax.naming.InitialContext"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>EJB Test</title>
    </head>
    <body>
    <%
        InitialContext ic = new InitialContext();
        Utility utility = (Utility) ic.lookup("java:module/Utility");
        out.println("count: " + utility.getCount() + "<br/><br/>");
        Trigger1 trigger1 = (Trigger1) ic.lookup("java:module/Trigger1");
        out.println("trigger1 count: " + trigger1.getTriggerCount());
    %>
    </body>
</html>

EJB测试

你能告诉我什么样的代码需要修改吗?因为我对所有这些术语都还不太熟悉,所以我在Tomcat 7和GlassFish 4中尝试将其作为一个JSP脚本而不是一个主类,但我得到了同样的东西…show scriplet code。如果您的操作与此处的new Trigger1()相同,那么它是错误的。由您自己创建的对象在EJB容器外部创建,并忽略EJB注释。您的Trigger1对象必须由EJB容器创建。正如我所说的,您使用新操作符来获取EJB。这是错误的,您应该使用初始上下文为您的EJB获取链接。比如:InitialContext ic=newinitialcontext();实用工具=(实用工具)ic.lookup(“实用工具”);如果我使用的是EJB3.2,我就不能使用注释来进行
查找吗?我以为这就是
@Local
@EJB
@Remote
等的目的?看看我的编辑。您可以在一个EJB注入其他EJB的过程中使用注释。但如果在jsp页面中使用EJB,则必须使用InitialContext