วันอังคารที่ 9 กันยายน พ.ศ. 2551

Basick ZK Framework ตอนที่ 4 Config ZK ให้เรียก EJB [On Java File]

เหมือนกับตอนก่อนหน้านี้น่ะครับ แต่อันนี้จะเรียกผ่าน Java เลย ซึ่งที่ผมลอง มีได้ตามนี้ครับ
  1. ถ้าเรียกแบบ Remote EJB สามารถเรียกได้อยู๋แล้วนะครับ คือเรียกอบบบอก IP ไปเลยว่าจะไปที่ไหน สามารถเรียกได้ไม่มีปัญหาครับ
  2. เรียก Local EJB ผมใช้วิธีนี้นะ่ัครับ มีสองวิธี แต่การทำงานคล้ายๆ กัน (โดย Load ใน Servlet ก่อน หรือ บน ZUL File ครับ)
    1. ไป Lookup EJB เสร็จแล้วเก็บค่าไว้ที่ static class สักตัวนึง เช่น Map
    2. ไป Lookup EJB เหมือกนั แต่เก็บไว้ที่ ServletContext เลยครับ
ตัวอย่างการเขียนแบบง่ายๆ ครับ ผมเขียนตอนเรียกไว้ที่ init ใน Servlet แล้วสั่งให้มัน Load on start up

แบบแรกเก็บค่าไว้ที่ static class

public class SampleContext {
private static Map contextJNDI;

เรียกตอน init ใน servlet แล้วสั่งให้ทำตอน load on startup
public void initContext(String jndiName) throws NamingException, CreateException {
Context context = new InitialContext();

ZKServiceEJBLocalHome home = (ZKServiceEJBLocalHome) context.lookup(jndiName);

ZKServiceEJBLocal localObject = home.create();

if(contextJNDI == null) {
contextJNDI = new HashMap();
}

if(contextJNDI.get(jndiName) == null) {
contextJNDI.put(jndiName,localObject);
}
}

อันนี้จะไปเรียกตอนทำงานใน Java ครับ
public ZKServiceEJBLocal getEJB(String jndiName) {

return (ZKServiceEJBLocal)contextJNDI.get(jndiName);

}
}


แบบที่สอง เก็บไว้ที่ ServletContext

เขียนไว้ที่ init ใน Servlet แ ล้ว Config ให้ Load on startup
servletConfig.getServletContext().setAttribute(jndiName, EJBLocalObject); --> jndiName ให้ตอนเวลาจะดึงข้อมูลมาใช้ให้ดึงด้วย jndiName ส่วน EJBLocalObject คือตัว EJBLocal ที่เรา Lookup ใน Context เรียบร้อยแล้ว ล้วเอามาเก็บไว้ที่นี่แทนครับ

ตอนเรียกใช้
ServletContext servletContext = (ServletContext)this.getDesktop().getWebApp().getNativeContext();
servletContext.getAttribute(jndiName);