小弟第一次在用NetBeans写一个小的桌面程序,想模拟一个打开网页的操作, 至于网页的内容可以不用显示出来, 只需要把这个url完全打开就行, 我前面用HttpClient去实现, 可以返回打开页面成功信息,但是现在页面存在有AJAX代码,打开这个页面用AJAX更新这个文章的点击次数, 用HttpClient方式后,去数据库查询,点击次数没有更新,测试失败,后来网上查询有JDIC的方式,但这种方式有几个dll文件需要拷贝,用户再操作的时候肯定不是特别的愿意,所以没有去测试。 不知道有那位兄弟解决过这方面的问题,请赐教一下。。谢谢。
------解决方案--------------------
你问题描述的很不清楚.
我的理解是有一个网页,网页打开后,网页本身会使用ajax向后台发一个请求?
如果是这样,你用firebug之类的监控,先找出那个ajax请求,看一下带了哪些参数回去.哪些参数是cookie中取的,哪些是从当前页面获取的.然后使用HttpClient获取页面后,再自己拼装参数带上第一次模拟返回的cookie发过去就行了.
------解决方案--------------------
------解决方案--------------------
你这个需求有点意思,桌面程序看你头像应该是用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(); } } }); } }