最近对iteye举办的问答大赛非常着迷,总想为更多的人答疑解惑。得到别人的点赞,荣誉感瞬间爆棚。这也折射出程序员这个职业的弊端。虽然问题大多都是初级水平,毕竟不懂才问的啊,闻到有先后,术业有专攻。那些大神们对这个很不屑,觉得拉低了他们的智商。这个我不很赞同,好了就这么多了把……
通过问答,我发现了一款很好的工具,记录下来,以后可能会有用武之地。
【htmlUnit】
htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。这个没有界面的浏览器,运行速度也是非常迅速的。可以作为小型的爬虫框架。
下面是他的代码
import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.gargoylesoftware.htmlunit.BrowserVersion; import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.HttpMethod; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.WebRequest; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlInput; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput; import com.gargoylesoftware.htmlunit.util.NameValuePair; public class MySina { private WebClient client; private WebRequest request; private String sinaLoginUrl = " http://mail.sina.com.cn/cgi-bin/login.php"; private String hostSinaUrl = ""; public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException { String username = "***"; String password = "***"; String newpassword = "***"; String nickname = "***"; MySina mySina = new MySina(); if (mySina.mailLoginBySina(username, password)) { // 登录 mySina.updatePwdBySina(password, newpassword); // 修改密码 mySina.updateNickName(nickname); // 修改帐户昵称 } else { System.out.println("登录失败!请检查用户名和密码是否正确!"); } } public MySina(){ client = new WebClient(BrowserVersion.INTERNET_EXPLORER_ ; client.setJavaScriptEnabled(false); } /** * 更改帐户昵称 * * @param nickname 昵称 * @return boolean * @throws FailingHttpStatusCodeException * @throws IOException */ public boolean updateNickName(String nickname) throws FailingHttpStatusCodeException, IOException { String sinaSetUrl = hostSinaUrl + "basic/setting_account"; request = new WebRequest(new URL(sinaSetUrl), HttpMethod.POST); request.setCharset("utf- ); request.setRequestParameters(Arrays.asList(new NameValuePair("nickname", nickname), new NameValuePair("pop , "on"), new NameValuePair("imap", "on"))); client.getPage(request); HtmlPage p = client.getPage(hostSinaUrl + "classic/index.php"); if (p.getBody().getTextContent().indexOf("\"NickName\":\"" + nickname + "\"") > 0) { return true; } else { return false; } } /** * 修改密码 * * @param oldpassword 旧密码 * @param newpassword 新密码 * @return boolean * @throws FailingHttpStatusCodeException * @throws IOException */ public boolean updatePwdBySina(String oldpassword, String newpassword) throws FailingHttpStatusCodeException, IOException { String sinaSetUrl = " http://login.sina.com.cn/member/security/password.php"; request = new WebRequest(new URL(sinaSetUrl), HttpMethod.POST); request.setCharset("gbk"); request.setRequestParameters(Arrays.asList(new NameValuePair("pass", oldpassword), new NameValuePair("pass , newpassword), new NameValuePair("pass , newpassword))); HtmlPage p = client.getPage(request); if (p.getBody().getTextContent().indexOf("您的密码修改成功") > 0) { return true; } else { return false; } } /** * 登录 * * @param username 用户名 * @param password 密码 * @return boolean * @throws FailingHttpStatusCodeException * @throws MalformedURLException * @throws IOException */ public boolean mailLoginBySina(String username, String password) throws FailingHttpStatusCodeException, MalformedURLException, IOException { HtmlPage loginPage = client.getPage(sinaLoginUrl); HtmlForm loginForm = loginPage.getFormByName("free"); HtmlInput u = loginForm.getInputByName("u"); HtmlInput psw = loginForm.getInputByName("psw"); HtmlSubmitInput loginButton = loginForm.getInputByName("登录"); u.setValueAttribute(username); psw.setValueAttribute(password); HtmlPage result = loginButton.click(); String resultUrl = result.getUrl().toString(); if (resultUrl.indexOf("classic/index.php") > 0) { String regex = "http://(.*?)/"; hostSinaUrl = myRegex(resultUrl, regex, null); if (hostSinaUrl.length() > 0) { return true; } else { return false; } } else { return false; } } /** * 正则匹配替换 * * @param str * @param reg * @param replace * @return */ public String myRegex(String str, String reg, String[] replace) { String result = null; Matcher m = Pattern.compile(reg).matcher(str); while (m.find()) { result = m.group(); if (replace != null && replace.length > 0) { for (String s : replace) { result = result.replace(s, ""); } } } return result; } }
【MozSwing 】
MozSwing 独立运行,不依赖客户机器的浏览器版本。(目前来看最适合我们,内核是火狐的xulrunner1.9.1),官方好几年没有升级版本了。下载地址:http://sourceforge.net/projects/mozswing/)
【JWebBrowser】
JWebBrowser 调用客户本机浏览器,通常是IE。(下载: http://sourceforge.net/projects/djproject/files/DJ%20Native%20Swing/1.0.2%20preview/DJNativeSwing-SWT-1-0-2-20111030.zip/download)
demo代码:
package chrriis.dj.nativeswing.swtimpl.demo.examples.webbrowser; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.BorderFactory; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; import chrriis.common.UIUtils; import chrriis.dj.nativeswing.swtimpl.NativeInterface; import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser; /** * @author Christopher Deckers */ public class SimpleWebBrowserExample { public static JComponent createContent() { JPanel contentPane = new JPanel(new BorderLayout()); JPanel webBrowserPanel = new JPanel(new BorderLayout()); webBrowserPanel.setBorder(BorderFactory.createTitledBorder("Native Web Browser component")); final JWebBrowser webBrowser = new JWebBrowser(); webBrowser.navigate("http://www.google.com"); webBrowserPanel.add(webBrowser, BorderLayout.CENTER); contentPane.add(webBrowserPanel, BorderLayout.CENTER); // Create an additional bar allowing to show/hide the menu bar of the web browser. JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 4, 4)); JCheckBox menuBarCheckBox = new JCheckBox("Menu Bar", webBrowser.isMenuBarVisible()); menuBarCheckBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { webBrowser.setMenuBarVisible(e.getStateChange() == ItemEvent.SELECTED); } }); buttonPanel.add(menuBarCheckBox); contentPane.add(buttonPanel, BorderLayout.SOUTH); return contentPane; } /* Standard main method to try that test as a standalone application. */ public static void main(String[] args) { NativeInterface.open(); UIUtils.setPreferredLookAndFeel(); SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame("DJ Native Swing Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(createContent(), BorderLayout.CENTER); frame.setSize(800, 600); frame.setLocationByPlatform(true); frame.setVisible(true); } }); NativeInterface.runEventPump(); } }
参考资料:
相关推荐
在Java开发浏览器小程序时,主要涉及以下几个核心知识点: 1. **Java Applet**:Java Applet是早期用于在Web浏览器中运行的Java程序。它们通过HTML页面中的`<applet>`标签加载,并由Java插件执行。开发者需要编写一...
在JAVA编程中,创建一个简易的网页浏览器主要涉及到以下几个关键技术点: 1. **网络编程**:使用JAVA的`java.net`包中的`URL`和`URLConnection`类来建立与Web服务器的连接,获取网页内容。这涉及到HTTP协议的理解,...
Java CEF调用Chrome浏览器是一种技术方案,它允许Java应用程序利用CEF(Chromium Embedded Framework)来集成Chrome浏览器引擎,从而实现更丰富的Web交互和硬件加速功能。CEF是一个开源框架,它封装了Google Chrome...
这个过程通常涉及以下几个步骤: 1. 检测浏览器是否支持插件:首先,`PluginDetect.js` 会尝试访问浏览器的`navigator.plugins`对象,这是一个包含了所有已安装插件信息的数组。如果浏览器支持插件,那么可以继续...
【标题】"基于Java的实例源码-在浏览器上运行Java程序 Doppio.zip" 提供了一种在Web浏览器环境中执行Java程序的解决方案。Doppio是一个开源项目,它实现了Java虚拟机(JVM)的部分功能,使得JavaScript可以理解并...
文章将分为以下几个部分: ### 一、跨浏览器购物车实现方式概述 #### 1. Cookie 方式 Cookie 是一种常见的存储方式,用于保存用户的会话状态。在跨浏览器购物车的应用场景中,使用 Cookie 的主要优势是它能够跨...
本项目基于Chrome浏览器、Java后端、WebSocket通信协议以及WebRTC(Web Real-Time Communication)技术实现,提供了一种高效、便捷的浏览器内视频通话解决方案。 首先,我们要理解WebRTC的重要性。WebRTC是一种开源...
在Android中,滚动条失效可能是因为以下几个原因: 1. **触摸事件冲突**:Android系统会处理触摸事件,可能与网页中的JavaScript事件冲突,导致滚动条无法响应。 2. **CSS样式问题**:错误的CSS设置,如`overflow`...
为了创建一个完整的Java浏览器,通常需要以下几个关键部分: 1. **网络通信模块**:这部分负责通过HTTP/HTTPS协议获取网页内容。Java的`java.net`包提供了Socket和HttpURLConnection类,可以用来实现这个功能。 2....
通过学习Lobo的源码,开发者可以掌握以下几个方面的知识: 1. **Java GUI编程**:Lobo使用Java AWT和Swing库构建用户界面,了解这些基础知识对于开发桌面应用程序至关重要。 2. **网络编程**:学习如何使用Java的...
标题"java web浏览器"和描述"java web 超链接 打开网页 windows"指向了这个主题,即在Java Web应用中如何通过代码实现点击超链接后在Windows系统上打开网页。这个功能在诸如帮助文档、通知或者简单的应用程序中非常...
针对以上问题,解决策略可以分为以下几个步骤: 1. **验证JRXML文件**:使用文本编辑器检查`test.jrxml`文件,确保XML语法无误,所有字段和数据源绑定都正确。 2. **调试数据源**:确认数据提供者是否正确工作,...
BIOSReport报表系统主要由以下几个部分组成: 1. **报表设计器**:用于设计报表的模板、格式以及数据源等。支持多数据源的使用,可以处理复杂的报表格式,支持多层行头和列头等复杂结构。 2. **报表引擎**:负责...
在压缩包子文件的文件名称列表中,我们看到以下几个文件: 1. WebBrowser.bat:这是一个批处理文件,通常用于Windows环境中运行特定的命令或启动程序。在这个案例中,它很可能是用来启动WebBrowser.jar的快捷方式。 ...
在这个"简单浏览器 java"的实例中,我们可以深入探讨以下几个关键知识点: 1. **网络请求**:在浏览器中,用户输入URL后,浏览器需要向服务器发送HTTP请求获取网页内容。在Java中,可以使用`java.net.URL`和`java...
Lobo浏览器的出现,主要是为了提供一个可定制、跨平台的解决方案,使得用户可以在Java环境中浏览网页,同时利用Java的强大功能来扩展浏览器的功能。 Lobo项目的核心是基于Java的Web组件库,它允许开发者构建高度...
不同的浏览器对文件名编码的支持有所不同,主要可以分为以下几类: 1. **Firefox**: - Firefox支持使用`ISO-8859-1`编码格式的文件名。 - 示例代码: ```java response.setHeader("Content-Disposition", ...
在这个项目中,开发者可能使用了其中的一种或几种来实现跨浏览器的兼容性。 2. **预览方式** PDF在线预览主要有两种方式:服务器端渲染和客户端渲染。 - **服务器端渲染**:服务器将PDF转换为图片序列,然后发送...
浏览器源码中的关键部分包括以下几个方面: 1. **Activity和Fragment**:在Android 4.0中,`Activity`是应用的基本单元,而`Fragment`用于构建多屏和动态布局。浏览器的界面由多个`Fragment`组成,如地址栏、书签、...