`
axiang_2898
  • 浏览: 90063 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

报表制作的思考--Applet与Servlet通信

阅读更多

对于jasperreport的报表的制作,在客户端不能进行打印,这给用户造成了一定的不便,结合他们给出例子,在applet与servlet的方式下打印报表,于是就想到以下的一些思考:

在今天的多层结构的web应用程序的设计中,我们可以同时使用Java applet和Servlet。Applet为建立功能强大的动态界面提供了便利的机制,Servlet为web服务器或者其他应用服务器处理请求提供了高效率的手段。Sun公司的应用程序模型描述了在Java 2平台下开发企业级的Java应用的最好的规范。一种被推荐的规范是:在前端使用Applet、HTML和JSP,在后端使用Enterprise JavaBeans支持的Servlet及其他成分。
  这种体系结构的关键是在客户端的Applet和在服务器说?ervlet之间的通信。但是由于Applet受浏览器安全模式的限制,在一个Applet中存取数据和信息并不想看上去的那么简单。在这篇文章中,我们将解释在Applet-Servlet结构中开发者所面对的限制,并探讨几个不同的可以在Applet和Servlet之间转输数据的通信策略。如果你已经熟悉Applet和Servlet,这肯定会对你阅读本文有帮助,如果你还不是那么熟悉,那也没关系,我们会简要地介绍它们。

APPLET和SERVLET的简介
Applet
  Java applets实际上是运行在web页面上的Java程序。它是一个继承于java.applet.applet的Java类,它通过引用被嵌入到HTML页面中去,就象一个图像一样。Applet和HTML的组合,可以建立功能更为强大的动态界面。对于一些只用来滚动正文和播放动画的Applet,我们可以在一个企业级的应用程序中利用它来显示和处理来自服务器上的资源的数据。例如,一个Applet可以用来浏览和修改数据库中的记录或者控制运行在服务器上的其他应用程序。
  Java applet除了可以使用它自己定义的类文件外,还可以使用其他的类,不管这些类是独立存在的还是被打包成了一个JAR文件。Applet和它的类文件通过标准的HTTP请求进行分布,所以Applet可以越过web页面数据所在的平台的防火墙进行发送。除非是涉及到保持应用程序完整性的问题,Applet总会在每次用户重新访问web主机时自动刷新并会在客户端保留一段时间。
  我们得感谢Java操作系统的平台无关性,这才使得Applet可以运行在任何拥有Java虚拟机(JVM)的浏览器上。Sun公司的Java插件甚至可以使用可以利用最新版本的JVM编制页面,而不用担心受你的用户的浏览器上的JVM的版本的限制。
  因为Applet是Java平台的扩展,所以在你建立用Applet建立你的web应用程序的界面时,你可以重用已存在的Java组件。正如我们在下面的例子中可以看到的那样,你可以在你的Applet的组件中使用复杂的Java对象来开发本来由服务器端应用程序完成的工作。事实上,你可以编写这样的Java代码,它既可以在Applet上执行,也可以在应用程序内执行。
  Applet具有所有传统的Java应用程序的功能,包括使用Sun公司的JFC/Swing组件。Applets也可以用来制作图形以及应用程序中的用户界面(尽管有些辅助的窗口会被标志为“Warning, Java Applet Window”)。但是不管他们有多么相似,在应用程序和Applet之间还是一些关键性的差别的。例如,我们不得不考虑到我们的Applet是受到安全模式的限制的。
Applet的安全约束
  Applet代码来自于web主机并在最终用户的机器的浏览器中运行。有害的含有病毒的Applet可能会造成破坏性的效果,为了防止这样的Applet,Applet受到安全方面的约束,那就是Applet只可以与提供这个Applet的主机进行通信,而且Applet不能操作最终用户的机器。它们不能读写该用户的文件系统,不能执行上面的程序,也不能检查一些敏感的环境参数。(事实上,我们有一种方法可以回避这种限制,那就是开发者可以利用数字签名的技术对Applet进行标志,这将会询问用户是否可以给予Applet某种特殊的待遇。但是这已经超出我们这篇文章中所讨论的范围了。)此外,Applet不能建立或接受外来的socket连接。所谓外来的是指这个连接超出了提供这个Applet类文件的主机(不是提供引用这个Applet的HTML所在的主机)。
  因为这个安全性的限制,我们与Applet的通信必须采用一种特殊的策略。通信的唯一的途径就是在提供Applet的主机和提供相应的HTML的主机之前的网络连接。
Servlets
  Java servlet是服务器端的组件,它和CGI有很多相似。它可以处理web请求,并返回数据或HTML。Servlet可以访问数据库,进行计算,并和Enterprise JavaBean这样的组件进行通信。与CGI程序不同的是,Servlet是持久有效的,也就是说,它只要被示例一次就可以不断地处理请求(这些请求很可能是同时发生的)。因此,Servlet比CGI来得更高效。
  Servlet运行在一个Servlet引擎中,通常是在一个web服务器或应用程序服务器上。Netscape Enterprise Server 4.0和Netscape Application Server都支持最新版本的Java servlet规范。和Applet不同,Servlet不受安全约束的限制。因为Servlet是完全在服务器上运行的,它具有所有操作系统所允许的性能。
  Servlet可以用来很方便地建立在Applet和Web浏览器这样的客户端和企业应用程序的核心之间的连接。对于客户端来说,向Servlet发出的请求与其他web请求并没有任何不同。客户端通过一个URL来接受返回的信息,正如我们看到的那样,返回的信息并不一定只能是HTML,实际上我们可以通过HTML协议发送和接受任何类型的数据。

构造方法
  一个企业级的应用程序可以有几种方法来构造Applet和Servlet的使用。我将向大家介绍三种不同的构造方法,并对它们的优缺点进行比较。
  第一种方法实际上只使用了Applet而没有使用Servlet,尽管Applet受到它们的安全模式的限制,但是Applet还是可以使用象JDBC、RMI这样的协议来访问象数据库、LDAP目录和Enterprise JavaBeans组件这样的后端信息。这种构造方法如图1所示。这种方法虽然看上去很简单,但是这并不是一个好的方法,它会带来很多的问题。首先, 这种安排要求你将所有的访问信息直接嵌入到你的Applet代码中。数据库用户名、口令、服务器标识,所有的这一切都必须包含在你的Applet代码中,这样最终用户就有可能从类文件中搜集到这些信息。此外,数据库或任何其他你访问的系统都必须在提供Applet的同一台服务器上。这意味着你的服务器将不得不承担双重的负担,它既是一个web服务器,也是一个数据库服务器。典型的情况是,你的后端资源可能受到防火墙的保护,但是在这种情况下,这是不可能的,因为运行在客户端上的Applet必须直接访问你的机器。最后,使用这种方法,你想使用web服务器群集,如果不是不可能的,至少也是很困难的。
图1. 一个双层结构的应用程序构造

  好一点的方法是将与后端资源通信的事务封装到Servlet中,而Applet仅仅用来处理前端的工作。在这种构造方法中,正如我们在图2中所示的那样,Servlet克服了Applet固有的安全约束,并用来控制Applet访问企业信息系统和事务逻辑。当Servlet接受到一个请求时,它会在后端数据库中查询信息、执行计算、处理对代表Applet的信息的获取并作用于来自Applet的信息。这种方法的一大进步是Applet/Servlet对可以分布在一个后端web服务器的群集上,所有与某一共享的数据库的通信都存在于后端。此外,使用Servlet的设计有助于设计的模块化、抽象应用程序的后端处理商业逻辑并提高设计的灵活性。
图2. 一个三层结构的应用程序构造

  如果你是围绕Enterprise JavaBeans构建你的应用程序,Servlet就成了中间件。EJB组件可以更加有助于将商业逻辑从Servlet中分离出来,并将其更加抽象。在这种情况下,一个Applet与它的Servlet通信,Servlet再与EJB组件通信。就象我们在图3中所示的那样。在应用程序构建中引入由EJB组件、Servlet和前端的applet/HTML这样的层次结构,可以给我们提供最大限度的弹性和性能。尽管这样做你必须附出复杂化和费用的代价。
图3. 一个多层结构的应用程序构造


通信策略
  如果你使用了这样的构造:在前端使用Applet,在后端使用Servlet,那么你将需要执行Applet和Servlet的通信。因为Applet受浏览器的安全模式的限制,我们在对一个Applet存取数据和信息时并没有太多的选择。正如我们在前面提到的,我们不能读取客户端的文件系统、不能运行客户端的程序,由于Applet不是在服务器上运行的,我们也不能访问服务器上的文件系统。我们只能建立到运行在我们的主机上的服务的网络连接。另外,不要忘记应用程序是在一个公开的Internet上发布的,防火墙可能会限制通过HTTP到Servlet或其它web-server模块的会话。事实上,因为Applet本身就是在网络上通过HTTP发布的,所以我们必须准确把握通信的策略。
  假定在客户端的Applet和服务器端的Servlet之间的网络连接是我们可以使用的唯一的通信路径,我们可以有几种方法交换信息。正如你知道的,文字流可以由服务器通过HTTP发放。但是你可能不知道Java对象出可以用这种方式发放。我们将详细地介绍HTTP文字流和HTTP对象流的使用。另外,我们将简单地介绍通过Socket进行通信的方法,当一个应用程序枰??虻摹⒊中?牧?邮保?飧龇椒?崽乇鹩杏谩?br>HTTP文字流
  Applet与Servlet交换信息的最简单地方法就是通过HTTP文字流。Java的URL和URLConnection类型使得从一个URL读取数据变得很容易,你可以不用担心Socket和其它有关网络工作的通常的复杂问题。我们所需要的只是一个服务器端的组件,这个组件应该可以通过URL发放信息。这就是我们在这儿使用Servlet的原因。
  作为一个例子,我们想要监控服务器的JVM所能使用的内存的总数,并在一个Applet中用一个简单的仪表显示它。首先我们需要开发一个Servlet,当通过它的URL访问这个Servlet时可以返回我们所需要绘制仪表的信息。这个Servlet的源代码如清单1所示。
清单1

java 代码
  1. import javax.servlet.*;   
  2. import javax.servlet.http.*;   
  3. public class ShowMemservlet extends Httpservlet {   
  4.   public void doGet(HttpservletRequest req, HttpservletResponse res)   
  5.   throws servletException, IOException {   
  6.     res.setContentType("text/plain");   
  7.     PrintWriter out = res.getWriter();   
  8.     Runtime rt = Runtime.getRuntime();   
  9.     out.println(rt.freeMemory());   
  10.     out.println(rt.totalMemory());   
  11.   }   
  12. }  


  这个非常简单的Servlet会响应一个GET请求(直接通过浏览器或者是象我们在下面将看到的那样通过我们的Applet),并返回两行文字。第一行显示了服务器的JVM的剩余的自由空间,第二行显示了JVM可用的全部空间(译者注:包括已使用的空间)。
  要建立我们的Applet中的仪表,我们只需要建立一个到这个Servlet的连接,将它的InputStream封装到一个DataInputStream中,读出这两个参数,将其转换成数字,并更新我们的仪表。我们可以让我们的Applet执行Runnable接口并在其自己的线程中运行。每隔一秒钟,我们可以运行一个方法来更新我们的仪表。refresh()方法的代码如清单2所示。
清单2

java 代码
  1. private void refresh() throws MalformedURLException, IOException {   
  2.   URL url = new URL(getCodeBase(), "/servlet/ShowMemServlet");   
  3.   URLConnection con = url.openConnection();   
  4.   con.setUseCaches(false);   
  5.   InputStream in = con.getInputStream();   
  6.   DataInputStream textStream;   
  7.   textStream = new DataInputStream(in);   
  8.   String line1 = textStream.readLine();   
  9.   String line2 = textStream.readLine();   
  10.   double freeMem = Double.parseDouble(line1);   
  11.   double totalMem = Double.parseDouble(line2);   
  12.   int usedMem = totalMem - freeMem;   
  13.   int percentUsed = (int100 *(usedMem / totalMem);   
  14.   meter.setLength(percentUsed);   
  15. }   

  正如你看到的,HTTP文字流的使用相当简单而且直接。Applet建立到Servlet的连接,读取它返回的两行信息并对其进行适当的处理。
  使用简单的文字流来交换数据有一个主要的弱点,那就是Applet并不直接理解数据的信息,而是要将其转换成一个有用的格式。在我们的例子中,将字符串转换成数字还不算太复杂,但是当我们试图处理一个更复杂的数据和对象时,转换的工作会很快变得无法控制。事实上,在下面我们可以看到我们一种简单的方法来处理这些复杂的数据。
HTTP对象流
  你也许还没有意识到HTTP连接也可以用来传输二进制的数据,就象传输文本数据一样,但是事实上每次你从一个web看到图象时或者是下载.zip文件时都在使用这个功能。我们可以利用这个功能并结合被称之为“对象序列”的技术从Servlet向Applet传输完整的Java对象。复杂的数据可以很容易地被传输,你不需要做任何解析和解释。
  对象序列允许我们将对象封装到二进制数据流,它可以到达一个OutputStream可以到达的任何地方:磁盘、屏幕或者是在我们的例子中,通过一个HTTP连接到达一个Applet。对象序列是JVM1.1和更高的版本才支持的功能,所以有一些老版本的浏览器不支持这一功能。但是Sun公司的Java插件几乎可以对所有的浏览器进行升级以支持最终版本的Java,这样它就可以支持对象序列。
  使用HTTP对象流和使用HTTP文字流的方法几乎一样。我们建立一个到我们的web主机上的Servlet的URL连接并读取其返回的数据。只不过我们不再是将InputStream封装到DataInputStream中,而是将其封装到ObjectInputStream中。我们可以按照适当的类型读取其中的对象。
  清单3显示了我们用来交换一个对象的一段代码,这个对象用来从Servlet获得有关书目的信息(包括作者、题目、价格和其它信息)。你会注意到在这里我们用ObjectOutputStream取代了清单1中的PrintWriter,其基本概念是相同的。
清单3

java 代码
  1. public void doGet(HttpservletRequest req, HttpservletResponse res)   
  2. throws servletException, IOException {   
  3.   OutputStream out;   
  4.   ObjectOutputStream objStream;   
  5.   out = res.getOutputStream();   
  6.   objStream = new ObjectOutputStream(out);   
  7.   Album album = fetchNextAlbum();   
  8.   out.writeObject(album);   
  9. }   

  这个Servlet会生成书目对象的序列化版本,它可从它的fetchNextAlbum()方法作为一个数据流被接收。如果你通过一个web浏览器来访问这个Servlet,你会看到一堆垃圾,这是因为目前你只能处理文本而不能处理二进制数据的对象序列。请注意这个对象必须执行Serializable接口以使其序列化。此外,任何引用这个对象的其他对象也必须执行Serializable接口。
  在Applet端,每当用户单击Applet的Next按钮时,我们可以使用方法getNextAlbum()(程序如清单4所示)来从服务器获得书目对象。Applet将查询这个对象并显示其中的数据。
清单4

java 代码
  1. private Album getNextAlbum() throws MalformedURLException, IOException {   
  2.   URL url = new URL(getCodeBase(), "/servlet/Albumservlet");   
  3.   URLConnection con = url.openConnection();   
  4.   con.setUseCaches(false);   
  5.   InputStream in = con.getInputStream();   
  6.   ObjectInputStream objStream;   
  7.   objStream = new ObjectInputStream(in);   
  8.   album = (Album)objStream.readObject();   
  9.   return album;   
  10. }   

  正如你看到的,对象流给我们提供了一个非常简便的方法在Applet和Servlet之前交换一组复杂的信息。请注意我们所处理的不是单纯的数据而是对象,所以你可以在客户端和服务器之间重用这个对象。这使得我们的程序更为智能化并且可以防止重复的逻辑处理。
Socket连接
  另外,一种不太常用的Applet和Servlet的通信策略是在两者之间建立Socket连接。这意味着开发者利用Socket连接设计并执行适当的协议来处理两者之间的通信。
  使用Socket的一个大的好处是这个连接是持续的而且是双向的。一个基于HTTP的连接只能短暂地交换信息。如果你想要不断地用新的信息更新Applet,你必须不断地建立新的HTTP连接。而对于一个Socket连接来说,你可以只建立一个与服务器的连接,就能实现不断地更新。
  当然,你可能想要建立一个多线程的系统,这样可以有几个Applet同时与服务器联系。请注意使用Socket有的时候并不是一个适当的方法,绝大多数的防火墙不允许通过罕见的端口号进行通信。然而,在一个内部的Intranet上,这还是一项很有用的技术。

APPLET和SERVLET的协同工作
  在这篇文章中,我们讨论了有关建立一个前端使用Applet、后端使用Servlet的应用程序的一些有用的策略。Applet只有一个唯一的通信路径,但是我们可以有几种在Applet和Servlet之间交换信息的方式。对于简单的数据和信息,我们可以使用纯文本来传输出,,Sun公司的应用程序模型所推荐的策略和我们在这里讨论的一样。将事务逻辑从界面中分离可以使得应用程序更加灵活,易于升级,这样的应用程序也更易于设计和维护。但是这个模型不允许你的Applet直接访问你的企业数据,这会大大减少你的系统的复杂性并大大提高你的系统的安全性。Applet和Servlet的协同工作将有助于建立一个较好的应用。

分享到:
评论
2 楼 itlangqun 2008-12-15  
楼主想法不错哟!!!
但是我想补充一点applet可以通过Socket与服务器端跑的Servlet通信,同样绕过applet的安全性检查.
1 楼 lgx522 2007-05-21  
这是一篇有启发性的好文。

相关推荐

    jasperreport报表模板预览 applet与servlet通信

    标题中的“jasperreport报表模板预览 applet与servlet通信”揭示了本文将要讨论的重点,即如何在Java环境中使用JasperReport库创建报表模板,并通过Applet和Servlet进行数据交互来实现预览功能。JasperReport是一个...

    web打印.doc

    2. **Applet与Servlet之间的通信**:客户端Applet如何与服务器端Servlet进行数据交换。 3. **PDF报表文件的读写操作**:涉及到PDF文件的读取、写入等操作。 4. **Applet的安全打包及其签名**:确保Applet可以在用户...

    家庭理财系统(java+applet).zip

    这个系统可能包含各种功能,如收入和支出记录、预算设定、财务分析以及报表生成等,旨在帮助用户更好地管理他们的财务状况。 【Java技术】Java是一种广泛使用的面向对象的编程语言,具有跨平台的特性,能够在任何...

    家庭理财系统(java+applet)毕业设计—(包含完整源码可运行).zip

    《家庭理财系统基于Java+Applet的实现与分析》 在当今信息化社会,个人和家庭的财务管理变得越来越重要。为了帮助人们更好地管理自己的财务状况,许多软件应用应运而生,其中一种常见的技术实现就是使用Java语言...

    Java项目源码之家庭理财系统的实现(java+applet).zip

    客户端-服务器架构:系统采用客户端-服务器模式,客户端通过浏览器或Applet应用程序与服务器进行通信,服务器负责处理用户请求和管理数据。 分层架构:系统采用MVC(Model-View-Controller)架构,将业务逻辑、数据...

    java技术体系图

    - **Applet**:早期的浏览器嵌入式Java应用。 - **Socket/TCP/UDP/NIO**:网络通信协议和技术。 - **RMI/CORBA**:分布式应用开发技术。 - **Java语法基础**: - **类、抽象类、接口、最终类、静态类、匿名类、...

    基于J2EE的物流信息管理系统的设计与实现

    J2EE的核心优势在于它支持多种组件模型,如Applet、Servlets、JSP以及EJB等,并且提供了一系列的服务来支持这些组件之间的通信,例如事务管理、安全服务等。 ##### 2. J2EE的多层架构 J2EE采用的是典型的多层架构...

    2021-2022计算机二级等级考试试题及答案No.2291.docx

    1. **Java Application与Applet的区别**: - **A. 都包含main()方法**:这个选项是正确的,Java Application确实有main()方法,但Applet通常没有main()方法,除非它被设计为可独立运行。 - **B. 都通过applet...

    2021-2022计算机二级等级考试试题及答案No.1651.docx

    18. 窗体属性与操作 UnloadForm1语句会销毁窗体,不仅使其消失,还会从内存中移除。 19. 获取Servlet的PrintWriter对象 在Servlet中,正确获取PrintWriter对象的语句是`PrintWriter out = response.getWriter();`...

    如何安装与配置oracle应用服务器.pptx

    在这个架构中,Web/应用服务器起着核心作用,它既是Web服务器,直接与Web浏览器进行通信,又作为应用服务器,处理各种动态请求。 Web服务器部分主要基于Apache HTTP服务器,它是业界广泛采用的开源HTTP服务器,能够...

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    JAVA技术体系.pdf

    - **开源技术与框架**:如工作流引擎、规则引擎、搜索引擎、缓存、任务调度、身份认证、报表服务等,这些通常用于构建复杂的企业级系统。 - **分布式开发技术**:JTA、JAAS、JNDI、JavaMail、JMS、WebService、JCA...

    基于MapXtreme的WebGIS的车辆管理系统.pdf

    - **地图服务**:MapXtreme作为一个Servlet与Web服务器相连,通过地图引擎向应用程序提供地图对象、属性和方法,支持基于电子地图的空间分析。 #### 系统功能设计 ##### 车辆定位功能 车载终端接收GPS信号和车辆...

    java开源包1

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包10

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    oracle 应用服务器 安装 ppt

    1. **Apache HTTP Server**:作为Web服务器,Apache HTTP Server是应用服务器的基础,它与Web浏览器通信,通过HTTP协议提供静态文件服务。此外,Apache HTTP Server还能够将无法处理的请求转发给相应的处理模块。 2...

Global site tag (gtag.js) - Google Analytics