日期:2014-05-20  浏览次数:20681 次

在j2se中如何模拟的打开一个网页
小弟第一次在用NetBeans写一个小的桌面程序,想模拟一个打开网页的操作, 至于网页的内容可以不用显示出来, 只需要把这个url完全打开就行, 我前面用HttpClient去实现, 可以返回打开页面成功信息,但是现在页面存在有AJAX代码,打开这个页面用AJAX更新这个文章的点击次数, 用HttpClient方式后,去数据库查询,点击次数没有更新,测试失败,后来网上查询有JDIC的方式,但这种方式有几个dll文件需要拷贝,用户再操作的时候肯定不是特别的愿意,所以没有去测试。 不知道有那位兄弟解决过这方面的问题,请赐教一下。。谢谢。

------解决方案--------------------
你问题描述的很不清楚.
我的理解是有一个网页,网页打开后,网页本身会使用ajax向后台发一个请求?
如果是这样,你用firebug之类的监控,先找出那个ajax请求,看一下带了哪些参数回去.哪些参数是cookie中取的,哪些是从当前页面获取的.然后使用HttpClient获取页面后,再自己拼装参数带上第一次模拟返回的cookie发过去就行了.


------解决方案--------------------
探讨

就是打开一个页面,例如:http://cloud.csdn.net/a/20120312/313041.html

你直接用浏览器打开,文章的阅读次数就会增加,

但直接用HttpClient文章次数就无法增加,,就是用JAVA完全模拟打开这个页面的所有操作。。

------解决方案--------------------
你这个需求有点意思,桌面程序看你头像应该是用JAVAFX,我不太了解,不过我用SWT模拟了一下用了Browser.setURL(""),这种方式是可以符合你的要求的,只是不知道是否还算JAVASE的范畴。FX中应该也有类似Browser的类吧
------解决方案--------------------
既然是AJAX的话,实际上也是想服务器发送了一个URL请求的啊,你可以看下这个页面的源码,找到那个url,然后你直接用这个URL就可以了
------解决方案--------------------
一个方法是基于SWT重写你的程序.

另外就是AWT嵌入SWT组件,很少有,稳定性未知.

Java code

import java.awt.Canvas;
import java.awt.Dimension;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;


public class SWTBrowser implements Runnable{
    
    private Canvas canvas;
    private Display display;
    private Browser browser;
     
    public SWTBrowser(Canvas canvas) {
        this.canvas = canvas;
    }
    
    public  void run(){
        
        display = Display.getDefault();
        Shell shell = SWT_AWT.new_Shell(display, canvas);
        Dimension dim = canvas.getSize ();
        shell.setSize (dim.width, dim.height);
        
        shell.setLayout(new FillLayout());
        
        browser = new Browser(shell,SWT.NONE);
        
        shell.layout();

        while(!browser.isDisposed()){
            if(!display.readAndDispatch()){
                display.sleep();
            }
        }
    }

    public boolean setUrl(final String url) {
        if(display==null) return false;
        ReturnableRunnable rb = new ReturnableRunnable(url);
        display.syncExec(new Runnable() {
            
            public void run() {
                browser.setUrl(url);
            }
        });
        return rb.reuslt;
    }
    

    class ReturnableRunnable implements Runnable{        
        boolean reuslt;
        String url;        
        ReturnableRunnable(String u){
            this.url = u;
        }        
        public void run() {
            reuslt = browser.setUrl(url);
        }
    }    

}

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;


public class TestSwtBrowser extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private SWTBrowser swtBrowse;

    public TestSwtBrowser() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 715, 516);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new BorderLayout(0, 0));
        
        
        Button textField = new Button();
        textField.setLabel("goto");
        textField.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                boolean b = swtBrowse.setUrl("www.baidu.com");
                System.out.println(b);
            }
        });
        contentPane.add(textField, BorderLayout.NORTH);
        
        Canvas canvas = new Canvas();
        contentPane.add(canvas, BorderLayout.CENTER);
        
        swtBrowse = new SWTBrowser(canvas);
        new Thread(swtBrowse,"SWT-UI-Thread").start();    

    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TestSwtBrowser frame = new TestSwtBrowser();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    
}