幾個自定義Eclipse模板的示例
最后來談談怎么創(chuàng)建模板,試著舉幾個簡單的例子來作說明。
1. 簡單的Eclipse模板的創(chuàng)建
直接將需要作為模板的語句填寫在模板的Pattern欄里,如前面的public final static String SEQUENCE_T_PRODUCT_HIST = "T_PRODUCT_HIST";這樣的常量的定義。我們可以定義一個strConstant的模板,將該模板的Pattern寫為:“public final static String ${cursor} ;”。其中${cursor}的意思是光標所在的位置。
這樣,你如果在程序的適當位置輸入:strConstant,然后點擊Atl /,那么你將得到如下的結(jié)果:
public final static String (光標所在位置) ;
在實際的項目中,我們會遇到這樣的情況:
if (LOG.isDebugEnabled()) {
LOG.debug(METHOD_NAME, "The user : " user.getName);
}
我們?yōu)榱诵阅艿目紤],經(jīng)常希望在日志被關閉以后,不再執(zhí)行LOG.debug方法里面的任何操作,如"The user : " user.getName這樣的語句。所以我們在LOG.debug方法外面加上LOG.isDebugEnabled()這樣的判斷語句。加上了判斷語句以后,代碼的性能得到了提高,但每一個日志都加上:
if (LOG.isDebugEnabled()) {
}
卻帶來了代碼重用上的困難。如今使用Eclipse模板正好解決了這個問題。
我們來創(chuàng)建一個enabledLOG的模板,它的Pattern為:
if (LOG.isDebugEnabled()) {
LOG.debug(METHOD_NAME, "${cursor}");
}
還有一個例子,我們在寫自定義標簽的時候,經(jīng)常需要編碼的是doEndTag方法,在這個方法里面,我們要先寫日志:
final String METHOD_NAME = "doEndTag";
PLOG.info(METHOD_NAME, PerformanceLogger.Event.METHOD_ENTRY);
然后將我們的代碼用try…catch包括起來,如下:
try {
……
} catch (Exception e) {
LOG.error(METHOD_NAME, "……", e);
}
省略號都是我們要寫的代碼。
最后,我們又需要紀錄日志,然后返回,如下:
PLOG.info(METHOD_NAME, PerformanceLogger.Event.METHOD_EXIT);
return SKIP_BODY;
每一個自定義標簽的格式都是如此,因此,我們可以創(chuàng)建一個doEndTag的模板,它的Pattern為:
public int doEndTag() throws JspException {
final String METHOD_NAME = "doEndTag";
PLOG.info(METHOD_NAME, PerformanceLogger.Event.METHOD_ENTRY);
try {
${cursor}
} catch (Exception e) {
LOG.error(METHOD_NAME, "", e);
}
PLOG.info(METHOD_NAME, PerformanceLogger.Event.METHOD_EXIT);
return SKIP_BODY;
}
在實際的編碼過程中,我們會遇到很多這樣的例子,使用Eclipse模板,將會把我們從煩躁而易于出錯的拷貝粘貼中解放出來。
2. 帶參數(shù)的Eclipse模板
Eclipse除了能讓我們創(chuàng)建簡單的、靜態(tài)的Eclipse模板以外,還可以讓我們創(chuàng)建動態(tài)的模板,這就是帶參數(shù)的模板。請看下面的例子:
private static final String EMPLOYEE_SQL = "SELECT * FROM EMPLOYEE";
protected String getEMPLOYEE_SQL () {
return EMPLOYEE_SQL;
}
private static final String DEPART_SQL = "SELECT * FROM DEPARTMENT";
protected String getDEPART_SQL () {
return DEPART_SQL;
}
這是我在實際項目中遇到過的代碼,這兩個相似的代碼,除了常量的值不同以外,還有常量名不同,get方法不同,但get方法都是“get 常量名”的組合。對于這樣的模板,我們就需要引入帶參數(shù)的Eclipse模板。具體方法如下:
我們創(chuàng)建一個名為sqlConstant的模板,它的Pattern如下:
private static final String ${name} = "";
protected String get${name}() {
return ${name};
}
其中的${name}就是我們的模板參數(shù),當我們在程序的適當位置輸入sqlConstant,然后點擊Alt /的時候,出現(xiàn)如下的效果:
![]() 這種參數(shù)的好處是,我們有三個地方為name,當我們在一個地方修改name為EMPLOYEE_SQL的時候,其他的兩個地方的name同時改為EMPLOYEE_SQL。
我們看,這樣的帶參數(shù)的模板是不是很好用。
我們再來看一個例子:
假設我們有這樣的代碼,
protected static IEmployeeBSV getEmployeeBSV()
{
IBusinessServiceManager bsvmgr = GenericContainer.getInstance().getBusinessServiceManager();
return (IEmployeeBSV) bsvmgr.getBusinessService(IEmployeeBSV.class);
}
protected static IDepartmentBSV getDepartmentBSV()
{
IBusinessServiceManager bsvmgr = GenericContainer.getInstance().getBusinessServiceManager();
return (IDepartmentBSV) bsvmgr.getBusinessService(IDepartment.class);
}
我們就可以創(chuàng)建一個名為bsv的模板,其Pattern如下:
protected static I${enclosing_method} get${enclosing_method}()
{
IBusinessServiceManager bsvmgr = GenericContainer.getInstance().getBusinessServiceManager();
return (I${enclosing_method}) bsvmgr.getBusinessService(I${enclosing_method}.class);
}
從上面的例子可以看出,給Eclipse模板帶上參數(shù)以后,對Eclipse模板的使用就更加的靈活了。這樣,我們就可以更加靈活的創(chuàng)建Eclipse模板,更加靈活的使用Eclipse模板了。
3. Eclipse模板的幾個特殊參數(shù)
我們可以引用${enclosing_type}參數(shù)來代表使用模板的代碼所在的類的類名。假如我們有如下的代碼:
public class ICRMValidationFormTag
{
private final static Logger.Module MOD = new Logger.Module(ModuleId.MOD_TAG);
private final static Logger LOG = Logger.getLogger(ICRMValidationFormTag.class, MOD);
private final static PerformanceLogger PLOG = PerformanceLogger.getLogger(ICRMValidationFormTag.class);
……
}
public class Employee
{
private final static Logger.Module MOD = new Logger.Module(ModuleId.MOD_TAG);
private final static Logger LOG = Logger.getLogger(Employee.class, MOD);
private final static PerformanceLogger PLOG = PerformanceLogger.getLogger(Employee.class);
……
}
我們可以將每個類的前面三行作為一個模板,名為myLog模板,Pattern為:
private final static Logger.Module MOD = new Logger.Module(ModuleId.MOD_TAG);
private final static Logger LOG = Logger.getLogger(${enclosing_type}.class, MOD);
private final static PerformanceLogger PLOG = PerformanceLogger.getLogger
(${enclosing_type}.class);
這樣,如果我們在ICRMValidationFormTag類里引用myLog模板,如下:
public class ICRMValidationFormTag
{
myLog
}
則模板中凡是${enclosing_type}的地方,都將被ICRMValidationFormTag代替。
如果我們在Employee類中引用該模板,如下:
public class Employee
{
myLog
}
則模板中凡是${enclosing_type}的地方,都將被Employee代替。
同理,我們可以使用${enclosing_method}參數(shù)來代替使用模板的代碼所在方法的方法名,如,如果我們想用模板來代替每一個方法里形如final String METHOD_NAME = "getEmployee";的語句,我們可以使用這樣的模板:
模板名為methodName,Pattern為:
final String METHOD_NAME = "${enclosing_method}";
這樣,如果你在getEmployee方法里使用該模板,那么結(jié)果為:
final String METHOD_NAME = "getEmployee";
如果你在saveEmployee方法里使用該模板,那么結(jié)果為:
final String METHOD_NAME = "saveEmployee";
其他的幾個常用的特殊參數(shù)有:enclosing_method_arguments—返回該參數(shù)所在方法的參數(shù)類型;encloging_package—返回該參數(shù)所在類的包名;enclosing_project—返回該參數(shù)所在的項目名;enclosing_type—返回該參數(shù)所在類的類名等等。
|
|