想实现的功能就是,该桌面应用 可以访问网页,能够获取网页上的信息,现在可以直接读取该叶面,并将网页的源文件读到。还有个功能是:比如说一个注册页面,上面有个form表单,有action的配置,我现在的程序可以直接通过该action的配置,比如说: http://www.xxxxx.com/register?name=123&&password=369程序可以直接发送这样的请求,就可以完成注册功能。但是现在我的功能不只这样,比如我发送一个http://www.xxxxx.com/listAll的请求想返回一些信息,但是这样的话只能得到String 类型的信息,也就是说服务器返回来的数据我还是只能当作读取叶面一样来处理。因此获取到的数据还是string的。我就想实现那个类似浏览器的功能,最重要的是session的功能,这样我服务器端可以返回更多的数据(更多的对象)给我自己的客户端。我做这个没别的恶意想法,希望大家能够帮帮我。或者提供一些解决这样问题的思路,其实我自用文字描述起来都比较困难,不知道各位能否理解。
使用httpclient,可以更简单一些。
Httpclient+htmlParser 挺实用的.
list.add(...);
list.add(...);
list.add(...);
HttpSession session = request.getSession();
session.setAttribute("list",list);
在页面端可以通过ArrayList list = (ArrayList)session.getAttribute("list");
这样来获取该对象。HttpClient怎么才能完成这样的功能呢?在这里session和cookies应该没啥关系吧?
看到HttpClient的示例代码里有关于cookies的操作,我想问下,是不是服务器端进行:session.setAttribute("list",list);这样的操作之后,IE拿到的返回页面里,这个session就被cookies维护着?session里的list对象也是可以通过cookies获取到?
HttpUnit通过模拟浏览器的行为,处理页面框架(frames),cookies,页面跳转(redirects)等。通过HttpUnit提供的功能,你可以和服务器端进行信息交互,将返回的网页内容作为普通文本、XML Dom对象或者是作为链接、页面框架、图像、表单、表格等的集合进行处理。
如果lz真的要实现类似浏览器的功能,会话保持应该有点难度
这个动作大家都明白吧。当然现在HttpClient或者Java自己的HTTPURLClient都可以获取到String类型的响应。也就是说,在服务端,我可以把查询出来的数据,放在List里,然后遍历该list,生成一个String得数据作为响应发往页面端。这样也是可以的,但是从使用的角度来说,如果这个list保存了大量的数据,这种做法显然不合适,而且在页面端,处理这样的String也比较麻烦吧。我的功能其实跟浏览器的差不多,但我需要的不是一个浏览器。
不用想了,你不可能得到session,也得不到对象,你得到的就是html代码.可以看一看http协议,了解一下请求与响应.
那JSP的那种实现方法是怎么做到的?IE浏览器是如何实现的,协议方面我不懂,但是任何一个浏览器都能得到对象呢?
明白你的意思了,JSP响应的页面其实都是在服务器上做好了才发给浏览器的,发给浏览器的也就是一些html代码,这些代码交给浏览器来解析,然后浏览器还原出整个页面。
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.Permission;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;public class test {
URL url;
String parameters;
HttpURLConnection conn;
Permission prm;
public String login(String url,String parameters) throws IOException{
this.url=new URL(url);
this.parameters=parameters;
conn=(HttpURLConnection) this.url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setAllowUserInteraction(false);
//conn.setInstanceFollowRedirects(false);
conn.setRequestProperty("User-Agent","Internet Explorer");
BufferedOutputStream buf=new BufferedOutputStream(conn.getOutputStream());
buf.write(parameters.getBytes(),0, parameters.length());
buf.flush();
buf.close(); String cookie=conn.getHeaderField("Set-Cookie");
String sessionId=cookie.substring(0, cookie.indexOf(";"));
System.out.println("sessionId:"+sessionId);
/***************************************
//读出流数据并打印出来
ByteArrayOutputStream baos =new ByteArrayOutputStream();
InputStream in=conn.getInputStream();
byte[] buff=new byte[1024];
int len =-1;
while((len=in.read(buff))!=-1){
baos.write(buff,0,len);
}
String result = new String(baos.toByteArray());
in.close();
baos.close();
System.out.println("登陆返回HTTP状态码:"+conn.getResponseCode());
System.out.println("result:"+result);
*************************************/
conn.disconnect();
return sessionId;
}
public void publish(String cookie,String url,String parameters) throws IOException{
this.url=new URL(url);
this.parameters=parameters;
conn=(HttpURLConnection) this.url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.addRequestProperty( "Cookie", cookie);
//conn.setInstanceFollowRedirects(true);
this.parameters=parameters; BufferedOutputStream buf=new BufferedOutputStream(conn.getOutputStream());
buf.write(parameters.getBytes("UTF-8"),0, parameters.length());
buf.flush();
//buf.close();
/*******************************************/
ByteArrayOutputStream baos =new ByteArrayOutputStream();
InputStream in=conn.getInputStream();
byte[] buff=new byte[1024];
int len =-1;
while((len=in.read(buff))!=-1){
baos.write(buff,0,len);
}
String result = new String(baos.toByteArray());
in.close();
baos.close();
System.out.println("发布返回HTTP状态码:"+conn.getResponseCode());
System.out.println("result:"+result);
/***************************************/
//System.out.println("发布返回HTTP状态码:"+conn.getResponseCode());
conn.disconnect();
}
public static void main(String[] args) {
test push = new test();
try {
String cookie=push.login("http://10.220.11.62/TMBGWeb/validate.jsp","username=lufei"); push.publish(cookie,"http://10.220.11.62/TMBGWeb/sysadmin.do?&event=savePublicNotice"
,"title=小明的一天" +
"¬icetype=班组动态" +
"&status=评选中" +
"&order_by=3" +
"&summary=enen" +
"&content=随便写点内容");
} catch (IOException e) {
e.printStackTrace();
System.out.println(e.getMessage());
} }
URL url;
String parameters;
HttpURLConnection conn;
Permission prm;
public String login(String url,String parameters) throws IOException{
this.url=new URL(url);
this.parameters=parameters;
conn=(HttpURLConnection) this.url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setAllowUserInteraction(false);
//conn.setInstanceFollowRedirects(false);
conn.setRequestProperty("User-Agent","Internet Explorer");
BufferedOutputStream buf=new BufferedOutputStream(conn.getOutputStream());
buf.write(parameters.getBytes(),0, parameters.length());
buf.flush();
buf.close(); String cookie=conn.getHeaderField("Set-Cookie");
String sessionId=cookie.substring(0, cookie.indexOf(";"));
System.out.println("sessionId:"+sessionId);
conn.disconnect();
return sessionId;
}
public void publish(String cookie,String url,String parameters) throws IOException{
this.url=new URL(url);
this.parameters=parameters;
conn=(HttpURLConnection) this.url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.addRequestProperty( "Cookie", cookie);
this.parameters=parameters; BufferedOutputStream buf=new BufferedOutputStream(conn.getOutputStream());
buf.write(parameters.getBytes("UTF-8"),0, parameters.length());
buf.flush();
buf.close(); conn.disconnect();
}
public static void main(String[] args) {
test push = new test();
try {
//登陆并获取sessionid
String cookie=push.login("http://10.220.11.62/TMBGWeb/validate.jsp","username=lufei");
/*将sessionid,写到head的cookie属性中,保持会话,然后做你想做的操作,我下面做的是在一个论坛发布一篇文章
*我写的publish方法,cookie代表sesionid,第二个参数是代表,
*你要访问的地址即action地址,第三个参数:就是你要post的参数用&符号连接起来*/
push.publish(cookie,"http://10.220.11.62/TMBGWeb/sysadmin.do?&event=savePublicNotice"
,"title=小明的一天" +
"¬icetype=班组动态" +
"&status=评选中" +
"&order_by=3" +
"&summary=enen" +
"&content=随便写点内容");
} catch (IOException e) {
e.printStackTrace();
System.out.println(e.getMessage());
} }
Cookie里面有本次会话的SessionId,与服务端每次的交互,也是通过这个SessionId来唯一标示
某个客户端的。
至于那个Session.Attribute,是保存在服务端的数据,除非服务端把相关的数据写入到客户端的
Cookie里面,否则,客户端是无法直接拿到这些数据的(当然,直接显示到页面上这种情况除外)。
服务端每次交互,是通过客户端每次传过来的SessionId来识别是那个客户端的会话,然后,通过这
个SessionId再找到对应的Session对象,并且在程序上,也会传递到Servlet、JSP的上下文环境中
以方便编程。
HTTPClient默认情况是自动维持这个SessionId的,也就是说,每次向服务端提交请求,都会自动的
将Coockie中的SessionId传递个服务端。所以不必过于担心这些。
其他的操作也非常简单,google一下,网上相关的代码多得是。
我想做一个数据库存储的东西,放在免费的服务器上(googleappengine)。然后别的web应用,可以给我的系统发送servlet请求,可以完成数据的存储,数据的存储我是通过form表单传递参数的。参数传递到我的系统中,我获取参数然后存储。最关键的是在外部系统访问我的数据存储系统是,获取数据的时候,因为我的数据存储系统返回的只能是字符流(不知道这样说正确不)。开始的想法是在我的系统中,将数据组装好到String中,然后发送给者求着,但是在请求者这边,小的数据还好,数据多了处理起来就比较麻烦了。第二想法是,在服务端将对象序列化,然后把序列化后的数据发送出来,在请求者这里反序列化。这个没成功。第三个想法是这样的,通过一个开源的项目Digester.在服务端把Java对象转换成xml格式,然后发送给请求者,请求者在它这里将该xml文件在转换成Java对象。还没有开始实现,也不知道能否实现。