カスタムタグ:JSPページでSpring Beanを動的に実行する方法

6576 ワード

カスタムタグ:JSPページでSpring Beanを動的に実行する方法
     このカスタムラベルを使用すると、JSPページであるSpring Beanオブジェクトを動的に実行することができ、方法によって返された結果はValueStockに格納される.このカスタムラベルはSpring 2、Struts 2、Hibernate 3の環境で試験に合格しました.
一、javaソースコード
    1、ServiceTagソースコード
Javaコード
public class ServiceTag extends BaseBodyTagSupport {
	private String beanName;
	private String methodName;
	private String id;
	public List params = new ArrayList();
	
	public void setBeanName(String beanName) {
		this.beanName = beanName;
	}
	
	public void setMethodName(String methodName) {
		this.methodName = methodName;
	}

	public void setId(String id) {
		this.id = id;
	}
	
	public int doEndTag() throws JspException {		
		Object bean = null;
		Method method = null;
		
		//  bean  
		try{
			bean = SpringContextUtil.getBean(beanName);
		}catch(Exception ex){
			throw new JspException("get bean error: " + beanName);
		}
		
		//        
		if(bean != null){
			try {
				method = bean.getClass().getMethod(methodName, TagUtil.getParameterTypes(params));
			}catch(Exception e) {
				throw new JspException("get method error: " + beanName + "." + methodName);
			}
		}else{
			throw new JspException("ServiceTag Error: bean [" + beanName + "] is null");
		}
		
		//        ,    
		Object result = null;
		if(method != null){
			try {
				result = method.invoke(bean, TagUtil.getParameterValues(params));
			}catch(Exception e){
				throw new JspException("method invoke error");
			}
		}
		
		//      ValueStack 
		ValueStack vs = TagUtils.getStack(pageContext);
		vs.getContext().put(id, result);
		
		return EVAL_PAGE;
	}
}
 
    2、ServiceParameTagソースコード
Javaコード
public class ServiceParamTag extends BaseBodyTagSupport {
	private String name;
	private Object value;
	private String type;
	
	public void setName(String name) {
		this.name = name;
	}

	public void setValue(Object value) {
		this.value = value;
	}

	public void setType(String type) {
		this.type = type;
	}

	public int doEndTag() throws JspException {
		Tag parent = getParent();
		if(parent instanceof ServiceTag){
			Map p = new HashMap();
			p.put("paramName", name);
			p.put("paramValue", value);
			p.put("paramType", type);
			((ServiceTag)parent).params.add(p);
		}
		
		return EVAL_PAGE;
	}
}
 
    3、共通方法のソースコード
Javaコード
//      
public static Class[] getParameterTypes(List params) throws Exception{
	Class[] c = new Class[params.size()];
	
	for(int i=0;i
 
 
 * 必ずspring.xmlに加えます. 
 *  
 * SpringConteextUtilの例に対して、自動的にaplication Conteetを設定して、その後直接にappication Contectを使うことができます. 
 *  
  • package org.co mpany.xxx;  
  •   
  • import org.springframe ewark.beans.BensException;    
  • import org.springframe ext.com.Application Context;    
  • import org.springframe ework.com.Application ControtextAware;    
  •     /**   
  •      *   
  •      * スプリング容器を取得して、容器に定義されている他のbeanにアクセスします.   
  •      * @author ltiger 
  •      * @シンプル MOSTs View 3.0 2009-11-16 
  •      */  
  • pblic クラス SpringConteextUtil implements Application ContactextAware {  
  •   
  •     // Springアプリケーションコンテキスト環境  
  •     prvate static Apple Comptext appication Comptext;  
  •   
  •     /**  
  •      * Application ControtextAwareインターフェースのコールバック方法を実現し、コンテキスト環境を設定します. 
  •      *   
  •      * @パラム appication Comptext 
  •      */  
  •     public void setApple Contect(Apple Contect) appication Cotext) {  
  •         SpringConteextUtil.appicationComptext = appication Comptext;  
  •     }   
  •   
  •     /**  
  •      * @return Apple Comptext 
  •      */  
  •     public static Apple Comptext getApple Conteext() {  
  •         return appication Comptext;  
  •     }   
  •   
  •     /**  
  •      * オブジェクトを取得 
  •      * ここでbean方法を書き直して、主な役割を果たします. 
  •      * @パラム name 
  •      * @return Object 与えられた名前で登録されたbeanの例 
  •      * @ローソン BensException 
  •      */  
  •     public static Object get Bean(String) name ローソン BensException {  
  •         return appication Contect.getBen(name);  
  •     }   
  •   
  • }  
  • 二、tldファイルソースコード
    Xmlコード
    
    	serviceBean
    	com.cjm.web.taglib.ServiceTag
    	JSP
    	
    		beanName
    		true
    		true
    	
    	
    		methodName
    		true
    		true
    	
    	
    		id
    		true
    		true
    	
    
    
    
    	serviceParam
    	com.cjm.web.taglib.ServiceParamTag
    	JSP
    	
    		name
    		true
    		true
    	
    	
    		value
    		true
    		true
    	
    	
    		type
    		true
    		true
    	
    
     
    三、パラダイム
        1、javaソースコード
    Javaコード
    public class RoleService extends BaseService {
    	private RoleDao roleDao;
    	
    	public RoleDao getRoleDao() {
    		return roleDao;
    	}
    
    	public void setRoleDao(RoleDao roleDao) {
    		this.roleDao = roleDao;
    	}
    
    	public Role getRole(String roleId){
    		return (Role)get(Role.class, roleId);
    	}
    }
        2、JSPページのソースコード
    Htmlコード
  •       
  • cjm:serviceBen>  
  •   
  •