Site Search :
Standard Enterprise XML Methodology Pattern Setting Tunning Other
Article Contributors
GuestBook
Javapattern Maven
XSourceGen Dev
JetSpeed Test
JLook Image
jLook Family Site


InvokeEJB Custom Tag Library implementation
 
JSP 개발시 EBJ tier의 stateless session bean의 business method 호출에대한 code logic을 encapsulation하는 Custom Tag Library 소개를 하며 Web tier와 EJB tier간 개발자 role을 명확히 분리할수 있는 장점 제공하는 tag lib를 소개한다. ( 2003/03/10 ) 315
Written by specular - 전홍성
1 of 3
 

Article 요약:

Web tier에서 EJB Stateless Session Bean의 business method를 호출하는 방법을 일관성있게 구현할수 있고, EJB 호출에 대한 Logic을 Encapsulation하는 Custom Tag Library 소개.

Article 내용:

  Web Tier JSP component에서 EJB Stateless Session Bean을 호출하는 방법은 경험한 사람은 알겠지만, 메소드만 다를뿐 같은 코드로직으로 구현이 된다. 즉, JNDI Naming Service에 접근해서 Home object의 remote reference를 얻어내고, Home object의 create() method를 호출해서 EJB object의 remote referece를 얻어 낸다. 그런다음. EJB object를 통해 Business method를 호출하게 되는 것이다.
  이와 같이 EJB의 Business method를 호출하기 위한 logic을 다른 class component로 구현을 해도 되겠지만, 저는 JSP Custom Tag Library로 하나 만들어 봤죠..
  Web Tier에서 EJB의 Business method를 호출하는 component를 개발하기 위해서는 dynamic invocation을 지원해야 겠죠. 어떤 signature의 method를 호출해야 할지 모르기 때문에 runtime에 method가 결정되어 질수 있어야 겠죠. 이정도 이야기를 하면, EJB의 EJBMetaData interface를 이용해야 겠다는것을 감을 잡을수 있겠죠. 전에 EJBMetaData interface에대한 article을 소개를 했는데....
  Custom Tag Libray에대한 소개는 article로 몇번 했었는데, Custom Tag를 개발하기 위해서는 가장 먼저 생각해야 할것은, 개발하고자 하는 Tag에 대한 syntax입니다. 이 syntax는 개발하고자 하는 custom tag의 기능을 잘 생각하셔야 겠죠.
  Stateless Session Bean의 businses method를 호출하기위해 필요한 값들은 다음과 같습니다.

  		
  • JNDI Naming service의 location
  • JNDI CONTEXT FACTORY class name
  • Home object의 JNDI Name
  • Business method Name
  • Business method의 parameter list
  • return type
  •   위의 항목들을 통해 개발하고자 하는 custom tag의 syntax를 생각할때, 가장 고민이 되는 부분은 parameter list와 return type에 의한 return value 값을 어떻게 처리할 것인가? .....
      return value는 Custom tag의 scripting variable을 이용하면 되겠고, parameter list는 몇개가 될지 모르기 때문에 Applet Tag의 <param name="" value="" >과 같은 형태로 정의하면 되겠죠. 즉.... 다음과 같이.

          
      	<web:invokeEjb url="127.0.0.1" 
      				jndiName="ejb/EchoHome" 
      				context="weblogic.jndi.WLInitialContextFactory"
      				method="sayEcho" 
      				id="msg" type="java.lang.String">
      		<web:param name="java.lang.String" value="<%= name%>"/>
      	</web:invokeEjb>

      param tag는 jsp page에서 생성된 객체나, primetive value값을 invokeEjb Tag가 Business method를 호출하기위한 parameter 값으로 이용할수 있게, 전달해 주는 역할을 한다. parameter에 대한 정보(Data type, value)를 받아 pass해 주는 기능이죠. parameter 정보를 pass하기 위해서는 invokeEjb tag의 public method를 호출해야 겠죠. 이와 같이 tag가 nested되어 동작하는 Custom Tag를 Collabration Tag라고 합니다. param tag를 구현할때 중요한 사항은 invokeEjb Tag 객체의 reference를 얻어내는 방법이겠죠. Param Tag는 다음과 같이 구현됩니다.

                
    package com.javapattern.servlet.jsp;
    
    import java.io.*;
    import java.util.*;
    import java.lang.reflect.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.jsp.*;
    import javax.servlet.jsp.tagext.*;
    
    /** ▒▒▒▒ EJB InvokeParamTag Handler ▒▒▒▒
    * Attribute name	Business method parameter type
    *		value	Business method parameter value
    *
    * <web:invokeEjb	jndiName="" url="" id="" type="">
    *	<web:param name="java.lang.String" value="<%= name%>"/>
    *	<web:param name="int" value="10"/>
    * </web:invokeEjb>
    * 		written by JeonHongSeong
    */
    
    public class InvokeParamTag extends TagSupport 
    {
    private String name;
    private Object value;
    
    private final static String[] PRIMITIVE_TYPE={"byte","short","int","long",
    			"float","double","char","boolean"};
    private final static String[] PRIMITIVE_ARRAY_TYPE={"byte[]","short[]","int[]",
    			"long[]","float[]","double[]","char[]","boolean[]"};
    
    private static Hashtable PRIMITIVE = new Hashtable();
    private static Hashtable PRIMITIVE_ARRAY = new Hashtable();
    
    static {
      PRIMITIVE.put(PRIMITIVE_TYPE[0],byte.class);
      PRIMITIVE_ARRAY.put(	PRIMITIVE_ARRAY_TYPE[0],
    			Array.newInstance(byte.class,0).getClass()	);
    
      PRIMITIVE.put(PRIMITIVE_TYPE[1],short.class);
      PRIMITIVE_ARRAY.put(	PRIMITIVE_ARRAY_TYPE[1],
    			Array.newInstance(short.class,0).getClass()	);
    
      PRIMITIVE.put(PRIMITIVE_TYPE[2],int.class);
      PRIMITIVE_ARRAY.put(	PRIMITIVE_ARRAY_TYPE[2],
    			Array.newInstance(int.class,0).getClass()	);
    
      PRIMITIVE.put(PRIMITIVE_TYPE[3],long.class);
      PRIMITIVE_ARRAY.put(	PRIMITIVE_ARRAY_TYPE[3],
    			Array.newInstance(long.class,0).getClass()	);
    
      PRIMITIVE.put(PRIMITIVE_TYPE[4],float.class);
      PRIMITIVE_ARRAY.put(	PRIMITIVE_ARRAY_TYPE[4],
    			Array.newInstance(float.class,0).getClass()	);
    
      PRIMITIVE.put(PRIMITIVE_TYPE[5],double.class);
      PRIMITIVE_ARRAY.put(	PRIMITIVE_ARRAY_TYPE[5],
    			Array.newInstance(double.class,0).getClass()	);
    
      PRIMITIVE.put(PRIMITIVE_TYPE[6],char.class);
      PRIMITIVE_ARRAY.put(	PRIMITIVE_ARRAY_TYPE[6],
    			Array.newInstance(char.class,0).getClass()	);
    
      PRIMITIVE.put(PRIMITIVE_TYPE[7],boolean.class);
      PRIMITIVE_ARRAY.put(	PRIMITIVE_ARRAY_TYPE[7],
    			Array.newInstance(boolean.class,0).getClass()	);
    }
    
    public void setName(String name)
    {
    	this.name=name;	
    }
    
    public void setValue(Object value)
    {
    	this.value=value;
    }
    
    public int doStartTag() 
    	throws JspTagException
    {
    	InvokeEJBTag parent = 
    			(InvokeEJBTag)findAncestorWithClass(this, 
    			com.javapattern.servlet.jsp.InvokeEJBTag.class) ;
    	if(parent==null) 
    		throw new JspTagException("InvokeParam Tag without InvokeEJB Tag");
    	if(name==null)
    		throw new JspTagException("Invalid Param Tag : name is null.");
    	try {
    		parent.addArgType(makeClass());
    		parent.addArgValue(value);
    	} catch(ClassNotFoundException e) {
    		throw new JspTagException("Parameter class not found. : "+name);
    	}
    	
    	return SKIP_BODY;
    } 	
    
    private Class makeClass() throws ClassNotFoundException {
    	Object obj = PRIMITIVE.get(name);
    	if(obj!=null) return (Class) obj;
    	
    	obj = PRIMITIVE_ARRAY.get(name);
    	if(obj!=null) return (Class) obj;
    	
    	
    	if((name.indexOf('[')!=-1)&&(name.indexOf(']')!=-1)) {
    		int idx = name.indexOf('[');
    		String tmp = name.substring(0,idx);
    		
    		obj = Array.newInstance(Class.forName(tmp),0);
    		return obj.getClass();	
    	}
    	
    	return Class.forName(name);
    }
    }
    

    Param Tag의 TEI class의 구현 코드 입니다.

                
    package com.javapattern.servlet.jsp;
    
    import javax.servlet.jsp.tagext.TagExtraInfo;
    import javax.servlet.jsp.tagext.VariableInfo;
    import javax.servlet.jsp.tagext.TagData;
    
    public class InvokeParamTEI extends TagExtraInfo {
    
    	public VariableInfo[] getVariableInfo(TagData data)
    	{
    		String varName = data.getAttributeString("name");
    		String className = data.getAttributeString("value");
    		className=(className==null) ? "java.lang.Object" : className;
    		VariableInfo info=new VariableInfo(
    						varName, 
    						className, 
    						true, 
    						VariableInfo.NESTED);
    		VariableInfo[] result = { info };
    
    		return result;
    	}
    
    	public boolean isValid(TagData data) {
    		return true;
    	}
    }

    2001.08.03 written by Jeon HongSeong

     
     
    1 2 3
    References
     
    http://java.sun.com/taglib
    Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD