设计题目:HTML浏览器
任务目标:HTML浏览器,是一个图形用户界面程序,代码简短,在URL地址栏中输入网址,点击转向,HTML浏览器可自动转向所指网页,网页显示在HTML浏览器中,代替操作系统中的浏览器,根据页面的大小HTML浏览器自动显示滚动条
学院: 软件学院
班级: 应用技术四班
姓名: 韩公达
学号: 410820010414
日期: 2009/7/8
目录
JAVA语言课程设计 1
目录 2
1 前 言 1
2 程序整体设计说明 2
2.1 程序中所使用的类 2
2.1.1 用户自定义类 2
2.1.2 成员变量 2
2.1.3 主要成员方法 2
2.1.4 内部类 2
2.2 实现的接口方法 2
2.3 异常处理说明 2
2.3.1获得URL地址异常 2
2.4 程序运行的效果 3
2.4.1 主界面 3
2.4.2 打开URL所知网页 3
2.4.3 打开URL所知网页(出现错误) 3
2.5 程序上存在的问题 4
2.6 程序源代码及注释 4
2.7 论文感想 6
参考文献 9
致谢 10
1 前 言
随着网络的发展,网络安全成为网民上网的一大障碍,为了加强网络安全,软件公司制造出各种各样的网络软件,防火墙、杀马软件、网络防护伞等,最终造成客户端日益庞大,而今天的浏览器就是这样,为了增强安全,浏览器添加各种必要组件,慢慢的越来越庞大,安全性能提上了,但启动速度逐渐在下降,为了弥补这一缺点HTML浏览器面世,它是为快速浏览网页而编写的,有效的降低了用户的等待时间。
HTML浏览器仅在浏览速度上可以代替常规浏览器,但它并不能完全代替常用浏览器,比如安全,功能设置等。
2 程序整体设计说明
2.1 程序中所使用的类
2.1.1 用户自定义类
类名:HTTPBrowserDemo
作用:主类
继承的父类:JFrame
类名:ShowHTMLListener
作用:动作监听
继承的父类:ActionListener
2.1.2 成员变量
JTextField jtfAddress; //输入html文件地址或网址
JButton jbGo; //转到文件按钮
JTextPane jtpShow; //显示文件
JLabel jlInfo; //提示信息
2.1.3 主要成员方法
public HTTPBrowserDemo() //初始化各部件菜单及事件监听
public static void main(String[] args)//主方法、驱动
2.1.4 内部类
内部类:class ShowHTMLListener
作用:显示页面内容事件处理
继承的父类:ActionListener
主要成员变量:URL address
成员变量作用:得到HTML页面的URL地址
成员方法:public void actionPerformed(ActionEvent event)
成员方法作用:页面内容事件的监听
2.2 实现的接口方法
本程序实现的接口:ActionListener
接口中的方法:public void actionPerformed(ActionEvent evt)
接口种方法的功能://对URL窗口的网址进行处理。
2.3 异常处理说明
2.3.1获得URL地址异常
需要处理的异常:Exception
处理方法:捕获异常后,显示捕获的异常jlInfo.setText("连接出错"),
ex.printStackTrace(); //输出出错信息
2.4 程序运行的效果
2.4.1 主界面
图2-1主界面
2.4.2 打开URL所知网页
图2-2打开URL所指网页
2.4.3 打开URL所知网页(出现错误)
图2-3打开URL所指网页(出现出错)
2.5 程序上存在的问题
HTML浏览器不支持样式表,很多网页的样式表在HTML浏览器上无效,造成网页布局显示混乱,内容格式不一,链接无效,。
2.6 程序源代码及注释
// html浏览器
//@author 赵枞聪
import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import javax.swing.*;
public class HTTPBrowser Demo extends JFrame
{
JTextField jtfAddress; //输入html文件地址或网址
JButton jbGo; //转到文件按钮
JTextPane jtpShow; //显示文件
JLabel jlInfo; //提示信息
public HTTPBrowserDemo()
{
super("韩公达制作的html浏览器"); //调用父类构造函数
jtfAddress=new JTextField(20); //实例化地址输入框
jbGo=new JButton("转到"); //实例化转向按钮
jtpShow=new JTextPane(); //实例化显示内容框
jlInfo=new JLabel(); //实例化信息提示标签
JPanel panel=new JPanel(); //实例化面板
panel.add(new JLabel("地址")); //增加组件到面板上
panel.add(jtfAddress);
panel.add(jbGo);
JScrollPane jsp=new JScrollPane(jtpShow); //实例化滚动窗体
Container container=getContentPane(); //得到容器
container.add(panel,BorderLayout.NORTH); //增加组件到容器上
container.add(jsp,BorderLayout.CENTER);
container.add(jlInfo,BorderLayout.SOUTH);
jbGo.addActionListener(new ShowHTMLListener()); //事件处理,发生按钮点击时显示页面内容
jtfAddress.addActionListener(new ShowHTMLListener());
setSize(400,320); //设置窗口尺寸
setVisible(true); //设置窗口可视
setLocation(400,260);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口时退出程序
}
class ShowHTMLListener implements ActionListener
{ //显示页面内容事件处理
public void actionPerformed(ActionEvent event)
{
try{
jlInfo.setText("正在连接..."); //显示提示信息
URL address=new URL(jtfAddress.getText()); //得到HTML页面的URL地址
jtpShow.setPage(address); //设置显示页面
jlInfo.setText("完成");
}
catch (Exception ex)
{
jlInfo.setText("连接出错");
ex.printStackTrace(); //输出出错信息
}
}
}
public static void main(String[] args)
{
new HTTPBrowserDemo();
}
}
2.7 论文感想
最初知道JAVA是在手机上,手机上的一些应用程序是用JAVA做的,这时JAVA给我留下最初印象是一杯热腾腾的咖啡,我不知道这杯咖啡源于什么,但它一定有根据。
刚开始接触JAVA时,感觉它和C语言有很大差别,不知道区别在那,也许是对C认识肤浅的缘故吧。学着学着随后有了一些想法,整天都听到内行人说,学程序设计语言必须要学其思想。
1.请问思想可以具体理解为什么啊?
2.学思想就是要学别人如何去思考,这里的思考指的是软件框架的思考吗?
3.对于初学者而言,我最想了解的是程序中类与类之间的关系,请问对类与类之间关系的深入理解是否算是理解软件设计思想的一个重要台阶呢?
现在学习JAVA已经半年时间了,这些问题依然没有解决,但我不会在这些问题上继续深究了,因为对这些问题我已经有了一些意识。
基本所说编程的思想是说如何用这种程序设计语言去解决实际问题,而面向对象java这样的语言是如何使用各种对象去解决问题,应该说最基本的要先掌握类和对象之间的关系,然后如何组织各种对象来解决你的题,最后体现在编程上是对象之间的关系,不是类之间的关系。比如碰到一个问题,可以先把需要使用的对象罗列出来,然后分析其之间的关系,再根据要用的对象设计对的模型(类),最后使用你设计出的类以及系统提供的类生成你要用的对象,并且组织这些对象来把你的问题的解决方法实现出来,也就是说现把问题域(现实问题)分析清楚,然后再在解题域(编程语言)里面把解答写出来。
学习编程语言唯一的办法就是多读、多写、多思考。自己写程序没什么,但读别人写的程序就要认真思考了,要知道读别人的程序是很辛苦的,所以要养成良好的编程风格,写程序要按照行业标准,涉及到关键环节要加上注释,因为写好的程序大部分是让别人看的。其实真正当你编写软件时,用到的算法就那么几个,所以对编程语言的掌握程度,就是你能够调用多少控件,用这些对象能做多少事情。
现在我学习JAVA不再想那么多,因为就像我们学英语的时候,开始学字母,然后是单词,单词学多了可以拼出几个句子,到这个阶段就是一个坎了,句子会的多了不一定马上能写出好的文章吧,你还得有很好的语言组织才能写出好的文章。编程其实是一样的,你得先学习语法结构,然后是类库的用法,然后是写出一段段的小程序,到这个阶段就像学语言学到句子一样,最后才是做软件做项目。学JAVA光学基础是远远不够用的,我一直这么认为,你要是学到企业级应用的话最起码得懂数据库、网络,甚至于软件工程上的东西。编程最忌急噪,一步一步来,有句话说的好,水到渠成,用来形容学习编程是最适合不过的,尤其是对于学生
大家都很崇慕Thinking in java,thinking in java这本书的确不错,但确实不适合初学者看的,很抽象的。我建议配合着简单一点的书籍看,比如java就业培训教程,举个例子:先看一张java培训教程的一张对象基本看懂后,再看thinking in java的那一张的对象讲解,这样学起来比较快,最好能配合着视频教学一起看效果更好。当然还要多写代码,熟读百遍不如手过一遍。
下面讨论一下关于寻找class文件原理,建议大家在入门的时候在命令行窗口编译和运行,不要借助JCreator或者Eclipse等IDE去帮助做那些事情。尝试自己这样做:
javac -classpath yourpath *.java
java -classpath yourpath *.class
也许很多人都能看懂,设置classpath的目的就是告诉编译器去哪里寻找你的class文件,不过至少笔者今日才弄懂JVM去查询类的原理,编译器加载类要依靠classloader而classloader有个级别,从高到低分别是BootClassLoader(名字可能不准确) , ExtClassLoader, AppClassLoader。这3个加载器分别对应着编译器去寻找类文件的优先级别和不同的路径:BootClassLoader对应jre/classes路径,是编译器最优先寻找class的地方, ExtClassLoader对应jre/lib/ext路径,是编译器次优先寻找class的地方, AppClassLoader对应当前路径,所以也是编译器默认找class的地方 。
其实大家可以自己写个程序简单的测试,对任何class,例如A, 调用new A().getClass().getClassLoader().toString() 打印出来就可以看到,把class文件放在不同的路径下再次执行,就会看到区别。特别注意的是如果打印出来是null就表示到了最高级BootClassLoader, 因为它是C++编写的,不存在Java对应的类加载器的名字。寻找的顺序是一种向上迂回的思想,即如果本级别找不到,就只能去本级别之上的找,不会向下寻找。不过似乎从Jdk1.4到Jdk1.6这一特点又有改变,没有找到详细资料。所以就不举例子了。告诉大家设计这种体系的是Sun公司曾经的技术核心宫力先生,一个纯种华人哦!
这样希望大家不至于迷惑为什么总报错找不到类文件,不管是自己写的还是导入的第三方的jar文件(J2ee中经常需要导入的)。
接下来在和大家讨论jdk和jre,大家肯定在安装JDK的时候会有选择是否安装单独的jre,一般都会一起安装,我也建议大家这样做。因为这样更能帮助大家弄清楚它们的区别:Jre 是java runtime environment, 是java程序的运行环境。既然是运行,当然要包含jvm,也就是大家熟悉的虚拟机啦,还有所有java类库的class文件,都在lib目录下打包成了jar。大家可以自己验证。至于在windows上的虚拟机是哪个文件呢?学过MFC的都知道什么是dll文件吧,那么大家看看jre/bin/client里面是不是有一个jvm.dll呢?那就是虚拟机。 Jdk 是java development kit,是java的开发工具包,里面包含了各种类库和工具。当然也包括了另外一个Jre,那么为什么要包括另外一个Jre呢?而且jdk/jre/bin同时有client和server两个文件夹下都包含一个jvm.dll。说明是有两个虚拟机的。这一点不知道大家是否注意到了呢?相信大家都知道jdk的bin下有各种java程序需要用到的命令,与jre的bin目录最明显的区别就是jdk下才有javac,这一点很好理解,因为jre只是一个运行环境而已。与开发无关,正因为如此,具备开发功能的jdk自己的jre下才会同时有client性质的jvm和server性质的jvm,而仅仅作为运行环境的jre下只需要client性质的jvm.dll就够了。
记得在环境变量path中设置jdk/bin路径麽?这应该是大家学习Java的第一步吧, 老师会告诉大家不设置的话javac和java是用不了的。确实jdk/bin目录下包含了所有的命令。可是有没有人想过我们用的java命令并不是jdk/bin目录下的而是jre/bin目录下的呢?不信可以做一个实验,大家可以把jdk/bin目录下的java.exe剪切到别的地方再运行java程序,发现了什么?一切OK!
那么有人会问了?我明明没有设置jre/bin目录到环境变量中啊?
试想一下如果java为了提供给大多数人使用,他们是不需要jdk做开发的,只需要jre能让java程序跑起来就可以了,那么每个客户还需要手动去设置环境变量多麻烦啊?所以安装jre的时候安装程序自动帮你把jre的java.exe添加到了系统变量中,验证的方法很简单,大家看到了系统环境变量的path最前面有“%SystemRoot%\\system32;%SystemRoot%;”这样的配置,那么再去Windows/system32下面去看看吧,发现了什么?有一个java.exe。
如果强行能够把jdk/bin挪到system32变量前面,当然也可以迫使使用jdk/jre里面的java,不过除非有必要,我不建议大家这么做。使用单独的jre跑java程序也算是客户环境下的一种测试。 这下大家应该更清楚jdk和jre内部的一些联系和区别了吧?
最后在说一点进程和线程的区别,通俗一点说,进程就是程序的一次执行,而线程可以理解为进程中的执行的一段程序片段。用一点文词说就是,每个进程都有的代码和数据空间(进程上下文);而线程可以看成是轻量级的进程。一般来讲(不使用特殊技术),同一进程所产生的线程共享同一块内存空间。同一进程中的两段代码是不可能同时执行的,除非引入线程。线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。线程占用的资源要少于进程所占用的资源。进程和线程都可以有优先级。在线程系统中进程也是一个线程。可以将进程理解为一个程序的第一个线程。多进程——在操作系统中,能同时运行多个任务(程序)。多线程——在同一应用程序中,有多个顺序流同时执行。
学习编程语言刚开始是一件很枯燥的事,随着时间的推移,知识的积累,你会逐渐尝到甜头的。做程序员是很累人的,累了就来一杯咖啡吧,这就是JAVA热腾腾一杯咖啡的标志来源,这本身就包含许多对象,如何利用对象就是思想。
参考文献
[1]《JAVA程序语言设计》马皓 清华大学出版社
[2]《JAVA2 程序设计实用教程》宋振会 陈立 电子工业出版社
[3]《JAVA 编程思想》(美)Bruce Eckel 侯捷(译)机械工业出版社
[4]《JAVA 基础教程》耿祥义 清华大学出版社
[5]《JAVA 语言学习手册》Patrick Niemeyer Jonatban Kmudsen 林琪(译)中国电力出版社
致谢
[1]感谢河南理工计算机科学与技术学院陈玮老师。
[2]感谢以上我所参考书籍的作者和出版社。
[3]感谢软件学院能够给我这个优越的学习环境。下载本文