设为首页 收藏本站
查看: 882|回复: 0

[经验分享] eclipse下Jetty Plugin的开发应用

[复制链接]

尚未签到

发表于 2017-2-26 13:47:13 | 显示全部楼层 |阅读模式
Jetty做为一个轻量级的J2EE Web application server,它不仅小巧,而且性能也比较稳定,效率也挺高,现在也越来越得到广泛的应用。特别是eclipse平台集成了Jetty Plugin后,更是对RCP整合Web Server开发提供了极大的方便。一个非常典型的应用应该就是help帮助系统了,大家可以参看eclipse自已的help系统,从3.3后它就是基于Jetty的,现在的Jetty版本是5.1。
在这里不得不先叉开一个话题,就是servlet-bridge桥的概念。Jetty只是一个单纯的web server服务器,eclipse为了整合框架的考虑,提出了servlet-bridge的概念,对Jetty进行了封装,提供了基于Extension point的servlet注册机制。用户只需要在plugin.xml文件中对相应的Extension point进行扩展,就可以很方便将一个servlet注册到web server上。也就是说,标准的J2EE应用,我们需要一个web.xml文件对所有的servlet,context-param等等进行配置说明;现在这些都基于eclipse http registry所提供的Extension point进行注册,不再需要web.xml文件。
下面,我们看一个plugin.xml的例子。
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin>
   <extension
         point="org.eclipse.equinox.http.registry.httpcontexts">
      <httpcontext
            id="myapp">            
         <resource-mapping
               path="/myapp">
         </resource-mapping>
      </httpcontext>
   </extension>
   <extension
         point="org.eclipse.equinox.http.registry.resources">
      <resource
            alias="/"
            base-name="/"
            httpcontextId="myapp">
      </resource>
      <serviceSelector
            filter="(other.info=org.myapp.jetty.demo)">
      </serviceSelector>
   </extension>
   <extension
         point="org.eclipse.equinox.http.registry.servlets">
      <servlet
         alias="/myfirstservlet"
         class="org.myapp.jetty.demo.servlet.MyFirstServlet"
         httpcontextId="myapp"
         load-on-startup="true">         
      </servlet>
      <servlet
            alias="/*.jsp"
            class="org.eclipse.equinox.jsp.jasper.registry.JSPFactory:/"
            httpcontextId="myapp">
      </servlet>
      <serviceSelector
            filter="(other.info=org.myapp.jetty.demo)">
      </serviceSelector>
   </extension>
</plugin>
这个文件不算复杂,简单解释一下:
1) Extension point - "org.eclipse.equinox.http.registry.httpcontexts"
   这个类似于ServletContext,一般一个web application指定一个,ID是唯一的。 resource-mapping可以指定资源根目录。
2) Extension point - "org.eclipse.equinox.http.registry.resources"
   是资源目录和httpcontext间的影射关系。
3) Extension point - "org.eclipse.equinox.http.registry.servlets"
   这个很关键,就是用这个来注册servlet的。
   其中有两个地方要注意,
  <servlet alias="/*.jsp" class="org.eclipse.equinox.jsp.jasper.registry.JSPFactory:/" httpcontextId="myapp"></servlet>
   这个是注册所有jsp的mapping,一定要写。
   <serviceSelector
            filter="(other.info=org.myapp.jetty.demo)">
  </serviceSelector>
  这一段最好也要保留,不然要多个web app的情况下,可能会产生冲突。
有什么不情楚的,大家可以查看eclipse的帮助。
很可惜,eclipse基本上只提供了这几个Extension point,现在只提供对servlet的支持,暂时还无法支持context-param, filter, listener等等其它的元素。
已经有相应的bug,但似乎不在eclipse的下一步开发计划中。
https://bugs.eclipse.org/bugs/show_bug.cgi?id=199748
而且在实际的开发过程中还发现两个问题:
1) 当调用ServletContext.getRealPath方法获取绝对路径时,返回NULL值。
2) 当在JSP中调用request.getServletPath方法,也是返回NULL值。
所以需要找到别的方法去处理。
在Jetty Server上启动一个Web application,代码非常简单:

Dictionary dict = new Hashtable( );
// configure the port
dict.put( "http.port", port ); //$NON-NLS-1$
// configure the host
dict.put( "http.host", host ); //$NON-NLS-1$
// set the base URL
dict.put( "context.path", "/" + webappName ); //$NON-NLS-1$ //$NON-NLS-2$
dict.put( "other.info", pluginID ); //$NON-NLS-1$
// Startup Jetty web server
JettyConfigurator.startServer( webappName, dict );
ensureBundleStarted( "org.eclipse.equinox.http.registry" ); //$NON-NLS-1$


停止一个Web application,一句代码就够了:
JettyConfigurator.stopServer( webappName );

附件中是我写的一个示例plugin,包含了所有基本的功能。包括启动/停止一个web application,注册servlet,JSP文件示例等等。
大家可以很方便的应用到自已开发的RCP应用中去。
~_~

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-347523-1-1.html 上篇帖子: 如何使 maven+jetty运行时不锁定文件 下篇帖子: maven jetty debug source not fond
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表