`
hjy2099
  • 浏览: 262688 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

不同Web主机上的Servlet之间数据对象的相互传输

    博客分类:
  • JAVA
阅读更多

由于数据库服务器A和服务库服务器B之间存在着数据的交换,而WEB服务器A并不能直接访问数据库服务器B,同理WEB服务器B也不能直接访问数据库服务器A。这样的交换只能是通过两台Web主机来进行。而在绝大多数时候,我们涉及的是较大规模的数据交换,使用带参数的格式显然不能满足我们的要求,这就涉及了不同Web主机上的Servlet之间数据对象的相互传输的问题。
使用通常的Application域或是Session域的javabean看上去不能满足我们的要求,虽然我们相信会有很多更为完美的方案可以解决这个问题,但是我们今天想看看如何直接通过HTTP连接来完成这样的传输。
首先对于我们的每一个独立的应用来说,两台WEB服务器都会存在一个主次的关系,情况也许是这样的:访问者访问WEB服务器A上的一个servlet A,而这个servlet A产生一个数据对象传输到WEB服务器B上的另一个servlet B,servlet B接收到这个数据对象后对其进行相应的处理,然后它可能还会生成另一个数据对象传输到servlet A中。这样的过程看上去有点象一个远程函数调用的概念。限于篇幅的限制,我们这里讨论一种较为简单的情况,test将passobject传输到test2,test2对passobject进行处理后将其传回到test。

简单示例的源码
passobject.java
首先,我们需要在两台WEB主机上分别建立对passobject的定义,在两台主机上的定义应该是完全一样,这样的类定义和我们通常使用并没有什么不同。只是这样的类必须实现序列化,也就是要实现Serializable:





package test;
import java.io.*;
public class PassObject implements Serializable {
   String PassValue1;
   String PassValue2;
public void setNewPassObject()
   {PassValue1="yzysynew";
    PassValue2="new";
   }
public void setOldPassObject()
   {PassValue1="yzysyold";
   }
}

test.java
在其中的一台web主机上建立。除去加注释的那几行,这完全是一个通常意义上的用于显示的servlet,不过那几行的内容看上去也许会有点让你眼花缭乱。这几行将数据对象传输到了另一台主机的test2中,并接收经过test2处理的数据对象。对于这里所涉及的一些不太常用的API,我们将会在最后一并说明。




package test;
import java.sql.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.io.*;
import java.net.*;
public class Test extends HttpServlet {
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
        throws IOException, ServletException
{PassObject passobject = new PassObject();
 passobject.setNewPassObject();
 PrintWriter out = response.getWriter();
 out.println(passobject.PassValue1);
 out.println(passobject.PassValue2);
  //创建一个新的URL实例url
 URL url = new URL("http://141.56.16.8/examples/servlet/test.Test2");
  //根据url建立连接
 URLConnection con = url.openConnection();
 //设置该连接可写
 con.setDoOutput(true);
 //禁用cache
 con.setUseCaches(false);
 //取出输出流
  OutputStream outs=con.getOutputStream();
 //将该输出流转换为对象输出流
 ObjectOutputStream objout = new ObjectOutputStream(outs);
 //将要传输的对象写入该对象输出流中
  objout.writeObject(passobject);
 //取得返回的输入流
 InputStream in = con.getInputStream();
 //将该输入流定义为对象输入流
 ObjectInputStream objStream;
 objStream = new ObjectInputStream(in);
 //按指定类的格式读取输入流的内容
  try {
      passobject=(PassObject)objStream.readObject();
      out.println(passobject.PassValue1);
      out.println(passobject.PassValue2);
     }
 catch (java.lang.ClassNotFoundException ysy )
     {
      out.println("fail");
     }
 }
    public void doPost(HttpServletRequest request,
                      HttpServletResponse response)
        throws IOException, ServletException
    {
        doGet(request, response);
    }
}


test2.java
在其中的另一台web主机上建立,用来接收test发送的数据对象,并对其进行处理后返回到test。




package test;
import java.sql.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.io.*;
import java.net.*;
public class Test2 extends HttpServlet {
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
        throws IOException, ServletException
    {//封装用于返回的对象输出流
         ObjectOutputStream out = new ObjectOutputStream(response.getOutputStream());
     //封装用于接收的对象输入流
     ObjectInputStream in = new ObjectInputStream(request.getInputStream());
     PassObject passobject=new PassObject();
     //按指定类的格式读取对象输入流中的内容
     try {
         passobject=(PassObject)in.readObject();
         }
     catch (java.lang.ClassNotFoundException ysy )
        {
        }
     //对接受到的数据对象进行处理
     passobject.setOldPassObject();
     //将处理后的数据对象返回到对象输出流中
     out.writeObject(passobject);
    }
    public void doPost(HttpServletRequest request,
                      HttpServletResponse response)
        throws IOException, ServletException
    {
        doGet(request, response);
    }
}


程序中涉及的部分API的说明
java.net.URL
URL类表示了一个统一资源路径。这样的资源可能是一个文件或目录,也可能是更为复杂的诸如数据库的查询或是搜索引擎。
在我们的程序中使用了URL的一种构造函数:
URL(String spec)
直接使用字符串作为构造函数的参数,这实际上是URL的众多构造函数中最为简单的一种。
此外,我们还用到了URL的openConnection()方法:
public URLConnection openConnection()
throws IOException
该方法返回了一个URLConnection对象。每次调用该方法时会开启一个到指定URL的新的连接。
这里需要注意的是,调用该方法的结果是建立了一个连接,这与通常的页面跳转完全是两回事。在更多的情况下,这里仅仅是建立了一个连接的通路,而并没有实现任何其它的操作。
java.net.URLConnection
这是一个抽象类,是所有反映application和一个URL之前的通信的类的超类。这个类的实例可以用来对一个URL表示的资源进行读写。
在我们的程序中我们使用了这个类的如下方法:
getInputStream
public InputStream getInputStream()
throws IOException
返回从这个连接读取的一个输入流
getOutputStream
public OutputStream getOutputStream()
throws IOException
返回一个用于写入这个连接的输出流
setDoOutput
public void setDoOutput(boolean dooutput)
设置该连接是否可以写入
setUseCaches
public void setUseCaches(boolean usecaches)
设置该连接是否使用cache
java.io.OutputStream
这是一个抽象类,是所有反映一个二进制输出流的类的超类。一个这样的输出流可以对二进制数据进行输出或发送。
java.io.ObjectOutputStream
该类用来向一个OutputStream写入java的对象。这个对象可以使用ObjectInputStream进行读取或再造。
只有实现java.io.Serializable接口的对象可以写入该数据流中。
在我们的程序中还使用了该类的writeObject()方法:
public final void writeObject(Object obj)
throws IOException
将指定的对象写入ObjectOutputStream。
java.io.InputStream
这是一个抽象类,是所有反映一个二进制输入流的类的超类。
java.io.ObjectInputStream
一个ObjectInputStream对一个使用ObjectOutputStream写入的对象进行解析。
在我们的程序中使用了该类的readObject()方法:
public final Object readObject()
throws OptionalDataException,
ClassNotFoundException,
IOException
从一个ObjectInputStream中读取一个对象。

程序执行的结果
如果一切正常,访问test.Test你应该可以看到这样的结果:
yzysynew
new
yzysyold
new
其中yzysynew,new是对象原来的内容,而yzysyold,new所反映的那个对象已经是传送到test2后经test2处理过的了。

 

转自:http://www.jspcn.net/htmlnews/11453840698901658.html

分享到:
评论

相关推荐

    java-servlet-api.doc

    Servlet与applets不同的地方是,它不运行在Web浏览器或其他图形化的用户界面上。Servlet通过servlet引擎运行在Web服务器中,以执行请求和响应,请求、响应的典型范例是HTTP协议。 一个客户端程序,可以是一个Web...

    head_first_servlet&jsp学习笔记

    4. **URL剖析**:URL(统一资源定位符)包含协议、主机、路径等信息,用于唯一标识网络上的资源。 5. **Servlet与CGI**:Servlet是Java环境下运行的服务器端程序,比CGI更高效,因为Servlet在服务器中保持活动状态...

    servlet聊天室

    项目完成后,需要在Web服务器上部署。这可能涉及配置服务器环境(如Tomcat)、设置虚拟主机、映射URL等步骤。测试方面,应确保不同浏览器、网络环境下的兼容性,以及在高并发情况下的稳定性和性能。 通过这个...

    Servlet生命周期,http

    HTTP是互联网上应用最为广泛的一种网络协议,用于从Web服务器向客户端(如浏览器)传输数据。它基于请求/响应模型,即客户端发送一个HTTP请求到服务器,服务器处理请求后返回一个HTTP响应。HTTP请求主要包括方法...

    韩顺平Servlet笔记(全)

    - **XML**:一种标记语言,用于存储和传输数据。 - **Servlet+JSP**:Java Web开发的核心技术之一,用于构建动态Web应用程序。 - **Java EE体系**:概述了Java Enterprise Edition平台的架构和组成部分,强调了它...

    servlet-jsp课件

    MIME(Multipurpose Internet Mail Extensions)是一种标准,用于标识网络传输数据的类型,最初用于电子邮件系统,现在广泛应用于Web服务器,帮助服务器正确处理各种类型的数据,例如文本、图像、音频和视频等。...

    968389475012218day08-HTTP&Tomcat&Servlet.zip

    它定义了客户端(如浏览器)和服务器之间交换数据的格式和规则。HTTP协议基于请求/响应模型,用户通过发送请求获取服务器上的资源。请求可以是GET、POST、PUT、DELETE等,而响应则包含状态码(如200表示成功,404...

    J2EEweb讲解(个人修订1.2).doc

    HTTP(超文本传输协议)是互联网上应用最广泛的数据通信协议,用于从Web服务器传输超文本到本地浏览器。HTTP状态码是服务器对客户端请求的响应,常见的状态码如200表示成功,404表示未找到,500表示服务器内部错误。...

    Servlet——编程

    Servlet被广泛应用于Web应用程序中,特别是那些需要处理客户端请求并生成响应的应用程序。Servlet技术由Sun Microsystems开发,并随着Java平台的发展而不断进步。 #### Servlet的核心概念 - **Servlet**:一种运行...

    day14_Servlet&HTTP&Request教案1

    HTTP是一种基于TCP/IP的协议,用于客户端和服务器之间的数据传输。它遵循请求-响应模型,使用80端口进行通信,并且是无状态的,这意味着每个请求都是独立的,服务器不会保存任何关于之前请求的信息。HTTP有多个版本...

    oracle webserver完全教程

    虚拟主机允许在一台服务器上托管多个网站,通过不同的域名或IP地址区分。SSL证书则是实现HTTPS安全连接的关键,确保数据传输的加密性。 在使用Oracle WebServer部署应用程序时,通常会涉及到CGI(通用网关接口)和...

    基于Jsp+Servlet+Java实现的病房管理系统.zip

    5. JavaBean:在JSP和Servlet中,JavaBean是一种遵循特定规则的Java类,通常用来封装业务对象或数据。它们可以被JSP页面通过EL(Expression Language)表达式直接引用,或者在Servlet中创建和传递,提高代码复用性。...

    JSP+Servlet实现发送邮件

    SMTP(Simple Mail Transfer Protocol)是电子邮件系统的核心,用于在邮件服务器之间传输邮件。在Java中,我们可以使用JavaMail API来实现SMTP协议,发送邮件。首先需要配置SMTP服务器的相关信息,如主机名、端口号...

    Java实训教程 Java软件开发实战 web开发技术 第2章 web编程入门 共26页.pptx

    - 灵活:支持多种类型的数据对象,包括文本、图像和视频等。 - 无连接:服务端完成客户端请求后,即关闭连接。 - **HTTP通讯基本过程**: - 客户端向服务器发送请求消息。 - 服务器接收到请求消息后,对其进行...

    jsp/servlet javamail 发送邮件 可发送多个附件

    在Java Web开发中,JSP(JavaServer Pages)和Servlet是两种常见的技术,它们常用于构建动态网页和处理HTTP请求。在这个场景下,我们讨论的是一个使用JSP和Servlet实现的邮件发送系统,该系统具备发送带有多个附件的...

    Servlet过滤器的使用.doc

    Servlet过滤器是Java Web开发中的一个重要组件,它主要用于对用户请求或响应进行预处理或后处理,可以在不修改Servlet本身的情况下增强或改变其功能。通过使用过滤器,开发者可以实现如认证、日志记录、压缩、编码...

    简易在线web聊天室

    【简易在线Web聊天室】是一个...通过以上知识点的介绍,我们可以看出,"简易在线Web聊天室"项目涵盖了Web开发的多个方面,包括前端交互、后端处理、数据传输、安全性和用户体验设计,是学习和实践Web开发技术的好例子。

    Web程序设计课堂笔记.doc

    HTTP(超文本传输协议)是互联网上应用最广泛的数据通信协议,定义了客户端(浏览器)和服务器之间的交互方式。HTTP基于请求-响应模型,特点是无状态、默认端口80,主要包含请求和响应两个部分,常用请求方法有GET、...

    tomcat与web程序结构与Http协议HttpUrlConnection(含答案).pdf

    在Tomcat上发布Web应用,可以通过将应用文件夹放置于`tomcat/webapps`目录下自动部署,或者在`server.xml`中配置虚拟主机,或者在`tomcat/conf/Catalina/localhost`下创建XML配置文件来手动配置。直接访问未经配置的...

Global site tag (gtag.js) - Google Analytics