﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-学JAVA是个好主意</title><link>http://www.blogjava.net/army666/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:10:49 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:10:49 GMT</pubDate><ttl>60</ttl><item><title>Struts标记库学习</title><link>http://www.blogjava.net/army666/archive/2006/08/16/63918.html</link><dc:creator>Parmy</dc:creator><author>Parmy</author><pubDate>Wed, 16 Aug 2006 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/army666/archive/2006/08/16/63918.html</guid><wfw:comment>http://www.blogjava.net/army666/comments/63918.html</wfw:comment><comments>http://www.blogjava.net/army666/archive/2006/08/16/63918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/army666/comments/commentRss/63918.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/army666/services/trackbacks/63918.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 128.5pt; mso-char-indent-count: 8.0">
				<font color="#cc0099">
						<b style="mso-bidi-font-weight: normal">
								<span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于</span>
						</b>
						<b style="mso-bidi-font-weight: normal">
								<span lang="EN-US" style="FONT-SIZE: 16pt">Struts</span>
						</b>
						<b style="mso-bidi-font-weight: normal">
								<span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标记库</span>
						</b>
				</font>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 16pt">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">JSP</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">视窗组件所使用的</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Struts</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">标记库通常可以分为四种类型：</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">1.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Bean</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">标记：用来在</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">JSP</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">页中管理</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Bean</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">2.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">逻辑标记：用来在</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">JSP</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">页中控制流程。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">3.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">HTML</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">标记：用来生成</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">HTML</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">标记，在表单中显示数据。使用会话</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">ID</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">对</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">URL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">编程。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'">
						<span style="mso-list: Ignore">4.<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">模板标记：使用动态模板构造普通格式的页。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">下面详细介绍各标记内容：</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">Bean标记库中包含用于定义新</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">bean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">、访问</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">bean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">及其属性的标记。</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">Struts</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">框架提供了多种自定义标记用来在</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">JSP</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">页中处理</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">JavaBean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">。这些标记被封装在一个普通的标记库中，在文件</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">struts-bean.tld</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">中定义了它的标记库描述器。</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">Bean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">标记库将标记定义在四个子类别中：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">􀁺</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">
				</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">创建和复制</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">bean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">的标记<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">􀁺</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">
				</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">脚本变量定义标记<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">􀁺</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">
				</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">bean</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">翻译标记<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">􀁺</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">
				</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">消息国际化标记 <span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; mso-para-margin-left: 2.0gd">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">逻辑库的标记能够用来处理外观逻辑而不需要使用</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">scriptlet</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">。</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">Struts</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">逻辑标签库包含的标记能够有条件地产生输出文本，在对象集合中循环从而重复地产生输出文本，以及应用程序流程控制。它也提供了一组在</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">JSP</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">页中处理流程控制的标记。这些标记封装在文件名为</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">struts-logic.tld</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">的标记包中。逻辑标记库定义的标记能够执行下列三个功能：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">􀁺</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">
				</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">条件逻辑<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">􀁺</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">
				</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">重复<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">􀁺</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">
				</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">转发</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">/</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">重定向响应<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">Struts HTML</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">标记可以大致地分为以下几个功能：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">􀁺</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">
				</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">显示表单元素和输入控件<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">􀁺</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">
				</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">显示错误信息<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">􀁺</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: Wingdings">
				</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">显示其他</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">HTML</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">元素 <span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-layout-grid-align: none">
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">动态模板是模块化</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">WEB</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">页布局设计的强大手段。</span>
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 'Sim Sun+ 2'">Struts</span>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">模板标记库定义了自定义标记来实现动态模板。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-font-kerning: 0pt">接下来的几天将分别详细的介绍以上四种标记的子类和使用方法，希望大家关注。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
<img src ="http://www.blogjava.net/army666/aggbug/63918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/army666/" target="_blank">Parmy</a> 2006-08-16 15:52 <a href="http://www.blogjava.net/army666/archive/2006/08/16/63918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XMLBean</title><link>http://www.blogjava.net/army666/archive/2006/02/16/30943.html</link><dc:creator>Parmy</dc:creator><author>Parmy</author><pubDate>Thu, 16 Feb 2006 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/army666/archive/2006/02/16/30943.html</guid><wfw:comment>http://www.blogjava.net/army666/comments/30943.html</wfw:comment><comments>http://www.blogjava.net/army666/archive/2006/02/16/30943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/army666/comments/commentRss/30943.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/army666/services/trackbacks/30943.html</trackback:ping><description><![CDATA[<H3>编写使用这些接口的 Java 代码</H3>
<P>通过在您的应用程序中使用 XMLBean 接口，可以编写使用新类型的代码，以便基于该 Schema 对 XML 进行处理。下面的示例将提取有关订购单 XML 中的每个订购商品的信息，并计算商品的数量，然后计算其价格总和。请特别注意基于 Schema 生成的类型以及作为 <SPAN class=langinline>org.openuri.easypo</SPAN> 包的一部分而导入的类型的使用情况。</P>
<P><SPAN class=langinline>printItems</SPAN> 方法接收包含订购单 XML 文件的 <SPAN class=langinline>File</SPAN> 对象。</P><PRE>package docs.xmlbeans;

import java.io.File;
import com.bea.xml.*;
import org.openuri.easypo.PurchaseOrderDocument;
import org.openuri.easypo.PurchaseOrder;
import org.openuri.easypo.LineItem;

