⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webclientui.java

📁 一个简单的HTTP服务器和HTTP客户端程序 HTTP客户端(即浏览器)只支持显示标准HTML
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package web.http.ui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.net.ConnectException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.Enumeration;
import java.util.Hashtable;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.text.EditorKit;
import javax.swing.text.html.HTMLDocument;

/**
 * WEB浏览器实现
 * 
 * 实现功能:
 * 1.通过设定的URL地址访问web页面(仅支持标准HTML,不支持CSS,JS等)
 * 2.浏览刷新
 * 3.向前向后浏览页面
 * 4.收藏夹功能
 * 5.打开文件
 * 6.保存文件
 * 7.搜索功能:向服务器发送搜索请求:http://host/?searchContent
 * 
 * 访问web页面的实现:
 * *使用控件:JEditorPane,使用该控件提供的方法:taContent.setPage(url)
 * *
 * *或者如下方法组合:
 * *URL urlURL=new URL(url);
 * *taContent.setContentType("text/html");
 * *EditorKit ek = taContent.getEditorKitForContentType("text/html");
 * *HTMLDocument doc = (HTMLDocument) ek.createDefaultDocument( );
 * *taContent.read(urlURL.openStream(),doc);
 * 
 * *本系统同时使用了两种方法。
 * *因为taContent.setPage(url)存在缺陷:无法进行刷新
 * *而第二种方法亦存在缺陷:访问某些页面时会抛出NullPointerException(猜测有可能是因为下载的页面不是标准的HTML所致)
 * *故将两种方法结合使用::一般情况采用第二种方法访问web页面,抛出异常后,再采用第一种方法setPage.
 * *由于web页面的显示速度较慢,因此,设计了一个内部线程AccessInternet,在线程内部访问页面
 * 
 * 
 * 浏览刷新:
 * 重新连接该页面即可
 * 比较好的想法是:发送一个请求,如果该页面没有被更新,则不需要重新下载页面
 *              如果该页面已经被更新,则重新下载该页面并显示
 * 但是本系统并没有这样做,只是简单的重新连接该页面
 * 
 * 向前向后浏览页面:
 * 使用循环队列实现。将访问过的URL地址和页面保存到两个循环队列urlList和contentList中
 * 向后则将指针后移一位,向前则将指针前移一位
 * 
 * 收藏夹功能:
 * 收藏夹每一项应包含两个属性:名称与URL地址
 * 将每个对应项保存到文件favorites.dat中
 * 显示时,读取该文件,将名称以菜单的形式显示
 * 
 * 打开文件
 * 保存文件略去
 * 
 * 
 * 仅能发送GET请求
 */
