想实现的功能就是,该桌面应用 可以访问网页,能够获取网页上的信息,现在可以直接读取该叶面,并将网页的源文件读到。还有个功能是:比如说一个注册页面,上面有个form表单,有action的配置,我现在的程序可以直接通过该action的配置,比如说: http://www.xxxxx.com/register?name=123&&password=369程序可以直接发送这样的请求,就可以完成注册功能。但是现在我的功能不只这样,比如我发送一个http://www.xxxxx.com/listAll的请求想返回一些信息,但是这样的话只能得到String 类型的信息,也就是说服务器返回来的数据我还是只能当作读取叶面一样来处理。因此获取到的数据还是string的。我就想实现那个类似浏览器的功能,最重要的是session的功能,这样我服务器端可以返回更多的数据(更多的对象)给我自己的客户端。我做这个没别的恶意想法,希望大家能够帮帮我。或者提供一些解决这样问题的思路,其实我自用文字描述起来都比较困难,不知道各位能否理解。

解决方案 »

  1.   

    解析整个页面没有必要,用正则表达式把所需要的数据抽出来就行了。
    使用httpclient,可以更简单一些。
      

  2.   

    因此获取到的数据还是string的。 ------------------------------------------你获取的只能是string,不可能是对象.
    Httpclient+htmlParser 挺实用的.
      

  3.   

    用HttpClient吧,它能方便的模仿浏览器的一些功能,尤其是Session的保持和Coockie的处理。
      

  4.   

    用Servlet中的HttpClient记取数据并解析数据吧,然后再对特定的数据进行各种各样的操作.
      

  5.   

    我用了一下HttpClient,可是Session的功能就是没找到,就缺这个??麻烦你能详细说一下怎么用吗?或者指点一。感激不尽
      

  6.   

    用Session的想法是这样的,在服务器端可以将对象保存在session里。ArrayList list = new ArrayList();
    list.add(...);
    list.add(...);
    list.add(...);
    HttpSession session = request.getSession();
    session.setAttribute("list",list);
    在页面端可以通过ArrayList list = (ArrayList)session.getAttribute("list");
    这样来获取该对象。HttpClient怎么才能完成这样的功能呢?在这里session和cookies应该没啥关系吧?
      

  7.   

    httpclient在clinet端,所以session的内容是用cookies来维护的。httpclient的缺省配置可以帮你维持cookies,不需要特别的配置。
      

  8.   


    看到HttpClient的示例代码里有关于cookies的操作,我想问下,是不是服务器端进行:session.setAttribute("list",list);这样的操作之后,IE拿到的返回页面里,这个session就被cookies维护着?session里的list对象也是可以通过cookies获取到?
      

  9.   

    用httpclient不是很简单么,如果只返回简单的文本就很容易处理了
      

  10.   

    LZ用httpunit吧java版的浏览器
    HttpUnit通过模拟浏览器的行为,处理页面框架(frames),cookies,页面跳转(redirects)等。通过HttpUnit提供的功能,你可以和服务器端进行信息交互,将返回的网页内容作为普通文本、XML Dom对象或者是作为链接、页面框架、图像、表单、表格等的集合进行处理。
      

  11.   

       session是保存在服务器端的,跟客户端关系不大(或者没关系),不过要想保存在服务器端得session有效(正常工作),那么客户端还要对cookie的支持。应为一般服务器为了保持与客户端的联系,都在客户端的cookie里面放了一个以session id为值的变量(当然URL重写技术不是这个原理)
       如果lz真的要实现类似浏览器的功能,会话保持应该有点难度
      

  12.   

    我的描述有些混乱,好了现在我们撇开sesssion ,cookies不谈。就说我想实现的功能:比如我的页面端发一个查询的请求,服务器端查询数据库,数据保存在一个list里,然后我的页面端要获取这个list对象,J2EE的做法很明显,服务端用session.setAttribute(......);在页面端用session.getAttribute(...)就可以获取了。
    这个动作大家都明白吧。当然现在HttpClient或者Java自己的HTTPURLClient都可以获取到String类型的响应。也就是说,在服务端,我可以把查询出来的数据,放在List里,然后遍历该list,生成一个String得数据作为响应发往页面端。这样也是可以的,但是从使用的角度来说,如果这个list保存了大量的数据,这种做法显然不合适,而且在页面端,处理这样的String也比较麻烦吧。我的功能其实跟浏览器的差不多,但我需要的不是一个浏览器。
      

  13.   


    不用想了,你不可能得到session,也得不到对象,你得到的就是html代码.可以看一看http协议,了解一下请求与响应.
      

  14.   


    那JSP的那种实现方法是怎么做到的?IE浏览器是如何实现的,协议方面我不懂,但是任何一个浏览器都能得到对象呢?
      

  15.   

    服务器也就是tomcat或者jboss一类的支持servlet和jsp的服务器解析servlet和jsp,产生html字节流response给浏览器,浏览器解析的是html和js.浏览器所接收到的消息体就是 右键-->查看源代码 显示的文本.根本就没得到什么对象.
      

  16.   


    明白你的意思了,JSP响应的页面其实都是在服务器上做好了才发给浏览器的,发给浏览器的也就是一些html代码,这些代码交给浏览器来解析,然后浏览器还原出整个页面。
      

  17.   

    呵呵,这个问题啊,我上周刚做过这个联系,给你个我写的例子.
    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=小明的一天" +
    "&noticetype=班组动态" +
    "&status=评选中" +
    "&order_by=3" +
    "&summary=enen" +
    "&content=随便写点内容");

    } catch (IOException e) {
    e.printStackTrace();
    System.out.println(e.getMessage());
    } }
      

  18.   

    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);   
      
        
        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=小明的一天" +
    "&noticetype=班组动态" +
    "&status=评选中" +
    "&order_by=3" +
    "&summary=enen" +
    "&content=随便写点内容");

    } catch (IOException e) {
    e.printStackTrace();
    System.out.println(e.getMessage());
    } }
      

  19.   

      明白你的意思,这样做可以通过程序控制浏览网页的行为。就象你的例子一样,可以发贴。但是我更想实现的功能是,服务端能返回给用户一个对象,这样可以方便用户来进行后面的操作。是否可以在服务端将对象序列化,然后printwriter 的write(byte)方法返回给客户端,再客户端进行反序列化,这样是否能得到对象呢?
      

  20.   

    其实lz的问题用json对象就可以很容易的解决。
      

  21.   

    首先楼主要弄清楚,客户端是没有Session.Attribute一说的,客户端严格来说,只保存Cookie。
    Cookie里面有本次会话的SessionId,与服务端每次的交互,也是通过这个SessionId来唯一标示
    某个客户端的。
    至于那个Session.Attribute,是保存在服务端的数据,除非服务端把相关的数据写入到客户端的
    Cookie里面,否则,客户端是无法直接拿到这些数据的(当然,直接显示到页面上这种情况除外)。
    服务端每次交互,是通过客户端每次传过来的SessionId来识别是那个客户端的会话,然后,通过这
    个SessionId再找到对应的Session对象,并且在程序上,也会传递到Servlet、JSP的上下文环境中
    以方便编程。
    HTTPClient默认情况是自动维持这个SessionId的,也就是说,每次向服务端提交请求,都会自动的
    将Coockie中的SessionId传递个服务端。所以不必过于担心这些。
    其他的操作也非常简单,google一下,网上相关的代码多得是。
      

  22.   

    感谢大家的回复,从你们的回复中,我学到了不少东西。对于前面谈到的我最初的目的是这样的。
    我想做一个数据库存储的东西,放在免费的服务器上(googleappengine)。然后别的web应用,可以给我的系统发送servlet请求,可以完成数据的存储,数据的存储我是通过form表单传递参数的。参数传递到我的系统中,我获取参数然后存储。最关键的是在外部系统访问我的数据存储系统是,获取数据的时候,因为我的数据存储系统返回的只能是字符流(不知道这样说正确不)。开始的想法是在我的系统中,将数据组装好到String中,然后发送给者求着,但是在请求者这边,小的数据还好,数据多了处理起来就比较麻烦了。第二想法是,在服务端将对象序列化,然后把序列化后的数据发送出来,在请求者这里反序列化。这个没成功。第三个想法是这样的,通过一个开源的项目Digester.在服务端把Java对象转换成xml格式,然后发送给请求者,请求者在它这里将该xml文件在转换成Java对象。还没有开始实现,也不知道能否实现。