当前位置:  技术问答>java相关

Applet与Servlet怎样建立连接???

    来源: 互联网  发布时间:2015-05-17

    本文导语:  我想在Applet里面直接采用IO流;因而想到了Applet在init()时向Servelt发送请求,然后由Servlet读取文件里的信息,然后反馈给Applet,Applet得到信息。不知这一想法可行否??Applet在init()时如何向Servlet请求??Servlet怎样将信息...

我想在Applet里面直接采用IO流;因而想到了Applet在init()时向Servelt发送请求,然后由Servlet读取文件里的信息,然后反馈给Applet,Applet得到信息。不知这一想法可行否??Applet在init()时如何向Servlet请求??Servlet怎样将信息反馈给Applet??这一请求与反馈的关键代码,有谁能告之一二,不胜感激!!!

|
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 Example "); 
out.write("Servlet通过PARAM标记传递参数给Applet. "); 
out.write(""); 
// 写入PARAM标记 
out.write(""); 
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); 


|
第一可以使用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();
  }
}

|
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 Example "); 
out.write("Servlet通过PARAM标记传递参数给Applet. "); 
out.write(""); 
// 写入PARAM标记 
out.write(""); 
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); 


    
 
 

您可能感兴趣的文章:

  • 请问用applet直接连接服务器上的数据库的办法是否安全
  • 在applet中实现文字超连接
  • applet连接数库时,不同的htm格式导致无法连接数据库?兄弟们帮忙看一下
  • 如何在APPLET中如何连接ORACLE数据库?
  • 我用APPLET连接数据库时出现No suitable driver,是什么意思
  • applet连接sqlserver出错?
  • APPLET连接数据库的问题,请高手指点
  • 再散分。谁能给一些Applet画图的源码例子,给连接也行。
  • 请问谁有Applet连接远程Access数据库并且显示数据库内容的例子!
  • 利用Applet做Client,打开一个Socket连接,则出现java.security.AccessControlException: access denied 问题,有什么简便的方法解决???救命啊,立刻给分啊~~
  • applet连接数据库老折磨我???
  • applet连接数据库,写了一个policy文件,用appletviewer可以browse,但是如何在ie和nc中带那个policy文件?请各位帮忙一下...
  • 在html运行的applet中需要访问oracle,在jb里可以连接,但直接点击html时就出现找不到类“sun.jdbc.odbd.JdbcOdbcDriver"?
  • Applet连接数据库的问题,请大家帮帮忙,过来看一看,指导一下!
  • applet连接数据库(SQL Server),在本机可读出内容,在别的机子上却看不到?
  • 能在applet的菜单里做个超连接吗?
  • 在JBuilder4中做一个applet用jdbc连接Oracle数据库,怎样放入IE中运行?!
  • 怎样在applet中实现文字超连接
  • 如何从SERVLET中调用APPLET?
  • JAVA SERVLET 和 Applet 的 难题!高分相送!!!!!(急!)!
  • applet调用Servlet一个问题探讨。
  • 关于applet与servlet交互访问数据库的问题?
  • applet中怎样带参数访问servlet?
  • 关于在servlet中显示applet的问题。
  • Applet与Servlet的通信问题
  • 为什么applet&servlet不能都放在classes目录中
  • java遐想:能不能把applet与servlet结合起来?
  • java applet和servlet之间是否可以传递对象?
  • 一个关于servlet和applet的简单问题
  • 求助Applet Servlet
  • applet如何向servlet提出POST或GET等请求。最好是举例说明。谢谢。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • (很急)谢谢!我想问一下调用一个对话框的命令语句,比方说我已建立了一个Applet2,接下来该如何在Applet中能点击一个按钮来打开这个Apple
  • 急,我想问一下调用一个对话框的命令语句,比方说我已建立了一个Applet2,接下来该如何在Applet1中点击一个按钮来打开这个Applet2.谢谢
  • 在Applet中如何建立Socket接口???(可能涉及到安全性问题)
  • 急!急!能否用applet建立一个新的进程通过http协议访问服务器上的文件?
  • java命名空间java.applet类applet的类成员方法: applet定义及介绍
  • 如何让Applet里的控件随着Applet大小改变而一直占满整个Applet呢?
  • java命名空间java.applet类applet.accessibleapplet的类成员方法: applet.accessibleapplet定义及介绍
  • 对applet坐数字签名后,如果重新用jar对applet打包,需要重新做applet数字签名吗?
  • java命名空间java.applet类applet的类成员方法: getappletcontext定义及介绍
  • 为什么我的applet编译完,之后除了applet1.class之外,还有一个applet$1.class?
  • java命名空间java.applet类applet的类成员方法: getappletinfo定义及介绍
  • 如何让IE认识applet所带的数字签名,而不是让证书仓库认识这个带数字签名的applet,就是说不装jdk也可以在IE里面使用带有签名的applet,详情请进
  • java命名空间java.applet类applet的类成员方法: isactive定义及介绍
  • 请问application (or applet)如何实现对applet 小程序的调用??
  • java命名空间java.applet类applet的类成员方法: stop定义及介绍
  • 请问能在浏览器调入APPLET后,在APPLET内部改变其自身的大小嘛?
  • java.applet类applet的类成员方法: getcodebase定义及介绍
  • applet 如何启动新的 applet
  • java命名空间java.applet类applet的类成员方法: init定义及介绍
  • 如何把applet窗口里的Java Applet Window去掉?
  • java命名空间java.applet类applet的类成员方法: destroy定义及介绍
  • Applet对本地资源是不能访问的,那如果我要用Applet做打印设计,那如何是好呢??
  • java命名空间java.applet类applet的类成员方法: getparameterinfo定义及介绍
  • Applet问题,applet在tomcat+apache环境下是否支持FileDialog类,急,急 !!!!快来抢分呀!!!!
  • java命名空间java.applet类applet的类成员方法: getdocumentbase定义及介绍
  • Applet中的ArrayList怎么传到javascript中,反之,js中的数组如何传入APPLET中?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3