用JBuilder2007开发扩展JSF标签的插件
2007-05-12 18:00
405 查看
1. 首先,使用File->New->Project->Plug-in Project来建立一个空的插件工程,这个工程使用JBuilder2007提供的默认值,并在工程名中输入myplugin。如图1所示:
![]() 图1 |
![]() 图2 dependencies标签 |
![]() 图3 |
public boolean supports(IAdaptable context) { return context.getAdapter(IStructuredDocumentContext.class) != null; } |
5. 使用如下的代码替换internalCreate中的代码
protected ISymbol internalCreate(String symbolName, int scope, IAdaptable context, List problems) { //得到上下文 final IStructuredDocumentContext sContext =(IStructuredDocumentContext) context.getAdapter(IstructuredDocumentContext.class); // 为上下文建立一个DOM上下文 final IDOMContextResolver domResolver = IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(sContext); if (domResolver != null) { final Node curNode = domResolver.getNode(); // node必须是XML属性 if (curNode instanceof Attr) { final Attr attr = (Attr) curNode; final Node owningElement = attr.getOwnerElement(); if (owningElement != null) { IProject iProject = workspaceResolver.getProject(); if (iProject != null) { return handleSymbolCreation(symbolName, sContext, attr, owningElement, iProject); } } } } return null; } |
private ISymbol handleSymbolCreation(final String symbolName, final IStructuredDocumentContext context, final Attr attr, final Node owningElement, final IProject project) { // 建立Tab库 final ITaglibContextResolver resolver =IStructuredDocumentContextResolverFactory.INSTANCE .getTaglibContextResolver(context); if (resolver == null || !resolver.canResolveContext(context)) { return null; } final String uri = resolver.getTagURIForNodeName(owningElement); IBeanInstanceSymbol beanSymbol = null; // 处理核心标签库 if ("http://oracle.com/tutorial/fake/taglib".equals(uri)) { final String elementName = owningElement.getLocalName(); final String attrName = attr.getName(); if ("locallyDeclaredBean".equals(elementName)) { if ("var".equals(attrName)) { final NamedNodeMap attrMap = owningElement.getAttributes(); final Node baseNameNode = attrMap.getNamedItem("classname"); if (baseNameNode instanceof Attr) { // 得到bean的名字 final String className = ((Attr)baseNameNode).getValue(); // 建立一个新的空Bean实例符号 beanSymbol = SymbolFactory.eINSTANCE.createIBeanInstanceSymbol(); beanSymbol.setName(attr.getValue()); try { IJavaProject javaProject = JavaCore.create(project); IType type = javaProject.findType(className); if (type != null) { IJavaTypeDescriptor2 javaTypeDescriptor = SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2(); javaTypeDescriptor.setType(type); beanSymbol.setJavaTypeDescriptor(javaTypeDescriptor); } } catch (JavaModelException jme) { } } } } } return beanSymbol; } |
我们的最终目标是加入如下的标签:
<t:locallyDeclaredBean var="x" classname="beans.MyBean"/> |
首先让我们在工程中建立一个metadata文件夹。在通过File->New->File来建立一个metadata.xml文件,如图4如示。
![]() 图4 |
<?xml version="1.0" encoding="UTF-8"?> <grammar-annotation xmlns="http://org.eclipse.jsf.core/grammarAnnotationSchema" xmlns: 4000 xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://org.eclipse.jsf.core/grammarAnnotationSchema D://EclipseWTPLatest//WTPWorkspace//org.eclipse.jst.jsf.core//schema//grammar-annotations.xsd "> <cm-element name="locallyDeclaredBean"> <cm-attribute name="var"> <property name="contributes-value-binding"> < value>true</value> </property> <property name="value-binding-scope"> <value>request</value> </property> <property name="value-binding-symbol-factory"> <value>tutorial.locallyDeclaredBean</value> </property> </cm-attribute> </cm-element> </grammar-annotation> |
为了声明我们的标签工厂,需要使用两个扩展点。首先我们需要扩展注释扩展点,这个扩展点用于声明我们刚才定义框架的元数据。其次,我们将注册这个工厂的ID。
打开plugin.xml,并且选择Extensions标签,单击"Add"按钮,选择org.eclipse.jst.jsf.contentmodel.annotations.annotationFile扩展点。选择这个扩展点后,通过右键菜单New->annotationFile加入一个注释文件。并输入相应的uri和location。如图5所示。
![]() 图5 |
![]() 图6 |
我们现在已经完成了标签的定义。但我们还需要构造一个动态的Web工程,以便测试我们的作品。
为了建立一个动态的Web工程,我们首先为这个插件建立一个新的运行时工作台。我们可以通过Run->Run…来建立这个工作台。如图7所示。
![]() 图7 |
在建立完动态Web工程后,在META-INF文件夹上通过右键菜单中的New->File新键一个叫tutorial.tld的文件。它的内容如下:
<?xml version="1.0" encoding="GB2312" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>tutorial</short-name> <uri>http://oracle.com/tutorial/fake/taglib</uri> <tag> <name>locallyDeclaredBean</name> <tag-class>foo</tag-class> <tei-class>foo</tei-class> <body-content>empty</body-content> <attribute> <name>var</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>classname</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> </taglib> |
package beans;public class MyBean { public String getFooProperty() { return "foo!"; } } |
现在让我们在WebContent目录中建立一个用于测试的JSP文件。然后在这个JSP文件中输入如下的内容:
<%@page contentType="text/html"%> <%@page pageEncoding="GB2312"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@taglib uri="http://oracle.com/tutorial/fake/taglib" prefix="t" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB2312"> <title>JSP 页</title> </head> <body> <f:view> <h1>JSP 页</h1> <t:locallyDeclaredBean var="x" classname="beans.MyBean"/> <h:outputText value="#{}"/> </f:view> </body> </html> |
现在让我们测试它。将你的光标放到outputText标签的空"{}"中,然后按Ctrl-Space调用内容助手。你将看到如图8所示的界面。
![]() 图8 |
![]() 图9 |
JBuilder以往版本:
JBuilder 9.0应用程序设计时尚编程剖析
E夏Java轻松行 JBuilder 2005全接触
凤凰浴火 JBuilder 2006新功能赏析
相关文章推荐
- iOS开发之扩展插件开发配置标签: Host_App App_Extension Containing_App AppGroup_Container NSExtensionMainStory
- JSF扩展插件之prettyFaces
- 【干货】Chrome插件(扩展)开发全攻略
- QTP的WEB插件扩展开发
- 扩展 easyui-tabs 插件 关闭标签页方法
- iOS8扩展插件开发配置
- Jenkins插件开发进阶篇之扩展插件功能
- Java开发王者首部曲 : JBuilder 2007
- 分享Chrome Extension(扩展程序/插件)开发的一些小经验
- Eclipse 插件开发 基于org.eclipse.ui.startup扩展点 实现eclipse启动时执行相关操作
- phoneGap框架及开发扩展插件介绍
- jquery扩展插件开发方法
- 谷歌chrome 插件(扩展)开发——基础篇
- Eclipse 插件开发 -- 深入理解菜单(Menu)功能及其扩展点
- 探索 Word 2007 开发(二):扩展 Ribbon
- App开发如何扩展和使用本地插件(Cordova plugin),基于完全开源免费的框架为例
- nginx lua 插件扩展开发 博客整理
- IE与FireFox下扩展开发插件收集zz
- jQuery 学习第七课 扩展jQuery的功能 插件开发
- Chrome浏览器扩展程序(插件)开发 一