﻿<?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>IT博客-mordecai-文章分类-jsp</title><link>http://www.cnitblog.com/mordecai/category/6059.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 01 Oct 2011 07:57:54 GMT</lastBuildDate><pubDate>Sat, 01 Oct 2011 07:57:54 GMT</pubDate><ttl>60</ttl><item><title>JSP程序员成长之路</title><link>http://www.cnitblog.com/mordecai/articles/34029.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Wed, 26 Sep 2007 00:00:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/34029.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/34029.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/34029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/34029.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/34029.html</trackback:ping><description><![CDATA[<p><font face="Times New Roman">一：说明<br>在本文章中使用精通、熟练、熟悉、了解标志你对某技术的掌握程度。<br>精通:能够掌握此技术的85%技术要点以上，使用此技术时间超过两年，并使用此<br>技术成功实施5个以上的项目。能使用此技术优化性能或代码，做到最大可能的重用。<br>熟练：能够掌握此技术的60%技术要点以上，使用此技术时间超过一年，并使用此<br>技术成功实施3个以上的项目。能使用此技术实现软件需求并有经验的积累在实现之前<br>能做优化设计尽可能的实现模块或代码的重用。<br>熟悉：能够掌握此技术的50%技术要点以上，使用此技术时间超过半年上，并使用此<br>技术成功实施1个以上的项目。能使用此技术实现软件需求。<br>了解：可以在实际需要时参考技术文档或帮助文件满足你的需要，基本知道此项技术在<br>你运用是所起的作用，能够调用或者使用其根据规定提供给你的调用方式。<br>二：基本要求<br>1:html 掌握程度：熟练。原因：不会html你可能写JSP?<br>2:javascript/jscript:掌握程度：熟悉。原因：client端的数据校验、一些页面处理需要你使用脚本。<br>3:css 掌握程度：熟悉。原因：实现页面风格的统一通常会使用css去实现。<br>4:java基础编程 掌握程度：熟练。原因：不会java你能写JSP?开玩笑吧。还有你必须非常熟悉以下几个包java.lang;java.io;java.sql;java.util;java.text;javax.sevrlet;<br>javax.servlet.http; javax.mail;等。<br>5:sql 掌握程度：熟练。原因：如果你不使用数据库的话你也许不需要掌握sql。同时你必须对以下几种数据库中的一种以上的sql比较熟悉。Oracle,DB2,Mysql,Postgresql.<br>6:xml 掌握程度：了解 原因：AppServer的配置一般是使用XML来实现的。<br>7:ejb 掌握程度：了解 原因：很多项目中商业逻辑是由ejb来实现的，所以呢。。。<br>8:以下几种AppServer(engnier) 你需要了解一个以上。<br>a:)Tomcat <br>b:)WebLogic<br>c:)WebSphere<br>d:)JRun<br>e:)Resin<br>原因：你的jsp跑在什么上面啊？</font></p>
<p><font face="Times New Roman">三：选择要求(因项目而定)<br>1:LDAP 掌握程度：了解 原因：LADP越来越多的运用在权限控制上面。<br>2:Struts 掌握程度：熟练 原因：如果符合MVC设计通常会使用Struts实现C。<br>3:Xsp 掌握程度：根据需要而定很多时候是不使用的，但在不需要使用ejb但<br>jsp+servlet+bean实现不了的时候Xsp是一个非常不错的选择。<br>4:Linux 掌握程度：熟悉 原因：如果你的运用跑在Linux/Unix上你最少要知道<br>rm ,mv,cp,vi,tar gzip/gunzip 是用来做什么的吧。<br>四：工具的使用<br>1:UltraEdit(EditPlus)+jakarta-ant+jakarta-log4j;<br>2:Jubilder4-6<br>3:Visual Age For Java<br>4:VCafe<br>以上的工具你选择你自己熟悉的吧。不过强烈建议你用log4j做调试工具。</font></p>
<p><font face="Times New Roman">五：成长之路<br>1:html 学习时间，如果你的智商在80以上，15天时间应该够用了。至少你能手写出一个页面来。<br>2:jacascript/jscript学习时间，这真的不好说，比较深奥的东西，够用的话一个礼拜可以学写皮毛。<br>3:css 学习时间,三天的时间你应该知道如何使用css了，不要求你写，一般是美工来写css。<br>4:java 学习时间，天才也的三个月吧。慢满学吧。如果要精通，那我不知道需要多少时间了。用来写<br>jsp,四个月应该够了。</font></p>
<p><font face="Times New Roman">5:sql 学习时间，只需要知道insert ,delete ,update ,select,create/drop table的话一天你应该知道了。<br>6:xml 学习时间，我不知道我还没有学会呢。呵呵。不过我知道DTD是用来做什么的。<br>7:ejb 学习时间，基本的调用看3天你会调用了。不过是建立在你学会java的基础上的。<br>8:熟悉AppServer,Tomcat四天你可以掌握安装，配置。把jsp跑起来了。如果是WebLogic也够了，但要使用ejb那不关你的事情吧。SA做什么去了。<br>9:熟悉Linux那可得需要不少时间。慢慢看man吧。<br>10：Struts如果需要你再学习。</font></p>
<br><img src ="http://www.cnitblog.com/mordecai/aggbug/34029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-09-26 08:00 <a href="http://www.cnitblog.com/mordecai/articles/34029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse常用快捷键</title><link>http://www.cnitblog.com/mordecai/articles/33940.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Sun, 23 Sep 2007 19:35:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/33940.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/33940.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/33940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/33940.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/33940.html</trackback:ping><description><![CDATA[<div id="article">
<p><font face="Verdana">Template：Alt + .<br></font><font face="Verdana">&nbsp;&nbsp;&nbsp; 修改处：Window-&gt;Preference-&gt;Workbench-&gt;Keys-&gt;Command-&gt;Edit-&gt;Content Assist.</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 个人习惯：Shift+SPACE（空白）。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 简易说明：编辑程序代码时，打sysout +Template启动键，就会自动出现：System.out.println（）； .</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 设定Template的格式：窗口-&gt;喜好设定-&gt;Java-&gt;编辑器-&gt;模板。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 程序代码自动排版：Ctrl+Shift+F</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 修改处：窗口-&gt;喜好设定-&gt;工作台-&gt;按键-&gt;程序代码-&gt;格式。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 个人习惯：Alt+Z.</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 自动排版设定：窗口-&gt;喜好设定-&gt;Java-&gt;程序代码格式制作程序。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 样式页面-&gt;将插入tab（而非空格键）以内缩，该选项取消勾选，下面空格数目填4，这样在自动编排时会以空格4作缩排。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 快速执行程序：Ctrl + F11</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 个人习惯：ALT+X</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 修改处：窗口-&gt;喜好设定-&gt;工作台-&gt;按键-&gt;执行-&gt;启动前一次的启动作业。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 简易说明：第一次执行时，它会询问您执行模式，设置好后，以后只要按这个热键，它就会快速执行。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; &lt;ALT+Z（排版完）、ATL+X（执行）&gt;&#8230;&#8230;我觉得很顺手^___^</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 自动汇入所需要的类别：Ctrl+Shift+O</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 简易说明：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 假设我们没有Import任何类别时，当我们在程序里打入：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; BufferedReader buf =new BufferedReader（new InputStreamReader（System.in））；</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 此时Eclipse会警示说没有汇入类别，这时我们只要按下Ctrl+Shift+O，它就会自动帮我们Import类别。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 查看使用类别的原始码：Ctrl+鼠标左键点击</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 简易说明：可以看到您所使用类别的原始码。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 将选取的文字批注起来：Ctrl+/</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 简易说明：Debug时很方便。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 修改处：窗口-&gt;喜好设定-&gt;工作台-&gt;按键-&gt;程序代码-&gt;批注</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 将选取的文字取消批注：Ctrl+简易说明：同上。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 修改处：窗口-&gt;喜好设定-&gt;工作台-&gt;按键-&gt;程序代码-&gt;取消批注</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 视景切换：Ctrl+F8</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 个人习惯：Alt+S.</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 修改处：窗口-&gt;喜好设定-&gt;工作台-&gt;按键-&gt;窗口-&gt;下一个视景。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 简易说明：可以方便我们快速切换编辑、除错等视景。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 3.0里Ctrl+Alt+H可以看到调用当前member的方法，而且可以一层一层上去。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; Ctrl+O可以快速切到其他方法。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 密技篇：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 一套Eclipse可同时切换，英文、繁体、简体显示：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 1.首先要先安装完中文化包。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 2.在桌面的快捷方式后面加上参数即可，</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 英文-&gt; -nl "zh_US"</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 繁体-&gt; -nl "zh_TW"</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 简体-&gt; -nl "zh_CN".</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; （其它语系以此类推）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 像我2.1.2中文化后，我在我桌面的Eclipse快捷方式加入参数-n1 "zh_US".</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; "C：\Program Files\eclipse\eclipse.exe" -n "zh_US"</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 接口就会变回英文语系噜。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 利用Eclipse，在Word编辑文书时可不必将程序代码重新编排：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;
将Eclipse程序编辑区的程序代码整个复制下来（Ctrl+C），直接贴（Ctrl+V）到Word或WordPad上，您将会发现在Word里的程
序代码格式，跟Eclipse所设定的完全一样，包括字型、缩排、关键词颜色。我曾试过JBuilder
、GEL、NetBeans&#8230;&#8230;使用复制贴上时，只有缩排格式一样，字型、颜色等都不会改变。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 外挂篇：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 外挂安装：将外挂包下载回来后，将其解压缩后，您会发现features、plugins这2个数据夹，将里面的东西都复制或移动到Eclipse的features、plugins数据夹内后，重新启动Eclipse即可。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 让Eclipse可以像JBuilderX一样使用拖拉方式建构GUI的外挂：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 1.Jigloo SWT/Swing GUI Builder ：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; http://cloudgarden.com/jigloo/index.html</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 下载此版本：Jigloo plugin for Eclipse （using Java 1.4 or 1.5）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 安装后即可由档案-&gt;新建-&gt;其它-&gt;GUI Form选取要建构的GUI类型。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 2.Eclipse Visual Editor Project：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; http://www.eclipse.org/vep/</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 点选下方Download Page，再点选Latest Release 0.5.0进入下载。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 除了VE-runtime-0.5.0.zip要下载外，以下这2个也要：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; EMF build 1.1.1： （build page） （download zip）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; GEF Build 2.1.2： （build page） （download zip）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 我只测试过Eclipse 2.1.2版本，使用上是OK的！</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 3.0版本以上的使用者，请下载：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; Eclipse build I20040324：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 1.0.0 Stream Integration Build I20040325 Thu， 25 Mar 2004 —— 12：09 （-0500）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 1.0.0 Stream Nightly Build N20040323a Tue， 23 Mar 2004 —— 13：53 （-0500）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 注意：3.0以上版本，仅build I20040324可正常使用。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 安装成功后，即可由新建-&gt;Java-&gt;AWT与Swing里选择所要建构的GUI类型开始进行设计。VE必须配合着对应版本，才能正常使用，否则即使安装成功，使用上仍会有问题。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 使用Eclipse来开发JSP程序：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 外挂名称：lomboz（下载页面）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; http://forge.objectweb.org/project/showfiles<br>.php？group_id=97</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 请选择适合自己版本的lomboz下载，lomboz.212.p1.zip表示2.1.2版，</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; lomboz.3m7.zip表示M7版本&#8230;&#8230;以此类推。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; lomboz安装以及设置教学：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; Eclipse开发JSP-教学文件</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; Java转exe篇：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 实现方式：Eclipse搭配JSmooth（免费）。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 1.先由Eclipse制作包含Manifest的JAR.</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 制作教学</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 2.使用JSmooth将做好的JAR包装成EXE.</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; JSmooth下载页面：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; http://jsmooth.sourceforge.net/index.php</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 3.制作完成的exe文件，可在有装置JRE的Windows上执行。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; Eclipse-Java编辑器最佳设定：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 编辑器字型设定：工作台-&gt;字型-&gt;Java编辑器文字字型。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; （建议设定Courier New -regular 10）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 编辑器相关设定：窗口-&gt;喜好设定-&gt;Java-&gt;编辑器</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 外观：显示行号、强调对称显示的方括号、强调显示现行行、显示打印边距，将其勾选，Tab宽度设4，打印编距字段设80.</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 程序代码协助：采预设即可。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 语法：可设定关键词、字符串等等的显示颜色。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 附注：采预设即可。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 输入：全部字段都勾选。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 浮动说明：采预设即可。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 导览：采预设即可。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 使自动排版排出来的效果，最符合Java设计惯例的设定：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 自动排版设定：窗口-&gt;喜好设定-&gt;Java-&gt;程序代码制作格式。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 换行：全部不勾选。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 分行：行长度上限设：80.</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 样式：只将强制转型后插入空白勾选。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 内缩空格数目：设为4.</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; Eclipse的教学文件：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 扩充Eclipse的Java 开发工具（中文）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 使用Eclipse开发J2EE 应用程序（中文）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 使用Eclipse平台进行除错（中文）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 用Eclipse进行XML 开发（中文）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 开发Eclipse外挂程序（中文）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 国际化您的Eclipse外挂程序（英文）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 将Swing编辑器加入Eclipse（英文）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 如何测试你的Eclipse plug-in符合国际市场需求（英文）</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; Eclipse的相关网站：</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; http://eclipse-plugins.2y.net/eclipse/index.jsp</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; http://www.eclipseplugincentral.com/</font></p>
</div>
<br><img src ="http://www.cnitblog.com/mordecai/aggbug/33940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-09-24 03:35 <a href="http://www.cnitblog.com/mordecai/articles/33940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse安装插件的最好方式</title><link>http://www.cnitblog.com/mordecai/articles/33921.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Sun, 23 Sep 2007 11:46:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/33921.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/33921.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/33921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/33921.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/33921.html</trackback:ping><description><![CDATA[<font style="font-size: 12px;">
<p><font face="Arial">用link的方式安装.以SWT-Designer为例(假设eclipse安装在d:\eclipse)<br>
&nbsp; 1. 解压插件到某文件夹,如d:\eclipse\3rdPlugins\SWTDesigner\eclipse.<br>
&nbsp;&nbsp;&nbsp;&nbsp; 注意最后一级文件夹名字必须为eclipse,且插件解压以后的features,plugins文件夹必须是此文件夹的子文件夹.<br>
&nbsp;&nbsp;&nbsp;&nbsp; 而d:\eclipse\3rdPlugins\SWTDesigner则被称为此插件的安装目录.<br>
&nbsp; <br>
&nbsp; 2. 在d:\eclipse\下新建文件夹links,这样就得到了C:\ceclipse\links.</font></p>
<p><font face="Arial">&nbsp; 3. 在d:\eclipse\links下新建一个.link文件(.txt改为.link),比如:swtdesigner.link.在swtdesigner.link中写入(不含双引号):<br>
&nbsp;&nbsp;&nbsp;&nbsp; "path=d:/eclipse/3rdPlugins/SWTDesigner",需要注意是"/"不是"\".</font></p>
<p><font face="Arial">&nbsp; 4. 重启eclipse.</font></p>
</font>
<br> <img src ="http://www.cnitblog.com/mordecai/aggbug/33921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-09-23 19:46 <a href="http://www.cnitblog.com/mordecai/articles/33921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何将JAVA生成可执行文件</title><link>http://www.cnitblog.com/mordecai/articles/33920.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Sun, 23 Sep 2007 11:45:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/33920.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/33920.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/33920.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/33920.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/33920.html</trackback:ping><description><![CDATA[<font style="font-size: 12px;">&nbsp;&nbsp;&nbsp; 倘若说看到标题后，以为真的提供了一种把java应用程序打包成exe文件的主流方法的话，你会失望的，下面的一个小技巧只是一个技巧而已。
</font>
<p><font style="font-size: 12px;"><font face="Verdana">　　这个是
borland不公开的使用技巧，能够通过jbuilder来制作exe文件来启动java文件。jbuilder并不支持本地编译机制。但是有一个隐藏
的技巧可以让你从可执行文件来启动java程序，可以出现或者不出现console窗口。想做到这些，需要jbuilder的bin目录下的这些文件:
</font></font></p>
<p><font style="font-size: 12px;"><font face="Verdana">　　jbuilder.exe </font></font></p>
<p><font style="font-size: 12px;"><font face="Verdana">　　jbuilderw.exe (可选) </font></font></p>
<p><font style="font-size: 12px;"><font face="Verdana">　　jbuilder.config </font></font></p>
<p><font style="font-size: 12px;"><font face="Verdana">　　jdk.config </font></font></p>
<p><font style="font-size: 12px;"><font face="Verdana">　　javalauncher.dll </font></font></p>
<p><font style="font-size: 12px;"><font face="Verdana">　　&#8220;jbuilder.exe&#8221;是
一个通用的可执行外壳文件，用以启动java程序，&#8221;jbuilderw.exe&#8220;好像是javaw.exe一样，它把&#8221;jbuilder.exe&#8221;包装
起来，但是运行时候不显示那个console的窗口。使用这些文件的关键是文件名。&#8220;jbuilder.exe&#8221;查找一个文件叫&#8221;
jbuilder.config&#8221;的配置文件，里面包含了运行java程序的必须信息。同样的&#8221;jbuilderw.exe&#8221;查找&#8221;
jbuilder.exe&#8221;来启动不带console窗口的java程序。如果把jbuilder.exe重命名为&#8221;foo.exe&#8221;，那&#8221;
foo.exe&#8221;将去寻找&#8221;foo.config&#8221;配置文件，同样&#8221;jbuilderw.exe&#8221;被重命名为&#8221;foow.exe&#8221;，它会去寻找&#8221;
foo.exe&#8221;文件。</font></font></p>
<p><font style="font-size: 12px;"><font face="Verdana">　　说到这里，聪明的读者应该猜到怎
样利用jbuilder.exe来启动应用程序了。只要把jbuilder.exe,jbuilerw.exe,jbuilder.config改名成相
应的文件名，在jbuilder.config里面指定主类和类路径，就能够通过执行jbuilder.exe(或者被改名后的exe文件)来启动
java应用程序了。下面是用本机为例。</font></font></p>
<p><font style="font-size: 12px;"><font face="Verdana">　　 borland
jbuilder
5被安装在e:jbuilder5目录下，在e:jbuilder5in下建立一个temp目录，然后把jbuilder.exe,
jbuilder.config,javalauncher.dll,jdk.config四个文件拷贝到:jbuilder5in
emp目录下，然后在这个目录下建立一个hello目录，在这个目录下生成一个hello.java文件，即e:jbuilder5in
emphellohello.java文件，file://hello.java/package <br>
hello;<br>
public class hello{ </font></font></p>
<p><font style="font-size: 12px;"><font face="Verdana">　　public static void main(string s[]){ </font></font></p>
<p><font style="font-size: 12px;"><font face="Verdana">　　system.out.println("hello, exe file!"); <br>
} <br>
} 　 <br>
然后打开jbuilder.config文件，作相应的修改： <br>
在jbuilder.config里面找到下面两行 <br>
# start jbuilder using the its main class <br>
mainclass com.borland.jbuilder.jbuilder <br>
修改为 <br>
# start jbuilder using the its main class <br>
mainclass hello.hello <br>
addpath e:/jbuilder5/bin/temp/ 　<br>
addpath命令是把目录加入类路径中，这个命令和其它config里面可以识别的命令可以在jbuilder/bin目录下的config_readme.txt里面找到详细说明。<br>
然后将jdk.config里面的javapath修改成相对的路径，例如原来是<br>
javapath ../jdk1.3/bin/java<br>
修改成 <br>
javapath ../../jdk1.3/bin/java<br>
最后 <br>
将jbuilder.exe,jbuilder.config修改成所需要的文件名，例如foo.exe和foo.config文件 。<br>
现在执行foo.exe文件 　<br>
至此，通过修改jbuilder来使用exe文件启动自己的java应用程序已经完成了。<br>
但是好玩的地方并不在这个地方，下面的小技巧可能更有趣，将jar文件打包进入exe文件！<br>
假设利用上面的文件，生成hello.jar包，执行过程. <br>
jar cvf hello.jar hello*.class<br>
将类文件打包成exe文件<br>
然后将jar包附加到jbuilder.exe后面去. <br>
copy /b ..jbuilder.exe+hello.jar foo.exe<br>
将jar文件转化成exe文件 　 <br>
在foo.config(jbuilder.config)文件里面把前面加入的类路径去掉，并加入下面的路径：<br>
addpath e:/jbuilder5/bin/temp/foo.exe <br>
然后执行. <br>
看到了么？一个含jar包的exe文件被执行了！<br>
这个过程的大致原理是：exe文件的重要信息都在文件头部，所以把乱七八糟的东西放exe文件尾部是不要紧的；而jar/zip文件的重要信息是在文件尾部的，这样它们两不相干，能够容易的被执行。</font></font></p>
<br> <img src ="http://www.cnitblog.com/mordecai/aggbug/33920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-09-23 19:45 <a href="http://www.cnitblog.com/mordecai/articles/33920.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类反射与Struts</title><link>http://www.cnitblog.com/mordecai/articles/33919.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Sun, 23 Sep 2007 11:44:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/33919.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/33919.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/33919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/33919.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/33919.html</trackback:ping><description><![CDATA[<br>
<div>
<p><font style="font-size: 12px;">&nbsp;本文讲述了如何利用Java的反射的机制来简化Structs应用程序的开发。 <br>
一、Struts中引入ActionForm类的意义与缺陷： <br>
在Struts应用程序中，ActionForm是一个很重要的概念,它的主要功能就是为Action的操作提供与客户表单相映射的数据（如果在客户指定
的情况下，还包括对数据进行校验）。Action根据业务逻辑的需要，对数据状态进行修改，在改变系统状态后，ActionForm则自动的回写新的数据
状态并保持。程序员对JSP与ActionForm&nbsp;Bean的对应关系，通常感到很迷惑，JSP与ActionForm到底是1:1,还是N:1,对
此，Struts本身对此并没有提出自己的观点。无论是一对一，还是多对一，Struts本身并不关心，它都能很好得工作。Struts在它的开发文档中
指出，对于较小规模的开发，开发人员可以根据自己的需要，每个模块只写一个ActionForm&nbsp;Bean，甚至整个应用程序只写一个
ActionForm&nbsp;Bean.当然，Struts也不反对每个ActionForm&nbsp;Bean只对应一个JSP,他们之间的对应关系，由开发人员自己
决定。&nbsp; <br>
<br>
在我看来，正如Entity&nbsp;EJB对J2EE的重大贡献一样，Entity&nbsp;EJB使得程序员对二维关系数据库的存取对象化了，程序员可以使用Set&nbsp;
或者Get等面向对象的方法来操纵关系数据库的数据，而ActionForm也使得程序员对网页的数据存取奇迹般的对象化了，程序员同样也可以使用
Set&nbsp;或者Get等面向对象的方法存取网页上的数据，这是一个开发模式方式上的重大转变。基于此，我个人认为ActionForm与JSP即VIEW层
的关系最好是一对一的关系，这样，在理解上会更清晰一些。但是，这样也会带来一个很现实的问题，在一个应用程序中，也许有非常多得JSP页面，如果每个
ActionForm&nbsp;都只对应一个JSP页面，那么系统的Java代码就会急剧膨胀起来，而且，每个ActionForm都是只有很简单的Set或者
Get方法存取数据，那么，如何简化Struts应用程序的开发呢？&nbsp; <br>
<br>
在Struts1.1&nbsp;中，Struts引入了DynaActionForm和Dyna&nbsp;Bean,试图解决这个问题，在我看来，
DynaActionForm的引入，破坏了对网页存取对象化的概念，使开发人员重新回到了使用HashTable、Map、Collection、
ArrayList等集合对象来实现对数据进行存取的老路上来。虽然应用程序的灵活性大大增加了，但是代码的可读性也大大降低了，开发人员之间的交流难度
也增加了。&nbsp; <br>
<br>
在传统的应用程序对ActionForm&nbsp;Bean的访问中，我们通常都写成如下的形式：&nbsp; <br>
<br>
<br>
Connection&nbsp;conn=DriverManager.getConnection("JDBC&nbsp;URL&nbsp;"); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql="&nbsp;select&nbsp;*&nbsp;&nbsp;from&nbsp;some&nbsp;tables&nbsp;"; <br>
PreparedStatement&nbsp;stmt&nbsp;=&nbsp;conn.prepareStatement(sql); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;stmt.executeQuery(); <br>
ArrayList&nbsp;array=new&nbsp;ArrayList(); <br>
while&nbsp;(rs.next())&nbsp;{ <br>
&nbsp;&nbsp;&nbsp;AActionForm&nbsp;actionForm&nbsp;=new&nbsp;AActionForm&nbsp;(); <br>
&nbsp;&nbsp;&nbsp;actionForm.setId(rs.getString("Id")); <br>
&nbsp;&nbsp;&nbsp;actionForm.setName(rs.getString("Name"));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;array.add(actionForm); <br>
} <br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp; <br>
<br>
<br>
在Action&nbsp;的Execute方法中，我们&nbsp;把这个集合用request.setAttribute("array",&nbsp;array)存储起来，然后在JSP页面中，我们用iterate&nbsp;Tag把数据循环现实出来。代码通常都是这个样子：&nbsp; <br>
<br>
<br>
&lt;logic:present&nbsp;name="&nbsp;array&nbsp;"&nbsp;scope="request"&gt; <br>
&lt;logic:iterate&nbsp;name="&nbsp;array&nbsp;"&nbsp;id="&nbsp;array&nbsp;"&nbsp; <br>
type="com.bhsky.webis.Goods"&gt; <br>
&nbsp;&lt;tr&nbsp;align="center"&gt;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&nbsp;class="table2"&gt; <br>
&lt;bean:write&nbsp;name="&nbsp;array&nbsp;"&nbsp;property="goodsid"/&gt; <br>
&lt;/td&gt; <br>
&lt;td&nbsp;class="table2"&gt; <br>
&lt;bean:write&nbsp;name="&nbsp;array&nbsp;"&nbsp;property="goodsname"/&gt; <br>
&lt;/td&gt; <br>
&nbsp;&nbsp;&lt;/tr&gt; <br>
&nbsp;&nbsp;&lt;/logic:iterate&gt;&nbsp; <br>
&lt;/logic:present&gt; <br>
<br>
&nbsp; <br>
<br>
<br>
在Struts中，对数据的访问和显示的写法通常都是很固定的，在VIEW层，我们是没有办法简化自己的代码的，在Action层，其写法通常也很固定，
只是做一个页面的跳转，商业逻辑和对数据得访问，通常都是放在JavaBean中。那么，在此，我提出一种运用类反射的机制，使应用程序对
ActionForm&nbsp;Bean的赋值自动化，即应用程序通过一个简单的接口，使用一个通用的方法，就可以完成对ActionForm&nbsp;Bean的赋值，
而不必在每个使用ActionFormBean的地方，都把数据库中的值手动赋值给ActionForm&nbsp;Bean，然后再在JSP页面中显示出来。虽然
它不能减少ActionForm&nbsp;Bean的数量，但是，它至少使应用程序对ActionForm&nbsp;Bean的赋值自动化了，从而减少了程序出错概率，提
高了程软件开发效率。&nbsp; <br>
<br>
二、类反射的概念： <br>
关于类反射的概念，在此我就不详细介绍了，它不是本文的重点，IBM&nbsp;developerWorks网站上有大量介绍类反射概念的文章，大家可以找出来参考一下。其实，Struts本身就大量利用了类反射的机制。&nbsp; <br>
<br>
三、如何应用类反射机制简化Struts应用程序的开发: <br>
<br>
<br>
1、&nbsp;先定义Action&nbsp;FormBean: <br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;package&nbsp;com.bhsky.webis.system; <br>
import&nbsp;org.apache.struts.action.*; <br>
import&nbsp;javax.servlet.http.*; <br>
&nbsp;&nbsp;&nbsp;&nbsp; <br>
public&nbsp;class&nbsp;UsersActionForm&nbsp;extends&nbsp;ActionForm&nbsp;{ <br>
private&nbsp;String&nbsp;usr_id; <br>
private&nbsp;String&nbsp;usr_name; <br>
public&nbsp;void&nbsp;setUsr_id(String&nbsp;usr_id)&nbsp;{ <br>
&nbsp;&nbsp;&nbsp;&nbsp;this.usr_id&nbsp;=&nbsp;usr_id; <br>
} <br>
public&nbsp;String&nbsp;getUsr_id()&nbsp;{ <br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;usr_id; <br>
} <br>
public&nbsp;String&nbsp;getUsr_memo()&nbsp;{ <br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;usr_memo; <br>
} <br>
public&nbsp;void&nbsp;setUsr_name(String&nbsp;usr_name)&nbsp;{ <br>
&nbsp;&nbsp;&nbsp;&nbsp;this.usr_name&nbsp;=&nbsp;usr_name; <br>
} <br>
} <br>
<br>
&nbsp; <br>
<br>
<br>
2、&nbsp;编写通用的为ActionFormBean赋值的方法： <br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;///////////////////////////////////////////////////////////////////////////// <br>
&nbsp;&nbsp;&nbsp;&nbsp;//Function:&nbsp;完成ResultSet对象向ArrayList对象为集合的对象的转化 <br>
&nbsp;&nbsp;&nbsp;&nbsp;//Para:sql,指定的查询Sql <br>
&nbsp;&nbsp;&nbsp;//Para:className,Sql相对应得JavaBean/FormBean类的名字 <br>
&nbsp;&nbsp;&nbsp;//Return:以类className为一条记录的结果集，完成ResultSet对象向ArrayList对象为集//合的className对象的转化 <br>
&nbsp;&nbsp;////////////////////////////////////////////////////////////////////////////// <br>
&nbsp;&nbsp;public&nbsp;ArrayList&nbsp;Select(String&nbsp;sql,String&nbsp;className){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;ArrayList&nbsp;paraList=new&nbsp;ArrayList(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;try{ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(conn&nbsp;==&nbsp;null){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreparedStatement&nbsp;stmt&nbsp;=&nbsp;conn.prepareStatement(sql); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;stmt.executeQuery(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;recordValue=""; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;c1=null; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paraList=new&nbsp;ArrayList(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSetMetaData&nbsp;rsmd&nbsp;=&nbsp;rs.getMetaData(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;columnCount&nbsp;=&nbsp;rsmd.getColumnCount(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(rs.next()){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c1=Class.forName(className).newInstance(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=columnCount;&nbsp;i++)&nbsp;{ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(rs.getString(rsmd.getColumnName(i))!=null){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recordValue=rs.getString(rsmd.getColumnName(i)); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recordValue=""; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br>
Method&nbsp; <br>
m=c1.getClass().getMethod(getSetMethodName(rsmd.getColumnName(i)), <br>
new&nbsp;Class[]{recordValue.getClass()}); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.invoke&nbsp;(c1,&nbsp;new&nbsp;Object[]{recordValue}); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paraList.add(c1); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br>
&nbsp;&nbsp;&nbsp;&nbsp;}catch(SQLException&nbsp;ex){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
}catch(ClassNotFoundException&nbsp;e){ <br>
<br>
}catch(NoSuchMethodException&nbsp;e)&nbsp;{ <br>
<br>
}catch(InvocationTargetException&nbsp;e){ <br>
<br>
}catch&nbsp;(IllegalAccessException&nbsp;e){ <br>
<br>
}catch(InstantiationException&nbsp;e){ <br>
<br>
}&nbsp;finaly{ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closeConnection(); <br>
return&nbsp;paraList; <br>
} <br>
&nbsp;&nbsp;} <br>
<br>
&nbsp; <br>
<br>
<br>
3、&nbsp;在JavaBean封装的商业逻辑中调用Select&nbsp;方法，然后在JSP页面上显示出来： <br>
<br>
<br>
&nbsp;&nbsp;&nbsp;//Function:取得用户列表 <br>
&nbsp;&nbsp;//Para: <br>
&nbsp;&nbsp;//Return:返回用户列表 <br>
&nbsp;&nbsp;///////////////////////////////////////////////////////////////////////////// <br>
&nbsp;&nbsp;public&nbsp;ArrayList&nbsp;getUsers(){ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList&nbsp;ret=null; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DatabaseManage&nbsp;db=new&nbsp;DatabaseManage(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql="&nbsp;select&nbsp;usr_id,usr_name&nbsp;" <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+"&nbsp;from&nbsp;users&nbsp;"&nbsp;; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret=db.Select(sql,"&nbsp;com.bhsky.&nbsp;webis.system.UsersActionForm"); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret; <br>
&nbsp;&nbsp;} <br>
<br>
&nbsp; <br>
<br>
<br>
4、&nbsp;在Action的execute方法中调用getUsers()方法： <br>
<br>
<br>
&nbsp;&nbsp;&nbsp;public&nbsp;ActionForward&nbsp;execute(ActionMapping&nbsp;actionMapping,&nbsp;ActionForm&nbsp;actionForm,&nbsp; <br>
HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;httpServletResponse)&nbsp; <br>
&nbsp;&nbsp;&nbsp;{ <br>
&nbsp;&nbsp;&nbsp;&nbsp;/**@todo:&nbsp;complete&nbsp;the&nbsp;business&nbsp;logic&nbsp;here,&nbsp;this&nbsp;is&nbsp;just&nbsp;a&nbsp;skeleton.*/ <br>
&nbsp;&nbsp;&nbsp;&nbsp;UsersActionForm&nbsp;uaf=(UsersActionForm)actionForm; <br>
&nbsp;&nbsp;&nbsp;&nbsp;SystemService&nbsp;ubb=new&nbsp;SystemService(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;ArrayList&nbsp;userList=ubb.getUsers(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;request.setAttribute("userList",userList); <br>
&nbsp;&nbsp;&nbsp;&nbsp;ActionForward&nbsp;actionForward=actionMapping.findForward(url); <br>
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;actionForward; <br>
&nbsp;&nbsp;} <br>
<br>
&nbsp; <br>
<br>
<br>
5、&nbsp;在JSP中显示： <br>
<br>
<br>
&nbsp;&nbsp;&nbsp;&lt;table&nbsp;width="700"&nbsp;class="1"&nbsp;border="1"&nbsp;cellspacing="1"&nbsp;align="center"&gt; <br>
&lt;tr&gt; <br>
&nbsp;&nbsp;&lt;td&nbsp;class="list"&nbsp;&gt;用户ID&lt;/td&gt; <br>
&nbsp;&nbsp;&lt;td&nbsp;class="list"&nbsp;&gt;姓&nbsp;&nbsp;名&lt;/td&gt; <br>
&lt;/tr&gt; <br>
&lt;logic:present&nbsp;name="userList"&nbsp;scope="request"&gt; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;logic:iterate&nbsp;name="userList"&nbsp;id="userList"&nbsp; <br>
type="com.bhsky.webis.system.UsersActionForm"&gt; <br>
&lt;tr&gt; <br>
&nbsp;&nbsp;&lt;td&nbsp;class="cell1"&nbsp;&nbsp;height="22"&gt;&lt;bean:write&nbsp;name="userList"&nbsp; <br>
property="usr_id"/&gt;&lt;/td&gt; <br>
&nbsp;&nbsp;&lt;td&nbsp;class="cell1"&nbsp;&nbsp;height="22"&gt;&lt;bean:write&nbsp;name="userList"&nbsp; <br>
property="usr_name"/&gt;&lt;/td&gt; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt; <br>
&lt;/logic:iterate&gt; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/logic:present&gt; <br>
&lt;/table&gt; <br>
<br>
&nbsp; <br>
<br>
<br>
四、结语： <br>
我们通过运用类反射机制，在一个Struts应用开发中，完成了一个通用查询方法的实现。它使得程序员摆脱了在每个应用程序中都要编写枯燥的set、get等方法来访问ActionForm&nbsp;Bean,从而简化了Struts应用程序的开发</font></p>
</div><img src ="http://www.cnitblog.com/mordecai/aggbug/33919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-09-23 19:44 <a href="http://www.cnitblog.com/mordecai/articles/33919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JNDI概述</title><link>http://www.cnitblog.com/mordecai/articles/33170.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Sun, 09 Sep 2007 14:30:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/33170.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/33170.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/33170.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/33170.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/33170.html</trackback:ping><description><![CDATA[<div class=tit>JNDI 是个什么东东?</div>
<div class=date>2007-06-07 12:21</div>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class=cnt><strong>JNDI</strong>是 Java 命名与目录接口（Java Naming and Directory Interface），在J2EE规范中是重要的规范之一，不少专家认为，没有透彻理解JNDI的意义和作用，就没有真正掌握J2EE特别是EJB的知识。<br>那么，JNDI到底起什么作用？<br><br>要了解JNDI的作用，我们可以从&#8220;如果不用JNDI我们怎样做？用了JNDI后我们又将怎样做？&#8221;这个问题来探讨。<br><br><font color=#800000><strong><font size=4>没有JNDI的做法：</font></strong></font><br>程序员开发时，知道要开发访问MySQL数据库的应用，于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码，并通过使用适当的 JDBC URL 连接到数据库。<br>就像以下代码这样：<br>
            <pre class=displaycode><font color=#0000ff>Connection conn=null;<br>try {<br>  Class.forName("com.mysql.jdbc.Driver",<br>                true, Thread.currentThread().getContextClassLoader());<br>  conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&amp;password=mingyue");<br>  /* 使用conn并进行SQL操作 */<br>  ......<br>  conn.close();<br>} <br>catch(Exception e) {<br>  e.printStackTrace();<br>} <br>finally {<br>  if(conn!=null) {<br>    try {<br>      conn.close();<br>    } catch(SQLException e) {}<br>  }<br>}</font></pre>
            <font color=#0000ff><br></font>这是传统的做法，也是以前非Java程序员（如Delphi、VB等）常见的做法。这种做法一般在小规模的开发过程中不会产生问题，只要程序员熟悉Java语言、了解JDBC技术和MySQL，可以很快开发出相应的应用程序。<br><br><strong><font size=4>没有JNDI的做法存在的问题：</font></strong><br>1、数据库服务器名称<font size=+0><font color=#0000ff>MyDBServer</font></font> 、用户名和口令都可能需要改变，由此引发JDBC URL需要修改；<br>2、数据库可能改用别的产品，如改用DB2或者Oracle，引发JDBC驱动程序包和类名需要修改；<br>3、随着实际使用终端的增加，原配置的连接池参数可能需要调整；<br>4、......<br><br>解决办法：<br>程序员应该不需要关心&#8220;具体的数据库后台是什么？JDBC驱动程序是什么？JDBC URL格式是什么？访问数据库的用户名和口令是什么？&#8221;等等这些问题，程序员编写的程序应该没有对 JDBC 驱动程序的引用，没有服务器名称，没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理，程序员只需要对这些配置和管理进行引用即可。<br><br>由此，就有了JNDI。<br><br><font size=4><strong>用了JNDI之后的做法：</strong></font><br>首先，在在J2EE容器中配置JNDI参数，定义一个数据源，也就是JDBC引用参数，给这个数据源设置一个名称；然后，在程序中，通过数据源名称引用数据源从而访问后台数据库。<br>具体操作如下（以JBoss为例）：<br>1、配置数据源<br>在JBoss的 D:\jboss420GA\docs\examples\jca 文件夹下面，有很多不同数据库引用的数据源定义模板。将其中的 mysql-ds.xml 文件Copy到你使用的服务器下，如 D:\jboss420GA\server\default\deploy。<br>修改 mysql-ds.xml 文件的内容，使之能通过JDBC正确访问你的MySQL数据库，如下：<br><font color=#0000ff>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;datasources&gt;<br>&lt;local-tx-datasource&gt;<br>&nbsp;&nbsp;&nbsp; &lt;jndi-name&gt;</font><font color=#0000ff>MySqlDS&lt;/jndi-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;connection-url&gt;</font><font color=#0000ff>jdbc:mysql://localhost:3306/lw&lt;/connection-url&gt;<br>&nbsp;&nbsp;&nbsp; &lt;driver-class&gt;</font><font color=#0000ff>com.mysql.jdbc.Driver&lt;/driver-class&gt;<br>&nbsp;&nbsp;&nbsp; &lt;user-name&gt;</font><font color=#0000ff>root&lt;/user-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;password&gt;</font><font color=#0000ff>rootpassword&lt;/password&gt;<br>&lt;exception-sorter-class-name&gt;org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter&lt;/exception-sorter-class-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;metadata&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;type-mapping&gt;</font><font color=#0000ff>mySQL&lt;/type-mapping&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/metadata&gt;<br>&lt;/local-tx-datasource&gt;<br>&lt;/datasources&gt;</font><br><br>这里，定义了一个名为MySqlDS的数据源，其参数包括JDBC的URL，驱动类名，用户名及密码等。<br><br>2、在程序中引用数据源：<br>
            <pre class=displaycode><font color=#0000ff>Connection conn=null;<br>try {<br>  Context ctx=new InitialContext();<br>  Object datasourceRef=ctx.lookup("java:<strong>MySqlDS</strong>"); //引用数据源<br>  DataSource ds=(Datasource)datasourceRef;<br>  conn=ds.getConnection();<br>  /* 使用conn进行数据库SQL操作 */<br>  ......<br>  c.close();<br>} <br>catch(Exception e) {<br>  e.printStackTrace();<br>} <br>finally {<br>  if(conn!=null) {<br>    try {<br>      conn.close();<br>    } catch(SQLException e) { }<br>  }<br>}</font></pre>
            直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几，但是现在的程序可以不用关心具体JDBC参数了。<br>在系统部署后，如果数据库的相关参数变更，只需要重新配置 mysql-ds.xml 修改其中的JDBC参数，只要保证数据源的名称不变，那么程序源代码就无需修改。<br><br>由此可见，JNDI避免了程序与数据库之间的紧耦合，使应用更加易于配置、易于部署。<br><br><strong><font size=4>JNDI的扩展：</font></strong><br>JNDI在满足了数据源配置的要求的基础上，还进一步扩充了作用：所有与系统外部的资源的引用，都可以通过JNDI定义和引用。<br><br>所以，在J2EE规范中，J2EE 中的资源并不局限于 JDBC 数据源。引用的类型有很多，其中包括资源引用（已经讨论过）、环境实体和 EJB 引用。特别是 EJB 引用，它暴露了 JNDI 在 J2EE 中的另外一项关键角色：查找其他应用程序组件。<br><br>EJB 的 JNDI 引用非常类似于 JDBC 资源的引用。在服务趋于转换的环境中，这是一种很有效的方法。可以对应用程序架构中所得到的所有组件进行这类配置管理，从 EJB 组件到 JMS 队列和主题，再到简单配置字符串或其他对象，这可以降低随时间的推移服务变更所产生的维护成本，同时还可以简化部署，减少集成工作。 外部资源&#8221;。 <br><br><br><strong><font size=4>总结：</font></strong><br>J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 中的角色就是&#8220;交换机&#8221; —— J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下，提供 JNDI 供应者的容器可以充当有限的数据存储，这样管理员就可以设置应用程序的执行属性，并让其他应用程序引用这些属性（Java 管理扩展（Java Management Extensions，JMX）也可以用作这个目的）。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层，这样组件就可以发现所需要的资源，而不用了解这些间接性。<br><br>在 J2EE 中，JNDI 是把 J2EE 应用程序合在一起的粘合剂，JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。这是 J2EE 的承诺，而且经过一些计划和预先考虑，这个承诺是完全可以实现的。</div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnitblog.com/mordecai/aggbug/33170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-09-09 22:30 <a href="http://www.cnitblog.com/mordecai/articles/33170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JNDI</title><link>http://www.cnitblog.com/mordecai/articles/33169.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Sun, 09 Sep 2007 14:29:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/33169.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/33169.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/33169.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/33169.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/33169.html</trackback:ping><description><![CDATA[<div align=left><font size=2><font color=#3366ff>JNDI全称 Java Naming and Directory Interface<br>JNDI是Java平台的一个标准扩展，提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样，JDNI是provider-based的技术，暴露了一个API和一个服务供应接口（SPI）。这意味着任何基于名字的技术都能通过JNDI而提供服务，只要JNDI支持这项技术。JNDI目前所支持的技术包括LDAP、CORBA Common Object Service（COS）名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术，包括EJB都依靠JNDI来组织和定位实体。<br>JDNI通过绑定的概念将对象和名称联系起来。在一个文件系统中，文件名被绑定给文件。在DNS中，一个IP地址绑定一个URL。在目录服务中，一个对象名被绑定给一个对象实体。<br>JNDI中的一组绑定作为上下文来引用。每个上下文暴露的一组操作是一致的。例如，每个上下文提供了一个查找操作，返回指定名字的相应对象。每个上下文都提供了绑定和撤除绑定名字到某个对象的操作。JNDI使用通用的方式来暴露命名空间，即使用分层上下文以及使用相同命名语法的子上下文。<br>jndi的用途：<br>1。你可以用jndi来得到object类的属性<br>如：Attribute attr =directory.getAttributes(personName).get("email");<br>String email = (String)attr.get();<br>2。你可以用jndi来搜索对象<br>如：foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls);<br>查找谁的名字叫Fox在wiz部门的员工？<br>3。你可以用jndi通过naming/directory服务查询像printers和databases的对象<br>如：查询 Printer<br>Printer printer = (Printer)namespace.lookup(printerName);<br>printer.print(document);<br>4。你可以用jndi列表出命名空间的特殊级别的内容<br>如：<br>NamingEnumeration list = namespace.list("o=Widget, c=US");<br>while (list.hasMore()) {<br>NameClassPair entry = (NameClassPair)list.next();<br>display(entry.getName(), entry.getClassName());<br>}</font></font></div>
<p align=center><font color=#3366ff size=2>JNDI 常见问题</font></p>
<p><font size=2><font color=#3366ff><strong>谁应该使用 JNDI？</strong></font></font></p>
<p><font color=#3366ff size=2>任何需要访问有关用户、机器、网络和服务的信息的 Java 应用程序。用户信息包括安全凭证、电话、电子邮件地址、通信地址和应用程序首选项（application preferences）。机器信息包括网络地址、机器配置等。另外就是任何需要导出对象或者需要访问其他应用程序或服务导出的对象的 Java 应用程序。这样的例子包括打印程序、日历和联网的文件系统。</font></p>
<p><font size=2><font color=#3366ff><strong>现在我可以使用 JNDI 吗？</strong></font></font></p>
<p><font color=#3366ff size=2>是的，Sun Microsystems 已经将 JNDI 作为一个 Java Standard Extension 发布了。Sun Microsystems 还为很多命名服务和目录服务（如 LDAP, NIS, CORBA (COS) Naming 和文件）发布了无缝地插入在 JNDI 后面的服务提供程序。这些服务提供程序以及其他供应商提供的服务提供程序都可从</font> <a href="http://java.sun.com/products/jndi/serviceproviders.html"><u><font color=#3366ff size=2>下载</font></u></a> <font color=#3366ff size=2>处得到。</font></p>
<p><strong><font color=#3366ff size=2>JNDI 用于 Java 平台中的什么地方？</font></strong></p>
<p><a href="http://java.sun.com/products/hotjavaviews/"><u><font color=#3366ff size=2>HotJava Views 1.1</font></u></a> <font color=#3366ff size=2>使用 JNDI 来访问 LDAP。像</font> <a href="http://java.sun.com/products/ejb/"><u><font color=#3366ff size=2>Enterprise JavaBeans</font></u></a><font color=#3366ff size=2>,</font> <a href="http://java.sun.com/products/jms/"><u><font color=#3366ff size=2>Java Message Service</font></u></a><font color=#3366ff size=2>,</font> <a href="http://java.sun.com/products/jdbc/"><u><font color=#3366ff size=2>JDBC 2.0</font></u></a> <font color=#3366ff size=2>这样的 Enterprise API 将 JNDI 用于命名和目录用途。RMI over IIOP 应用程序可以使用 JNDI 来访问 CORBA (COS) 命名服务。</font></p>
<p><font size=2><font color=#3366ff><strong>谁将提供 JNDI 的实现？</strong></font></font></p>
<p><font color=#3366ff size=2>在写这篇文章时，IBM, Novell, Sun 和 WebLogic 已经为 JNDI 提供了服务提供程序。我们维护有一个公共可用的服务提供程序的</font> <a href="http://java.sun.com/products/jndi/serviceproviders.html"><u><font color=#3366ff size=2>列表</font></u></a> <font color=#3366ff size=2>。</font></p>
<p><font size=2><font color=#3366ff><strong>JNDI 为哪些协议提供了接口？</strong></font></font></p>
<p><font color=#3366ff size=2>JNDI 本身独立于任何特定目录访问协议。单独的服务提供程序决定所支持的协议。将会有不同供应商提供的流行协议（比如 LDAP, NDS, DNS 和 NIS(YP)）的提供程序实现。</font></p>
<p><font size=2><font color=#3366ff><strong>JNDI 与 LDAP 的关系如何？</strong></font></font></p>
<p><font color=#3366ff size=2>JNDI 提供目录和命名的一个优良的面向对象的抽象。开发人员使用 JNDI 可以开发出使用 LDAP 或其他访问协议的查询来检索结果；但是他们并不局限于 LDAP，也不是必须开发与 LDAP 相关的应用程序。JNDI 支持 LDAP v3 中的关键功能。</font></p>
<p><font size=2><font color=#3366ff><strong>JNDI 与 Netscape 的 Java LDAP API 的关系如何？</strong></font></font></p>
<p><font color=#3366ff size=2>Netscape 的 API 是特定于 LDAP 的。它用于对 LDAP 目录的低级别访问。它暴露应用程序一般不需要知道的协议细节。</font></p>
<p><font color=#3366ff size=2>JNDI 是 Java 程序的一个普通目录 API。它类似用于访问文件的 <tt>java.io.File</tt> 类。可能会有一些需要在协议级别处理文件的管理程序（比如 NFS），但是所有的 Java 应用程序一般都使用 <tt>File</tt> 类来访问文件系统。类似地，大多数 Java 程序应该使用 JNDI 来访问目录。需要在协议级别处理目录内容的应用程序可能会选择使用 Netscape 的 API。</font></p>
<p><font size=2><font color=#3366ff><strong>JNDI 与用于命名的 OMG 的 CORBA 标准的关系如何？</strong></font></font></p>
<p><font color=#3366ff size=2>Java CORBA 应用程序可以使用 JNDI 来访问 CORBA (COS) 名称服务，以及其他命名服务和目录服务。它为应用程序提供一个接口，用于访问所有这些命名服务和目录服务。</font></p>
<p><font color=#3366ff size=2>通过使用 JNDI，Java CORBA 应用程序还可以使用像 LDAP 这样的分布式企业级服务来存储对象引用。</font></p>
<p><font size=2><font color=#3366ff><strong>JNDI </strong></font></font></p>
<img src ="http://www.cnitblog.com/mordecai/aggbug/33169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-09-09 22:29 <a href="http://www.cnitblog.com/mordecai/articles/33169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自定义标签体系结构介绍</title><link>http://www.cnitblog.com/mordecai/articles/33022.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Wed, 05 Sep 2007 14:05:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/33022.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/33022.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/33022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/33022.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/33022.html</trackback:ping><description><![CDATA[<p>标签处理程序<br>在创建自定义标签之前，需要创建一个 标签处理程序。标签处理程序是一个执行自定义标签操作的 Java 对象。在使用自定义标签时，要导入一个 标签库 —— 即一组标签/标签处理程序对。通过在 Web 部署描述符中声明库导入它，然后用指令 taglib 将它导入 JSP 页。 <br>如果 JSP 容器在转换时遇到了自定义标签，那么它就检查 标签库描述符（tag library descriptor） （TLD） 文件以查询相应的标签处理程序。TLD 文件对于自定义标签处理程序，就像 Web 部署描述符对于 servlet 一样。 <br>在运行时，JSP 页生成的 servlet 得到对应于这一页面所使用的标签的标签处理程序的一个实例。生成的 servlet 用传递给它的属性初始化标签处理程序。 <br>标签处理程序实现了生存周期方法。生成的 servlet 用这些方法通知标签处理程序应当启动、停止或者重复自定义标签操作。生成的 servlet 调用这些生存周期方法执行标签的功能。<br>标签的类型 <br>可以定义两种类型的标签： <br>javax.servlet.jsp.tagext.Tag <br>javax.servlet.jsp.tagext.BodyTag <br>对 正文 进行操作 —— 即对在开始和结束标签之间的内容进行操作的 —— 标签必须实现 BodyTag 接口。在这个教程中，我们将称这些标签为 正文标签。我们将不对其正文操作的标签称为 简单标签。简单标签可以实现 Tag 接口，尽管不要求它们这样做。要记住不对其正文操作的标签仍然 有 正文，只不过，它的标签处理程序不能读取这个正文。<br>&nbsp;<br>jsp自定义标签<br>关键词： jsp自定义标签&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>定义标签 <br>要定义标签，需要： <br>&#8226;&nbsp; 为该标签开发一个tag handler和helper类<br>&#8226;&nbsp; 在标签库描述符中声明这个标签<br>本节描述标签handler和TLD的属性，并解释如何为在前面几节中介绍的标签开发tag handler和库描述符元素。<br>标签handler<br>标签handler是由Web容器调用的一个对象，用于执行带有自定义标签的JSP页面时对这个标签进行判断。标签handler必须实现Tag或者BodyTag接口。接口可以用于接受现有Java对象并使它成为标签handler。对于新创建的处理器，可以用TagSupport和BodyTagSupport类作为基类。这些类和接口包含在javax.servlet.jsp.tagext包中。<br>JSP页面的servlet在对标签处理的不同阶段调用由Tag和BodyTag接口定义的标签handler。遇到自定义标签的开始标签时，JSP页面的servlet调用方法以初始化相应的handler，然后调用handler的doStartTag方法。遇到自定义标签的结束标签时，调用处理器的doEndTag方法。在标签handler需要与标签的正文交互时调用其他方法，见带正文的标签。为了提供标签handler的实现，必须实现在处理标签的不同阶段调用的方法，在表16-1中汇总了这些方法。<br>表16-1标签handler方法<br>标签handler类型&nbsp;方法<br>简单 &nbsp;doStartTag, doEndTag, release <br>属性 &nbsp;doStartTag, doEndTag, set/getAttribute1...N, release <br>正文、判断且无交互 &nbsp;doStartTag, doEndTag, release <br>正文、迭代判断 &nbsp;doStartTag, doAfterBody, doEndTag, release <br>正文、交互 &nbsp;doStartTag, doEndTag, release, doInitBody, doAfterBody, release <br>标签handler可以使用一个能让它得以与JSP页面通信的API。到API的入口点是页面上下文对象(javax.servlet.jsp.PageContext)，通过它标签handler可以获取JSP页面能够访问的所有其他隐式对象(请求、会话和应用程序)。<br>隐式对象可以有与其相关联的命名属性。可以用[set|get]Attribute方法访问这种属性。<br>如果标签是嵌入的，标签handler还可以访问与外围标签关联的handler称为parent)。<br>一组相关的标签handler类(标签库)一般是打包的且作为JAR文档部署。<br>标签库描述符 <br>标签库描述符(TLD)是一个描述标签库的XML文档。TLD包含有关整个库以及库中包含的每一个标签的信息。Web容器用TLD验证标签，JSP页面开发工具也使用TLD。<br>TLD文件名必须有扩展名.tld。TLD文件也储存在WAR文件的WEB-INF目录中或者在WEB-INF的子目录中。<br>TLD必须以指定XML的版本和文档类型定义(DTD)的XML文档序言（prolog）开始。<br>&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt; &lt;!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "<a href="http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"><u><font color=#0000ff>http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd</font></u></a>"&gt; <br>Tomcat支持版本 1.1和1.2的DTD。不过，本章所讨论的是1.2版本，因为在开发的所有标签库中都应该使用最新的版本。模板库TLDtutorial-template.tld符合版本1.2。Struts库TLD符合版本1.1的DTD，它的元素要少，且其中一些元素使用了稍微不同的名字。<br>TLD的根是taglib元素。表16-2中列出了taglib的子元素：<br>表16-2 taglib子子元素&nbsp; <br>元素&nbsp;说明<br>tlib-version &nbsp;标签库的版本 <br>jsp-version &nbsp;这个标签库要求的JSP规范版本 <br>short-name &nbsp;JSP页面编写工具可以用来创建助记名的可选名字 <br>uri &nbsp;唯一标识该标签库的的URI <br>display-name &nbsp;将由工具显示的可选名 <br>small-icon &nbsp;将由工具使用的可选小图标 <br>large-icon &nbsp;可被工具使用的可选大图标 <br>description &nbsp;可选的标签特定信息 <br>listener &nbsp;见listener元素 </p>
<p>tag &nbsp;见tag元素 </p>
<p>listener元素 <br>标签库可以指定一些事件监听器类(见处理Servlet生命周期事件)。这些监听器在TLD中作为listener元素列出，Web容器将初始化监听器类并以类似在WAR级定义的监听器的方式注册它们。与WAR级监听器不同，这里没有指定标签库监听器注册的顺序。listener元素的唯一子元素是listener-class元素，它必须包含监听类的完全限定名。<br>tag元素 <br>库中的每一个标签都由给出其名字和其标签handler的类、在由标签创建的脚本变量上的信息以及标签属性上的信息描述。脚本变量信息可以在TLD中直接给出，也可以通过tag extra info类给出(见定义脚本变量的标签)。每一个属性声明包含指明属性是否是必需的、其值是否可以由请求时表达式确定以及属性类型的内容(见属性元素)。<br>在tag元素中的TLD中指定标签。在表16-3中出了tag的子元素：<br>表16-3 标签子元素<br>元素&nbsp;说明<br>name &nbsp;唯一标签名 <br>tag-class &nbsp;标签handler类的完全限定名 <br>tei-class &nbsp;javax.servlet.jsp.tagext.TagExtraInfo的可选子类。见提供有关脚本变量的信息。 </p>
<p>body-content &nbsp;正文内容类型。见body-conten元素和 body-content元素。 </p>
<p>display-name &nbsp;由工具显示的可选名 <br>small-icon &nbsp;可以由工具使用的小图标 <br>large-icon &nbsp;可以由工具使用的大图标 <br>description &nbsp;可选的标签特定的信息 <br>variable &nbsp;可选的脚本变量信息。见提供有关脚本变量的信息。 </p>
<p>attribute &nbsp;标签属性信息。见Attribute 元素。 </p>
<p>下面几节描述开发在标签类型中介绍的每一种类型的标签所需要的方法和TLD。 <br>简单标签 <br>标签handler <br>简单标签的handler必须实现Tag接口的doStartTag和doEndTag方法。在遇到开始标签时调用doStartTag方法。因为简单标签没有正文，所以这个方法返回SKIP_BODY。在遇到结束标签时调用doEndTag方法。如果要对页面的其他部分进行判断，则doEndTag方法需要返回EVAL_PAGE，否则，它就返回SKIP_PAGE。<br>在第一节讨论的简单标签<br>&lt;tt:simple /&gt; <br>由下列标签handler实现： <br>public SimpleTag extends TagSupport {<br>&nbsp; public int doStartTag() throws JspException {<br>&nbsp;&nbsp;&nbsp; try {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageContext.getOut().print("Hello.");<br>&nbsp;&nbsp;&nbsp; } catch (Exception ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new JspTagException("SimpleTag: " + <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.getMessage());&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return SKIP_BODY;&nbsp;&nbsp; }<br>&nbsp; public int doEndTag() {<br>&nbsp;&nbsp;&nbsp; return EVAL_PAGE;<br>&nbsp; }<br>} <br>body-content元素 <br>没有正文的标签必须用body-content元素声明它们的正文内容是空的：<br>&lt;body-content&gt;empty&lt;/body-content&gt; <br>&nbsp;<br>&nbsp;<br>自定义标签实验<br>一、概述<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSP中有一块重要的技术：自定义标签（Custom Tag），最近这几天在学习Struts的时候发现Struts中使用了很多自定义标签，如html、bean等。所以我就做了个简单的试验，学习一下这种技术。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先介绍一下这种技术吧！<br>1．优点：<br>取代了JSP中的Java程序，并且可以重复使用，方便不熟悉Java编程的网页设计人员。<br>2．开发流程：<br>（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编写JSP，在JSP中使用自定义标签。<br>（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在web.xml中指定JSP中使用的标签的.tld(标签库描述文件)文件的位置。<br>（3）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .tld文件中指定标签使用的类。<br>3. 自定义标签的分类：<br>（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简单标签：如&lt; mytag：helloworld/&gt;<br>（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 带属性标签：如&lt;imytag：checkinput dbname = &#8220;&lt;myBean.getDBName()&gt;&#8221;/&gt;<br>（3）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 带标签体的标签：<br>在自定义标签的起始和结束标签之间的部分为标签体(Body)。Body的内容可以是JSP中的标准标签，也可以是HTML、脚本语言或其他的自定义标签。<br>&lt;mytag：checkinput dbname = &#8220;&lt;myBean.getDBName()&gt;&#8221;&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mytag:log message=&#8221;Table Name&#8221;&gt;<br>&lt;mytag：checkinput /&gt;<br>（4）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以被Script使用的标签：<br>定义了id和type属性的标签可以被标签后面的Scriptlet使用。&lt;/P&lt; p&gt;<br>&lt;mytag：connection id = &#8220;oraDB&#8221; type = &#8220;DataSource&#8221; name = &#8220;Oracle&#8221;&gt;<br>&lt;%oraDB.getConnection(); %&gt;<br>4．接口及其他<br>实际上，自定义标签的处理类实现了Tag Handler对象。JSP技术在javax.servlet.jsp.tagext中提供了多个Tag Handler接口，JSP1.2中定义了Tag、BodyTag、IterationTag接口，在JSP2.0中新增了SimpleTag接口。JSP还提供了上述接口的实现类TagSupport、BodyTagSupport和SimpleTagSupport（SimpleTagSupport只在JSP2.0中才有）。BodyTagSupport实现了BodyTag、Tag和IterationTag接口。<br>接口及其方法<br>Tag接口<br>方法<br>SimpleTag<br>dotage<br>Tag<br>doStartTag,doEndTag,release<br>IterationTag<br>doStartTag,doAfterTag,release<br>BodyTag<br>doStartTag,doEndTag,release,doInitBody,doAfterBody<br>下表引自Sun的JSP在线教程。<br>Tag Handler Methods <br>Tag Handler Type<br>Methods<br>Simple<br>doStartTag, doEndTag, release<br>Attributes<br>doStartTag, doEndTag, set/getAttribute1...N, release<br>Body, Evaluation and No Interaction<br>doStartTag, doEndTag, release<br>Body, Iterative Evaluation<br>doStartTag, doAfterBody, doEndTag, release<br>Body, Interaction<br>doStartTag, doEndTag, release, doInitBody, doAfterBody, release&lt;/P&lt; p&gt;<br>下表中的EVAL是evaluate的缩写，意思是：评价, 估计, 求...的值，在下列的返回值中的意思是执行。<br>返回值<br>意义<br>SKIP_BODY<br>表示不用处理标签体，直接调用doEndTag()方法。<br>SKIP_PAGE<br>忽略标签后面的JSP内容。<br>EVAL_PAGE<br>处理标签后，继续处理JSP后面的内容。<br>EVAL_BODY_BUFFERED<br>表示需要处理标签体。<br>EVAL_BODY_INCLUDE<br>表示需要处理标签体,但绕过setBodyContent()和doInitBody()方法<br>EVAL_BODY_AGAIN<br>对标签体循环处理。<br>具体用法可以查看其他参考资料。<br>Sun的Java教程相关部分：<a href="http://java.sun.com/webservices/docs/1.0/tutorial/doc/JSPTags.html"><u><font color=#0000ff>http://java.sun.com/webservices/docs/1.0/tutorial/doc/JSPTags.html</font></u></a><br>二、实验<br>1．试验介绍<br>下面的实验就是基于上述开发流程开发的。<br>（1）在JSP中指定taglib的uri：&lt;%@ taglib uri="/helloworld" prefix="mytag" %&gt;。<br>（2）在web.xml中配置tag-location: <br>&lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;/helloworld&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/helloworld.tld&lt;/taglib-location&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/taglib&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （3）在tag-location中指定的.tld文件中定义实现标签的处理类：<br>&nbsp;&nbsp; &lt;short-name&gt;mytag&lt;/short-name&gt;<br>&nbsp;&nbsp; &lt;tag&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;helloworld&lt;/name&gt;&lt;/P&lt; p&gt;<br>&nbsp; &lt;tag-class&gt;mytag.HelloWorldTag&lt;/tag-class&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;body-content&gt;empty&lt;/body-content&gt;<br>&nbsp; &lt;/tag&gt;<br>(4)执行处理类mytag.HelloWorldTag的doStartTag和doEndTag方法，然后将结果输入到JSP中，和JSP中的内容一起输出。实际上自定义标签和JSP中的其他的内容被WebServer一起编译成servlet。<br>2. 完成后的试验的目录结构<br>应用myjsp放在Tomcat的webapps下。<br>myjsp中包含J2EE标准目录结构：WEB-INF和hello.jsp。WEB-INF中包含子目录classes和lib及web.xml,tld文件可以放在WEB-INF下，也可以放在WEB-INF的子目录下。<br>&nbsp;<br>3．开始实验<br>3．1．编写JSP<br>&lt; !—hello.jsp的源码 -- &gt;<br>&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br>&lt;%@ taglib uri="/helloworld" prefix="mytag" %&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;title&gt;<br>jsp1<br>&lt;/title&gt;<br>&lt;/head&gt;<br>&lt;body bgcolor="#ffffc0"&gt;<br>&lt;h1&gt;<br>下面显示的是自定义标签中的内容<br>&lt;/h1&gt;<br>&lt;br&gt;&lt;br&gt;&lt;/P&lt; p&gt;<br>&lt;mytag:helloworld&gt;&lt;/mytag:helloworld&gt;<br>&lt;br&gt;<br>&nbsp;<br>&lt;/form&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;<br>&nbsp;<br>3．2．编写web.xml<br>&nbsp;<br>&lt; !—web.xml的源码 -- &gt;<br>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;!-- edited with XMLSPY v5 rel. 4 U (<a href="http://www.xmlspy.com/"><u><font color=#0000ff>http://www.xmlspy.com</font></u></a>) by Williams (501) --&gt;<br>&lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br>"<a href="http://java.sun.com/dtd/web-app_2_3.dtd"><u><font color=#0000ff>http://java.sun.com/dtd/web-app_2_3.dtd</font></u></a>"&gt;<br>&lt;web-app&gt;<br>&lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;/helloworld&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/helloworld.tld&lt;/taglib-location&gt;<br>&lt;/taglib&gt;<br>&lt;/web-app&gt;<br>3．3&nbsp; 编写tld文件<br>&lt; !—helloworld.tld的源码 -- &gt;<br>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br>&lt;!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"<br>&nbsp;&nbsp; "<a href='http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"></p'>
<u><font color=#0000ff>http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"&gt;&lt;/P</font></u></a>&lt; p&gt;<br>&lt;taglib&gt;<br>&nbsp;&nbsp; &lt;tlib-version&gt;1.0&lt;/tlib-version&gt;<br>&nbsp;&nbsp; &lt;jsp-version&gt;1.2&lt;/jsp-version&gt;<br>&nbsp;&nbsp; &lt;short-name&gt;mytag&lt;/short-name&gt;<br>&nbsp;&nbsp; &lt;tag&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;helloworld&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tag-class&gt;mytag.HelloWorldTag&lt;/tag-class&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;body-content&gt;empty&lt;/body-content&gt;<br>&nbsp;&nbsp; &lt;/tag&gt;&lt;/P&lt; p&gt;<br>&lt;/taglib&gt;<br>3．4&nbsp; 编写标签实现类<br>&lt; !—标签的实现类HelloWorldTag.class的源码 -- &gt;<br>package mytag;&nbsp;&nbsp;&nbsp; <br>import java.io.IOException;<br>import javax.servlet.jsp.*;<br>import javax.servlet.jsp.tagext.*; <br>public class HelloWorldTag extends TagSupport {&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; public HelloWorldTag() {<br>&nbsp; }<br>&nbsp; public int doStartTag() throws JspTagException{<br>&nbsp;&nbsp;&nbsp; return EVAL_BODY_INCLUDE;<br>&nbsp; }<br>&nbsp; public int doEndTag() throws JspTagException{<br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageContext.getOut().write("Hello World");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (IOException ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new JspTagException("错误");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return EVAL_PAGE;<br>&nbsp; }<br>}<br>3．5&nbsp; 执行效果<br>部署到Tomcat的WebApps目录下，启动Tomcat，输入：<a href="http://localhost:8080/myjsp/hello.jsp"><u><font color=#0000ff>http://localhost:8080/myjsp/hello.jsp</font></u></a><br>&nbsp;<br>&#8220;Hello World&#8221;就是我们定义的标签部分的处理类输出的结果。<br>3．6&nbsp; 注意：<br>这个试验我做了2天，总是报错，弄得很是灰心，开始时以为tld文件或web.xml文件配置不正确，但怎么也找不到原因。<br>今晚我终于找到原因了，是因为.class文件一定要放在classes文件夹中，我放到了lib中。<br>.jar或servlet文件要放在lib目录中，而.class要放在classes目录中，如果要放到lib目录中,必须把mytag中的文件打包成.jar文件，然后把mytag.jar放到lib目录中。&lt;/P&lt; p&gt;<br></p>
<img src ="http://www.cnitblog.com/mordecai/aggbug/33022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-09-05 22:05 <a href="http://www.cnitblog.com/mordecai/articles/33022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jsp中的自定义标签由浅到深详细讲解</title><link>http://www.cnitblog.com/mordecai/articles/33021.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Wed, 05 Sep 2007 14:04:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/33021.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/33021.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/33021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/33021.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/33021.html</trackback:ping><description><![CDATA[<p style="TEXT-INDENT: 2em"><strong>一、基本概念：</strong>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1.标签(Tag):
<p style="TEXT-INDENT: 2em">标签是一种XML元素，通过标签可以使JSP网页变得简洁并且易于维护，还可以方便地实现同一个JSP文件支持多种语言版本。由于标签是XML元素，所以它的名称和属性都是大小写敏感的
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">2.标签库(Tag library):
<p style="TEXT-INDENT: 2em">由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">3.标签库描述文件(Tag Library Descriptor):
<p style="TEXT-INDENT: 2em">标签库描述文件是一个XML文件，这个文件提供了标签库中类和JSP中对标签引用的映射关系。它是一个配置文件，和web.xml是类似的。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">4.标签处理类(Tag Handle Class):
<p style="TEXT-INDENT: 2em">标签处理类是一个Java类，这个类继承了TagSupport或者扩展了SimpleTag接口，通过这个类可以实现自定义JSP标签的具体功能
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"><strong>二、自定义JSP标签的格式：</strong>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1.
<p style="TEXT-INDENT: 2em">
<center><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code><% @ taglib prefix=&#8221;someprefix&#8221;　uri=&#8221;/sometaglib&#8221; %></ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">为了使到JSP容器能够使用标签库中的自定义行为，必须满足以下两个条件：
<p style="TEXT-INDENT: 2em">1.从一个指定的标签库中识别出代表这种自定义行为的标签
<p style="TEXT-INDENT: 2em">2.找到实现这些自定义行为的具体类
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">第一个必需条件－找出一个自定义行为属于那个标签库－是由标签指令的前缀(Taglib Directive's Prefix)属性完成，所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀，用在标签库的文档中或者页面中插入自定义标签。所以，你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在JSP白皮书中指定的保留字)之类的前缀。 　
<p style="TEXT-INDENT: 2em">uri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串，容器用它来定位TLD文件。在TLD文件中可以找到标签库中所有标签处理类的名称
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">2.
<center><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>
            <pre><ccid_code><someprefix:sometag key="&#8221;somevalue&#8221;/"></ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center>
<p style="TEXT-INDENT: 2em">　当web应用程序启动时，容器从WEB-INF文件夹的目录结构的META-INF搜索所有以.tld结尾的文件。也就是说它们会定位所有的TLD文件。对于每个TLD文件，容器会先获取标签库的URI，然后为每个TLD文件和对应的URI创建映射关系。
<p style="TEXT-INDENT: 2em">在JSP页面中，我们仅需通过使用带有URI属性值的标签库指令来和具体的标签库匹配
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"><strong>三、自定义JSP标签的处理过程：</strong>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1．在JSP中引入标签库：<% @ taglib prefix=&#8221;taglibprefix&#8221; uri=&#8221;tagliburi&#8221; %>
<p style="TEXT-INDENT: 2em">2．在JSP中使用标签库标签：
<prefix : tagname attribute="&#8221;tagattribute&#8221;">
<p style="TEXT-INDENT: 2em">3．Web容器根据第二个步骤中的prefix，获得第一个步骤中声明的taglib的uri属性值
<p style="TEXT-INDENT: 2em">4．Web容器根据uri属性在web.xml找到对应的<taglib>元素
<p style="TEXT-INDENT: 2em">5．从<taglib>元素中获得对应的<taglib-location>元素的值
<p style="TEXT-INDENT: 2em">6．Web容器根据<taglib-location>元素的值从WEB-INF/目录下找到对应的.tld文件
<p style="TEXT-INDENT: 2em">7．从.tld文件中找到与tagname对应的<tag>元素
<p style="TEXT-INDENT: 2em">8．凑<tag>元素中获得对应的<tag-class>元素的值
<p style="TEXT-INDENT: 2em">9．Web容器根据<tag-class>元素的值创建相应的tag handle class的实例
<p style="TEXT-INDENT: 2em">10. Web容器调用这个实例的doStartTag/doEndTag方法完成相应的处理
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"><strong>四、创建和使用一个Tag Library的基本步骤：</strong>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1.创建标签的处理类(Tag Handler Class)
<p style="TEXT-INDENT: 2em">2.创建标签库描述文件(Tag Library Descrptor File)
<p style="TEXT-INDENT: 2em">3.在web.xml文件中配置<tag>元素
<p style="TEXT-INDENT: 2em">4.在JSP文件中引人标签库
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"><strong>五、TagSupport类简介：</strong>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1.处理标签的类必须扩展javax.servlet.jsp.TagSupport.
<p style="TEXT-INDENT: 2em">2.TagSupport类的主要属性：
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">A.parent属性：代表嵌套了当前标签的上层标签的处理类
<p style="TEXT-INDENT: 2em">B.pageContex属性：代表Web应用中的javax.servlet.jsp.PageContext对象
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">3.JSP容器在调用doStartTag或者doEndTag方法前，会先调用setPageContext和setParent方法，设置pageContext和parent。因此在标签处理类中可以直接访问pageContext变量
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">4.在TagSupport的构造方法中不能访问pageContext成员变量，因为此时JSP容器还没有调用
<p style="TEXT-INDENT: 2em">setPageContext方法对pageContext进行初始化 <br><strong>六、TagSupport处理标签的方法：</strong> </p>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1.TagSupport类提供了两个处理标签的方法：
<p style="TEXT-INDENT: 2em">public int doStartTag() throws JspException
<p style="TEXT-INDENT: 2em">public int doEndTag() throws JspException
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">2.doStartTag：但JSP容器遇到自定义标签的起始标志，就会调用doStartTag()方法。
<p style="TEXT-INDENT: 2em">doStartTag()方法返回一个整数值，用来决定程序的后续流程。
<p style="TEXT-INDENT: 2em">A.Tag.SKIP_BODY：表示<prefix:sometag>&#8230;</prefix:sometag>
之间的内容被忽略
<p style="TEXT-INDENT: 2em">B.Tag.EVAL_BODY_INCLUDE：表示标签之间的内容被正常执行
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">3.doEndTag：但JSP容器遇到自定义标签的结束标志，就会调用doEndTag()方法。doEndTag()方法也返回一个整数值，用来决定程序后续流程。
<p style="TEXT-INDENT: 2em">A.Tag.SKIP_PAGE：表示立刻停止执行网页，网页上未处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。
<p style="TEXT-INDENT: 2em">B.Tag_EVAL_PAGE：表示按照正常的流程继续执行JSP网页
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"><strong>七、用户自定义的标签属性：</strong>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">如果在标签中还包含了自定义的属性，例如：
<p style="TEXT-INDENT: 2em">
<prefix:mytag attribute1="value1">
<p style="TEXT-INDENT: 2em">...
<p style="TEXT-INDENT: 2em"></prefix:mytag>
<p style="TEXT-INDENT: 2em">那么在标签处理类中应该将这个属性作为成员变量，并且分别提供设置和读取属性的方法。
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"><strong>八、创建标签处理类的步骤：</strong>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1.创建包含JSP网页静态文本的文件(即是要替换自定义JSP标签的文本)
<p style="TEXT-INDENT: 2em">2.在Web应用启动时装载静态文本
<p style="TEXT-INDENT: 2em">3.创建标签处理类
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"><strong>九、如何创建包含JSP网页静态文本的文件：</strong>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1.使用java.util.Properties类来存放要替换网页中自定义JSP标签的静态文本
<p style="TEXT-INDENT: 2em">2.Properties类代表了一系列属性的集合，其实例既可以被保存到流中，也可以从流中加载。这些文本以key/value的形式存放在WEB-INF目录下，例如key=value，在属性列表中这些key/value都是String类型的
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"><strong>十、Properties类的常用API：</strong>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1.setProperty(String key, String value)：调用Hashtable类的put方法添加属性
<p style="TEXT-INDENT: 2em">2.getProperty(String key)：获取属性列表中key对应的属性值
<p style="TEXT-INDENT: 2em">3.load(InputStream in)：从输入流对象InputStream中读取属性列表(Properties list)
<p style="TEXT-INDENT: 2em">4.store(OutputStream out,String co<a class=none title=MM href="http://download.pchome.net/MM/" target=_blank rel=external><u><font color=#0066cc>MM</font></u></a>ent)：使用适当的格式将属性列表的属性对写入输出流对象中，默认使用ISO-88590-1编码格式,以行的方式处理输入。属性的key/value之间以&#8221;=、:&#8221;配对，以回车、换行分隔key/value对
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"><strong>十一、ServletContext类的常用API：</strong>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1.getContext(String uripath)：返回服务器中uripath所代表的ServletContext对象
<p style="TEXT-INDENT: 2em">2.getInitParameter(String name)：返回ServletConfig对象中name参数的值
<p style="TEXT-INDENT: 2em">3.getMineType(String file)：返回file参数代表的文件的MIME类型
<p style="TEXT-INDENT: 2em">4.getRequestDispatcher(String path)：返回path代表的RequestDispacher对象
<p style="TEXT-INDENT: 2em">5.getResourceAsStream(String path)：以输入流的形式返回path对应的资源，在输入留中对象可以为任意形式的数据，path参数必须以&#8220;/&#8221;开始且相对于Context Root <br><strong>十二、如何使用ServletContxt读取并保存属性文件：</strong> </p>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1.创建java.util.Properties类对象
<p style="TEXT-INDENT: 2em">2.获取ServletContext对象
<p style="TEXT-INDENT: 2em">3.将属性文件以输入流的形式读入到某个输入流对象中
<p style="TEXT-INDENT: 2em">4.将输入流对象加载到Properties对象中
<p style="TEXT-INDENT: 2em">5.将Properties对象保存到ServletContext对象中
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"><strong>十三、如何在Web应用启动时装载静态文本：</strong>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1.创建继承了HttpServlet类的子类，在web.xml中配置这Servlet时设置load-on-startup属性：
<p style="TEXT-INDENT: 2em"><servlet>
<p style="TEXT-INDENT: 2em"><servlet-name>someclass</servlet-name>
<p style="TEXT-INDENT: 2em"><servlet-class>somepackage.SomeClass</servlet-clas style="TEXT-INDENT: 2em"
<p><load-on-startup>1</load-on-startup>
<p style="TEXT-INDENT: 2em"></servlet>
<p style="TEXT-INDENT: 2em">2.在这个Servlet的init()方法中创建java.util.Properties类
<p style="TEXT-INDENT: 2em">3.获取当前Web应用的ServletContext对象
<p style="TEXT-INDENT: 2em">4.将WEB-INF目录下的属性文件读入到输入流InputStream中：
<p style="TEXT-INDENT: 2em">InputStream in = context.getResourceAsString("WEB-INF/someproperties.properties");
<p style="TEXT-INDENT: 2em">5.将输入流加载到属性对象中
<p style="TEXT-INDENT: 2em">ps.load(in);
<p style="TEXT-INDENT: 2em">6.将属性对象保存到上下文中。
<p style="TEXT-INDENT: 2em">context.setAttribute("attributeName",ps);
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"><strong>十四、如何创建标签处理类：</strong>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1.引入必需的资源：
<p style="TEXT-INDENT: 2em">import javax.servlet.jsp.*;
<p style="TEXT-INDENT: 2em">import javax.servlet.http.*;
<p style="TEXT-INDENT: 2em">import java.util.*;
<p style="TEXT-INDENT: 2em">import java.io.*;
<p style="TEXT-INDENT: 2em">2.继承TagSupport类并覆盖doStartTag()/doEndTag()方法
<p style="TEXT-INDENT: 2em">3.从ServletContext对象中获取java.util.Properties对象
<p style="TEXT-INDENT: 2em">4.从Properties对象中获取key对应的属性值
<p style="TEXT-INDENT: 2em">5.对获取的属性进行相应的处理并输出结果
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"><strong>十五、创建标签库描述文件(Tag Library Descriptor)：</strong>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1.标签库描述文件，简称TLD，采用XML文件格式，定义了用户的标签库。TLD文件中的元素可以分成3类：
<p style="TEXT-INDENT: 2em">A.<taglib>：标签库元素
<p style="TEXT-INDENT: 2em">B.<tag>：标签元素
<p style="TEXT-INDENT: 2em">C.<attribute>：标签属性元素
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">2.标签库元素<taglib>用来设定标签库的相关信息，它的常用属性有：
<p style="TEXT-INDENT: 2em">A.shortname： 指定Tag Library默认的前缀名(prefix)
<p style="TEXT-INDENT: 2em">B.uri： 设定Tag Library的惟一访问表示符
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">3.标签元素<tag>用来定义一个标签，它的常见属性有：
<p style="TEXT-INDENT: 2em">A.name： 设定Tag的名字
<p style="TEXT-INDENT: 2em">B.tagclass： 设定Tag的处理类
<p style="TEXT-INDENT: 2em">C.bodycontent： 设定标签的主体(body)内容
<p style="TEXT-INDENT: 2em">1).empty：表示标签中没有body
<p style="TEXT-INDENT: 2em">2).JSP：表示标签的body中可以加入JSP程序代码
<p style="TEXT-INDENT: 2em">3).tagdependent：表示标签中的内容由标签自己去处理
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">4.标签属性元素<attribute>用来定义标签的属性，它的常见属性有：
<p style="TEXT-INDENT: 2em">A.name：属性名称
<p style="TEXT-INDENT: 2em">B.required：属性是否必需的，默认为false
<p style="TEXT-INDENT: 2em">C.rtexprvalue：属性值是否可以为request-time表达式，也就是类似于<%=&#8230;%>的表达式
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em"><strong>十六、在Web应用中使用标签：</strong>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">1.如果Web应用中用到了自定义JSP标签，则必须在web.xml文件中加入<taglib>元素，它用于声明所引用的标签所在的标签库
<p style="TEXT-INDENT: 2em"><taglib>
<p style="TEXT-INDENT: 2em"><taglib-uri>/sometaglib</taglib-uri>
<p style="TEXT-INDENT: 2em"><taglib-location>/WEB-INF/someTLD.tld</taglib-location>
<p style="TEXT-INDENT: 2em"></taglib>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">2.<taglib-uri>：设定Tag Library的惟一标示符，在Web应用中将根据它来引用Tag Libray
<p style="TEXT-INDENT: 2em">3.<taglib-location>：指定和Tag Library对应的TLD文件的位置
<p style="TEXT-INDENT: 2em">4.在JSP文件中需要加入<% @ taglib% >指令来声明对标签库的引用。例如：
<p style="text-indent:2em"><% @ taglib prefix = &#8220;somePrefix&#8221; uri = "/someuri" %>
<p style="TEXT-INDENT: 2em">
<p style="TEXT-INDENT: 2em">5.prefix表示在JSP网页中引用这个标签库的标签时的前缀，uri用来指定Tag Library的标识符，它必须和web.xml中的<taglib-uri>属性保持一致。</p>
</someprefix:sometag>
<img src ="http://www.cnitblog.com/mordecai/aggbug/33021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-09-05 22:04 <a href="http://www.cnitblog.com/mordecai/articles/33021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>经典：从追MM谈Java的23种设计模式</title><link>http://www.cnitblog.com/mordecai/articles/33020.html</link><dc:creator>mordecai</dc:creator><author>mordecai</author><pubDate>Wed, 05 Sep 2007 14:03:00 GMT</pubDate><guid>http://www.cnitblog.com/mordecai/articles/33020.html</guid><wfw:comment>http://www.cnitblog.com/mordecai/comments/33020.html</wfw:comment><comments>http://www.cnitblog.com/mordecai/articles/33020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/mordecai/comments/commentRss/33020.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/mordecai/services/trackbacks/33020.html</trackback:ping><description><![CDATA[<div id=txt-tit-wrapper>&nbsp;</div>
<div id=txt>
<p>设计模式做为程序员的&#8220;内功心法&#8221;，越来越受到.net 社区的重视，这种变化是很可喜的，Java社区走在了我们的前面，但这种状况也许有一天会发生改变。<br><br>　　从追<a class=none title=MM href="http://download.pchome.net/MM/" target=_blank rel=external><u><font color=#0066cc>MM</font></u></a>谈Java的23种设计模式<br><br>　　1、FACTORY—追MM少不了请吃饭了，麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西，虽然口味有所不同，但不管你带MM去麦当劳或肯 德基，只管向服务员说&#8220;来四个鸡翅&#8221;就行了。麦当劳和肯德基就是生产鸡翅的Factory.<br><br>　　　　工厂模式：客户类和工厂类分开。消费者任何时候需要某种产品，只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点 是当产品修改时，工厂类也要做相应的修改。如：如何创建及如何向客户端提供。<br><br>　　程序代码<br><br>　　以下是引用片段：<br><br>以下是引用片段： <br>public class Factory{ <br>　　　　　　public String Boy = "boy" ; <br>　　　　 　　public String Girl = "girl" ; <br>　　　　　　public People getPeople (String people){ <br>　　　　　　　　if (people.equals("boy")){ <br>　　　　　　　　　　return new Boy(); <br>　　　　　　　　}else if(people.equals("girl")){ <br>　　　　　　　　　　return new Girl(); <br>　　　　　 　　　} <br>　　　　　　} <br>　　　　} <br><br><br>　　2、BUILDER—MM最爱听的就是&#8220;我爱你&#8221;这句话了，见到不同地方的MM,要能够用她们的方言跟她说这句话哦，我有一个多种语言翻译 机，上面每种语言都有一个按键，见到MM我只要按对应的键，它就能够用相应的语言说出&#8220;我爱你&#8221;这句话了，国外的MM也可以轻松搞掂，这 就是我的&#8220;我爱你&#8221;builder。(这一定比美军在伊拉克用的翻译机好卖)<br><br>　　 建造模式：将产品的内部表象和产品的生成过程分割开来，从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得 产品内部表象可以独立的变化，客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。<br><br>　　3、FACTORY METHOD—请MM去麦当劳吃汉堡，不同的MM有不同的口味，要每个都记住是一件烦人的事情，我一般采用Factory Method模 式，带着MM到服务员那儿，说&#8220;要一个汉堡&#8221;，具体要什么样的汉堡呢，让MM直接跟服务员说就行了。<br><br>　　　　工厂方法模式：核心工厂类不再负责所有产品的创建，而是将具体创建的工作交给子类去做，成为一个抽象工厂角色，仅负责给出 具体工厂类必须实现的接口，而不接触哪一个产品类应当被实例化这种细节。<br><br>　　4、PROTOTYPE—跟MM用<a class=none title=QQ href="http://download.pchome.net/internet/communications/Oicq/17489.html" target=_blank rel=external><u><font color=#0066cc>QQ</font></u></a>聊天，一定要说些深情的话语了，我搜集了好多肉麻的情话，需要时只要copy出来放到QQ里面就行了，这就是 我的情话prototype了。(100块钱一份，你要不要)<br><br>　　原始模型模式：通过给出一个原型对象来指明所要创建的对象的类型，然后用复制这个原型对象的方法创建出更多同类型的对象。 原始模型模式允许动态的增加或减少产品类，产品类不需要非得有任何事先确定的等级结构，原始模型模式适用于任何的等级结构。缺点是每 一个类都必须配备一个克隆方法。<br><br>5、SINGLETON—俺有6个漂亮的老婆，她们的老公都是我，我就是我们家里的老公Sigleton，她们只要说道&#8220;老公&#8221;，都是指的同一个 人，那就是我(刚才做了个梦啦，哪有这么好的事)<br><br>　　　　单例模式：单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的 &#8220;单一实例&#8221;的需求时才可使用。<br><br>　　以下是引用片段：<br><br>以下是引用片段：<br>　　　　public　class SingLeton{ <br>　　　　　　private static SingLeton instance = new SingLeton(); <br>　　　　　　public static SingLeton getInstance(){ <br>　　　　　　　　return instance; <br>　　　　　　} <br>　　　　} <br><br><br>　　6、ADAPTER—在朋友聚会上碰到了一个美女Sarah，从香港来的，可我不会说粤语，她不会说普通话，只好求助于我的朋友kent了，他 作为我和Sarah之间的Adapter，让我和Sarah可以相互交谈了(也不知道他会不会耍我)<br><br>　　　　适配器(变压器)模式：把一个类的接口变换成客户端所期待的另一种接口，从而使原本因接口原因不匹配而无法一起工作的两个类 能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。<br><br>　　7、BRIDGE—早上碰到MM，要说早上好，晚上碰到MM，要说晚上好; 碰到MM穿了件新衣服，要说你的衣服好漂亮哦，碰到MM新做的发型， 要说你的头发好漂亮哦。不要问我&#8220;早上碰到MM新做了个发型怎么说&#8221;这种问题，自己用BRIDGE组合一下不就行了<br><br>　　桥梁模式：将抽象化与实现化脱耦，使得二者可以独立的变化，也就是说将他们之间的强关联变成弱关联，也就是指在一个软件系统的 抽象化和实现化之间使用组合/聚合关系而不是继承关系，从而使两者可以独立的变化。<br><br>　　8、COMPOSITE—Mary今天过生日。&#8220;我过生日，你要送我一件礼物。&#8221;&#8220;嗯，好吧，去商店，你自己挑。&#8221;&#8220;这件T恤挺漂亮，买，这 条裙子好看，买，这个包也不错，买。&#8221;&#8220;喂，买了三件了呀，我只答应送一件礼物的哦。&#8221;&#8220;什么呀，T恤加裙子加包包，正好配成一套呀， 小姐，麻烦你包起来。&#8221;&#8220;&#8230;&#8230;&#8221;，MM都会用Composite模式了，你会了没有?<br><br>　　　　合成模式：合成模式将对象组织到树结构中，可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成 模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。<br><br>　　9、DECORATOR—Mary过完轮到Sarly过生日，还是不要叫她自己挑了，不然这个月伙食费肯定玩完，拿出我去年在华山顶上照的照片， 在背面写上&#8220;最好的的礼物，就是爱你的Fita&#8221;，再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦)，再找隔壁搞美术设计的Mike设计了一 个漂亮的盒子装起来&#8230;&#8230;，我们都是Decorator，最终都在修饰我这个人呀，怎么样，看懂了吗?<br><br>　　　　装饰模式：装饰模式以对客户端透明的方式扩展对象的功能，是继承关系的一个替代方案，提供比继承更多的灵活性。动态给一个 对象增加功能，这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。<br><br>10、FA&#199;ADE—我有一个专业的Nikon相机，我就喜欢自己手动调光圈、快门，这样照出来的照片才专业，但MM可不懂这些，教了半天也 不会。幸好相机有Fa&#231;ade设计模式，把相机调整到自动档，只要对准目标按快门就行了，一切由相机自动调整，这样MM也可以用这个相机给我 拍张照片了。<br><br>　　　　门面模式：外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口，使得子系统更易于使用 。每一个子系统只有一个门面类，而且此门面类只有一个实例，也就是说它是一个单例模式。但整个系统可以有多个门面类。<br><br>　　11、FLYWEIGHT—每天跟MM发短信，手指都累死了，最近买了个新手机，可以把一些常用的句子存在手机里，要用的时候，直接拿出来 ，在前面加上MM的名字就可以发送了，再不用一个字一个字敲了。共享的句子就是Flyweight，MM的名字就是提取出来的外部特征，根据上下文 情况使用。<br><br>　　　　享元模式：FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关 键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部，不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能 影响内蕴状态，它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来，将不可以共享的状态从类里剔除出去。客户 端不可以直接创建被共享的对象，而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。<br><br>　　12、PROXY—跟MM在网上聊天，一开头总是&#8220;hi,你好&#8221;,&#8220;你从哪儿来呀?&#8221;&#8220;你多大了?&#8221;&#8220;身高多少呀?&#8221;这些话，真烦人，写个程序 做为我的Proxy吧，凡是接收到这些话都设置好了自动的回答，接收到其他的话时再通知我回答，怎么样，酷吧。<br><br>　　　　代理模式：代理模式给某一个对象提供一个代理对象，并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个 人或者一个机构采取行动。某些情况下，客户不想或者不能够直接引用一个对象，代理对象可以在客户和目标对象直接起到中介的作用。客户 端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象，而仅仅持有一个被代理对象的接口，这时候代理对象不 能够创建被代理对象，被代理对象必须有系统的其他角色代为创建并传入。<br><br>以下是引用片段：<br>　　　　public interface FactoryProxy{ <br>　　　　　　public People createBoy(); <br>　　　　　　 public People creteGirl(); <br>　　　　} <br><br><br>　　13、CHAIN OF RESPONSIBLEITY—晚上去上英语课，为了好开溜坐到了最后一排，哇，前面坐了好几个漂亮的MM哎，找张纸条，写上 &#8220;Hi,可以做我的女朋友吗?如果不愿意请向前传&#8221;，纸条就一个接一个的传上去了，糟糕，传到第一排的MM把纸条传给老师了，听说是个老处 女呀，快跑!<br><br>　　　　责任链模式：在责任链模式中，很多对象由每一个对象对其下家的引用而接<br><br>　　　　起来形成一条链。请求在这个链上传递，直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请 求，系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择：承担责任或者把责任推给下家。一个请求可以最终 不被任何接收端对象所接受。<br><br>　　14、COMMAND—俺有一个MM家里管得特别严，没法见面，只好借助于她弟弟在我们俩之间传送信息，她对我有什么指示，就写一张纸条 让她弟弟带给我。这不，她弟弟又传送过来一个COMMAND，为了感谢他，我请他吃了碗杂酱面，哪知道他说：&#8220;我同时给我姐姐三个男朋友送 COMMAND，就数你最小气，才请我吃面。&#8221;，<br><br>　　　　命令模式：命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开，委派给不同的 对象。命令模式允许请求的一方和发送的一方独立开来，使得请求的一方不必知道接收请求的一方的接口，更不必知道请求是怎么被接收，以 及操作是否执行，何时被执行以及是怎么被执行的。系统支持命令的撤消。<br><br><br>15、INTERPRETER—俺有一个《泡MM真经》，上面有各种泡MM的攻略，比如说去吃西餐的步骤、去看电影的方法等等，跟MM约会时，只 要做一个Interpreter，照着上面的脚本执行就可以了。<br><br>　　　　解释器模式：给定一个语言后，解释器模式可以定义出其文法的一种表示，并同时提供一个解释器。客户端可以使用这个解释器来 解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后，使用模式设计解释这些语句。在解释器模式里面提到的语言是指任 何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构，也就是一系列的组合规则。每一个命令对象 都有一个解释方法，代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。<br><br>　　16、ITERATOR—我爱上了Mary，不顾一切的向她求婚。<br><br>　　　　Mary：&#8220;想要我跟你结婚，得答应我的条件&#8221;<br><br>　　　　我：&#8220;什么条件我都答应，你说吧&#8221;<br><br>　　　　Mary：&#8220;我看上了那个一克拉的钻石&#8221;<br><br>　　　　我：&#8220;我买，我买，还有吗?&#8221;<br><br>　　　　Mary：&#8220;我看上了湖边的那栋别墅&#8221;<br><br>　　　　我：&#8220;我买，我买，还有吗?&#8221;<br><br>　　　　Mary：&#8220;我看上那辆法拉利跑车&#8221;<br><br>　　　　我脑袋嗡的一声，坐在椅子上，一咬牙：&#8220;我买，我买，还有吗?&#8221;<br><br>　　　　&#8230;&#8230;<br><br>　　　　迭代子模式：迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集， 聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中，从而与聚集本身隔开。迭代子模式简化了聚集 的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象，每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色 变化。<br><br>　　17、MEDIATOR—四个MM打麻将，相互之间谁应该给谁多少钱算不清楚了，幸亏当时我在旁边，按照各自的筹码数算钱，赚了钱的从我这 里拿，赔了钱的也付给我，一切就OK啦，俺得到了四个MM的电话。<br><br>　　　　调停者模式：调停者模式包装了一系列对象相互作用的方式，使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些 对象之间的作用发生改变时，不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用 转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化，把对象在小尺度的行为上与其他对象的相互作用分开处理。<br><br>　　18、MEMENTO—同时跟几个MM聊天时，一定要记清楚刚才跟MM说了些什么话，不然MM发现了会不高兴的哦，幸亏我有个备忘录，刚才与 哪个MM说了什么话我都拷贝一份放到备忘录里面保存，这样可以随时察看以前的记录啦。<br><br>　　　　备忘录模式：备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下，将一 个对象的状态捉住，并外部化，存储起来，从而可以在将来合适的时候把这个对象还原到存储起来的状态。<br><br>　　19、OBSERVER—想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了，tom负责搜集情报，他发现的新情报不用一个一个通知 我们，直接发布给邮件组，我们作为订阅者(观察者)就可以及时收到情报啦<br><br>　　观察者模式：观察者模式定义了一种一队多的依赖关系，让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生 变化时，会通知所有观察者对象，使他们能够自动更新自己。<br><br>20、STATE—跟MM交往时，一定要注意她的状态哦，在不同的状态时她的行为会有不同，比如你约她今天晚上去看电影，对你没兴趣的 MM就会说&#8220;有事情啦&#8221;，对你不讨厌但还没喜欢上的MM就会说&#8220;好啊，不过可以带上我同事么?&#8221;，已经喜欢上你的MM就会说&#8220;几点钟?看完电 影再去泡吧怎么样?&#8221;，当然你看电影过程中表现良好的话，也可以把MM的状态从不讨厌不喜欢变成喜欢哦。<br><br>　　　　状态模式：状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究 的对象的行为包装在不同的状态对象里，每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变 的时候，其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时，系统便改变所选的子 类。<br><br>　　21、STRATEGY—跟不同类型的MM约会，要用不同的策略，有的请电影比较好，有的则去吃小吃效果不错，有的去海边浪漫最合适，单目 的都是为了得到MM的芳心，我的追MM锦囊中有好多Strategy哦。<br><br>　　　　策略模式：策略模式针对一组算法，将每一个算法封装到具有共同接口的独立的类中，从而使得它们可以相互替换。策略模式使得 算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类，各种算法在具体的策略类中提供 。由于算法和环境独立开来，算法的增减，修改都不会影响到环境和客户端。<br><br>　　22、TEMPLATE METHOD——看过《如何说服女生上床》这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求 、接吻、前戏、动手、爱抚、进去八大步骤(Template method)，但每个步骤针对不同的情况，都有不一样的做法，这就要看你随机应变啦(具 体实现); <br><br>　　　　模板方法模式：模板方法模式准备一个抽象类，将部分逻辑以具体方法以及具体构造子的形式实现，然后声明一些抽象方法来迫使 子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法，从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架，而将逻 辑的细节留给具体的子类去实现。<br><br>　　23、VISITOR—情人节到了，要给每个MM送一束鲜花和一张卡片，可是每个MM送的花都要针对她个人的特点，每张卡片也要根据个人的 特点来挑，我一个人哪搞得清楚，还是找花店老板和礼品店老板做一下Visitor，让花店老板根据MM的特点选一束花，让礼品店老板也根据每个 人特点选一张卡，这样就轻松多了; 　<br><br>　　　　访问者模式：访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话，接受这个操作的数 据结构可以保持不变。访问者模式适用于数据结构相对未定的系统，它把数据结构和作用于结构上的操作之间的耦合解脱开，使得操作集合可 以相对自由的演化。访问者模式使得增加新的操作变的很容易，就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象 中，而不是分散到一个个的节点类中。当使用访问者模式时，要将尽可能多的对象浏览逻辑放在访问者类中，而不是放到它的子类中。访问者 模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类</p>
</div>
<img src ="http://www.cnitblog.com/mordecai/aggbug/33020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/mordecai/" target="_blank">mordecai</a> 2007-09-05 22:03 <a href="http://www.cnitblog.com/mordecai/articles/33020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>