第一篇:java网络编程考试总结要点
1、动静态网页的概念,常见后缀及基本区别。
静态网页:是指用HTML标记语言等来编排,页面中的内容固定不变,存盘后一般以*.html、*.htm等文件形式存在的网页。动态网页:是指网页中的关键内容在服务器端动态生成的网页。常见后缀有*.jsp、*.php、*.asp等 区别:(1)动态网页会被服务器当作一个程序来执行,网页中静态内容服务器不作任何处理,直接输出给客户端,动态内容的代码会被服务器识别并执行;(2)而静态网页则不会被服务器视为程序,网页中的内容不会被服务器运行。
2、Tomcat服务器的文件夹结构及web应用的文件夹结构
Tomcat服务器的文件夹结构:
1)tomcatbin文件夹:存放Tomcat的脚本文件和可执行文件,用来启动和关闭服务器。startup.bat是Windows环境下启动服务器的批处理文件,shutdown.bat,用于关闭startup.sh用于linux环境下启动服务器,shutdown.sh,用于关闭
2)tomcatconf文件夹:主要存放Tomcat的全局配置文件。
3)tomcatlib文件夹:存放*.jar形式的公用类库文件,这些类库文件可供Tomcat管理下的各个web应用所共享。
4)tomcatwebapps文件夹:Tomcat默认的虚拟主机是localhost,它默认的Web应用发布文件夹是webapps。在此文件夹下发布的Web应用通过URL即可直接访问。
5)tomcatwork文件夹:临时文件夹,主要存放各JSP文件编译后得到的Servlet程序、日志和临时文件等。
6)tomcatlogs:日志文件,如果服务器出现错误,会自动记录。
7)tomcatwebappsROOT文件夹:为Web应用的文件夹名,是服务器默认的Web应用,在其中可创建下级文件夹来分类存放资源文件。
WEB-INF是一个特殊的文件夹,存放当前Web应用的配置文件、类库文件等资源。
这个文件夹对于客户端而言是不可访问的,但对Web应用中的程序而言是可访问的,所有不希望被客户端直接访问访问的资源,可存储在该文件夹下。WEB应用的目录结构:
1)/WebProject:Web应用的根目录,存放所有的jsp和html文件; 2)/WebProject/WEB_INF:存放当前Web应用的配置文件、类库文件等资源。这个文件夹对于客户端而言是不可访问的,但对Web应用中的程序而言是可访问的,所有不希望被客户端直接访问访问的资源,可存储在该文件夹下;
3)/WebProject/WEB_INF/class:存放各种class文件,Servlet文件; 4)/WebProject/WEB_INF/lib:存放Web应用所需要的jar文件,如JDBC驱动程序的JAR。
3、JSP指令元素重点在page上,JSP脚本代码,JSP动态元素
JSP指令元素的作用:供JSP容器使用,为JSP容器提供相关的页面属性信息,用于指示JSP容器如何正确地翻译代码,或者执行特定的操作。
(1)include指令元素称为文件包含,是在JSP容器把JSP网页翻译成Servlet程序时,将指定文本文件的内容嵌入Servlet程序中,替换include指令。基本语法:<%@ include file=“relativeURLspec” %>(file属性指出被包含资源的URL,URL即可使用相对路径也可使用绝对路径,绝对路径以Web应用的上下文路径名“/xxxx”开头)相对路径:<% @ include file=”adminindex.html” %> 绝对路径:<%@ include file=”/exam/index.html” %> 使用时注意:1)include指令适合于包含静态内容;2)include指令是代码静态绑定,被include指令包含的内容在编译时会被静态地嵌入Servlet程序中;3)include指令影响JSP页面的可读性。
(2)page指令元素用于设置当前JSP页面的属性。习惯把该指令写在JSP页面的头部。page指令中的属性大多数只需要在JSP页面中定义一次。
page指令中允许重复使用多次的属性有pageEncoding和import属性等。
基本语法:<% @ page language=“java” extends=“ „„.” import=“ „„.”
session=“ true|false”
buffer=“none|default|sizekb” autoFlush=“true|false” isThreadSafe=“true|false” info=“„„..”
isErrorPage=“true|false” errorPage=“„„..” contentType=“„„.” pageEncoding=“default”
isELIgnored=“true|false” %>
1)language属性:定义JSP页面脚本代码所采用的编程语言,默认值为java 2)extends属性:JSP页面最终会被JSP容器编译成一个Servlet程序,该属性用于定义这个Servlet程序的父类。
3)import属性:用于导入当前JSP页面中要用到的其它Java类。如果要导入多个Java类,用逗号来分隔它们,如: <%@page import=”java.util.*,java.io.*“%>
or<%@page import=”java.util.*“%> <%@page import=”java.io.*“%>
4)pageEncoding属性:定义当前页面的字符编码标准,默认的字符集为ISO-8859-1,若页面中有简体中文,则字符集应该定义为GB2312或GBK。
5)contentType属性:定义MIME类型(MIME-type)和字符集。为HTTP协议附加了MIME-type信息,用于指明HTTP中所传递信息的数据类型,浏览器接收完数据后,自动按照数据的类型调用合适的软件来处理这些数据。
MIME(Multipurpose Internet Mail Extensions,多功能Internet 邮件扩充服务)使用简单的ASCII文本来传递E-mail信息,E-mail中允许包含有任意类型的附件文件。
语法:<%@ page contentType=”text/html;charset=gb2312“>
6)session属性:用来指示JSP页面的Servlet实现类中,是否要生成一个session隐含对象
7)buffer属性:out对象是JSP页面的隐含对象之一,用于向客户端返回信息。buffer属性为out对象定义输出流缓冲区,则out.write()输出的信息会暂时存储在缓冲区中,缓冲区被刷新后,其中的信息会通过PrintWriter对象传给客户端。输出缓冲区能够改善系统的性能。
buffer属性取值为none时,表示不设缓冲区,则out对象的输出信息会直接传递PrintWriter。buffer取值为nkb时,表示缓冲区的大小为nKB,默认值为8KB。如:<%@page buffer=”64kb“%>
8)autoFlush属性:定义out对象缓冲区的刷新属性。autoFulsh取值为true时,表示缓冲区满时自动执行刷新操作默认值为true。取值为false表示缓冲区满时,抛出一个IOException异常。本属性一般和buffer属性联用,如果buffer=”none“时,则autoFlush=”true“无效,如:<%@page buffer=”2kb“ autoFlush=”false“%> 9)isThreadSafe属性:isThreadSafe=“true”时,表示JSP编译后所得的Servlet程序以多线程方式工作,采用Servlet多线程方式工作能提高程序的响应速度,减少系统开销。默认值为true。<%@page buffer="2kb"autoFlush="false"%>
当isThreadSafe=”false“时,表示Servlet程序以单线程方式工作。
10)info属性:定义JSP页面的信息,如版
权、开发日期等,可通过javax.servlet.Servlet.getServletInfo()方法读取这些信息。
如:
<%@page info=”xxx公司信息部研发,2007-1-9"%><%=getServletInfo()%>
第二篇:Java AWT编程总结
1.什么是GUI?
a)GUI是Graphics User Interface的全称,意思是图形用户界面.2.为什么需要GUI?
a)图形用户界面能够让最终用户通过鼠标拖动、单击等动作就可以操作整个应用,从而提高应用的用户体验效果,使程序受到用户的欢迎.3.Java通过AWT和SWING来完成GUI图形用户界面编程.4.AWT
a)AWT是SUN公司提供的一个基本的GUI类库,被称为抽象工具集(Abstract
Window-Toolkit),它为Java应用程序提供了基本的组件.b)AWT组件需要调用运行平台的图形界面来创建和平台一致的对等体,所以AWT只
能使用所有平台都支持的公共组件,因此AWT只能够提供一些 常用的GUI组件.5.AWT的主要组成部分
a)Component,代表一个具体图形表示能力的对象,可以在屏幕上显示,并与用户交互.通常我们把它称为”组件”.b)MenuComponent,代表图形界面的菜单.i.MenuBar,代表菜单条.ii.Menu,代表一个菜单项的集合.iii.MenuItem,代表一个菜单项.c)Container,代表一个AWT组件容器,可以盛装其他Commponent组件,它继承自
Component抽象类,本身也代表一个Component组件.i.Window,可独立存在的顶级窗口.1.Frame,代表一个窗体.2.Dialog,代表一个对话框
a)FileDialog代表一个文件对话框,用于打开或保存文件.Panel,可容纳其他组件,但不能独立存在,必须被添加到其他容器中.ii.iii.ScrollPane,带滚动条的容器.d)LayoutManager,布局管理器,表示容器管理其他组件的方式.i.ii.iii.iv.v.vi.FlowLayout,流式布局,类似于Window平台记事本的文本布局方式.BorderLayout,边框布局,只能盛装5个组件,这5个组件分别位于边框布局容器的东西南北中五个方位.GridLayout,网格布局,将组件以网格形式显示在容器中.GridBagLayout,网格包布局,一种较为复杂的布局管理器,依赖GridBagConstraints来约束组件.CardLayout,卡片布局,以时间来管理容器内的组件,将组件看作是一张张卡片,每次显示最外面一张卡片(组件).BoxLayou,箱式布局,通常与Box容器结合使用.6.AWT 的事件
a)应用程序响应用户的某个动作或请求,如用户单击了一下鼠标,用户请求关闭应用
程序窗口等.b)AWT编程中,所有事件的处理都必须交给特定的对象来完成,我们将这个特定的对
象称为事件监听器.c)AWT的事件处理机制是一种委派式的事件处理方式,通过将某个事件监听器注册
到用户指定的组件,当用户进行某个操作并触发指定事件时,应用程序会自动产生一个事件(Event)对象并作为参数传给事件监听器中的事件处理器,然后由事件监
听器通知事件处理器来响应用户,完成用户的请求.d)不同的事件需要不同的事件监听器,不同的监听器需要实现不同的监听器接口.e)事件监听器接口:为某个特定事件定义了响应用户请求的方法,当用户将某个事件
监听器注册到指定组件上以响应特定的事件时,则该事件监听器必须实现对应的事件监听器接口才能对用户的请求进行有效处理.例如,用户点击了鼠标右键,希望打开某个应用程序的右键菜单,则注册到该应用程序上的事件监听器必须实现鼠标事件监听器接口,并实现该接口内部某些方法来完成用户的请求.f)事件适配器,很多时候,我们只需要实现某个事件监听器接口中个别方法就能完成应用程序的实际需求,但实现该事件监听器接口的类必须实现该接口中所有的抽象方法,这会造成代码的冗余.而事件适配器可以帮我们解决这个问题,事件适配器实现了所有的拥有多个抽象方法的事件监听器接口,并空实现了这些接口中所有的抽象方法,所谓空实现,就是方法中没有任何实现代码,因此,我们可以通过继承对应事件监听器接口的事件适配器抽象类,并实现我们感兴趣的方法来完成应用需求即可.g)Java事件处理过程中主要涉及的三类对象
i.事件源,通常为普通组件.ii.事件,通常指用户的某个操作,如单击了一下鼠标,按了一下回车键.iii.事件监听器,负责监听事件源上所发生的事件,并作出响应.h)AWT事件监听器的实现形式
i.ii.内部类形式 顶级类形式
iii.类本身作为事件监听器
iv.匿名内部类形式
v.注:目前最为流行的事件监听器的实现形式是内部类形式和匿名内部类形式.7.AWT绘图
a)AWT绘图的实现过程.i.重写画布类的paint方法,绘图图形.ii.注册事件监听器到指定的组件.iii.调用Component类的repaint方法绘制图形.b)AWT实现绘图主要涉及的对象
i.ii.c)Component类的子类Canvas类,它代表一个画布.Graphics,代表一个画笔,可以在Canvas的子类中绘制用户自订的图形.Image类代表了位图,它的一个主要的实现类BufferedImage是可以访问图形数据
缓冲区,并可以返回一个Graphics对象来绘制该BuuferedImage.d)可以使用ImageIO工具类的ImageReader和ImageWriter读写磁盘上的位图文件.8.AWT的优缺点
a)AWT在许多非桌面环境,如嵌入式设备中有着自己的优势,它的主要优点如下:i.ii.iii.iv.更少的内存:对运行在有限环境中的GUI程序的开发,是合适的。2.更少的启动事件:由于AWT组件是本地由操作系统实现的。绝大多数的二进制代码已经在如系统启动的时候被预装载了,这降低了它的启动事件。3.更好的响应:由于本地组件由操作系统渲染。4.成熟稳定的:能够正常工作并很少使你的程序崩溃。
b)同样它也有不少的缺点
i.ii.iii.更少组件类型:表和树这些重要的组件缺失了。它们是桌面应用程序中普遍使用的。2.缺乏丰富的组件特征:按钮不支持图片。3.无扩展性:AWT的组件是本地组件。JVM中的AWT类实例实际只是包含本地
组件的引用。唯一的扩展点是AWT的Canvas组件,可以从零开始创建自定义组
件。然而无法继承和重用一个已有的AWT组件
9.AWT总结:AWT是SUN不推荐使用的工具集,实际开发中很少使用AWT而是使用SUN公司
和Netscape公司共同开发的一个新的用户界面库-Swing来开发GUI应用程序,AWT是图形用户界面编程的基础,它的布局管理、事件机制、剪贴板操作等内容仍然适用于Swing GUI编程.
第三篇:Java线程编程总结
线程编程方面
60、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
答:有两种实现方法,分别是继承Thread类与实现Runnable接口 用synchronized关键字修饰同步方法
反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被“挂起”的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。61、sleep()和 wait()有什么区别? 答:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
62、同步和异步有何异同,在什么情况下分别使用他们?举例说明。
答:如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。63、启动一个线程是用run()还是start()? 答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
64、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 答:不能,一个对象的一个synchronized方法只能由一个线程访问。
我认为:其他线程可以进入非synchronized方法,但不能进入这个对象的synchronized方法。65、请说出你所知道的线程同步的方法。
答:wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
66、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify 67、线程的基本概念、线程的基本状态以及状态之间的关系
答:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。
Java中的线程有四种状态分别是:运行、就绪、挂起、结束
68、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 答:主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
Jsp方面
69、forward 和redirect的区别
答:forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。70、jsp有哪些内置对象?作用分别是什么?
答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):
request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行的内容
out 用来传送回应的输出 config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外
71、jsp有哪些动作?作用分别是什么? 答:JSP共有以下6种基本动作
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记 72、JSP中动态INCLUDE与静态INCLUDE的区别?
答:动态INCLUDE用jsp:include动作实现
静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面
<%@ include file=“included.htm” %> 73、两种跳转方式分别是什么?有什么区别? 答:有两种,分别为:
74、JSP的内置对象及方法。
答:request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。
response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)
out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。
pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。
session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息
applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息
config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。page表示从该页面产生的一个servlet实例
Servlet方面
75、说一说Servlet的生命周期?
答:servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
76、JAVA SERVLET API中forward()与redirect()的区别?
答:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。77、Servlet的基本架构 答:
public class ServletName extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { } public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { } }
78、什么情况下调用doGet()和doPost()?
答:Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。79、servlet的生命周期
答:web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。
80、如何现实servlet的单线程模式 答:<%@ page isThreadSafe=“false”%> 81、页面间对象传递的方法
答:request,session,application,cookie等
82、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
答:JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。83、四种会话跟踪技术
答:会话作用域ServletsJSP 页面描述
page否是代表与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示。这既包括 servlet 又包括被编译成 servlet 的 JSP 页面
request是是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系)
session是是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求
application是是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域 84、Request对象的主要方法 答:
setAttribute(String name,Object):设置名字为name的request的参数值 getAttribute(String name):返回由name指定的属性值
getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例 getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组 getCharacterEncoding():返回请求中的字符编码方式 getContentLength():返回请求的Body的长度
getHeader(String name):获得HTTP协议定义的文件头信息 getHeaders(String name):返回指定名字的request Header的所有值,结果是一个枚举的实例 getHeaderNames():返回所以request Header的名字,结果是一个枚举的实例 getInputStream():返回请求的输入流,用于获得请求中的数据 getMethod():获得客户端向服务器端传送数据的方法
getParameter(String name):获得客户端传送给服务器端的有name指定的参数值
getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例 getParameterValues(String name):获得有name指定的参数的所有值 getProtocol():获取客户端向服务器端传送数据所依据的协议名称 getQueryString():获得查询字符串
getRequestURI():获取发出请求字符串的客户端地址 getRemoteAddr():获取客户端的IP地址 getRemoteHost():获取客户端的名字
getSession([Boolean create]):返回和请求相关Session getServerName():获取服务器的名字
getServletPath():获取客户端所请求的脚本文件的路径 getServerPort():获取服务器的端口号
removeAttribute(String name):删除请求中的一个属性
85、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串? 答:
Public String translate(String str){ String tempStr = “";try { tempStr = new String(str.getBytes(”ISO-8859-1“), ”GBK");tempStr = tempStr.trim();} catch(Exception e){ System.err.println(e.getMessage());} return tempStr;} 86、Servlet执行时一般实现哪几个方法? 答:
public void init(ServletConfig config)public ServletConfig getServletConfig()public String getServletInfo()public void service(ServletRequest request,ServletResponse response)public void destroy()
Jdbc、Jdo方面88、Jdo是什么?
87、Class.forName的作用?为什么要用?
答:调用该访问返回一个以字符串指定类名的类的对象。答:JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。89、说出数据连接池的工作机制是什么? 答:J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。90、Jdo是什么? 答:JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。
Xml方面
91、xml有哪些解析技术?区别是什么? 答:有DOM,SAX,STAX等
DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问。
SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 STAX:Streaming API for XML(StAX)92、你在项目中用到了xml技术的哪些方面?如何实现的?
答:用到了数据存贮,信息配置两方面。在做数据交换平台时,将不能数据源的数据组装成XML文件,然后将XML文件压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再同XML文件中还原相关信息进行处理。在做软件配置时,利用XML可以很方便的进行,软件的各种配置参数都存贮在XML文件中。
93、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 答:a: 两种形式 dtd schema,b: 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的),c:有DOM,SAX,STAX等
DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问
SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 STAX:Streaming API for XML(StAX)
第四篇:Java多线程编程总结
Java多线程编程总结
2007-05-17 11:21:59 标签:java 多线程
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处、作者信息和本声明。否则将追究法律责任。http://lavasoft.blog.51cto.com/62575/27069
Java多线程编程总结
下面是Java线程系列博文的一个编目:
Java线程:概念与原理 Java线程:创建与启动
Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池
Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上)Java线程:新特征-锁(下)Java线程:新特征-信号量 Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:大总结
----
下面的内容是很早之前写的,内容不够充实,而且是基于Java1.4的内容,Java5之后,线程并发部分扩展了相当多的内容,因此建议大家看上面的系列文章的内容,与时俱进,跟上Java发展的步伐。----
一、认识多任务、多进程、单线程、多线程 要认识多线程就要从操作系统的原理说起。
以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在copy东西的时候不能rename文件名。为了提高系统的利用效率,采用批处理来批量执行任务。
现在的操作系统都是多任务操作系统,每个运行的任务就是操作系统所做的一件事情,比如你在听歌的同时还在用MSN和好友聊天。听歌和聊天就是两个任务,这个两个任务是“同时”进行的。一个任务一般对应一个进程,也可能包含好几个进程。比如运行的MSN就对应一个MSN的进程,如果你用的是windows系统,你就可以在任务管理器中看到操作系统正在运行的进程信息。
一般来说,当运行一个应用程序的时候,就启动了一个进程,当然有些会启动多个进程。启动进程的时候,操作系统会为进程分配资源,其中最主要的资源是内存空间,因为程序是在内存中运行的。在进程中,有些程序流程块是可以乱序执行的,并且这个代码块可以同时被多次执行。实际上,这样的代码块就是线程体。线程是进程中乱序执行的代码流程。当多个线程同时运行的时候,这样的执行模式成为并发执行。
多线程的目的是为了最大限度的利用CPU资源。
Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行。
一般常见的Java应用程序都是单线程的。比如,用java命令运行一个最简单的HelloWorld的Java应用程序时,就启动了一个JVM进程,JVM找到程序程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出。
对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存,而是让新线程共享原有的进程块的内存。因此,线程间的通信很容易,速度也很快。不同的进程因为处于不同的内存块,因此进程之间的通信相对困难。
实际上,操作的系统的多进程实现了多任务并发执行,程序的多线程实现了进程的并发执行。多任务、多进程、多线程的前提都是要求操作系统提供多任务、多进程、多线程的支持。
在Java程序中,JVM负责线程的调度。线程调度是值按照特定的机制为多个线程分配CPU的使用权。调度的模式有两种:分时调度和抢占式调度。分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;抢占式调度是根据线程的优先级别来获取CPU的使用权。JVM的线程调度模式采用了抢占式模式。
所谓的“并发执行”、“同时”其实都不是真正意义上的“同时”。众所周知,CPU都有个时钟频率,表示每秒中能执行cpu指令的次数。在每个时钟周期内,CPU实际上只能去执行一条(也有可能多条)指令。操作系统将进程线程进行管理,轮流(没有固定的顺序)分配每个进程很短的一段是时间(不一定是均分),然后在每个线程内部,程序代码自己处理该进程内部线程的时间分配,多个线程之间相互的切换去执行,这个切换时间也是非常短的。因此多任务、多进程、多线程都是操作系统给人的一种宏观感受,从微观角度看,程序的运行是异步执行的。
用一句话做总结:虽然操作系统是多线程的,但CPU每一时刻只能做一件事,和人的大脑是一样的,呵呵。
二、Java与多线程
Java语言的多线程需要操作系统的支持。
Java 虚拟机允许应用程序并发地运行多个执行线程。Java语言提供了多线程编程的扩展点,并给出了功能强大的线程控制API。
在Java中,多线程的实现有两种方式: 扩展java.lang.Thread类 实现java.lang.Runnable接口
每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。
当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:
调用了 Runtime 类的 exit 方法,并且安全管理器允许退出操作发生。
非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到 run 方法之外的异常。
三、扩展java.lang.Thread类
/** * File Name: TestMitiThread.java * Created by: IntelliJ IDEA.* Copyright: Copyright(c)2003-2006 * Company: Lavasoft([url]http://lavasoft.blog.51cto.com/[/url])* Author: leizhimin * Modifier: leizhimin * Date Time: 2007-5-17 10:03:12 * Readme: 通过扩展Thread类实现多线程 */ public class TestMitiThread { public static void main(String[] rags){ System.out.println(Thread.currentThread().getName()+ “ 线程运行开始!”);new MitiSay(“A”).start();new MitiSay(“B”).start();System.out.println(Thread.currentThread().getName()+ “ 线程运行结束!”);} }
class MitiSay extends Thread { public MitiSay(String threadName){ super(threadName);}
public void run(){ System.out.println(getName()+ “ 线程运行开始!”);for(int i = 0;i < 10;i++){ System.out.println(i + “ ” + getName());try { sleep((int)Math.random()* 10);} catch(InterruptedException e){ e.printStackTrace();} } System.out.println(getName()+ “ 线程运行结束!”);} }
运行结果:
main 线程运行开始!main 线程运行结束!A 线程运行开始!0 A 1 A B 线程运行开始!2 A 0 B 3 A 4 A 1 B 5 A 6 A 7 A 8 A 9 A A 线程运行结束!2 B 3 B 4 B 5 B 6 B 7 B 8 B 9 B B 线程运行结束!说明:
程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建。随着调用MitiSay的两个对象的start方法,另外两个线程也启动了,这样,整个应用就在多线程下运行。
在一个方法中调用Thread.currentThread().getName()方法,可以获取当前线程的名字。在mian方法中调用该方法,获取的是主线程的名字。
注意:start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。
从程序运行的结果可以发现,多线程程序是乱序执行。因此,只有乱序执行的代码才有必要设计为多线程。
Thread.sleep()方法调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留出一定时间给其他线程执行的机会。
实际上所有的多线程代码执行顺序都是不确定的,每次执行的结果都是随机的。
四、实现java.lang.Runnable接口
/** * 通过实现 Runnable 接口实现多线程 */ public class TestMitiThread1 implements Runnable {
public static void main(String[] args){ System.out.println(Thread.currentThread().getName()+ “ 线程运行开始!”);TestMitiThread1 test = new TestMitiThread1();Thread thread1 = new Thread(test);Thread thread2 = new Thread(test);thread1.start();thread2.start();System.out.println(Thread.currentThread().getName()+ “ 线程运行结束!”);}
public void run(){ System.out.println(Thread.currentThread().getName()+ “ 线程运行开始!”);for(int i = 0;i < 10;i++){ System.out.println(i + “ ” + Thread.currentThread().getName());try { Thread.sleep((int)Math.random()* 10);} catch(InterruptedException e){ e.printStackTrace();} } System.out.println(Thread.currentThread().getName()+ “ 线程运行结束!”);} }
运行结果:
main 线程运行开始!Thread-0 线程运行开始!main 线程运行结束!0 Thread-0 Thread-1 线程运行开始!0 Thread-1 1 Thread-1 1 Thread-0 2 Thread-0 2 Thread-1 3 Thread-0 3 Thread-1 4 Thread-0 4 Thread-1 5 Thread-0 6 Thread-0 5 Thread-1 7 Thread-0 8 Thread-0 6 Thread-1 9 Thread-0 7 Thread-1 Thread-0 线程运行结束!8 Thread-1 9 Thread-1 Thread-1 线程运行结束!说明:
TestMitiThread1类通过实现Runnable接口,使得该类有了多线程类的特征。run()方法是多线程程序的一个约定。所有的多线程代码都在run方法里面。Thread类实际上也是实现了Runnable接口的类。
在启动的多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target)构造出对象,然后调用Thread对象的start()方法来运行多线程代码。
实际上所有的多线程代码都是通过运行Thread的start()方法来运行的。因此,不管是扩展Thread类还是实现Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的,熟悉Thread类的API是进行多线程编程的基础。
五、读解Thread类API
static int MAX_PRIORITY 线程可以具有的最高优先级。static int MIN_PRIORITY 线程可以具有的最低优先级。static int NORM_PRIORITY 分配给线程的默认优先级。
构造方法摘要
Thread(Runnable target)分配新的 Thread 对象。Thread(String name)分配新的 Thread 对象。
方法摘要
static Thread currentThread()返回对当前正在执行的线程对象的引用。ClassLoader getContextClassLoader()返回该线程的上下文 ClassLoader。long getId()返回该线程的标识符。String getName()返回该线程的名称。int getPriority()返回线程的优先级。Thread.State getState()返回该线程的状态。ThreadGroup getThreadGroup()返回该线程所属的线程组。static boolean holdsLock(Object obj)当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。void interrupt()中断线程。
static boolean interrupted()测试当前线程是否已经中断。boolean isAlive()测试线程是否处于活动状态。boolean isDaemon()测试该线程是否为守护线程。boolean isInterrupted()测试线程是否已经中断。void join()等待该线程终止。void join(long millis)等待该线程终止的时间最长为 millis 毫秒。void join(long millis, int nanos)等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。void resume()已过时。该方法只与 suspend()一起使用,但 suspend()已经遭到反对,因为它具有死锁倾向。有关更多信息,请参阅为何 Thread.stop、Thread.suspend 和 Thread.resume 遭到反对?。void run()如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。void setContextClassLoader(ClassLoader cl)设置该线程的上下文 ClassLoader。void setDaemon(boolean on)将该线程标记为守护线程或用户线程。
static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。void setName(String name)改变线程名称,使之与参数 name 相同。void setPriority(int newPriority)更改线程的优先级。
void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)设置该线程由于未捕获到异常而突然终止时调用的处理程序。static void sleep(long millis)在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。static void sleep(long millis, int nanos)在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行)。void start()使该线程开始执行;Java 虚拟机调用该线程的 run 方法。void stop()已过时。该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。有关更多信息,请参阅《为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?》。void stop(Throwable obj)已过时。该方法具有固有的不安全性。请参阅 stop()以获得详细信息。该方法的附加危险是它可用于生成目标线程未准备处理的异常(包括若没有该方法该线程不太可能抛出的已检查的异常)。有关更多信息,请参阅为何 Thread.stop、Thread.suspend 和 Thread.resume 遭到反对?。void suspend()已过时。该方法已经遭到反对,因为它具有固有的死锁倾向。如果目标线程挂起时在保护关键系统资源的监视器上保持有锁,则在目标线程重新开始以前任何线程都不能访问该资源。如果重新开始目标线程的线程想在调用 resume 之前锁定该监视器,则会发生死锁。这类死锁通常会证明自己是“冻结”的进程。有关更多信息,请参阅为何 Thread.stop、Thread.suspend 和 Thread.resume 遭到反对?。String toString()返回该线程的字符串表示形式,包括线程名称、优先级和线程组。static void yield()暂停当前正在执行的线程对象,并执行其他线程。
六、线程的状态转换图
线程在一定条件下,状态会发生变化。线程变化的状态转换图如下:
1、新建状态(New):新创建了一个线程对象。
2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
七、线程的调度
1、调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会。
Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量: static int MAX_PRIORITY 线程可以具有的最高优先级,取值为10。static int MIN_PRIORITY 线程可以具有的最低优先级,取值为1。static int NORM_PRIORITY 分配给线程的默认优先级,取值为5。
Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级。
每个线程都有默认的优先级。主线程的默认优先级为Thread.NORM_PRIORITY。
线程的优先级有继承关系,比如A线程中创建了B线程,那么B将和A具有相同的优先级。JVM提供了10个线程优先级,但与常见的操作系统都不能很好的映射。如果希望程序能移植到各个操作系统中,应该仅仅使用Thread类有以下三个静态常量作为优先级,这样能保证同样的优先级采用了同样的调度方式。
2、线程睡眠:Thread.sleep(long millis)方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。
3、线程等待:Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify()方法或 notifyAll()唤醒方法。这个两个唤醒方法也是Object类中的方法,行为等价于调用 wait(0)一样。
4、线程让步:Thread.yield()方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。
5、线程加入:join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。
6、线程唤醒:Object类中的notify()方法,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。类似的方法还有一个notifyAll(),唤醒在此对象监视器上等待的所有线程。注意:Thread中suspend()和resume()两个方法在JDK1.5中已经废除,不再介绍。因为有死锁倾向。
7、常见线程名词解释
主线程:JVM调用程序mian()所产生的线程。
当前线程:这个是容易混淆的概念。一般指通过Thread.currentThread()来获取的进程。后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。
前台线程:是指接受后台线程服务的线程,其实前台后台线程是联系在一起,就像傀儡和幕后操纵者一样的关系。傀儡是前台线程、幕后操纵者是后台线程。由前台线程创建的线程默认也是前台线程。可以通过isDaemon()和setDaemon()方法来判断和设置一个线程是否为后台线程。
本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/27069
第五篇:Java AWT编程总结
1.什么是GUI? a)GUI是Graphics User Interface的全称,意思是图形用户界面.2.为什么需要GUI? a)图形用户界面能够让最终用户通过鼠标拖动、单击等动作就可以操作整个应用,从而提高应用的用户体验效果,使程序受到用户的欢迎.3.Java通过AWT和SWING来完成GUI图形用户界面编程.4.AWT a)AWT是SUN公司提供的一个基本的GUI类库,被称为抽象工具集(Abstract Window-Toolkit),它为Java应用程序提供了基本的组件.b)AWT组件需要调用运行平台的图形界面来创建和平台一致的对等体,所以AWT只能使用所有平台都支持的公共组件,因此AWT只能够提供一些 常用的GUI组件.5.AWT的主要组成部分
a)Component,代表一个具体图形表示能力的对象,可以在屏幕上显示,并与用户交互.通常我们把它称为”组件”.b)MenuComponent,代表图形界面的菜单.i.MenuBar,代表菜单条.ii.Menu,代表一个菜单项的集合.iii.MenuItem,代表一个菜单项.c)Container,代表一个AWT组件容器,可以盛装其他Commponent组件,它继承自Component抽象类,本身也代表一个Component组件.i.Window,可独立存在的顶级窗口.1.Frame,代表一个窗体.2.Dialog,代表一个对话框
a)FileDialog代表一个文件对话框,用于打开或保存文件.Panel,可容纳其他组件,但不能独立存在,必须被添加到其他容器中.ii.iii.ScrollPane,带滚动条的容器.d)LayoutManager,布局管理器,表示容器管理其他组件的方式.i.ii.iii.iv.v.vi.FlowLayout,流式布局,类似于Window平台记事本的文本布局方式.BorderLayout,边框布局,只能盛装5个组件,这5个组件分别位于边框布局容器的东西南北中五个方位.GridLayout,网格布局,将组件以网格形式显示在容器中.GridBagLayout,网格包布局,一种较为复杂的布局管理器,依赖GridBagConstraints来约束组件.CardLayout,卡片布局,以时间来管理容器内的组件,将组件看作是一张张卡片,每次显示最外面一张卡片(组件).BoxLayou,箱式布局,通常与Box容器结合使用.6.AWT 的事件
a)应用程序响应用户的某个动作或请求,如用户单击了一下鼠标,用户请求关闭应用程序窗口等.b)AWT编程中,所有事件的处理都必须交给特定的对象来完成,我们将这个特定的对象称为事件监听器.c)AWT的事件处理机制是一种委派式的事件处理方式,通过将某个事件监听器注册到用户指定的组件,当用户进行某个操作并触发指定事件时,应用程序会自动产生一个事件(Event)对象并作为参数传给事件监听器中的事件处理器,然后由事件监听器通知事件处理器来响应用户,完成用户的请求.d)不同的事件需要不同的事件监听器,不同的监听器需要实现不同的监听器接口.e)事件监听器接口:为某个特定事件定义了响应用户请求的方法,当用户将某个事件监听器注册到指定组件上以响应特定的事件时,则该事件监听器必须实现对应的事件监听器接口才能对用户的请求进行有效处理.例如,用户点击了鼠标右键,希望打开某个应用程序的右键菜单,则注册到该应用程序上的事件监听器必须实现鼠标事件监听器接口,并实现该接口内部某些方法来完成用户的请求.f)事件适配器,很多时候,我们只需要实现某个事件监听器接口中个别方法就能完成应用程序的实际需求,但实现该事件监听器接口的类必须实现该接口中所有的抽象方法,这会造成代码的冗余.而事件适配器可以帮我们解决这个问题,事件适配器实现了所有的拥有多个抽象方法的事件监听器接口,并空实现了这些接口中所有的抽象方法,所谓空实现,就是方法中没有任何实现代码,因此,我们可以通过继承对应事件监听器接口的事件适配器抽象类,并实现我们感兴趣的方法来完成应用需求即可.g)Java事件处理过程中主要涉及的三类对象 i.事件源,通常为普通组件.ii.事件,通常指用户的某个操作,如单击了一下鼠标,按了一下回车键.iii.事件监听器,负责监听事件源上所发生的事件,并作出响应.h)AWT事件监听器的实现形式 i.ii.内部类形式 顶级类形式
iii.类本身作为事件监听器 iv.匿名内部类形式 v.注:目前最为流行的事件监听器的实现形式是内部类形式和匿名内部类形式.7.AWT绘图
a)AWT绘图的实现过程.i.重写画布类的paint方法,绘图图形.ii.注册事件监听器到指定的组件.iii.调用Component类的repaint方法绘制图形.b)AWT实现绘图主要涉及的对象 i.ii.c)Component类的子类Canvas类,它代表一个画布.Graphics,代表一个画笔,可以在Canvas的子类中绘制用户自订的图形.Image类代表了位图,它的一个主要的实现类BufferedImage是可以访问图形数据缓冲区,并可以返回一个Graphics对象来绘制该BuuferedImage.d)可以使用ImageIO工具类的ImageReader和ImageWriter读写磁盘上的位图文件.8.AWT的优缺点
a)AWT在许多非桌面环境,如嵌入式设备中有着自己的优势,它的主要优点如下:
i.ii.iii.iv.更少的内存:对运行在有限环境中的GUI程序的开发,是合适的。
2.更少的启动事件:由于AWT组件是本地由操作系统实现的。绝大多数的二进制代码已经在如系统启动的时候被预装载了,这降低了它的启动事件。3.更好的响应:由于本地组件由操作系统渲染。4.成熟稳定的:能够正常工作并很少使你的程序崩溃。
b)同样它也有不少的缺点 i.ii.iii.更少组件类型:表和树这些重要的组件缺失了。它们是桌面应用程序中普遍使用的。
2.缺乏丰富的组件特征:按钮不支持图片。
3.无扩展性:AWT的组件是本地组件。JVM中的AWT类实例实际只是包含本地组件的引用。唯一的扩展点是AWT的Canvas组件,可以从零开始创建自定义组件。然而无法继承和重用一个已有的AWT组件
9.AWT总结:AWT是SUN不推荐使用的工具集,实际开发中很少使用AWT而是使用SUN公司和Netscape公司共同开发的一个新的用户界面库-Swing来开发GUI应用程序,AWT是图形用户界面编程的基础,它的布局管理、事件机制、剪贴板操作等内容仍然适用于Swing GUI编程.