jsp中URL及其URLConnection的使用,重谢!!

lzqwfq 2003-08-20 08:21:37
我的li1.jsp如下:

<%@ page contentType="text/html;charset=gb2312" language="java" %>
<%@ page import="java.io.*,java.net.*"%>
<html>
<%
//定义一个要传输的类
class A implements java.io.Serializable {
String name="nihao";
}

A obj=new A();

//定义URL
URL url=new URL("http://10.131.11.234:8080/li2.jsp");

//建立一个URLConnection
URLConnection connect = url.openConnection();
//进行设置使之可以写进读出,是否正确?
connect.setDefaultUseCaches(false);

connect.setUseCaches(false);

connect.setDoInput(true);

connect.setDoOutput(true);

connect.setAllowUserInteraction(false);

connect.connect();

ObjectOutputStream p=new ObjectOutputStream(connect.getOutputStream());

p.writeObject(obj);



p.close();
%>
</html>

相对应的li2.jsp 如下:
目的是接收发过来的对象写入li.txt

<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*,java.net.*"%>
<html>
<body>
<%
class A implements java.io.Serializable {
String name="nihao";
}


ObjectInputStream in=new ObjectInputStream(request.getInputStream());

File file=new File("li.txt");
ObjectOutputStream print=new ObjectOutputStream(new FileOutputStream(file));

try
{
A obj=(A)in.readObject();

print.writeObject(o);
}
catch(Exception e)
{}
in.close();
print.close();
%>
</body>
</html>

但是这样对象并没有传到li2.jsp,(地址是正确的),请诸位帮忙。
...全文
383 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzqwfq 2003-09-03
  • 打赏
  • 举报
回复
多谢诸位,好久没来看,竟然得到了这么多意见,不胜感激。
我在我的程序中,已能够准确传递
URL url = new URL(toURL);
HttpURLConnection uc = (HttpURLConnection)url.openConnection();
uc.setDoOutput(true);
//通过输出流来向目标方输出对象
ObjectOutputStream conout = new ObjectOutputStream(new BufferedOutputStream(uc.getOutputStream()));
conout.writeObject((Object)mm);
conout.flush();
conout.close();
但这肯定不是唯一的方法,多谢piggybank兄弟,你的分析很深入,我一直想考虑转成Base64编码后进行传递。另znjq1001(追风)能否展开叙述,谢谢!小弟水平低微,但是很高兴和诸位认识!
znjq1001 2003-09-01
  • 打赏
  • 举报
回复
用getContext(java.lang.String uripath) 可以得到另一个web环境,你可以试试得到另一个web context后向session写入对象
喝醉的咖啡 2003-09-01
  • 打赏
  • 举报
回复
仔细看看楼主的代码和问题,就知道楼主主要的目的是希望通过 URLConnection,并配合对象序列化方式来实现在不同的 WebServer 之间传递数据!

实际上代码中 URLConnection 的用法是不完全正确的。
URLConnection 可以通过 http 协议的 Get 和 Post 方法将“文本”数据传递给另外一个网页,这点没错。
但如果要传递序列化的 ObjectStream,首先你必须对你序列化的结果——Object Stream编码,使其成为文本(比如采用如Base64这样的编码方式),然后才能通过 POST 方法(GET方法不适合传递复杂的参数)好比在BBS中提交一篇帖子那样发给接收的 Web——你的 li2.jsp
(对不起,我没验证序列化的结果是否为二进制数据,至少MFC如此)

然后,在 li2.jsp 中,应该用 Request.Form 来接收。
收到之后,解码(比如对应的Base64)后用一个 InputStream 来读取还原后的内容(比如解码后先写入一个文件),然后用
A newaInstance = (A) in.readObject() 还原一个新的 A 类的实例;

....
但是但是,既然 URLConnection 已经将你需要的参数传递过来了,那还一定要用 Serializ 这样的方式还原一个对象?将参数赋值给你新建的对象即可实现了啊?!
比如用 URL url=new URL("http://10.131.11.234:8080/li2.jsp?name=" + A.name + ");
代替 URL url=new URL("http://10.131.11.234:8080/li2.jsp");
收到后,用
A newaInstance = new A();
newaInstance.name = request.getParam("name");
不是更方便么?

况且,如果你的参数中不包含二进制内容,URLConnection 的 POST 方式已经很够用了(对参数内容长度有个限制,大概是4k,不大记得了)

因此,有若干错误
1、URL和URLConnection有两个异常需要处理;
2、URLConnection 采用 HTTP 协议,你用 connect.getOutputStream() 虽然获得了 outputstream,但其 stream 符合 http 协议,而不符合 object stream
3、因此传递到你的 li2.jsp,得到的 inputstream 也不符合 object stream

所以,如果在 2 和 3 之间,过滤掉 http 协议的东西(比如楼上朋友用 socket 方式写的 http 协议头等内容),并避免二进制造成的传输问题就好办了。
可以考虑接收端用一个 servlet 侦听某个端口,发送端不用 URLConnection,改用 socket。Servlet将收到的包头去掉(比如你自定义的包头,说明这是一个什么对象,验证传送方的身份等等),将object数据保存到文件,然后按照你后面的方式 readObject 然后还原倒是没问题 :)
喝醉的咖啡 2003-09-01
  • 打赏
  • 举报
