Applet与Servlet通讯的问题

suzhuxin2001 2003-08-18 04:38:34
我的servlet代码如下:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import javax.sql.*;
import java.sql.*;
import oracle.jdbc.rowset.OracleCachedRowSet;

public class GetZtuDataServlet extends HttpServlet {

static {
try {
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
} catch (Exception e)
{
e.printStackTrace();
}
}

private static final String CONTENT_TYPE = "text/html; charset=GBK";
//Initialize global variables
public void init() throws ServletException {
}
//Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String url="jdbc:oracle:thin:@hdwlserver:1521:ldmisdb";
//orcl为数据库的SID
String user="db_ssxxcx";
String password="123456";
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>读书</title></head>");
out.println("<body>");

try{
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
String St_sql = new String("select * from tb_cdsssjb where fd_cdxh<10000");
ResultSet dbrest = stmt.executeQuery(St_sql);
int k = 0;
String St_dqsz;
Vector vector=new Vector();
while (dbrest.next()&&k<20)
{
St_dqsz = dbrest.getString(3);
out.println("<p>"+St_dqsz+"</p>");
vector.add(St_dqsz);
k++;
}
ObjectOutputStream oos = new ObjectOutputStream(response.getOutputStream());

oos.writeObject(vector);
oos.close();
dbrest.close();
stmt.close();
conn.close();
}
catch (Exception exp){
exp.printStackTrace();
}
out.println("</body></html>");
}
}



相应访问Servlet的Applet的代码如下:

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.io.*;
import java.net.*;
import javax.sql.*;
import netscape.javascript.*;
import java.util.Enumeration;
import java.util.Vector;
import java.util.TimerTask;
import java.util.Timer;
import oracle.jdbc.rowset.OracleCachedRowSet;

public class ZtuApplet extends Applet
{
private boolean isStandalone = false;
static Graphics g;
static int k = 1;
static String msg="a sinmple banner";
static Graphics offGraphics;
static Image offImage;
static Dimension myDimension;
static URL url;
static URLConnection urlcon;
static InputStream inputstream;
static ObjectInputStream ois;


//Get a parameter value
public String getParameter(String key, String def)
{
return isStandalone ? System.getProperty(key, def) :
(getParameter(key) != null ? getParameter(key) : def);
}

//Construct the applet
public ZtuApplet()
{
}
//Initialize the applet
public void init()
{
try {
jbInit();
g = getGraphics();
myDimension = getSize();
offImage = createImage(500, 500);
offGraphics = offImage.getGraphics();
offGraphics.setColor(Color.red);
g.setColor(Color.red);
url = new URL("http://192.168.0.83:7001/AppletWebapp/getztudataservleturl");
urlcon = url.openConnection();
urlcon.setDoInput(true);
urlcon.setDoOutput(true);
urlcon.setUseCaches(false);
urlcon.setDefaultUseCaches(false);
inputstream = urlcon.getInputStream();
ois=new ObjectInputStream(inputstream); //此行出错,抛出StreamCorruptedException:invalid Stream head 异常
}
catch (Exception e)
{
e.printStackTrace();
}
}

public void paint(Graphics g)
{
g.drawString(msg, 30, 50);
ZtuApplet.invoke();
}

//Component initialization
private void jbInit() throws Exception
{
}

//Get Applet information
public String getAppletInfo()
{
return "Applet Information";
}

//Get parameter info
public String[][] getParameterInfo()
{
return null;
}

public static void invoke()
{
try {

InputStream inputstream = urlcon.getInputStream();

ObjectInputStream ois=new ObjectInputStream(urlcon.getInputStream());
vector = (Vector)ois.readObject();
ois.close();
k = 1;
Enumeration enum = vector.elements();
while(enum.hasMoreElements())
{
String kk = (String)(enum.nextElement());
offGraphics.drawString(kk,20,10*k);
k++;
}
} catch (Exception e)
{
e.printStackTrace();
}
g.drawImage(offImage, 0, 0, null);
}

}


总之:
就是Servlet 用Response取得OutputStream,再用OuputStream 构造一个ObjectOutputStream,再调用ObjectOutputStream的writeObject()把数据库中查询出来的记录写入该输出流。
Applet利用URL和URLConnection建立和上述的Servlet的连接,用URLConnection的
getInputStream得到一个InputStream,再用InputStream构造一个ObjectInputStream,
(就在构造ObjectInputStream时抛出StreamCorruptedException:invalid Stream Header)。
帮帮我啊,先谢拉!

...全文
40 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
javahui 2003-08-18
  • 打赏
  • 举报
回复
而且 response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>读书</title></head>");
out.println("<body>");

这些都是多余的,你既输出HTML代码又写对象,当然回出错!
只能用writeObject()方法写数据。
javahui 2003-08-18
  • 打赏
  • 举报
回复
你没有扩展doPost()方法。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doGet(request,response);
}
zhouyong9833 2003-08-18
  • 打赏
  • 举报
回复
传输数据有两种方式:
1、传输文本
比较简单CONTENT_TYPE = "text/html; charset=GBK";
2、传输对象
CONTENT_TYPE = "application/octet-stream; charset=GBK";
还需要序列化对象
public class TranObject implements Serializable{
}


你的问题很可能是没有序列化对象

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