`

Eclipse Template用法探讨

 
阅读更多

在编码的过程中,对代码重用的追求应该是我们的一个永恒的追求。我们先从相同或相似的代码里提出公用方法,来方便我们的重用;而后,随着面向对象技术的提出,我们又提出父类或基类,在类的基础上对代码进行重用;后来,我们又有了模式这种层次的代码重用,虽然模式不仅仅是为了代码重用,但这也是一个目的;最后,我们又创建了各种框架或架构,来在更高层次的重用代码;展望未来,我们会在元数据、域领域的范围内进行代码的重用。
所有这一切,仍然还不能满足我们对代码重用的要求,我们还是会遇到各种各样的代码重用上的烦恼。以下我来简单举出几个我们在编码过程中遇到的实际问题:
System.out.println(……);
这个方法是我们在Java编程的过程中经常会用到的,用得太频繁了,本来不是很长的方法调用,在我们使用频率过高后,就会觉得非常的麻烦。为什么呢?我们每次使用这个方法,所不同的只是println方法里面的参数,但每次不得不从System到println一个一个字母的敲。
与之相同的情况还有:public final static String SEQUENCE_T_PRODUCT_HIST = "T_PRODUCT_HIST";这是一个为常量赋值的语句,在我们的项目中,使用量也相当的大。
可能有人会说上面的语句比较简单,不能重用也是可以忍受的,而挖空心思去重用它们,反倒好像走了极端。如果有人这么想,那么请看看下面的例子:
try
{
……
}
catch(SQLException Ex)
{

log.error(this.getClass(), "addUserRole", Ex, Ex.getMessage());
throw new PersistenceException(Ex);
}
Catch(Exception e)
{
……
}
比起上面的输出语句,这种对违例的扑捉更让人头疼,重复的代码更多,但又不能通过面向对象技术进行重用。
还有这样的例子,由于需要在程序中记录日志的原因,需要在每一个类的开头写下这样的语句:
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);
……
}
等等。
这样的例子很多,我们在代码中可以信手拈来。很多的情况,我们将会在后面的示例中看到。
从上面的例子可以看出,有这样一些的代码,有重用的需求,但我们却很难在语言的基础上、或面向对象技术、或模式、框架的基础上进行代码的重用。可能的原因主要有以下几个方面:第一是语言规范方面的原因,如print方法的调用和定义静态常量;第二是由于语言上的一些过程语句,如try…catch语句和case语句;第三可能是具体项目的一些性能或业务等方面的一些考虑。
对于这样的一些代码的重用方面的要求,Eclipse的模板给我们带来了一个很好的解决方案。本文和后续的一些文字将探讨这方面的问题,希望引起大家对使用这一工具的兴趣。在我看来,实际的项目中,关于Eclipse模板的使用应该是大有用武之地,而且也相当的灵活,能解决很多的实际问题。本文将探讨Eclipse模板的使用和自定义模板的一些初步知识;而后续的文字会接着探讨一些自定义模板的深入使用。
一、Eclipse模板的使用
Eclipse模板的使用非常的简单:在需要使用Eclipse模板的地方输入模板的名称,如println方法的模板名称为:sysout。如下:

然后点击启动模板的快捷键,如我的Eclipse上为Alt+/。则出现如下的结果:

是不是很简单?
大家如果觉得sysout模板并没有给我们省多少功夫,那么可以尝试看看main函数,这也是我们经常要使用的一个方法。整个方法如下:
public static void main(String[] args)
{

}
对于这个函数,一个字母一个字母的输入,大家是不是觉得相当的乏味。Eclipse也为这个函数准备了一个模板,模板名称为main。现在请我们在适当的位置输入main,然后点击Alt+/,Eclipse会下拉一些选择,我们选择“main-main method”这个选择,大家就会看到我们想要的代码就会出现在相应的位置上。

二、更改快捷键
上面我将Eclipse模板的使用简单的描述了一遍,可能有人在点击Alt+/的时候,并没有得到想要的结果。不用着急,这是您的Eclipse对模板快捷键的设置不同的原因,而我们可以修改模板快捷键。
下面我们来看看如何更改模板快捷键:
1. 点击Window/Perferences,如下


2. 在Perferences窗口里选择Workbench,如下


3. 选择Workbench下的Keys,如下


4. 在Command栏里的Category选项选择“Edit”,Name选项选择“content assist”,如下


5. 在Assignments栏里选择Ctrl+Space那一行(因为Ctrl+Space被Windows系统占用,所以我们无法使用模板的这个快捷键),在Key Sequence栏里将Ctrl+Space删掉,输入Alt+L,如下


6. 点击“Add”按钮,则在Assignments栏里增加一行,如下


7. 最后点击“Apply”按钮和“OK”按钮,完成更改模板快捷键的整个过程。
完成了上面的过程,我们就可以使用Alt+L作为Eclipse模板的启动快捷键了。

三、如何自定义Eclipse模板
一旦我们学会了使用Eclipse模板,我们很快就会发现Eclipse自带的模板远远不够我们使用,这时候,我们就需要自定义模板,来适应我们具体项目的实际需求。
那么,如何自定义Eclipse模板呢?
1. 点击Window/Perferences,如下


2. 在Perferences窗口里选择Java/Edit/Template,如下:


3. 然后点击“New”按钮,出现“New Template”窗口,如下


4. 在“New Template”窗口的Name栏里输入你自定义模板的名称,如“test”;在Content栏里选择java(java表示这个模板的内容是java代码,如果选择javadoc的话,表示这个模板的内容是注释);在Description栏里输入你的自定义模板的描述,如“just for a test!ha”;最后是模板的java代码,如“System.out.println(“just for a test!ha”);”。如下


5. 最后不要忘了点击“OK”按钮,关闭两个窗口,我们的自定义模板就完成了。
现在,我们可以测试我们的test模板了,赶快试试吧!

四、几个自定义Eclipse模板的示例
最后来谈谈怎么创建模板,试着举几个简单的例子来作说明。
1. 简单的Eclipse模板的创建
直接将需要作为模板的语句填写在模板的Pattern栏里,如前面的public final static String SEQUENCE_T_PRODUCT_HIST = "T_PRODUCT_HIST";这样的常量的定义。我们可以定义一个strConstant的模板,将该模板的Pattern写为:“public final static String ${cursor} ;”。其中${cursor}的意思是光标所在的位置。
这样,你如果在程序的适当位置输入:strConstant,然后点击Atl+/,那么你将得到如下的结果:
public final static String (光标所在位置) ;

在实际的项目中,我们会遇到这样的情况:
if (LOG.isDebugEnabled()) {
LOG.debug(METHOD_NAME, "The user : "+user.getName);
}
我们为了性能的考虑,经常希望在日志被关闭以后,不再执行LOG.debug方法里面的任何操作,如"The user : "+user.getName这样的语句。所以我们在LOG.debug方法外面加上LOG.isDebugEnabled()这样的判断语句。加上了判断语句以后,代码的性能得到了提高,但每一个日志都加上:
if (LOG.isDebugEnabled()) {

}
却带来了代码重用上的困难。如今使用Eclipse模板正好解决了这个问题。
我们来创建一个enabledLOG的模板,它的Pattern为:
if (LOG.isDebugEnabled()) {
LOG.debug(METHOD_NAME, "${cursor}");
}

还有一个例子,我们在写自定义标签的时候,经常需要编码的是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;
每一个自定义标签的格式都是如此,因此,我们可以创建一个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. 带参数的Eclipse模板
Eclipse除了能让我们创建简单的、静态的Eclipse模板以外,还可以让我们创建动态的模板,这就是带参数的模板。请看下面的例子:
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+常量名”的组合。对于这样的模板,我们就需要引入带参数的Eclipse模板。具体方法如下:
我们创建一个名为sqlConstant的模板,它的Pattern如下:
private static final String ${name} = "";

protected String get${name}() {
return ${name};
}
其中的${name}就是我们的模板参数,当我们在程序的适当位置输入sqlConstant,然后点击Alt+/的时候,出现如下的效果:

这种参数的好处是,我们有三个地方为name,当我们在一个地方修改name为EMPLOYEE_SQL的时候,其他的两个地方的name同时改为EMPLOYEE_SQL。
我们看,这样的带参数的模板是不是很好用。
我们再来看一个例子:
假设我们有这样的代码,
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);
}
我们就可以创建一个名为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模板带上参数以后,对Eclipse模板的使用就更加的灵活了。这样,我们就可以更加灵活的创建Eclipse模板,更加灵活的使用Eclipse模板了。

3. Eclipse模板的几个特殊参数
我们可以引用${enclosing_type}参数来代表使用模板的代码所在的类的类名。假如我们有如下的代码:
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}参数来代替使用模板的代码所在方法的方法名,如,如果我们想用模板来代替每一个方法里形如final String METHOD_NAME = "getEmployee";的语句,我们可以使用这样的模板:
模板名为methodName,Pattern为:
final String METHOD_NAME = "${enclosing_method}";
这样,如果你在getEmployee方法里使用该模板,那么结果为:
final String METHOD_NAME = "getEmployee";
如果你在saveEmployee方法里使用该模板,那么结果为:
final String METHOD_NAME = "saveEmployee";
其他的几个常用的特殊参数有:enclosing_method_arguments—返回该参数所在方法的参数类型;encloging_package—返回该参数所在类的包名;enclosing_project—返回该参数所在的项目名;enclosing_type—返回该参数所在类的类名等等。

最后,我们以一个完整一点的例子作为本文的结束语。
在Spring的持久层,大家可能都写过这样的代码:
1. Get方法
public ObjOwnedRolePrivilegeModel getRolePrivilegeById(int id) throws Exception
{
final ObjOwnedRolePrivilegeModel oorp = new ObjOwnedRolePrivilegeModel();
try
{
JdbcTemplate template = new JdbcTemplate(dataSource);
String sql = "select ID,ROLE_ID,OBJ_PRIV_ID,DESCRIPTION from t_obj_priv_role where ID="+id;

log.info(this.getClass(), "getRolePrivilegeById", "SQL: " + sql);
template.query(sql, new RowCallbackHandler()
{
public void processRow(ResultSet rs) throws SQLException
{
//ObjOwnedRolePrivilege oorp = new ObjOwnedRolePrivilege(rs.getInt(1),rs.getInt(2),rs.getInt(3),rs.getString(4));
oorp.setId(rs.getInt(1));
oorp.setRoleId(rs.getInt(2));
oorp.setObjPrivId(rs.getInt(3));
oorp.setDescription(rs.getString(4));
}
});
}
catch(Exception Ex)
{
log
.error(this.getClass(), "getRolePrivilegeByid", Ex,
Ex.getMessage());
throw new PersistenceException(Ex);
}

return oorp;
}
2. Save方法
public void addPrivilege(final ObjOwnedPrivilegeModel oop) throws Exception
{
StringBuffer sbSql = new StringBuffer();
try
{
JdbcTemplate template = new JdbcTemplate(dataSource);
sbSql
.append("insert into t_obj_privilege(ID,OBJ_ID,OBJ_TYPEID,PRIV_NAME,PRIV_VALUE,DESCRIPTION)");
sbSql.append(" values(?,?,?,?,?,?)");

log.info(this.getClass(), "addPrivilege", "SQL: "
+ sbSql.toString());

template.update(sbSql.toString(), new PreparedStatementSetter()
{
public void setValues(PreparedStatement ps) throws SQLException
{
ps.setInt(1, oop.getId());
ps.setInt(2, oop.getObjId());
ps.setInt(3, oop.getObjType());
ps.setString(4, oop.getName());
ps.setInt(5, oop.getValue());
ps.setString(6, oop.getDescription());
}
});
}
catch(Exception Ex)
{
//System.out.println(Ex.getMessage());
log.error(this.getClass(), "addPrivilege", Ex, Ex.getMessage());
throw new PersistenceException(Ex);
}

}
3. Delete方法
public void removeUserRole(int[] id) throws Exception
{
String ids = "-1";
for(int i = 0; i < id.length; i++)
{
ids = ids + "," + id[i];
}
String sql = "delete from t_user_role where id in (" + ids + ")";
log.info(this.getClass(), "removeUserRole", "SQL: " + sql);
try
{
JdbcTemplate template = new JdbcTemplate(dataSource);
template.execute(sql);
}
catch(Exception Ex)
{
log.error(this.getClass(), "removeUserRole", Ex, Ex.getMessage());
throw new PersistenceException(Ex);
}

}
这些是典型的对数据库的操作,包括查询、新增、修改和删除。每一种操作都是相似的,有很多的公用代码,但由于代码里既有try…catch语句,又有匿名内部类,所以不好在面向对象的技术上实现重用。但是使用Eclipse模板却是恰到好处。下面我以第一段代码作为例子,其余的代码大家可以自行实现。
我们设计一个名为get的模板,其Pattern为:
final ${return_type} retn ;
try
{
JdbcTemplate template = new JdbcTemplate(dataSource);
String sql = "";
log.info(this.getClass(), "${enclosing_type}", "SQL: " + sql);
template.query(sql, new RowCallbackHandler()
{
public void processRow(ResultSet rs) throws SQLException
{

}
});
}
catch(Exception Ex)
{
log
.error(this.getClass(), "${enclosing_type}", Ex,
Ex.getMessage());
throw new PersistenceException(Ex);
}

return retn;

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hivon/archive/2006/07/11/903563.aspx

分享到:
评论

相关推荐

    Eclipse Template与模式

    ##### 2.1 Eclipse Template的基本使用 - **创建Template**:在Eclipse中可以通过`Window &gt; Preferences &gt; Java &gt; Code Style &gt; Code Templates`路径来创建新的模板。 - **插入Template**:在编辑器中输入模板名称...

    eclipse template 学习文章

    本文将深入探讨Eclipse模板的使用、创建和管理,以帮助开发者充分利用这一强大功能。 1. **模板的使用** 要使用Eclipse模板,首先需要打开一个源代码文件。在编写代码时,输入模板的前几个字符,然后按`Ctrl + ...

    eclipse java code template

    本文将深入探讨Eclipse中的Java代码模板,并分享如何利用codetemplates.xml文件进行定制。 首先,我们需要了解Eclipse中的代码模板功能。在Eclipse中,我们可以在“Window”菜单 -&gt; “Preferences” -&gt; “Java” -&gt;...

    Eclipse 代码模板设置

    这篇博文中,我们将深入探讨如何在Eclipse中设置和利用代码模板。 首先,Eclipse的代码模板功能允许用户自定义各种编程语言的代码片段,如Java、XML、HTML等。这些模板可以包含变量,通过简单的输入即可生成复杂的...

    使用 Eclipse 插件开发环境构建模板

    2. 重启Eclipse,新模板应该已经在"Preferences" -&gt; "General" -&gt; "Editors" -&gt; "Text Editors" -&gt; "Template"中可见,用户可以根据需要进行配置和使用。 在描述中提到的博客链接,可能详细介绍了上述步骤的实施...

    Eclipse的使用技巧详解

    本文将深入探讨一些实用的Eclipse使用技巧,帮助开发者提高工作效率。 首先,从编辑器设置开始。在Eclipse中,可以通过“窗口”-&gt;“喜好设定”-&gt;“Java”-&gt;“编辑器”进行调整。建议开启“显示行号”、“强调对称...

    在Eclipse下面使用注释模板自动生成说明

    这篇博客将深入探讨如何在Eclipse中设置和使用注释模板。 首先,让我们了解什么是注释模板。注释模板是预定义的一段代码,包含了经常需要在注释中出现的结构和内容,例如作者、日期、版权信息等。在Eclipse中,我们...

    codeTemplate

    3. **Eclipse代码格式化规则**:“eclipse rules”可能是指Eclipse的代码格式化设置,这些规则涵盖了代码的缩进、空格使用、命名约定等方面。开发者可以根据项目需求或团队规范来定制这些规则,确保整个项目的代码...

    eclipse中android源代码-点击系统封装的方法可以看到源代码

    在探讨“Eclipse中Android源代码—点击系统封装的方法可以看到源代码”这一主题时,我们首先需要理解几个关键概念:Eclipse集成开发环境(IDE)、Android操作系统、源代码以及系统封装的方法。 ### Eclipse IDE ...

    eclipse代码格式化

    这篇博客链接虽然没有给出具体的内容,但我们可以根据常见的话题来探讨Eclipse代码格式化的相关知识点。 1. **代码格式化器**: Eclipse内置了一个强大的代码格式化器,可以对Java、XML、HTML等多种语言的代码进行...

    eclipse中代码注释模板

    本文将深入探讨如何在Eclipse中设置和利用这些模板,以实现高效且规范的编码实践。 首先,让我们了解**代码注释模板**。在Eclipse中,你可以为不同的注释类型(如类、方法、变量)创建模板,这样每次需要添加注释时...

    Eclipse的处理工具模板_Java_CSS_下载.zip

    下面我们将深入探讨Eclipse中的模板功能以及如何利用它们来提升开发效率。 ### Eclipse模板系统 Eclipse的模板系统是其强大特性之一,允许开发者定义代码片段,然后在编写代码时快速插入这些片段。这大大减少了...

    分享:Java代码注释template

    本话题将探讨“Java代码注释template”,这是一个关于如何通过模板来标准化Java代码注释的实践。 在Java开发中,注释被用来解释代码的功能、用途和实现方式,以便于其他开发者阅读和理解。注释模板通常包括类注释、...

    Template-ShortCuts

    总之,"Template-ShortCuts"项目为Java开发者提供了一个宝贵的资源库,通过学习和使用其中的模板和快捷方式,可以显著提高编程效率,减少重复工作,使开发者能更专注于解决问题和创新。因此,无论是初学者还是经验...

    利用Myeclipse开发struts应用程序

    在本教程中,我们将探讨如何使用MyEclipse来开发一个简单的Struts应用程序——用户登录系统。 首先,我们需要搭建开发环境,包括JDK 5.0、Eclipse 3.1M7、MyEclipse 3.84 和 Tomcat 5.0.28。一旦这些都安装并配置...

    FreeMarker动静分离生成html文件

    4. 使用`Template`对象的`process()`方法,传入数据模型和输出流,生成HTML文件。 例如: ```java import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template....

    flex java use together

    标题“flex java use together”指的是将Adobe Flex与Java技术结合使用的方法。Flex是一种开源的、基于ActionScript的RIA(富互联网应用)开发框架,而Java则是一种广泛使用的后端编程语言。将两者结合,可以创建...

    MongoDb增删改查的网站范例

    使用`MongoTemplate`,你可以通过`save()`方法保存一个对象。这个方法会自动将Java对象转换为MongoDB的Document,并插入到相应的集合中。 2. **读取(Read)**:`find()`和`findOne()`是常用的查询方法。`find()`...

    一些代码小技巧或规范

    例如,使用版本控制系统(如Git)来跟踪代码变更,使用IDE(如IntelliJ IDEA或Eclipse)来提供代码补全和错误检查,以及使用构建工具(如Maven或Gradle)自动化构建过程。同时,了解并实践代码风格指南,如Google ...

Global site tag (gtag.js) - Google Analytics