Applet与Servlet之间的联系一般是间接的,即页面请求由浏览器发送给Servlet,作为回答,Servlet将结果生成HTML文档发送给浏览器。很多时候在Servlet与Applet之间建立直接的联系是没有必要的,但如果要显示一些实时的动态数据,如聊天室窗口、新闻显示、股市行情等,建立两者之间的直接联系就很有用了。特别地,在较为复杂的分布式Java应用中,这种通讯更是必不可少。在客户端Java程序与服务器端Java程序之间建立这种复杂的交互方式仅仅使用Servlet与Applet API是不够的,本文为你介绍和比较四种通讯方式:通过HTML页面传递参数,用java.net包的网络功能建立直接网络连接,远程方法调用(RMI)与CORBA。 
   一、通过HTML页面传递Applet参数    通过HTML页面传递参数是在Servlet与Applet之间建立联系最为常用的方法。Servlet只要把传递给Applet的参数写入HTML页面就可以了。这种通讯是单向的,用于实现Servlet对Applet的控制。其实现方法类如: 
// doGet()方法生成一个包含Applet的HTML页面, 
// 该Applet需要一个Data参数 public void doGet(HttpServletRequest request,HttpServletResponse response) 
throws ServletException, IOException { 
response.setContentType("text/html"); 
PrintWriter out = new PrintWriter ( response.getOutputStream()); 
out.write("< HTML>< HEAD>< TITLE> HTML Example< /TITLE> < /HEAD>< BODY>"); 
out.write("Servlet通过PARAM标记传递参数给Applet. "); 
out.write("< APPLET code=\"SimpleApplet\" width=\"225\" height=\"149\">"); 
// 写入PARAM标记 
out.write("< param name=\"Data\" value=\""); 
out.write(java.text.DateFormat.getDateInstance().format(new java.util.Date())); 
out.write("\">< /APPLET>< /BODY>< /HTML>"); 
out.close(); 
}    这种方法很简单,但它有两个缺点。首先,所有参数都是静态的,即一旦HTML页面发送完成,要更新其中部分数据就很困难了。虽然可以使用HTTP的刷新机制,但这种刷新需要重新下载整个页面,效率是很低的。第二,如果需要传递给Applet的数据量很大或数据结构很复杂,就会使得HTML页面过于庞大或复杂了。    二、用java.net包建立双向通讯    第二种方法是利用java.net包提供的网络能力。以有连接流通讯方式为例,在服务器端的操作为一般为:    ⑴ 创建一个ServerSocket对象,在指定端口监听客户端发来的请求。    ⑵ 在接收到请求时accept()方法将返回一个Socket对象。    ⑶ 用上述Socket对象创建输入、输出流对象。    ⑷ 通过输入、输出流与客户交互。    ⑸ 交互完毕,关闭输入、输出流与Socket。    ⑹ 服务程序运行结束,关闭ServerSocket。    实现代码代码类如: try{ boolean flag=true; 
Socket clientSocket=null; ServerSocket serverSocket = new ServerSocket(0); 
System.out.println("Server listen on: " +serverSocket.getLocalPort()); 
while(flag){ 
clientSocket=serverSocket.accept(); 
DataInputStream is=new DataInputStream( new bufferedInputStream(clientSocket.getInputStream())); 
PrintStream os=new PrintStream( new bufferedOutputStream(clientSocket.getOutputStream())); 
// 处理Applet请求 
os.close(); 
is.close(); 
clientSocket.close(); 

serverSocket.close(); 
}catch( IOException e){ 
System.err.println(" Exception: "+e); 
}    在客户端的操作为:    ⑴ 创建Socket对象建立与服务器的连接。    ⑵ 用该Socket对象创建输入、输出流。    ⑶ 与服务器交互。    ⑷ 交互完毕,关闭输入、输出流与Socket。    实现代码类如: 
try { 
Socket clientSocket =new Socket("serverName",7); 
OutputStream os=clientSocket.getOutputStream(); 
DataInputStream is=new DataInputStream( clientSocket.getInputStream()); 
// 其它操作. 
os.close(); 
is.close(); 
clientSocket.close(); 
}catch(Exception e){ 
System.err.println("Exception:"+e); 

解决方案 »

  1.   

    第一可以使用URL的连接,以下是代码。
    第二可以用Socket连接。import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    import java.sql.*;
    import java.util.*;
    import javax.sql.*;/**
     * Title:
     * Description:
     * Copyright:    Copyright (c) 2002
     * Company:
     * @author
     * @version 1.0
     */public class DbServlet extends HttpServlet {  Connection dbCon;  public void init() throws ServletException{
        try {
          Class.forName("oracle.jdbc.driver.OracleDriver");
          String dbURL = "jdbc:oracle:thin:scott/tiger@yuanyp:1521:orcl";
          dbCon = DriverManager.getConnection(dbURL);
        } catch (Exception e) {
          System.out.println("Database connect failed (init) ");
          System.out.println(e.toString());
          return;
        }
      }  public void doGet(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException {    PrintWriter out = res.getWriter();
        res.setContentType("text/html");    String qry = req.getParameter("qry");    System.out.println(qry);
        try {
          Statement s = dbCon.createStatement();
          ResultSet rs = s.executeQuery(qry);
          while (rs.next()) {
            out.println(rs.getString(1) + " -  " + rs.getString(2));
            out.println(rs.getString(3));
            out.println(" ");
            out.getClass();
          }
        } catch (SQLException e) {
          System.out.println(e.toString());
          return;
        }    out.println();
        out.close();    Vector vect1 = new Vector();
        vect1.addElement("1111");    HttpSession session = req.getSession(true);
        session.setAttribute("my",vect1);
        out.println((String)session.getAttribute("my"));  }  public void destroy() {
        try {
          dbCon.close();
        } catch (Exception e) {
          System.out.println("Error closing database (destroy) ");
          System.out.println(e.toString());
        }
      }  public void doPost(HttpServletRequest req,
                         HttpServletResponse res)
          throws ServletException, IOException {
        doGet(req, res);
      }
    }
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.net.*;
    import java.applet.Applet;/**
     * Title:
     * Description:
     * Copyright:    Copyright (c) 2002
     * Company:
     * @author
     * @version 1.0
     */public class DbApplet extends Applet implements ActionListener{
      TextField tfQuery;
      TextArea taResults;
      Button btnExecute;  public void init() {
        Panel p1 = new Panel();
        p1.setLayout(new FlowLayout(FlowLayout.LEFT));    p1.add(new Label("Query String:"));    tfQuery = new TextField("", 50);
        p1.add(tfQuery);    btnExecute = new Button("Execute Query");
        btnExecute.addActionListener(this);
        p1.add(btnExecute);    add("North", p1);    taResults = new TextArea(10, 80);
        add("Center", taResults);
      }  public void executeQuery() {
        String qryString = tfQuery.getText();    try {
          /*    */
          //Vector m_v = new Vector();
          //m_v.addElement(test_v);
          //test_v.test = "aaaaa";      String qry = URLEncoder.encode("qry") + "=" + URLEncoder.encode(qryString);      System.out.println(qry);
          URL url = new URL("http://localhost:8080/servlet/DbServlet" + "?" + qry);      URLConnection uc = url.openConnection();
          uc.setDoOutput(true);
          uc.setDoInput(true);
          uc.setUseCaches(false);
          uc.setRequestProperty("Content-type",
                        "appplication/x-www-form-urlencoded");      DataOutputStream dos = new DataOutputStream(uc.getOutputStream());
          //ObjectOutputSteam oos = new ObjectOutputSteam(uc.getOutputStream());
          //ObjectOutputSteam.writeObject(m_v);      dos.writeBytes(qry);
          dos.flush();
          dos.close();      InputStreamReader in = new InputStreamReader(uc.getInputStream());      int chr = in.read();
          while (chr != -1) {
            taResults.append(String.valueOf((char) chr));
            chr = in.read();
          }
          in.close();    } catch(MalformedURLException e) {
          taResults.setText(e.toString());
        } catch(IOException e) {
          taResults.setText(e.toString());
        }
      }  public void actionPerformed(ActionEvent ae) {
        executeQuery();
      }
    }
      

  2.   

    Applet与Servlet之间的联系一般是间接的,即页面请求由浏览器发送给Servlet,作为回答,Servlet将结果生成HTML文档发送给浏览器。很多时候在Servlet与Applet之间建立直接的联系是没有必要的,但如果要显示一些实时的动态数据,如聊天室窗口、新闻显示、股市行情等,建立两者之间的直接联系就很有用了。特别地,在较为复杂的分布式Java应用中,这种通讯更是必不可少。在客户端Java程序与服务器端Java程序之间建立这种复杂的交互方式仅仅使用Servlet与Applet API是不够的,本文为你介绍和比较四种通讯方式:通过HTML页面传递参数,用java.net包的网络功能建立直接网络连接,远程方法调用(RMI)与CORBA。 
       一、通过HTML页面传递Applet参数    通过HTML页面传递参数是在Servlet与Applet之间建立联系最为常用的方法。Servlet只要把传递给Applet的参数写入HTML页面就可以了。这种通讯是单向的,用于实现Servlet对Applet的控制。其实现方法类如: 
    // doGet()方法生成一个包含Applet的HTML页面, 
    // 该Applet需要一个Data参数 public void doGet(HttpServletRequest request,HttpServletResponse response) 
    throws ServletException, IOException { 
    response.setContentType("text/html"); 
    PrintWriter out = new PrintWriter ( response.getOutputStream()); 
    out.write("< HTML>< HEAD>< TITLE> HTML Example< /TITLE> < /HEAD>< BODY>"); 
    out.write("Servlet通过PARAM标记传递参数给Applet. "); 
    out.write("< APPLET code=\"SimpleApplet\" width=\"225\" height=\"149\">"); 
    // 写入PARAM标记 
    out.write("< param name=\"Data\" value=\""); 
    out.write(java.text.DateFormat.getDateInstance().format(new java.util.Date())); 
    out.write("\">< /APPLET>< /BODY>< /HTML>"); 
    out.close(); 
    }    这种方法很简单,但它有两个缺点。首先,所有参数都是静态的,即一旦HTML页面发送完成,要更新其中部分数据就很困难了。虽然可以使用HTTP的刷新机制,但这种刷新需要重新下载整个页面,效率是很低的。第二,如果需要传递给Applet的数据量很大或数据结构很复杂,就会使得HTML页面过于庞大或复杂了。    二、用java.net包建立双向通讯    第二种方法是利用java.net包提供的网络能力。以有连接流通讯方式为例,在服务器端的操作为一般为:    ⑴ 创建一个ServerSocket对象,在指定端口监听客户端发来的请求。    ⑵ 在接收到请求时accept()方法将返回一个Socket对象。    ⑶ 用上述Socket对象创建输入、输出流对象。    ⑷ 通过输入、输出流与客户交互。    ⑸ 交互完毕,关闭输入、输出流与Socket。    ⑹ 服务程序运行结束,关闭ServerSocket。    实现代码代码类如: try{ boolean flag=true; 
    Socket clientSocket=null; ServerSocket serverSocket = new ServerSocket(0); 
    System.out.println("Server listen on: " +serverSocket.getLocalPort()); 
    while(flag){ 
    clientSocket=serverSocket.accept(); 
    DataInputStream is=new DataInputStream( new bufferedInputStream(clientSocket.getInputStream())); 
    PrintStream os=new PrintStream( new bufferedOutputStream(clientSocket.getOutputStream())); 
    // 处理Applet请求 
    os.close(); 
    is.close(); 
    clientSocket.close(); 

    serverSocket.close(); 
    }catch( IOException e){ 
    System.err.println(" Exception: "+e); 
    }    在客户端的操作为:    ⑴ 创建Socket对象建立与服务器的连接。    ⑵ 用该Socket对象创建输入、输出流。    ⑶ 与服务器交互。    ⑷ 交互完毕,关闭输入、输出流与Socket。    实现代码类如: 
    try { 
    Socket clientSocket =new Socket("serverName",7); 
    OutputStream os=clientSocket.getOutputStream(); 
    DataInputStream is=new DataInputStream( clientSocket.getInputStream()); 
    // 其它操作. 
    os.close(); 
    is.close(); 
    clientSocket.close(); 
    }catch(Exception e){ 
    System.err.println("Exception:"+e);