package ejbstrategy;
import javax.ejb.CreateException;
import java.rmi.RemoteException;
import javax.ejb.
EJBHome;
public interface StrategyServerHome extends
EJBHome {
public StrategyServer create() throws CreateException, RemoteException;
}
package ejbstrategy;
import javax.ejb.
EJBObject;
import java.rmi.RemoteException;
public interface StrategyServer extends
EJBObject {
public void setStrategy(
EJBStrategy strategy) throws RemoteException;
public Object handle(Event event) throws Exception, RemoteException;
}
package ejbstrategy;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.ejb.CreateException;
/**
* 渡されたStrategyを実行する
EJB
*/
public class StrategyServerBean
implements SessionBean {
/** セッションコンテキスト */
private SessionContext context;
/** 処理を委譲するオブジェクト */
private
EJBStrategy strategy;
/**
* strategyに処理を委譲する。
* @param event イベント名とパラメータ
* @exception Exception 例外
*/
public Object handle(Event event) throws Exception {
return strategy.handle(event);
}
/**
* strategyを設定する。
* @param strategy 戦略
*/
public void setStrategy(
EJBStrategy strategy) {
this.strategy = strategy;
}
public void ejbCreate() throws CreateException {}
public void setSessionContext(SessionContext context) {
this.context = context;
}
public void ejbRemove() {}
public void ejbActivate() {}
public void ejbPassivate() {}
}
package ejbstrategy;
import java.io.Serializable;
/**
* StrategyServer実行時に渡すオブジェクト
*/
public class Event implements Serializable {
/** イベント名 */
private String name;
/** データ */
private Object data;
public String getName() {
return name;
}
public Object getData() {
return data;
}
public void setName(String name) {
this.name = name;
}
public void setData(Object data) {
this.data = data;
}
}
package ejbstrategy;
import java.io.Serializable;
/**
* StrategyServerに渡すStrategyのインターフェース。
*/
public interface
EJBStrategy extends Serializable {
public Object handle(Event event) throws Exception;
}
package sample;
import ejbstrategy.*;
/**
* パターン説明の為のサンプルStrategy
*/
public class SampleStrategy implements
EJBStrategy {
public Object handle(Event event) {
Object result = null;
String name = event.getName();
if (name.equals("doLoad")) {
//DBを読み込む等の処理をする。サンプルなので適当な値を返すだけ
result = (String) event.getData() + " executed load"; //(a)
} else if (name.equals("doUpdate")) {
//DBを更新する等の処理をする。サンプルなので適当な値を返すだけ
result = (String) event.getData() + " executed update"; //(b)
}
return result;
}
}
package sample;
import java.util.*;
import java.io.*;
import javax.ejb.*;
import javax.rmi.*;
import javax.naming.*;
/**
*
EJBのlookup処理を行うユーティリティ
*/
public class
EJBHomeFactory {
private static
EJBHomeFactory instance = new EJBHomeFactory();
private Context context;
private Map homeMap = new HashMap();
private ResourceBundle bundle = ResourceBundle.getBundle("lookup");
private
EJBHomeFactory() {
try {
Properties prop = new Properties();
InputStream in = super.getClass().getResourceAsStream(
"/initialContext.properties");
prop.load(in);
context = new InitialContext(prop);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
public static
EJBHomeFactory getInstance() {
return instance;
}
public synchronized
EJBHome getEJBHome(String ejbName, Class homeClass) {
EJBHome home = null;
try {
home = (
EJBHome) homeMap.get(homeClass);
if (home != null) {
return home;
}
Object objref = context.lookup(bundle.getString(ejbName));
home = (
EJBHome)PortableRemoteObject.narrow(objref, homeClass);
homeMap.put(homeClass, home);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
return home;
}
}
package sample;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import ejbstrategy.*;
/**
* パターン説明の為のサンプル
Servlet
*/
public class Sample
Servlet extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=Shift_JIS";
public void doGet(Http
ServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
Object result1 = null;
Object result2 = null;
try {
EJBHomeFactory factory = EJBHomeFactory.getInstance(); //(1)
StrategyServerHome home = (StrategyServerHome)
factory.get
EJBHome("StrategyServer",
StrategyServerHome.class);
StrategyServer bean = home.create(); //(2)
SampleStrategy strategy = new SampleStrategy(); //(3)
bean.setStrategy(strategy); //(4)
Event event = new Event(); //(5)
event.setData("sampledata1");
event.setName("doLoad"); //(6)
result1 = bean.handle(event); //(7)
event.setData("sampledata2");
event.setName("doUpdate");
result2 = bean.handle(event); //(8)
} catch (Exception ex) {
throw new
ServletException(ex);
}
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>Sample
Servlet</title></head>");
out.println("<body bgcolor=\"#ffffff\">");
out.println("result1=" + result1);
out.println("result2=" + result2);
out.println("</body></html>");
}
}
/*
Sampleresult1=sampledata1 executed load
result2=sampledata2 executed update
とブラウザ上に表示されます。
[ソースを追ってみよう!]
Sample