public class WebClientUI extends JFrame implements ActionListener,
         KeyListener
{
    JPanel contentPane;

    BorderLayout borderLayout1 = new BorderLayout();

    JPanel panelAll = new JPanel();

    BorderLayout borderLayout2 = new BorderLayout();

    JEditorPane taContent = new JEditorPane();

    JScrollPane scroll = new JScrollPane(taContent);

    JLabel labStatus = new JLabel();

    JPanel panelSite = new JPanel();

    //文本框  接受URL地址的输入
    JTextField urlSite = new JTextField();

    BorderLayout borderLayout3 = new BorderLayout();

    //按钮    接受用户单击事件和键盘事件
    JButton bAccess = new JButton();

    //菜单栏
    JMenuBar menuBar = new JMenuBar();

    //文件菜单
    JMenu mFile = new JMenu();

    //打开文件菜单
    JMenuItem mOpen = new JMenuItem();

    //保存文件菜单
    JMenuItem mSave = new JMenuItem();

    //另存文件菜单
    JMenuItem mSaveAs = new JMenuItem();

    //退出系统 菜单
    JMenuItem mExit = new JMenuItem();

    //功能菜单
    JMenu mFunction = new JMenu();

    //后退菜单
    JMenuItem mBack = new JMenuItem();

    //前进菜单
    JMenuItem mPrevious = new JMenuItem();

    //收藏夹菜单
    JMenu mFavorites = new JMenu();

    //查找菜单
    JMenuItem mFind = new JMenuItem();

    //添加到收藏夹菜单
    JMenuItem mAddFavorites = new JMenuItem();

    //刷新菜单
    JMenuItem mRefresh = new JMenuItem();

    //哈希表,保存收藏夹内容
    Hashtable favorites=new Hashtable();
    
    //URL地址缓存
    String[] urlList=new String[10];
    
    //文本内容缓存
    String[] contentList=new String[10];
    
    //当前位置
    int curPositon=-1;
    
    //后退步数
    int backPositon=0;

    //访问页面统计计数
    //后退的时候,后退的步数不能超过访问的页面次数
    long accseTime=0;
    
    //标志
    //如果前一步所做的动作是浏览页面,将被设置为1
    //如果前一步所做的动作是其他动作,将被设置为2
    int flag=0;
    
    private SearchInfoUI searchUI=null;
    
    /**
     * 构造函数
     *
     */
    public WebClientUI()
    {
        initUI();
    }

    /**
     * 布局界面
     *
     */
    private void initUI()
    {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JFrame.setDefaultLookAndFeelDecorated(true);

        contentPane = (JPanel) this.getContentPane();
        contentPane.setLayout(borderLayout1);
        this.setTitle("Web浏览器");
        panelAll.setLayout(borderLayout2);
        panelAll.setBorder(BorderFactory.createLineBorder(Color.black));
        taContent.setContentType("text/html");
        taContent.setBorder(null);
        taContent.setDisabledTextColor(Color.black);
        taContent.setEditable(false);
        urlSite.setBorder(BorderFactory.createLineBorder(Color.black));
        panelSite.setLayout(borderLayout3);
        bAccess.setBackground(Color.white);
        bAccess.setText("GO");
        menuBar.setToolTipText("");
        mFile.setText("文件");
        mOpen.setText("打开");
        mSave.setText("保存");
        mSaveAs.setText("另存为");
        mExit.setText("退出");
        mFunction.setText("选项");
        mBack.setText("退后");
        mPrevious.setText("前进");
        mFavorites.setText("收藏夹");
        mFind.setText("搜索");
        mAddFavorites.setText("添加到收藏夹");
        labStatus.setBackground(Color.white);
        labStatus.setBorder(BorderFactory.createLineBorder(Color.black));
        labStatus.setToolTipText("");
        labStatus.setText("显示信息");
        mRefresh.setText("刷新");

        //设置各菜单项的快截键
        mOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
                ActionEvent.CTRL_MASK));
        mSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
                ActionEvent.CTRL_MASK));
        mSaveAs.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F12,
                ActionEvent.CTRL_MASK));
        mExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,
                ActionEvent.CTRL_MASK));
        mBack.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B,
                ActionEvent.CTRL_MASK));
        mPrevious.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,
                ActionEvent.CTRL_MASK));
        mFind.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F,
                ActionEvent.CTRL_MASK));
        mRefresh.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,
                ActionEvent.CTRL_MASK));
        mAddFavorites.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4,
                ActionEvent.CTRL_MASK));

        panelSite.add(urlSite, BorderLayout.CENTER);
        panelSite.add(bAccess, BorderLayout.EAST);
        contentPane.add(panelAll, BorderLayout.CENTER);
        panelAll.add(scroll, BorderLayout.CENTER);
        panelAll.add(labStatus, BorderLayout.SOUTH);
        contentPane.add(panelSite, BorderLayout.NORTH);

        menuBar.add(mFile);
        menuBar.add(mFunction);
        menuBar.add(mFavorites);
        mFile.add(mOpen);
        mFile.add(mSave);
        mFile.add(mSaveAs);
        mFile.addSeparator();
        mFile.add(mExit);
        mFunction.add(mRefresh);
        mFunction.add(mBack);
        mFunction.add(mPrevious);
        mFunction.add(mFind);
        mFavorites.add(mAddFavorites);

        initMenuItem();
        
        this.bAccess.addActionListener(this);
        this.mOpen.addActionListener(this);
        this.mSave.addActionListener(this);
        this.mSaveAs.addActionListener(this);
        this.mExit.addActionListener(this);
        this.mBack.addActionListener(this);
        this.mPrevious.addActionListener(this);
        this.mRefresh.addActionListener(this);
        this.mAddFavorites.addActionListener(this);
        this.mFind.addActionListener(this);

        this.bAccess.addKeyListener(this);
        this.urlSite.addKeyListener(this);

        this.setSize(800, 600);
        this.setLocation(0, 0);
        this.setVisible(true);

    }
    /**
     * 布局菜单项
     * 
     * 在添加页面到收藏夹后,重新刷新显示菜单项
     *
     */
    private void initMenuItem()
    {
        addFavoritesItem();//添加收藏夹内容
        this.menuBar.add(mFile);
        this.menuBar.add(mFunction);
        this.menuBar.add(mFavorites);

        this.setJMenuBar(menuBar);
    }
    public static void main(String[] args)
    {
        new WebClientUI();
    }
    /**
     * 访问internet的线程
     * 为该类的内部类
     * 每访问一次页面均构造该类
     */
    class AccessInternet extends Thread
    {
        private String url;
        AccessInternet(String url)
        {
            this.url=url;
        }
        public void run()
        {
            flag=1;//将标志设置为:1 表示访问web页面
            try
            {
                URL urlURL=new URL(url);
                urlSite.setText(url);
                taContent.setContentType("text/html");
                EditorKit ek = taContent.getEditorKitForContentType("text/html");
                HTMLDocument doc = (HTMLDocument) ek.createDefaultDocument( );
                taContent.read(urlURL.openStream(),doc);
 
                accseTime++;  //统计计数加1
            } catch (MalformedURLException e)
            {
                error("您输入的URL地址所含的协议有误:"+url);
                labStatus.setText("浏览页面" + urlSite.getText() + "失败");
            }
            catch (UnknownHostException e)
            {
                error("您输入的URL地址有误,无法找到URL地址所指示的主机:"+url);
                labStatus.setText("浏览页面" + urlSite.getText() + "失败");
            }
            catch (ConnectException e)
            {
                error("无法连接服务器:"+url);
                labStatus.setText("浏览页面" + urlSite.getText() + "失败");
            }
            catch (IOException e)
            {
                error("连接服务器发生IO错误:"+url);
                labStatus.setText("浏览页面" + urlSite.getText() + "失败");
            }
            catch (NullPointerException e)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -