2.EJB(Enterprise JavaBeans)使得开发者方便地创建、部署和管理跨平台的基于组件的企业应用。 3.Java RMI(Java Remote Method Invocation)用来开发分布式Java应用程序。一个Java对象的方法能被远程Java虚拟机调用。这样,远程方法激活可以发生在对等的两端,也可以发生在客户端和服务器之间,只要双方的应用程序都是用Java写的。 4.Java IDL(Java Interface Definition Language) 提供与CORBA(Common Object Request Broker Architecture)的无缝的互操作性。这使得Java能集成异构的商务信息资源。 5.JNDI(Java Naming and Directory Interface)提供从Java平台到的统一的无缝的连接。这个接口屏蔽了企业网络所使用的各种命名和目录服务。 6.JMAPI(Java Management API)为异构网络上系统、网络和服务管理的开发提供一整套丰富的对象和方法。 7.JMS(Java Message Service)提供企业消息服务,如可靠的消息队列、发布和订阅通信、以及有关推拉(Push/Pull)技术的各个方面。 8.JTS(Java transaction Service)提供存取事务处理资源的开放标准,这些事务处理资源包括事务处理应用程序、事务处理管理及监控。 9.JMF(Java Media Framework API), 她可以帮助开发者把音频、视频和其他一些基于时间的媒体放到Java应用程序或applet小程序中去,为多媒体开发者提供了捕捉、回放、编解码等工具,是一个弹性的、跨平台的多媒体解决方案。 10.Annotation(Java Annotation),在已经发布的JDK1.5(tiger)中增加新的特色叫Annotation。Annotation提供一种机制,将程序的元素如:类,方法,属性,参数,本地变量,包和元数据联系起来。这样编译器可以将元数据存储在Class文件中。这样虚拟机和其它对象可以根据这些元数据来决定如何使用这些程序元素或改变它们的行为。 在Java技术中,值得关注的还有JavaBeans,它是一个开放的标准的组件体系结构,它独立于平台,但使用Java语言。一个JavaBean是一个满足JavaBeans规范的Java类,通常定义了一个现实世界的事物或概念。一个JavaBean的主要特征包括属性、方法和事件。通常,在一个支持JavaBeans规范的开发环境(如Sun Java Studio 和IBM VisualAge for Java)中,可以可视地操作JavaBean,也可以使用JavaBean构造出新的JavaBean。JavaBean的优势还在于Java带来的可移植性。现在,EJB (Enterprise JavaBeans) 将JavaBean概念扩展到Java服务端组件体系结构,这个模型支持多层的分布式对象应用。除了JavaBeans,典型的组件体系结构还有DCOM和CORBA,关于这些组件体系结构的深入讨论超出了本书的范围。 11.javaFX Sun刚刚发布了JavaFX技术的正式版,它使您能利用JavaFX 编程语言开发富互联网应用程序(RIA)。JavaFX Script编程语言(以下称为JavaFX)是Sun微系统公司开发的一种declarative, staticallytyped(声明性的、静态类型)脚本语言。JavaFX技术有着良好的前景,包括可以直接调用Java API的能力。因为JavaFXScript是静态类型,它同样具有结构化代码、重用性和封装性,如包、类、继承和单独编译和发布单元,这些特性使得使用Java技术创建和管理大型程序变为可能。 12.JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入 管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝 集成的系统、网络和服务管理应用。 13.JPA (Java Persistence API), JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
JDK(Java Development Kit,java开发工具包) JRE(Java Runtime Environment,Java运行环境), JDBC(Java Data Base Connectivity,java数据库连接) JNDI (Java Naming and Directory Interface,Java命名和目录接口) POJO(Plain Old Java Objects)简单的Java对象,实际就是普通JavaBeans EJB(Enterprise JavaBean)直译过来就是企业级应用JAVABEAN RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 HTTP超文本传送协议 (HTTP) 是一种通信协议,它允许将超文本标记语言 (HTML) 文档从 Web 服务器传送到 Web 浏览器。 IDE(Integrated Development Environment)集成开发环境 J2EE是Java2平台企业版(Java 2 Platform,Enterprise Edition) 连接池(Database Connection Pooling) JSP(Java Server Pages) JMS(Java Message Service) JTA(Java Transaction Architecture) JTA定义了一种标准的API,应用系统由此可以访问各种事务监控。 JTS(Java Transaction Service) JavaMail JAF(JavaBeans Activation Framework) API (Application Programming Interface) 应用编程接口 JRE (Java Runtime Enviroment) Java 运行时环境 JDK (Java Development Kit) Java开发工具包 JVM (Java Virtual Machine) Java虚拟机 JNI (Java Native Interface) Java本地接口 AWT (Abstract Windows Toolekit) 抽象窗口工具箱 JNDI (Java Naming & Directory Interface) JAVA命名目录服务.主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。 JMS (Java Message Service)JAVA消息服务.主要实现各个应用程序之间的通讯.包括点对点和广播. JTA (Java Transcation API) JAVA事务服务.提供各种分布式事务服务.应用程序只需调用其提供的接口即可. JAF (Java Action FrameWork) JAVA安全认证框架.提供一些安全控制方面的框架.让开发者通过各种部署和自定义实现自己的个性安全控制策略. RMI (Remote Method Interface) 远程方法调用 CVS (Concurrent Versions System) 版本控制器 SVN (Subversion) 版本控制器 TC (Test Case) 测试用例,是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,并形成文档。 TDD (Test-Driven Development) 测试驱动开发 HTTP Hypertext Transfer Protocol 超文本传输协议 FTP File Transfer Protocol 文件传输协议 TCP/IP Transmission Control Protocol/Internet Protocol 传输控制协议和互联网协议 SMTP Simple Mail Transfer Protocol 简单邮件传输协议 LAN Local area network 局域网 IPX Internetwork Packet Exchange Internet包交换 SNA Systems Network Architecture 系统网络体系结构 DNS domain name service 域名服务 ISP Internet Service Provider Internet服务提供商 DHCP Dynamic Host Configuration Protocol 动态主机配置协议 IETF Internet Engineering Task Force Internet工程任务组 URI(Uniform Resource Identifier)统一资源标识符 URL (Uniform Resource Locator)统一资源定位器,URI的一个子集 REST (Representational State Transfer) 表述性状态转移 HTML (Hypertext Markup Language)超文本标记语言 RFC (Request fo Comment,Internet标准(草案)) HREF (Hypertext reference 超文本连接) IMAP是Internet Message Access Protocol的缩写,是用于访问服务器上所存储的邮件的Internet协议。 DBCP (Database connection Pools) 数据库连接池 CGLIB (Code Generation Library)cglib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO字节码的动态生成。 SOAP (Simple Object Access Protocal)简单对象访问协议,它是一个用于分散和分布式环境下网络信息交换的基于XML的通讯协议。在此协议下,软件组件或应用程序能够通过标准的HTTP协议进行通讯。它的设计目标就是简单性和扩展性,这有助于大量异构程序和平台之间的互操作性,从而使存在的应用程序能够被广泛的用户访问。 SOA (Service Oriented Architecture) 面向服务的架构,其实质就是要将系统模型与系统实现分割开来。 WSDL (Web Service Description Lanaguage) 网络服务描述语言 ,是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问。 UDDI (Universal Description , Discovery and Ingergration)是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。可译为“通用描述、发现与集成服务”。 DWR (Direct Web Remoting) java的远程web调用框架 (以下标题为这个颜色的摘自http://www.blogjava.net/Rookie/ ,在此鸣谢原作者)一些JavaScript 函数,方法
1, innerHTML与outerHTML 2, ntextmenu='return false' 屏蔽右键 3, insertAdjacentHTML <html> <head> <title>htm insertAdjacentHTML插入新内容</title> <script language="jscript"> function addsome() { document.all.paral.insertAdjacentHTML("afterBegin","<h1>在文本前容器内插入内容</h1>"); document.all.paral.insertAdjacentHTML("beforeEnd","<h2>在文本后容器内插入内容</h2>"); document.all.paral.insertAdjacentHTML("beforeBegin","<h4>在文本前容器外插入内容</h1>"); document.all.paral.insertAdjacentHTML("afterEnd","<h5>在文本后容器外插入内容</h2>"); } </script> </head> <body οnlοad="addsome()"> <div id="paral" style="fontsize:6;color='#ff00ff'">原来的内容</div><hr> </body> </html>字符集和编码
关于编码问题,做了以下总结;大家共同探讨一下。 一 预备知识 1,字符:字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。“中”“国”这是两个汉字字符。字符仅仅代表一个符号,没有任何实际值的意义。 2,字符集:字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。这也说明了字符和字符集之间的关系,字符组成字符集(iso8859-1,GB2312/GBK,unicode)。 3,代码点:字符集中的每个字符都被分配到一个“代码点”。每个代码点都有一个特定的唯一数值,称为标值。该标量值通常用十六进制表示。 4,代码单元: 在每种编码形式中,代码点被映射到一个或多个代码单元。“代码单元”是各个编码方式中的单个单元。代码单元的大小等效于特定编码方式的位数: UTF-8 :UTF-8 中的代码单元由 8 位组成;在 UTF-8 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个、三个或四个代码单元; UTF-16 :UTF-16 中的代码单元由 16 位组成;UTF-16 的代码单元大小是 8 位代码单元的两倍。所以,标量值小于 U+10000 的代码点被编码到单个代码单元中; UTF-32:UTF-32 中的代码单元由 32 位组成; UTF-32 中使用的 32 位代码单元足够大,每个代码点都可编码为单个代码单元; GB18030:GB18030 中的代码单元由 8 位组成;在 GB18030 中,因为代码单元较小的缘故,每个代码点常常被映射到多个代码单元。代码点将被映射到一个、两个或四个代码单元。 5,举例:“中国北京香蕉是个大笨蛋”这是我定义的aka字符集;各字符对应代码点为: 北 00000001 京 00000010 香 10000001 蕉 10000010 是 10000100 个 10001000 大 10010000 笨 10100000 蛋 11000000 中 00000100 国 00001000 下面是我定义的 zixia 编码方案(8位),可以看到它的编码中表示了aka字符集的所有字符对应的 代码单元; 北 10000001 京 10000010 香 00000001 蕉 00000010 是 00000100 个 00001000 大 00010000 笨 00100000 蛋 01000000 中 10000100 国 10001000 所谓文本文件 就是我们按一定编码方式将二进制数据表示为对应的文本如00000001000000100000010000001000000100000010000001000000这样的文件。我用一个支持zixia编码和aka字符集的记事本打开,它就按照编码方案显示为 "香蕉是个大笨蛋 " 如果我把这些字符按照GBK另存一个文件,那么则肯定不是这个,而是 1100111111100011 1011110110110110 1100101011000111 1011100011110110 1011010011110011 1011000110111111 1011010110110000 110100001010 二,字符集 1, 常用字符集分类 ASCII及其扩展字符集 作用:表语英语及西欧语言。 位数:ASCII是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符。 范围:ASCII从00到7F,扩展从00到FF。 ISO-8859-1字符集 作用:扩展ASCII,表示西欧、希腊语等。 位数:8位, 范围:从00到FF,兼容ASCII字符集。 GB2312字符集 作用:国家简体中文字符集,兼容ASCII。 位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所有高频率汉字。 范围:高字节从A1到F7, 低字节从A1到FE。将高字节和低字节分别加上0XA0即可得到编码。 BIG5字符集 作用:统一繁体字编码。 位数:使用2个字节表示,表示13053个汉字。 范围:高字节从A1到F9,低字节从40到7E,A1到FE。 GBK字符集 作用:它是GB2312的扩展,加入对繁体字的支持,兼容GB2312。 位数:使用2个字节表示,可表示21886个字符。 范围:高字节从81到FE,低字节从40到FE。 GB18030字符集 作用:它解决了中文、日文、朝鲜语等的编码,兼容GBK。 位数:它采用变字节表示(1 ASCII,2,4字节)。可表示27484个文字。 范围:1字节从00到7F; 2字节高字节从81到FE,低字节从40到7E和80到FE;4字节第一三字节从81到FE,第二四字节从30到39。 UCS字符集 作用:国际标准 ISO 10646 定义了通用字符集 (Universal Character Set)。它是与UNICODE同类的组织,UCS-2和UNICODE兼容。 位数:它有UCS-2和UCS-4两种格式,分别是2字节和4字节。 范围:目前,UCS-4只是在UCS-2前面加了0x0000。 UNICODE字符集 作用:为世界650种语言进行统一编码,兼容ISO-8859-1。 位数:UNICODE字符集有多个编码方式,分别是UTF-8,UTF-16和UTF-32。 2 ,按所表示的文字分类 语言 字符集 正式名称 英语、西欧语 ASCII,ISO-8859-1 MBCS 多字节 简体中文 GB2312 MBCS 多字节 繁体中文 BIG5 MBCS 多字节 简繁中文 GBK MBCS 多字节 中文、日文及朝鲜语 GB18030 MBCS 多字节 各国语言 UNICODE,UCS DBCS 宽字节
三,编码 UTF-8:采用变长字节 (1 ASCII, 2 希腊字母, 3 汉字, 4 平面符号) 表示,网络传输, 即使错了一个字节,不影响其他字节,而双字节只要一个错了,其他也错了,具体如下: 如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。UTF-8最多可用到6个字节。
UTF-16:采用2字节,Unicode中不同部分的字符都同样基于现有的标准。这是为了便于转换。从 0x0000到0x007F是ASCII字符,从0x0080到0x00FF是ISO-8859-1对ASCII的扩展。希腊字母表使用从0x0370到0x03FF 的代码,斯拉夫语使用从0x0400到0x04FF的代码,美国使用从0x0530到0x058F的代码,希伯来语使用从0x0590到0x05FF的代 码。中国、日本和韩国的象形文字(总称为CJK)占用了从0x3000到0x9FFF的代码;由于0x00在c语言及操作系统文件名等中有特殊意义,故很多情况下需要UTF-8编码保存文本,去掉这个0x00。举例如下: UTF-16: 0x0080 = 0000 0000 1000 0000 UTF-8: 0xC280 = 1100 0010 1000 0000 UTF-32:采用4字节。 优缺点 UTF-8、UTF-16和UTF-32都可以表示有效编码空间 (U+000000-U+10FFFF) 内的所有Unicode字符。 使用UTF-8编码时ASCII字符只占1个字节,存储效率比较高,适用于拉丁字符较多的场合以节省空间。 对于大多数非拉丁字符(如中文和日文)来说,UTF-16所需存储空间最小,每个字符只占2个字节。 Windows NT内核是Unicode(UTF-16),采用UTF-16编码在调用系统API时无需转换,处理速度也比较快。 采用UTF-16和UTF-32会有Big Endian和Little Endian之分,而UTF-8则没有字节顺序问题,所以UTF-8适合传输和通信。 UTF-32采用4字节编码,一方面处理速度比较快,但另一方面也浪费了大量空间,影响传输速度,因而很少使用。 四,如何判断字符集 1,字节序 首先说一下字节序对编码的影响,字节序分为Big Endian字节序和Little Endian字节序。不同的处理器可能不一样。所以,传输时需要告诉处理器当时的编码字节序。对于前者而言,高位字节存在低地址,低字节存于高地址;后者相反。例如,0X03AB, Big Endian字节序 0000: 0 3 0001: AB Little Endian字节序是 0000: AB 0001: 0 3 2,编码识别 UNICODE,根据前几个字节可以判断UNICODE字符集的各种编码,叫做Byte Order Mask方法BOM: UTF-8: EFBBBF (符合UTF-8格式,请看上面。但没有含义在UCS即UNICODE中) UTF-16 Big Endian:FEFF (没有含义在UCS-2中) UTF-16 Little Endian:FFFE (没有含义在UCS-2中) UTF-32 Big Endian:0000FEFF (没有含义在UCS-4中) UTF-32 Little Endian:FFFE0000 (没有含义在UCS-4中) GB2312:高字节和低字节的第1位都是1。 BIG5,GBK&GB18030:高字节的第1位为1。操作系统有默认的编码,常为GBK,可以下载别的并升级。通过判断高字节的第1位从而知道是ASCII或者汉字编码。
J2EE开发中字符处理
在java企业级开发中,会有多处涉及到字符集编码,有些地方需要进行正确的设置,有些地方需要进行一定程度的处理。 一,java中对字符的处理getBytes(charset):这是java字符串处理的一个标准函数,其作用是将字符串所表示的字符按照charset编码,并以字节方式表示。注意字符串在java内存中总是按unicode编码存储的。比如"中文",正常情况下(即没有错误的时候)存储为"4e2d 6587",如果charset为"gbk",则被编码为"d6d0 cec4",然后返回字节"d6 d0 ce c4"。如果charset为"utf8"则最后是"e4 b8 ad e6 96 87"。如果是"iso8859-1",则由于无法编码,最后返回 "3f 3f"(两个问号)。 new String(charset):这是java字符串处理的另一个标准函数,和上一个函数的作用相反,将字节数组按照charset编码进行组合识别,最后转换为unicode存储。参考上述getBytes的例子,"gbk" 和"utf8"都可以得出正确的结果"4e2d 6587",但iso8859-1最后变成了"003f 003f"(两个问号)。因为utf8可以用来表示/编码所有字符,所以new String( str.getBytes( "utf8" ), "utf8" ) == str,即完全可逆。 setCharacterEncoding():该函数用来设置http请求或者相应的编码。对于request,是指提交内容的编码,指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码,需要进一步处理。参见下述"表单输入"。值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。java doc上说明:This method must be called prior to reading request parameters or reading input using getReader()。而且,该指定只对POST方法有效,对GET方法无效。分析原因,应该是在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析所有的提交内容,setCharacterEncoding()自然就无效。对于response,则是指定输出内容的编码,同时,该设置会传递给浏览器,告诉浏览器输出内容所采用的编码。 二,web开发中字符编码几处设置 对于web应用程序,和编码有关的设置或者函数如下。 jsp编译:指定文件的存储编码,很明显,该设置应该置于文件的开头。例如:<@pagepageEncoding="GBK"%>。另外,对于一般class文件,可以在编译的时候指定编码。 jsp输出:指定文件输出到browser是使用的编码,该设置也应该置于文件的开头。例如:<%@ page contentType="text/html; charset= GBK" %>。该设置和response.setCharacterEncoding("GBK")等效。 meta设置:指定网页使用的编码,该设置对静态网页尤其有作用。因为静态网页无法采用jsp的设置,而且也无法执行response.setCharacterEncoding()。例如:<META http-equiv="Content-Type" content="text/html; charset=GBK" />,如果同时采用了jsp输出和meta设置两种编码指定方式,则jsp指定的优先。因为jsp指定的直接体现在response中。需要注意的是,apache有一个设置可以给无编码指定的网页指定编码,该指定等同于jsp的编码指定方式,所以会覆盖静态网页中的meta指定。所以有人建议关闭该设置。 form设置:当浏览器提交表单的时候,可以指定相应的编码。例如:<form accept-charset= "gb2312">。一般不必不使用该设置,浏览器会直接使用网页的编码。 三,URL地址 URL地址中含有中文字符是很麻烦的,前面描述过使用GET方法提交表单的情况,使用GET方法时,参数就是包含在URL中。 URL编码:对于URL中的一些特殊字符,浏览器会自动进行编码。这些字符除了"/?&"等外,还包括unicode字符,比如汉子。这时的编码比较特殊。 IE有一个选项"总是使用UTF-8发送URL",当该选项有效时,IE将会对特殊字符进行UTF-8编码,同时进行URL编码。如果改选项无效,则使用默认编码"GBK",并且不进行URL编码。但是,对于URL后面的参数,则总是不进行编码,相当于UTF-8选项无效。比如"中文.html?a=中文",当UTF-8选项有效时,将发送链接"%e4%b8%ad%e6%96%87.html?a=\x4e\x2d\x65\x87";而UTF-8选项无效时,将发送链接"\x4e\x2d\x65\x87.html?a=\x4e\x2d\x65\x87"。注意后者前面的"中文"两个字只有4个字节,而前者却有18个字节,这主要时URL编码的原因。当web server(tomcat)接收到该链接时,将会进行URL解码,即去掉"%",同时按照ISO8859-1编码(上面已经描述,可以使用URLEncoding来设置成其它编码)识别。上述例子的结果分别是"\ue4\ub8\uad\ue6\u96\u87.html?a=\u4e\u2d\u65\u87"和"\u4e\u2d\u65\u87.html?a=\u4e\u2d\u65\u87",注意前者前面的"中文"两个字恢复成了6个字符。这里用"\u",表示是unicode。所以,由于客户端设置的不同,相同的链接,在服务器上得到了不同结果。这个问题不少人都遇到,却没有很好的解决办法。所以有的网站会建议用户尝试关闭UTF-8选项。不过,下面会描述一个更好的处理办法。 rewrite:熟悉的人都知道,apache有一个功能强大的rewrite模块,这里不描述其功能。需要说明的是该模块会自动将URL解码(去除%),即完成上述web server(tomcat)的部分功能。有相关文档介绍说可以使用[NE]参数来关闭该功能,但我试验并未成功,可能是因为版本(我使用的是apache 2.0.54)问题。另外,当参数中含有"?& "等符号的时候,该功能将导致系统得不到正常结果。rewrite本身似乎完全是采用字节处理的方式,而不考虑字符串的编码,所以不会带来编码问题。 URLEncode.encode():这是Java本身提供对的URL编码函数,完成的工作和上述UTF-8选项有效时浏览器所做的工作相似。值得说明的是,java已经不赞成不指定编码来使用该方法(deprecated)。应该在使用的时候增加编码指定。当不指定编码的时候,该方法使用系统默认编码,这会导致软件运行结果得不确定。比如对于"中文",当系统默认编码为"gb2312"时,结果是"%4e%2d%65%87",而默认编码为"UTF-8",结果却是"%e4%b8%ad%e6%96%87",后续程序将难以处理。另外,这儿说的系统默认编码是由运行tomcat时的环境变量LC_ALL和LANG等决定的,曾经出现过tomcat重启后就出现乱码的问题,最后才郁闷的发现是因为修改修改了这两个环境变量。建议统一指定为"UTF-8"编码,可能需要修改相应的程序。 一个解决方案 上面说起过,因为浏览器设置的不同,对于同一个链接,web server收到的是不同内容,而软件系统有无法知道这中间的区别,所以这一协议目前还存在缺陷。 针对具体问题,不应该侥幸认为所有客户的IE设置都是UTF-8有效的,也不应该粗暴的建议用户修改IE设置,要知道,用户不可能去记住每一个web server的设置。所以,接下来的解决办法就只能是让自己的程序多一点智能:根据内容来分析编码是否UTF-8。 比较幸运的是UTF-8编码相当有规律,所以可以通过分析传输过来的链接内容,来判断是否是正确的UTF-8字符,如果是,则以UTF-8处理之,如果不是,则使用客户默认编码(比如"GBK"),下面是一个判断是否UTF-8的例子,如果你了解相应规律,就容易理解
public static boolean isValidUtf8( byte[] b, int aMaxCount){ int lLen=b.length,lCharCount=0; for( int i=0;i<lLen && lCharCount<aMaxCount;++lCharCount){ byte lByte=b[i++]; // to fast operation, ++ now, ready for the following for(;;) if(lByte>=0) continue; // >=0 is normal ascii if(lByte<( byte)0xc0 || lByte>( byte)0xf) return false; int lCount=lByte>( byte)0xfc?5:lByte>( byte)0xf8?4 :lByte>( byte)0xf0?3:lByte>( byte)0xe0?2:1; if(i+lCount>lLen) return false; for( int j=0;j<lCount;++j,++i) if(b[i]>=( byte)0xc0) return false; } return true; }相应地,一个使用上述方法的例子如下:
public static String getUrlParam(String aStr,String aDefaultCharset) throws UnsupportedEncodingException { if(aStr==null) return null; byte[] lBytes=aStr.getBytes("ISO-8859-1"); return new String(lBytes,StringUtil.isValidUtf8(lBytes)?"utf8":aDefaultCharset); }不过,该方法也存在缺陷,如下两方面: 没有包括对用户默认编码的识别,这可以根据请求信息的语言来判断,但不一定正确,因为我们有时候也会输入一些韩文,或者其他文字。 可能会错误判断UTF-8字符,一个例子是"学习"两个字,其GBK编码是" \xd1\xa7\xcf\xb0",如果使用上述isValidUtf8方法判断,将返回true。可以考虑使用更严格的判断方法,不过估计效果不大。 有一个例子可以证明google也遇到了上述问题,而且也采用了和上述相似的处理方法,比如,如果在地址栏中输入"http://www.google.com/search?hl=zh-CN&newwindow=1&q=学习",google将无法正确识别,而其他汉字一般能够正常识别。最后,应该补充说明一下,如果不使用rewrite规则,或者通过表单提交数据,其实并不一定会遇到上述问题,因为这时可以在提交数据时指定希望的编码。另外,中文文件名确实会带来问题,应该谨慎使用。 四,过滤器 如果需要统一设置编码,则通过filter进行设置是个不错的选择。在filter class中,可以统一为需要的请求或者回应设置编码。参加上述setCharacterEncoding()。这个类apache已经给出了可以直接使用的例SetCharacterEncodingFilter。
SERVLET 学习(一) http协议
一, HTTP HTTP(Hypertext Transfer Protocol, 超文本传输协议),用于从WWW服务器传输超文本到本地浏览器的传输协议。你可以通过协议定制传送的内容,从而减少网络传输。HTTP协议是以TCP/IP为基础的高层协议。现在广泛使用的版本HTTP/1.1。 HTTP协议基于请求/响应模式(Request/Response).客户与服务器建立连接后,按照协议规定格式,发送请求到服务器,客户得到请求后,返回响应信息给客户。HTTP使用的端口号,通常为80。 二,URL HTTP URL (包含了用于查找某个资源的足够的信息)的格式如下: http://host[":"port][abs_path] http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。 http://www.microsoft.com/china/index.htm。它的含义如下: 1.http://:代表超文本传输协议,通知microsoft.com服务器显示Web页,通常不用输入; 2.www:代表一个Web(万维网)服务器; 3.Microsoft.com/:这是装有网页的服务器的域名,或站点服务器的名称; 4.China/:为该服务器上的子目录,就好像我们的文件夹; 5.Index.htm:index.htm是文件夹中的一个HTML文件(网页)。 三,HTTP 工作原理 HTTP协议是基于请求/响应范式的(相当于客户机/服务器)。一个客户机与服务器建立连接后,发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。 许多HTTP通讯是由一个用户代理初始化的并且包括一个申请在源服务器上资源的请求。最简单的情况可能是在用户代理和服务器之间通过一个单独的连接来完成。在Internet上,HTTP通讯通常发生在TCP/IP连接之上。缺省端口是TCP80,但其它的端口也是可用的。但这并不预示着HTTP协议在Internet或其它网络的其它协协议之上才能完成。HTTP只预示着一个可靠的传输。 这个过程就好像我们打电话订货一样,我们可以打电话给商家,告诉他我们需要什么规格的商品,然后商家再告诉我们什么商品有货,什么商品缺货。这些,我们是通过电话线用电话联系(HTTP是通过TCP/IP),当然我们也可以通过传真,只要商家那边也有传真。 四,HTTP 请求,应答组成 http://www.cnpaf.net/Class/HTTP/0532918532641885.htmlSERVLET 学习(二) SERVLET技术概述
一,SERVLET 作用 读取客户程序发送来的显式数据(表单数据); 读取客户程序发送来的隐式数据(请求报头); 生成相应的结果; 发送显式的数据给客户程序(HTML); 发送隐式的数据给客户程序(状态代码和响应报头); 优点:高效,便利,功能强大,可移植性强,花费少,安全 二,SERVLET 生命周期 init:仅在servlet首次载入时执行一次。不是每次请求都要调用。 service:在新线程中由服务器为每个请求而调用。发送到doGet,doPost等。不要覆盖这个方法! doGet, doPost, doXxx:处理GET, POST, 等请求。覆盖这些方法以提供期望的行为。 destroy:在服务器删除servlet的实例时调用。不是每次请求后都调用。 三,例子 下面是看《Servlet与JSP核心编程第二版》测试例子; 给大家推荐一个网站: http://chinesedocument.com/ 看名字就应该知道关于什么的了,上面东西挺多的,不错; 说明: chapter2,chaper3:servlet基础,请求参数; chapter4:request请求头查看,post,get方式; chapter5: 简单搜索引擎前端,sendError,sendRedirect测试;测试用例: “http://www.google.cn/search?q=” “sendRedirect” chapter6:ContentType测试 chapter7:cookie测试,servlet:RegistrationForm 简单注册页面,,使用cookie的值预先填写表单的 字段,如果未找到相应的cookie则使用默认值;Registration servlet:基于接收到的请求参数创建cookie,如果得到所有的参数则显示这些值,如果任何参数缺失,则重定向到表单; chapter8:session实现一个简单购物车;流程:登陆(Login servlet)--商品列表(ShopForm servlet)<---->挑选(AddItem servlet) 测试工程 servlet.rar 由于jar文件太大,工程中没有jar保,可自己添加; 工程中用到有:servlet-api.jar,dom4j-1.6.1.jar,jaxen-1.1-beta-6.jar,pull-parser-2.1.10.jar,jaxme-api-0.3.jar,jsr173_1.0_api.jar,msv-20030807.jar,relaxngDatatype-20030807.jar,isorelax-20030108.jar,jtidy-4aug2000r7-dev.jar,xsdlib-20030807.jar,xpp3-1.1.3.3.jar 由于购物车中用到了解析xml,所以Jar包一下就多了; 购物车没有数据库,我用dom4j解析xml,然后把数据存放在session中,觉得很别扭;对dom4j不是很熟悉,解析那部分做的不好,大家给多提提意见;书中有个refresh例子,还没看明白;说看明白实现了给我发一份啊;关于提高自己JAVA水平的十大技术讨论
本文列出了当今计算机软件开发和应用领域最重要十种关键技术排名,如果你想保证你现在以及未来的几年不失业,那么你最好跟上这些技术的发展。虽然你不必对这十种技术样样精通,但至少应该对它们非常熟悉。一、XML
在十种技术中,最重要的一种技术我想应该非XML莫属。这里不仅仅指XML规范本身,还包括一系列有关的基于XML的语言:主要有XHTML,XSLT,XSL,DTDs,XML Schema(XSD),XPath,XQuery和SOAP.如果你现在还对XML一无所知,那么赶快狂补吧。XML是包含类似于HTML标签的一个文本文件,在这个文件中定义了一个树型结构来描述它所保存的数据。
XML最大的优点是你既可以在这个文本文件中存储结构化数据,也可以在其中存储非结构化数据——也就是说,它能包含和描述"粗糙的"文档数据,就象它描述"规则的"表格数据一样。
XHTML是目前编写HTML的首选方法;因为XHTML本身就是格式良好的XML,与通常畸形的HTML文档相比, XHTML格式文档更容易处理。
XSLT和XSL是对XML文档进行转换的语言。它们可以将XML文档转换成各种格式,比如另一个文本文件、PDF文件、HTML文件、逗号分割的文件,或者转换成其它的XML文档。
DTDs 和XML Schema用来描述XML文件所包含的数据内容的类型,使你不用编写定制的代码就能对XML文档的内容进行"有效性"检查,使内容强行遵守给出的规则。
XPath 和 XQuery是查询语言,用它们可以从XML文档中吸取单个的数据项或者数据项列表。XQuery的功能特别强大,因为它对XPath查询进行了扩展。实际上,XQuery和XML的关系就像SQL之于关系数据库一样。
SOAP是Web services间进行通讯的标准协议。你不必知道SOAP协议的所有细节,但是你应该熟悉其常用规则及其工作原理,这样你才能使用它。
二、Web Services
Web服务是XML流行后的直接产物。因为XML可以描述数据和对象,XML大纲可以保证XML文档数据的有效性,因为XML的基于文本的规范,因而XML文档极其适合于作为一种跨平台通讯标准的基本格式。如果你还没有接触过Web服务,那么过不了多久你肯定会碰到它,所以必须熟练掌握Web服务,最好是精通它,因为它是迄今为止应用程序间跨不同种类机器、语言、平台和位置通讯的最简单的一种方式。不管你需不需要它,Web服务都会是将来互用性的主要趋势。
XML工作组的John Bosak曾说过:"XML使得Java有事可做",那么,我们也可以说,Web服务使得所有语言都有事可做。Web服务让运行在大型机上的COBOL应用程序与运行在手持设备上的应用程序相互沟通;让Java小应用与。NET服务器相互通讯,让桌面应用与Web服务器进行无缝交互,不但为商业数据处理,同时也为商业功能提供了方便的实现——并且这种实现与语言、平台、和位置无关。
三、面向对象编程
许多程序员仍然认为OOP乃技术的象牙之塔,但是细细想一下过去十年里在面向对象领域里占据过统治地位的开发语言之后,你就不会这么认为了,OOP理念从Smalltalk开始,然后蔓延到C++和Pascal(Delphi),到Java成为真正的主流,几年之后,VB.NET 和 C#的出现可以说是OOP发展到了登峰造极的地步。虽然使用这些语言不必了解OOP的概念,但如果你缺乏一些OOP的基本知识和方法,我想你很难在逐渐疲软的就业市场中找到工作。
四、Java, C++, C#, VB.NET
如果你热衷于技术,并且热爱编程,那么我想你应该轻松玩转这些高级语言,我说的玩转并不一定要你成为超级编程高手。而是能看懂用这些语言编写的代码即可。如果你还有精力用它们编码那就更好了。其实这种机会甚少。但是看代码的机会很多,学习编程的最有效的一种方式就是看源代码——浩如烟海的源代码中很多都不是用你所钟爱的开发语言编写的。
在过去的几年里,各个语言功能的发展基本上都差不多。现在你完全可以用VB.NET来写Windows服务、Web应用或者命令行程序。即使你只用其中的一种语言写程序。我认为也完全有必要学习另外一种语言,使自己能阅读和理解它们现有的例子代码,并且能将一种语言编写的代码转换成你首选的编程语言代码。这里列出的四种语言可谓是一个强大的开发语言工具箱,如果你掌握了它们,毫无疑问你一定是一个众人仰慕的高手。这里我要声明一下:那就是我并没有要忽略和排除其它的高级语言,如:FORTRAN、COBOL、APL、ADA、Perl和Lisp等等,根据你所从事的领域不同,应该选择适合的语言和工具。
五、JavaScript
Java 和JavaScript两者的名字尽管很类似,但它们之间并没有什么关系。为什么一种脚本语言会如此重要,以至于将它列入十种关键技术之一呢?仔细想一下就知道了,目前所有主流的浏览器都使用JavaScript.如果你要编写Web应用程序,那么JavaScript不可或缺。此外,JavaScript还能作为一种服务器端的脚本语言,如将它嵌入在ASP、ASP.NET中,或者嵌入XSLT来扩展功能。目前JavaScript在Mozilla/Netscape中是激活基于XUL界面的首选语言,它派生出了ActionScript,成为Flash MX应用的编程语言。还有就是JavaScript极有可能成为未来新设备的脚本语言以及主流应用的宏语言。
相比之下,VBScript虽然在微软的产品中得到很好的支持,但从长远来看,没有迹象表明它会有美好前途。微软自己都趋向于用JavaScript(或者用由JavaScript派生的JScript)来编写其客户端脚本代码。因此,如果你要选择脚本语言,非JavaScript莫属。
六、Regular Expressions
从所周知,关系数据库的查询使用SQL,搜索XML文档用XPath 和XQuery,而正则表达式则用来搜索纯文本。例如,你可以用一个命令来查找或删除HTML格式文件中的注释内容。大家都用过"IndexOf"、"InStr"以及"Like"这些内建在JavaScript或VB中的文本搜索函数,这些函数虽然很容易使用,但是它们的功能却无法与正则表达式同日而语——现在每一种主流的开发语言都提供对正则表达式的存取。尽管有人认为正则表达式本身的读写艰涩难懂,但毕竟它的功能强大,使用它的领域也越来越多。
七、Design Patterns
就像OOP通过创建和分类对象来简化编程一样,设计模式将普通的对象交互分类成指定的模型,这是一个从一般到具体的过程。OOP的成分使用得越多,设计模式就显得越有用武之地。所以你必须理解它们,跟上其总体理论的发展。
八、Flash MX
当你需要比HTML和CSS所能提供的更多的客户端图形和编程能力时,Flash是最佳选择。在Flash中编程比用Java小应用或者。NET代码来得快得多,也容易得多。
在最新版本中(MX),Flash不仅可以画图和进行动画打包,它还是个高度的可编程应用环境。具备强大的与SOAP Web服务沟通的能力,可以调用运行在远端服务器上的ColdFusion、Java或。NET代码。可以说Flash几乎无处不在,包括手持设备、置顶盒、甚至是新的平板电脑,你到处都可以见到它的身影,所以使用它实际上可以扩展和延伸你的应用程序使用领域。
九、Linux/Windows
这是当今PCs机操作系统的两大阵容,如果你想在计算机行业里混,就一定要熟悉它们。对于Linux,最好能自己安装,配置,下载它的图形用户界面以及一些应用程序。自己安装Apache并会编写Web应用程序。要清醒地认识到这个世界除了Windows之外,还有Linux的存在。并且这种局面将会长期存在。反过来,如果你是一个死忠的Linux开发者,不要再继续对Windows的憎恶,要相互学习,取长补短,看看Windows有什么好的东东可以采纳。记住Windows仍然是桌面之王。
谁也说不准你们公司什么时候会决定从Linux转向Windows,或者从Windows转向Linux.谁也说不准什么时候你会跳槽跑到另外一个使用不同平台的公司上班——或者即便不跳槽,也有可能在不同平台上开始另外一个杀手级项目——所以最好在每个平台上都积累一些经验,而不要在一棵树上吊死。
十、SQL
尽管SQL在当今众多的技术中已不是什么新东西,而且在未来的十年里它的作用很有可能被削弱,甚至整个被淘汰,但它仍然是一种基本技能——别看它是一种基本技能,至今仍有许多开发人员不懂什么是SQL或对它了解不多。不要指望基于图形用户界面的SQL构造器会帮你的忙,还是自己亲手写SQL查询吧,确定你掌握了SQL的基本语法。现在理解了SQL,不仅对以后学习XQuery有所裨益,而且可以使你很快找到简化或改进当前开发项目的途径。
尾声:培养对技术的好奇心
其实,不管技术的发展趋势如何,每个人最重要的一个技能是好奇心。敢于面对挑战,在你目前或未来的工作中,新语言或新技术可能很重要,也可能不怎么重要,你所学习的东西并不一定非要针对你的工作。不要怕失败,任何新的技术对初学者来说都是困难的。大多数的失败都可以归咎于本身急功近利,希望速成。俗话说——千里之行,始于足下,应该脚踏实地,一步一个脚印地往前走。不要让时间来左右你行动,而是要利用时间来关注、研究、测试新的开发技术和工具。
XML 学习(一) XML基础
定义:XML是Extensible Markup Language的简写,一种扩展性标识语言;是数据储存和交互的工具, 一,相关术语: Element(元素):一个元素由一个标识来定义,包括开始和结束标识以及其中的内容,就象这样:<author>ajie</author> ; Tag(标识):标识是用来定义元素的。在XML中,标识必须成对出现,将数据包围在中间。标识的名称和元素的名称是一样的; Attribute(属性):属性是对标识进一步的描述和说明,一个标识可以有多个属性,例如font的属性还有size; Declaration(声明) :在所有XML文档的第一行都有一个XML声明。这个声明表示这个文档是一个XML文档,它遵循的是哪个XML版本的规范。一个XML的声明语句就象这样:<?xml version="1.0"?> ; DTD(文件类型定义) :DTD是用来定义XML文档中元素,属性以及元素之间关系的;(XML文档结构) Well-formed XML(良好格式的XML):一个遵守XML语法规则,并遵守XML规范的文档称之为"良好格式"; Valid XML(有效的XML):一个遵守XML语法规则,并遵守相应DTD文件规范的XML文档称为有效XML文档; 二,XML文档组成: 文档声明:<?xml version="1.0" encoding="GB2312"?> 文档类型定义(DTD) XML标示创建内容 三,XML语法规则 1,声明语句<?xml ... ?>的作用是告诉浏览器或其它处理程序这个文档是XML文档。声明语句中的version表示文档遵守的XML规范的版本,encoding表示文档所用的语言编码,这个例子用的编码是”GB2312“; 2,注意大小写的区分; 3,“有始有终”所有的标识必须有相应的结束标识; 4,空标识(empty element)必须被关闭; 5,给属性值加引号,HTML中的属性值可以加"",也可以不加"",还可以加''。但在XML中,属性值一定要加"; 6,标识之间不可以交叉; XML标记必须遵循下面的命名规则: 1,名字中可以包含字母、数字以及其它字母; 2,名字不能以数字或"_" (下划线) 开头; 3,名字不能以字母 xml (或 XML 或 Xml ..) 开头; 4,名字中不能包含空格。 5,名称中间不能包含":"(冒号) 为了使元素更容易阅读理解和操作,我们还有一些建议: 名称中不要使用".",名称尽量简短,名称的大小写尽量采用同一标准,名称可以使用非英文字符,比如用中文。但是有些软件可能不支持。(IE5目前是支持中文元素的) 四, DOM DOM全称是document object model(文档对象模型),DOM是用来干什么的呢?假设把你的文档看成一个单独的对象,DOM就是如何用HTML或者XML对这个对象进行操作和控制的标准。 面向对象的思想方法已经非常流行了,在编程语言(例如java,js)中,都运用面向对象的编程思想。在XML中,就是要将网页也作为一个对象来操作和控制,我们可以建立自己的对象和模板。与对象进行交流,如何命令对象,就要用到API。API全称Application Programming Interface,它是访问和操作对象的规则。而DOM就是一种详细描述HTML/XML文档对象规则的API。它规定了HTML/XML文档对象的命名协定,程序模型,沟通规则等。在XML文档中,我们可以将每一个标识元素看作一个对象---它有自己的名称和属性。 XML创建了标识,而DOM的作用就是告诉script如何在浏览器窗口中操作和显示这些标识; 上面我们已经简要的讲述了一些XML的基本原理,我们来看看它们之间的关联以及它们是如何工作的,先看这里一张图: 1.XML描述数据类型。例如:"King lear"是一个标题元素; 2.CSS储存并控制元素的显示样式。例如:标题将被以18pt字体显示 3.script脚本控制元素如何动作。例如:当一个title元素"out of stock",将被用红色显示。 4.DOM则为脚本和对象的交流提供一个公共平台,并将结果显示在浏览器窗口。 如果任何一个部分发生错误,都不会得到正确结果。 五,显示 单独用XMl不能显示页面,我们使用格式化技术,比如CSS或者XSL,才能显示XML标记创建的文档;XML中用来设定显示风格样式的文件类型有: 1,XSL :XSL全称是Extensible Stylesheet Language(可扩展样式语言), 是将来设计XML文档显示样式的主要文件类型。它本身也是基于XML语言的。使用XSL,你可以灵活的设置文档显示样式,文档将自动适应任何浏览器和PDA(掌上电脑)。;XSL也可以将XML转化为HTML,那样,老的浏览器也可以浏览XML文档了。 2,CSS:CSS大家很熟悉了,全称是Cascading Style Sheets(层叠样式表),是目前用来在浏览器上显示XML文档的主要方法。 3.Behaviors :Behaviors现在还没有成为标准。它是微软的IE浏览器特有的功能,用它可以对XML标识设定一些有趣动作。
XML 学习(二) DOM 解析 standalone 的问题
一个简单的 XML解析例子,弄了半天终于可以运行了,记下来;还有点问题,大家帮忙看看; 文档类型定义(myfile.dtd) <!ELEMENT myfile (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> XML文件(myfile.xml) <?xml version="1.0" encoding="GB2312"?> <!DOCTYPE myfile SYSTEM "myfile.dtd"> <myfile> <title>XML轻松学习手册</title> <author>ajie</author> </myfile> 测试页面(myfile.html) <html> <head> <script language="JavaScript" for="window" event="onload"> var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false"; xmlDoc.load("myfile.xml"); nodes = xmlDoc.documentElement.childNodes; title.innerText = nodes.item(0).text; author.innerText = nodes.item(1).text; </script>
<title>在HTML中调用XML数据</title> </head> <body bgcolor="#FFFFFF"> <b>标题: </b> <span id="title"></span><br> <b>作者: </b> <span id="author"></span><br> </body> </html> 问题: 1, <?xml version="1.0" standalone="yes" encoding="GB2312"?> <myfile> <title>XML轻松学习手册</title> <author>ajie</author> </myfile> 把myfile.html改成这样时,到这句nodes = xmlDoc.documentElement.childNodes时报错,提示“缺少对象”; 2,standalone="yes"换成standalone="no"一样的错误 3, <?xml version="1.0" encoding="GB2312"?> <myfile> <title>XML轻松学习手册</title> <author>ajie</author> </myfile> 把myfile.html改成这样时可以运行正常; 对这个standalone很是无奈
XML 学习(三) DOM 解析- Node 对象的属性
下午在 W3C看了半天XML DOM 教程,弄了个例子,整理下;( W3C上有所有的网站建设教程,有一个对应的中文网站 http://www.w3school.com.cn/index.html,不过有些例子的连接打不开) loadxmldoc.js,只有一个函数loadXMLDoc(dname),单数为解析XML文件名,返回一个XMLDOM对象;function loadXMLDoc(dname) { var xmlDoc; // code for IE if (window.ActiveXObject) { xmlDoc= new ActiveXObject("Microsoft.XMLDOM"); } // code for Mozilla, Firefox, Opera, etc. else if (document.implementation && document.implementation.createDocument) { xmlDoc=document.implementation.createDocument("","", null); } else { alert('Your browser cannot handle this script'); } xmlDoc.async= false; xmlDoc.load(dname); return(xmlDoc); }book.xml待解析XML文件<?xml version="1.0" encoding="ISO-8859-1" ?> <!-- Edited with XML Spy v2007 (http: // www.altova.com) --> <bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>book.html 测试页面<html> <head> <script src="../loadxmldoc.js"></script> <script> var xmlDoc = loadXMLDoc("book.xml"); function getFirstChild(doc){ var x = doc.firstChild; while(x.nodeType!=1){ x.nextSibling; } return x; } function getLastChild(doc){ var x = doc.lastChild; while(x.nodeType!=1){ x.previousSibling; } return x; } var first = getFirstChild(xmlDoc.documentElement); document.write("first.nodeName:" + first.nodeName); document.write("first.nodeType:" + first.nodeType + "<br/><br/>"); var last = getLastChild(xmlDoc.documentElement); document.write("last.nodeName:" + last.nodeName); document.write("last.nodeType:" + last.nodeType + "<br/><br/>"); var test = xmlDoc.getElementsByTagName("title"); var parent = test.item(0).parentNode; document.write("parent.nodeName:" + parent.nodeName + "<br/><br/>"); document.write("textContent:" + parent.textContent + "<br/><br/>"); document.write("text:" + parent.text + "<br/><br/>"); document.write("xml:" + "<xmp>" + parent.xml + "</xmp>" + "<br/><br/>"); document.write(xmlDoc.nodeName); document.write(xmlDoc.nodeType + " "); document.write(xmlDoc.childNodes[0].nodeValue + "<br/>"); var x = xmlDoc.documentElement; // 获得xml文件文档元素,即bookstore document.write(x.nodeName); document.write(x.nodeType + " "); document.write(x.childNodes.item(0).nodeValue + "<br/>"); var child = x.childNodes; // 获得 bookstore所有的子元素 book // 显示bookstore所有元素 for(i=0; i< child.length; i++){ document.write(child[i].nodeName); document.write(child[i].nodeType + " "); document.write(child[i].childNodes[0].nodeValue + "<br/>"); var ch = child[i]; for(j=0; j<ch.childNodes.length; j++){ document.write(ch.childNodes[j].nodeName); document.write(ch.childNodes[j].nodeType + " "); document.write(ch.childNodes[j].childNodes[0].nodeValue + "<br/>"); } } </script> </head> </html>其中用到的XML DOM - Node 对象的属性有: childNodes:返回某节点到子节点的节点列表 firstChild:返回某节点的首个子节点 lastChild:返回某个节点的最后一个子节点 nextSibling:返回某个节点之后紧跟的同级节点 nodeName:返回节点的名称,根据其类型 nodeType:返回节点的类型 nodeValue:设置或返回某个节点的值,根据其类型 ownerDocument:返回某个节点的根元素(document 对象) parentNode:返回某节点的父节点 previousSibling:返回某个节点之前紧跟的同级节点 textContent:设置或返回某节点及其后代的文本内容 text:返回某节点及其后代的文本(IE 独有的属性) xml:返回某节点及其后代的 XML(IE 独有的属性) 未测试或者不太明白的XML DOM - Node 对象的属性有,谁帮忙讲解下啊; baseURI:返回某个节点的绝对基准 prefix:设置或返回某节点的命名空间前缀 localName:返回某个节点的本地名称 namespaceURI:返回某个节点的命名空间XML 学习(四) xPath基础
一,简介:XPath 使用路径表达式来选取 XML 文档中的节点或者节点集,这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。XPath 使用路径表达式在 XML 文档中进行导航 ;XPath 包含一个标准函数库 ;XPath 是 XSLT 中的主要元素 。 二,XPath 术语 节点(Node):在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。基本值(或称原子值,Atomic value):基本值是无父或无子的节点。 项目(Item):项目是基本值或者节点。 节点关系 父(Parent):每个元素以及属性都有一个父, 子(Children):元素节点可有零个、一个或多个子, 同胞(Sibling):拥有相同的父的节点 先辈(Ancestor):某节点的父、父的父,等等, 后代(Descendant):某个节点的子,子的子,等等;
三,XPath 语法XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的, nodename 选取此节点的所有子节点, / 从根节点选取 , // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 , . 选取当前节点 , .. 选取当前节点的父节点 , @ 选取属性 ,
谓语(Predicates):谓语用来查找某个特定的节点或者包含某个指定的值的节点。谓语被嵌在方括号中。函数或者表达式;选取未知节点:XPath 通配符可用来选取未知的 XML 元素。 * 匹配任何元素节点 @* 匹配任何属性节点 node() 匹配任何类型的节点
选取若干路径:通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
四,XPath Axes(坐标轴):轴可定义某个相对于当前节点的节点集。
ancestor 选取当前节点的所有先辈(父、祖父等) ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身 attribute 选取当前节点的所有属性 child 选取当前节点的所有子元素。 descendant 选取当前节点的所有后代元素(子、孙等)。 descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。 following 选取文档中当前节点的结束标签之后的所有节点。 namespace 选取当前节点的所有命名空间节点 parent 选取当前节点的父节点。 preceding 选取文档中当前节点的开始标签之前的所有节点。 preceding-sibling 选取当前节点之前的所有同级节点。 self 选取当前节点。
步的语法: 轴名称::节点测试[谓语]
五,XPath 运算符:XPath 表达式可返回节点集、字符串、逻辑值以及数字。 加(+),减(-),乘(*),除(div),等于(=),不等于(!=),大于(>),小于(<),大于等于(>=),小于等于(<=),与(and),或(or),余(mod),XML 学习(五) xPath例子
xPathTest.html(测试页面) 其中loadxmldoc.js和book.xml 和 XML 学习(三) DOM 解析- Node 对象的属性 一篇中一样;<html> <head> <script src="../loadxmldoc.js"></script> <script> var xmlDoc = loadXMLDoc("../book/book.xml"); // 只有XML解析器的一个实例才能调用 selectNodes() ??? var x=xmlDoc.selectNodes("/bookstore/book"); // bookstore元素下的所有book子元素 // var x=xmlDoc.selectNodes("bookstore");//获得bookstore元素 // var x=xmlDoc.selectNodes("book");//什么都没获得???? // var x=xmlDoc.selectNodes(".");//获得当前元素, // var x=xmlDoc.selectNodes("node()");//获得 所有元素,包括文档声明; // var x=xmlDoc.selectNodes("//author");//获得文档中所有的author元素; // var x=xmlDoc.selectNodes("/bookstore/book[2]/author[2]");//bookstore第三个book子元素的第三个author元素 // var x=xmlDoc.selectNodes("//@category");//获得有属性category的所有元素 // var x=xmlDoc.selectNodes("/bookstore/book[last()]");//position()<3 报错 函数不存在??? // var x=xmlDoc.selectNodes("/bookstore/book[@category='WEB']/author"); // bookstore的子元素中category属性为WEB的所有book元素的author元素 // var x=xmlDoc.selectNodes("/bookstore/book/*");//bookstore子元素中book的所有子元素 // var x=xmlDoc.selectNodes("//*");//获得文档元素 // var x=xmlDoc.selectNodes("//title | //price");//所有的title元素和所有的price元素 for(i=0;i<x.length;i++) { document.write("<xmp>" + x.item(i).xml + "</xmp>"); document.write("<br/>"); } </script> </head> </html>其中主要用到了 xPath 语法和少量的运算符; 关于坐标轴,函数测试都报错;XML 学习(六) XSLT 基础
一,XSLT 简介:XSLT 是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言。XSLT 指 XSL 转换(XSL Transformations), XSLT 是 XSL 中最重要的部分, XSLT 可将一种 XML 文档转换为另外一种 XML 文档, XSLT 使用 XPath 在 XML 文档中进行导航, 二,XSLT 元素 <xsl:template> 元素:<xsl:template> 元素用于构建模板。match 属性用于关联 XML 元素和模板。match 属性也可用来为整个文档定义模板。match 属性的值是 XPath 表达式(举例,match="/" 定义整个文档); <xsl:value-of> 元素:<xsl:value-of> 元素用于提取某个选定节点的值,并把值添加到转换的输出流中 <xsl:for-each> 元素:<xsl:for-each> 元素可用于选取某个指定节点集的每个 XML 元素; <xsl:sort> 元素:用于对结果进行排序; <xsl:if> 元素:用于放置针对 XML 文件内容的条件测试; <xsl:choose> 元素:用于结合 <xsl:when> 和 <xsl:otherwise> 来表达多重条件测试; <xsl:apply-templates> 元素:<xsl:apply-templates> 元素可把一个模板应用于当前的元素或者当前元素的子节点。假如我们向 <xsl:apply-templates> 元素添加一个 select 属性,此元素就会仅仅处理与属性值匹配的子元素。我们可以使用 select 属性来规定子节点被处理的顺序;
XML 学习(八) DTD XML与Schema基础
一,XML Schema 1,定义:XML Schema 是基于XML 的DTD 替代者,用来描述 XML 文档的结构;
2,优点:支持数据类型;使用 XML 语法;可保护数据通信;可扩展; 3,简单类型: 简易元素:简易元素指那些仅包含文本的元素。它不会包含任何其他的元素或属性。<xs:element name="color" type="xs:string" default="red"/>,确实,固定(fixed); 属性:属性均被作为简易类型来声明,<xs:attribute name="xxx" type="yyy"/>,use(required); XSD 限定:用于为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet; 4,复杂类型: 复合元素:复合元素指包含其他元素及/或属性的 XML 元素;空元素 ,包含其他元素的元素 ,仅包含文本的元素 ,包含元素和文本的元素; 指示器:通过指示器,我们可以元素在文档中被使用的方式。 Order 指示器:All ,Choice ,Sequence ; Occurrence 指示器:maxOccurs ,minOccurs ; Group 指示器:Group name ,attributeGroup name ; Group 指示器; <anyAttribute> 元素使我们有能力通过未被 schema 规定的属性来扩展 XML 文档; <any> 元素使我们有能力通过未被 schema 规定的元素来拓展 XML 文档; 二,DTD: DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。它使用一系列的合法元素来定义文档结构。 元素,属性,实体, 三,XML Schema 与 DTD 比较: http://www-128.ibm.com/developerworks/cn/xml/x-sd/index.htmlXML 学习(九) XML 编辑器 XMLSpy
Altova XMLSpy© 2005 是业界标准XML的开发环境,可用于涉及XML、XML Schema、XSLT、XQuery、SOAP、WSDL和Web服务技术的企业级应用的设计、编辑和调试。它是提高J2EE、.NET和数据库开发人员开发效率的终极利器。 一个中文破解下载地址;XMLSpy2006 中文用户手册:http://bbs.xml.org.cn/xmlspy2005/spyentdefaulthomepage.htm 主要内容有:XML的编辑与验证,Schema/DTD的编辑与验证,XSLT的编辑与转换eclipse Tomcat单步调试
1.在Eclipse中启动Tomcat。 2.在待调试的代码段处设置断点。 3.在浏览器中运行你的Web程序,当程序执行到设置断点处时,会自动处于等待状态。
[1]快捷键(F8)直接执行程序。 [2]快捷键(F5)单步执行程序,遇到方法时进入。 [3]快捷键(F6)单步执行程序,遇到方法时跳过。 [4]快捷键(F7)单步执行程序,从当前方法跳出。
若要改变变量的值,可以右击变量,在弹出的菜单中选择[change variable value],弹出修改画面。改变其值后,按下ok键即可。这时,变量的值就改为修改后的值了。 若要检查代码段是否正确,可以选择一句或一段代码,右键单击在弹出的菜单中选择Inspect项,这时,代码的执行结果就显示在Expressions窗口中。
在调试时出现source not find的提示信息,只要将window->preferences->tomcat->source path中相关的工程选中即可
一般标签Core <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
国际化信息标签I18N <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
数据库标签Sql <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
xml标签 <%@ taglib uri=http://java.sun.com/jsp/jstl/xml prefix="xml"%>
函数标签 <%@ taglib uri=http://java.sun.com/jsp/jstl/functions prefix="fn"%>