這次要實現的是getProperty標簽。主要知識點是怎麼用反射去調用實例中的方法。重要部分已用注釋標注。
/**
* 類說明:標簽處理類,仿jsp(SUN企業級應用的首選)的getProperty標簽
* 創建日期:2004-7-2
* 修改日期:2004-7-2
* 創建人: dever
*/
package cn.dever.tag;
import javax.servlet.jsp(SUN企業級應用的首選).*;
import javax.servlet.jsp(SUN企業級應用的首選).tagext.*;
import java.lang.reflect.*;
public class GetProperty extends TagSupport
{
private String name; //得到類名稱
private String property; //得以屬性名
private String method; //返回屬性的方法名
private String result; //最終輸出結果
public void setName(String s) {
this.name = s;
}
public String getName(){return this.name;}
public void setProperty(String property)
{
this.property = property;//將屬性名轉換成獲得屬性的方法名
int length = property.length();
String temp=property.substring(0,1).toUpperCase()+property.substring(1,length);
this.method="get"+temp;
}
public String getProperty(){return this.property;}
public int doStartTag() throws jsp(SUN企業級應用的首選)TagException
{
try{
Object getInstance=pageContext.getAttribute(name); //得到類的實例
Class insClass = getInstance.getClass();
Class[] typeParameter = new Class[]{}; //定義方法的參數類型數組
Method methInstance = insClass.getMethod(method,typeParameter); //根據方法名稱得到一個方法實例
Object[] objParameter = new Object[]{}; //被調用方法的參數數組
result = methInstance.invoke(getInstance,objParameter).toString(); //在類實例中調用方法,得到串行化後的字符串
}
catch(Illegalaccess(小型網站之最愛)Exception e){
System.out.print("Illegal access(小型網站之最愛) Error!");
}
catch(NoSuchMethodException e){
throw new jsp(SUN企業級應用的首選)TagException(method+"() is not exist!");
}
catch(InvocationTargetException e){
System.out.print("Invocation Target Error!");
}
catch(NullPointerException e){
result="null";
}
return EVAL_BODY_INCLUDE;
}
public int doEndTag() throws jsp(SUN企業級應用的首選)TagException
{
try{
jsp(SUN企業級應用的首選)Writer out = pageContext.getOut(); //輸出得到的結果
out.println(result);
}
catch(java.io.IOException e){
System.out.println("IO Error !");
}
return EVAL_PAGE;
}
}