回复
呵呵,看来大家没理解你的目的。

楼主想把数据保存到一个实例中,然后序列化。
之后在其它环境中(比如另外一个WebServer)还原这个实例,是这样吧,楼主?

另外,楼上兄弟用 socket 实现 URLConnection 的功能,也算不错了,但楼主的方法似乎够用,而且比较好用了(除非自己做Spider,要考虑线程优化和socket优化等)。

cbhyk 2003-09-01
  • 打赏
  • 举报
回复
调试通过的代码:
-----------page1.jsp------------
<%@ page import="java.io.*,java.net.*"%>
<html>
<body>
<%
//prepare Object data
String obj = "test string";
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(obj);
oos.flush();
byte[] objData = bos.toByteArray();

//send Object
Socket socket = new Socket("localhost", 80);
OutputStream os = socket.getOutputStream();
os.write("POST /page2.jsp HTTP/1.1\r\n".getBytes());
os.write("User-Agent: myselfHttp/1.0\r\n".getBytes());
os.write("Accept: */*\r\n".getBytes());
os.write("Host: localhost\r\n".getBytes());
os.write("Content-Type: multipart/form-data; boundary=---------------------------7d33bc1b47038c\r\n".getBytes());
os.write(("Content-Length: " + objData.length + "\r\n").getBytes());
os.write("\r\n".getBytes());
os.write(objData);
os.flush();
socket.close();
%>
ok
</body>
</html>

--------page2.jsp--------
<%
//read Object
java.io.InputStream is = request.getInputStream();
java.io.ObjectInputStream ois = new java.io.ObjectInputStream(is);
String s = (String) ois.readObject();
System.out.println(s);

response.reset();
response.getOutputStream().write("ok".getBytes());
%>
lzqwfq 2003-09-01
  • 打赏
  • 举报
回复
怎么没有人回答?
lzqwfq 2003-08-25
  • 打赏
  • 举报
回复
不同主机间的jsp传递对象没有人能回答吗?大家看看上边的代码为什么不对?或是需要设置什么东西?
linliangyi 2003-08-21
  • 打赏
  • 举报
回复
楼主,给你提一下几点建议:
1。你的程序最好使用Appication方式来实现,也就是说你必须先学一些java语言的基础,我的感觉是,你一开始学习的就是jsp了,不知道对不对!
2。class A 不可以这样在两个jsp中定义,通常它被单独定义为一个类,然后你可以采用类似javaBean的方式使用它。
3。JSP中通常只写一些关于表示层的代码——通俗的说,就是网页上的HTML代码,至于逻辑处理放在servlet中使用。
4。JSP和Servlet之间使用JavaBean来交互,说的确切一点是将一个java bean的实例存入到application | session | request这些对象中,然后由jsp页面引用。
相关的知识点在此一言难尽,看看资料和书籍吧,祝好运!



lzqwfq 2003-08-21
  • 打赏
  • 举报
回复
楼上的老兄,不这样写你有什么好办法在两个jsp或是servlet之间传递对象?
lzqwfq 2003-08-21
  • 打赏
  • 举报
回复
我想在不同的web主机间传递对象啊
guoxuezheng 2003-08-21
  • 打赏
  • 举报
回复
两个jsp或是servlet之间传递对象

application | session | request这些对象中,然后由jsp页面引用。
lzqwfq 2003-08-21
  • 打赏
  • 举报
回复
楼上的兄弟,谢谢你的建议,可能我学的不好,但是我的确是先学了java的。
A类应该是可以那样定义的,只不过A类是函数体内的内部类。
另外,我这样来做只是为了我的伙伴能绕开自写多线程所面临的诸多问题,并且我希望用80端口在不同的web服务器之间通讯。
你的建议很好,我会考虑的,谢谢。
lijunisbug 2003-08-20
  • 打赏
  • 举报
回复

怎么能这样写!!

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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