📄 traderbean.java
字号:
//定义本类在包examples.ejb.basic.statefulSession中
package examples.ejb.basic.statefulSession;
//本类用到的其他类。javax.ejb.*是开发EJB应用需要的类库。javax.naming.*是实现JNDI服务需要的类库。
import javax.ejb.CreateException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
/**
* TraderBean 是一个有状态EJB,它演示了如何:
* 在会话过程中如何自动保持用户的状态
* 从bean环境中获取参数
* 用户定义异常
*/
//这个类是会话Bean,因此必须实现接口 SessionBean
public class TraderBean implements SessionBean {
//设置是否打印控制台
static final boolean VERBOSE = true;
//声明会话上下文变量
private SessionContext ctx;
//声明环境上下文变量
private Context environment;
//声明与业务相关的变量:交易结算
private double tradingBalance;
/**
* 设置会话上下文变量
*
* @参数 ctx SessionContext Context for session
*/
public void setSessionContext(SessionContext ctx) {
log("setSessionContext called");
this.ctx = ctx;
}
/**
* 这是本类必须实现的方法,在本例中没有用到
*
*/
public void ejbActivate() {
log("ejbActivate called");
}
/**
* 这是本类必须实现的方法,在本例中没有用到
*/
public void ejbPassivate() {
log("ejbPassivate called");
}
/**
* 这是本类必须实现的方法,在本例中没有用到
*/
public void ejbRemove() {
log("ejbRemove called");
}
/**
* 这个方法与"TraderHome.java"中定义的主接口中的"create"方法相对应
* 两个方法的参数相同。当客户端调用主接口的"TraderHome.create()"方法时,
* 容器会分配一个EJBean实例,并调用它的"ejbCreate()"方法。
*
* @异常 javax.ejb.CreateException 创建EJBean出错时抛出的异常
* @参看 examples.ejb.basic.statefulSession.Trader
*/
public void ejbCreate() throws CreateException {
log("ejbCreate called");
try {
//初始化JNDI名称服务上下文
InitialContext ic = new InitialContext();
//从配置文件(ejb-jar.xml)中获取环境变量上下文,相当于初始化参数
environment = (Context) ic.lookup("java:comp/env");
} catch (NamingException ne) {
//如果名称服务器异常,则抛出 CreateException异常
throw new CreateException("Could not look up context");
}
//业务变量赋初值
this.tradingBalance = 0.0;
}
/**
* 购买指定用户和股票类别、数量的股票。
*
* @参数 customerName 顾客名
* @参数 stockSymbol 股票代码
* @参数 shares 购买股票的数量
* @返回 TradeResult 交易结果对象
* @异常 ProcessingErrorException
* 购买操作出错时抛出的异常
* @异常 RemoteException 当系统通讯发生故障时抛出
*/
public TradeResult buy(String customerName, String stockSymbol, int shares)
throws ProcessingErrorException
{
//控制台提示
log("buy (" + customerName + ", " + stockSymbol + ", " + shares + ")");
//从环境变量中获取价格参数
double price = getStockPrice(stockSymbol);
//计算本次交易结算
tradingBalance -= (shares * price); // subtract purchases from cash account
//返回本次交易结果对象
return new TradeResult(shares, price, TradeResult.BUY);
}
/**
* 出售指定用户和股票类别、数量的股票。
*
* @参数 customerName 顾客名
* @参数 stockSymbol 股票代码
* @参数 shares 出售股票的数量
* @返回 TradeResult Trade Result
* @异常 ProcessingErrorException
* 购买操作出错时抛出的异常
* @异常 RemoteException 当系统通讯发生故障时抛出
*/
public TradeResult sell(String customerName, String stockSymbol, int shares)
throws ProcessingErrorException
{
//控制台提示
log("sell (" + customerName + ", " + stockSymbol + ", " + shares + ")");
//从环境变量中获取价格参数
double price = getStockPrice(stockSymbol);
//计算本次交易结算
tradingBalance += (shares * price);
//返回本次交易结果对象
return new TradeResult(shares, price, TradeResult.SELL);
}
/**
* Returns the current balance of a trading session.
*
* @返回 double 结算值
*/
public double getBalance() {
return tradingBalance;
}
/**
* 返回给定股票的价格
*
* @参数 stockSymbol String 股票代号
* @返回 double 股票价格
* @异常 examples.ejb.basic.statefulSession.ProcessingErrorException
* 当获取参数发生异常时抛出
*/
public double getStockPrice(String stockSymbol)
throws ProcessingErrorException
{
try {
//从环境变量上下文中查找给定股票代号的股票价格
return ((Double) environment.lookup(stockSymbol)).doubleValue();
} catch (NamingException ne) {
//当出现问题时,生成自定义的异常实例ProcessingErrorException,并抛出
throw new ProcessingErrorException ("Stock symbol " + stockSymbol +
" does not exist");
} catch (NumberFormatException nfe) {
// ejb-jar.xml文件中含非有效数字时,抛出这个异常,
// 生成自定义的异常实例ProcessingErrorException,并抛出
throw new ProcessingErrorException("Invalid price for stock "+stockSymbol);
}
}
//控制台输出
private void log(String s) {
if(VERBOSE) {
System.out.println(s);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -