Java-Web应用开发基础教程完整版课件全套ppt教程(最新).ppt
Java Web应用开发基础教程Java Web编程简介C/S和B/S网站和系统静态Web和动态Web核心是有没有数据库JavaWeb工作原理客户端和Web服务器建立连接;客户端发送HTTP请求;服务器端接收客户端的HTTP请求,生成HTTP响应回发;服务器端关闭连接,客户端解析响应,恢复页面。Java Web相关技术面向对象软件工程软件项目管理HTML+JavaScriptJDBC+Servlet+JSP+JavaBean+XML数据库(数据库设计+MySQL实现)设计模式(MVC)环境搭建需要的软件运行环境:JDK+MySQL+Tomcat辅助工具:EclipseJ2ee+UltraEdit+Visio+Navicat注意事项环境搭建是一个费时的过程却意义重大操作系统和软件版本的不同会有一定的区别其它的辅助软件可自行考虑安装面向对象编程基础OOP的三个主要概念:封装、继承、多态面向过程的程序设计语言当中:程序=算法+数据结构面向对象的程序设计语言当中:程序=对象+消息对象:属性+方法的软件组合,是类的一个实例。封装继承多态Thanks for your attention!Thanks for your attention!Java Web应用开发基础教程MYSQL及及JDBC初步初步第第3章章关系型数据库管理系统RDBMS:RelationalDatabaseManagementSystems,通过数据、关系和对数据的约束三者组成的数据模型来存放和管理数据,以行和列的形式存储数据。MySQL:MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQLAB公司。MySQL被广泛地应用在Internet上的中小型网站中。特点是:体积小、速度快、总体拥有成本低,且开放源码。MySQL初步安装MySQL数据库启动MySQL数据库MySQL数据库的使用MySQL常用命令JDBC概述及基本原理JDBC(JavaDatabaseConnectivity)是一种用于执行SQL语句的JavaAPI。它由一组用Java编程语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API,使他们能够用纯JavaAPI来编写数据库应用程序。JDBC的使用包括注册驱动程序获取数据库连接发送SQL语句处理结果连接工具类连接数据库的代码在一个项目中是需要经常被使用的,在开发一个大型项目时,会有相当一部分类需要与数据库进行连接,一旦某个连接参数发生变化,代码更改的工作量将十分巨大,工具类的出现可以较好地解决这个问题。JDBC2.0最新版的JDBC2.0API被划分为两部分:JDBC2.0核心APIJDBC2.0标准扩展API。java.sql包:JDBC2.0的核心API。javax.sql包:JDBC2.0的标准扩展API,其中增加了一些数据访问和数据源访问的重大功能,其中有一些是主要用来做企业计算的。JDBC2.0核心APIJDBC核心API2.0在以下几个方面做了比较大的改进:修改了ResultSet接口的方法,支持可以滚动的记录集和Java语言来更新记录集。新的Statement接口支持批操作(BatchUpdate)。支持最新的SQL3数据类型,特别是对BLOB、CLOB等类型的数据提供了很好的支持。JDBC2.0核心API新的SQL语句接口(Statement接口)Statement接口PreparesStatement接口(继承Statement接口)以上两个接口分别由Connection接口的createStatement()方法和prepareStatement()方法创建。JDBC2.0核心API创建Statement的方法publicStatementcreateStatement()publicStatementcreateStatement(intresuleSetType,intresultSetConcurrency)resuleSetType:返回ResultSet的类型,如是否允许数据库游标前后移动,是否对数据库更新操作敏感等。resultSetConcurrency:返回的ResultSet的协同模式,如允许更新记录集的数据或者仅仅只读不能更新等。JDBC2.0核心APIClass.forName(“com.mysql.jdbc.Driver);Connectionconn=DriverManager.getConnection(“);Statementstmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);上面的代码创建了一个SQL语句接口(Statement)的实例对象,该实例对象允许它执行SQL语句所返回的记录集中的数据库游标前后移动,允许更新记录集中的数据。JDBC2.0核心APIPrepareStatement接口表示预编译的SQL语句的对象。SQL语句被预编译并且存储在PreparedStatement对象中。然后可以使用此对象高效地多次执行该语句。PrepareStatement中的SQL语句往往是不完整的,带有多个问号以表示缺省参数,可以相应的setter方法(seInt、setString等等)指定与输入参数的已定义SQL类型兼容的类型。JDBC2.0核心APIClass.forName(“com.mysql.jdbc.Driver);Connectionconn=DriverManager.getConnection(“);PrepareStatementprepstat=conn.prepareStatement(insertintotable(name,age)values(?,?);prepstat.setString(1,“zhangsan);prepstat.setInt(2,30);prepstat.executeUpdate();上面的代码是PrepareStatement使用的例子JDBC2.0核心APIStatement、PreparedStatement和CallableStatement接口都支持数据库批操作。Statement接口中有如下方法:publicvoidaddBatch(Stringsql);将SQL语句添加到SQL语句块中publicvoidclearBatch();将SQL语句块中的所有SQL语句全部删除publicintexecuteBatch();将SQL语句块发送到数据库服务器去并执行,它返回的结果是一个整型数组。JDBC2.0核心API使用JDBCAPI执行数据库批操作的方法是:1)创建Statement接口的实例对象2)调用addBatch()方法往SQL语句块中添加若干个SQL语句3)使用executeBatch()方法完成数据库批操作JDBC2.0核心API在PreparedStatement接口实现数据库批操作的方法是1)创建PreparedStatement接口的实例对象2)使用PreparedStatement接口中定义的setXXX()方法设定SQL语句参数的值3)使用addBatch()方法添加批处理语句到语句块4)使用executeBatch()方法执行批处理语句JDBC2.0核心APIDatabaseMetaData接口:用于获取有关数据库的信息,如数据库中所有的表名、系统函数、关键字、数据库产品名和数据库支持的JDBC驱动程序名等。DatabaseMetaData对象是通过Connection接口的getMetaData()方法创建的。ResultSetMetaData接口:用于获取结果集的结构,如结果集中列的类型和属性信息。JDBC2.0核心API新的记录集接口(ResultSet接口)1、新定义了若干个常数用于指定游标移动的方向publicstaticfinalintFETCH_FORWARD;publicstaticfinalintFETCH_REVERSE;publicstaticfinalintFETCH_UNKNOWN;publicstaticfinalintTYPE_FORWARD_ONLY;publicstaticfinalintTYPE_SCROLL_INSENSITIVE;publicstaticfinalintTYPE_SCROLL_SENSITIVE;publicstaticfinalintCONCUR_READ_ONLY;publicstaticfinalintCONCUR_UPDATABLE;JDBC2.0核心APIFETCH_FORWORD:指定处理记录集中行的顺序是由前到后,即从第一行开始处理一直到最后一行。FETCH_REVERSE:指定处理记录集中行的顺序是由后到前,即从最后一行开始处理一直到第一行。FETCH_UNKNOWN:不指定处理记录集中行的顺序,而由JDBC驱动程序和数据库系统决定。TYPE_FORWARD_ONLY:指定数据库游标的移动方向是向前,不允许向后移动,即只能使用ResultSet接口的next()方法而不能使用previous()方法,否则会产生错误。JDBC2.0核心APITYPE_SCROLL_INSENSITIVE:指定数据库游标可以在记录集中前后移动,并且当前数据库用户获取的记录集对其他用户的操作不敏感。TYPE_SCROLL_SENSITIVE:指定数据库游标可以在记录集中前后移动并且当前数据库用户获取的记录集对其他用户的操作敏感。JDBC2.0核心APICONCUR_READ_ONLY:该常数的作用是指定当前记录集的协作方式(concurrencymode)为只读。一旦使用了这个常数,那么用户就不可以更新记录集中的数据。CONCUR_UPDATABLE:该常数的作用是指定当前记录集的协作方式(concurrencymode)为可以更新。一旦使用了这个常数,那么用户就可以使用updateXXX()等方法更新记录集中的数据。JDBC2.0核心API2、ResultSet接口提供了一整套的定位方法。publicbooleanabsolute(introw);该方法的作用是将记录集中的某一行设定为当前行,亦即将数据库游标移动到指定的行。参数row指定了目标行的行号,这是绝对的行号,由记录集的第一行开始计算。publicbooleanrelative(introws);该方法的作用也是将记录集中的某一行设定为当前行,但是它的参数rows表示目标行相对于当前行的行号。JDBC2.0核心API例子:当前行是第3行现在需要移动到第5行去,怎么处理?既可以使用absolute()方法,也可以使用relative()方法。rs.absolute(5);rs.relative(2);其中rs代表ResultSet接口的实例对象JDBC2.0核心API例子:当前行是第5行需要移动到第3行去代码如下rs.absolute(3);rs.relative(-2);其中rs代表ResultSet接口的实例对象传递给relative()方法的参数。如果是正数,那么数据库游标向前移动;如果是负数,那么数据库游标向后移动。JDBC2.0核心APIpublicbooleanfirst();该方法的作用是将当前行定位到数据库记录集的第一行。publicbooleanlast();该方法的作用刚好和first()方法相反,是将当前行定位到数据库记录集的最后一行。publicbooleanisFirst();该方法的作用是检查当前行是否记录集的第一行。如果是,返回true,否则返回false。publicbooleanisLast();该方法的作用是检查当前行是否记录集的最后一行。如果是,返回true,否则返回false。JDBC2.0核心APIpublicvoidafterLast();该方法的作用是将数据库游标移到记录集的最后,位于记录集最后一行的后面。如果该记录集不包含任何的行该方法不产生作用。publicvoidbeforeFirst();该方法的作用是将数据库游标移到记录集的最前面,位于记录集第一行的前面。如果记录集不包含任何的行,该方法不产生作用。publicbooleanisAfterLast();该方法检查数据库游标是否处于记录集的最后面。如果是,返回true,否则返回false。JDBC2.0核心APIpublicbooleanisBeforeFirst();该方法检查数据库游标是否处于记录集的最前面。如果是,返回true,否则返回false。publicbooleannext();该方法的作用是将数据库游标向前移动一位,使得下一行成为当前行。当刚刚打开记录集对象时,数据库游标的位置在记录集的最前面。publicbooleanprevious();该方法的作用是将数据库游标向后移动一位,使得上一行成为当前行。JDBC2.0核心API3、ResultSet接口添加了对行操作的支持使用JDBCAPI2.0不仅可以任意将数据库游标定位到记录集中的特定行,而且还可以使用ResultSet接口新定义的一套方法更新当前行的数据。在JDBC1.0中更新记录集中某行的数据,必须发送SQL语句给数据库以执行UPDATE、DELETE、INSERT等数据库操作。JDBC2.0核心APIpublicbooleanrowDeleted();如果当前记录集的某行被删除了,那么记录集中将会留出一个空位。调用该方法,如果探测到空位的存在,那么就返回true;如果没有探测到空位的存在,就返回false值。publicbooleanrowInserted();如果当前记录集中插入了一个新行,该方法将返回true,否则返回false。publicbooleanrowUpdated();如果当前记录集的当前行的数据被更新,该方法返回true,否则返回false。JDBC2.0核心APIpublicvoidinsertRow();该方法将执行插入一个新行到当前记录集的操作。publicvoidupdateRow();该方法将更新当前记录集当前行的数据。publicvoiddeleteRow();该方法将删除当前记录集的当前行。JDBC2.0核心APIpublicvoidupdateString(intcolumnIndex,Stringx);该方法更新当前记录集的当前行某列的值,该列的数据类型是String,该方法的参数columnIndex指定所要更新的列的列索引,第一列的列索引是1,以此类推。publicvoidupdateString(StringcolumnName,Stringx);该方法同上,其第一个参数是columnName代表需要更新的列的列名而不是columnIndex。ResultSet接口中还定义了很多个updateXXX()方法都和上面的两个方法相类似。JDBC2.0核心API向数据库当前记录集插入新行的操作流程如下:1)调用moveToInsertRow()方法2)调用updateXXX()方法指定插入行各列的值3)调用insertRow()方法往数据库中插入新的行例:rs.moveToInsertRow();rs.updateString(name,herry);rs.updateInt(age,30);rs.insertRow();JDBC2.0核心API更新数据库中某个记录的值(某行的值)的方法是:1、定位到需要修改的行2、使用相应的updateXXX()方法设定某行某列的新值,也可以使用cancelRowUpdates()方法进行回滚3、使用updateRow()方法完成UPDATE的操作例:rs.first();rs.updateString(name,Steven);rs.updateRow();JDBC2.0核心API删除记录集中某行(亦即删除某个记录)的方法1、定位到需要修改的行(使用absolute()relative()等方法)2、使用deleteRow()方法例:rs.first();rs.deleteRow();JDBC2.0核心API处理BLOB和CLOB类型的数据BLOB和CLOB是SQL3标准支持的新数据类型,主要用于保存大型超长的数据,如图片视频、CD等。在JDBCAPI2.0中新定义了Blob接口和Clob接口,对这两种类型数据的操作大大简化了。ResultSet、PreparedStatement等接口都定义了getBlob()、getClob()、setBlob()和setClob()方法,用以获取或者设定BLOB和CLOB类型的数据。JDBC2.0核心APIBlob接口的方法publicInputStreamgetBinaryStream();该方法从Blob数据中获取一个输入流Clob接口的方法publicInputStreamgetAsciiStream();该方法从Clob对象中返回一个输入流。JDBC2.0核心APIBLOB和CLOB数据类型的区别,BLOB和CLOB数据类型虽然都可以存储大量超长的数据,但两者是有区别的。BLOB其实是BinaryLargeObject的缩写,BLOB类型的数据以二进制的格式保存于数据库中,特别适用于保存程序文件图片、视频文件、音频文件等。CLOB是CharacterLargeObject的缩写,CLOB类型的数据以Character的格式保存于数据库中,比较适合于保存比较长的文本文件。Thanks for your attention!Thanks for your attention!Java Web应用开发基础教程XML第第4章章XML简介eXtensibleMarkupLanguage(可扩展标记语言)由万维网联盟(WorldWideWebConsortium,W3C)于1998年2月发布的推荐标准。XML定义了一种文件格式,一种描述数据、保存数据的方法,使用这种格式的计算机数据,可以在不同的计算机平台和不同的计算机程序之间方便、平稳、快速和无障碍地转移和流动,从而大大提高了处理数据的效率和灵活性。XML简介XML是一种元语言,允许通过使用自定义的格式、标识,交换和处理数据库可以理解的数据;基于文本格式,以结构化的方式描述各种类型的数据,并在各种应用之间发送和交换这些数据;可以在不同的计算机平台和不同的计算机程序间方便、平稳的交换数据,从而提高了处理数据的效率和灵活性。XML标准1998年2月W3C发布了XML推荐标准XML1.0。2004年2月4日XML1.1推荐标准正式发布。但目前推荐遵循的是W3C于2000年10月6日发布的XML1.0标准。XML的进一步认识XML继承了SGML的许多特性,它有SGML20%的复杂性,却有SGML80%的功能。XML描述的是结构和语义,而不是格式化XML将数据内容和显示格式相分离XML是元标记语言XML是自描述语言XML是独立于平台的XML不进行任何操作XML具有良好的保值性XML的用途XML是被设计用来存储数据、携带数据和交换数据的,它不是为了显示数据而设计的。XML的主要用途包括以下几个方面:从HTML中分离数据。交换数据共享数据存储数据充分利用数据创建新的语言:MusicML、MathML、CML、SVG、WML、SMIL等XML的基本结构标记语言的基本特点:在表示数据内容的基础上,插入各在表示数据内容的基础上,插入各种具有明确含义的种具有明确含义的标记,标记,以起到对数据内容进行解释、说以起到对数据内容进行解释、说明、限制等作用。明、限制等作用。标记的表示方法:,一般成对使用。标记的命名规则名称的开头是字母或下划线“_”;标记名称中不能有空格;名称的字符串只能包含英文字母、数字、“_”、“-”、“.”等字符。一个完整的XML实例李华李华男男1978.9.1292此学生爱好编程,以下是它编的代码此学生爱好编程,以下是它编的代码!CDATA function f1(a,b)if(name=cai&a 0)return 1 else return 0 Visual Basic&C#序言序言文档文档元素元素根元素根元素属性属性元素元素注释注释文档文档类型类型声明声明XML声明声明文本文本预处理预处理指令指令CDATA实体实体XML声明XML声明通常在XML文档的第一行出现。XML声明不是必选项,但是如果使用XML声明,则必须在文档的第一行,前面不得包含任何其他内容或空白。文档映射中的XML声明包含下列内容:(1)版本声明:(2)编码声明:(3)独立声明:XML元素XML技术基础技术基础.开始标记开始标记结束标记结束标记内容内容空元素空元素TITLE空元素空元素TITLEXML元素1、命名规则:XML元素命名与Java、C命名规则类似。2、XML的根元素:每个XML文档必须有且只有一个根元素;根是一个完全包括文档中其他所有元素的元素。3、元素是可以扩展的,可以携带更多的信息。4、元素之间是有关系的。5、XML元素的内容很丰富。XML元素实体实体相当于内容占位符,用于内容转义,实体的主要作用有代替一些键盘无法输入的字符代替一些与XML规范保留字相冲突的字符代替大段的重复数据代替一些不适合在XML文档中出现的数据预定义实体:XML解析器已经定义了的实体,用户通过实体引用将实体插入到文档中,实体引用是将实体名称包括在符号&和分号;之间。预定义实体预定义实体符号<&"'XML元素实体CDATA当XML文档元素内容中包含大量、&或者“字符时functionf1(a,b)if(name=“cai”&a0)return1elsereturn0functionf1(a,b)if(name="cai"&&a<0)return1elsereturn0CDATA用CDATA节括起来,则不需要使用替代字符!CDATAfunctionf1(a,b)if(name=“cai“&aCDATACDATA节用于把整段包含大量、&或者“的文本解释为纯字符数据而不是标记的情况。CDATA节中的所有字符都会被当作元素字符数据的常量部分,而不是XML标记。在在CDATACDATA部件之内的文本会被解析器忽略。部件之内的文本会被解析器忽略。语法格式:CDATACDATA注意事项:可以输入任意字符(除或者”之间没有空格或者换行符。可以利用CDATA标记将含有非法字符的文本括起来。问题的提出两个基本的概念格式良好的XML文档:符合语法的XML文档称为结构良好的XML文档。有效XML文档:内容结构严格遵守它自身的标记说明,能通过自身的语法检查;通过DTD验证的XML文档称为有效的XML文档。格式良好的XML文档与有效的XML文档的区别?有有效效地地XML文文档档肯肯定定是是格格式式良良好好的的XML文文档档。反反过过来来,一一个个格格式式良良好好的的XML文文档档不不一一定定是是有有效效的的XML文文档档。有有效效的的XML文文档档遵遵守守DTD或或Schema定义的规则。定义的规则。什么是DTD?文档类型定义-DocumentTypeDefinitionDTD用来描述XML文档的结构,一个DTD文档包含:元素(ELEMENT)的定义规则元素之间的关系规则属性(ATTLIST)的定义规则可使用的实体(ENTITY)或符号(NOTATION)规则DTD与XML文档实例的关系类与对象数据库表结构与数据记录什么是XMLSchema?Schema的基本思想就是为XML文档制定一种模式。从本质上说,DTD与XMLSchema的作用是相同的,它们以各自不同的方式来帮助XML的开发者来描述XML文档的结构和数据,都用于XML文档的有效性验证。Schema与DTD的关系Schema与DTD的作用相同,它们各自以不同的方式来描述XML文档结构,都用于文档验证。Schema囊括了DTD文件所能实现的全部功能,同时它也是一个完全规范的XML文档。Schema正在逐步取代DTD成为验证XML文档合法性的新标准。XMLSchema简介Schema与DTD的比较DTD使用EBNF语法,Schema基于XML语法。Schema可以像其他XML文档一样被解析和处理;DTD描述的是XML文件的结构,而非元素内容,因此DTD不能进行数据有效性检查;例如:文字;Schema大大扩充了数据类型,可以自定义数据类型;Schema提供一个可扩充的内容模式,而DTD扩展性差;Schema可对整个XML文档或文档局部进行验证,而DTD缺乏这种灵活性;Schema支持名称空间,DTD不支持命名空间。XMLSchema的特点XMLSchema文档本身就是XML文档,因此遵守XML的语法规则;XMLSchema是用一套预先规定的XML元素和属性创建的;在XMLSchema需要完成的任务:定义可以出现在文档中的元素;定义可以出现在文档中的属性;定义元素下的子元素及子元素的顺序、数量;定义元素和属性的数据类型;XMLSchema两种模式两种模式:W3CXMLSchema和MicrosoftXMLSchemaMicrosoftXMLSchemaMicrosoftMicrosoft版版本本的的XMLXMLschemaschema叫叫做做XDRXDR(XMLXMLDataDataReduced)Reduced),它它基基于于XMLXML标标准准提提议议中中的的简简化化集集合合,XDRXDR是是一一个个专专有有规规范范,但但它它被被相相当当广广泛的采用。泛的采用。W3CW3C的的XMLXMLSchemaSchema叫叫XSDXSD(XMLXMLSchemaSchemaDefinitionDefinitionLanguageLanguage),它它是一个比是一个比XDRXDR更广泛的规范,并且它有不可否认的非专有的优点。更广泛的规范,并且它有不可否认的非专有的优点。命名空间Namespaces翻译为名字空间或命名空间。当我们在一个XML文档中使用他人的或者多多多多个个个个DTDDTD文文文文件件件件,就会出现这样的矛盾:因为XML中标识都是自己创建的,在不同的DTD文件中,标识名可能相同但表示的含义不同,这就可能引起数据混乱引起数据混乱。例如:在一个文档中woodtable中表示桌子,而在另一个文档namelist中表示表格。如果我需要同时处理这两个文档,就会发生名字冲突。命名空间XML命名空间是XML解决元素多义性和名字冲突问题的方案。W3C组织的推荐用书对XML命名空间的解释是:“XMLXML命命命命名名名名空空空空间间间间是是是是命命命命名名名名的的的的汇汇汇汇集集集集,它由URI(统一资源标识)确定,在XML文件中作为元素标识和属性名使用”。命名空间是名称上相关的一组名称的汇集,在同一空间中每一个名称都必须唯一。命命命命名名名名空空空空间间间间表表表表示示示示了了了了名名名名称称称称的的的的来来来来源源源源和和和和使使使使用用用用范范范范围围围围。通过命名空间可以区分来自不同的XML应用但具有相同名称的标识,可以把来自某种XML应用的相关元素和属性集合在一起,以方便软件识别和处理。命名空间namespaces通过给给标标识识名名称称加加一一个个网网址址(URL)(URL)定位的方法来区别这些名称相同的标识。命 名 空 间 一 般 用 属 性 xmlns来 声 明,声 明 的 语 法 如 下:xmlns:命名空间属性名,声明命名空间必需的属性。prefix:命名空间的前缀,它的值不能为XML。在引用此命名空间中的名称时,需要在名称前加“prefix:”。URI:统一资源标示符(UniformResourceIdentifier),是一个标识网络资源的字符串。最普通的URI应该是统一资源定位符(URL),URL用于标识网络主机的地址。另一个不常用的URI是通用资源名字(URN),URN一个相对固定的地址。命名空间引用此名空间中的元素、属性的方法:前缀名:元素名或前缀名:属性名声明时若前缀名省略,则声明的是缺省的空间,引用缺省名空间中的元素、属性时可不加前缀名;默认的命名空间的声明语法格式为:XMLSchema的内容XMLSchema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了XML文档的结构和内容模式,指定了每个Schema元素或属性的合法用途,如果违反了这些规则,解析器就会拒绝解析该Schema以及任何与它相联系的XML文档。它主要包括以下内容:定义可以出现在文档里的元素;定义元素之间的关系;定义可以出现在文档里的属性;定义元素或属性的数据类型。连接Schema到XML有目标命名空间:有目标命名空间:无目标命名空间:无目标命名空间:此处为targetNamespace,与后面的模式文档的文件名以空格分隔XML应用程序接口W3C以及XML_DEV邮件列表的成员分别提出了两个访问XML的标准应用程序接口:DOM和SAX。DOM:文档对象模型。DOM是HTML和XML文档的编程接口规范,它与平台和语言是无关的,该模型定义了HTML和XML文件在内存中文档结构,提供了对HTML和XML文件的访问、存取方法。利用DOM规范,可以实现DOM文档和XML之间的相互转换,对相应DOM文档的内容进行遍历或其他操作。DOMDOM处理文档的时候,实际上是先把整个文档读入,行成一棵文档树,然后用户就可以针对这个树形的文档模型进行各种元素操作了。优点:自然易懂,文档中的数据和节点一目了然。缺点:针对较大的文档,不仅消耗很多的内存而且处理速度很慢。当提及DOM的时候,不仅仅指代的是DOM文档对象模型,而且也包含处理这个模型的一系列API。SAXSAX(SimpleAPIforXML)也是解析XML的一种规范,由一系列接口组成,但不是W3C推荐的标准,SAX是公开的、开放源代码的,最新的版本是SAX2.0。SAX解析器是一种基于事件的解析器,核心是事件处理模式,围绕事件源以及事件处理器来工作的。一个可以产生事件的对象被称为事件源,可以针对事件产生响应的对象被称为事件处理器。事件和事件处理器是通过在事件源中的事件处理器注册的方法连接的。SAX利用SAX解析器解析XML文件需要经过以下步骤:实例化一个SAXParserFactory对象:SAXParserFactoryfactory=SAXParserFactory.newInstance();通过factory获得一个SAXParser对象,即SAX解析器:SAXParsersaxParser=factory.newSAXParser();saxParser对象调用parse方法解析XML文件:saxParser.parse(Filefile,DefaultHandlerdh)SAX在SAXAPI中有两个包:org.xml.sax定义SAX的基础接口,如XMLReader、ContentHandler、ErrorHandler、DTDHandler、EntityResolver等。org.xml.sax.helper提供了一些方便开发人员使用的帮助类,如缺省实现所有处理器接口的帮助类DefaultHandler、方便开发人员创建XMLReader的XMLReaderFactory类等。SAXDefaultHandler类或它的子类的对象称为SAX解析器的事件处理器。事件处理器可以接收解析器报告的所有事件,处理所发现的数据。DefaultHandler类 实 现 了 ContentHandler、DTDHandler、EntityResolver和ErrorHandler接口。DefaultHandler类实现了上述4个接口,包含了这4个接口的所有方法,方法都是一种空实现在编写事件处理程序时,可以不用直接实现这四个接口,而直接继承DefaultHandler类,然后重写需要的方法。SAXSAX解析器的核心是事件处理机制,当SAX解析器调用parse()方法解析XML文件时,事件处理器会根据所产生的事件调用相应的方法来处理发现的数据。在编写程序时,需要使用DefaultHandler类的子类创建一个事件处理器,当处理器对报告的事件不感兴趣时,就直接调用父类的方法,采用默认的处理方法,当处理器对报告的事件感兴趣时,子类可以重写父类的某些方法,调用重写的方法,以便处理器可以具体的处理解析器报告的数据。SAX在org.xml.sax包的HandlerBase类中定义了SAX解析器解析XML文件所产生的事件类型。常用的事件类型有:startDocument:表示文档的开始endDocument:表示文档的结束startElement:表示标记的开始endElement:表示标记的结束characters:文本内容事件ignorableWhitespace:表示空白事件warning、error和fatalError:表示错误事件SAX文件的开始与结束当解析器开始解析XML文件时,就会报告“文件开始”事件给事件处理器,然后再陆续地报告其他的事件,比如:“开始标记”,“文本事件”,最后再报告“文件结束”事件。解析器报告“文件开始”事件,事件处理器就会调用startDocument()方法。解析器报告“文件结束”事件,事件处理器会调用endDocument()方法,解析器在解析XML文件的过程中,只能报告一次“文件开始”和“文件结束”事件。SAX开始标记与结束标记当解析器发现一个标记开始时,就将所发现的数据封装为一个“开始标记”事件,并报告该事件处理器,事件处理器就会知道发生的事件,然后调用startElement()方法对发现的数据处理。事件处理器调用完startElement方法后,将陆续地收到解析器报告的其他事件,最后一定会报告该标记的“标记结束”事件,这时事件处理器会调用endElement()方法对发现的数据做出处理。SAX文本数据XML文件中的标记的内容可以有文本数据,当解析器解析这些数据时,就报告“文本数据”事件给处理器,事件处理器调用publicvoidcharacters(char,intstart,intlength)方法对解析的数据做出处理。参数字符数组ch中存放的就是解析的文本数据start是数组ch中存放字符的起始位置length是存放字符的个数。SAX处理空白要处理空白,只需要在处理器中重写ignorableWhitespace方法即可。解析器在遇到空白时,就会向处理器报告ignorableWhitespace事件,事件处理器调用下面的方法处理:voidignorableWhitespace(charch,intstart,intlength),而不去调用characters方法。但前提是XML文件必须是一个有效的XML文件。SAX名称空间名称空间的目的是有效的区分名字相同的标记,当二个标记的名字相同时,他们可能通过属于不同的名称空间来区分。例:你好解析器报告事件的顺序如下:名称空间开始-开始标记-文本数据“-结束标记-名称空间结束SAX处理错误SAX解析器默认地检查XML是否规范的,如果让SAX解析器检查XML文件是否有效,需要在获得SAX解析器之前调用factory.setValidating(true)设置。当出现错误时会调用下面的方法进行处理。publicvoidwarning(SAXExceptione)throwsSAXException;publicvoiderror(SAXExceptione)throwsSAXException;publicvoidfatalError(SAXExceptione)throwsSAXExceptionSAXDOM与SAX的比较通过DOM树,应用程序可以对XML文档进行随机访问。当XML文档比较大或者文档结构比较复杂时,对内存的需求就比较高。SAX分析器通过事件处理函数实现对XML文档的访问,采用顺序访问机制,对于事件处理函数本身,要由应用程序自己来实现。例