public class POHandler 
{
&nbsp;&nbsp;&nbsp;&nbsp;public static void printItems(File po) throws Exception 
    {
        /*
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 所有 XMLBean Schema 类型都提供嵌套的 Factory 类，您可以使用它
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 将 XML 绑定到该类型，或者创建该类型的新实例。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 请注意，像该类型一样的“Document”类型是 XMLBean
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 构造，用于表示全局元素。它为您提供了一种
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 获取和设置整个元素的内容的方法。
         *
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 此外，只有在所解析的 XML 遵守
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* Schema 的情况下，parse 方法才会成功。
         */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PurchaseOrderDocument poDoc =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PurchaseOrderDocument.Factory.parse(po);

        /*
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* PurchaseOrder 类型表示 purchase-order 元素的
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 复杂类型。
         */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PurchaseOrder po = poDoc.getPurchaseOrder();

        /*
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 当某个元素可能作为子元素出现多次时，
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* Schema 编译器将生成引用该元素
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 的多个实例的方法。line-item 元素
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 的 maxOccurs 特性值指定为“unbounded”，这意味着
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 它可以根据需要在一个实例中出现多次。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 因此存在 getLineItemArray 和 setLineItemArray 等方法。 
         */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LineItem[] lineitems = po.getLineItemArray();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Purchase order has " + lineitems.length + " line items.");

double totalAmount = 0.0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int numberOfItems = 0;

        /*
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 循环遍历 line-item 元素，方法是使用所生成的存取程序
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* 获取子元素的值，如 description、quantity 以及
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* price。
         */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int j = 0; j &lt; lineitems.length; j++) 
        {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(" Line item:" + j);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"   Description:" + lineitems[j].getDescription());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("   Quantity:" + lineitems[j].getQuantity());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("   Price:" + lineitems[j].getPrice());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numberOfItems += lineitems[j].getQuantity();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;totalAmount += lineitems[j].getPrice() * lineitems[j].getQuantity();
        }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Total items:" + numberOfItems);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Total amount:" + totalAmount);
    }
}
</PRE>
<P>请注意，基于 Schema 所生成的类型反映了 XML 中的内容：</P>
<UL>
<LI>
<DIV><SPAN class=langinline>PurchaseOrderDocument</SPAN>，表示全局根元素。 </DIV>
<LI>
<DIV><SPAN class=langinline>getPurchaseOrder</SPAN> 方法，返回包含子元素（其中包括 <SPAN class=langinline>line-item</SPAN>）的 <SPAN class=langinline>PurchaseOrderDocument.PurchaseOrder</SPAN> 类型。<SPAN class=langinline>getLineItemArray</SPAN> 方法，返回包含 <SPAN class=langinline>line-item</SPAN> 元素的 <SPAN class=langinline>LineItem</SPAN> 数组。 </DIV>
<LI>其他方法（如 <SPAN class=langinline>getQuantity</SPAN>、<SPAN class=langinline>getPrice</SPAN> 等等）是根据 Schema 的描述自然得出的，其作用是返回 <SPAN class=langinline>line-item</SPAN> 元素的相应子元素。 
<LI>包含这些类型的包的名称是从 Schema 的目标名称空间派生得到的。 </LI></UL>
<DIV>
<P>所生成的类型名称的大小写和标点符号遵从 Java 约定。此外，当该示例解析文件中的 XML 时，其他 <SPAN class=langinline>parse</SPAN> 方法支持 Java <SPAN class=langinline>InputStream</SPAN> 对象、<SPAN class=langinline>Reader</SPAN> 对象等等。</P>
<P>前面的 Java 代码将在控制台中打印下列内容：</P></DIV>
<DIV><PRE>Purchase order has 3 line items.
&nbsp;Line item 0
&nbsp;&nbsp;&nbsp;Description:Burnham's Celestial Handbook, Vol 1
&nbsp;&nbsp;&nbsp;Quantity: 2
&nbsp;&nbsp;&nbsp;Price: 21.79
&nbsp;Line item 1
&nbsp;&nbsp;&nbsp;Description:Burnham's Celestial Handbook, Vol 2
&nbsp;&nbsp;&nbsp;Quantity: 2
&nbsp;&nbsp;&nbsp;Price: 19.89
Total items: 4
Total amount: 41.68</PRE>
<H3>基于 Schema 创建新的 XML 实例</H3>
<P>您已经看到 XMLBean 提供一个 "factory" 类，您可以使用该类来创建新的实例。下面的示例创建新的 <SPAN class=langinline>purchase-order</SPAN> 元素，并添加 <SPAN class=langinline>customer</SPAN> 子元素。然后它会插入 <SPAN class=langinline>name</SPAN> 和 <SPAN class=langinline>address</SPAN> 子元素，从而创建元素，并通过仅调用一次它们的 <SPAN class=langinline>set</SPAN> 方法来设置它们的值。</P><PRE>public PurchaseOrderDocument createPO()
{
&nbsp;&nbsp;&nbsp;&nbsp;PurchaseOrderDocument newPODoc = PurchaseOrderDocument.Factory.newInstance();
&nbsp;&nbsp;&nbsp;&nbsp;PurchaseOrder newPO = newPODoc.addNewPurchaseOrder();
&nbsp;&nbsp;&nbsp;&nbsp;Customer newCustomer = newPO.addNewCustomer();
&nbsp;&nbsp;&nbsp;&nbsp;newCustomer.setName("Doris Kravitz");
&nbsp;&nbsp;&nbsp;&nbsp;newCustomer.setAddress("Bellflower, CA");
&nbsp;&nbsp;&nbsp;&nbsp;return newPODoc;
}
</PRE>
<P>下面是生成的 XML。请注意，XMLBean 通过使用 "ns1"（或 "namespace 1"）前缀，并基于 Schema 来分配正确的名称空间。在实际工作中，前缀本身并不是真的很重要，它只是用来定义名称空间的名称空间 URI (http://openuri.org/easypo)。前缀仅仅是表示它的一个标记。</P><PRE>&lt;ns1:purchase-order xmlns:ns1="http://openuri.org/easypo"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;ns1:customer&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ns1:name&gt;Doris Kravitz&lt;/ns1:name&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ns1:address&gt;Bellflower, CA&lt;/ns1:address&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ns1:customer&gt;
&lt;/ns1:purchase-order&gt;
</PRE>
<P>请注意，所有类型（包括基于 Schema 生成的类型）都是对 <SPAN class=langinline>XmlObject</SPAN> 的继承，因此都提供了 <SPAN class=langinline>Factory</SPAN> 类。有关适合使用 <SPAN class=langinline>XmlObject</SPAN> 的类型系统的概述，请参阅 <A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/guide/xmlbeans/conXMLBeansSupportBuiltInSchemaTypes.html"><FONT color=#002c99>XMLBean 对内置 Schema 类型的支持</FONT></A>。有关参考信息，请参阅 <A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/java-class/com/bea/xml/XmlObject.html"><FONT color=#002c99>XmlObject Interface</FONT></A>。</P>
<H2>XMLBean 层次</H2>
<P>上面的示例中使用的生成类型实际上是 XMLBean 类型的层次的一部分。这种层次是 XMLBean 用来直观展现 Schema 视图的一种方法。层次的顶部是 <SPAN class=langinline>XmlObject</SPAN>，即 XMLBean 类型的基础接口。在该级别的下面，有两个主要的类型类别：生成类型（表示用户派生的 Schema 类型）和包括类型（表示内置 Schema 类型）。</P>本主题已介绍了生成类型。有关详细信息，请参阅<A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/guide/xmlbeans/conJavaTypesGeneratedFromUserDerived.html"><FONT color=#002c99>从用户派生的 Schema 类型生成的 Java 类型</FONT></A>。 
<H3>内置类型支持</H3>
<P>除了基于指定的 Schema 所生成的类型以外，XMLBean 还提供了 46 种特别的 Java 类型，这些类型是对 XML Schema 规范所定义的 46 种内置类型的镜像。例如，Schema 定义了 <SPAN class=langinline>xs:string</SPAN>、<SPAN class=langinline>xs:decimal</SPAN> 和 <SPAN class=langinline>xs:int</SPAN>，而 XMLBean 提供了 <SPAN class=langinline><A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/java-class/com/bea/xml/XmlString.html"><FONT color=#002c99>XmlString</FONT></A></SPAN>、<SPAN class=langinline><A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/java-class/com/bea/xml/XmlDecimal.html"><FONT color=#002c99>XmlDecimal</FONT></A></SPAN> 和 <SPAN class=langinline><A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/java-class/com/bea/xml/XmlInt.html"><FONT color=#002c99>XmlInt</FONT></A></SPAN>。其中的每个类型也是继承自 <SPAN class=langinline>XmlObject</SPAN>，该类型与内置 Schema 类型 <SPAN class=langinline>xs:anyType</SPAN> 对应。</P>
<P>通过 XMLBean，您就可以将 XML 数据作为这些内置类型进行处理。如果您的 Schema 包括一个类型为 <SPAN class=langinline>xs:int</SPAN> 的元素，XMLBean 将提供一个可以返回 <SPAN class=langinline>XmlInt</SPAN> 的生成方法。此外，就像您在前面的示例中所看到的，对于大多数类型来说，还将有一个返回纯 Java 类型（如 <SPAN class=langinline>int</SPAN>）的方法。下面的两行代码返回 <SPAN class=langinline>quantity</SPAN> 元素的值，但将其作为其他类型返回。</P><PRE>// 返回以“x”开头的简单类型的方法。
XmlInt xmlQuantity = lineitems[j].xgetQuantity();
// 返回纯 Java 类型的方法。
int javaQuantity = lineitems[j].getQuantity();
</PRE>
<P>在某种意义上，这两种 get 方法均导航至 <SPAN class=langinline>quantity</SPAN> 元素；<SPAN class=langinline>getQuantity</SPAN> 方法更深入一步，在返回元素值之前，将其转换为最适合的纯 Java 类型。（XMLBean 还为您提供了一种在使用 XML 的同时对它进行验证的方法。）</P>
<P>如果您对 XML Schema 有所了解，那么您会觉得 XMLBean 类型看起来非常直观。如果您对 XML Schema 知之甚少，可以使用您自己的 Schema 以及基于它们的 XML 实例来对 XMLBean 进行试验，以了解详细的信息。</P>
<P>有关基于 Schema 生成的类型的方法的详细信息，请参阅 <A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/guide/xmlbeans/conMethodsForGeneratedJavaTypes.html"><FONT color=#002c99>从 Schema 生成的类型的方法</FONT></A>。有关 XMLBean 如何表示内置 Schema 类型的详细信息，请参阅 <A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/guide/xmlbeans/conXMLBeansSupportBuiltInSchemaTypes.html"><FONT color=#002c99>XMLBean 对内置 Schema 类型的支持</FONT></A>。</P>
<H2>使用 XQuery 表达式</H2>
<P>使用 XMLBean，可以通过 XQuery 查询 XML 中特定的数据块。XQuery 有时也称为“用于 XML 的 SQL”，因为它提供了一种直接从 XML 文档访问数据的机制，这与 SQL 所提供的、访问传统数据库数据的机制十分类似。</P>
<P>XQuery 的一些语法是从 XPath 借鉴来的，后者是一种用于在 XML 中指定嵌套数据的语法。下面的示例返回 <SPAN class=langinline>price</SPAN> 子元素的值小于或等于 20.00 的所有 <SPAN class=langinline>line-item</SPAN> 元素：</P><PRE>PurchaseOrderDocument doc = PurchaseOrderDocument.Factory.parse(po);

/*
&nbsp;* XQuery 表达式是由下面两个字符串组成的。为方便起见，
&nbsp;* 在这里分别对它们进行声明。第一个字符串声明
&nbsp;* 在查询表达式中使用的名称空间前缀；第二个字符串
&nbsp;* 声明表达式本身。
 */
String nsText = "declare namespace po = 'http://openuri.org/easypo'";
String pathText = "$this/po:purchase-order/po:line-item[po:price &lt;= 20.00]";
String queryText = nsText + pathText;

XmlCursor itemCursor = doc.newCursor().execQuery(queryText);
System.out.println(itemCursor.xmlText());
</PRE>
<P>上述代码在文档的开头创建一个新的光标。从那里，它使用 <SPAN class=langinline>XmlCursor</SPAN> 接口的 <SPAN class=langinline>execQuery</SPAN> 方法执行查询表达式。在本例中，该方法的参数是 XQuery 表达式，该表达式仅仅指出“从我当前的位置，在 <SPAN class=langinline>purchase-order</SPAN> 元素中导航，并检索值小于或等于 20.00 的那些 <SPAN class=langinline>line-item</SPAN> 元素”。<SPAN class=langinline>$this</SPAN> 变量意味着“当前的位置”。</P>
<P>有关 XQuery 的详细信息，请参阅 W3C 网站中的 <A href="http://www.w3.org/TR/xquery/" target=_blank><FONT color=#002c99>XQuery 1.0:An XML Query Language</FONT></A>。</P>
<H3>使用 XML 光标</H3>
<P>在前面的示例中，您可能已经注意到 <SPAN class=langinline><A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/java-class/com/bea/xml/XmlCursor.html"><FONT color=#002c99>XmlCursor</FONT></A></SPAN> 接口。除了提供一种执行 XQuery 表达式的方法外，XML 光标还提供一种用于操作数据的细粒度模型。XML 光标 API 与 DOM 的对象 API 类似，它只是一种指向特定数据块的方式。因此，就像光标有助于在字处理文档中导航一样，XML 光标则定义了 XML 中的一个位置，您可以在该位置对选定的 XML 执行操作。</P>
<P>当没有可用的 Schema 时，光标是一种在 XML 文档中移动的理想方法。一旦光标到达了您需要的位置，您就可以使用它执行各种操作。例如，可以设置和获取值、插入和删除 XML 的片段、将 XML 的片段复制到文档的其他部分，以及对 XML 文档进行其他细粒度更改。</P>
<P>下面的示例使用 XML 光标导航到 <SPAN class=langinline>customer</SPAN> 元素的 <SPAN class=langinline>name</SPAN> 子元素。</P><PRE>PurchaseOrderDocument doc = 
&nbsp;&nbsp;&nbsp;&nbsp;PurchaseOrderDocument.Factory.parse(po);

XmlCursor cursor = doc.newCursor();
cursor.toFirstContentToken();
cursor.toFirstChildElement();
cursor.toFirstChildElement();
System.out.println(cursor.getText());

cursor.dispose();
</PRE>
<P>上述代码执行了哪些操作呢？与前面的示例一样，代码加载 <SPAN class=langinline>File</SPAN> 对象中的 XML。加载文档之后，代码在它的起始位置处创建一个光标。移动光标几次，使它到达嵌套的 <SPAN class=langinline>name</SPAN> 元素。一旦光标到达该元素，getText 方法便会检索该元素的值。</P></DIV><img src ="http://www.blogjava.net/army666/aggbug/30943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/army666/" target="_blank">Parmy</a> 2006-02-16 11:12 <a href="http://www.blogjava.net/army666/archive/2006/02/16/30943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML 深入了解</title><link>http://www.blogjava.net/army666/archive/2006/02/16/30942.html</link><dc:creator>Parmy</dc:creator><author>Parmy</author><pubDate>Thu, 16 Feb 2006 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/army666/archive/2006/02/16/30942.html</guid><wfw:comment>http://www.blogjava.net/army666/comments/30942.html</wfw:comment><comments>http://www.blogjava.net/army666/archive/2006/02/16/30942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/army666/comments/commentRss/30942.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/army666/services/trackbacks/30942.html</trackback:ping><description><![CDATA[<H2>使用 Schema 访问 XML</H2>
<P>要大致了解 XMLBean 的各种功能，请看一个使用 XML 处理订购单的示例。订购单 XML 包含两方（如两个公司）交换的数据。两方需要能够依赖一致的消息形态，并通过 Schema 来指定共同点。</P>
<P>下面是订购单 XML 实例的可能外观。</P><PRE>&lt;po:purchase-order xmlns:po="http://openuri.org/easypo"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:customer&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:name&gt;Gladys Kravitz&lt;/po:name&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:address&gt;Anytown, PA&lt;/po:address&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/po:customer&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:date&gt;2003-01-07T14:16:00-05:00&lt;/po:date&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:line-item&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:description&gt;Burnham's Celestial Handbook, Vol 1&lt;/po:description&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:per-unit-ounces&gt;5&lt;/po:per-unit-ounces&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:price&gt;21.79&lt;/po:price&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:quantity&gt;2&lt;/po:quantity&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/po:line-item&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:line-item&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:description&gt;Burnham's Celestial Handbook, Vol 2&lt;/po:description&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:per-unit-ounces&gt;5&lt;/po:per-unit-ounces&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:price&gt;19.89&lt;/po:price&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:quantity&gt;2&lt;/po:quantity&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/po:line-item&gt;
&lt;po:shipper&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:name&gt;ZipShip&lt;/po:name&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;po:per-ounce-rate&gt;0.74&lt;/po:per-ounce-rate&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/po:shipper&gt;
&lt;/po:purchase-order&gt;</PRE>
<P>此 XML 包括一个根元素 <SPAN class=langinline>purchase-order</SPAN>，该元素具有三种类型的子元素：<SPAN class=langinline>customer</SPAN>、<SPAN class=langinline>date</SPAN>、<SPAN class=langinline>line-item</SPAN> 和 <SPAN class=langinline>shipper</SPAN>。此 XML 的一种直观的、基于对象的视图提供了一个表示 <SPAN class=langinline>purchase-order</SPAN> 元素的对象。该对象拥有一些方法，可以用于获取日期，以及 <SPAN class=langinline>customer</SPAN>、<SPAN class=langinline>line-item</SPAN> 和 <SPAN class=langinline>shipper</SPAN> 元素的从属对象。最后的三个元素每个也都有其自己的方法，可以用这些方法来获取其内部的数据。</P>
<H3>查看 Schema</H3>
<P>下面的 XML 是前面的订购单 XML 的 Schema。它定义了 XML 的“结构”，即它有哪些元素、它们的出现顺序、每一个元素都有哪些子元素等等。</P>
<DIV><PRE>&lt;xs:schema targetNamespace="http://openuri.org/easypo"
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:po="http://openuri.org/easypo"
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xs="http://www.w3.org/2001/XMLSchema"
&nbsp;&nbsp;&nbsp;&nbsp;elementFormDefault="qualified"&gt;
	
&lt;xs:element name="purchase-order"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:complexType&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:sequence&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="customer" type="po:customer"/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="date" type="xs:dateTime"/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="line-item" type="po:line-item" minOccurs="0" maxOccurs="unbounded"/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="shipper" type="po:shipper" minOccurs="0"/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:sequence&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:complexType&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:element&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:complexType name="customer"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:sequence&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="name" type="xs:string"/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="address" type="xs:string"/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:sequence&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:complexType&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:complexType name="line-item"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:sequence&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="description" type="xs:string"/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="per-unit-ounces" type="xs:decimal"/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="price" type="xs:double"/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="quantity" type="xs:int"/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:sequence&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:complexType&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:complexType name="shipper"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:sequence&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="name" type="xs:string"/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="per-ounce-rate" type="xs:decimal"/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:sequence&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:complexType&gt;
&lt;/xs:schema&gt;</PRE>
<DIV>
<P>此 Schema 通过定义下列内容来描述订购单 XML 实例：</P></DIV>
<UL>
<LI>
<DIV>三种复杂类型的定义：customer、line-item 和 shipper。它们是订购单元素的子元素所使用的类型。在 Schema 中，复杂类型用于定义可以具有子元素和特性的元素。嵌套在复杂类型中的顺序元素则列出其子元素。 </DIV>
<P>它们也是“全局”类型。它们之所以是全局类型，是因为它们位于 Schema 的顶级，也就是说，紧靠 <SPAN class=langinline>schema</SPAN> 根元素的下面。这意味着可以从 Schema 中的其他任何位置引用这些类型。</P></LI></UL></DIV>
<DIV>
<UL>
<LI>复杂类型中简单类型的使用。name、address 和 description 元素（以及其他元素）被当作简单类型。它们恰好也是“内置”类型。内置类型（本例中是具有“xs”前缀的类型）是 Schema 规范的一部分。（规范定义了 46 个内置类型。） 
<LI>名为 purchase-order 的全局元素。该元素定义中包含嵌套的复杂类型定义，以指定 purchase-order 元素的子元素。请注意，复杂类型中包含对该 Schema 中定义的其他复杂类型的引用。 </LI></UL>
<DIV></DIV>
<P>也就是说，Schema 定义了子元素的类型，并将它们的位置描述为根元素 <SPAN class=langinline>purchase-order</SPAN> 的从属元素。</P>
<P>使用 XMLBean 编译器编译类似该 Schema 的 XSD 文件时，将生成一个 JAR 文件，该文件会包含从该 Schema 生成的接口。</P></DIV><img src ="http://www.blogjava.net/army666/aggbug/30942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/army666/" target="_blank">Parmy</a> 2006-02-16 11:11 <a href="http://www.blogjava.net/army666/archive/2006/02/16/30942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XMLBean 概念</title><link>http://www.blogjava.net/army666/archive/2006/02/16/30941.html</link><dc:creator>Parmy</dc:creator><author>Parmy</author><pubDate>Thu, 16 Feb 2006 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/army666/archive/2006/02/16/30941.html</guid><wfw:comment>http://www.blogjava.net/army666/comments/30941.html</wfw:comment><comments>http://www.blogjava.net/army666/archive/2006/02/16/30941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/army666/comments/commentRss/30941.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/army666/services/trackbacks/30941.html</trackback:ping><description><![CDATA[<DIV id=topictext>
<P>XMLBean 提供了一种处理 XML 的直观方法，这种方法使您可以更轻松地访问和操作 Java 中的 XML 数据和文档。</P>
<P>XMLBean 处理 XML 的方法具有以下特征：</P></DIV>
<UL>
<LI>
<DIV>它提供了我们熟悉的、基于 Java 对象的 XML 数据视图，并且让您仍然能够访问原始的、纯 XML 结构。 </DIV>
<LI>
<DIV>XMLBean 不会使 XML 作为文档的完整性丢失。面向 XML 的 API 通常将 XML 拆开，以便绑定到它的各个部分。使用 XMLBean，可以将整个 XML 实例文档作为一个整体加以处理。XML 数据以 XML 的形式存储在内存中。这意味着保留了文档的顺序，以及原始的元素内容和空格。 </DIV>
<LI>
<DIV>使用通过 Schema 所生成的类型，可以通过与 JavaBean 类似的存取程序来访问 XML 实例，这个过程需要利用 get 和 set 方法。 </DIV>
<LI>
<DIV>从设计一开始就要考虑到 XML Schema，而 XMLBean 支持所有 XML Schema 定义。 </DIV>
<LI>访问 XML 的速度很快。 </LI></UL>
<DIV>
<P>XMLBean 的起点是 XML Schema。Schema（包含在 XSD 文件中）是 XML 文档，它定义了其他 XML 文档必须遵守的一组规则。XML Schema 规范提供了丰富的数据模型，使您可以表达复杂的结构，并对数据加以约束。例如，XML Schema 可以对文档中数据的顺序进行控制，或对特定的值加以约束（例如，生日必须大于 1900）。遗憾的是，在 Java 中，通常要编写自定义代码才能强制实施此类规则。XMLBean 遵守 Schema 约束。</P>
<P class=notepara><STRONG>注意：</STRONG> XML Schema 用于为 XML 文档定义规则，而 XML“实例”则是遵守该 Schema 的 XML 文档。</P>
<P>可以通过编译 Schema (XSD) 文件，来生成一组用来镜像该 Schema 的 Java 接口。使用这些类型，可以处理遵守该 Schema 的 XML 实例文档。可以将 XML 实例文档绑定到这些类型；通过 Java 接口所进行的更改会改变基本的 XML 表示。</P>
<P>以前在处理 XML 时可以选择使用 XML 编程接口（如 DOM 或 SAX），或 XML 编组/绑定工具（如 JAXB）。由于它缺乏很强的面向 Schema 的类型功能，因此在面向 DOM 的模型中导航时速度更加缓慢，并需要了解完整的对象模型。JAXB 支持 XML Schema 规范，但只能处理它的一个子集；而 XMLBean 支持它的全部。此外，通过将数据以 XML 的形式存储在内存中，XMLBean 能够减少编组和解除编组的开销。</P></DIV><img src ="http://www.blogjava.net/army666/aggbug/30941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/army666/" target="_blank">Parmy</a> 2006-02-16 11:10 <a href="http://www.blogjava.net/army666/archive/2006/02/16/30941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java连接数据库方法归档</title><link>http://www.blogjava.net/army666/archive/2006/02/14/30597.html</link><dc:creator>Parmy</dc:creator><author>Parmy</author><pubDate>Tue, 14 Feb 2006 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/army666/archive/2006/02/14/30597.html</guid><wfw:comment>http://www.blogjava.net/army666/comments/30597.html</wfw:comment><comments>http://www.blogjava.net/army666/archive/2006/02/14/30597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/army666/comments/commentRss/30597.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/army666/services/trackbacks/30597.html</trackback:ping><description><![CDATA[现在有好多初学jsp的网友经常会问数据库怎么连接啊，怎么老出错啊？所以我集中的在这写篇文章供大家参考，其实这种把数据库逻辑全部放在jsp里未必是好的做法，但是有利于初学者学习，所以我就这样做了，当大家学到一定程度的时候，可以考虑用MVC的模式开发。在练习这些代码的时候，你一定将jdbc的驱动程序放到服务器的类路径里，然后要在数据库里建一个表test,有两个字段比如为test1，test2，可以用下面SQL建 <BR>create table test(test1 varchar(20),test2 varchar(20) <BR>然后向这个表写入一条测试纪录 <BR>那么现在开始我们的jsp和数据库之旅吧。 <BR>一、jsp连接Oracle8/8i/9i数据库（用thin模式） <BR>testoracle.jsp如下： <BR>&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <BR>&lt;%@ page import="java.sql.*"%&gt; <BR>&lt;html&gt; <BR>&lt;body&gt; <BR>&lt;%Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); <BR>String url="jdbc:oracle:thin:@localhost:1521:orcl"; <BR>//orcl为你的数据库的SID <BR>String user="scott"; <BR>String password="tiger"; <BR>Connection conn= DriverManager.getConnection(url,user,password); <BR>Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <BR>String sql="select * from test"; <BR>ResultSet rs=stmt.executeQuery(sql); <BR>while(rs.next()) {%&gt; <BR>您的第一个字段内容为：&lt;%=rs.getString(1)%&gt; <BR>您的第二个字段内容为：&lt;%=rs.getString(2)%&gt; <BR>&lt;%}%&gt; <BR>&lt;%out.print("数据库操作成功，恭喜你");%&gt; <BR>&lt;%rs.close(); <BR>stmt.close(); <BR>conn.close(); <BR>%&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR>二、jsp连接Sql Server7.0/2000数据库 <BR>testsqlserver.jsp如下： <BR>&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <BR>&lt;%@ page import="java.sql.*"%&gt; <BR>&lt;html&gt; <BR>&lt;body&gt; <BR>&lt;%Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); <BR>String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"; <BR>//pubs为你的数据库的 <BR>String user="sa"; <BR>String password=""; <BR>Connection conn= DriverManager.getConnection(url,user,password); <BR>Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <BR>String sql="select * from test"; <BR>ResultSet rs=stmt.executeQuery(sql); <BR>while(rs.next()) {%&gt; <BR>您的第一个字段内容为：&lt;%=rs.getString(1)%&gt; <BR>您的第二个字段内容为：&lt;%=rs.getString(2)%&gt; <BR>&lt;%}%&gt; <BR>&lt;%out.print("数据库操作成功，恭喜你");%&gt; <BR>&lt;%rs.close(); <BR>stmt.close(); <BR>conn.close(); <BR>%&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR>三、jsp连接DB2数据库 <BR>testdb2.jsp如下： <BR>&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <BR>&lt;%@ page import="java.sql.*"%&gt; <BR>&lt;html&gt; <BR>&lt;body&gt; <BR>&lt;%Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); <BR>String url="jdbc:db2://localhost:5000/sample"; <BR>//sample为你的数据库名 <BR>String user="admin"; <BR>String password=""; <BR>Connection conn= DriverManager.getConnection(url,user,password); <BR>Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <BR>String sql="select * from test"; <BR>ResultSet rs=stmt.executeQuery(sql); <BR>while(rs.next()) {%&gt; <BR>您的第一个字段内容为：&lt;%=rs.getString(1)%&gt; <BR>您的第二个字段内容为：&lt;%=rs.getString(2)%&gt; <BR>&lt;%}%&gt; <BR>&lt;%out.print("数据库操作成功，恭喜你");%&gt; <BR>&lt;%rs.close(); <BR>stmt.close(); <BR>conn.close(); <BR>%&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR>四、jsp连接Informix数据库 <BR>testinformix.jsp如下： <BR>&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <BR>&lt;%@ page import="java.sql.*"%&gt; <BR>&lt;html&gt; <BR>&lt;body&gt; <BR>&lt;%Class.forName("com.informix.jdbc.IfxDriver").newInstance(); <BR>String url = <BR>"jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver; <BR>user=testuser;password=testpassword"; <BR>//testDB为你的数据库名 <BR>Connection conn= DriverManager.getConnection(url); <BR>Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <BR>String sql="select * from test"; <BR>ResultSet rs=stmt.executeQuery(sql); <BR>while(rs.next()) {%&gt; <BR>您的第一个字段内容为：&lt;%=rs.getString(1)%&gt; <BR>您的第二个字段内容为：&lt;%=rs.getString(2)%&gt; <BR>&lt;%}%&gt; <BR>&lt;%out.print("数据库操作成功，恭喜你");%&gt; <BR>&lt;%rs.close(); <BR>stmt.close(); <BR>conn.close(); <BR>%&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR>五、jsp连接Sybase数据库 <BR>testmysql.jsp如下： <BR>&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <BR>&lt;%@ page import="java.sql.*"%&gt; <BR>&lt;html&gt; <BR>&lt;body&gt; <BR>&lt;%Class.forName("com.sybase.jdbc.SybDriver").newInstance(); <BR>String url =" jdbc:sybase:Tds:localhost:5007/tsdata"; <BR>//tsdata为你的数据库名 <BR>Properties sysProps = System.getProperties(); <BR>SysProps.put("user","userid"); <BR>SysProps.put("password","user_password"); <BR>Connection conn= DriverManager.getConnection(url, SysProps); <BR>Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <BR>String sql="select * from test"; <BR>ResultSet rs=stmt.executeQuery(sql); <BR>while(rs.next()) {%&gt; <BR>您的第一个字段内容为：&lt;%=rs.getString(1)%&gt; <BR>您的第二个字段内容为：&lt;%=rs.getString(2)%&gt; <BR>&lt;%}%&gt; <BR>&lt;%out.print("数据库操作成功，恭喜你");%&gt; <BR>&lt;%rs.close(); <BR>stmt.close(); <BR>conn.close(); <BR>%&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR>六、jsp连接MySQL数据库 <BR>testmysql.jsp如下： <BR>&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <BR>&lt;%@ page import="java.sql.*"%&gt; <BR>&lt;html&gt; <BR>&lt;body&gt; <BR>&lt;%Class.forName("org.gjt.mm.mysql.Driver").newInstance(); <BR>String url ="jdbc:mysql://localhost/softforum?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1" <BR>//testDB为你的数据库名 <BR>Connection conn= DriverManager.getConnection(url); <BR>Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <BR>String sql="select * from test"; <BR>ResultSet rs=stmt.executeQuery(sql); <BR>while(rs.next()) {%&gt; <BR>您的第一个字段内容为：&lt;%=rs.getString(1)%&gt; <BR>您的第二个字段内容为：&lt;%=rs.getString(2)%&gt; <BR>&lt;%}%&gt; <BR>&lt;%out.print("数据库操作成功，恭喜你");%&gt; <BR>&lt;%rs.close(); <BR>stmt.close(); <BR>conn.close(); <BR>%&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <BR>七、jsp连接PostgreSQL数据库 <BR>testmysql.jsp如下： <BR>&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <BR>&lt;%@ page import="java.sql.*"%&gt; <BR>&lt;html&gt; <BR>&lt;body&gt; <BR>&lt;%Class.forName("org.postgresql.Driver").newInstance(); <BR>String url ="jdbc:postgresql://localhost/soft" <BR>//soft为你的数据库名 <BR>String user="myuser"; <BR>String password="mypassword"; <BR>Connection conn= DriverManager.getConnection(url,user,password); <BR>Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <BR>String sql="select * from test"; <BR>ResultSet rs=stmt.executeQuery(sql); <BR>while(rs.next()) {%&gt; <BR>您的第一个字段内容为：&lt;%=rs.getString(1)%&gt; <BR>您的第二个字段内容为：&lt;%=rs.getString(2)%&gt; <BR>&lt;%}%&gt; <BR>&lt;%out.print("数据库操作成功，恭喜你");%&gt; <BR>&lt;%rs.close(); <BR>stmt.close(); <BR>conn.close(); <BR>%&gt; <BR>&lt;/body&gt; <BR>&lt;/html&gt; <img src ="http://www.blogjava.net/army666/aggbug/30597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/army666/" target="_blank">Parmy</a> 2006-02-14 14:10 <a href="http://www.blogjava.net/army666/archive/2006/02/14/30597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebLogic workshop 在JSP中设计用户界面</title><link>http://www.blogjava.net/army666/archive/2005/12/31/26156.html</link><dc:creator>Parmy</dc:creator><author>Parmy</author><pubDate>Sat, 31 Dec 2005 02:03:00 GMT</pubDate><guid>http://www.blogjava.net/army666/archive/2005/12/31/26156.html</guid><wfw:comment>http://www.blogjava.net/army666/comments/26156.html</wfw:comment><comments>http://www.blogjava.net/army666/archive/2005/12/31/26156.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/army666/comments/commentRss/26156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/army666/services/trackbacks/26156.html</trackback:ping><description><![CDATA[<DIV id=topictitle>
<H1 class=Title>在 JSP 中设计用户界面</H1></DIV>
<DIV id=topictext>
<P>创建页面流时，WebLogic Workshop 提供各种标记库，您可以使用其中包含的标记设计 JSP。页面流向导生成的每个 JSP 文件都定义为包括引用标记库的 <SPAN class=langinline>&lt;% taglib...&gt;</SPAN> 语句。例如：</P><PRE>&lt;!--由 WebLogic Workshop 生成--&gt;
&lt;%@ page language="java" contentType="text/html;charset=UTF-8"%&gt;
&lt;%@ taglib uri="netui-tags-databinding.tld" prefix="netui-data"%&gt;
&lt;%@ taglib uri="netui-tags-html.tld" prefix="netui"%&gt;
&lt;%@ taglib uri="netui-tags-template.tld" prefix="netui-template"%&gt;
&lt;netui:html&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;head&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Web 应用程序页
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/title&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/head&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;body&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;p&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;新建 Web 应用程序页
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/p&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/body&gt;
&lt;/netui:html&gt;</PRE></DIV>
<DIV>
<P class=notepara><STRONG>注意</STRONG>：WebLogic Workshop 将 TLD 和 TLDX 库文件置于 Web 项目的 /WEB-INF 文件夹下。&nbsp;TLD 文件是 J2EE 标准标记库描述符文件。TLDX 文件是 WebLogic Workshop 的特定文件，包含有关标记在 IDE 中应如何起作用的信息。此信息包括显示、属性表单和其他信息。</P>
<P>在 IDE 中，如果 JSP 文件在设计视图或源代码视图中打开，则可以在选项板窗口中获取标记。例如：</P>
<P><IMG height=228 src="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/images/jspPaletteMinimized.gif" width=313></P>
<P>可以将这些标记从“选项板”窗口拖放到设计视图中。在某些情况下，会出现一个对话框窗口，允许您将操作分配给使用表单 Bean 的标记。例如：</P>
<P><IMG height=204 src="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/images/buttonDrop.gif" width=295></P>
<P class=notepara><STRONG>注意：</STRONG>在将标记图标从“选项板”窗格移动到“设计视图”画布时，您会注意到，在“设计视图”画布中，插入点是用垂直线显示的。请记住此插入点，因为它将决定标记代码在 JSP 中的初始位置。</P>
<P class=notepara>JSP 设计器是为开发人员设计的，开发人员需要快速汇编基于 NetUI、NetUI 数据绑定和 NetUI 模板标记的 JSP 页。作为一个开发人员，您可以创建这些页的初稿，并决定表单操作和其他上下文以将简单或复杂的数据显示给用户。在 JSP 设计器中，可以利用“放置向导”和（源代码视图中的）其他代码完成工具以协助开发工作。JSP 设计视图并不是设计用作完全的 JSP 图形编辑器，您可以切换到源代码视图以输入文本，或者使用您喜欢的 JSP 编辑产品来完成页，为显示添加更多润色。</P>
<P>本主题描述“NetUI”库和“NetUI 模板”库中的各种元素。这些库包含用于设计用户界面（如标签、单选按钮和链接）的典型组件。这些库中的许多组件，尤其是表单组件，允许您为用户提供数据或从用户引出数据。</P>
<P>此外，“NetUI 数据绑定”库包含用于向用户显示复杂数据的专用组件。NetUI 数据绑定标记另行<A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/guide/netui/guide/conComplexDataSets.html">在 JSP 中显示复杂数据集</A>中讨论。</P>
<P class=notepara><STRONG>注意</STRONG>：“选项板”窗口还提供一个称为“HTML”的标记库，该库包含几种标准 HTML 标记。这些 HTML 标记不具有可以与页面流运行时进行交互的特殊特性。</P></DIV>
<DIV>
<H2>NetUI 标记</H2>
<P>“选项板”窗口中的 NetUI 组件存储在 <SPAN class=langinline>netui-tag-html.tld</SPAN> 库中，此库是默认导入 JSP 的：</P>
<P class=codeblock>&lt;%@ taglib uri="netui-tags-html.tld" prefix="netui"%&gt;</P>
<P>将 NetUI 组件添加到 JSP 时，您会注意到组件名称的前缀为“netui”，例如：</P>
<P class=codeblock><FONT face="Courier New, Courier, mono">&lt;netui:button value="Start" action="letsGo" type="submit"/&gt;</FONT></P>
<P>下表总结了 NetUI 标记的常见用途。有关标记及其特性的详细描述，请参阅 <A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/reference/tags/navJspTags.html">JSP 标记引用</A>，也可以在源代码视图中将光标置于标记内部并按 <SPAN class=langinline>F1</SPAN> 键：</P>
<TABLE cellPadding=5 width="100%" border=1>
<TBODY>
<TR>
<TD><STRONG>标记的典型用途</STRONG></TD>
<TD><STRONG>标记名</STRONG></TD>
<TD><STRONG>概要</STRONG></TD></TR>
<TR>
<TD><STRONG>导航</STRONG></TD>
<TD>anchor</TD>
<TD>生成指向特定 URI 的 URL 编码超链接。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>imageAnchor</TD>
<TD>生成一个用 URL 编码的超链接，链接到指定 URI，此 URI 有一个作为正文包含进来的图像。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>button</TD>
<TD>生成名称是只读的按钮，通常用于重置或提交表单，或触发特定操作（如“signing out”）。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>imageButton</TD>
<TD>生成一个作为按钮的图像，包括图像的 URL 和（可选）悬停图像，通常用于提交表单。</TD></TR>
<TR>
<TD><STRONG>读/写数据</STRONG>（使用 dataSource、defaultValue 特性）</TD>
<TD>form</TD>
<TD>代表一个与表单 Bean 关联的输入表单，此表单 Bean 的属性与表单的各个字段相对应。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>checkBox</TD>
<TD>生成一个绑定到表单 Bean 属性的复选框。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>checkBoxGroup</TD>
<TD>对 CheckBoxOption 集合进行归组，并处理其值的数据绑定。有关示例，请参阅<A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/guide/netui/guide/conFlowViewBasics.html">页面流详细示例</A>。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>checkBoxOption</TD>
<TD>一个复选框，其状态由包含它的 checkBoxGroup 确定。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>hidden</TD>
<TD>生成隐藏表单字段。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>radioButtonGroup</TD>
<TD>对 RadioButtonOption 集合进行归组，并处理其值的数据绑定。有关示例，请参阅<A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/guide/netui/guide/conFlowViewBasics.html">页面流详细示例</A>。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>radioButtonOption</TD>
<TD>单选按钮，状态由包含它的 RadioButtonGroup 确定。</TD></TR>
<TR>
<TD height=41>&nbsp;</TD>
<TD>select</TD>
<TD>渲染下拉列表。有关示例，请参阅<A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/guide/netui/guide/conFlowViewBasics.html">页面流详细示例</A>。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>selectOption</TD>
<TD>选项，状态由包含它的 select 组件确定。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>textArea</TD>
<TD>渲染数据绑定的 TextArea。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>textBox</TD>
<TD>渲染数据绑定的 TextBox。</TD></TR>
<TR>
<TD height=58><STRONG>错误报告</STRONG></TD>
<TD>bindingUpdateErrors</TD>
<TD>开发时帮助标记，显示发送表单时发生的数据绑定更新错误的相关消息。这些消息显示在命令窗口中。默认情况下，此标记在服务器以生产模式运行时是禁用的。 </TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>error</TD>
<TD>使用给定错误键值渲染单个错误消息。有关详细信息，请参阅<A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/guide/netui/guide/conValidatingUserInput.html">验证用户输入</A>。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>errors</TD>
<TD>渲染发现的错误消息集。有关详细信息，请参阅<A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/guide/netui/guide/conValidatingUserInput.html">验证用户输入</A>。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>exceptions</TD>
<TD>渲染已格式化的异常消息。</TD></TR>
<TR>
<TD><STRONG>参数</STRONG></TD>
<TD>parameter</TD>
<TD>将 URL 参数写入其父标记中的 URL。有关示例，请参阅<A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/guide/netui/guide/conDatabindingXScript.html">在页面流中使用数据绑定</A>中的 <SPAN class=langinline>url</SPAN> 数据绑定上下文。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>parameterMap</TD>
<TD>将 URL 参数映射中的每个参数写入其父标记中的 URL。</TD></TR>
<TR>
<TD><STRONG>其他</STRONG></TD>
<TD>base</TD>
<TD>提供此页中每个 URL 的基。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>content</TD>
<TD>显示只读的标准或动态生成的文本。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>image</TD>
<TD>生成图像。 &nbsp;</TD></TR>
<TR>
<TD height=40>&nbsp;</TD>
<TD>label</TD>
<TD>根据数据绑定表达式或字面值生成样式化的只读文本。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>node</TD>
<TD>实例化 TreeNode 对象，该对象将要添加到父标记（树或其它节点）中。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>tree</TD>
<TD>渲染一个由 TreeNode 对象集代表的树控件。</TD></TR></TBODY></TABLE></DIV>
<DIV>
<H2>Netui 模板标记</H2>
<P>“选项板”窗口中的 NetUI 模板组件存储在 <SPAN class=langinline>netui-tag-template.tld</SPAN> 库中，此库是默认导入 JSP 的：</P>
<P class=codeblock>&lt;%@ taglib uri="netui-tags-template.tld" prefix="netui-template"%&gt;</P>
<P>将 NetUI 模板组件添加到 JSP 时，您会注意到组件名称的前缀为“netui-template”，例如：</P>
<P class=codeblock>&lt;netui-template:visible visible="true"&gt;Is Visible&lt;/netui-template:visible&gt;</P>
<P>此库中的标记通常用于定义地点模板。模板页是一个 JSP 页，用于定义一组页的总体外观及感觉。这是通过提供总体布局结构、样式和页面设计，并定义内容占位符完成的。这些占位符称为部分。内容页是一个包含内容的 JSP 页。内容页提供插入模板内容的各个部分。将内容页和模板页进行组合，可以创建内容的总体外观及感觉。模板的一大优势在于可以更改一组页的外观及感觉，而不必强制修改每个页。</P>
<P>NetUI 模板库定义了两类标记集。第一类用于在 JSP 模板页中定义占位符（这是内容页提供内容的地方）。第二类标记集用于内容页内部，可以指示要使用的模板和定义将要在模板内显示的内容。</P>
<P>下表总结了 NetUI 模板标记的常见用途。有关标记及其特性的详细描述，请参阅 <A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/reference/tags/navJspTags.html">JSP 标记引用</A>，也可以在源代码视图中将光标置于标记内部并按 <SPAN class=langinline>F1</SPAN> 键：</P>
<TABLE cellPadding=5 width="100%" border=1>
<TBODY>
<TR>
<TD width="26%"><STRONG>标记集</STRONG></TD>
<TD width="21%"><STRONG>标记名</STRONG></TD>
<TD width="53%"><STRONG>概要</STRONG></TD></TR>
<TR>
<TD><STRONG>模板页</STRONG></TD>
<TD>attribute</TD>
<TD>定义模板文件中的特性。与内容 JSP 中的 <SPAN class=langinline>setAttribute</SPAN> 联合使用。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>includeSection</TD>
<TD>定义模板文件中的一个部分，使用 <SPAN class=langinline>section</SPAN> 标记，内容 JSP 可以进一步填充此部分。</TD></TR>
<TR>
<TD><STRONG>内容页</STRONG></TD>
<TD>setAttribute</TD>
<TD>设置在模板文件中声明的特性的值。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>section</TD>
<TD>引用 <SPAN class=langinline>includeSection</SPAN> 并定义要包括的内容。</TD></TR>
<TR>
<TD>&nbsp;</TD>
<TD>template</TD>
<TD>指定要使用的模板。</TD></TR>
<TR>
<TD><STRONG>二者之一</STRONG></TD>
<TD>visibility</TD>
<TD>使一个部分可见或不可见。</TD></TR></TBODY></TABLE>
<P>要查看使用模板标记的样例应用程序，请转至下列页面流并检查 JSP 文件：</P></DIV>
<DIV>
<P><FONT face="Courier New, Courier, mono">&lt;WEBLOGIC_HOME&gt;\samples\workshop\SamplesApp\WebApp\simpleflow</FONT></P>
<P>另请参阅 template.jsp 和 header.jsp 文件，它们位于：</P>
<P><FONT face="Courier New, Courier, mono">&lt;WEBLOGIC_HOME&gt;\samples\workshop\SamplesApp\WebApp\resources\jsp</FONT></P></DIV><img src ="http://www.blogjava.net/army666/aggbug/26156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/army666/" target="_blank">Parmy</a> 2005-12-31 10:03 <a href="http://www.blogjava.net/army666/archive/2005/12/31/26156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebLogic Workshop  验证用户输入</title><link>http://www.blogjava.net/army666/archive/2005/12/30/26075.html</link><dc:creator>Parmy</dc:creator><author>Parmy</author><pubDate>Fri, 30 Dec 2005 08:02:00 GMT</pubDate><guid>http://www.blogjava.net/army666/archive/2005/12/30/26075.html</guid><wfw:comment>http://www.blogjava.net/army666/comments/26075.html</wfw:comment><comments>http://www.blogjava.net/army666/archive/2005/12/30/26075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/army666/comments/commentRss/26075.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/army666/services/trackbacks/26075.html</trackback:ping><description><![CDATA[<DIV id=topictitle>
<H1 class=Title>验证用户输入</H1></DIV>
<DIV id=topictext>
<P>在大多数情况下，当用户通过表单输入数据时，我们要确保输入的值有效，然后才能进行其他操作，例如将数据储存到数据库中或用于确定下一步操作。表单验证经常使用客户端 JavaScript 来完成。此方法在 WebLogic Workshop 中也适用。此外，服务器端的验证可在服务器端检查用户输入。后一方法的优点有：</P></DIV>
<UL>
<LI>
<DIV>不必依赖对其没有控制权的浏览器功能。</DIV>
<LI>
<DIV>可以使用控制器文件中的其他业务逻辑封装验证逻辑。 </DIV>
<LI>
<DIV>可以就在受影响表单字段旁的表单中显示错误消息，而无需弹出对话框。</DIV></LI></UL><BR>
<DIV>
<H2>客户端的验证</H2>
<P>WebLogic Workshop 为 <SPAN class=langinline>netui:form</SPAN> 标记及其表单字段提供了许多特性，例如，可以用来调用 JavaScript 的 <SPAN class=langinline>onClick</SPAN> 和 <SPAN class=langinline>onBlur</SPAN>。例如，可以有 <SPAN class=langinline>netui:textBox</SPAN> 标记，用户在其中输入他们的年龄：</P><PRE class=codeblock>&lt;netui:textBox dataSource="{actionForm.age}" onBlur="isValidAge()"/&gt;</PRE>
<P>这是 JavaScript 函数 <SPAN class=langinline>isValidAge</SPAN> 的示例，该函数在 <SPAN class=langinline>onBlur</SPAN> 特性中提到： </P><PRE class=codeblock>function isValidAge() {
&nbsp;&nbsp;&nbsp;if(document.forms[0].elements[1].value &lt;= 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Wrong Age');
}</PRE>
<P>当用户输入值并转到下一个表单字段后，<SPAN class=langinline>onBlur</SPAN> 特性会调用 JavaScript 函数 <SPAN class=langinline>isValidForm</SPAN>，当输入的年龄认为无效时，该函数将显示对话框。</P>
<P>请注意，在示例中是使用 JavaScript <SPAN class=langinline>forms</SPAN> 和 <SPAN class=langinline>elements</SPAN> 数组访问表单及其字段的。如果想使用各种字段的正确名称，需要使用 <SPAN class=langinline>tagID</SPAN> 特性以及 WebLogic Workshop JavaScript 函数 <SPAN class=langinline>getNetuiTagName</SPAN>。还需要用 <SPAN class=langinline>&lt;netui:html&gt;</SPAN> 替换 <SPAN class=langinline>&lt;html&gt;</SPAN> 标记。重写上一示例，代码将如下所示：</P><PRE class=codeblock>&lt;netui:html&gt;
     ...
     
&nbsp;&nbsp;&nbsp;&nbsp;&lt;netui:textBox tagId="age" dataSource="{actionForm.age}" onBlur="isValidAge();"/&gt;
     ...
&lt;/netui:html&gt;</PRE>
<P>而且这将是 JavaScript 函数 <SPAN class=langinline>isValidAge</SPAN>：</P><PRE class=codeblock>function isValidAge() {
&nbsp;&nbsp;&nbsp;if(<SPAN class=codeblock>document[getNetuiTagName("myForm")][getNetuiTagName("age")].value &lt;= 0</SPAN>)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Wrong Age');
}</PRE>
<P>请注意，我们使用 <SPAN class=langinline>getNetuiTagName</SPAN>（而不是 <SPAN class=langinline>elements[1]</SPAN>）来引用元素的 <SPAN class=langinline>tagID</SPAN>。也可以推导出，在整个样例中，<SPAN class=langinline>netui:form</SPAN> 标记包含 <SPAN class=langinline>tagID="myForm"</SPAN>（<SPAN class=langinline>netui:form</SPAN> 标记并没有实际显示在上述样例代码中）。</P>
<P>这些方法也可以与表单的提交操作一起使用。对于 <SPAN class=langinline>netui:button</SPAN> 和 <SPAN class=langinline>netui:imageButton</SPAN> 标记，可以通过标记的 <SPAN class=langinline>onClick</SPAN> 特性调用 JavaScript 函数，如下例所示：</P><PRE class=codeblock>&lt;netui:button value="submit" onClick="return isValidForm();" /&gt;</PRE>
<P>当用户单击按钮时，如果验证成功，JavaScript 函数 <SPAN class=langinline>isValidForm</SPAN> 会检查表单字段并返回 <SPAN class=langinline>true</SPAN>。或者，如果不是所有的输入值都正确，<SPAN class=langinline>isValidForm</SPAN> 函数显示带有错误消息的对话框，并返回 <SPAN class=langinline>false</SPAN>。（此功能的实现并没有实际显示在样例代码中。）</P>
<P>对于 <SPAN class=langinline>netui:anchor</SPAN> 和 <SPAN class=langinline>netui:imageAnchor</SPAN> 标记（两者的实现依赖于 JavaScript 提交表单），如果验证成功，JavaScript 验证函数必须包含其他代码以设置 JavaScript <SPAN class=langinline>Form</SPAN> 对象的 <SPAN class=langinline>method</SPAN> 和 <SPAN class=langinline>action</SPAN> 属性，并调用其 <SPAN class=langinline>submit</SPAN> 方法。下列示例（使用与上一示例相同的 <SPAN class=langinline>tagID</SPAN> 和 JavaScript 函数 <SPAN class=langinline>isValidForm</SPAN>）说明，当表单验证成功时如何设置各种属性并调用 <SPAN class=langinline>submit</SPAN> 方法： </P><PRE>function submitFromAnchor() {
&nbsp;&nbsp;&nbsp;&nbsp;document[getNetuiTagName("myForm")].method="POST";
&nbsp;&nbsp;&nbsp;&nbsp;document[getNetuiTagName("myForm")].action="/ClientSideValidation/thankYou.do";
&nbsp;&nbsp;&nbsp;&nbsp;if(isValidForm())
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document[getNetuiTagName("myForm")].submit();  
} </PRE>
<P>如示例所示，表单的 <SPAN class=langinline>method</SPAN> 属性必须设置为 POST。<SPAN class=langinline>action</SPAN> 属性必须设置为当用户单击定位点并提交表单时要调用的操作的全名。此操作名与 Web 应用程序名（后接 JPF 文件中的操作方法名）相对应，后接 <SPAN class=langinline>DO</SPAN> 扩展名。在示例中，Web 应用程序 ClientSideValidation 的页面流 JPF 文件包含操作方法 <SPAN class=langinline>thank You</SPAN>。</P>
<P>不使用 <SPAN class=langinline>getNetuiTagName</SPAN> 也可以编写相同的函数，如下例所示：</P><PRE>function submitFromAnchor() {
&nbsp;&nbsp;&nbsp;&nbsp;document.forms[0].method="POST";
&nbsp;&nbsp;&nbsp;&nbsp;document.forms[0].action="/ClientSideValidation/thankYou.do";
&nbsp;&nbsp;&nbsp;&nbsp;if(isValidForm())
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.forms[0].submit();  
}</PRE>
<P>最后，<SPAN class=langinline>netui:anchor</SPAN> 或 <SPAN class=langinline>netui:imageAnchor</SPAN> 标记必须调用 <SPAN class=langinline>onClick</SPAN> 特性中的 JavaScript 函数并添加“<SPAN class=langinline>return false;</SPAN>”，如下例所示：</P><PRE>&lt;netui:anchor onClick="submitFromAnchor(); return false;" action="thankYou"&gt;Submit&lt;/netui:anchor&gt; </PRE>
<P>如果没有添加表达式“<SPAN class=langinline>return false;</SPAN>”，将始终提交表单，且数据不会发布到表单 Bean。</P>
<H2>服务器端的验证</H2>
<P>WebLogic Workshop 提供两种完成服务端验证的方法，一种是在表单 Bean 中使用 Java 来实现 <SPAN class=langinline>validate</SPAN> 方法，另一种是使用 Struts <SPAN class=langinline>ValidatorPlugIn</SPAN> 进行基于 XML 的验证。这些示例会在 WebLogic Workshop 样例应用程序中显示，并在此处对其进行描述。要获得样例代码，请在下列安装位置开始：</P>
<P>&lt;WEBLOGIC_HOME&gt;/samples/workshop/SamplesApp/WebApp/validation/...</P>
<H3>基于 Java 的验证</H3>
<P>要使用表单 Bean 的 <SPAN class=langinline>validate</SPAN> 方法验证用户输入，请按照此列表中概述的步骤进行操作。请注意，这些示例来自下列样例页面流和相关文件：</P>
<P>&lt;WEBLOGIC_HOME&gt;/samples/workshop/SamplesApp/WebApp/validation/basic</P></DIV>
<UL>
<LI>
<DIV>将 <SPAN class=langinline>message-resources</SPAN> 标记添加到 JPF 文件中的控制器类，例如： </DIV><PRE class=codeblock>/**
* @jpf:controller nested="true"
<STRONG>&nbsp;* @jpf:message-resources resources="validation.basic.Messages"</STRONG>
 * <BR> */
public class Controller extends PageFlowController
{
...</PRE>
<P>资源文件位于 Web 项目的 /WEB-INF/classes/... 文件夹下，并具有 properties 扩展名。在上例中，Messages.properties 文件位于 /WEB-INF/classes/validation/basic。下文将描述此文件的内容。 </P>
<P><STRONG>注意：</STRONG>在示例中，请注意此处使用的对应命名要求。如果消息资源文件是 <SPAN class=langinline>&lt;project-root&gt;/WEB-INF/classes/validation/basic/Messages.properties</SPAN>，则在 <SPAN class=langinline>&lt;project-root&gt;/validation/basic/*.jpf</SPAN> 页面流批注中引用此文件的方法是 <SPAN class=langinline>@jpf:message-resources resources="validation.basic.Messages"</SPAN>。 </P>
<LI>将 <SPAN class=langinline>@jpf:validation-error-forward</SPAN> 批注添加到使用验证的操作。例如： <PRE class=codeblock> /**
* @jpf:action 
* @jpf:forward name="success" path="success.jsp"
<STRONG>  * @jpf:validation-error-forward name="failure" return-to="currentPage"</STRONG>
  */
public Forward submitForm( Form form )
  {
return new Forward( "success" );
  }</PRE>
<P>此批注提供灵活的机制，如果由于运行了批注的操作而出现表单验证错误，它可以指明应装载哪个页面或应运行哪个操作。有关详细信息，请参阅 <A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/javadoc-tag/jpf/Validation-Error-Forward.html" target=new>@jpf:validation-error-forward 批注</A>主题。 </P>
<P>下列流视图屏幕说明了此样例页面流中的操作和页面之间的关系。</P>
<P><IMG height=292 src="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/images/conValidationFlowView.gif" width=523></P>
<LI>将 <SPAN class=langinline>validate</SPAN> 方法添加到表单 Bean 类。此方法必须具有示例中给出的确切签名： <PRE class=codeblock>public ActionErrors validate( ActionMapping mapping, HttpServletRequest request )
{
<STRONG>    ActionErrors errs = new ActionErrors();</STRONG></PRE><PRE>    int at = _email.indexOf( '@' );
&nbsp;&nbsp;&nbsp;&nbsp;int dot = _email.lastIndexOf( '.' );</PRE><PRE>    if ( at == -1 || at == 0 || dot == -1 || at &gt; dot )
    {
<STRONG>       errs.add( "email", new ActionError( "badEmail" ) );</STRONG>
    }</PRE><PRE>    if ( _zipCode.length() != 5 )
    {
<STRONG>       errs.add( "zipCode", new ActionError( "badZip", new Integer( 5 ) ) );</STRONG>
    }</PRE><PRE>    return errs;
}</PRE>
<P>在 <SPAN class=langinline>validate</SPAN> 方法中，实现各种表单字段的验证逻辑。如果出现错误，请添加新的操作错误。在示例中，<SPAN class=langinline>zipCode</SPAN> 引用了 JSP (<SPAN class=langinline>&lt;netui:error value="zipCode"/&gt;</SPAN>) 中的 <SPAN class=langinline>netui:error</SPAN> 标记，<SPAN class=langinline>badZip</SPAN> 引用了 Messages.properties 文件中的消息密钥。请注意，<SPAN class=langinline>new Integer(5)</SPAN> 是错误字符串中的第一个替换对象。例如，在以后的描述中可以看到一个消息字符串： “The zip code has to be exactly {0} characters.”。这种情况下，<SPAN class=langinline>Integer(5)</SPAN> 对象将替换 <SPAN class=langinline>{0}</SPAN>。ActionErrors 支持最多带有四个附加替换对象的构造方法。</P>
<P>有关完整示例，请参阅&lt;WEBLOGIC_HOME&gt;/samples/workshop/SamplesApp/WebApp/validation/basic/Controller.jpf 中的页面流控制器类。</P>
<LI>在显示错误（通常是表单页面）的 JSP 文件中，添加 <SPAN class=langinline>netui:error</SPAN> 标记以显示错误消息。例如： <PRE class=codeblock>    &lt;netui:form action="submitForm"&gt;<BR>        &lt;table&gt;<BR>            &lt;tr&gt;<BR>                &lt;td&gt;&lt;p&gt;Enter E-mail Address:&lt;/p&gt;&lt;/td&gt;<BR>                &lt;td&gt;<BR>                    &lt;netui:textBox dataSource="{actionForm.email}"/&gt;<BR>                &lt;/td&gt;<BR>                &lt;td&gt;<BR>                    &lt;netui:error value="email"/&gt;<BR>                &lt;/td&gt;<BR>            &lt;/tr&gt;<BR>            <BR>            &lt;tr&gt;<BR>                &lt;td&gt;&lt;p&gt;Enter 5-digit Zip Code:&lt;/p&gt;&lt;/td&gt;<BR>                &lt;td&gt;<BR>                    &lt;netui:textBox dataSource="{actionForm.zipCode}"/&gt;<BR>                &lt;/td&gt;<BR>                &lt;td&gt;<BR>                    &lt;netui:error value="zipCode"/&gt;<BR>                &lt;/td&gt;<BR>            &lt;/tr&gt;<BR>        &lt;/table&gt;</PRE><PRE>        &lt;netui:button&gt;Submit&lt;/netui:button&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;netui:button action="exit"&gt;Exit&lt;/netui:button&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/netui:form&gt; </PRE>
<P>在示例中，将在相关表单字段旁显示错误。有关完整示例，请参阅&lt;WEBLOGIC_HOME&gt;/samples/workshop/SamplesApp/WebApp/validation/basic/formPage.jsp。 </P>
<LI>另外（或作为替代方法），可以将 <SPAN class=langinline>netui:errors</SPAN> 标记添加到 JSP (<SPAN class=langinline>&lt;netui:errors/&gt;</SPAN>)，例如在 JSP 底部。此标记将显示所有找到的错误概要。 
<LI>当在 JSP 中显示错误时，资源文件包含实际的错误消息和要应用的任何专用 HTML 格式。请记住，此文件位于 <SPAN class=langinline>/WEB-INF/classes/...</SPAN> 下，并具有 properties 扩展名。在此示例中，Messages.properties 文件位于 <SPAN class=langinline>/WEB-INF/classes/validation/basic中。</SPAN> <PRE class=codeblock>badEmail=Bad email address.
badZip=The zip code has to be exactly {0} characters.</PRE><PRE>errors.header=&lt;br&gt;&lt;hr&gt;&lt;font color="Blue"&gt;List of errors, using the &amp;lt;netui:error&amp;gt; tag:&lt;ul&gt;
errors.prefix=&lt;li&gt;
errors.suffix=
errors.footer=&lt;/ul&gt;&lt;/font&gt;</PRE><PRE>error.prefix=&lt;font color="Red"&gt;
error.suffix=&lt;/font&gt;</PRE>
<P>请注意，在示例中，当输入不正确的 <SPAN class=langinline>zipCode</SPAN> 时，<SPAN class=langinline>badZip</SPAN> 是需要显示的错误消息的消息密钥。文件中的其他行创建 <SPAN class=langinline>netui:error</SPAN> 和 <SPAN class=langinline>netui:errors </SPAN>标记的格式，以便单个错误消息用红色显示，错误概要用蓝色显示为一个列表，前加标头“List of errors, using the &lt;netui:error&gt; tag:”。</P></LI></UL>
<DIV>
<H3>基于 XML 的验证</H3>
<DIV id=topictext>
<P>要使用 Struts <SPAN class=langinline>ValidatorPlugIn</SPAN> 验证用户输入，请按照此列表中概述的步骤进行操作。请注意，这些示例来自下列样例页面流和相关文件：</P>
<P>&lt;WEBLOGIC_HOME&gt;/samples/workshop/SamplesApp/WebApp/validation/validator</P></DIV>
<UL>
<LI>
<DIV>将 <SPAN class=langinline>message-resources</SPAN> 和 <SPAN class=langinline>struts-merge</SPAN> 批注添加到 JPF 文件中的控制器类。例如：</DIV><PRE class=codeblock>/**
<STRONG> * @jpf:controller nested="true" struts-merge="/WEB-INF/strutsValidator-merge-config.xml"
* @jpf:message-resources resources="validation.validator.Messages"    </STRONG>      
 * 
 */
public class Controller extends PageFlowController
{ <BR>...</PRE>
<P><SPAN class=langinline>@jpf:controller</SPAN> 批注的 <SPAN class=langinline>struts-merge</SPAN> 特性会标识将使用的 Struts 合并文件。此 Struts 合并文件将指向 Struts <SPAN class=langinline>ValidatorPlugIn</SPAN> 及其规则。以后会在此列表中对合并文件进行描述。 </P>
<P>资源文件也位于 Web 项目的 /WEB-INF/classes/... 文件夹下，并具有 properties 扩展名。在上例中，Messages.properties 文件位于 /WEB-INF/classes/validation/validator。请注意此处使用的对应命名要求。如果消息资源文件是 <SPAN class=langinline>&lt;project-root&gt;/WEB-INF/classes/validation/validator/Messages.properties</SPAN>，则在 <SPAN class=langinline>&lt;project-root&gt;/validation/validaor/*.jpf</SPAN> 页面流批注中引用此文件的方法是 <SPAN class=langinline>@jpf:message-resources resources="validation.basic.Messages"</SPAN>。 </P></LI></UL></DIV>
<DIV>
<UL>
<LI>
<DIV>将 <SPAN class=langinline>@jpf:validation-error-forward</SPAN> 批注添加到使用验证的操作。例如：</DIV><PRE class=codeblock><BR>/**
* @jpf:action 
<STRONG> * @jpf:validation-error-forward name="failure" return-to="currentPage"</STRONG>
* @jpf:forward name="success" path="success.jsp"
 */
public Forward submitForm( MyForm form ) 
{
return new Forward( "success" );
}</PRE>
<P>此批注提供灵活的机制，如果由于运行了批注的操作而出现表单验证错误，它可以指明应装载哪个页面或应运行哪个操作。有关详细信息，请参阅 <A href="http://dev2dev.bea.com.cn/download/school/workshop/WorkshopCNHelp/doc/zh/workshop/javadoc-tag/jpf/Validation-Error-Forward.html" target=new>@jpf:validation-error-forward 批注</A>主题。 </P>
<LI>在页面流中，修改表单 Bean 定义以扩展 Struts 的 ValidatorForm 界面： <PRE class=codeblock> public static class MyForm extends org.apache.struts.validator.ValidatorForm<BR> { <BR> ...</PRE>有关此表单 Bean 类的完整示例，请参阅 &lt;WEBLOGIC_HOME&gt;/samples/workshop/SamplesApp/WebApp/validation/validator/Controller.jpf。 
<LI>在显示错误（通常是表单页面）的 JSP 文件中，添加 <SPAN class=langinline>netui:error</SPAN> 标记以显示错误消息： <PRE class=codeblock>    &lt;netui:form action="submitForm"&gt;<BR>        &lt;table&gt;<BR>            &lt;tr&gt;<BR>                &lt;td&gt;&lt;p&gt;Enter E-mail Address:&lt;/p&gt;&lt;/td&gt;<BR>                &lt;td&gt;<BR>                    &lt;netui:textBox dataSource="{actionForm.email}"/&gt;<BR>                &lt;/td&gt;<BR>                &lt;td&gt;<BR>                    &lt;netui:error value="email"/&gt;<BR>                &lt;/td&gt;<BR>            &lt;/tr&gt;<BR>            <BR>            &lt;tr&gt;<BR>                &lt;td&gt;&lt;p&gt;Enter Age:&lt;/p&gt;&lt;/td&gt;<BR>                &lt;td&gt;<BR>                    &lt;netui:textBox dataSource="{actionForm.age}"/&gt;<BR>                &lt;/td&gt;<BR>                &lt;td&gt;<BR>                    &lt;netui:error value="age"/&gt;<BR>                &lt;/td&gt;<BR>            &lt;/tr&gt;<BR>        &lt;/table&gt;</PRE><PRE>        &lt;netui:button&gt;Submit&lt;/netui:button&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;netui:button action="exit"&gt;Exit&lt;/netui:button&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/netui:form&gt; </PRE>
<P>在示例中，将在相关表单字段旁显示错误。有关完整示例，请参阅&lt;WEBLOGIC_HOME&gt;/samples/workshop/SamplesApp/WebApp/validation/validaor/formPage.jsp。 </P>
<LI>另外（或作为替代方法），可以将 netui:errors 标记添加到 JSP (<SPAN class=langinline>&lt;netui:errors/&gt;</SPAN>)，例如在 JSP 底部。此标记将显示所有找到的错误列表。 
<LI>定义 struts-merge 文件以指向 Struts 的默认可插接验证器定义文件 validator-rules.xml，以及包含此特定表单的实际验证规则的 XML 文件。在示例中，合并文件 strutsValidator-merge-config.xml 定义如下。可以在下列位置找到此合并文件： 
<P>&lt;WEBLOGIC_HOME&gt;/samples/workshop/SamplesApp/WebApp/WEB-INF</P><PRE class=codeblock>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<BR>&lt;!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" <BR>  "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"&gt;</PRE><PRE>&lt;struts-config&gt;
&nbsp;&nbsp;&nbsp;&lt;form-bean/&gt;
&nbsp;&nbsp;&nbsp;&lt;global-exceptions/&gt;
&nbsp;&nbsp;&nbsp;&lt;global-forwards/&gt;
&nbsp;&nbsp;&nbsp;&lt;action-mappings&gt;
&nbsp;&nbsp;&nbsp;&lt;/action-mappings&gt;</PRE><PRE> &lt;plug-in className="org.apache.struts.validator.ValidatorPlugIn"&gt;
&nbsp;&nbsp;&nbsp;&lt;set-property property="pathnames"
&nbsp;&nbsp;&nbsp;value="/WEB-INF/validator-rules.xml,/WEB-INF/strutsValidator-validation.xml"/&gt;
&nbsp;&lt;/plug-in&gt;</PRE><PRE>&lt;/struts-config&gt;</PRE><BR>默认可插接验证器定义包含在 validator-rules.xml 文件中，该文件位于 <SPAN class=langinline>WEB-INF</SPAN> 中。实际的表单验证规则应在单独的文件中定义。在示例中，该文件称为 strutsValidator-validation.xml，它也位于 /WEB-INF 中。下面将描述此文件。 </LI></UL></DIV>
<DIV>
<UL>
<LI>在 strutsValidator-validation.xml 文件中，使用默认验证器定义实现实际的表单验证。例如： <PRE class=codeblock>&lt;form-validation&gt;<BR>    &lt;formset&gt;<BR>        &lt;form name="myForm"&gt;<BR>            &lt;field property="email" depends="required"&gt;<BR>                &lt;arg0 key="email.displayName"/&gt;<BR>            &lt;/field&gt;<BR>            &lt;field property="age" depends="required,integer"&gt;<BR>                &lt;arg0 key="age.displayName"/&gt;<BR>            &lt;/field&gt;<BR>        &lt;/form&gt;<BR>    &lt;/formset&gt;  <BR>&lt;/form-validation&gt;</PRE>
<LI>当在 JSP 文件中显示错误时，资源文件包含实际的错误消息和要应用的任何专用 HTML 格式。请记住，此文件位于 WEB-INF/classes/... 下，并具有 <SPAN class=langinline>properties</SPAN> 扩展名。在此示例中，Messages.properties 文件位于 <SPAN class=langinline>/WEB-INF/classes/validation/validator 中。</SPAN> <PRE class=codeblock>errors.header=&lt;br&gt;&lt;hr&gt;&lt;font color="Blue"&gt;List of errors, using the &amp;lt;netui:error&amp;gt; tag:&lt;ul&gt;<BR>errors.prefix=&lt;li&gt;<BR>errors.suffix=<BR>errors.footer=&lt;/ul&gt;&lt;/font&gt;</PRE><PRE>error.prefix=&lt;font color="Red"&gt;
error.suffix=&lt;/font&gt;</PRE><PRE>errors.required={0} is required.
errors.integer={0} must be an integer.</PRE><PRE>email.displayName=The email address 
age.displayName=The age</PRE>
<P>请注意，在示例中，<SPAN class=langinline>email.displayName</SPAN> 描述表单字段名，而 <SPAN class=langinline>errors.required</SPAN> 描述用于缺少（但必需）表单字段项的错误消息。如果用户没有键入电子邮件地址，则出现的错误消息将是“The email address is required”。文件中的其他行创建 <SPAN class=langinline>netui:error</SPAN> 和 <SPAN class=langinline>netui:errors</SPAN> 标记的格式，以便单个错误消息用红色显示，错误概要用蓝色显示为一个列表，前加标头“List of errors, using &lt;netui:error&gt; tag:”。</P></LI></UL></DIV><img src ="http://www.blogjava.net/army666/aggbug/26075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/army666/" target="_blank">Parmy</a> 2005-12-30 16:02 <a href="http://www.blogjava.net/army666/archive/2005/12/30/26075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初次认识java.</title><link>http://www.blogjava.net/army666/archive/2005/12/29/25850.html</link><dc:creator>Parmy</dc:creator><author>Parmy</author><pubDate>Thu, 29 Dec 2005 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/army666/archive/2005/12/29/25850.html</guid><wfw:comment>http://www.blogjava.net/army666/comments/25850.html</wfw:comment><comments>http://www.blogjava.net/army666/archive/2005/12/29/25850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/army666/comments/commentRss/25850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/army666/services/trackbacks/25850.html</trackback:ping><description><![CDATA[<P><SPAN id=LblContent><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>第一次使用Java博客，没有什么好写的，转载了一篇关于java的基础知识的认识。<BR><BR><BR><BR>以下是Java标准技术的一些要点： <BR>一、Java的跨平台性，即一次编译到处运行 简单地说Java的跨平台性就是指，编译后的Java程序可直接在不同的平台上运行而不用重新编译，这一特性使得Java随着Web应用的普及而迅速普及起来。而Java的跨平台性是如何实现的呢？这就要理解Java虚拟机和字节码的概念。 　　实际上，编译后的Java代码并不是传统的二进制代码（如Windows下的.exe文件），而是Java字节码，这种字节码文件是不能直接在操作系统上执行的。要想在一个操作系统上运行一个Java程序必须有一个中间环节来负责将Java字节码解释成二进制码，这个中间环节就是Java虚拟机（简称JVM)。由于目前大多数操作系统已经实现了JVM，所以Java轻松实现跨平台性。 　　<BR>二、面象对象技术&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java全面支持面象对象技术，这体现在Class（类）是Java程序构成的基本单元，一个Java程序通常由许多Class组成，而且这些Class还会有一定的继承关系，Java支持Class的单继承，从而使类之间的继承关系更明确。继承的结果产生类的多态性，类的多态本质上讲就是可以用父类的引用访问继承类的实现（子类对象），类的这种多态性最终形成了组件对象模型的基础，即通过接口（父类）访问实现（子类）。 　　<BR>三、Java中的I/O操作 　　Java中以字节流（InputStream和OutputStream)、节符流（Reader和Writer)来分别读写二进制数据和字符数据，使用非常简单有效。Java类库中的File类不仅提供文件操作而且还包含文件夹操作，如下面这几行代码可以列出C盘根目录下的所有文件： File f=new File("c://"; String [] m_dir= f.list(); for(int i=0;i&lt;m_dir.length;i++) System.out.println(m_dir); <BR>四、Java中的图形及事件处理 可以用awt包或swing包的Java类来进行大部分的Java图形界面设计，下面的几行代码将产生一个200*200像素的窗体： Frame f=new Frame("Welcome"; f.setSize(200,200); f.setVisible(true); 默认情况下，Frame窗体的关闭按钮不起作用，这也是Java初学者迷惑的地方。为了使用户按下关闭按钮时能关闭Frame窗体，需要让这个窗体响应一个WindowEvent事件，具体的做法就是给这个窗体添加一个事件监听器对象，这个事件监听器就是WindowListener接口的实现。在上面的代码中插入如下代码就可以关闭窗体： f.addWindowListener(new WindowAdapter(){ ??public void windowClosing(WindowEvent e){ System.exit(0); ??} } 这里用到一个无名内部类，无名内部类是Java中内部类的一种灵活运用方式。 <BR>五、Java中线程及同步控制 线程概念的引入是为了实现并行处理，从而提高程序的效率。Java中的线程实现非常简单，可以用两种方式来创建线程，一种是实现Runnable接口，另一种是继承Thread类重写run()方法。两种方式唯一的不同就是前者保留了继承一个类的可能（因为Java只支持类的单继承，但接口没有此限制）。 　　永远都用start()方法来启动一个线程，线程类中的run()可以被直接调用，但决不是启动一个线程，二者有着本质的区别。 　　用同步控制关键字synchronized来保护线程敏感数据，synchronized块中的内容可以保证同一时刻只能被一个线程访问，所以其中的数据是线程安全的。 　　用Object类中的wait()和notify()方法可以实现线程间交互，但要记住wait()和notify()方法只有发生在同一个对象上才能真正实现线程间交互。被某一对象wait()方法阻塞的线程需要另外一个调用了同一对象notify()的线程干预才能恢复运行。notify()方法一次唤醒一个被wait()方法阻塞的线程，notifyAll()方法可以一次唤醒所有被wait()方法阻塞的线程。 　　<BR>六、Java本地方法（native方法）的实现 　　Java不是完美的，Java的不足除了体现在运行速度上要比传统的C++慢许多之外，Java无法直接访问到操作系统底层（如系统硬件等)，为此Java使用native方法来扩展Java程序的功能。 　　可以将native方法比作Java程序同Ｃ程序的接口，<BR>其实现步骤： 　　<BR>１、在Java中声明native()方法，然后编译； 　　<BR>２、用javah产生一个.h文件； 　　<BR>３、写一个.cpp文件实现native导出方法，其中需要包含第二步产生的.h文件（注意其中又包含了JDK带的jni.h文件）； 　　<BR>４、将第三步的.cpp文件编译成动态链接库文件； 　　<BR>５、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件，这个native()方法就可以在Java中被访问了。 　　<BR>上述所提及的一些Java技术具有一定的普遍性，它们基本上是在Java各个方面的运用中都需要掌握的术。实际上Java的运用非常广泛，而且每个方面都需要遵循不同的规范。以下是对Java应用的简要介绍。 <BR>（一）理解Java SDK的三个版本： Java SDK Micro Edition (J2ME) 用于开发掌上电脑、手机等移动通信设备上使用的应用程序。并不是所有的移动设备都支持Java，只有具备J2ME运行环境（JVM+J2ME API)的设备才能运行Java程序。J2ME的集成开发工具（通常都有带有一些访真器）有 Sun 的J2ME Wireless Toolkit 、IBM的Visul Age Micro Edition 等。 Java SDK Standard Edition（J2SE) 主要用于开发一般台式机应用程序。我们平时所说的JDK就指J2SE，而我们学Java就是从学习J2SE开始的。 Java SDK Enterprise Edition (J2EE) 用于开发分布式的企业级大型应用程序。其中的核心是Entetprise Java Beans（EJB，分布式Java组件）的开发。 <BR>（二）Java小程序 （Applet) Java小程序是一个继承了Applet类并重写了init()、paint()、stop()等方法的的Java类，它被布署在Web服务器（如IIS）上，当客户端请求Web页时，浏览器从Web服务器上将其下载到本地客户端，然后，浏览器创建该Applet类的实例并调用其init()方法，从安全角度考虑，Applet没有访问本地文件的权限。由于Applet是被浏览器执行的，所以Applet不需要一个main()方法。实际上，除了Java Application之外，所有其它Java应用都不需要一个main()方法。 <BR>（三）服务器端Java小程序 （Servlet） Servlet也是一个Java类，和Applet形成对比，Servlet是运行于服务器端的Java小程序，而且Servlet需要一个单独的Web服务器（如Tomcat）做容器。除此之外，Servlet中用到的一些类（如HttpServlet)并不包含在J2SE API中，所以需要将Servlet.jar（在Tomcat的common\lib文件夹下）加到环境变量中去。下面是一个简单的Servlet例子： <BR>public class Myservlet extends HttpServlet{ ??public void doGet(HttpServletRequest request,HttpServletResponse response) { ??try{ response.setContentType("text/html"; PrintWriter out=response.getWriter(); out.println("&lt;html&gt;"); out.println("&lt;body&gt;"); out.println("Hello world"); out.println("&lt;/body&gt;"); out.println("&lt;/html&gt;"); ??}catch(IOException e){} } } 将这个Class文件编译后放至Tomcat\webapps\examples\WEB-INF\classes下，然后在浏览器地址栏里输入http://127.0.0.1:8080/examples/servlet/Myservlet即可看到 Hello world出现在浏览器中。 <BR>（四）Java Server Page （JSP） 同Servlet相似的是，JSP运行于Web服务器端，并且也需要Tomcat之类的容器。不同的是，由于JSP是将Java代码嵌在html标记里（同ASP一样用&lt;% ...%&gt;)，JSP的界面设计同后台开发人员的工作可以有效分离。可以想像让开发人员用Servlet写一个花捎的Web页面有多困难，所以JSP+Servlet混合Web应用是比较理想的选择。 看起来JSP同ASP的实现机制大同小异，其实也存在着本质的区别。所有的ASP页面都是解释运行的，而JSP页在第一次被请求时会被编译，再以后的客户请求都是直接运行服务器上的.class文件（在Tomcat的Work文件夹下），所以JSP要比ASP速度上快许多。 <BR>（五）Java Beans Java Bean 是可复用的组件，对Java Bean并没有严格的规范，理论上讲，任何一个Java类都可以是一个Bean。但通常情况下，由于Java Bean是被容器所创建（如Tomcat)的，所以Java Bean应具有一个无参的构造器，另外，通常Java Bean还要实现Serializable接口用于实现Bean的持久性。 <BR>（六）Enterprise Java Beans （EJB） Java Bean实际上相当于微软COM模型中的本地进程内COM组件，它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM，即分布式组件。它是基于Java的远程方法调用（RMI）技术的，所以EJB可以被远程访问（跨进程、跨计算机）。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中，EJB客户从不直接访问真正的EJB组件，而是通过其容器访问。EJB容器是EJB组件的代理，EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。 这种模型很像COM+管理器，其实EJB容器正是起到COM+管理器的作用，只是EJB组件相对COM组件来说更易用、更安全。 总的说来，Java作为面象对象技术的一个代表，在当今商业应用中更容易开发出高效的、多层的分布式应用程序，而且，由于Java技术有很强的健壮性和易用性，加上同UML应用的结合，开发一个商业应用软件的周期会大大缩短，所以Java会有不错的前景。</FONT></SPAN></P><img src ="http://www.blogjava.net/army666/aggbug/25850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/army666/" target="_blank">Parmy</a> 2005-12-29 11:01 <a href="http://www.blogjava.net/army666/archive/2005/12/29/25850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>