转载请保留作者信息:
作者:88250
Blog:http:/blog.csdn.net/DL88250
MSN & Gmail & QQ:DL88250@gmail.com
摘要
上一次,我们分析了KF(Knopflerfish)框架的设计,实践了基于OSGi的应用程序框架的设计。这一讲,我们将基于KF实现的OSGi规范
Http Service,做一个简单的Servlet结合HTML/Javascript的实践。关于基于OSGi的Web开发
在开始前,我们先看一下一些关于OSGi在Web应用方面的尝试。
开发Web应用,最重要的要属Web Server了(亦或Application Server)。在Server的厂商中
IBM、BEA和JBoss应用服务器采用OSGi,虽然目前我们的主要任务的做应用,但是可以了解这些最基本的东西。
好了,简要说一下OSGi在Web上的开发方式:
1. 将Web Server作为Bundle插入OSGi
目前,Apache Jetty可以做到。使用Spring DM(Spring-OSGi)的话,Tomcat的OSGi整合在未来应该也可以做。参考
这个2. 在Web Server内使用OSGi的Bundle
在Web容器里使用Spring DM(Spring-OSGi)可以做到。
目前来说
在Java的Web开发上,Spring Framework是首选,但是如果应用是以OSGi作为底层的话,情况就不同了:
1. 使用Spring,从Web应用开发的角度来说,视图/持久化/事务管理方便,可结合其他框架或技术的选择余地大
2. 使用OSGi,从系统整体开发角度来说,扩展性、维护性超好,系统整体结构清晰,可以把商业/控制逻辑做到很优良的组件话
3. 结合这两者使用的话(Spring DM),支持的扩展有限且技术相当复杂,得不偿失
所以,权衡后,我更偏向与直接使用OSGi来做Web应用,因为现在手头的一个项目只是运用例简单的HTML,AJAX与Servlet。
让我们简单实践一下!
准备
同
上一次 :-)
开工:
1. 创建工程
打开NB6,创建一个普通Java应用工程——OSGiServlet:
注意,www文件夹是存放HTML源文件的地方,要直接放在src文件夹下。然后要导入3个Jar libs:
http_all-2.0.0.jar: OSGi 的 http service实现
knopflerfish-osgi.jar: 基本OSGi实现
servlet-api.jar: Sun的servlet实现
2.编写Activator与Servlet类
/*
*@(#)Activator.java
*
*Thisprogramisfreesoftware;youcanredistributeitand/ormodify
*itunderthetermsoftheGNUGeneralPublicLicenseaspublishedby
*theFreeSoftwareFoundation;eitherversion3oftheLicense,or
*(atyouroption)anylaterversion.
*
*Thisprogramisdistributedinthehopethatitwillbeuseful,
*butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof
*MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.Seethe
*GNULibraryGeneralPublicLicenseformoredetails.
*
*YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense
*alongwiththisprogram;ifnot,writetotheFreeSoftware
*Foundation,Inc.,59TemplePlace-Suite330,Boston,MA02111-1307,USA.
*/
packagecn.edu.ynu.sei.osgiservlet;
importjava.net.URL;
importjava.util.Hashtable;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.knopflerfish.service.log.LogRef;
importorg.osgi.framework.BundleActivator;
importorg.osgi.framework.BundleContext;
importorg.osgi.framework.BundleException;
importorg.osgi.framework.ServiceEvent;
importorg.osgi.framework.ServiceListener;
importorg.osgi.framework.ServiceReference;
importorg.osgi.service.http.HttpContext;
importorg.osgi.service.http.HttpService;
/**
*OSGiactivatorfor<code>InfoServlet</code>.
*@author88250
*@version1.0.0.0,Mar5,2008
*/
publicclassActivatorimplementsBundleActivator{
//Thisismyworld
staticBundleContextbc;
staticLogReflog;
staticfinalStringRES_ALIAS="/";//thehttpserverroot
staticfinalStringRES_DIR="/www";//bundleresourcedirectory
staticfinalStringSERVLET_ALIAS="/servlet/firstservlet";//asmallservlet
Hashtableregistrations=newHashtable();
publicvoidstart(BundleContextbc)throwsBundleException{
this.bc=bc;
this.log=newLogRef(bc);
ServiceListenerlistener=newServiceListener(){
publicvoidserviceChanged(ServiceEventev){
ServiceReferencesr=ev.getServiceReference();
switch(ev.getType()){
caseServiceEvent.REGISTERED:
setRoot(sr);
break;
caseServiceEvent.UNREGISTERING:
unsetRoot(sr);
break;
}
}
};
Stringfilter="(objectclass="+HttpService.class.getName()+")";
try{
bc.addServiceListener(listener,filter);
ServiceReference[]srl=bc.getServiceReferences(null,filter);
for(inti=0;srl!=null&&i<srl.length;i++){
listener.serviceChanged(newServiceEvent(ServiceEvent.REGISTERED,
srl[i]));
}
}catch(Exceptione){
log.error("Failedtosetuplistenerforhttpservice",e);
}
}
publicvoidstop(BundleContextbc)throwsBundleException{
}
voidsetRoot(ServiceReferencesr){
if(registrations.containsKey(sr)){
return;//alreadydone
}
log.info("setrootfor"+sr);
HttpServicehttp=(HttpService)bc.getService(sr);
HttpContextcontext=newHttpContext(){
publicbooleanhandleSecurity(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsjava.io.IOException{
returntrue;
}
publicURLgetResource(Stringname){
//whenregisteringtheroot,itseems
//likewegetnoseparatorbeforethefile.
//Isthatabug??Codebelowisaworkaround
if(name.startsWith(RES_DIR)&&
name.length()>RES_DIR.length()&&
'/'!=name.charAt(RES_DIR.length())){
name=RES_DIR+"/"+name.substring(RES_DIR.length());
}
//defaulttoindex.html
if(name.equals(RES_DIR)){
name="/www/index.html";
}
//andsendtheplainfile
URLurl=getClass().getResource(name);
returnurl;
}
publicStringgetMimeType(StringreqEntry){
returnnull;//serverdecidestype
}
};
try{
http.registerResources(RES_ALIAS,RES_DIR,context);
http.registerServlet(SERVLET_ALIAS,newInfoServlet(sr),
newHashtable(),context);
registrations.put(sr,context);
}catch(Exceptione){
log.error("Failedtoregisterresource",e);
}
}
voidunsetRoot(ServiceReferencesr){
if(!registrations.containsKey(sr)){
return;//nothingtodo
}
log.info("unsetrootfor"+sr);
HttpServicehttp=(HttpService)bc.getService(sr);
if(http!=null){
http.unregister(RES_ALIAS);
http.unregister(SERVLET_ALIAS);
bc.ungetService(sr);
}
registrations.remove(sr);
}
}
/*
*@(#)InfoServlet.java
*
*Thisprogramisfreesoftware;youcanredistributeitand/ormodify
*itunderthetermsoftheGNUGeneralPublicLicenseaspublishedby
*theFreeSoftwareFoundation;eitherversion3oftheLicense,or
*(atyouroption)anylaterversion.
*
*Thisprogramisdistributedinthehopethatitwillbeuseful,
*butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof
*MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.Seethe
*GNULibraryGeneralPublicLicenseformoredetails.
*
*YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense
*alongwiththisprogram;ifnot,writetotheFreeSoftware
*Foundation,Inc.,59TemplePlace-Suite330,Boston,MA02111-1307,USA.
*/
packagecn.edu.ynu.sei.osgiservlet;
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.osgi.framework.ServiceReference;
/**
*ThefirstOSGiservletapplication.
*@author88250
*@version1.0.0.0,Mar5,2008
*/
publicclassInfoServletextendsHttpServlet{
ServiceReferencehttpSR;
publicInfoServlet(ServiceReferencehttpSR){
this.httpSR=httpSR;
}
publicvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,
IOException{
//HandlejustasGET
doGet(request,response);
}
publicvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,IOException{
PrintWriterout=response.getWriter();
response.setContentType("text/html");
out.println("<html>");
out.println("<head>");
out.println("<title>Demo</title>");
out.println("IamasimpleservletbaserunninginOSGi:-)");
out.println("</head>");
out.println("<body>");
try{
}catch(Exceptione){
out.println("<pre>");
e.printStackTrace(out);
out.println("</pre>");
}
}
}
还有一个简单的HTML页面(/www/index.html):
<html>
<head>
<title>TheFirstOSGiServletAppication</title>
</head>
<body>
<h2>TestpageforOSGiwebserver</h2>
<p>
HelloOSGiServlet
</p>
<scripttype="text/javascript">
document.writeln("Testjavascript!");
</script>
</body>
</html>
3. manifest.mf
Manifest-Version:1.0
Bundle-ManifestVersion:2
Bundle-Name:OSGiServlet
Bundle-SymbolicName:cn.edu.ynu.sei.osgiservlet
Bundle-Version:1.0.0.0
Bundle-Category:example
Bundle-Description:DemoHTTPservlet
Bundle-Activator:cn.edu.ynu.sei.osgiservlet.Activator
Import-Package:javax.servlet,
javax.servlet.http,
org.knopflerfish.service.log,
org.osgi.framework,
org.osgi.service.http
4. 测试
编译这个Bundle,安装它到KF里并运行之,结果如下图:
以地址 http://localhost:8080/servlet/firstservlet 访问我们的Servlet:
总结
本次,我们基于OSGi做了一个简单的HTTP/Servlet 容器,可以满足简单的应用。这样,我们可以把我们的应用统一在一个框架里,简化了很多技术细节。但是,做企业应用的话这样是远远不够的,我们也不是太有可能基于OSGi构建一个自己的Application Server,所以,只要容器支持OSGi,结合Spring DM是最好的选择。
分享到:
相关推荐
首先,Java桌面应用开发部分将引导读者了解如何使用NetBeans创建GUI应用程序,包括事件处理、Swing组件的使用以及布局管理器的配置,这些都是构建桌面应用的基础。同时,NetBeans提供的代码补全、调试和版本控制等...
精通NetBeans——Java桌面、Web与企业级程序开发详解精通NetBeans——Java桌面、Web与企业级程序开发详解精通NetBeans——Java桌面、Web与企业级程序开发详解精通NetBeans——Java桌面、Web与企业级程序开发详解精通...
除了JDBC,这些案例可能还涉及其他的Java技术,如Swing或JavaFX进行图形用户界面设计,或者使用Servlet和JSP进行Web应用开发。NetBeans对这些技术都有很好的集成,提供模板和向导帮助快速构建UI组件或Web页面。 ...
通过《精通NetBeans——Java桌面、Web与企业级程序开发详解》这本书,读者将能够全面了解NetBeans的各个功能,并掌握如何利用这个IDE来构建高效、高质量的Java应用。书中可能涵盖了上述所有知识点,并通过实例演示和...
**使用NetBeans开发J2ME应用程序** Java 2 Micro Edition(J2ME)是一种轻量级的Java平台,主要用于移动设备、嵌入式系统和其他有限资源的设备上开发应用程序。NetBeans IDE是一款强大的集成开发环境,它为J2ME应用...
NetBeans作为一款强大的开源集成开发环境,为Java开发者提供了便捷的编码、调试和项目管理工具,尤其在企业级应用开发领域,它能有效提升开发效率。 【描述详解】 1. **J2EE技术**:J2EE是Java平台的企业版,它...
标题中的“第一次使用NetBeans及创建Web应用程序”指的是在Java Web开发中,使用NetBeans IDE进行初阶操作的教程。NetBeans是一款强大的开源集成开发环境,尤其适合Java开发者,它支持多种编程语言,包括HTML5、...
在Web应用开发部分,读者将接触到如何在NetBeans中配置和运行Web项目,使用JSP、Servlet来创建动态网页,并学习如何使用JSF框架构建组件化Web应用。此外,源码分析可以帮助读者掌握MVC架构在Web开发中的应用,以及...
《精通NetBeans——Java桌面、Web与企业级程序开发详解》是一本全面介绍使用NetBeans进行Java编程的书籍,提供了丰富的源代码实例。NetBeans是一款强大的集成开发环境(IDE),尤其在Java领域,它以其易用性和高效性...
《精通NetBeans——Java桌面、Web与企业级程序开发详解》是一本深入解析NetBeans集成开发环境(IDE)的专业书籍,旨在帮助读者掌握利用NetBeans进行高效Java开发的各种技巧和方法。书中涵盖的内容广泛,包括Java桌面...
本文将深入探讨"NetBeans可视化Web开发之数据库应用开发"这一主题,帮助开发者理解如何利用NetBeans进行高效且直观的Web应用程序构建,特别是与数据库交互的部分。 NetBeans是一个开源的、跨平台的IDE,它支持多种...
【标题】:“基于NetBeans开发的Java应用程序集锦5” 【描述】中提及的Java与网络的7个案例,展示了Java在实际应用中的强大功能,包括: 1. **简单多线程服务器**:在Java中,多线程是并发处理的基础,通过实现...
**Java与NetBeans开发平台简介** Java是一种广泛使用的面向对象的编程语言,以其跨平台、安全性高和可移植性等特点闻名。它不仅适用于服务器端应用,也在桌面应用领域有着广泛的应用。NetBeans是一款强大的集成开发...
在本资源"基于NetBeans开发的java应用程序集锦10"中,我们聚焦于使用NetBeans IDE进行Java应用程序的开发。NetBeans是一个强大的开源集成开发环境,尤其适用于Java开发者,它提供了丰富的功能,如代码编辑、调试、...
本教程《NetBeans IDE开发指导》是针对初学者的入门资料,旨在帮助新用户快速掌握该IDE的使用方法,从而高效地进行桌面应用、Web应用、企业级应用以及移动应用的开发。 NetBeans IDE的主要特性包括: 1. **智能...
NetBeans IDE是一个强大的开发环境,支持多种编程语言,包括Java,非常适合创建Servlet应用。本项目“NetBeans Servlet 聊天室”旨在实现一个基于Servlet的实时在线聊天功能,尽管目前尚未实现自动刷新。 【核心...
在这个集合中,有三个具体的实例——九宫格游戏、五子棋应用以及手机背单词程序,这些都是常见的J2ME应用,能够帮助学习者理解基本的移动应用开发逻辑和交互设计。 1. **九宫格游戏**:九宫格是一种经典的逻辑游戏...
《精通NetBeans——Java桌面、Web与企业级程序开发详解》是一本深入解析NetBeans集成开发环境(IDE)的专业书籍,旨在帮助读者掌握利用NetBeans进行高效编程的技能。源代码压缩包包含了第15至27章的示例项目和练习,...
8. **构建与打包**:完成开发后,你可以使用NetBeans的“构建”功能将Java应用打包成可执行的JAR文件,方便分发和部署。 在描述中提到的博客链接(https://javakeith.iteye.com/blog/954091)可能提供了更详细的...