RSS
热门关键字:  下载  cms  模版  开源  dedecms
当前位置 :| 主页 > 站长学院 > JSP教程 >

企业级应用中的Applet和Servlet的通信 (二)

来源:JR 作者:未知 时间:2006-07-25 Tag: 点击:
构造方法

一个企业级的应用程序可以有几种方法来构造Applet和Servlet的使用。我将向大家介绍三种不同的构造方法,并对它们的优缺点进行比较。

第一种方法实际上只使用了Applet而没有使用Servlet,尽管Applet受到它们的安全模式的限制,但是Applet还是可以使用象JDBC、RMI这样的协议来访问象数据库、LDAP目录和Enterprise JavaBeans组件这样的后端信息。

这种方法虽然看上去很简单,但是这并不是一个好的方法,它会带来很多的问题。首先, 这种安排要求你将所有的访问信息直接嵌入到你的Applet代码中。数据库用户名、口令、服务器标识,所有的这一切都必须包含在你的Applet代码中,这样最终用户就有可能从类文件中搜集到这些信息。

此外,数据库或任何其他你访问的系统都必须在提供Applet的同一台服务器上。这意味着你的服务器将不得不承担双重的负担,它既是一个web服务器,也是一个数据库服务器。

典型的情况是,你的后端资源可能受到防火墙的保护,但是在这种情况下,这是不可能的,因为运行在客户端上的Applet必须直接访问你的机器。最后,使用这种方法,你想使用web服务器群集,如果不是不可能的,至少也是很困难的。

好一点的方法是将与后端资源通信的事务封装到Servlet中,而Applet仅仅用来处理前端的工作。在这种构造方法中,正如我们在图2中所示的那样,Servlet克服了Applet固有的安全约束,并用来控制Applet访问企业信息系统和事务逻辑。

当Servlet接受到一个请求时,它会在后端数据库中查询信息、执行计算、处理对代表Applet的信息的获取并作用于来自Applet的信息。这种方法的一大进步是Applet/Servlet对可以分布在一个后端web服务器的群集上,所有与某一共享的数据库的通信都存在于后端。

此外,使用Servlet的设计有助于设计的模块化、抽象应用程序的后端处理商业逻辑并提高设计的灵活性。

如果你是围绕Enterprise JavaBeans构建你的应用程序,Servlet就成了中间件。EJB组件可以更加有助于将商业逻辑从Servlet中分离出来,并将其更加抽象。

在这种情况下,一个Applet与它的Servlet通信,Servlet再与EJB组件通信。在应用程序构建中引入由EJB组件、Servlet和前端的applet/HTML这样的层次结构,可以给我们提供最大限度的弹性和性能。尽管这样做你必须附出复杂化和费用的代价。

通信策略

如果你使用了这样的构造:在前端使用Applet,在后端使用Servlet,那么你将需要执行Applet和Servlet的通信。因为Applet受浏览器的安全模式的限制,我们在对一个Applet存取数据和信息时并没有太多的选择。

正如我们在前面提到的,我们不能读取客户端的文件系统、不能运行客户端的程序,由于Applet不是在服务器上运行的,我们也不能访问服务器上的文件系统。我们只能建立到运行在我们的主机上的服务的网络连接。

另外,不要忘记应用程序是在一个公开的Internet上发布的,防火墙可能会限制通过HTTP到Servlet或其它web-server模块的会话。事实上,因为Applet本身就是在网络上通过HTTP发布的,所以我们必须准确把握通信的策略。

假定在客户端的Applet和服务器端的Servlet之间的网络连接是我们可以使用的唯一的通信路径,我们可以有几种方法交换信息。正如你知道的,文字流可以由服务器通过HTTP发放。

但是你可能不知道Java对象出可以用这种方式发放。我们将详细地介绍HTTP文字流和HTTP对象流的使用。另外,我们将简单地介绍通过Socket进行通信的方法。

Applet与Servlet交换信息的最简单地方法就是通过HTTP文字流。Java的URL和URLConnection类型使得从一个URL读取数据变得很容易,你可以不用担心Socket和其它有关网络工作的通常的复杂问题。我们所需要的只是一个服务器端的组件,这个组件应该可以通过URL发放信息。这就是我们在这儿使用Servlet的原因。

作为一个例子,我们想要监控服务器的JVM所能使用的内存的总数,并在一个Applet中用一个简单的仪表显示它。首先我们需要开发一个Servlet,当通过它的URL访问这个Servlet时可以返回我们所需要绘制仪表的信息。这个Servlet的源代码如清单1所示。

清单1


import javax.servlet.*;
import javax.servlet.http.*;
public class ShowMemservlet
extends Httpservlet 
{
   public void doGet(HttpservletRequest
   req, HttpservletResponse res)
   throws servletException, IOException
   {
      res.setContentType("text/plain");
      PrintWriter out = res.getWriter();
      Runtime rt = Runtime.getRuntime();
      out.println(rt.freeMemory());
      out.println(rt.totalMemory());
   }
}
 



这个非常简单的Servlet会响应一个GET请求(直接通过浏览器或者是象我们在下面将看到的那样通过我们的Applet),并返回两行文字。第一行显示了服务器的JVM的剩余的自由空间,第二行显示了JVM可用的全部空间(译者注:包括已使用的空间)。 

要建立我们的Applet中的仪表,我们只需要建立一个到这个Servlet的连接,将它的InputStream封装到一个DataInputStream中,读出这两个参数,将其转换成数字,并更新我们的仪表。 

我们可以让我们的Applet执行Runnable接口并在其自己的线程中运行。每隔一秒钟,我们可以运行一个方法来更新我们的仪表。refresh()方法的代码如清单2所示。 

清单2 


private void refresh() 
throws MalformedURLException,
IOException
{
   URL url = new URL(getCodeBase(),
   "/servlet/ShowMemServlet");
   URLConnection con = url.openConnection();
   con.setUseCaches(false);
   InputStream in = con.getInputStream();
   DataInputStream textStream;
   textStream = new DataInputStream(in);
   String line1 = textStream.readLine();
   String line2 = textStream.readLine();
   double freeMem = Double.parseDouble(line1);
   double totalMem = Double.parseDouble(line2);
   int usedMem = totalMem - freeMem;
   int percentUsed = 
   (int) 100 *(usedMem / totalMem);
   meter.setLength(percentUsed);
}
 



正如你看到的,HTTP文字流的使用相当简单而且直接。Applet建立到Servlet的连接,读取它返回的两行信息并对其进行适当的处理。 

使用简单的文字流来交换数据有一个主要的弱点,那就是Applet并不直接理解数据的信息,而是要将其转换成一个有用的格式。在我们的例子中,将字符串转换成数字还不算太复杂,但是当我们试图处理一个更复杂的数据和对象时,转换的工作会很快变得无法控制。事实上,在下面我们可以看到我们一种简单的方法来处理这些复杂的数据。
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
热点关注
相关文章