`

使用JAVA打造给予浏览器的桌面应用

阅读更多

Original Source: http://blog.terac.com/andy/e_329.html
对于普通用户来说,使用传统的桌面应用程序(可能采用不同语言和工具开发的)可能存在这样那样的限制,比如界面风格千变万化、操作习惯不统一、学习难度大、无法或很难和外部应用通信等。而传统的服务器端应用程序或网站也存在许多限制,比如网络连通可能出现问题、响应速度慢、不能保证服务器端始终可用、担心数据安全和个人隐私问题、不够灵活、使用不方便等。

 而基于浏览器的桌面应用程序正是综合桌面应用程序和服务器端应用程序的功能产生的。它包含以下优点:

  • 跨平台的、统一的、简单易用的操作界面(基于浏览器,比如IE或FireFox,用户只须要熟悉浏览器,而不必关心是机器运行的Windows、Mac OS X还是Linux,甚至不要OS,只要能运行Browser和JVM的硬件)
  • 真正的去中心化应用(Decentralized application),每个应用即可以当成桌面应用程序,又可以当成服务器端应用程序(只要联网并开放端口就可以允许其他人远程运行)。这是Web 3.0吗?
  • 应用XML进行通信,不用考虑本地服务(Local service)还是远程服务(Remote service)之间的区别
  • 轻量级、易开发
  • 。。。

基于浏览器的桌面应用程序(Browser-based desktop application)的定义:一个包含嵌入式网站服务器(Embedded web server)的能够在浏览器内的客户端的独立运行(Stand alone)的应用程序。

我把基于浏览器的桌面应用程序(Browser-based desktop application)简称为BBDA。其实BBDA和AJAX技术一样,也是一个buzzword,而不是什么新技术,只不过把几种通用的软件或技术组合在一起而已。和传统的重量级的Portal系统不同的是,BBDA是轻量级网络应用(Light weight web application),XML(Feed / RSS / XML-RPC / SOAP)是联系各个服务或应用的纽带。

其实,BBDA很符合目前热炒的WebOS(基于网络浏览器的操作系统)的特性,这方面Google做了个最好的Demo:Google Desktop, 在GD中,一切内容的表现都是网页(虽然隐藏了浏览器),并且很容易和Google网站进行通信(比如同时搜索本地和搜索Web,利用Feed(RSS)或XML-PRC或SOAP之类的协议读新闻、邮件、天气预报、股票行情等,微软该称RSS为Feed好像很有道理吧?)。现在GDS(Google Desktop Search)只是GD的一个模块而已,百度的桌面搜索只是单纯地模仿了GDS,却没有猜到原来Google是要做GD,好傻的百度。Google这几年的收购和挖人活动(Google Net, Google Browser等),看来一切都是为了WebOS而努力。这里顺便说一下Yahoo刚收购的Konfabulator,Konfabulator和GD有很大不同,我觉得它只是包含许多小软件或和网站交互的工具,只是个玩具箱而已,要做WebOS靠这个可以吗?看来Yahoo的眼光似乎始终不如Google。找到这篇文章:GoogleOS? YahooOS? MozillaOS? WebOS? 居然和我的想法如此相似(写这个之前我绝对没看过这篇文章)!

由于我主要做Java开发,所以只列出可能涉及的Java软件包:Browser(IE/FireFox), JDK, Tomcat/Jetty, HSQLDB/Apache Derby, Hibernate, Spring, Groovy, DOM4J,Apache Http Client, Lucene, Struts/WebWork/JSF/Tapestry/Wicket, DWR(AJAX), Apache Web Services(SOAP/XML-RPC), Apache POI(Word/Excel/ PDF), MP3 ID TAG 3 lib ,JPEG EXIF lib...

我的目的是组合几种通用的JAVA软件,用来进行快速的BBDA开发。对于开发者而言,只要选好合适的软件,并合理组合起来,完全可以达到或超过Ruby on rails的功能和开发效率。同时,对于普通用户而言,只要打开浏览器输入http://localhost就会进入Dashboard(ProtoPage是个很好的Prototype^_^,Start也不错),然后就可以管理日记(blog)、日历、通讯录、照片(flickr?)、音乐(itunes?)、文件、网摘(delicious?)、阅读订阅的RSS(bloglines?)、查看邮件(web mail)、新闻之类等,并可以进行搜索、共享、发布、与外部应用或网站同步等,构成一个完整的个人门户系统(Personal portal),XML(Feed / RSS / XML-RPC / SOAP)是联系各个服务或应用的纽带。

 

关于嵌入式网站服务器(Embedded web server):

我这几天试用了Jetty和Tomcat。总以为Jetty很小呢,最适合做BBDA呢,结果发现软件包也很大了,另外很多功能不如Tomcat,Tomcat Embed 5.5由于使用Ecipse JDT,现在已经很小了(3M左右),而且标准,所以选了Tomcat Embed(这里下载)。下面的代码是Tomcat Embed的启动程序。

关于嵌入式网站服务器(Embedded web server): 

我这几天试用了Jetty和Tomcat。总以为Jetty很小呢,最适合做BBDA呢,结果发现软件包也很大了,另外很多功能不如Tomcat,Tomcat Embed 5.5由于使用Ecipse JDT,现在已经很小了(3M左右),而且标准,所以选了Tomcat Embed(这里下载)。下面的代码是Tomcat Embed的启动程序。 

Start.java: 

package com.terac.tomcat;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Host;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.startup.Embedded; 

public class Start {
 public static void main(String[] args) {
  try {
   String path = System.getProperty("SERVER_HOME");
   if(path!=null&&!"".equals(path)){    
    int port = Integer.parseInt(System.getProperty("SERVER_PORT","8080"));
    startTomcat(path,port);
   }   
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 private static void startTomcat(String path,int port) throws UnknownHostException,
   LifecycleException {
  System.setProperty("catalina.home", path);
  Embedded embedded = new Embedded();
  Engine engine = embedded.createEngine();
  engine.setName("Engine");
  Host host = embedded.createHost("localhost", "web");
  Context rootContext = embedded.createContext("", "");
  rootContext.setPrivileged(true);
  host.addChild(rootContext);
  engine.addChild(host);
  engine.setDefaultHost("localhost");
  embedded.addEngine(engine);
  Connector connector = embedded.createConnector((InetAddress) null,port, false);
  embedded.addConnector(connector);
  embedded.start();
 }
} 

start.bat: 

@set classpath=./lib/所有的jar文件
@java -DSERVER_HOME=%cd% -DSERVER_PORT=80 -classpath %classpath% com.terac.tomcat.Start 

关于嵌入式数据库(Embeded database): 

Apache Derby虽然比HSQLDB强大,但还是太大了,尤其是当用到IBM的JDBC Driver时。所以只好选HSQLDB。下面的代码是利用ServerContextListener在Web应用程序启动时启动HSQLDB服务器。 

HSQLDBServletContextListener.java: 

package com.terac.hsqldb;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; 

public class HSQLDBServletContextListener implements ServletContextListener {
 public void contextInitialized(ServletContextEvent evt) {
        try {
            ServletContext context = evt.getServletContext();
            String params = "port=9001;silent=true;trace=false;database.0=" +
                context.getRealPath("/") + "/WEB-INF/hsqldb/terac";
            org.hsqldb.Server server = new org.hsqldb.Server();
            server.putPropertiesFromString(params);
            server.setLogWriter(null);
            server.setErrWriter(null);
            server.start();
        } catch (Exception e) {
            System.err.println(e);
        }
    }
    public void contextDestroyed(ServletContextEvent evt) {
        Connection conn = null;
        try {
            Class.forName("org.hsqldb.jdbcDriver");
            conn = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:9001",
                    "sa", "123456");
            Statement stmt = conn.createStatement();
            stmt.executeUpdate("SHUTDOWN;");
        } catch (Exception e) {
            //
        }
    }
} 

web.xml中需要加入listener: 

com.terac.hsqldb.HSQLDBServletContextListener 

关于全文检索引擎(Full text search engine): 

Apache Lucene应用广泛,也足够强大,高亮显示(Highlighting)需要自己实现,自动摘要(autosummarize)需要Classifier4j 。下面是常用类的封装代码: 

Indexer.java: 

还未整理好 

Searcher.java: 

还未整理好

关于Shell: 

有些时候,用户不满足已经有的服务,需要更灵活的、或者定制的功能,一个简单的、易学的、解释性的、交互式的Shell就显得很必要,比如Windows提供的cmd或Linux里的bash。研究了一下,发现Groovy正好能满足需要,“for (ch in "Hello world!") {println ch}”,这个稍微复杂点儿的Hello world很好懂吧?

关于时间服务(Time Service): 

Windows里有计划任务(Schedule task),Linux里有Cron job,这个对于WebOS也是必须的,比如定时检查邮件,定时抓新闻等等都需要定时器(Timer),Spring framework封装了好几种Time service,足够了。

关于对象关系映射工具(OR mapping tools): 

Hibernate是最常用最强大的工具。下面是Hibernate Session的封装代码(也可以利用Spring framework来管理): 

HibernateUtil.java: 

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.Session;
import net.sf.hibernate.cfg.Configuration;
import org.apache.log4j.Logger; 

public class HibernateUtil {
 private static Log log = LogFactory.getLog(HibernateUtil.class); 
 public static final ThreadLocal threadSession = new ThreadLocal();
 private static final SessionFactory sessionFactory;
 static {
  try {
   sessionFactory = new Configuration().configure().buildSessionFactory();
  } catch (Throwable ex) {
   // We have to catch Throwable, otherwise we will miss
   // NoClassDefFoundError and other subclasses of Error
   log.error("Building SessionFactory failed.", ex);
   throw new ExceptionInInitializerError(ex);
  }
 }
    public static Session currentSession() throws HibernateException {        
        Session s = (Session) threadSession.get();
        if (s == null) {
            s = sessionFactory.openSession();
            threadSession.set(s);
        }
        return s;
    }
    public static void closeSession() throws HibernateException {
        Session s = (Session) session.get();
        session.set(null);
        if (s != null)
            s.close();
    } 
} 

关于模型-视图-控制框架(MVC framework): 

现在的MVC framework太多了,传统的有Struts/WebWork,新的有JSF/Tapestry/Wicket/Flex&Laszlo(Flash RIA) ,Wicket网站列出了55种之多!我试过JSF,始终不能另我满意,正在研究Wicket和RIFE(这两个都支持AJAX),新加一个Stripes(采用Java 5 Annotations,所以不需要XML配置文件,非常简单)。

关于文件系统(File system): 

Apache Commons Virtual File System - Commons VFS provides a single API for accessing various different file systems. It presents a uniform view of the files from various different sources, such as the files on local disk, on an HTTP server, or inside a Zip archive. 越来越好玩了:)

另外,发现在Windows系统下PHP5也可以在Tomcat下运行(Running php 5.x on windows using tomcat 4.x or 5.x - Simple Thoughts - Java and Web Software)。BBDA with PHP:),不知道PHP的基于文本的数据库都有哪些?我试了一下,phpinfo和一个简单的基于文本的PHP留言本可以使用,phpMyAdmin和几个PHP的blog不能运行,Tomcat直接Crash。 

我已经把BBDA框架和以前写的一个非常简单的Struts/Hibernate单用户相册程序打包了,这里下载,下载后解压缩就能用(需要安装好JDK,并设置好path)。login.do是管理界面登陆入口,秘密是:111111。

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java实现内置浏览器

    Java实现内置浏览器是一种技术实践,它允许开发者在Java应用程序中集成一个Web浏览器组件,使得用户可以在应用程序内部浏览网页,提供类似桌面应用的体验。这种方式通常使用JavaFX或Swing库来构建用户界面,并通过...

    使用Java开发的浏览器,基于Chromium.zip

    综上所述,"使用Java开发的浏览器,基于Chromium"是一个涉及多领域知识的项目,包括Java编程、GUI设计、网络编程、安全性、性能优化和跨平台技术等。开发者需要对这些领域有深入理解,才能构建出高效、安全、易用的...

    java调用chrome浏览器内核cef实现,非jxbrowser

    Java调用Chrome浏览器内核是开发桌面应用时一个常见的需求,尤其在需要嵌入Web页面或者与Web内容交互的场景下。CEF(Chromium Embedded Framework)是一个开源项目,它允许开发者将Google Chrome的Blink渲染引擎和V8...

    Java-Swing嵌入浏览器(本地浏览器和webkit浏览器-火狐内核)

    Java Swing 是Java GUI编程库的一部分,它允许开发者创建桌面应用程序。在某些场景下,我们可能需要在Swing应用中嵌入一个浏览器组件,以便展示网页内容或者与Web服务交互。这个压缩包文件“Java-Swing嵌入浏览器...

    java图片浏览器java图片浏览器

    java图片浏览器java图片浏览器java图片浏览器java图片浏览器java图片浏览器java图片浏览器java图片浏览器java图片浏览器java图片浏览器java图片浏览器java图片浏览器java图片浏览器java图片浏览器java图片浏览器java...

    java集成webkit浏览器

    Java集成WebKit浏览器是一种技术实践,它允许Java应用程序利用WebKit渲染引擎来展示网页内容。WebKit是一个开源的Web浏览器引擎,被广泛应用于Safari、Chrome等知名浏览器。在Java中集成WebKit,开发者可以创建具有...

    java简易自制浏览器

    java简易自制浏览器 java简易自制浏览器 java简易自制浏览器 java简易自制浏览器 java简易自制浏览器 java简易自制浏览器

    java编写的图片浏览器

    “java”标签表明这个项目使用Java语言进行开发,这是广泛应用于桌面应用、服务器端应用以及Android移动应用的通用编程语言。"图片"标签表示项目与图像处理有关,可能涉及到Java的AWT(Abstract Window Toolkit)或...

    java模拟微信浏览器访问.rar

    在Java编程中,模拟微信浏览器访问Web页面是一个常见的需求,特别是在自动化测试、数据抓取或者模拟用户行为的场景。这个“java模拟微信浏览器访问.rar”压缩包中的主要文件是“MonitorWeixinBrowser.java”,我们...

    Java嵌入谷歌内核简单浏览器跨平台

    Java 嵌入式浏览器是将网页浏览功能集成到 Java 应用程序中的技术,使得开发者可以在自己的应用中实现网页展示、数据交互等功能。这里提到的"Java嵌入谷歌内核简单浏览器跨平台"项目,显然是利用了谷歌浏览器的渲染...

    JAVA(GUI)中嵌入浏览器页面

    本文将深入探讨如何在JAVA GUI中嵌入浏览器页面,以实现类似的功能,如在桌面应用中打开和显示网页。 首先,我们需要了解的是Java中用于嵌入浏览器的API——Java Desktop Integration Components (JDIC)。JDIC 是一...

    Java做的浏览器小程序

    Java编程语言以其强大的功能和广泛的应用领域而闻名,它可以用于创建各种类型的应用程序,包括桌面应用、移动应用、服务器端应用以及我们今天讨论的主题——浏览器小程序。这些小程序通常是在Java环境中运行,提供一...

    把java web应用包装成桌面应用的简单做法

    把java web应用包装成桌面应用的简单做法 把java web应用包装成桌面应用的简单做法 把java web应用包装成桌面应用的简单做法 把java web应用包装成桌面应用的简单做法

    uc java浏览器所有版本集合

    开发者可以通过对比不同版本,研究UC浏览器的技术演进,了解如何在Java平台上实现高效浏览器应用。对于普通用户,如果遇到新版本不兼容或者运行问题,也可以尝试回退到旧版本来解决问题。 总的来说,这个集合对于...

    Java实现调用远程桌面示例

    总结起来,`properJavaRDP`提供了一种灵活的方式,让Java开发者能够轻松地在自己的应用中实现远程桌面功能,无论是桌面应用还是Web应用。在使用过程中,理解库的工作原理、正确配置连接参数、处理好安全性问题以及...

    漂亮的java嵌套浏览器IE,chrome

    Java内嵌浏览器是一种在Java应用程序中集成Web浏览功能的技术,使得用户可以在不离开主应用界面的情况下访问和交互网页。在给定的标题“漂亮的java嵌套浏览器IE,chrome”中,我们可以看出这是关于一个Java库,它...

    java编写的简单浏览器

    它展示了Java在开发桌面应用方面的强大能力,同时也为学习者提供了一个理解浏览器工作原理的实践平台。通过这个项目,开发者可以深入学习Java的图形用户界面设计、网络通信以及HTML解析等相关知识。

    Java调用浏览器打开URL地址

    首先,Java提供了`Desktop`类,它是`java.awt.Desktop`包的一部分,可以用来与用户的桌面环境进行交互,包括打开浏览器、编辑文件、打印文档等。以下是一个简单的示例,展示如何使用`Desktop`类打开URL: ```java ...

    基于java语言的浏览器设计与实现.doc

    Java 语言在浏览器设计中的应用非常广泛,包括图形界面设计、网络编程、Swing 编程等。 8. Eclipse 在浏览器设计中的应用 Eclipse 在浏览器设计中的应用非常广泛,包括 Eclipse 编程环境、Swing 编程、网络编程等...

    Java内嵌Chrome浏览器 并实现web项目获取MAC地址

    JxBrowser是一个强大的Java库,允许开发者在Java应用中直接集成Chromium引擎,提供与桌面版Chrome相似的浏览体验。BrowserSwing则是一个使用Java Swing组件来展示Web页面的库,它利用了WebStart技术,可以加载和显示...

Global site tag (gtag.js) - Google Analytics