`
rmzdb
  • 浏览: 78675 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

【原】跟浏览器相关的几个java方案

 
阅读更多

 最近对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上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java开源包11

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包6

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包9

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包4

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包101

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包5

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包8

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包10

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包3

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包1

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    如何优化浏览器-这篇解决方案文件提供有关用户如何优化Internet浏览器,使之更好的让Windows Live Hotmail工作的信息。

    这篇解决方案文件提供有关用户如何优化Internet浏览器,使之更好的让Windows Live Hotmail工作的信息。 按照以下步骤为Windows Internet Explorer 6或7优化以及恢复默认设置: 1. 开启Internet Explorer,然后...

    java开源包2

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包7

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    Java资源包01

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java 面试题 总结

    Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,...

    OpenJDK Java开发环境.rar

    从任何标准来看,它都不是一种新的语言,尤其是在行业中,每隔几年就会出现新的解决方案,而且通常比以前的解决方案更好。而最流行的Java实例OpenJDK已经有14年的历史了。无论如何,OpenJDK应该已经被替换了很多次了...

    Java面试宝典-经典

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

Global site tag (gtag.js) - Google Analytics