﻿<?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/songfei/category/4996.html</link><description>程序--人生--哲学___________________欢迎艳儿的加入</description><language>zh-cn</language><lastBuildDate>Fri, 29 Jun 2007 14:25:35 GMT</lastBuildDate><pubDate>Fri, 29 Jun 2007 14:25:35 GMT</pubDate><ttl>60</ttl><item><title>Java中的回调函数实例说明</title><link>http://www.blogjava.net/songfei/articles/126093.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Mon, 25 Jun 2007 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/126093.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/126093.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/126093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/126093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/126093.html</trackback:ping><description><![CDATA[<p>使用接口 &nbsp; <br>&nbsp; &nbsp; <br>&nbsp; 也就是使用多态来实现回调函数 &nbsp; <br>&nbsp; &nbsp; <br>public interface ICallback {<br>&nbsp; public void&nbsp;&nbsp; func();<br>}<br>&nbsp; &nbsp; <br>public class ClassWithCallbackFunction implements ICallback{<br>&nbsp; public ClassWithCallbackFunction() {<br>&nbsp; }<br>&nbsp; public void func(){<br>&nbsp;&nbsp;&nbsp; System.out.println("cccccccccccccccccc");<br>&nbsp; }<br>}<br>&nbsp; &nbsp; <br>public class Caller {<br>&nbsp; ICallback callback;<br>&nbsp; public void doCallback() {<br>&nbsp;&nbsp;&nbsp; callback.func();<br>&nbsp; }</p>
<p>&nbsp; public void setCallback(ICallback callback) {<br>&nbsp;&nbsp;&nbsp; this.callback = callback;<br>&nbsp; }</p>
<p>}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>public class MainClass {<br>&nbsp; public MainClass() {<br>&nbsp; }</p>
<p>&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp; Caller caller = new Caller();<br>&nbsp;&nbsp;&nbsp; caller.setCallback(new ClassWithCallbackFunction() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void func() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("aaaaaaaaaa");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp; caller.doCallback();<br>&nbsp; }<br>}&nbsp; <br>现实中是把doCallback()方法放在setCallback里调用,以上是为了说明回调原理<br>public class Caller {<br>&nbsp; ICallback callback;<br>&nbsp; public void doCallback() {<br>&nbsp;&nbsp;&nbsp; callback.func();<br>&nbsp; }</p>
<p>&nbsp; public void setCallback(ICallback callback) {<br>&nbsp;&nbsp;&nbsp; this.callback = callback;<br>&nbsp;&nbsp;&nbsp; doCallback();<br>&nbsp; }</p>
<p>}<br></p>
<img src ="http://www.blogjava.net/songfei/aggbug/126093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2007-06-25 14:13 <a href="http://www.blogjava.net/songfei/articles/126093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于weblogic下静态页面下载文件（配置mime类型）的疑问！！！</title><link>http://www.blogjava.net/songfei/articles/122120.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Tue, 05 Jun 2007 05:15:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/122120.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/122120.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/122120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/122120.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/122120.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width="99%"><br>提交时间: May 17, 2007 4:06:14 PM </td>
            <td width="1%"></td>
        </tr>
        <tr>
            <td class=message_content style="BORDER-TOP: #ccc 1px solid" colSpan=2><br>
            <table style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all; WORD-WRAP: break-word" width="100%">
                <tbody>
                    <tr>
                        <td>测试过程中的体会：<br><br>第一、修改文件类型处理只需修改站点下，也就是WEB_INF下的web.xml文件即可<br><br>（a）、下载<br><br>&nbsp;&nbsp;&nbsp; &lt;mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;extension&gt;zip&lt;/extension&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mime-type&gt;application/zip&lt;/mime-type&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp; &lt;mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;extension&gt;rar&lt;/extension&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mime-type&gt;application/rar&lt;/mime-type&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp; &lt;mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;extension&gt;exe&lt;/extension&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp; &lt;mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;extension&gt;iso&lt;/extension&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/mime-mapping&gt;<br><br>&nbsp;&nbsp;&nbsp; &lt;mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;extension&gt;doc&lt;/extension&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mime-type&gt;application/doc&lt;/mime-type&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/mime-mapping&gt;<br><br>（b）、打开<br><br>如果想要在IE中自动打开DOC，XLS，PDF文件的配置如下: <br>&lt;mime-mapping&gt; <br>&lt;extension&gt;doc&lt;/extension&gt; <br>&lt;mime-type&gt;application/msword&lt;/mime-type&gt; <br>&lt;/mime-mapping&gt; <br><br>&lt;mime-mapping&gt; <br>&lt;extension&gt;xls&lt;/extension&gt; <br>&lt;mime-type&gt;application/msexcel&lt;/mime-type&gt; <br>&lt;/mime-mapping&gt; <br><br>&lt;mime-mapping&gt; <br>&lt;extension&gt;pdf&lt;/extension&gt; <br>&lt;mime-type&gt;application/pdf&lt;/mime-type&gt; <br>&lt;/mime-mapping&gt;<br><br><br>第二、测试的时候一定记得清除一下你浏览器的缓存(否则你会晕掉的)，也就是打开IE&#8220;工具&#8221;--&gt;&#8220;Internet选项&#8221;--&gt;&#8220;常规&#8221;--&gt;&#8220;删除文件&#8221;--&gt;&#8220;清除历史&#8221;--&gt;&#8220;确定&#8221;</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/songfei/aggbug/122120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2007-06-05 13:15 <a href="http://www.blogjava.net/songfei/articles/122120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java1.5泛型指南中文版(Java1.5 Generic Tutorial)</title><link>http://www.blogjava.net/songfei/articles/117542.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Tue, 15 May 2007 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/117542.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/117542.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/117542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/117542.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/117542.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java1.5泛型指南中文版(Java1.5 Generic Tutorial)英文版pdf下载链接：http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&...&nbsp;&nbsp;<a href='http://www.blogjava.net/songfei/articles/117542.html'>阅读全文</a><img src ="http://www.blogjava.net/songfei/aggbug/117542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2007-05-15 11:10 <a href="http://www.blogjava.net/songfei/articles/117542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>日期操作java转载</title><link>http://www.blogjava.net/songfei/articles/109696.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Tue, 10 Apr 2007 09:54:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/109696.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/109696.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/109696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/109696.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/109696.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: package jp.co.smile.common.utility;import java.text.DecimalFormat;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;import java.uti...&nbsp;&nbsp;<a href='http://www.blogjava.net/songfei/articles/109696.html'>阅读全文</a><img src ="http://www.blogjava.net/songfei/aggbug/109696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2007-04-10 17:54 <a href="http://www.blogjava.net/songfei/articles/109696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX实践DWR篇</title><link>http://www.blogjava.net/songfei/articles/105567.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Thu, 22 Mar 2007 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/105567.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/105567.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/105567.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/105567.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/105567.html</trackback:ping><description><![CDATA[
		<div class="textbox-title">
				<h4>AJAX实践<a name="baidusnap0" _base_href="http://mengyang.baby.cn/archives/2006/20.html"></a><b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>篇</h4>
				<div class="textbox-label">[ 2006-6-13 8:51:00 | By: mengyang ]</div>
		</div>
		<div class="textbox-content">
				<table style="TABLE-LAYOUT: fixed" cellspacing="0" cellpadding="0" width="100%" border="0" _base_href="http://mengyang.baby.cn/archives/2006/20.html">
						<tbody _base_href="http://mengyang.baby.cn/archives/2006/20.html">
								<tr _base_href="http://mengyang.baby.cn/archives/2006/20.html">
										<td valign="top" _base_href="http://mengyang.baby.cn/archives/2006/20.html">
												<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>(Direct Web Remoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.利用<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样(<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>根据Java类来动态生成JavaScrip代码).它的最新版本<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>0.6添加许多特性如:支持Dom Trees的自动配置,支持Spring(JavaScript远程调用spring bean),更好浏览器支持,还支持一个可选的commons-logging日记操作.<br /><br />以上摘自open-open，看了几天，确实是一个非常优秀的项目，它通过反射，将java翻译成javascript，然后利用回调机制，轻松实现了javascript调用Java代码。<br /><br />其大概开发过程如下：<br />1.编写业务代码，该代码是和<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>无关的。<br />2.确认业务代码中哪些类、哪些方法是要由javascript直接访问的。<br />3.编写<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>组件，对步骤2的方法进行封装。<br />4.配置<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>组件到<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.xml文件中，如果有必要，配置convert，进行java和javascript类型互转。<br />5.通过反射机制，<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>将步骤4的类转换成javascript代码，提供给前台页面调用。<br />5.编写网页，调用步骤5的javascript中的相关方法（间接调用服务器端的相关类的方法），执行业务逻辑，将执行结果利用回调函数返回。<br />6.在回调函数中，得到执行结果后，可以继续编写业务逻辑的相关javascript代码。<br /><br />下面以用户注册的例子，来说明其使用。（注意，本次例子只是用于演示，说明<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>的使用，类设计并不是最优的）。<br /><br />1.先介绍下相关的Java类<br /><br />  User: 用户类，<br />  public class User {<br />//登陆ID，主键唯一<br />private String id;<br />//姓名<br />private String name;<br />//口令<br />private String password;<br />//电子邮件<br />private String email;<br />        <br />//以下包含getXXX和setXXX方法<br />.......<br />  }<br /><br />  UserDAO：实现User的数据库访问，这里作为一个演示，编写测试代码<br />  public class UserDAO { <br />    //存放保存的数据<br />    private static Map dataMap = new HashMap();<br /><br />    //持久用户<br />    public boolean save(User user) {<br />      if (dataMap.containsKey(user.getId()))<br />        return false;<br />      System.out.println("下面开始保存用户");<br />      System.out.println("id："+user.getId());<br />      System.out.println("password："+user.getPassword());<br />      System.out.println("name："+user.getName());<br />      System.out.println("email："+user.getEmail());<br />      dataMap.put(user.getId(), user);<br />      System.out.println("用户保存结束");<br />      return true;<br />    }<br /><br />    //查找用户<br />    public User find(String id) {<br />      return (User)dataMap.get(id);<br />    }<br />}<br /><br />  DWRUserAccess：<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>组件，提供给javascript访问的。<br /><br />  public class DWRUserAccess {<br /><br />      UserDAO userDAO = new UserDAO();<br /><br />      public boolean save(User user) {<br />        return userDAO.save(user);<br />      }<br /><br />      public User find(String id) {<br />        return userDAO.find(id);<br />      }<br />  }<br />  <br /><br />  下面说明下程序执行的流程<br /><br />  1.用户在页面上输入相关注册信息，id、name、password、email，点击“提交”按钮<br />  2.javascript代码开始执行，根据用户填写相关信息，通过<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>提供的DWRUserAccess.js里save的方法，调用服务器端的DWRUserAccess类save方法，将注册信息保存。<br />  3.通过DWRUserAccess.jsp里的find方法，调用服务器端DWRUserAccess类里的find方法，执行用户信息查找。<br /><br />  注意，在以上的执行过程中，DWRUserAccess是供<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>调用的，是<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>组件，因此需要将DWRUserAccess类配置到<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>中。<br /><br />  接下来讲解本次<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>测试环境的配置。<br /><br />  1.新建一个webapp，命名为testApp<br />  2.将<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.jar拷贝到testApp的WEB-INF的lib目录下<br />  3.编译上面的User，UserDAO，DWRUserAccess类，放到classes目录下<br />  4.在web.xml中配置servlet,适配路径到<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>目录下,如下所示<br />    &lt;servlet&gt;<br />    &lt;servlet-name&gt;<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>-invoker&lt;/servlet-name&gt;<br />    &lt;display-name&gt;<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b> Servlet&lt;/display-name&gt;<br />    &lt;description&gt;Direct Web Remoter Servlet&lt;/description&gt;<br />    &lt;servlet-class&gt;uk.ltd.getahead.<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.DWRServlet&lt;/servlet-class&gt;<br />    &lt;init-param&gt;<br />      &lt;param-name&gt;debug&lt;/param-name&gt;<br />      &lt;param-value&gt;true&lt;/param-value&gt;<br />    &lt;/init-param&gt;<br />    &lt;init-param&gt;<br />      &lt;param-name&gt;scriptCompressed&lt;/param-name&gt;<br />      &lt;param-value&gt;false&lt;/param-value&gt;<br />    &lt;/init-param&gt;<br />    &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />  &lt;/servlet&gt;<br /><br />  &lt;servlet-mapping&gt;<br />    &lt;servlet-name&gt;<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>-invoker&lt;/servlet-name&gt;<br />    &lt;url-pattern&gt;/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/*&lt;/url-pattern&gt;<br />  &lt;/servlet-mapping&gt;<br /><br />  以上的配置可以拦截testApp下所有指向<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>的请求，关于这个拦截器，我们会在后面介绍。<br /><br />  5.WEB-INF下新建一个<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.xml文件，内容如下：<br />  &lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE <b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b> PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>10.dtd"&gt;<br /><br />&lt;<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>&gt;<br />  &lt;allow&gt;<br />&lt;create creator="new" javascript="DWRUserAccess"&gt;<br />      &lt;param name="class" value="test.DWRUserAccess"/&gt;<br />    &lt;/create&gt;<br />&lt;convert converter="bean" match="test.User"/&gt;<br />  &lt;/allow&gt;<br />&lt;/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>&gt;<br /><br />  这里我们把DWRUserAccess配置到了<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>中，create元素中，creater="new"表示每调用一次DWRUserAccess时，需要new一个这样的类；javascript="DWRUserAccess"，表示提供给前台页面调用的javascirpt文件是DWRUserAccess.js。<br /><br />  convert元素用于数据类型转换，即java类和javascript之间相互转换，因为和前台交换的是User对象，因此需要对此使用bean转换，我们将在后面介绍这个类。<br /><br />  4.编写测试的HTML页面 test.html<br />   &lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;<br />&lt;HTML&gt;<br />&lt;HEAD&gt;<br />&lt;TITLE&gt;<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>测试&lt;/TITLE&gt;<br />&lt;meta http-equiv=Content-Type content="text/html; charset=gb2312"&gt;<br />&lt;script src="/oblog312/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/engine.js"&gt;&lt;/script&gt;<br />&lt;script src="/oblog312/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/util.js"&gt;&lt;/script&gt;<br />&lt;script src="/oblog312/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/interface/DWRUserAccess.js"&gt;&lt;/script&gt;<br />&lt;/HEAD&gt;<br />&lt;BODY&gt;<br />&lt;B&gt;用户注册&lt;/B&gt;&lt;br&gt;<br />------------------------------------------------<br />&lt;Br&gt;<br />&lt;form name="regForm"&gt;<br />登陆ID：&lt;input type="text" name="id"&gt;&lt;br&gt;<br />口  令：&lt;input type="password" name="password"&gt;&lt;br&gt;<br />姓  名：&lt;input type="text" name="name"&gt;&lt;br&gt;<br />电子邮件：&lt;input type="text" name="email"&gt;&lt;br&gt;<br />&lt;input type="button" name="submitBtn" value="提交" onclick="OnSave()"&gt;&lt;br&gt;<br />    &lt;/form&gt;<br /><br />&lt;br&gt;<br />&lt;br&gt;&lt;B&gt;用户查询&lt;/B&gt;&lt;br&gt;<br />------------------------------------------------<br />&lt;Br&gt;<br />&lt;form name="queryForm"&gt;<br />登陆ID：&lt;input type="text" name="id"&gt;&lt;br&gt;<br />&lt;input type="button" name="submitBtn" value="提交" onclick="OnFind()"&gt;&lt;br&gt;<br />&lt;/form&gt;<br />&lt;br&gt;<br />&lt;/BODY&gt;<br />&lt;/HTML&gt;<br />&lt;SCRIPT LANGUAGE="JavaScript"&gt;<br />&lt;!--<br />function saveFun(data) {<br />if (data) {<br />  alert("注册成功！");<br />} else {<br />  alert("登陆ID已经存在！");<br />}<br />}<br /><br />function OnSave() {<br />var userMap = {};<br />userMap.id = regForm.id.value;<br />userMap.password = regForm.password.value;<br />userMap.name = regForm.name.value;<br />userMap.email = regForm.email.value;<br />DWRUserAccess.save(userMap, saveFun); <br />}<br /><br />function findFun(data) {<br />if (data == null) {<br />  alert("无法找到用户："+queryForm.id.value);<br />  return;<br />}<br /><br />alert("找到用户，\nid："+data.id+"，\npassword："+data.password+"，\nname："+data.name+"，\nemail："+data.email);<br /><br />}<br /><br />function OnFind() {<br />DWRUserAccess.find(queryForm.id.value, findFun); <br />}<br />//--&gt;<br />&lt;/SCRIPT&gt;<br /><br /><br />以下对页面的javascript进行解释<br /><br />&lt;script src="/oblog312/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/engine.js"&gt;&lt;/script&gt;<br />&lt;script src="/oblog312/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/util.js"&gt;&lt;/script&gt;<br />这两个是<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>提供的，用户可以不必关心，只需要导入即可<br /><br />&lt;script src="/oblog312/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/interface/DWRUserAccess.js"&gt;&lt;/script&gt;<br />是我们编写的DWRUserAccess类，经<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>反射后，生成的javascript代码，它和DWRUserAccess.java是对应的，供用户调用，实际上我们就是通过这个js文件去调用服务器端的DWRUserAccess类的。<br /><br />&lt;SCRIPT LANGUAGE="JavaScript"&gt;<br />&lt;!--<br />function saveFun(data) {<br />if (data) {<br />  alert("注册成功！");<br />} else {<br />  alert("用户名已经存在！");<br />}<br />}<br /><br />function OnSave() {<br />var userMap = {};<br />userMap.id = regForm.id.value;<br />userMap.password = regForm.password.value;<br />userMap.name = regForm.name.value;<br />userMap.email = regForm.email.value;<br />DWRUserAccess.save(userMap, saveFun); <br />}<br /><br />function findFun(data) {<br />if (data == null) {<br />  alert("无法找到用户："+queryForm.id.value);<br />  return;<br />}<br /><br />alert("找到用户，\nid："+data.id+"，\npassword："+data.password+"，\nname："+data.name+"，\nemail："+data.email);<br /><br />}<br /><br />function OnFind() {<br />DWRUserAccess.find(queryForm.id.value, findFun); <br />}<br />//--&gt;<br />&lt;/SCRIPT&gt;<br /><br />这段javascirpt代码，我们来看下OnSave函数，首先它构造一个map，将表单数据都设置到map中，然后调用 DWRUserAccess.save(userMap, saveFun)，执行save操作。大家可以注意到，服务器端的DWRUserAccess中的save方法是这样的：boolean save(User user)，其参数是一个User对象，返回一个boolean值；而客户端的方法是这样的：save(userMap,saveFun)，第一个参数 userMap是javascirpt中的map对象，在这里相当于服务器端的User对象（在服务器端执行时，会通过convert转换成User对象），前面我们提到<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>是利用回调函数来返回执行结果的，第二个参数saveFun即是一个回调函数。在函数function saveFun(data)中，data是执行结果，这里是一个bool值，非常简单的，我们通过判断data是否为真，可以知道用户名是否重复，用户是否注册成功。<br /><br />看一下OnFind查找函数，执行结果在回调函数findFun(data)中，因为服务器端返回的是一个User对象，通过convert，将会转换成javascript的一个map对象，<br />于是在findFun中，通过data.id、data.name、data.password、data.email我们可以轻松的访问到这个User对象。<br /><br /><br />好了配置完毕，启动服务器，在目录中打入localhost/testApp/test.html。<br /><br />1.在“用户注册”表单中，id框中输入admin，password中输入123456，name中输入chenbug，email中输入chenbug@zj.com，点击提交按钮，弹出对话框：“注册成功”，在服务器后台可以看到信息如下：<br /><br />下面开始保存用户<br />id：admin<br />password：123456<br />name：chenbug<br />email：chenbug@zj.com<br />用户保存结束<br /><br />再次点击提交按钮，弹出对话框“登陆ID已经存在”。<br /><br />2.在“用户查询”对话框中，输入登陆ID为admin，点击提交按钮，提示找到用户，并显示相关信息，输入admin123，点击提交按钮，提示无法找到用户。<br /><br />至此，测试结束。<br /><br /><br />后续：<br />1。拦截器 uk.ltd.getahead.<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.DWRServlet<br />该类拦截所有指向<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>目录下的请求，并调用Processor的handler方法进行处理，在uk.ltd.getahead.<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.impl.DefaultProcessor下，我们可以看到详细的处理过程。<br />if (pathInfo.length() == 0 ||<br />            pathInfo.equals(HtmlConstants.PATH_ROOT) ||<br />            pathInfo.equals(req.getContextPath()))<br />        {<br />            resp.sendRedirect(req.getContextPath() + servletPath + HtmlConstants.FILE_INDEX);<br />        }<br />        else if (pathInfo.startsWith(HtmlConstants.FILE_INDEX))<br />        {<br />            index.handle(req, resp);<br />        }<br />        else if (pathInfo.startsWith(HtmlConstants.PATH_TEST))<br />        {<br />            test.handle(req, resp);<br />        }<br />        else if (pathInfo.startsWith(HtmlConstants.PATH_INTERFACE))<br />        {<br />            iface.handle(req, resp);<br />        }<br />        else if (pathInfo.startsWith(HtmlConstants.PATH_EXEC))<br />        {<br />            exec.handle(req, resp);<br />        }<br />        else if (pathInfo.equalsIgnoreCase(HtmlConstants.FILE_ENGINE))<br />        {<br />            file.doFile(req, resp, HtmlConstants.FILE_ENGINE, HtmlConstants.MIME_JS);<br />        }<br />        else if (pathInfo.equalsIgnoreCase(HtmlConstants.FILE_UTIL))<br />        {<br />            file.doFile(req, resp, HtmlConstants.FILE_UTIL, HtmlConstants.MIME_JS);<br />        }<br />        else if (pathInfo.equalsIgnoreCase(HtmlConstants.FILE_DEPRECATED))<br />        {<br />            file.doFile(req, resp, HtmlConstants.FILE_DEPRECATED, HtmlConstants.MIME_JS);<br />        }<br />        else<br />        {<br />            log.warn("Page not found (" + pathInfo + "). In debug/test mode try viewing /[WEB-APP]/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/"); //$NON-NLS-1$ //$NON-NLS-2$<br />            resp.sendError(HttpServletResponse.SC_NOT_FOUND);<br />        }<br /><br />通过判断request请求的servlet路径，进行处理，大家可以自己去参看，这里不详细讨论。<br /><br /><br />2.bean转换器，&lt;convert converter="bean" match="test.User"/&gt;<br />将<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.jar解压缩，在路径uk\ltd\getahead\<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>下可以看到<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.xml，这里配置了系统默认的一些转换器，<br />&lt;converter id="bean" class="uk.ltd.getahead.<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.convert.BeanConverter"/&gt;即是刚才用到User类的转换器，进入代码我们来看看它是如何在javascript和java间进行转换的。<br /><br />打开BeanConverter代码，定位到函数<br /><br />public Object convertInbound(Class paramType, InboundVariable iv, InboundContext inctx) throws ConversionException<br /><br />即是将javascript对象转换成java对象的，其中<br />paramType即Class类型，在上面的例子中是test.User，<br />InboundVariable iv，是传入的值，通过iv.getValue可以得到传入的javascript值串<br />InboundContext inctx，是入口参数上下文，用于保存转换的后java对象。<br /><br />因为前台传入的是一个javascript的map类型，而map肯定是以{开始和以}结束的，于是在这个函数一开始进行了判断<br />if (!value.startsWith(ConversionConstants.INBOUND_MAP_START))<br />        {<br />            throw new IllegalArgumentException(Messages.getString("BeanConverter.MissingOpener", ConversionConstants.INBOUND_MAP_START)); //$NON-NLS-1$<br />        }<br /><br />        if (!value.endsWith(ConversionConstants.INBOUND_MAP_END))<br />        {<br />            throw new IllegalArgumentException(Messages.getString("BeanConverter.MissingCloser", ConversionConstants.INBOUND_MAP_START)); //$NON-NLS-1$<br />        }<br /><br />javascript中，map里各个项是用逗号连接的，如var userMap = {id:'admin',password:'123456',name:'chenbug',email:'chenbug@zj.com'};而每个项的键值对是用冒号连接的，<br />在convertInbound函数的接下来的处理中，即是通过分析map字串，通过paramType构造java实例（即User类），然后通过反射，将这些键值对设置到java实例中，并返回。<br />这样就完成了javascript到java的转换。<br /><br /><br />另一个函数<br />public String convertOutbound(Object data, String varname, OutboundContext outctx) throws ConversionException<br /><br />即是将java对象转换为javascript对象（其实是声明和赋值语句）。<br />Object data ，是待转换的java对象<br />String varname，是javascript中的该对象的变量名<br />OutboundContext outctx，传出参数上下文，用于保存转换后的javascript值<br /><br />StringBuffer buffer = new StringBuffer();<br />        buffer.append("var "); //$NON-NLS-1$<br />        buffer.append(varname);<br />        buffer.append("={};"); //$NON-NLS-1$<br />这里声明了map类型的变量。<br /><br />即下来来的代码即是通过反射进行变量赋值，如下<br />  buffer.append(varname);<br />                    buffer.append('.');<br />                    buffer.append(name);<br />                    buffer.append('=');<br />                    buffer.append(nested.getAssignCode());<br />                    buffer.append(';');<br />大家可以自己去参看更多的代码。<br /><br />3.<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>本身提供了一个测试环境，大家在配置完后，可以在IE中输入地址http://localhost/testApp/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/index.html，看到配置的各<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>组件，并进行相关测试。<br /><br />testApp下载地址 http://waplife.cn/testApp.rar</td>
								</tr>
						</tbody>
				</table>
		</div>
<img src ="http://www.blogjava.net/songfei/aggbug/105567.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2007-03-22 15:30 <a href="http://www.blogjava.net/songfei/articles/105567.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP标签库参考文章</title><link>http://www.blogjava.net/songfei/articles/103548.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Tue, 13 Mar 2007 07:44:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/103548.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/103548.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/103548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/103548.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/103548.html</trackback:ping><description><![CDATA[
		<div class="tit">一篇可以做为参考手册的JSP标签库文章</div>
		<div class="date">2007-03-03 14:05</div>
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt">
												<p>标准的JSP 标记可以调用JavaBeans组件或者执行客户的请求，这大大降低了JSP开发的复杂度和维护量。JSP技术也允许你自定义taglib，其实换句话说，taglib可以看成是对JSP标记的一种扩展，正如xml是对html的一种扩展一样。taglib通常定义在tag标签库中，这种标签库存放着你自己定义的tag标签。简而言之，如果使用taglib，那么你可以设计自己的JSP标记！</p>
												<p>一般来说，自定义tag标签主要用于操作隐藏对象、处理html提交表单、访问数据库或其它企业级的服务，诸如邮件和目录操作等等。自定义tag标签的使用者一般都是那些对java编程语言非常精通，而且对数据访问和企业级服务访问都非常熟悉的程序员，对于HTML设计者来说，使得他可以不去关注那些较复杂的商业逻辑，而将精力放在网页设计上。同时，它也将库开发者和库使用者进行合理分工，自定义tag标签将那些重复工作进行封装，从而大大提高了生产力，而且可以使得tag库可用于不同的项目中，完美地体现了软件复用的思想。</p>
												<p>在这篇文章中，我们主要讨论：</p>
												<p>· 什么是自定义tag标签？</p>
												<p>· 怎么使用tag标签？</p>
												<p>o 声明要使用的tag库</p>
												<p>o 找到与之对应的tag处理类</p>
												<p>o tag标签的类型</p>
												<p>· 自定义tag标签</p>
												<p>o tag处理类</p>
												<p>o tag库描述</p>
												<p>o tag标签示例</p>
												<p>o 带属性的tag</p>
												<p>o 带body的tag</p>
												<p>o 定义了脚本变量的tag</p>
												<p>o 具有协作关系的tag</p>
												<p>· 自定义tag标签</p>
												<p>o 一个迭代tag的例子</p>
												<p>o 一个模板tag库</p>
												<p>o tag处理类到底是怎样被调用的？</p>
												<p>
														<br />什么是自定义的tag?</p>
												<p>一个自定义的tag标签是用户定义的一种JSP标记。当一个含有自定义的tag标签的JSP页面被jsp引擎编译成servlet时，tag标签被转化成了对一个称为tag处理类的对象进行的操作。于是当JSP页面被jsp引擎转化为servlet后，实际上tag标签被转化成为了对tag处理类的操作。</p>
												<p>自定义tag标签有很多特色，诸如：</p>
												<p>· 可以在JSP页面中自定义tag标签的属性</p>
												<p>· 访问JSP页面中的所有对象</p>
												<p>· 可以动态地修改页面输出</p>
												<p>· 彼此这间可以相互通信。你可以先创建一个JavaBeans组件，然后在一个tag中调用此JavaBeans组件，同时可以在另一个tag中调用它。</p>
												<p>· tag允许相互嵌套，可以在一个JSP页面中完成一些复杂的交互。</p>
												<p>
														<br />使用tag标签</p>
												<p>
														<br />本节主要描述怎样在JSP页面中使用tag标签，以及tag标签的不同类型。</p>
												<p>要使用tag标签，JSP程序员必须做2件事：</p>
												<p>· 声明此tag标签的tag库</p>
												<p>· 实现此tag标签</p>
												<p>声明tag标签所在的tag库</p>
												<p>如果要使用tag标签，则应用JSP的taglib指示符来指定其tag库（注意：taglib要在在使用此tag标签之前声明）</p>
												<p>&lt;%@ taglib uri=”/WEB-INF/tutorial-template.tld” prefix=”tt” %&gt;</p>
												<p>uri属性定义了唯一的标签库描述(以下简称TLD)，它可以是直接是tld文件名或一个独一无二的名字。prefix是用来区别其它TLD中和本TLD中有重名的tag的一种手段。</p>
												<p>TLD必须以.tld作为扩展名，并且存放在当前应用的WEB-INF目录或其子目录下。你可以通过它的文件名直接引用它，也可以通过别的方式间接地引用它。</p>
												<p>以下taglib指示符直接引用一个TLD：</p>
												<p>&lt;%@ taglib uri=”/WEB-INF/tutorial-template.tld” prefix=”tt” %&gt;</p>
												<p>以下的taglib指示符通过一个逻辑名称间接地引用一个TLD：</p>
												<p>&lt;%@ taglib uri=”/tutorial-template” prefix=”tt” %&gt;</p>
												<p>如果是间接引用TLD的话，那你必须还要在web.xml中定义此逻辑名称与tld文件之间的映射，具体做法是在web.xml中加入一个名为taglib的元素：</p>
												<p>&lt;taglib&gt;</p>
												<p>&lt;taglib-uri&gt;/tutorial-template&lt;/taglib-uri&gt;</p>
												<p>&lt;taglib-location&gt;</p>
												<p>/WEB-INF/tutorial-template.tld</p>
												<p>&lt;/taglib-location&gt;</p>
												<p>&lt;/taglib&gt;</p>
												<p>
														<br />实现此tag标签</p>
												<p>
														<br />为了实现tag标签，你有2种方法来存放tag处理类。一、让tag处理类以.class的方式存放于当前应用的WEB-INF/class子目录下，二、如果tag处理类是以JAR包的形式存在的话，那可以放在当前应用的WEB-INF/lib目录下，如果tag处理类要在多个应用中共享，那么它就应放在jsp服务器上的common/lib目录下，对于tomcat来说，就是tomcat/common/lib目录下。</p>
												<p>
														<br />tag标签类型</p>
												<p>
														<br />自定义的tag标签遵循XML语法。它有一个开始标记和一个结束标记，有的还有body（即文本节点）：</p>
												<p>&lt;tt:tag&gt;</p>
												<p>body</p>
												<p>&lt;/tt:tag&gt;</p>
												<p>
														<br />一个不带body的tag标签如下：</p>
												<p>&lt;tt:tag /&gt;</p>
												<p>
														<br />简单的tag标签</p>
												<p>一个没有body和属性的tag标签如下：</p>
												<p>&lt;tt:simple /&gt;</p>
												<p>
														<br />带属性的tag标签</p>
												<p>
														<br />自定义标签可以有自己的属性。属性一般在开始标记中定义，语法为 attr=”value”。属性的作用相当于自定义标签的一个参数，它影响着tag处理类的行为。你可以在TLD中详细定义它。</p>
												<p>你可以用一个String常量给一个属性赋值，也可以通过表达式给它赋值，如&lt;%= ...%&gt;。以struts为例，它的logic:present标签就是用的String常量来给属性赋值：</p>
												<p>&lt;loglic:present parameter = “Clear”&gt;</p>
												<p>而另一个标签logic:iterate是用表达式来给属性赋值：</p>
												<p>&lt;logci:iterate collection=”&lt;%= bookDB.getBooks() %&gt;”</p>
												<p>id=”book” type=”database.BookDetails”&gt;</p>
												<p>
														<br />带body的tag标签</p>
												<p>一个自定义标签可以包含其它自定义标签、脚本变量、HTML标记或其它内容。</p>
												<p>在下述例子中，此JSP页面使用了struts的logic:present标签，如果些标签定义了parameter=”Clear”的属性，则将清除购物车的内容，然后打印出一条信息：</p>
												<p>&lt;logic:present parameter=”Clear”&gt;</p>
												<p>&lt;% cart.clear(); %&gt;</p>
												<p>&lt;font color=”#ff0000” size=”+2”&gt;&lt;strong&gt;</p>
												<p>你选择了清除购物车！</p>
												<p>&lt;/strong&gt;&lt;/font&gt;</p>
												<p>&lt;/logic:present&gt;</p>
												<p>
														<br />到底是用属性还是用body来传递信息？</p>
												<p>如上所述，我们既可以通过属性，也可以通过body来传递信息。但一般来说，比较简单的类型，如字符串或简单表达式最好采用属性来传递信息。</p>
												<p>
														<br />定义脚本变量的tag标签</p>
												<p>所谓脚本变量，是指JSP中可以调用的变量或对象。它可由tag标签产生。以下示例阐述了一个tag标签定义了一个名为tx的由JNDI所定义的事务处理对象。脚本变量可以是ejb对象、事务、数据库连接等等：</p>
												<p>&lt;tt:lookup id=”tx” type=”UserTransaction” name=”java:comp/UserTransaction” /&gt;</p>
												<p>&lt;% tx.begin(); %&gt;</p>
												<p>...</p>
												<p>
														<br />具有协作关系的tag标签</p>
												<p>自定义tag标签之间可以通过共享对象来实现协作。在下述例子中，标签tag1创建了一个名为obj1的对象，在标签tag2仍可以重复使用obj。</p>
												<p>&lt;tt:tag1 attr1=”obj1” value1=”value” /&gt;</p>
												<p>&lt;tt:tag2 attr1=”obj1” /&gt;</p>
												<p>在以下这个例子当中，如果外层的tag标签创建了一个对象，那么其内层的所有tag标签都可以使用这个对象。由于这样产生的对象没有一个指定的名字，那么就可以将少重名的冲突。这个例子阐述了一系列协作的嵌套对象。</p>
												<p>&lt;tt:outerTag&gt;</p>
												<p>&lt;tt:innerTag /&gt;</p>
												<p>&lt;/tt:outerTag&gt;</p>
												<p>Tag处理类</p>
												<p>
														<br />Tag处理类必须实现Tag接口或BodyTag接口，不过现在一般都流行从TagSupport或BodyTagSupport类中继承，这些类或接口都可以在javax.servlet.jsp.tagext包中找到。</p>
												<p>当JSP引擎看到自己的JSP页面中包含有tag标签时，它会调用doStartTag方法来处理tag标签的开头，调用doEndTag方法来处理tag标签的结束。</p>
												<p>下表说明不同类型的tag所需要不同的处理过程：</p>
												<p>Tag处理类的方法 </p>
												<p>Tag标签类型<br />所调用的方法</p>
												<p>基本标签<br />doStartTag, doEndTag, release</p>
												<p>带属性的标签<br />doStartTag, doEndTag, set/getAttribute1...N, release</p>
												<p>带内容的标签<br />doStartTag, doEndTag, release</p>
												<p>带内容的标签，且内容重复循环<br />doStartTag, doAfterBody, doEndTag, release</p>
												<p>带内容的标签，且内容与JSP交互<br />doStartTag, doEndTag, release, doInitBody, doAfterBody, release</p>
												<p>一个tag处理类可以通过javax.servlet.jsp.PageContext来与JSP交互，通过javax.servlet.jsp.PageContext类，tag处理类可以访问JSP中的request、session和application对像。</p>
												<p>如果tag标签是互相嵌套的，那内层的tag处理类可以通过它的parent属性来访问上层的tag处理类。</p>
												<p>一般情况都将所有的tag处理类打成了JAR的包，以便于发布。</p>
												<p>
														<br />Tag库描述(简称TLD)</p>
												<p>
														<br />Tag库是用xml语言描述的，TLD包括了tag库中所有tag标签的描述，它一般用来被jsp服务器用来校验tag的语法正确性，或者被jsp开发者用来开发新的标签。</p>
												<p>TLD的文件扩展名必须为.tld，而且必须放在当前WEB应用的WEB-INF目录或其子目录中。</p>
												<p>一个TLD的内容的开头必须遵守标准的XML开头，用于描述DTD和xml的版本，例如：</p>
												<p>&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;</p>
												<p>&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>http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd</u></a>"&gt;<br />TLD必须以&lt;taglib&gt;来作为它的根元素，&lt;taglib&gt;的子元素如下表：</p>
												<p>
														<br />&lt;taglib&gt;的子元素 </p>
												<p>Element<br />Description</p>
												<p>tlib-version<br />Tag库的版本</p>
												<p>jsp-version<br />Tag库所需要的jsp的版本</p>
												<p>short-name<br />助记符，tag的一个别名（可选）</p>
												<p>uri<br />用于确定一个唯一的tag库</p>
												<p>display-name<br />被可视化工具（诸如Jbuilder）用来显示的名称（可选）</p>
												<p>small-icon<br />被可视化工具（诸如Jbuilder）用来显示的小图标（可选）</p>
												<p>large-icon<br />被可视化工具（诸如Jbuilder）用来显示的大图标（可选）</p>
												<p>description<br />对tag库的描述（可选）</p>
												<p>listener<br />参见下面listener元素</p>
												<p>tag<br />参见下面tag 元素</p>
												<p>Listener元素</p>
												<p>一个tag库可能定义一些类做为它的事件侦听类，这些类在TLD中被称为listener 元素，jsp服务器将会实例化这些侦听类，并且注册它们。Listener元素中有一个叫listener-class的子元素，这个元素的值必须是该侦听类的完整类名。</p>
												<p>Tag元素</p>
												<p>每个tag元素在tag库中都要指出它的名字、类名、脚本变量、tag的属性。其中脚本变量的值可以直接在TLD中定义或通过tag附加信息的类来取得。每个属性描述了这个属性是否可以省略，它的值是否可以通过&lt;%= …%&gt;这样的JSP语法来获得，以及属性的类型。</p>
												<p>每一个tag在TLD中对应一个tag元素，下表是tag元素的子元素：</p>
												<p>Tag元素的子元素</p>
												<p>元素名称<br />描述</p>
												<p>name<br />独一无二的元素名</p>
												<p>tag-class<br />Tag标签对应的tag处理类</p>
												<p>tei-class<br />javax.servlet.jsp.tagext.TagExtraInfo的子类，用于表达脚本变量（可选）</p>
												<p>body-content<br />Tag标签body的类型</p>
												<p>display-name<br />被可视化工具（诸如Jbuilder）用来显示的名称（可选）</p>
												<p>small-icon<br />被可视化工具（诸如Jbuilder）用来显示的小图标（可选）</p>
												<p>large-icon<br />被可视化工具（诸如Jbuilder）用来显示的大图标（可选）</p>
												<p>description<br />此tag标签的描述</p>
												<p>variable<br />提供脚本变量的信息（同tei-class）(可选)</p>
												<p>attribute<br />Tag标签的属性名</p>
												<p>以下章节介绍对于不同类型的tag，如何具体地实现它们。</p>
												<p>
														<br />简单的tag</p>
												<p>
														<br />tag处理类</p>
												<p>简单的tag处理类必须实现Tag接口的doStartTag和doEndTag方法。当jsp引擎碰到tag标签的开头时，doStartTag被调用，因为简单的tag没有body，所以此方法将返回 SKIP_BODY。当jsp引擎碰到tag标签的结尾时，doEndTag被调用，如果余下的页面还要被计算，那它将返回EVAL_PAGE,否则将会返回SKIP_PAGE。</p>
												<p>以下是例子：对于标签 &lt;tt:simple /&gt; ，它的tag处理类实现如下：</p>
												<p>
														<br />public SimpleTag extends TagSupport </p>
												<p>{ </p>
												<p>public int doStartTag() throws JspException </p>
												<p>{ </p>
												<p>try{ </p>
												<p>pageContext.getOut().print(“Hello.”); </p>
												<p>}catch(Exception e){ </p>
												<p>throw new JspTagException(“SimpleTag: “ + e.getMessage()); </p>
												<p>} </p>
												<p>return SKIP_BODY; </p>
												<p>} </p>
												<p>public int doEndTag() </p>
												<p>{ </p>
												<p>return EVAL_PAGE; </p>
												<p>} </p>
												<p>} </p>
												<p>
														<br />注意：如果tag标签没有内容的话，那必须定义body-content元素为空，例如</p>
												<p>&lt;body-content&gt;empty&lt;/body-content&gt;</p>
												<p>
														<br />带属性的tag标签</p>
												<p>
														<br />tag处理类</p>
												<p>对于tag标签的每个属性，你必须依照JavaBeans规范来定义其属性，以及get和set方法。以struts的logic:present 标签为例，</p>
												<p>&lt;logic:present parameter=”Clear”&gt;</p>
												<p>与此相应，此tag处理类应有如下方法和定义：</p>
												<p>
														<br />protected String parameter = null; </p>
												<p>public String getParameter() </p>
												<p>{ </p>
												<p>return this.parameter; </p>
												<p>} </p>
												<p>public void setParameter(String parameter) </p>
												<p>{ </p>
												<p>this.parameter = parameter; </p>
												<p>} </p>
												<p>
														<br />注意：如果你的属性名为id，而且你的tag处理类是从TagSupport类继承的，那你就不需要定义它的属性和set和get方法,因为他们早已在TagSupport被定义过了。</p>
												<p>Attribute元素</p>
												<p>对于tag标签的每个属性，你必须定义它是否必须的，它的值是否可以用诸如&lt;%= …%&gt;的表达式来获得，以及它的类型（可选），如果不指定它的类型，那就默认为是java.lang.String类型。如果rtexprvalue元素被定义为true或yes，那么在type元素中就定义了attribute的返回类型。</p>
												<p>&lt;attribute&gt;</p>
												<p>&lt;name&gt;attr1&lt;/name&gt;</p>
												<p>&lt;required&gt;true|false|yes|no&lt;/required&gt;</p>
												<p>&lt;rtexprvalue&gt;true|false|yes|no&lt;/rtexprvalue&gt;</p>
												<p>&lt;type&gt;attribute的返回类型（只用当rtexprvalue为真是才有效）&lt;/type&gt;</p>
												<p>&lt;/attribute&gt;</p>
												<p>如果tag的某个属性不是必须的，那tag处理类会自动提供一个缺省值。</p>
												<p>例如，在logic:present这个tag标签中定义了一个属性叫parameter，但它不是必须的，而且它可以被诸如&lt;%= …%&gt;的表达式来赋值。</p>
												<p>&lt;tag&gt;</p>
												<p>&lt;name&gt;present&lt;/name&gt;</p>
												<p>&lt;tag-class&gt;org.apache.struts.taglib.logic.PresentTag&lt;/tag-class&gt;</p>
												<p>&lt;body-content&gt;JSP&lt;/body-content&gt;</p>
												<p>…</p>
												<p>&lt;attribute&gt;</p>
												<p>&lt;name&gt;parameter&lt;/name&gt;</p>
												<p>&lt;required&gt;false&lt;/required&gt;</p>
												<p>&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;</p>
												<p>&lt;/attribute&gt;</p>
												<p>…</p>
												<p>&lt;/tag&gt;</p>
												<p>
														<br />属性元素的校验</p>
												<p>
														<br />有关于tag标签的有效值可以从tag库的说明文档中获得，当JSP页面被编译时，jsp引擎会强制性地参照TLD中定义的规则进行检查。</p>
												<p>还有一个方法也可以进行属性元素的校验，就是先继承类TagExtraInfo，然后调用它的isValid方法。这个类同时也起到提供tag中定义的脚本变量信息的作用。</p>
												<p>IsValid方法通过TagData对象来传递属性信息，它包括着tag的所有的属性名－值的信息。由于校验发生在运行时刻，因此这个属性的值将被赋值为TagData.REQUEST_TIME_VALUE。</p>
												<p>例如tag标签&lt;tt:twa attr1=”value1” /&gt;在TLD中定义如下：</p>
												<p>&lt;attribute&gt;</p>
												<p>&lt;name&gt;attr1&lt;/name&gt;</p>
												<p>&lt;required&gt;true&lt;/required&gt;</p>
												<p>&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;</p>
												<p>&lt;/attribute&gt;</p>
												<p>
														<br />这个定义说明了attr1能在运行期间被赋值。</p>
												<p>以下的isValid方法检查attr1属性的值是否属于Boolean类型。注意由于attr1能在运行刻被赋值，那么isValid方法必须检查tag用户是否对此tag进行了运行时刻赋值。</p>
												<p>
														<br />Public class TwaTEI extends TagExtraInfo </p>
												<p>{ </p>
												<p>public boolean isValid(Tagdata data) </p>
												<p>{ </p>
												<p>Object o = data.getAttribute(“attr1”); </p>
												<p>If(o != null &amp;&amp; o != TagData.REQUEST_TIME_VALUE) </p>
												<p>{ </p>
												<p>if( ( (String)o).toLowerCase().equals(“true”) ||  </p>
												<p>((String)o).toLowerCase().equals(“false”) ) </p>
												<p>return true; </p>
												<p>else </p>
												<p>return false; </p>
												<p>} </p>
												<p>else </p>
												<p>return true; </p>
												<p>} </p>
												<p>} </p>
												<p>带body的tag</p>
												<p>tag处理类</p>
												<p>
														<br />如果tag标签含有内容，那处理方式会略微有些不同，而且还要视tag处理类是否要与body交互的情况而定。如果要与body交互，那我们认为tag处理类要可能要对body进行操作。</p>
												<p>Tag处理类不与body交互</p>
												<p>如果tag处理类不与body交互，tag处理类应该实现Tag接口或从TagSupport中派生，如果body要被计算，那么doStartTag方法应返回 EVAL_BODY_INCLUDE，否则应返回SKIP_BODY。</p>
												<p>如果tag处理类要对body反复运算，则它应该实现IterationTag或从TagSupport中派生。如果tag处理类认为body还未计算完的话，那它的doStartTag方法和doAfterBody方法必须返回EVAL_BODY_AGAIN。</p>
												<p>Tag处理类与body交互</p>
												<p>如果tag处理类与body交互，那tag处理类应实现BodyTag接口或从BodyTagSupport中派生。这种tag处理类一般要实现doInitBody和doAfterBody方法。</p>
												<p>Body允许一些方法来读写它的内容。Tag处理类可以调用body内容的getString或getReader方法来从body中提取信息，也可用 writeOut(out) 方法来将body的内容写入到out对象中。其中out对象通过tag处理类的getPreviousOut方法来获得。</p>
												<p>如果body的内容需要被计算，那么doStartTag方法必须返回EVAL_BODY_BUFFERED，否则，它将返回 SKIP_BODY。</p>
												<p>doInitBody 方法</p>
												<p>此方法在body内容已经设好，但未被计算之前被调用。你可以根据不同的body内容来制定初始化策略。</p>
												<p>doAfterBody方法</p>
												<p>此方法在body内容已被计算后进行调用。</p>
												<p>和doStartTag方法一样，doAfterBody方法返回一个指示符指示是否要继续计算body，如果要继续计算，则doAfterBody应返回EVAL_BODY_BUFFERED，否则，它应返回SKIP_BODY。</p>
												<p>release 方法</p>
												<p>tag处理类调用此方法将它的状态重置为初始状态，并释放所有的私有资源。</p>
												<p>
														<br />以下的例子读取body的内容（其中含有一条sql语句），然后将它传递给一个对象，让它进行查询。由于此处body不须重新计算，所以doAfterBody会返回SKIP_BODY。</p>
												<p>
														<br />Public class QueryTag extends BodyTagSupport </p>
												<p>{ </p>
												<p>public int doAfterBody() throws JspTagException </p>
												<p>{ </p>
												<p>BodyContent bc = getBodyContent(); </p>
												<p>//将body的内容以字符串的格式提取出来 </p>
												<p>String query = bc.getString(); </p>
												<p>//清除body </p>
												<p>bc.clearBody(); </p>
												<p>try{ </p>
												<p>Statement stmt = connection.createStatement(); </p>
												<p>Result result = stmt.executeQuery(query); </p>
												<p>}catch(SQLException e){ </p>
												<p>throw new JspTagException(“queryTag: “ + e.getMessage() ); </p>
												<p>return SKIP_BODY; </p>
												<p>} </p>
												<p>} </p>
												<p>
														<br />body-content元素</p>
												<p>
														<br />由于tag可能会有body，你必须用body-content元素来指定body内容的类型：</p>
												<p>&lt;body-content&gt;JSP|tagdependent&lt;/body-content&gt;</p>
												<p>
														<br />如果body的内容是定制的或内部的tag、脚本元素、或HTML广本，则归类为JSP类型。其他的类型，比如上面代码所述的?D?D将sql statement类传给 query tag的这种类型应该标为tagdependent。</p>
												<p>注意：实际上body-content的值并不影响tag处理类对body内容的处理，它仅仅是被tag编辑工具用来描述此body的内容。</p>
												<p>
														<br />用tags定义脚本变量</p>
												<p>tag处理类</p>
												<p>
														<br />tag处理类负责创建或设置页面中定义的脚本变量，用pageContext.setAttribute(name,value,scope)或pageContext.setAttribute(name,value)方法来实现。一般来说，tag处理类通过脚本变量的名称来获取它，脚本变量的名称一般可用get方法来获得。</p>
												<p>如果脚本变量的值依赖于tag处理类中的上下文中某一对象，那它可用pageContext.getAttribute(name,scope)方法来找到那个对象。一般的处理过程是tag处理类先找到脚本变量，再对其进行处理，然后用pageContext.setAttribute(name,object)的方法来设置它的新值。</p>
												<p>对象的生存周期(scope)如下表：</p>
												<p>对象的生存周期表</p>
												<p>名字<br />可访问范围<br />生存周期</p>
												<p>page<br />当前页面<br />一直有效，除非页面向客户提交响应或重定向到一个新页面</p>
												<p>request<br />当前页面或当前页面重定向到的页面<br />一直有效，除非页面向客户提交响应</p>
												<p>session<br />当前页面或在同一浏览器窗口中的页面<br />一直有效,除非关闭当前浏览器、超时、网络故障</p>
												<p>application<br />整个web应用程序的所有请求<br />一直有效，除非发生网络故障、服务器故障</p>
												<p>提供关于脚本变量的信息</p>
												<p>以下示例定义了一个名为“book”的脚本变量，用来访问程序中关于书的信息：</p>
												<p>&lt;bean:define id=”book” name=”bookDB” property=”bookDetails” type=”database.BookDetails” /&gt;</p>
												<p>&lt;font color=”red” size=”+2” &gt;</p>
												<p>&lt;%= messages.getString(“CartRemoved”) %&gt;</p>
												<p>&lt;strong&gt;&lt;jsp:getProperty name=”book” property=”title” /&gt;&lt;/strong&gt;</p>
												<p>&lt;/font&gt;</p>
												<p>当包含此tag的JSP页面被编译时，jsp引擎会自动生成关于此book的同步的代码（同步可以避免几个客户同时访问此book时造成的冲突），要生成同步代码，jsp引擎需要知道此脚本变量的如下信息：</p>
												<p>· 脚本变量名称 </p>
												<p>· 脚本变量所属的类</p>
												<p>· 此脚本变量是否引用了一个新的或已存在的对象 </p>
												<p>· 此脚本变量的有效性</p>
												<p>有两种办法可以向jsp引擎提供关于脚本变量的信息：在TLD中定义variable子元素，或用tei-class子元素定义一个额外tag信息类。用variable最简单，但可能降低了一些灵活性。</p>
												<p>Variable元素</p>
												<p>Variable元素有如下子元素：</p>
												<p>· name-given ?D?D 给出的名字，是一个常量</p>
												<p>· name-from-attribute?D?D 属性名，在编译时给出的属性名 </p>
												<p>name-given或name-from-attribute两者必须选一，但以下子元素是可选的：</p>
												<p>· variable-class?D?D变量的类型，缺省为java.lang.String。 </p>
												<p>· declare?D?D此脚本变量是否引用了一个新对象，缺省为True。</p>
												<p>· scope?D?D脚本变量的范围，缺省为NESTED。下表描述了scope的几种类型：</p>
												<p>脚本变量的有效范围 </p>
												<p>值<br />有效性<br />方法 </p>
												<p>NESTED<br />在tag标签的开始和结束之间<br />如果tag处理类实现BodyTag接口，则在doInitBody和doAfterBody中调用，否则在doStartTag中调用</p>
												<p>AT_BEGIN<br />从tag标签的开始一直到页面结束<br />如果tag处理类实现BodyTag接口，则在doInitBody、doAfterBody和doEndTag中调用，否则在doStartTag和doEndTag中调用</p>
												<p>AT_END<br />从tag标签的结束一直到页面结束<br />在doEndTag中调用</p>
												<p>以struts为例，它的bean:define标签的实现遵循JSP1.1规范，此规范要求使用额外tag信息类来定义脚本变量。Variable元素是JSP1.2规范中加入的。以bean:define标签为例，你可以定义如下variable元素：</p>
												<p>&lt;tag&gt;</p>
												<p>&lt;variable&gt;</p>
												<p>&lt;name-from-attribute&gt;id&lt;/name-from-attribute&gt;</p>
												<p>&lt;variable-class&gt;database.BookDetails&lt;/variable-class&gt;</p>
												<p>&lt;declare&gt;true&lt;/declare&gt;</p>
												<p>&lt;scope&gt;AT_BEGIN&lt;/scope&gt;</p>
												<p>&lt;/variable&gt;</p>
												<p>&lt;/tag&gt;</p>
												<p>额外tag信息类</p>
												<p>如果要定义一个额外tag信息类，你要继承javax.servlet.jsp.TagExtraInfo类。一个TagExtraInfo类必须实现getVariableInfo方法，此方法返回一个叫VariableInfo的数组类，它包括如下信息：</p>
												<p>· 变量名</p>
												<p>· 变量所属类名 </p>
												<p>· 此变量是否引用了一个新对象</p>
												<p>· 此变量的有效范围</p>
												<p>jsp引擎将一个名为data的参数传给getVariableInfo方法，data中包括tag标签中的所有“属性名?D?D属性值”对。它可以用来向VariableInfo对象提供脚本变量的名字和类名。</p>
												<p>以struts为例，它在bean:define标签中定义了一个名为DefineTei的额外tag信息类，用来向脚本变量提供信息。由于脚本变量的名称（book）和类名（database.BookDetails）是通过tag标签的属性来传递的，它们一般定义在VariableInfo的构建代码中，并且可用data.getAttributeString方法来得到这些信息。如果要允许book脚本变量能在从tag开始直到整个JSP页面结束的范围内都可用的话，那它的范围应设为AT_BEGIN。如下所示：</p>
												<p>
														<br />public class DefineTei extends TagExtraInfo </p>
												<p>{ </p>
												<p>public VariableInfo[] getVariableInfo(TagData data) </p>
												<p>{ </p>
												<p>String type = data.getAttributeString(“type”); </p>
												<p>If( type == null) </p>
												<p>type = “java.lang.Object”; </p>
												<p>return new VariableInfo[] { </p>
												<p>new VariableInfo(data.getAttributeString(“id”),  </p>
												<p>type, </p>
												<p>true, </p>
												<p>VariableInfo.AT_BEGIN) </p>
												<p>}; </p>
												<p>} </p>
												<p>} </p>
												<p>
														<br />注意：关于额外tag信息类的类名必须要在TLD中的tag标签下的tei-class子元素中定义。因此，DefineTei的tei-class中的定义看起来如下：<br />&lt;tei-class&gt;<br />org.apache.struts.taglib.bean.DefineTagTei<br />&lt;/tei-class&gt;</p>
												<p>
														<br />具有协作关系的tag</p>
												<p>
														<br />tag通过共享对象来进行协作，JSP技术支持2种方式的对象共享。</p>
												<p>第一种方法是使用pageContext对象进行对象的共享（可支持JSP页面和tag处理类之间的共享），如果在一个tag处理类中要调用由另一个tag处理类创建的对象，可调用pageContext.getAttribute(name, scope)方法。</p>
												<p>第二各方式的共享是对于tag之间有嵌套关系而言的，外层的tag所创建的对象对于内层的tag来说是可以共用的。这种形式的共享的好处是减少了可能存在的重名冲突。</p>
												<p>要访问一个嵌套tag创建的对象，tag处理类必须先找到此嵌套tag对象，可用TagSupport的静态方法 TagSupport.findAncestorWithClass(from, class)或TagSupport.getParent方法。前者在当不确定此tag是否为嵌套tag对象时使用。一旦它的父类被找到，它就能访问其所有动态或静态创建的对象。静态创建的对象是父类的成员，而动态创建的对象可能是父类的私有对象。诸如此类的对象可以用tag处理类的setValue方法来保存，用getValue方法来获得。</p>
												<p>下例阐述了以上两种共享对象的方法。在这个例子当中，一个查询tag检查一个名为connection的属性名是否在doStartTag中被设置。如果connection属性被设置，tag处理类从pageContext中得到这个connection对象。否则，此tag处理类先找到它的父tag处理类，然后从它的父tag处理类中找到connection对象。</p>
												<p>
														<br />public class QueryTag extends BodyTagSupport </p>
												<p>{ </p>
												<p>private String connectionId; </p>
												<p>public int doStartTag() throws JspException </p>
												<p>{ </p>
												<p>String cid = getConnection(); </p>
												<p>if(cid != null) </p>
												<p>{ </p>
												<p>//存在一个connection id，使用它。 </p>
												<p>connection = (Connection) pageContext.getAttribute(cid); </p>
												<p>} </p>
												<p>else </p>
												<p>{ </p>
												<p>ConnectionTag ancestorTag = (ConnectionTag)findAncestorWithClass(this,  </p>
												<p>ConnectionTag.class); </p>
												<p>if(ancestorTag == null) </p>
												<p>{ </p>
												<p>throw new JspTagException(“一个没有connection属性的查询标签必须被一个connection标记嵌套。”); </p>
												<p>} </p>
												<p>connection = ancestorTag.getConnection(); </p>
												<p>} </p>
												<p>} </p>
												<p>}  </p>
												<p>
														<br />此查询标签在JSP页面中的调用形式可以从以下2种定义中任选一种：</p>
												<p>&lt;tt:connection id=”con01” ...&gt; ... &lt;/tt:connection&gt;</p>
												<p>&lt;tt:query id=”balances” connection=”con01” &gt;</p>
												<p>SELECT account, balance FROM acct_table</p>
												<p>where customer_num = &lt;%= request.getCustno() %&gt;</p>
												<p>&lt;/tt:query&gt;</p>
												<p>或</p>
												<p>&lt;tt:connection ...&gt;</p>
												<p>&lt;x:query id=”balances”&gt;</p>
												<p>SELECT account, balance FROM acct_table</p>
												<p>where customer_num = &lt;%= request.getCustno() %&gt;</p>
												<p>&lt;/x:query&gt;</p>
												<p>&lt;/tt:connection&gt;</p>
												<p>与此同时，在TLD中必须指定connection属性为可选的，定义如下：</p>
												<p>&lt;tag&gt;</p>
												<p>...</p>
												<p>&lt;attribute&gt;</p>
												<p>&lt;name&gt;connection&lt;/name&gt;</p>
												<p>&lt;required&gt;false&lt;/required&gt;</p>
												<p>&lt;/attribute&gt;</p>
												<p>&lt;/tag&gt;</p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/songfei/aggbug/103548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2007-03-13 15:44 <a href="http://www.blogjava.net/songfei/articles/103548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转载)Java中的类反射机制</title><link>http://www.blogjava.net/songfei/articles/67131.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Fri, 01 Sep 2006 08:02:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/67131.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/67131.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/67131.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/67131.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/67131.html</trackback:ping><description><![CDATA[
		<p>
				<a class="diary_title" href="http://www.blogcn.com/u/46/78/chenbaoli527/blog/35678943.html">
						<font class="diary_title" color="#0079a2">
								<strong>Java中的类反射机制</strong>
						</font>
				</a>
				<a name="35678943">
				</a>
				<br />
				<br />(转载)Java中的类反射机制<br /><br /> <br /><br />一、反射的概念 ：<br />反射的概念是由Smith在1982年首次提出的，主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射机制的语言。最近，反射机制也被应用到了视窗系统、操作系统和文件系统中。 <br /><br />反射本身并不是一个新概念，它可能会使我们联想到光学中的反射概念，尽管计算机科学赋予了反射概念新的含义，但是，从现象上来说，它们确实有某些相通之处，这些有助于我们的理解。在计算机科学领域，反射是指一类应用，它们能够自描述和自控制。也就是说，这类应用通过采用某种机制来实现对自己行为的描述（self-representation）和监测（examination），并能根据自身行为的状态和结果，调整或修改应用所描述行为的状态和相关的语义。可以看出，同一般的反射概念相比，计算机科学领域的反射不单单指反射本身，还包括对反射结果所采取的措施。所有采用反射机制的系统（即反射系统）都希望使系统的实现更开放。可以说，实现了反射机制的系统都具有开放性，但具有开放性的系统并不一定采用了反射机制，开放性是反射系统的必要条件。一般来说，反射系统除了满足开放性条件外还必须满足原因连接（Causally-connected）。所谓原因连接是指对反射系统自描述的改变能够立即反映到系统底层的实际状态和行为上的情况，反之亦然。开放性和原因连接是反射系统的两大基本要素。13700863760<br /><br />Java中，反射是一种强大的工具。它使您能够创建灵活的代码，这些代码可以在运行时装配，无需在组件之间进行源代表链接。反射允许我们在编写与执行时，使我们的程序代码能够接入装载到JVM中的类的内部信息，而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是：如果使用不当，反射的成本很高。<br /><br />二、Java中的类反射：<br />Reflection 是 Java 程序开发语言的特征之一，它允许运行中的 Java 程序对自身进行检查，或者说“自审”，并能直接操作程序的内部属性。Java 的这一能力在实际应用中也许用得不是很多，但是在其它的程序设计语言中根本就不存在这一特性。例如，Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。<br /><br />1．检测类：<br /><br />1.1 reflection的工作机制<br /><br />考虑下面这个简单的例子，让我们看看 reflection 是如何工作的。<br /><br />import java.lang.reflect.*;<br />public class DumpMethods {<br />    public static void main(String args[]) {<br />        try {<br />            Class c = Class.forName(args[0]);<br />            Method m[] = c.getDeclaredMethods();<br />            for (int i = 0; i &lt; m.length; i++)<br />                System.out.println(m[i].toString());<br />        } catch (Throwable e) {<br />            System.err.println(e);<br />        }<br />    }<br />}<br /><br />按如下语句执行：<br /><br />java DumpMethods java.util.Stack<br /><br />它的结果输出为：<br /><br />public java.lang.Object java.util.Stack.push(java.lang.Object)<br /><br />public synchronized java.lang.Object java.util.Stack.pop()<br /><br />public synchronized java.lang.Object java.util.Stack.peek()<br /><span id="dissub1"></span></p>
		<div id="blog_sub_st" name="blog_sub_st">loading...</div>
<img src ="http://www.blogjava.net/songfei/aggbug/67131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-09-01 16:02 <a href="http://www.blogjava.net/songfei/articles/67131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>抽象类的用途</title><link>http://www.blogjava.net/songfei/articles/65013.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Tue, 22 Aug 2006 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/65013.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/65013.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/65013.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/65013.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/65013.html</trackback:ping><description><![CDATA[
		<table style="WIDTH: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="80%" border="0">
				<tbody>
						<tr>
								<td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt">
										<p class="MsoNormal">
												<span lang="EN-US" style="FONT-SIZE: 10.5pt">public abstract class Benchmark<br />{<br />　　/**<br />　　* 下面操作是我们希望在子类中完成<br />　　*/<br />　　public abstract void benchmark(); <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
										</p>
										<p>　　<span lang="EN-US">/**<br />　　* 重复执行benchmark次数<br />　　*/<br />　　public final long repeat (int count) {<br />　　　　if (count &lt;= 0)<br />　　　　　　return 0;<br />　　　　else {<br />　　　　　　long startTime = System.currentTimeMillis();<o:p></o:p></span></p>
										<p>　　　　<span lang="EN-US">for (int i = 0; i &lt; count; i++) <br />　　　　　　benchmark();<br /><br />　　　　long stopTime = System.currentTimeMillis();<br />　　　　return stopTime - startTime;<br />　　}<br />}<br />}<o:p></o:p></span></p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt">public class MethodBenchmark extends Benchmark<br />{<br />　　/**<br />　　* 真正定义benchmark内容<br />　　*/<br />　　public void benchmark() {<br /><br />　　　　for (int i = 0; i &lt; Integer.MAX_VALUE; i++){<br />　　　 　　System.out.printtln("i="+i);　 　　<br />　　　 }<br />　　}<br />}<br /><br />也许你以前还疑惑抽象类有什么用<span lang="EN-US">,现在你应该彻底明白了吧? 至于这样做的好处,很显然啊,扩展性强,以后Benchmark内容变化,我只要再做一个继承子类就可以,不必修改其他应用代码.<o:p></o:p></span><o:p></o:p></span>
		</p>
<img src ="http://www.blogjava.net/songfei/aggbug/65013.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-08-22 11:01 <a href="http://www.blogjava.net/songfei/articles/65013.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入理解abstract class和interface</title><link>http://www.blogjava.net/songfei/articles/64097.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Thu, 17 Aug 2006 05:12:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/64097.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/64097.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/64097.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/64097.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/64097.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td colspan="5">
								</td>
						</tr>
						<tr valign="top">
								<td width="2">
										<img height="1" alt="" src="file://192.168.0.142/技术资料—康/Java资料/Java语言/CSDN_深入理解abstract%20class和interface.files/c.gif" width="2" border="0" />
								</td>
								<td>
										<!-- <span class="astitle">[Series title]:&nbsp;</span>-->
										<span class="atitle">深入理解abstract class和interface</span>
								</td>
								<td width="8">
										<img height="1" alt="" src="file://192.168.0.142/技术资料—康/Java资料/Java语言/CSDN_深入理解abstract%20class和interface.files/c.gif" width="8" border="0" />
								</td>
								<td width="6">
										<img height="1" alt="" src="file://192.168.0.142/技术资料—康/Java资料/Java语言/CSDN_深入理解abstract%20class和interface.files/c.gif" width="6" border="0" />
								</td>
						</tr>
						<!-- Black line separator-->
						<tr valign="top">
								<td bgcolor="#000000" colspan="5">
										<img height="1" alt="" src="file://192.168.0.142/技术资料—康/Java资料/Java语言/CSDN_深入理解abstract%20class和interface.files/c.gif" width="100" border="0" />
								</td>
						</tr>
						<tr valign="top">
								<td bgcolor="#ffffff" colspan="5">
										<img height="8" alt="" src="file://192.168.0.142/技术资料—康/Java资料/Java语言/CSDN_深入理解abstract%20class和interface.files/c.gif" width="100" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<!-- END HEADER AREA-->
		<!-- START BODY AREA-->
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="10">
										<img height="1" alt="" src="file://192.168.0.142/技术资料—康/Java资料/Java语言/CSDN_深入理解abstract%20class和interface.files/c.gif" width="10" border="0" />
								</td>
								<td width="100%">
										<p> </p>
										<blockquote>abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制，正是由于这两种机制的存在，才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性，甚至可以相互替换，因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实，两者之间还是有很大的区别的，对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析，试图给开发者提供一个在二者之间进行选择的依据。</blockquote>
										<p>
												<a name="1">
														<span class="atitle2">理解抽象类</span>
												</a>
										</p>
										<p>abstract class和interface在Java语言中都是用来进行抽象类（本文中的抽象类并非从abstract class翻译而来，它表示的是一个抽象体，而abstract class为Java语言中用于定义抽象类的一种方法，请读者注意区分）定义的，那么什么是抽象类，使用抽象类能为我们带来什么好处呢？</p>
										<p>在面向对象的概念中，我们知道所有的对象都是通过类来描绘的，但是反过来却不是这样。并不是所有的类都是用来描绘对象的，如果一个类中没有包含足够的信息来描绘一个具体的对象，这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念，是对一系列看上去不同，但是本质上相同的具体概念的抽象。比如：如果我们进行一个图形编辑软件的开发，就会发现问题领域存在着圆、三角形这样一些具体概念，它们是不同的，但是它们又都属于形状这样一个概念，形状这个概念在问题领域是不存在的，它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念，所以用以表征抽象概念的抽象类是不能够实例化的。</p>
										<p>在面向对象领域，抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述，但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类，而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体，因此它可以是不允许修改的；同时，通过从这个抽象体派生，也可扩展此模块的行为功能。熟悉OCP的读者一定知道，为了能够实现面向对象设计的一个最核心的原则OCP(<b>Open-Closed Principle</b>)，抽象类是其中的关键所在。</p>
										<p>
												<a name="2">
														<span class="atitle2">从语法定义层面看abstract class和interface</span>
												</a>
										</p>
										<p>在语法层面，Java语言对于abstract class和interface给出了不同的定义方式，下面以定义一个名为Demo的抽象类为例来说明这种不同。</p>
										<p>使用abstract class的方式定义Demo抽象类的方式如下：</p>
										<p>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code>
abstract class Demo ｛
	abstract void method1();
	abstract void method2();
	…
｝
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<p>使用interface的方式定义Demo抽象类的方式如下：</p>
										<p>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code>
interface Demo {
	void method1();
	void method2();
	…
}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<p>在abstract class方式中，Demo可以有自己的数据成员，也可以有非abstarct的成员方法，而在interface方式的实现中，Demo只能够有静态的不能被修改的数据成员（也就是必须是static final的，不过在interface中一般不定义数据成员），所有的成员方法都是abstract的。从某种意义上说，interface是一种特殊形式的abstract class。</p>
										<p>对于abstract class和interface在语法定义层面更多的细节问题，不是本文的重点，不再赘述，读者可以参阅参考文献〔1〕获得更多的相关内容。</p>
										<p>
												<a name="3">
														<span class="atitle2">从编程层面看abstract class和interface</span>
												</a>
										</p>
										<p>从编程的角度来看，abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。</p>
										<p>首先，abstract class在Java语言中表示的是一种继承关系，一个类只能使用一次继承关系。但是，一个类却可以实现多个interface。也许，这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。</p>
										<p>其次，在abstract class的定义中，我们可以赋予方法的默认行为。但是在interface的定义中，方法却不能拥有默认行为，为了绕过这个限制，必须使用委托，但是这会 增加一些复杂性，有时会造成很大的麻烦。</p>
										<p>在抽象类中不能定义默认行为还存在另一个比较严重的问题，那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面（一般通过abstract class或者interface来表示）以适应新的情况（比如，添加新的方法或者给已用的方法中添加新的参数）时，就会非常的麻烦，可能要花费很多的时间（对于派生类很多的情况，尤为如此）。但是如果界面是通过abstract class来实现的，那么可能就只需要修改定义在abstract class中的默认行为就可以了。</p>
										<p>同样，如果不能在抽象类中定义默认行为，就会导致同样的方法实现出现在该抽象类的每一个派生类中，违反了"one rule，one place"原则，造成代码重复，同样不利于以后的维护。因此，在abstract class和interface间进行选择时要非常的小心。</p>
										<p>
												<a name="4">
														<span class="atitle2">从设计理念层面看abstract class和interface</span>
												</a>
										</p>
										<p>上面主要从语法定义和编程的角度论述了abstract class和interface的区别，这些层面的区别是比较低层次的、非本质的。本小节将从另一个层面：abstract class和interface所反映出的设计理念，来分析一下二者的区别。作者认为，从这个层面进行分析才能理解二者概念的本质所在。</p>
										<p>前面已经提到过，abstarct class在Java语言中体现了一种继承关系，要想使得继承关系合理，父类和派生类之间必须存在"is a"关系，即父类和派生类在概念本质上应该是相同的（参考文献〔3〕中有关于"is a"关系的大篇幅深入的论述，有兴趣的读者可以参考）。对于interface 来说则不然，并不要求interface的实现者和interface定义在概念本质上是一致的，仅仅是实现了interface定义的契约而已。为了使论述便于理解，下面将通过一个简单的实例进行说明。</p>
										<p>考虑这样一个例子，假设在我们的问题领域中有一个关于Door的抽象概念，该Door具有执行两个动作open和close，此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型，定义方式分别如下所示：</p>
										<p>使用abstract class方式定义Door：</p>
										<p>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code>
	abstract class Door {
		abstract void open();
		abstract void close()；
}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<p>使用interface方式定义Door：</p>
										<p>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code>
interface Door {
		void open();
	void close();
}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<p>其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。</p>
										<p>如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢（在本例中，主要是为了展示abstract class和interface反映在设计理念上的区别，其他方面无关的问题都做了简化或者忽略）？下面将罗列出可能的解决方案，并从设计理念层面对这些不同的方案进行分析。</p>
										<p>
												<b>解决方案一：</b>
										</p>
										<p>简单的在Door的定义中增加一个alarm方法，如下：</p>
										<p>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code>
	abstract class Door {
		abstract void open();
		abstract void close()；
		abstract void alarm();
}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<p>或者</p>
										<p>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code>
interface Door {
		void open();
	void close();
	void alarm();
}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<p>那么具有报警功能的AlarmDoor的定义方式如下：</p>
										<p>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code>
	class AlarmDoor extends Door {
		void open() { … }
    		void close() { … }
		void alarm() { … }
}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<p>或者</p>
										<p>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code>
	class AlarmDoor implements Door ｛
	void open() { … }
    		void close() { … }
		void alarm() { … }
｝
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<p>这种方法违反了面向对象设计中的一个核心原则ISP（Interface Segregation Priciple），在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变（比如：修改alarm方法的参数）而改变，反之依然。</p>
										<p>
												<b>解决方案二：</b>
										</p>
										<p>既然open、close和alarm属于两个不同的概念，根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有：这两个概念都使用abstract class方式定义；两个概念都使用interface方式定义；一个概念使用abstract class方式定义，另一个概念使用interface方式定义。</p>
										<p>显然，由于Java语言不支持多重继承，所以两个概念都使用abstract class方式定义是不可行的。后面两种方式都是可行的，但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。</p>
										<p>如果两个概念都使用interface方式来定义，那么就反映出两个问题：1、我们可能没有理解清楚问题领域，AlarmDoor在概念本质上到底是Door还是报警器？2、如果我们对于问题领域的理解没有问题，比如：我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的，那么我们在实现时就没有能够正确的揭示我们的设计意图，因为在这两个概念的定义上（均使用interface方式定义）反映不出上述含义。</p>
										<p>如果我们对于问题领域的理解是：AlarmDoor在概念本质上是Door，同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢？前面已经说过，abstract class在Java语言中表示一种继承关系，而继承关系在本质上是"is a"关系。所以对于Door这个概念，我们应该使用abstarct class方式来定义。另外，AlarmDoor又具有报警功能，说明它又能够完成报警概念中定义的行为，所以报警概念可以通过interface方式定义。如下所示：</p>
										<p>
										</p>
										<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
												<tbody>
														<tr>
																<td>
																		<pre>
																				<code>
	abstract class Door {
		abstract void open();
		abstract void close()；
	}
interface Alarm {
	void alarm();
}
class AlarmDoor extends Door implements Alarm {
	void open() { … }
	void close() { … }
   	void alarm() { … }
}
</code>
																		</pre>
																</td>
														</tr>
												</tbody>
										</table>
										<p>这种实现方式基本上能够明确的反映出我们对于问题领域的理解，正确的揭示我们的设计意图。其实abstract class表示的是"is a"关系，interface表示的是"like a"关系，大家在选择时可以作为一个依据，当然这是建立在对问题领域的理解上的，比如：如果我们认为AlarmDoor在概念本质上是报警器，同时又具有Door的功能，那么上述的定义方式就要反过来了。</p>
										<p>
												<a name="5">
														<span class="atitle2">结论</span>
												</a>
										</p>
										<p>abstract class和interface是Java语言中的两种定义抽象类的方式，它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理，因为它们表现了概念间的不同的关系（虽然都能够实现需求的功能）。这其实也是语言的一种的惯用法，希望读者朋友能够细细体会。</p>
										<p>
												<a name="resources">
														<span class="atitle2">参考文献</span>
												</a>
												<br />[1] Thinking in Java, Bruce Eckel<br />[2] Design Patterns Explained: A New Perspective on Object-Oriented Design, Alan Shalloway and James R. Trott<br />[3] Effective C++: 50 Specific Ways to Improve Your Programs and Design, Scott Meyers</p>
										<!-- AUTHOR BIOS-->
										<!-- Make author heading singular or plural as needed-->
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
								<td width="10">
										<img height="1" alt="" src="file://192.168.0.142/技术资料—康/Java资料/Java语言/CSDN_深入理解abstract%20class和interface.files/c.gif" width="10" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<!-- END PAPER BODY-->
<img src ="http://www.blogjava.net/songfei/aggbug/64097.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-08-17 13:12 <a href="http://www.blogjava.net/songfei/articles/64097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java的30个学习目标 </title><link>http://www.blogjava.net/songfei/articles/59660.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Sun, 23 Jul 2006 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/59660.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/59660.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/59660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/59660.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/59660.html</trackback:ping><description><![CDATA[
		<dt>
				<span id="LblTitle">java的30个学习目标</span>
		</dt>
		<dd class="ArticleInfo">作者： <a id="HyperAuthor" href="http://kb.csdn.net/ArticleAuthor.aspx?author=yyp226">yyp226</a>∣来源：<a id="HyFromWhere" href="http://www.matrix.org.cn/article.shtml" target="_blank">Matrix</a>∣<a id="HyHistoryUrl" title="http://www.matrix.org.cn/resource/article/43/43811.html" href="http://www.matrix.org.cn/resource/article/43/43811.html" target="_blank">原文地址</a>∣<span id="LblUpdateDate">2005-9-24</span></dd>
		<dd class="ArticleContent">
				<div class="HideDiv" style="OVERFLOW: hidden; WIDTH: 100%">
						<span id="LblContent">
								<u>
										<b>[b]你需要精通面向对象分析与设计（OOA/OOD）、涉及模式（GOF,J2EEDP）以及综合模式。你应该十分了解UML，尤其是class,object,interaction以及state diagrams.<br /><br />你需要学习JAVA语言的基础知识以及它的核心类库（collections,serialization,streams,networking,multithreading,reflection,event,handling,NIO,localization,以及其他）。<br /><br />你应该了解JVM，class loaders,class reflect,以及垃圾回收的基本工作机制等。你应该有能力反编译一个类文件并且明白一些基本的汇编指令。<br /><br />如果你将要写客户端程序，你需要学习WEB的小应用程序（applet），必需掌握GUI设计的思想和方法,以及桌面程序的SWING，AWT，SWT。你还应该对UI部件的JAVABEAN组件模式有所了解。JAVABEANS也被应用在JSP中以把业务逻辑从表现层中分离出来。<br /><br />你需要学习java数据库技术，如JDBC API并且会使用至少一种persistence/ORM构架，例如Hibernate, JDO, CocoBase, TopLink,Inside Liberator（国产JDO 红工厂软件）或者iBatis。你还应该了解对象关系的阻抗失配的含义，以及它是如何影响业务对象的与关系型数据库的交互，和它的运行结果,还需要掌握不同的数据库产品运用，比如: oracle,mysql,ms sql server. <br /><br />你需要学习JAVA的沙盒安全模式（class loaders, byte code verification, managers, policy and permissions, code signing, digital signatures, cryptography, certification, Kerberos,以及其他）还有不同的安全/认证API，例如JAAS( Java Authentication and Authorization Service), JCE (Java Cryptography Extension), JSSE (Java Secure Socket Extension), 以及 JGSS (Java General Security Service).<br /><br />你需要学习Servlets, JSP, 以及JSTL（Standard Tag Libraries）和可以选择的第三方Tag Libraries。<br /><br />你需要熟悉主流的网页框架，例如JSF, Struts, Tapestry, Cocoon, WebWork, 以及他们下面的涉及模式，如MVC/MODEL2.<br /><br />你需要学习如何使用及管理WEB服务器，例如tomcat,resin,Jrun，并且知道如何在其基础上扩展和维护WEB程序。<br /><br />你需要学习分布式对象以及远程API，例如RMI和RMI/IIOP。<br /><br />你需要掌握各种流行中间件技术标准和与java结合实现，比如Tuxedo、CROBA，当然也包括java EE 本身.<br /><br />你需要学习最少一种的XML API，例如JAXP (Java API for XML Processing), JDOM (Java for XML Document Object Model), DOM4J, 或 JAXR (Java API for XML Registries).<br /><br />你应该学习如何利用JAVA API和工具来构建Web Service。例如JAX-RPC (Java API for XML/RPC), SAAJ (SOAP with Attachments API for Java), JAXB (Java Architecture for XML Binding), JAXM (Java API for XML Messaging), JAXR (Java API for XML Registries), 或者 JWSDP (Java Web Services Developer Pack)。<br /><br />你需要学习一门轻量级应用程序框架，例如Spring, PicoContainer, Avalon, 以及它们的IoC/DI 风格(setter, constructor, interface injection)。<br /><br />你需要熟悉不同的J2EE技术，例如JNDI (Java Naming and Directory Interface), JMS (Java Message Service), JTA/JTS (Java Transaction API/Java Transaction Service), JMX (Java Management eXtensions), 以及 JavaMail.<br /><br />你需要学习企业级Java Beans（EJB）以及它们的不同组件模式：Stateless/Stateful Session Beans, Entity Beans (包含Bean-Managed Persistence [BMP] 或者 Container-Managed Persistence [CMP] 和它的 EJB-QL), 或者Message-Driven Beans (MDB).<br /><br />你需要学习如何管理与配置一个J2EE应用程序服务器，如WebLogic ，JBoss等，并且利用它的附加服务，例如簇类,连接池以及分布式处理支援。你还需要了解如何在它上面封装和配置应用程序并且能够监控、调整它的性能。<br /><br />你需要熟悉面向方面的程序设计以及面向属性的程序设计（这两个都被很容易混淆的缩写为AOP），以及他们的主流JAVA规格和执行。例如AspectJ 和AspectWerkz。<br /><br />你需要熟悉对不同有用的API和frame&#x1E;&#x1E;work等来为你服务。例如Log4J (logging/tracing), Quartz (scheduling), JGroups (network group communication), JCache (distributed caching), Lucene (full-text search), Jakarta Commons等等。<br /><br />如果你将要对接或者正和旧的系统或者本地平台，你需要学习JNI (Java Native Interface) and JCA (Java Connector Architecture).<br /><br />你需要熟悉JINI技术以及与它相关的分布式系统，比如掌握CROBA。<br /><br />你需要Java Community Process(JCP)以及他的不同Java Specification Requests (JSRs), 例如 Portlets (168), JOLAP (69), Data Mining API (73), 等等。<br /><br />你应该熟练掌握一种JAVA IDE例如sunOne ,netBeans ,IntelliJ IDEA或者Eclipse。（有些人更喜欢VI或EMACS来编写文件。随便你用什么了：））<br /><br />JAVA（精确的说是有些配置）是冗长的，它需要很多的人工代码（例如EJB），所以你需要熟悉代码生成工具，例如XDoclet。<br /><br />你需要熟悉一种单元测试体系（JNunit），并且学习不同的生成、部署工具（Ant, Maven）。<br /><br />你需要熟悉一些在JAVA开发中经常用到的软件工程过程。例如RUP (Rational Unified Process) and Agile methodologies.<br /><br />你需要能够深入了解加熟练操作和配置不同的操作系统,比如GNU/linux ,sun solaris,mac OS等,做为跨平台软件的开发者。<br /><br />你还需要紧跟java发展的步伐,比如现在可以深入的学习java ME ,以及各种java 新规范，技术的运用,如 新起的web富客户端技术。<br /><br />你必需要对open source有所了解，因为至少java 的很多技术直接是靠开源来驱动发展的 ,如 java 3D技术。</b>[/b]</u>
						</span>
				</div>
		</dd>
<img src ="http://www.blogjava.net/songfei/aggbug/59660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-07-23 16:51 <a href="http://www.blogjava.net/songfei/articles/59660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅析Java语言中的内部类 </title><link>http://www.blogjava.net/songfei/articles/54617.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Fri, 23 Jun 2006 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/54617.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/54617.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/54617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/54617.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/54617.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<table cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff" border="0">
												<tbody>
														<tr>
																<td class="title1" align="middle" width="100%" bgcolor="#eeeeee" colspan="3" height="40">
																		<b>浅析Java语言中的内部类</b>
																</td>
														</tr>
														<tr>
																<td align="middle" width="100%" bgcolor="#eeeeee">
																		<a href="http://www.javaresearch.org/profile.jsp?user=108263">autumn_thermal</a> 转贴  (参与分：47178，专家分：3441)   发表：2006-06-22 12:32   版本：1.0   阅读：<b>207</b>次 </td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
						<!-- end of article title -->
						<tr>
								<td valign="top" align="middle" width="100%">
										<!--start of article content -->
										<table width="98%" border="0">
												<tbody>
														<tr>
																<td class="text" align="left" width="100%">
																		<br />浅析Java语言中的内部类 <br />作者：morgan83    来自：csdn<br /><br />　　提起Java内部类（Inner Class）可能很多人不太熟悉，实际上类似的概念在C++里也有，那就是嵌套类（Nested Class），关于这两者的区别与联系，在下文中会有对比。内部类从表面上看，就是在类中又定义了一个类（下文会看到，内部类可以在很多地方定义），而实际上并没有那么简单，乍看上去内部类似乎有些多余，它的用处对于初学者来说可能并不是那么显著，但是随着对它的深入了解，你会发现Java的设计者在内部类身上的确是用心良苦。学会使用内部类，是掌握Java高级编程的一部分，它可以让你更优雅地设计你的程序结构。下面从以下几个方面来介绍：<br /><br />　　第一次见面<br /><br />public interface Contents {<br />　int value();<br />}<br /><br />public interface Destination {<br />　String readLabel();<br />}<br /><br />public class Goods {<br />　private class Content implements Contents {<br />　　private int i = 11;<br />　　public int value() { <br />　　　return i; <br />　　}<br />　}<br /><br />　protected class GDestination implements Destination {<br />　　private String label;<br />　　private GDestination(String whereTo) {<br />　　　label = whereTo;<br />　　}<br />　　public String readLabel() { <br />　　　return label; <br />　　}<br />　}<br /><br />　public Destination dest(String s) {<br />　　return new GDestination(s);<br />　}<br />　public Contents cont() {<br />　　return new Content();<br />　}<br />}<br /><br />class TestGoods {<br />　public static void main(String[] args) {<br />　　Goods p = new Goods();<br />　　Contents c = p.cont();<br />　　Destination d = p.dest("Beijing");<br />　}<br />}  <br /><br />　　在这个例子里类Content和GDestination被定义在了类Goods内部，并且分别有着protected和private修饰符来控制访问级别。Content代表着Goods的内容，而GDestination代表着Goods的目的地。它们分别实现了两个接口Content和Destination。在后面的main方法里，直接用 Contents c和Destination d进行操作，你甚至连这两个内部类的名字都没有看见！这样，内部类的第一个好处就体现出来了??隐藏你不想让别人知道的操作，也即封装性。 <br /><br />　　同时，我们也发现了在外部类作用范围之外得到内部类对象的第一个方法，那就是利用其外部类的方法创建并返回。上例中的cont()和dest()方法就是这么做的。那么还有没有别的方法呢？当然有，其语法格式如下：<br /><br />outerObject=new outerClass(Constructor Parameters);<br /><br />outerClass.innerClass innerObject=outerObject.new InnerClass(Constructor Parameters); <br /><br />　　注意在创建非静态内部类对象时，一定要先创建起相应的外部类对象。至于原因，也就引出了我们下一个话题??非静态内部类对象有着指向其外部类对象的引用，对刚才的例子稍作修改：<br /><br />public class Goods {<br /><br />　private valueRate=2;<br /><br />　private class Content implements Contents {<br />　　private int i = 11*valueRate;<br />　　public int value() { <br />　　　return i; <br />　　}<br />　}<br /><br />　protected class GDestination implements Destination {<br />　　private String label;<br />　　private GDestination(String whereTo) {<br />　　　label = whereTo;<br />　　}<br />　　public String readLabel() { <br />　　　return label; <br />　　}<br />　}<br /><br />　public Destination dest(String s) {<br />　　return new GDestination(s);<br />　}<br />　public Contents cont() {<br />　　return new Content();<br />　}<br />} <br /><br />　　修改的部分用蓝色显示了。在这里我们给Goods类增加了一个private成员变量valueRate，意义是货物的价值系数，在内部类Content的方法value()计算价值时把它乘上。我们发现，value()可以访问valueRate，这也是内部类的第二个好处??一个内部类对象可以访问创建它的外部类对象的内容，甚至包括私有变量！这是一个非常有用的特性，为我们在设计时提供了更多的思路和捷径。要想实现这个功能，内部类对象就必须有指向外部类对象的引用。Java编译器在创建内部类对象时，隐式的把其外部类对象的引用也传了进去并一直保存着。这样就使得内部类对象始终可以访问其外部类对象，同时这也是为什么在外部类作用范围之外向要创建内部类对象必须先创建其外部类对象的原因。<br /><br />　　有人会问，如果内部类里的一个成员变量与外部类的一个成员变量同名，也即外部类的同名成员变量被屏蔽了，怎么办？没事，Java里用如下格式表达外部类的引用：<br /><br />outerClass.this  <br /><br />　　有了它，我们就不怕这种屏蔽的情况了。<br /><br />　　静态内部类<br /><br />　　和普通的类一样，内部类也可以有静态的。不过和非静态内部类相比，区别就在于静态内部类没有了指向外部的引用。这实际上和C++中的嵌套类很相像了，Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用这一点上，当然从设计的角度以及以它一些细节来讲还有区别。<br /><br />　　除此之外，在任何非静态内部类中，都不能有静态数据，静态方法或者又一个静态内部类（内部类的嵌套可以不止一层）。不过静态内部类中却可以拥有这一切。这也算是两者的第二个区别吧。<br /><br />　　局部内部类 <br /><br />　　是的，Java内部类也可以是局部的，它可以定义在一个方法甚至一个代码块之内。<br /><br />public class Goods1 {<br />　public Destination dest(String s) {<br />　　class GDestination implements Destination {<br />　　　private String label;<br />　　　private GDestination(String whereTo) {<br />　　　　label = whereTo;<br />　　　}<br />　　　public String readLabel() { return label; }<br />　　}<br />　　return new GDestination(s);<br />　}<br /><br />　public static void main(String[] args) {<br />　　Goods1 g= new Goods1();<br />　　Destination d = g.dest("Beijing");<br />　}<br />} <br /><br />　　上面就是这样一个例子。在方法dest中我们定义了一个内部类，最后由这个方法返回这个内部类的对象。如果我们在用一个内部类的时候仅需要创建它的一个对象并创给外部，就可以这样做。当然，定义在方法中的内部类可以使设计多样化，用途绝不仅仅在这一点。<br /><br />　　下面有一个更怪的例子：<br /><br />public class Goods2{<br />　private void internalTracking(boolean b) {<br />　　if(b) {<br />　　　class TrackingSlip {<br />　　　　private String id;<br />　　　　TrackingSlip(String s) {<br />　　　　　id = s;<br />　　　　}<br />　　　　String getSlip() { return id; }<br />　　　}<br />　　　TrackingSlip ts = new TrackingSlip("slip");<br />　　　String s = ts.getSlip();<br />　　} <br />　}<br /><br />　public void track() { internalTracking(true); }<br /><br />　public static void main(String[] args) {<br />　　Goods2 g= new Goods2();<br />　　g.track();<br />　}<br />} <br /><br />　　你不能在if之外创建这个内部类的对象，因为这已经超出了它的作用域。不过在编译的时候，内部类TrackingSlip和其他类一样同时被编译，只不过它由它自己的作用域，超出了这个范围就无效，除此之外它和其他内部类并没有区别。<br /><br />　　匿名内部类 <br /><br />　　java的匿名内部类的语法规则看上去有些古怪，不过如同匿名数组一样，当你只需要创建一个类的对象而且用不上它的名字时，使用内部类可以使代码看上去简洁清楚。它的语法规则是这样的：<br /><br />new interfacename(){......}; 或 new superclassname(){......};  <br /><br />　　下面接着前面继续举例子：<br /><br />public class Goods3 {<br />　public Contents cont(){<br />　　return new Contents(){<br />　　　private int i = 11;<br />　　　public int value() { <br />　　　　return i; <br />　　　}<br />　　};<br />　}<br />}  <br /><br />　　这里方法cont()使用匿名内部类直接返回了一个实现了接口Contents的类的对象，看上去的确十分简洁。<br /><br />　　在java的事件处理的匿名适配器中，匿名内部类被大量的使用。例如在想关闭窗口时加上这样一句代码：<br /><br />frame.addWindowListener(new WindowAdapter(){<br />　public void windowClosing(WindowEvent e){<br />　　System.exit(0); <br />　}<br />}); <br /><br />　　有一点需要注意的是，匿名内部类由于没有名字，所以它没有构造函数（但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类，创建它的时候必须带上这些参数，并在实现的过程中使用super关键字调用相应的内容）。如果你想要初始化它的成员变量，有下面几种方法：<br /><br />　　如果是在一个方法的匿名内部类，可以利用这个方法传进你想要的参数，不过记住，这些参数必须被声明为final。 <br /><br />　　将匿名内部类改造成有名字的局部内部类，这样它就可以拥有构造函数了。 <br /><br />　　在这个匿名内部类中使用初始化代码块。 <br /><br />　　为什么需要内部类？ <br /><br />　　java内部类有什么好处？为什么需要内部类？<br /><br />　　首先举一个简单的例子，如果你想实现一个接口，但是这个接口中的一个方法和你构想的这个类中的一个方法的名称，参数相同，你应该怎么办？这时候，你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的，所以这样做可以完成所有你直接实现这个接口的功能。<br /><br />　　不过你可能要质疑，更改一下方法的不就行了吗？<br /><br />　　的确，以此作为设计内部类的理由，实在没有说服力。<br /><br />　　真正的原因是这样的，java中的内部类和接口加在一起，可以的解决常被C++程序员抱怨java中存在的一个问题??没有多继承。实际上，C++的多继承设计起来很复杂，而java通过内部类加上接口，可以很好的实现多继承的效果。<br /></td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/songfei/aggbug/54617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-06-23 09:44 <a href="http://www.blogjava.net/songfei/articles/54617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WEBlogic中部署EJB的XML写法</title><link>http://www.blogjava.net/songfei/articles/52715.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Wed, 14 Jun 2006 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/52715.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/52715.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/52715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/52715.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/52715.html</trackback:ping><description><![CDATA[
		<p>ejb-jar.xml<br />&lt;?xml version="1.0"?&gt;</p>
		<p>&lt;!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN' 'http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd'&gt;</p>
		<p>&lt;ejb-jar&gt;<br />  &lt;enterprise-beans&gt;<br />    &lt;session&gt;<br />      &lt;ejb-name&gt;zx0050e01&lt;/ejb-name&gt;<br />      &lt;home&gt;jp.co.sri.tyresv.zensya.service.zx.zx0050.zx0050e01.Zx0050E01Home&lt;/home&gt;<br />      &lt;remote&gt;jp.co.sri.tyresv.zensya.service.zx.zx0050.zx0050e01.Zx0050E01&lt;/remote&gt;<br />      &lt;ejb-class&gt;jp.co.sri.tyresv.zensya.service.zx.zx0050.zx0050e01.Zx0050E01Bean&lt;/ejb-class&gt;<br />      &lt;session-type&gt;Stateless&lt;/session-type&gt;<br />      &lt;transaction-type&gt;Container&lt;/transaction-type&gt;<br />      &lt;env-entry&gt;<br />        &lt;description&gt;&lt;/description&gt;<br />        &lt;env-entry-name&gt;zensyaDbConnection&lt;/env-entry-name&gt;<br />        &lt;env-entry-type&gt;java.lang.String&lt;/env-entry-type&gt;<br />        &lt;env-entry-value&gt;ome.DbUrl2&lt;/env-entry-value&gt;<br />      &lt;/env-entry&gt;<br />      &lt;env-entry&gt;<br />        &lt;description&gt;&lt;/description&gt;<br />        &lt;env-entry-name&gt;zensyaDbUser&lt;/env-entry-name&gt;<br />        &lt;env-entry-type&gt;java.lang.String&lt;/env-entry-type&gt;<br />        &lt;env-entry-value&gt;ome.DbUser2&lt;/env-entry-value&gt;<br />      &lt;/env-entry&gt;<br />      &lt;env-entry&gt;<br />        &lt;description&gt;&lt;/description&gt;<br />        &lt;env-entry-name&gt;zensyaDbPassword&lt;/env-entry-name&gt;<br />        &lt;env-entry-type&gt;java.lang.String&lt;/env-entry-type&gt;<br />        &lt;env-entry-value&gt;ome.DbPassword2&lt;/env-entry-value&gt;<br />      &lt;/env-entry&gt;<br />    &lt;/session&gt;<br />  &lt;/enterprise-beans&gt;<br />  &lt;assembly-descriptor&gt;<br />    &lt;container-transaction&gt;<br />      &lt;method&gt;<br />        &lt;ejb-name&gt;zx0050e01&lt;/ejb-name&gt;<br />        &lt;method-intf&gt;Remote&lt;/method-intf&gt;<br />        &lt;method-name&gt;*&lt;/method-name&gt;<br />      &lt;/method&gt;<br />      &lt;trans-attribute&gt;Required&lt;/trans-attribute&gt;<br />    &lt;/container-transaction&gt;<br />  &lt;/assembly-descriptor&gt;<br />&lt;/ejb-jar&gt;<br /></p>
		<p>
				<br />weblogic-ejb-jar.xml:::::::::::::::<br />&lt;?xml version="1.0"?&gt;</p>
		<p>&lt;!DOCTYPE weblogic-ejb-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 6.0.0 EJB//EN' 'http://www.bea.com/servers/wls600/dtd/weblogic-ejb-jar.dtd'&gt;</p>
		<p>&lt;weblogic-ejb-jar&gt;<br />  &lt;weblogic-enterprise-bean&gt;<br />    &lt;ejb-name&gt;zx0050e01&lt;/ejb-name&gt;<br />    &lt;jndi-name&gt;jp.co.sri.tyresv.zensya.service.zx.zx0050.zx0050e01&lt;/jndi-name&gt;<br />  &lt;/weblogic-enterprise-bean&gt;<br />&lt;/weblogic-ejb-jar&gt;<br /></p>
		<p>////////////////////////////<br />D:\jar\Zx0050E01\jp\co\sri\tyresv\zensya\business\zx\zx0050\zx0050e01\BizZx0050E01.class<br />/////////////////////<br />D:\jar\Zx0050E01\jp\co\sri\tyresv\zensya\service\zx\zx0050\zx0050e01\Zx0050E01.class,Zx0050E01Bean.class,Zx0050E01D01$1.class,Zx0050E01D01.class,Zx0050E01D02.class,Zx0050E01Home.class,Zx0050E01I01.class</p>
<img src ="http://www.blogjava.net/songfei/aggbug/52715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-06-14 14:01 <a href="http://www.blogjava.net/songfei/articles/52715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA相关基础知识</title><link>http://www.blogjava.net/songfei/articles/51638.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Fri, 09 Jun 2006 03:06:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/51638.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/51638.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/51638.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/51638.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/51638.html</trackback:ping><description><![CDATA[
		<span class="oblog_text">JAVA相关基础知识<br /><strong>1、面向对象的特征有哪些方面</strong>   <br /><strong>1.抽象：</strong><br />抽象就是忽略一个主题中与当前目标无关的那些方面，以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题，而只是选择其中的一部分，暂时不用部分细节。抽象包括两个方面，一是过程抽象，二是数据抽象。<br /><strong>2.继承：</strong><br />继承是一种联结类的层次模型，并且允许和鼓励类的重用，它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生，这个过程称为类继承。新类继承了原始类的特性，新类称为原始类的派生类（子类），而原始类称为新类的基类（父类）。派生类可以从它的基类那里继承方法和实例变量，并且类可以修改或增加新的方法使之更适合特殊的需要。<br /><strong>3.封装：</strong><br />封装是把过程和数据包围起来，对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念，即现实世界可以被描绘成一系列完全自治、封装的对象，这些对象通过一个受保护的接口访问其他对象。<br /><strong>4. 多态性：</strong><br />多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势，很好的解决了应用程序函数同名问题。<br /><strong>2、String是最基本的数据类型吗?</strong><br />基本数据类型包括byte、int、char、long、float、double、boolean和short。<br />java.lang.String类是final类型的，因此不可以继承这个类、不能修改这个类。为了提高效率节省空间，我们应该用StringBuffer类<br /><strong>3、int 和 Integer 有什么区别</strong><br />Java 提供两种不同的类型：引用类型和原始类型（或内置类型）。Int是java的原始数据类型，Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。<br />原始类型封装类<br />booleanBoolean<br />charCharacter<br />byteByte<br />shortShort<br />intInteger<br />longLong<br />floatFloat<br />doubleDouble<br />引用类型和原始类型的行为完全不同，并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法，它们包括：大小和速度问题，这种类型以哪种类型的数据结构存储，当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null，而原始类型实例变量的缺省值与它们的类型有关。<br /><strong>4、String 和StringBuffer的区别</strong><br />JAVA平台提供了两个类：String和StringBuffer，它们可以储存和操作字符串，即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地，你可以使用StringBuffers来动态构造字符数据。<br /><strong>5、运行时异常与一般异常有何异同？</strong><br />异常表示程序运行过程中可能出现的非正常状态，运行时异常表示虚拟机的通常操作中可能遇到的异常，是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常，但是并不要求必须声明抛出未被捕获的运行时异常。<br /><strong>6、说出Servlet的生命周期，并说出Servlet和CGI的区别。</strong><br />Servlet被服务器实例化后，容器运行其init方法，请求到达时运行其service方法，service方法自动派遣运行与请求对应的doXXX方法（doGet，doPost）等，当服务器决定将实例销毁的时候调用其destroy方法。<br />与cgi的区别在于servlet处于服务器进程中，它通过多线程方式运行其service方法，一个实例可以服务于多个请求，并且其实例一般不会销毁，而CGI对每个请求都产生新的进程，服务完成后就销毁，所以效率上低于servlet。<br /><strong>7、说出ArrayList,Vector, LinkedList的存储性能和特性</strong><br />ArrayList和Vector都是使用数组方式存储数据，此数组元素数大于实际存储的数据以便增加和插入元素，它们都允许直接按序号索引元素，但是插入元素要涉及数组元素移动等内存操作，所以索引数据快而插入数据慢，Vector由于使用了synchronized方法（线程安全），通常性能上较ArrayList差，而LinkedList使用双向链表实现存储，按序号索引数据需要进行前向或后向遍历，但是插入数据时只需要记录本项的前后项即可，所以插入速度较快。<br /><strong>8、EJB是基于哪些技术实现的？并说出SessionBean和EntityBean的区别，StatefulBean和StatelessBean的区别。</strong><br />    EJB包括Session Bean、Entity Bean、Message Driven Bean，基于JNDI、RMI、JAT等技术实现。<br />SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作，例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。<br />对于客户机，SessionBean是一种非持久性对象，它实现某些在服务器上运行的业务逻辑。<br />对于客户机，EntityBean是一种持久性对象，它代表一个存储在持久性存储器中的实体的对象视图，或是一个由现有企业应用程序实现的实体。<br />Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ，这两种的 Session Bean都可以将系统逻辑放在 method之中执行，不同的是 Stateful Session Bean 可以记录呼叫者的状态，因此通常来说，一个使用者会有一个相对应的 Stateful Session Bean 的实体。Stateless Session Bean 虽然也是逻辑组件，但是他却不负责记录使用者状态，也就是说当使用者呼叫 Stateless Session Bean 的时候，EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method。换言之，很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时，会是同一个 Bean 的 Instance 在执行。从内存方面来看， Stateful Session Bean 与 Stateless Session Bean 比较， Stateful Session Bean 会消耗 J2EE Server 较多的内存，然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。<br /><strong>9、Collection 和 Collections的区别。</strong> <br />　　Collection是集合类的上级接口，继承与他的接口主要有Set 和List.<br />Collections是针对集合类的一个帮助类，他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。<br /><strong>10、&amp;和&amp;&amp;的区别。 </strong><br />    &amp;是位运算符，表示按位与运算，&amp;&amp;是逻辑运算符，表示逻辑与（and）。<br /><strong>11、HashMap和Hashtable的区别。</strong> <br />    HashMap是Hashtable的轻量级实现（非线程安全的实现），他们都完成了Map接口，主要区别在于HashMap允许空（null）键值（key）,由于非线程安全，效率上可能高于Hashtable。<br />HashMap允许将null作为一个entry的key或者value，而Hashtable不允许。<br />HashMap把Hashtable的contains方法去掉了，改成containsvalue和containsKey。因为contains方法容易让人引起误解。 <br />Hashtable继承自Dictionary类，而HashMap是Java1.2引进的Map interface的一个实现。<br />最大的不同是，Hashtable的方法是Synchronize的，而HashMap不是，在多个线程访问Hashtable时，不需要自己为它的方法实现同步，而HashMap 就必须为之提供外同步。 <br />Hashtable和HashMap采用的hash/rehash算法都大概一样，所以性能不会有很大的差异。<br /><strong>12、final, finally, finalize的区别。</strong> <br />　　final 用于声明属性，方法和类，分别表示属性不可变，方法不可覆盖，类不可继承。<br />finally是异常处理语句结构的一部分，表示总是执行。<br />finalize是Object类的一个方法，在垃圾收集器执行的时候会调用被回收对象的此方法，可以覆盖此方法提供垃圾收集时的其他资源回收，例如关闭文件等。<br /><strong>13、sleep() 和 wait() 有什么区别? </strong><br />    sleep是线程类（Thread）的方法，导致此线程暂停执行指定时间，给执行机会给其他线程，但是监控状态依然保持，到时后会自动恢复。调用sleep不会释放对象锁。<br />wait是Object类的方法，对此对象调用wait方法导致本线程放弃对象锁，进入等待此对象的等待锁定池，只有针对此对象发出notify方法（或notifyAll）后本线程才进入对象锁定池准备获得对象锁进入运行状态。<br /><strong>14、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?</strong><br />方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现，重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数，我们说该方法被重写 (Overriding)。子类的对象使用这个方法时，将调用子类中的定义，对它而言，父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法，它们或有不同的参数个数或有不同的参数类型，则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。<br /><strong>15、error和exception有什么区别?</strong><br />error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。<br />    exception 表示一种设计或实现问题。也就是说，它表示如果程序运行正常，从不会发生的情况。<br /><strong>16、同步和异步有何异同，在什么情况下分别使用他们？举例说明。</strong><br />如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到，或者正在读的数据可能已经被另一个线程写过了，那么这些数据就是共享数据，必须进行同步存取。<br />当应用程序在对象上调用了一个需要花费很长时间来执行的方法，并且不希望让程序等待方法的返回时，就应该使用异步编程，在很多情况下采用异步途径往往更有效率。<br /><strong>17、abstract class和interface有什么区别?</strong><br />声明方法的存在而不去实现它的类被叫做抽象类（abstract class），它用于要创建一个体现某些基本行为的类，并为该类声明方法，但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量，其类型是一个抽象类，并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现，否则它们也是抽象类为。取而代之，在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。<br />接口（interface）是抽象类的变体。在接口中，所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的，没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似，除了该实现类不能从接口定义中继承行为。当类实现特殊接口时，它定义（即将程序体给予）所有这种接口的方法。然后，它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类，它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换，instanceof 运算符可以用来决定某对象的类是否实现了接口。<br /><strong>18、heap和stack有什么区别。</strong><br />栈是一种线形集合，其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。<br />堆是栈的一个组成元素<br /><strong>19、forward 和redirect的区别</strong><br />forward是服务器请求资源，服务器直接访问目标地址的URL，把那个URL的响应内容读取过来，然后把这些内容再发给浏览器，浏览器根本不知道服务器发送的内容是从哪儿来的，所以它的地址栏中还是原来的地址。<br />    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址，一般来说浏览器会用刚才请求的所有参数重新请求，所以session,request参数都可以获取。 <br /></span>
<img src ="http://www.blogjava.net/songfei/aggbug/51638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-06-09 11:06 <a href="http://www.blogjava.net/songfei/articles/51638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat+JSP经典配置实例</title><link>http://www.blogjava.net/songfei/articles/51286.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Thu, 08 Jun 2006 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/51286.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/51286.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/51286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/51286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/51286.html</trackback:ping><description><![CDATA[经常看到jsp的初学者问tomcat下如何配置jsp、servlet和bean的问题，于是总结了一下如何tomcat下配置jsp、servlet和ben，希望对那些初学者有所帮助。<br /><br /><b>一、开发环境配置</b><br /><br />第一步：下载j2sdk和tomcat：到sun官方站（http://java.sun.com/j2se/1.5.0/download.jsp）下载j2sdk，注意下载版本为Windows Offline Installation的SDK，同时最好下载J2SE 1.5.0 Documentation，然后到tomcat官方站点（http://jakarta.apache.org/site/downloads/downloads_tomcat-5.cgi）下载tomcat（下载最新5.5.9版本的tomcat）；<br /><br />第二步：安装和配置你的j2sdk和tomcat：执行j2sdk和tomcat的安装程序，然后按默认设置进行安装即可。<br /><br />1.安装j2sdk以后，需要配置一下环境变量，在我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量中添加以下环境变量(假定你的j2sdk安装在c:\j2sdk1.5.0）：<br /><br />JAVA_HOME=c:\j2sdk1.5.0<br />classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;（.;一定不能少，因为它代表当前路径)<br />path=%JAVA_HOME%\bin<br /><br />接着可以写一个简单的java程序来测试J2SDK是否已安装成功：<br /><br />public class Test{<br />public static void main(String args[]){<br />System.out.println("This is a test program.");<br />}<br />}<br /><br />将上面的这段程序保存为文件名为Test.java的文件。<br /><br />然后打开命令提示符窗口，cd到你的Test.java所在目录，然后键入下面的命令<br /><br />javac Test.java<br />java Test<br /><br />此时如果看到打印出来This is a test program.的话说明安装成功了，如果没有打印出这句话，你需要仔细检查一下你的配置情况。<br /><br />2.安装Tomcat后，在我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量中添加以下环境变量(假定你的tomcat安装在c:\tomcat)：<br /><br />CATALINA_HOME=c:\tomcat<br />CATALINA_BASE=c:\tomcat<br /><br />然后修改环境变量中的classpath，把tomat安装目录下的common\lib下的(可以根据实际追加)servlet.jar追加到classpath中去，修改后的classpath如下：<br /><br />classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar;<br /><br />接着可以启动tomcat，在IE中访问http://localhost:8080，如果看到tomcat的欢迎页面的话说明安装成功了。<br /><br />第三步：建立自己的jsp app目录<br /><br />1.到Tomcat的安装目录的webapps目录，可以看到ROOT，examples, tomcat-docs之类Tomcat自带的的目录；<br />2.在webapps目录下新建一个目录，起名叫myapp；<br />3.myapp下新建一个目录WEB-INF，注意，目录名称是区分大小写的；<br />4.WEB-INF下新建一个文件web.xml，内容如下：<br /><br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br />&lt;web-app&gt;<br />&lt;display-name&gt;My Web Application&lt;/display-name&gt;<br />&lt;description&gt;<br />A application for test.<br />&lt;/description&gt;<br />&lt;/web-app&gt;<br /><br />5.在myapp下新建一个测试的jsp页面，文件名为index.jsp，文件内容如下：<br />&lt;html&gt;&lt;body&gt;&lt;center&gt;<br />Now time is: &lt;%=new java.util.Date()%&gt;<br />&lt;/center&gt;&lt;/body&gt;&lt;/html&gt;<br /><br />6.重启Tomcat<br /><br />7.打开浏览器，输入http://localhost:8080/myapp/index.jsp 看到当前时间的话说明就成功了。<br /><br />第四步：建立自己的Servlet：<br /><br />1.用你最熟悉的编辑器（建议使用有语法检查的java ide）新建一个servlet程序，文件名为Test.java，文件内容如下：<br /><br />package test;<br />import java.io.IOException;<br />import java.io.PrintWriter;<br />import javax.servlet.ServletException;<br />import javax.servlet.http.HttpServlet;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />public class Test extends HttpServlet {<br />protected void doGet(HttpServletRequest request, HttpServletResponse response)<br />throws ServletException, IOException {<br />PrintWriter out=response.getWriter();<br />out.println("&lt;html&gt;&lt;body&gt;&lt;h1&gt;This is a servlet test.&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;");<br />out.flush();<br />}<br />}<br /><br />2 .编译<br />将Test.java放在c:\test下，使用如下命令编译：<br /><br />C:\Test&gt;javac Test.java<br /><br />然后在c:\Test下会产生一个编译后的servlet文件：Test.class<br /><br />3 .将结构test\Test.class剪切到%CATALINA_HOME%\webapps\myapp\WEB-INF\classes下，也就是剪切那个test目录到classes目录下，如果classes目录不存在，就新建一个。 现在webapps\myapp\WEB-INF\classes下有test\Test.class的文件目录结构<br /><br />4 .修改webapps\myapp\WEB-INF\web.xml，添加servlet和servlet-mapping<br /><br />编辑后的web.xml如下所示，红色为添加的内容:<br /><br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />&lt;!DOCTYPE web-app<br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br />&lt;web-app&gt;<br />&lt;display-name&gt;My Web Application&lt;/display-name&gt;<br />&lt;description&gt;<br />A application for test.<br />&lt;/description&gt;<br />&lt;servlet&gt;<br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />&lt;display-name&gt;Test&lt;/display-name&gt;<br />&lt;description&gt;A test Servlet&lt;/description&gt;<br />&lt;servlet-class&gt;test.Test&lt;/servlet-class&gt;<br />&lt;/servlet&gt;<br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt;Test&lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/Test&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br />&lt;/web-app&gt;<br /><br />这段话中的servlet这一段声明了你要调用的Servlet，而servlet-mapping则是将声明的servlet"映射"到地址/Test上<br /><br />5 .好了，重启动Tomcat，启动浏览器，输入http://localhost:8080/myapp/Test 如果看到输出This is a servlet test.就说明编写的servlet成功了。<br /><br />注意：修改了web.xml以及新加了class，都要重启Tomcat<br /><br />第四步：建立自己的Bean：<br /><br />1.用你最熟悉的编辑器（建议使用有语法检查的java ide）新建一个java程序，文件名为TestBean.java，文件内容如下：<br /><br />package test;<br />public class TestBean{<br />private String name = null;<br />public TestBean(String strName_p){<br />this.name=strName_p;<br />}<br />public void setName(String strName_p){<br />this.name=strName_p;<br />}<br />public String getName(){<br />return this.name;<br />}<br />}<br /><br />2 .编译<br /><br />将TestBean.java放在c:\test下，使用如下命令编译：<br /><br />C:\Test&gt;javac TestBean.java<br /><br />然后在c:\Test下会产生一个编译后的bean文件：TestBean.class<br /><br />3 .将TestBean.class文件剪切到 %CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下，<br /><br />4 .新建一个TestBean.jsp文件，文件内容为：<br /><br />&lt;%@ page import="test.TestBean" %&gt;<br />&lt;html&gt;&lt;body&gt;&lt;center&gt;<br />&lt;%<br />TestBean testBean=new TestBean("This is a test java bean.");<br />%&gt;<br />Java bean name is: &lt;%=testBean.getName()%&gt;<br />&lt;/center&gt;&lt;/body&gt;&lt;/html&gt;<br /><br />5 .好了，重启Tomcat，启动浏览器，输入http://localhost:8080/myapp/TestBean.jsp 如果看到输出Java bean name is: This is a test java bean.就说明编写的Bean成功了。<br /><br />这样就完成了整个Tomcat下的jsp、servlet和javabean的配置。接下来需要做的事情就是多看书、多读别人的好代码，自己多动手写代码以增强自己在这方面开发的能力了。<br /><br />jvm应填写到<br />c:\j2sdk\bin<br /><br />给你一个简单的配置：：：：<br /><br /><b>JSP环境配置心得</b><br /><br />首先要说的是，使用jdk+tomcat完全可以配置我们的jsp服务器，不再需要其实任何东东，有很多文章介绍了Apache，其实根本用不着，一般的学习调试tomcat完全可以胜任了。<br /><br />安装jdk后，tomcat在安装之前会自动找到jdk的安装路径，一路点击"下一步"，经过一段时间的文件复制，最后"close"，完成comcat的安装。<br /><br />您最好去下载一个版本较高的tomcat，比如4.1以上的，因为它不需要设置太多的系统变量，右击"我的电脑"，选择"属性"-&gt;"高级"-&gt;"环境变量"-&gt;"系统变量"，新建一个TOMCAT_HOME，值设置成你的tomcat所在的路径，比如：D:\Program Files\Apache Group\Tomcat 5.5，配置完成。<br /><br />从开始菜单中找到tomcat选项，一般打开顺序是：开始-&gt;程序-&gt;Apache Tomcat 5.5，选择"Start Tomcat"，让jsp服务器开始运行，此时会打开一个类似Dos的窗口，会显示一些相关的信息。<br /><br />如果您使用代理上网，一定要先撤掉代理，不然您的jsp程序永远也得不到执行。如果不是代理的，这一步就跳过了。<br /><br />打开浏览器，在地址栏中输入：http://localhost:8080，如果看到有老虎（我也不知道是老虎还是猫）的画面，恭喜您，您成功了一半。<br /><br />先来享受一下成功的喜悦吧，请输入下面的代码：<br /><br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;First Page&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;H3&gt;Today is: h<br />&lt;%= new java.util.Date() %&gt;<br />&lt;/H3&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br /><br />将该程序保存为:First.jsp，放到Tomcat的ROOT目录下，然后在浏览器的地址栏中输入：http://localhost:8080/First.jsp，(First.jsp跟我们保存的文件名的大小写要一致)回车，如果不出意外，应该可以看到形如Today is: h Fri Apr 11 08:32:38 CST 2003 的结果。<br /><br />注意：ROOT是tomcat的默认虚拟目录，如果要改成自己的虚拟目录怎么办呢？请继续往下看吧。<br /><br />要改成自己的虚拟目录，就要请出server.xml来了，该文件是一个配置文件，在Tomcat\conf目录下，使用任何文本编辑软件都能打开它，我们先找到下面一句：<br /><br />&lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector"<br />port="8080" minProcessors="5" maxProcessors="75"<br />enableLookups="true" redirectPort="8443"<br />acceptCount="100" debug="0" connectionTimeout="20000"<br />useURIValidationHack="false" disableUploadTimeout="true" /&gt;<br /><br />这里的port="8080"就是端口，我们完全可以用别的端口来代替，但不能是被系统占用的端口（0--1023），这里简单提一下。<br /><br />下面我们再往下找，会发现以下的语句：<br /><br />&lt;/Context&gt;<br />&lt;/Host&gt;<br /><br />我们就应该找到这两个语句，如果不懂E文，您就认定这两个语句好了。然后我们将该语句更改如下：<br /><br />&lt;/Context&gt;<br />&lt;Context path="/myjsp" debug="0" docBase="e:/myjsp" reloadable="true"&gt;<br />&lt;/Context&gt;<br />&lt;/Host&gt;<br /><br />这里的path="/myjsp"就是我们就配置的虚拟目录了，以后在地址栏中输入http://localhost:8080/myjsp即可。而docBase="e:/myjsp" 则是机器本地路径，他们通过这个语句形成一个映射关系，其它照抄。<br /><br />将上面的First.jsp文件放到e:/myjsp目录下，输入http://localhost:8080/myjsp/First.jsp，是不是有一种喜上眉梢的感觉？<br /><br />在论坛里我见得最多的就是很多人不知道javaBean文件放到哪里，老实说开始我也不知道，更令人不解的是，十个人有九种不同的说法，这更让我们茫然。其实这问题也不是我们想像的那么复杂，我们以一个例子说明：<br /><br />先建立一个java程序，代码如下：<br /><br />package hall;<br />public class SimpleBean {<br />private String message = "No message specified";<br />public String getMessage() {<br />return(message);<br />}<br />public void setMessage(String message) {<br />this.message = message;<br />}<br />}<br /><br />保存为SimpleBean.java，编译后会生成一个包，其实就相当于一个目录，也就是SimpleBean.class会存放在hall目录中，暂且保存起来，将来备用。<br /><br />再输入以下代码：<br /><br />&lt;HTML&gt;<br />&lt;HEAD&gt;<br />&lt;TITLE&gt;Reusing JavaBeans in JSP&lt;/TITLE&gt;<br />&lt;/HEAD&gt;<br />&lt;BODY&gt;<br />&lt;CENTER&gt;<br />&lt;TABLE BORDER=5&gt;<br />&lt;TR&gt;&lt;TH CLASS="TITLE"&gt;<br />Reusing JavaBeans in JSP&lt;/TABLE&gt;<br />&lt;/CENTER&gt;<br />&lt;P&gt;<br />&lt;jsp:useBean id="test" class="hall.SimpleBean" /&gt;<br />&lt;jsp:setProperty name="test" property="message" value="Hello WWW" /&gt;<br />&lt;H1&gt;Message: &lt;I&gt;<br />&lt;jsp:getProperty name="test" property="message" /&gt;<br />&lt;/I&gt;&lt;/H1&gt;<br />&lt;/BODY&gt;<br /><br />保存在我们刚才建立的虚拟目录e:/myjsp下面，并命名为：BeanTest.jsp。<br /><br />现在我们应该将hall（包）目录放在哪儿呢？别急，我们先在e:/myjsp下建立一个文件夹WEB-INF，然后再在WEB-INF下建立一个classes文件夹，最后将hall目录放到classes下，当然，hall下的字节码文件SimpleBean.class也一并要移过来，而SimpleBean.java就和BeanTest.jsp放到同一目录吧（可以不需要放的，自己试试）。<br /><br />重新启动机器（如果您试了好多次都不行，这一步一定要做），在浏览器中输入：http://localhost:8080/myjsp/BeanTest.jsp，您看到了什么？呵，别告诉我您什么都没看到，那肯定是您设置的问题了。<br /><br /><b>Java学习 - 技术文章中心</b><br /><br />初学者问的诸如：《怎样配置环境变量》《怎样运行Servlet》啊？这样的问题太多了，现在我写一个初学者入门必读，以便对初学者有指导作用！<br /><br />首先是下载工具：<br /><br />我建议初学者用Editplus＋JDK，我觉得如果用例如JB，Eclipse，JCreator，虽然刚开始的时候比较方便，但是确使初学者门不知道怎样配置环境变量，<br /><br />从而难以达到知其然，知其所以然的地步<br /><br />可以通过如下地址下载：<br /><br />Editplus(最新版本是v2.11)：http://count.skycn.com/softdown.php?id=3641&amp;url=http://sc-http.skycn.net/down/epp211a_cn.exe(要照注册码就自己找吧，网上很多的）<br /><br />JDK(最新版本是Java2sdk1_5_0)：http://192.18.97.54/ECom/EComTicketServlet/BEGIN30AA3B63E5C2F61C8C26F84B78970A98/-2147483648/926882595/1/627578/627410/926882595/2ts+/westCoastFSEND/jdk-1.5.0_04-oth-JPR/jdk-1.5.0_04-oth-JPR:3/jdk-1_5_0_04-windows-i586-p.exe（这是For Windows）<br /><br />然后就是安装JDK，我是把它装到从c:\JDK目录下面：<br /><br />然后就是CLASSPATH的问题了：<br /><br />正如操作系统利用PATH来搜索可执行程序一样，Java运行环境也会遍历CLASSPATH来查找类，即便是HelloWorld这样简单的程序，JVM也会遍历<br /><br />CLASSPATH定义的每一个路径，直到找到相应的文件为止。<br /><br />相信大家用的系统不是2k就是XP，然后就应当如下设置Path：<br /><br />我的电脑-&gt;属性-&gt;高级-&gt;环境变量<br /><br />然后在环境变量的Path后面追加: C:\JDK\bin;.;C:\JDK\lib<br /><br />也可以这样配置:C:\JDK\bin;.;C:\JDK\lib\dt.jar;C:\JDK\lib\tools.jar<br /><br />★记住:环境变量中的 . 切记不能少，它表示当前路径，如果少掉出现的错误等会就说！<br /><br />dt.jar是关于运行环境的类库，tools.jar是关于一些工具的类库<br /><br />如果没有配置:C:\JDK\bin，则会出现 " javac′ 不是内部或外部命令，也不是可运行的程序或批处理文件。"这样的错误。<br /><br />然后下面就该写程序了：<br /><br />首先是(HelloWorld.java),打开Editplus，新建一个Java文件，请照着如下输入，要一字不漏，并且分清大小写：<br /><br />public class HelloWorld{<br />public static void main(String[] args){<br />System.out.println("Hello,World!");<br />}<br />}<br /><br />然后把这个文件保存(ctrl + s)到HelloWorld.java,记住大小写一定要分清，是HelloWorld.java不是helloworld.java或者其它的<br /><br />下面就该运行了，开始-&gt;运行-&gt;cmd<br /><br />在控制台中把目录切换到当前目录：<br /><br />javac HelloWorld.java<br />java HelloWorld<br /><br />你就会在控制台上看见输出的Hello,World!(没出来？我把电脑吃了：）)<br /><br />javac是编译命令，它把HelloWorld.java编译成HelloWorld.class<br /><br />java就是解释命令，JVM把HelloWorld.class解释执行.<br /><br />在这个时候：<br /><br />1。如果出现Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld<br /><br />那就是你在环境变量中没有加上那个.(dot)<br /><br />2。如果出现Exception in thread "main" java.lang.NoSuchMethodError: main<br /><br />或者HelloWorld.java:1: Public class helloworld must be defined in a file called<br /><br />"HelloWorld.java".<br /><br />那就是你没有分清大小写的写入这个HelloWorld，或者保存得时候没有保存为HelloWorld.java<br /><br />这个名字一定要跟public class的名字一样<br /><br />对于环境变量的问题就说到这里，下面我先所说怎么在Editplus里面编译和运行，在Tools－&gt;参数设置-&gt;配置用户工具<br /><br />1.添加工具（添加应用程序）<br /><br />菜单文字：Compile Java Program<br /><br />程序：C:\JDK\bin\javac.exe<br /><br />参数：文件名称<br /><br />初始目录：文件目录<br /><br />2.添加工具（添加应用程序）<br /><br />菜单文字：Run Java Program<br /><br />程序：C:\JDK\bin\java.exe<br /><br />参数：文件名称（不含扩展名）<br /><br />初始目录：文件目录<br /><br />工具组名称可以随便添，比如Debug Java Program<br /><br />然后在Tools的下拉菜单中，你就会看见Compile Java Program以及Run Java Program这两个选项，以后你就可以利用ctrl + 1编译和ctrl ＋2运行程序了<br /><br />下面就讨论Servlet的运行：<br /><br />首先要运行Servlet，则需要JSP/Servlet container，我建议初学者用Tomcat<br /><br />Tomcat（最新版本5.5）：http://apache.justdn.org/jakarta/tomcat-5/v5.5.9/bin/jakarta-tomcat-5.5.9.exe然后把这个压缩包解压到：<br /><br />C:\Tomcat<br /><br />然后再配置环境变量：<br /><br />添加三个系统变量：<br /><br />JAVA_HOME: C:\JDK<br />TOMCAT_HOME: C:\Tomcat<br />CLASSPATH: %JAVA_HOME%\lib;%TOMCAT_HOME%\lib<br /><br />Tomcat的环境变量就配置完毕了，下面检验Tomcat是否能够运行：<br /><br />在控制台中转到C:\Tomcat\bin这个目录，运行startup，然后回出现一个窗口，连跳一大串东西，最后表示Server已经运行<br /><br />在浏览器中输入http://localhost:8080，出现欢迎界面，则表示Tomcat没问题了<br /><br />然后和上面一样，写入你的第一个Servlet<br /><br />import java.io.*;<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br />public class HelloWorld extends HttpServlet<br />{<br />public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException<br />{<br />response.setContentType("text/html");<br />PrintWriter out = response.getWriter();<br />out.println("&lt;html&gt;&lt;head&gt;&lt;title&gt;");<br />out.println("This is my first Servlet");<br />out.println("&lt;/title&gt;&lt;/head&gt;&lt;body&gt;");<br />out.println("&lt;h1&gt;Hello,World!&lt;/h1&gt;");<br />out.println("&lt;/body&gt;&lt;/html&gt;");<br /><br />}<br />}<br /><br />然后照样用javac HelloWorld.java来编译这个文件，如果出现无法import javax.servlet.*<br /><br />那么就是应该把C:\Tomcat\common\lib里面的servlet.jar（根据实际来看）文件拷贝到C:\JDK\jre\lib\ext中，再次编译，就没有问题了！<br /><br />然后在Tomcat目录里面的C:\Tomcat\webapps\ROOT里面按如下的文件结构：<br /><br />ROOT\index.html<br />ROOT\welcom.jsp<br />ROOT\WEB-INF\lib\MyServlet.jar（如果你的servlet的.class打成了.jar文件，则放在lib下面)<br />ROOT\WEB-INF\classes\HelloWorld.class(把上面生成的HelloWorld.class文件放在这个里面)<br /><br />然后在浏览器中输入http://localhost:8080/servlet/HelloWorld,于是Server众望所归的报错了:Error 404--Not Found<br /><br />怎么回事呢？<br /><br />Servlet必须使用C:\Tomcat\webapps\ROOT\WEB-INF这个目录下面的web.xml文件进行注册，用EP打开这个web.xml文件，在里面加入<br /><br />&lt;servlet&gt;<br />&lt;servlet-name&gt;HelloWorld&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;HelloWorld&lt;/servlet-class&gt;<br />&lt;/servlet&gt;<br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt;HelloWorld&lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/servlet/helloworld&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br /><br />这样的结构<br /><br />&lt;servlet&gt;<br />&lt;servlet-name&gt;HelloWorld&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;HelloWorld&lt;/servlet-class&gt;<br />&lt;/servlet&gt;<br /><br />表示指定包含的servlet类.<br />而以下的结构<br /><br />&lt;servlet-mapping&gt;<br />&lt;servlet-name&gt;HelloWorld&lt;/servlet-name&gt;<br />&lt;url-pattern&gt;/servlet/HelloWorld&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br /><br />表示指定HelloServlet应当映射到哪一种URL模式。<br /><br />在修改web.xml完毕过后，重新启动Server，然后再输入http://localhost:8080/servlet/HelloWorld，那么偌大一个Hello,World!等着你呢。 <img src ="http://www.blogjava.net/songfei/aggbug/51286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-06-08 11:04 <a href="http://www.blogjava.net/songfei/articles/51286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC连接MySQL</title><link>http://www.blogjava.net/songfei/articles/42116.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Thu, 20 Apr 2006 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/42116.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/42116.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/42116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/42116.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/42116.html</trackback:ping><description><![CDATA[      
<p></p><p style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: red; mso-outline-level: 1"><span lang="EN-US" style="FONT-FAMILY: Verdana">JDBC</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">连接</span><span lang="EN-US" style="FONT-FAMILY: Verdana">MySQL</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; COLOR: fuchsia; mso-outline-level: 2"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">加载及注册</span><span lang="EN-US" style="FONT-FAMILY: Verdana">JDBC</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">驱动程序</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: Verdana; mso-outline-level: 3">Class.forName("com.mysql.jdbc.Driver");</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: Verdana; mso-outline-level: 3">Class.forName("com.mysql.jdbc.Driver").newInstance();</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; COLOR: fuchsia; mso-outline-level: 2"><span lang="EN-US" style="FONT-FAMILY: Verdana">JDBC URL </span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">定义驱动程序与数据源之间的连接</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 3">标准语法：</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; mso-outline-level: 4"><span lang="EN-US" style="FONT-FAMILY: Verdana">&lt;protocol</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">（主要通讯协议）</span><span lang="EN-US" style="FONT-FAMILY: Verdana">&gt;:&lt;subprotocol</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">（次要通讯协议，即驱动程序名称）</span><span lang="EN-US" style="FONT-FAMILY: Verdana">&gt;:&lt;data source identifier</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">（数据源）</span><span lang="EN-US" style="FONT-FAMILY: Verdana">&gt;</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3"><span lang="EN-US" style="FONT-FAMILY: Verdana">MySQL</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">的</span><span lang="EN-US" style="FONT-FAMILY: Verdana">JDBC</span><span lang="EN-US" style="FONT-FAMILY: SimSun"> URL</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">格式：</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: Verdana; mso-outline-level: 4">jdbc:mysql//[hostname][:port]/[dbname][?param1=value1][&amp;param2=value2]….</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: green; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: green; mso-outline-level: 4"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">示例：</span><span lang="EN-US" style="FONT-FAMILY: Verdana">jdbc:mysql://localhost:3306/sample_db?user=root&amp;password=your_password</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: green; FONT-FAMILY: SimSun; mso-outline-level: 4">常见参数：</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: green; mso-outline-level: 5"><span lang="EN-US" style="FONT-FAMILY: Verdana">user</span><span lang="EN-US" style="FONT-FAMILY: SimSun"><span style="mso-spacerun: yes">                       </span></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">用户名</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: green; mso-outline-level: 5"><span lang="EN-US" style="FONT-FAMILY: Verdana">password</span><span lang="EN-US" style="FONT-FAMILY: SimSun"><span style="mso-spacerun: yes">                  </span></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">密码</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: green; mso-outline-level: 5"><span lang="EN-US" style="FONT-FAMILY: Verdana">autoReconnect<span style="mso-spacerun: yes">                  </span></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">联机失败，是否重新联机（</span><span lang="EN-US" style="FONT-FAMILY: Verdana">true/false</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">）</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: green; mso-outline-level: 5"><span lang="EN-US" style="FONT-FAMILY: Verdana">maxReconnect</span><span lang="EN-US" style="FONT-FAMILY: SimSun"><span style="mso-spacerun: yes">              </span></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">尝试重新联机次数</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: green; mso-outline-level: 5"><span lang="EN-US" style="FONT-FAMILY: Verdana">initialTimeout</span><span lang="EN-US" style="FONT-FAMILY: SimSun"><span style="mso-spacerun: yes">               </span></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">尝试重新联机间隔</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: green; mso-outline-level: 5"><span lang="EN-US" style="FONT-FAMILY: Verdana">maxRows</span><span lang="EN-US" style="FONT-FAMILY: SimSun"><span style="mso-spacerun: yes">                   </span></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">传回最大行数</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: green; mso-outline-level: 5"><span lang="EN-US" style="FONT-FAMILY: Verdana">useUnicode</span><span lang="EN-US" style="FONT-FAMILY: SimSun"><span style="mso-spacerun: yes">                 </span></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">是否使用</span><span lang="EN-US" style="FONT-FAMILY: SimSun">Unicode</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">字体编码（</span><span lang="EN-US" style="FONT-FAMILY: SimSun">true/false</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">）</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: green; mso-outline-level: 5"><span lang="EN-US" style="FONT-FAMILY: Verdana">characterEncoding</span><span lang="EN-US" style="FONT-FAMILY: SimSun"><span style="mso-spacerun: yes">          </span></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">何种编码（</span><span lang="EN-US" style="FONT-FAMILY: SimSun">GB2312/UTF-8/…</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">）</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: green; mso-outline-level: 5"><span lang="EN-US" style="FONT-FAMILY: Verdana">relaxAutocommit</span><span lang="EN-US" style="FONT-FAMILY: SimSun"><span style="mso-spacerun: yes">            </span></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">是否自动提交（</span><span lang="EN-US" style="FONT-FAMILY: SimSun">true/false</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">）</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: green; mso-outline-level: 5"><span lang="EN-US" style="FONT-FAMILY: Verdana">capitalizeTypeNames</span><span lang="EN-US" style="FONT-FAMILY: SimSun"><span style="mso-spacerun: yes">        </span></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">数据定义的名称以大写表示</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; COLOR: fuchsia; FONT-FAMILY: SimSun; mso-outline-level: 2">建立连接对象</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; FONT-FAMILY: Verdana; mso-outline-level: 3">String url="jdbc:mysql://localhost:3306/sample_db?user=root&amp;password=your_password";</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; FONT-FAMILY: Verdana; mso-outline-level: 3">Connection con = DriverManager.getConnection(url);</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; COLOR: fuchsia; mso-outline-level: 2"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">建立</span><span lang="EN-US" style="FONT-FAMILY: Verdana">SQL</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">陈述式对象（</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Statement</span><span lang="EN-US" style="FONT-FAMILY: SimSun"> Object</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">）</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3"><span lang="EN-US" style="FONT-FAMILY: Verdana">Statement</span><span lang="EN-US" style="FONT-FAMILY: SimSun"> stmt = con.createStatement()</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">；</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; COLOR: fuchsia; mso-outline-level: 2"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">执行</span><span lang="EN-US" style="FONT-FAMILY: Verdana">SQL</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">语句</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 3">executeQuery()</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; mso-outline-level: 4"><span style="FONT-FAMILY: Verdana">String</span><span style="FONT-FAMILY: SimSun"> query = "select * from test";</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">ResultSet rs=stmt.executeQuery(query);</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 3"><span lang="ZH-CN">结果集</span><span lang="EN-US">ResultSet</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; mso-outline-level: 4"><span style="FONT-FAMILY: Verdana">while</span><span style="FONT-FAMILY: SimSun">(rs.next())</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">{rs.getString(1);rs.getInt(2);}</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 3">executeUpdate()</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: Verdana; mso-outline-level: 4">String upd="insert into test (id,name) values(1001,xuzhaori)";</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: Verdana; mso-outline-level: 4">int con=stmt.executeUpdate(upd);</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: red; FONT-FAMILY: Verdana; mso-outline-level: 3">execute()</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: green; FONT-FAMILY: SimSun; mso-outline-level: 3">示例：</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">try</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5">{</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5">}</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5">catch(SQLException sqle)</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5">{</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5">}</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5">finally</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5">{</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5">}</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; mso-outline-level: 3"><span lang="EN-US" style="COLOR: green; FONT-FAMILY: Verdana">Java</span><span lang="ZH-CN" style="COLOR: green; FONT-FAMILY: SimSun">类型和</span><span lang="EN-US" style="COLOR: green; FONT-FAMILY: Verdana">SQL</span><span lang="ZH-CN" style="COLOR: green; FONT-FAMILY: SimSun">类型</span><span lang="EN-US" style="COLOR: green; FONT-FAMILY: Verdana"></span><span lang="ZH-CN" style="COLOR: fuchsia; FONT-FAMILY: SimSun">技术手册</span><span lang="EN-US" style="COLOR: fuchsia; FONT-FAMILY: Verdana">P</span><span lang="EN-US" style="COLOR: fuchsia; FONT-FAMILY: SimSun">421</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; COLOR: fuchsia; mso-outline-level: 2"><span lang="EN-US" style="FONT-FAMILY: Verdana">PreparedStatement</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">（预编语句）</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3"><span style="FONT-FAMILY: Verdana">PreparedStatement</span><span style="FONT-FAMILY: SimSun"> stmt = conn.prepareStatement("insert into test(id,name)values(?,?)");</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 3">stmt.setInt(1,id);</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 3">stmt.setString(2,name);</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: green; mso-outline-level: 3"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">注：一旦设定语句的参数值后，就可以多次执行改语句，直到调用</span><span lang="EN-US" style="FONT-FAMILY: Verdana">clearParameters</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">（）方法将他清除为止</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; mso-outline-level: 2"><span lang="EN-US" style="COLOR: fuchsia; FONT-FAMILY: Verdana">CallableStatement</span><span lang="ZH-CN" style="COLOR: fuchsia; FONT-FAMILY: SimSun">（预储程序）</span><span lang="ZH-CN" style="COLOR: green; FONT-FAMILY: SimSun">技术手册</span><span lang="EN-US" style="COLOR: green; FONT-FAMILY: Verdana">P</span><span lang="EN-US" style="COLOR: green; FONT-FAMILY: SimSun">430</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: red; mso-outline-level: 1"><span lang="EN-US" style="FONT-FAMILY: Verdana">JDBC</span><span lang="EN-US" style="FONT-FAMILY: SimSun">2.0</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">使用</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; COLOR: fuchsia; mso-outline-level: 2"><span lang="EN-US" style="FONT-FAMILY: Verdana">ResultSet</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">对象中的光标上下自由移动</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3"><span style="FONT-FAMILY: Verdana">Statement stmt </span><span style="FONT-FAMILY: SimSun">= con.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 3">ResultSet rs=stmt.executeQuery("select * from test");</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: SimSun; mso-outline-level: 3"> </p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: Verdana; mso-outline-level: 3">public Statement createStatement(int resultSetType,int resultSetConcuttency) throws SQLException</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: SimSun; mso-outline-level: 3"> </p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: fuchsia; FONT-FAMILY: Verdana; mso-outline-level: 3">resultSetType</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; mso-outline-level: 4"><span lang="EN-US" style="COLOR: blue; FONT-FAMILY: Verdana">TYPE_FORWARD_ONLY<span style="mso-spacerun: yes">            </span></span><span lang="ZH-CN" style="COLOR: green; FONT-FAMILY: SimSun">只能使用</span><span lang="EN-US" style="COLOR: green; FONT-FAMILY: Verdana">next</span><span lang="ZH-CN" style="COLOR: green; FONT-FAMILY: SimSun">（）方法。</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; mso-outline-level: 4"><span lang="EN-US" style="COLOR: blue; FONT-FAMILY: Verdana">TYPE_SCROLL_SENSITIVE<span style="mso-spacerun: yes">       </span></span><span lang="EN-US" style="COLOR: green; FONT-FAMILY: Verdana"><span style="mso-spacerun: yes"> </span></span><span lang="ZH-CN" style="COLOR: green; FONT-FAMILY: SimSun">可以上下移动，可以取得改变后的值。</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; mso-outline-level: 4"><span lang="EN-US" style="COLOR: blue; FONT-FAMILY: Verdana">TYPE_SCROLL_INSENSITIVE<span style="mso-spacerun: yes">     </span></span><span lang="EN-US" style="COLOR: green; FONT-FAMILY: Verdana"><span style="mso-spacerun: yes"> </span></span><span lang="ZH-CN" style="COLOR: green; FONT-FAMILY: SimSun">可以上下移动。</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: fuchsia; FONT-FAMILY: Verdana; mso-outline-level: 3">resultSetConcuttency</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; mso-outline-level: 4"><span lang="EN-US" style="COLOR: blue; FONT-FAMILY: Verdana">CONCUR_READ_ONLY<span style="mso-spacerun: yes">        </span></span><span lang="ZH-CN" style="COLOR: green; FONT-FAMILY: SimSun">只读</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; mso-outline-level: 4"><span lang="EN-US" style="COLOR: blue; FONT-FAMILY: Verdana">CONCUR_UPDATABLE<span style="mso-spacerun: yes">        </span></span><span lang="EN-US" style="COLOR: green; FONT-FAMILY: Verdana">ResultSet</span><span lang="ZH-CN" style="COLOR: green; FONT-FAMILY: SimSun">对象可以执行数据库的新增、修改、和移除</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; COLOR: fuchsia; mso-outline-level: 2"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">直接使用</span><span lang="EN-US" style="FONT-FAMILY: Verdana">ResultSet</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">对象执行更新数据</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 3">新增数据</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; mso-outline-level: 4"><span lang="EN-US" style="FONT-FAMILY: Verdana">Statement</span><span lang="EN-US" style="FONT-FAMILY: SimSun"> stmt</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">＝</span><span lang="EN-US" style="FONT-FAMILY: SimSun">con.createStatement</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">（</span><span lang="EN-US" style="FONT-FAMILY: SimSun">ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">）</span><span lang="EN-US" style="FONT-FAMILY: SimSun">;</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; mso-outline-level: 4"><span style="FONT-FAMILY: Verdana">Result</span><span style="FONT-FAMILY: SimSun">Set uprs=stmt.executeQuery("select * from test");</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">uprs.moveToInsertRow();</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">uprs.updateInt(1,1001);</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4"><span lang="EN-US">uprs.updateString(2,"</span><span lang="ZH-CN">许召日</span><span lang="EN-US">");</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">uprs.insertRow;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 3">更新数据</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; mso-outline-level: 4"><span lang="EN-US" style="FONT-FAMILY: Verdana">Statement</span><span lang="EN-US" style="FONT-FAMILY: SimSun"> stmt</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">＝</span><span lang="EN-US" style="FONT-FAMILY: SimSun">con.createStatement</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">（</span><span lang="EN-US" style="FONT-FAMILY: SimSun">ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">）</span><span lang="EN-US" style="FONT-FAMILY: SimSun">;</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; mso-outline-level: 4"><span style="FONT-FAMILY: Verdana">Result</span><span style="FONT-FAMILY: SimSun">Set uprs=stmt.executeQuery("select * from test");</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">uprs.last();</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">uprs.updateString("name","xuzhaori");</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">uprs.updateRow;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: red; FONT-FAMILY: SimSun; mso-outline-level: 3">删除数据</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; mso-outline-level: 4"><span lang="EN-US" style="FONT-FAMILY: Verdana">Statement</span><span lang="EN-US" style="FONT-FAMILY: SimSun"> stmt</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">＝</span><span lang="EN-US" style="FONT-FAMILY: SimSun">con.createStatement</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">（</span><span lang="EN-US" style="FONT-FAMILY: SimSun">ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">）</span><span lang="EN-US" style="FONT-FAMILY: SimSun">;</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; mso-outline-level: 4"><span style="FONT-FAMILY: Verdana">Result</span><span style="FONT-FAMILY: SimSun">Set uprs=stmt.executeQuery("select * from test");</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: Verdana; mso-outline-level: 4">uprs.absolute(4);</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: Verdana; mso-outline-level: 4">uprs.deleteRow();</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: SimSun; mso-outline-level: 3"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; COLOR: fuchsia; FONT-FAMILY: SimSun; mso-outline-level: 2">批处理</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3"><span lang="EN-US" style="FONT-FAMILY: Verdana">con.setAutoCommit(false);<span style="mso-spacerun: yes">  </span></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">关闭自动认可模式</span></p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: Verdana; mso-outline-level: 3">Statement stmt=con.createStatement();</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: Verdana; mso-outline-level: 3">int[] rows;</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: Verdana; mso-outline-level: 3">stmt.addBatch("insert into test values(1001,xuzhaori)");</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: Verdana; mso-outline-level: 3">stmt.addBatch("insert into test values(1002,xuyalin)");</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; FONT-FAMILY: Verdana; mso-outline-level: 3">rows=stmt.executeBatch();</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: blue; mso-outline-level: 3"><span lang="EN-US" style="FONT-FAMILY: Verdana">con.commit();<span style="mso-spacerun: yes">  </span></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">没有任何错误，执行批处理</span><span lang="EN-US" style="FONT-FAMILY: Verdana">stmt.executeBatch();</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: SimSun; mso-outline-level: 3"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in; COLOR: red; mso-outline-level: 1"><span lang="EN-US" style="FONT-FAMILY: Verdana">JNDI-</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">数据源（</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Data</span><span lang="EN-US" style="FONT-FAMILY: SimSun"> Source</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">）与连接池（</span><span lang="EN-US" style="FONT-FAMILY: SimSun">Connection Pool</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">）</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; mso-outline-level: 2"><span lang="EN-US" style="COLOR: blue; FONT-FAMILY: Verdana">Tomcat</span><span lang="ZH-CN" style="COLOR: blue; FONT-FAMILY: SimSun">的</span><span lang="EN-US" style="COLOR: blue; FONT-FAMILY: Verdana">JDBC</span><span lang="ZH-CN" style="COLOR: blue; FONT-FAMILY: SimSun">数据源设置</span><span lang="EN-US" style="COLOR: blue; FONT-FAMILY: Verdana"><span style="mso-spacerun: yes">  </span></span><span lang="ZH-CN" style="COLOR: green; FONT-FAMILY: SimSun">技术手册</span><span lang="EN-US" style="COLOR: green; FONT-FAMILY: Verdana">P</span><span lang="EN-US" style="COLOR: green; FONT-FAMILY: SimSun">439</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; mso-outline-level: 2"><span lang="ZH-CN" style="COLOR: blue; FONT-FAMILY: SimSun">连接池工具－</span><span lang="EN-US" style="COLOR: blue; FONT-FAMILY: Verdana">Proxool Var 0.8.3 </span><span lang="ZH-CN" style="COLOR: green; FONT-FAMILY: SimSun">技术手册</span><span lang="EN-US" style="COLOR: green; FONT-FAMILY: Verdana">P</span><span lang="EN-US" style="COLOR: green; FONT-FAMILY: SimSun">446</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: fuchsia; mso-outline-level: 3"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">设置</span><span lang="EN-US" style="FONT-FAMILY: Verdana">web</span><span lang="EN-US" style="FONT-FAMILY: SimSun">.xml</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;!--&lt;?xml version="1.0" encoding="GB2312"?&gt;--&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee"</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5">xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5">xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5">version="2.4"&gt;</p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: Verdana; mso-outline-level: 4">….</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;servlet&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;servlet-name&gt;ServletConfigurator&lt;/servlet-name&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;servlet-class&gt;org.logicalcobwebs.proxool.configuration.ServletConfigurator&lt;/servlet-class&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;init-param&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 5">&lt;param-name&gt;propertyFile&lt;/param-name&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 2in; FONT-FAMILY: SimSun; mso-outline-level: 5"><span style="COLOR: blue">&lt;param-value&gt;</span><span style="COLOR: fuchsia">WEB-INF/classes/Proxool.properties</span><span style="COLOR: blue">&lt;/param-value&gt;</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;/init-param&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;/servlet&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: lime; FONT-FAMILY: SimSun; mso-outline-level: 4">后端统计端口添加下列</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: lime; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;servlet&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: lime; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;servlet-name&gt;Admin&lt;/servlet-name&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: lime; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;servlet-class&gt;org.logicalcobwebs.proxool.admin.servlet.AdminServlet&lt;/servlet-class&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: lime; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;/servlet&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: lime; FONT-FAMILY: SimSun; mso-outline-level: 3"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: lime; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;servlet-mapping&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: lime; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;servlet-name&gt;Admin&lt;/servlet-name&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: lime; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;url-pattern&gt;/Admin&lt;/url-pattern&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: lime; FONT-FAMILY: SimSun; mso-outline-level: 4">&lt;/servlet-mapping&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: Verdana; mso-outline-level: 4">….</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p><p lang="EN-US" style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: Verdana; mso-outline-level: 4">&lt;/web-app&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: fuchsia; mso-outline-level: 3"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">配置</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Proxool</span><span lang="EN-US" style="FONT-FAMILY: SimSun">.properties</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"><span style="COLOR: blue">jdbc-0.proxool.alias=</span><span style="COLOR: fuchsia">JSPBook</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"><span style="COLOR: blue">jdbc-0.proxool.driver-class=</span><span style="COLOR: fuchsia">com.mysql.jdbc.Driver</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"><span style="COLOR: blue">jdbc-0.proxool.driver-url=</span><span style="COLOR: fuchsia">jdbc:mysql://localhost:3306/sample_db?user=root&amp;password=browser&amp;useUnicode=true&amp;characterEncoding=UTF-8</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"><span style="COLOR: blue">jdbc-0.proxool.maximum-connection-count=</span><span style="COLOR: fuchsia">10</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; FONT-FAMILY: SimSun; mso-outline-level: 4"><span style="COLOR: blue">jdbc-0.proxool.prototype-count=</span><span style="COLOR: fuchsia">4</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">jdbc-0.proxool.verbose=true</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; mso-outline-level: 4"><span lang="ZH-CN" style="COLOR: blue; FONT-FAMILY: SimSun">jdbc-0.proxool.statistics=10s,1m,1d</span><span lang="EN-US" style="COLOR: blue; FONT-FAMILY: Verdana"><span style="mso-spacerun: yes">   </span></span><span lang="EN-US" style="COLOR: green; FONT-FAMILY: Verdana"><span style="mso-spacerun: yes"> </span></span><span lang="ZH-CN" style="COLOR: green; FONT-FAMILY: SimSun">后端统计接口添加此行</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; FONT-FAMILY: SimSun; mso-outline-level: 4">jdbc-0.proxool.statistics-log-level=DEBUG</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; COLOR: fuchsia; mso-outline-level: 3"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">使用</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Proxool</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">连接池</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; mso-outline-level: 4"><span lang="ZH-CN" style="COLOR: blue; FONT-FAMILY: SimSun">Connection</span><span lang="EN-US" style="COLOR: blue; FONT-FAMILY: Verdana"></span><span lang="ZH-CN" style="COLOR: blue; FONT-FAMILY: SimSun">con = DriverManager.getConnection("proxool.</span><span lang="ZH-CN" style="COLOR: red; FONT-FAMILY: SimSun">JSPBook</span><span lang="ZH-CN" style="COLOR: blue; FONT-FAMILY: SimSun">");</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: blue; mso-outline-level: 4"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">Statement</span><span lang="EN-US" style="FONT-FAMILY: Verdana"></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: green; FONT-FAMILY: SimSun; mso-outline-level: 4">String query = "SELECT * FROM employee";</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1.5in; COLOR: green; mso-outline-level: 4"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">ResultSet</span><span lang="EN-US" style="FONT-FAMILY: Verdana"></span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">rs = stmt.executeQuery(query);</span></p><img src ="http://www.blogjava.net/songfei/aggbug/42116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-04-20 10:56 <a href="http://www.blogjava.net/songfei/articles/42116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>以前的blog</title><link>http://www.blogjava.net/songfei/articles/36820.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Wed, 22 Mar 2006 04:28:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/36820.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/36820.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/36820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/36820.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/36820.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本类列表																																关于blob在ibatis中的处理																										关于ThreadLocal如何保证数据线程安全																										关于资源下载																										关于企业系统之间交互是a...&nbsp;&nbsp;<a href='http://www.blogjava.net/songfei/articles/36820.html'>阅读全文</a><img src ="http://www.blogjava.net/songfei/aggbug/36820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-03-22 12:28 <a href="http://www.blogjava.net/songfei/articles/36820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jvm装入原理</title><link>http://www.blogjava.net/songfei/articles/36770.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Wed, 22 Mar 2006 01:16:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/36770.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/36770.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/36770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/36770.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/36770.html</trackback:ping><description><![CDATA[
		<h3>jvm装入原理 <a href="http://blog.iyi.cn/rimen/java/#top"><img src="http://blog.iyi.cn/rimen/images/gotop.gif" border="0" /></a></h3>
		<p>操作系统装入jvm是通过jdk中java.exe来完成,通过下面4步来完成jvm环境.<br />1.创建jvm装载环境和配置<br />2.装载jvm.dll<br />3.初始化jvm.dll并挂界到JNIENV(JNI调用接口)实例 <br />4.调用JNIEnv实例装载并处理class类。<br /></p>
		<p>在我们运行和调试java程序的时候,经常会提到一个jvm的概念.jvm是java程序运行的环境,但是他同时一个操作系统的一个应用程序一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间.<br />首先来说一下jdk这个东西,不管你是初学者还是高手,是j2ee程序员还是j2se程序员,jdk总是在帮我们做一些事情.我们在了解java之前首先大师们会给我们提供说jdk这个东西.它在java整个体系中充当着什么角色呢?我很惊叹sun大师们设计天才,能把一个如此完整的体系结构化的如此完美.jdk在这个体系中充当一个生产加工中心,产生所有的数据输出,是所有指令和战略的执行中心.本身它提供了java的完整方案,可以开发目前java能支持的所有应用和系统程序.这里说一个问题,大家会问,那为什么还有j2me,j2ee这些东西,这两个东西目的很简单,分别用来简化各自领域内的开发和构建过程.jdk除了jvm之外,还有一些核心的API,集成API,用户工具,开发技术,开发工具和API等组成<br />好了,废话说了那么多,来点于主题相关的东西吧.jvm在整个jdk中处于最底层,负责于操作系统的交互,用来屏蔽操作系统环境,提供一个完整的java运行环境,因此也就虚拟计算机. 操作系统装入jvm是通过jdk中java.exe来完成,通过下面4步来完成jvm环境.<br />1.创建jvm装载环境和配置<br />2.装载jvm.dll<br />3.初始化jvm.dll并挂界到JNIENV(JNI调用接口)实例 <br />4.调用JNIEnv实例装载并处理class类。<br />一．jvm装入环境，jvm提供的方式是操作系统的动态连接文件．既然是文件那就一个装入路径的问题，java是怎么找这个路径的呢？当你在调用java test的时候，操作系统会在path下在你的java.exe程序，java.exe就通过下面一个过程来确定jvm的路径和相关的参数配置了．下面基于windows的实现的分析．<br />　　首先查找jre路径，java是通过GetApplicationHome api来获得当前的java.exe绝对路径，c:\j2sdk1.4.2_09\bin\java.exe,那么它会截取到绝对路径c:\j2sdk1.4.2_09\，判断c:\j2sdk1.4.2_09\bin\java.dll文件是否存在，如果存在就把c:\j2sdk1.4.2_09\作为jre路径，如果不存在则判断c:\j2sdk1.4.2_09\jre\bin\java.dll是否存在，如果存在这c:\j2sdk1.4.2_09\jre作为jre路径．如果不存在调用GetPublicJREHome查HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\“当前JRE版本号”\JavaHome的路径为jre路径。<br />　　然后装载jvm.cfg文件JRE路径+\lib+\ARCH（CPU构架）+\jvm.cfgARCH（CPU构架）的判断是通过java_md.c中GetArch函数判断的，该函数中windows平台只有两种情况：WIN64的‘ia64’，其他情况都为‘i386’。以我的为例：C:\j2sdk1.4.2_09\jre\lib\i386\jvm.cfg.主要的内容如下：<br />-client KNOWN<br />-server KNOWN<br />-hotspot ALIASED_TO -client<br />-classic WARN<br />-native ERROR<br />-green ERROR<br />在我们的jdk目录中jre\bin\server和jre\bin\client都有jvm.dll文件存在，而java正是通过jvm.cfg配置文件来管理这些不同版本的jvm.dll的．通过文件我们可以定义目前jdk中支持那些jvm,前面部分（client）是jvm名称，后面是参数，KNOWN表示jvm存在，ALIASED_TO表示给别的jvm取一个别名，WARN表示不存在时找一个jvm替代，ERROR表示不存在抛出异常．在运行java XXX是，java.exe会通过CheckJvmType来检查当前的jvm类型，java可以通过两种参数的方式来指定具体的jvm类型，一种按照jvm.cfg文件中的jvm名称指定，第二种方法是直接指定，它们执行的方法分别是“java -J<jvm.cfg中jvm名称>”、“java -XXaltjvm=<jvm类型名称>”或“java -J-XXaltjvm=<jvm类型名称>”。如果是第一种参数传递方式，CheckJvmType函数会取参数‘-J’后面的jvm名称，然后从已知的jvm配置参数中查找如果找到同名的则去掉该jvm名称前的‘-’直接返回该值；而第二种方法，会直接返回“-XXaltjvm=”或“-J-XXaltjvm=”后面的jvm类型名称；如果在运行java时未指定上面两种方法中的任一一种参数，CheckJvmType会取配置文件中第一个配置中的jvm名称，去掉名称前面的‘-’返回该值。CheckJvmType函数的这个返回值会在下面的函数中汇同jre路径组合成jvm.dll的绝对路径。如果没有指定这会使用jvm.cfg中第一个定义的jvm.可以通过set _JAVA_LAUNCHER_DEBUG=1在控制台上测试．<br />最后获得jvm.dll的路径，JRE路径+\bin+\jvm类型字符串+\jvm.dll就是jvm的文件路径了，但是如果在调用java程序时用-XXaltjvm=参数指定的路径path,就直接用path+\jvm.dll文件做为jvm.dll的文件路径．<br />　　二：装载jvm.dll<br />通过第一步已经找到了jvm的路径，java通过LoadJavaVM来装入jvm.dll文件．装入工作很简单就是调用windows API函数：<br />LoadLibrary装载jvm.dll动态连接库．然后把jvm.dll中的导出函数JNI_CreateJavaVM和JNI_GetDefaultJavaVMInitArgs挂接到InvocationFunctions变量的CreateJavaVM和GetDefaultJavaVMInitArgs函数指针变量上。jvm.dll的装载工作宣告完成。<br />　　三：初始化jvm，获得本地调用接口，这样就可以在java中调用jvm的函数了．调用InvocationFunctions－&gt;CreateJavaVM也就是jvm中JNI_CreateJavaVM方法获得JNIEnv结构的实例．<br />　　四：运行java程序．<br />java程序有两种方式一种是jar包，一种是class. 运行jar,java -jar XXX.jar运行的时候，java.exe调用GetMainClassName函数，该函数先获得JNIEnv实例然后调用java类java.util.jar.JarFileJNIEnv中方法getManifest()并从返回的Manifest对象中取getAttributes("Main-Class")的值即jar包中文件：META-INF/MANIFEST.MF指定的Main-Class的主类名作为运行的主类。之后main函数会调用java.c中LoadClass方法装载该主类（使用JNIEnv实例的FindClass）。main函数直接调用java.c中LoadClass方法装载该类。如果是执行class方法。main函数直接调用java.c中LoadClass方法装载该类。</jvm类型名称></jvm类型名称></jvm.cfg中jvm名称></p>
		<p>然后main函数调用JNIEnv实例的GetStaticMethodID方法查找装载的class主类中<br />“public static void main(String[] args)”方法，并判断该方法是否为public方法，然后调用JNIEnv实例的<br />CallStaticVoidMethod方法调用该java类的main方法</p>
<img src ="http://www.blogjava.net/songfei/aggbug/36770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-03-22 09:16 <a href="http://www.blogjava.net/songfei/articles/36770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多重提交处理(二) </title><link>http://www.blogjava.net/songfei/articles/36410.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Mon, 20 Mar 2006 11:31:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/36410.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/36410.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/36410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/36410.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/36410.html</trackback:ping><description><![CDATA[
		<dt>
				<span id="LblTitle">多重提交处理(二)</span>
		</dt>
		<dd class="ArticleInfo">作者： <a id="HyperAuthor" href="http://kb.csdn.net/ArticleAuthor.aspx?author=fpwang">fpwang</a>∣来源：<a id="HyFromWhere" href="http://www.matrix.org.cn/article.shtml" target="_blank">Matrix</a>∣<a id="HyHistoryUrl" title="http://www.matrix.org.cn/resource/article/489.html" href="http://www.matrix.org.cn/resource/article/489.html" target="_blank">原文地址</a>∣<span id="LblUpdateDate">2003-9-11</span></dd>
		<dd class="ArticleContent">
				<div class="HideDiv" style="OVERFLOW: hidden; WIDTH: 100%">
						<span id="LblContent">表2当然是一种改善，但我们还是需要一些其他方法。仍然有许多情况会导 致错误。如果用户按下了浏览器的后退键或者刷新了整个网页会怎么样？如果用户的浏览器关闭了JavaScript的功能或者浏览器不能处理会如何呢？我们还是可以处理这个问题的，但是为了取代防止多重提交，我们需要在后端通过表单处理的服务端小程序处理它们。<br /><br />　　为了理解如何解决多重提交问题，我们必须首先理解服务端小程序会话(sessions)机制。每个人都知道，HTTP协议的固有性质中并不对状态（客户端请求信息的历史记录）进行记录。为了处理状态，我们需要一些方法使浏览器能够将当前请求与其他大量请求联系起来。会话(session)程序提供给我们一个解决这个问题的方案。HttpServlet中的方法doGet()和doPost()使用了两个指定的参数：HttpServletRequest和HttpServletResponse。服务端小程序请求参数使我们能够访问会话(session)。会话为访问和存储状态提供了机制。<br /><br />　　什么才是会话(session)呢？会话(session)包括很多内容：<br />状态集——由web服务器管理并且由特定用户所有请求所共享的详细表示描述。<br />存储空间——通过HttpSession接口至少将HttpServlets所需状态数据和定义存储起来。<br /><br />　　在我们具体了解如何使用服务器端方案解决我们的问题之前，我们还需要了解服务端小程序会话(session)的生命周期。与EJB及其他服务端实体一样，会话在生存期中通过一个定义的状态集运行。下图显示了会话的生命周期。Servlet可在三种特定的状态中转换：不存在(does not exist)，新建(new)，非新建(not new/或使用中in-use)。<br /><br />图3：服务端小程序会话(session)生命周期<br /><img style="DISPLAY: inline" alt="image" src="http://www.matrix.org.cn/resource/article/upload/article/a2003911154036.jpg" border="0" /><br /><br />a)　会话在开始时处于不存在状态。会话从这一状态开始或者由于许多原因而返回到此状态。最主要的原因就是用户以前没有访问过这些状态或者是由于用户脱离（超时）站点或退出使会话被设置为无效。<br />b)　当会话被建立时便会从“不存在”状态进入“新建”状态。新建与非新建状态的区分是非常重要的，因为HTTP协议不记录状态信息。根据servlet详细说明书描述，在客户端返回会话给服务端之前会话不能够进入非新建状态（即从预期会话转变为当前会话）。这样在客户端不知道或者还没有决定加入会话时会话处于新建状态。<br />c)　当会话通过cookie或是重写URL()返回到服务器时，会话就变为“使用中”或“非新建”状态。<br />d)　通过各种get与set方法继续使用会话会使其维持在“使用中”状态。<br />e)　当会话由于长时间没有被使用而超时或显式的被设为无效则会发生图中所示的5以及6所标识的转移。不同应用服务器用不同方式处理超时。BEA公司的WebLogic使应用部署者能够通过与web应用一起打包的特殊部署描述脚本(weblogic.xml)设置会话超时的时限。<br /><br />　　现在我们了解了会话的生命周期，那么如何获得一个会话并有效的使用它呢？接口HttpServletRequest提供了两个关于会话的方法：<br /><br />public HttpSession getSession()返回一个新的会话或一个已存在的会话。<br /><br />　　如果提供一个有效的会话ID（可能是通过cookie）则返回一个存在的会话。返回新的会话可能会有许多原因：用户最初的会话（无法提供有效会话ID）；会话超过有效时间（提供了会话ID）；一个无效的会话（提供了会话ID）；或者是明确指出会话无效（提供了会话ID）。<br /><br />　　public HttpSession getSession(boolean)可能返回新会话、存在的会话或者空。getSession(true)尽可能返回一个存在的会话。否则创建一个新会话。getSession(false) 尽可能返回一个存在的会话否则返回空。<br /><br />　　我们还是只解决了手边一半的问题。我们希望能够跳过会话“新建”状态并自动的转换到会话“使用中”状态。我们能够通过重定向浏览器到处理服务端小程序自动的实现这些。表3把服务端小程序会话逻辑和重定向用户端与有效会话到处理服务端小程序的能力结合在一起。<br /><br />表3：RedirectServlet.java<br />01: package multiplesubmits;<br />02:<br />03: import java.io.*;<br />04: import java.util.Date;<br />05: import javax.servlet.*;<br />06: import javax.servlet.http.*;<br />07:<br />08: public class RedirectServlet extends HttpServlet{<br />09: public void doGet (HttpServletRequest req, HttpServletResponse res)<br />10: throws ServletException, IOException {<br />11: HttpSession session = req.getSession(false);<br />12: System.out.println("");<br />13: System.out.println("-------------------------------------");<br />14: System.out.println("SessionServlet::doGet");<br />15: System.out.println("Session requested ID in Request:" +<br />16: req.getRequestedSessionId());<br />17: if ( null == req.getRequestedSessionId() ) {<br />18: System.out.println("No session ID, first call,<br />creating new session and forwarding");<br />19: session = req.getSession(true);<br />20: System.out.println("Generated session ID in Request: " +<br />21: session.getId());<br />22: String encodedURL = res.encodeURL("/RedirectServlet");<br />23: System.out.println("res.encodeURL(\"/RedirectServlet\");="<br />+encodedURL);<br />24: res.sendRedirect(encodedURL);<br />25: //<br /><br />26: // RequestDispatcher rd = getServletContext().getRequestDispatcher(encodedURL);<br />27: // rd.forward(req,res);<br /><br />28: //<br />29: return;<br />30: }<br />31: else {<br />32: System.out.println("Session id = " +<br />req.getRequestedSessionId() );<br />33: System.out.println("No redirect required");<br />34: }<br />35:<br />36: HandleRequest(req,res);<br />37: System.out.println("SessionServlet::doGet returning");<br />38: System.out.println("------------------------------------");<br />39: return;<br />40: }<br />41:<br />42: void HandleRequest(HttpServletRequest req, HttpServletResponse res)<br />43: throws IOException {<br />44: System.out.println("SessionServlet::HandleRequest called");<br />45: res.setContentType("text/html");<br />46: PrintWriter out = res.getWriter();<br />47: Date date = new Date();<br />48: out.println("&lt;html&gt;");<br />49: out.println("&lt;head&gt;&lt;title&gt;Ticket Confirmation&lt;/title&gt;&lt;/head&gt;");<br />50: out.println("&lt;body&gt;");<br />51: out.println("&lt;h1&gt;The Current Date And Time Is:&lt;/h1&gt;&lt;br&gt;");<br />52: out.println("&lt;h3&gt;" + date.toString() + "&lt;/h3&gt;");<br />53: out.println("&lt;/body&gt;");<br />54: out.println("&lt;/html&gt;");<br />55: System.out.println("SessionServlet::HandleRequest returning");<br />56: return;<br />57: }<br />58: }<br /><br />　　这如何解决我们的问题的呢？测试上面这段代码显示出在11行我们尝试获得一个会话的句柄。在17行我们通过检测为空的会话ID或检测有效会话ID来确定存在一个有效的会话。如果不存在会话就执行18-29行程序。通过下述方法我们处理多重提交的问题，在19行首先建立一个会话，在22行使用URL编码添加新会话ID，并且在24行重定向我们的服务端小程序到新的URL编码。<br /><br />　　不熟悉重写URL的读者可参考15行到23行。一个HttpServlet对象可以重写URL。这个过程将一个会话ID插入到URL。底层的应用服务器能够自动的用编码URL提供给服务端小程序或JSP一个存在的会话。由于这依赖于应用服务器，为了使上面的例子可以运行，你可能需要设置环境使URL能够重写！<br /><br /><br /><b>总结</b><br /><br />　　在这篇文章中，我们讨论了多重提交问题的许多解决方案。每一个方案都有优点和缺陷。在处理问题时，要清晰的理解和权衡解决方案多方面的优点和缺陷。我们最后的例子有利于解决客户端额外重复的访问和浏览的问题。JavaScript脚本的方法是最好的，但是需要客户端支持才能够运行。和其他任何问题一样，会有一大堆解决方案，每个方案都会有其自己的优缺点。掌握每个方案的优缺点，有利于我们为解决问题作出最好的选择。<br /><br /><br /><a href="http://www.matrix.org.cn/" target="_new">matrix开源技术</a>经<a href="http://www.onjava.com/" target="_new">onjava</a>授权翻译并发布.<br />如果你对此文章有任何看法或建议,请到<a href="http://www.matrix.org.cn/forum.asp" target="_new">Matrix论坛</a>发表您的意见.<br />注明: 如果对matrix的翻译文章系列感兴趣,请点击<a href="http://www.matrix.org.cn/forum_view.asp?forum_id=1&amp;view_id=655" target="_new">oreilly和javaworld文章翻译计划</a>查看详细情况<br />您也可以点击-<a href="http://www.matrix.org.cn/user_view.asp?username=fpwang" target="_new">fpwang</a>查看翻译作者的详细信息<br /></span>
				</div>
		</dd>
<img src ="http://www.blogjava.net/songfei/aggbug/36410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-03-20 19:31 <a href="http://www.blogjava.net/songfei/articles/36410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>新关键字</title><link>http://www.blogjava.net/songfei/articles/36334.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Mon, 20 Mar 2006 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/36334.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/36334.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/36334.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/36334.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/36334.html</trackback:ping><description><![CDATA[return contentType.toLowerCase().startsWith("multipart/form-data");<br />if (argHttpServletRequest instanceof OmHttpServletRequest) {<img src ="http://www.blogjava.net/songfei/aggbug/36334.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-03-20 15:33 <a href="http://www.blogjava.net/songfei/articles/36334.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java容器与框架的区别</title><link>http://www.blogjava.net/songfei/articles/36303.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Mon, 20 Mar 2006 05:19:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/36303.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/36303.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/36303.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/36303.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/36303.html</trackback:ping><description><![CDATA[
		<p>待研究</p>
<img src ="http://www.blogjava.net/songfei/aggbug/36303.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-03-20 13:19 <a href="http://www.blogjava.net/songfei/articles/36303.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>System.currentTimeMillis()</title><link>http://www.blogjava.net/songfei/articles/36301.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Mon, 20 Mar 2006 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/36301.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/36301.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/36301.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/36301.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/36301.html</trackback:ping><description><![CDATA[那么谁来负责计算呢？首先System.currentTimeMillis()产生一个当前的毫秒，这个毫秒其实就是自1970年1月1日0时起的毫秒数，Date()其实就是相当于Date(System.currentTimeMillis());因为Date类还有构造Date(long date)，用来计算long秒与1970年1月1日之间的毫秒差。<br />      得到了这个毫秒数，我们自己也可以算起现在的年月日周时，但是这不是我们去计算的，因为有Calendar。Calendar最终出的结果就是年月日周时时区。<br /><img src ="http://www.blogjava.net/songfei/aggbug/36301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-03-20 13:14 <a href="http://www.blogjava.net/songfei/articles/36301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Config参数和Context参数的访问</title><link>http://www.blogjava.net/songfei/articles/36295.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Mon, 20 Mar 2006 05:05:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/36295.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/36295.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/36295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/36295.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/36295.html</trackback:ping><description><![CDATA[
		<div class="ContentFont" id="NewaspContentLabel" style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">
				<div>关于Config参数和Context参数的访问<br /><br />虽然在论坛中已经回答过不止一次,但现在看来,真正掌握这两个参数的区别的人5%都不到.<br />所以有必要专门写出来,供大家学习.<br /><br />我们先来回顾一下各种内置对象的作用范围<br /><br />HttpServletRequest,HttpServletResponse:这两个属性的作用范围最小。<br />时间上：只是本身请求和应答完成就失效，当然转发是把当前的request对象取出来传给另一<br />      个资源，其实本身的request对象还是只生存到本次请求结束，response也同样。<br />空间上：只能发送请求的客户端有效。<br /><br />HttpSession:一次连结到客户端关闭，时间作用范围比上面两个大，空间任用范围相同。<br /><br />ServletConfig:从一个servlet被实例化后，对任何客户端在任何时候访问有效，但仅对本servlet<br />有效，一个servlet的ServletConfig对象不能被另一个servlet访问。<br /><br />ServletContext:对任何servlet，任何人在任何时间都有效，这才是真正全局的对象。<br /><br />那么，ServletConfig参数和ServletContext参数到底应该如何使用，如何取得？<br /><br />一般来说，对整个应用的配置，为了不使用“硬编码”，应该配置为ServletContext参数，比如字<br />符集设定。<br />&lt;web-app&gt;<br />.................<br />&lt;init-param&gt;<br />&lt;param-name&gt;charset&lt;/param-name&gt; <br />&lt;param-value&gt;GB2312&lt;/param-value&gt; <br />&lt;/init-param&gt;<br />.................<br />&lt;/web-app&gt;<br />注意以上格式只是2。0以后的标准格式，旧容器（引擎）采用服务商自己的格式配置。注意它的<br />父元素应该是&lt;web-app&gt;也就是说它是对一个应用作用的。<br /><br />而如果只有一个特定的servlet要设定的参数，其它servlet不能共享，应该配置为ServletConfig<br />参数，如一个读取附件的servlet要用到绝对目录，而别的servlet不会用到：<br />&lt;servlet&gt;<br />        &lt;servlet-name&gt;GetAtt&lt;/servlet-name&gt;<br />&lt;servlet-class&gt;mail.GetAttServlet&lt;/servlet-class&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;absPath&lt;/param-name&gt; <br />&lt;param-value&gt;/usr/mail/ax/axman/Maildir/&lt;/param-value&gt; <br />&lt;/init-param&gt;<br />&lt;/servlet&gt;<br />不用说，因为在&lt;servlet&gt;标签中已经指定了name和class,也就是说只有mail.GetAttServlet这个<br />servlet中才能取到path,而别的Servlet是不能取到的。<br /><br />那么如何访问这两个对象的参数呢？<br />访问ServletConfig参数：<br />首先要取得ServletConfig对象，然后调用它的getInitParameter();方法。要访问<br />ServletConfig对象，jsp中直接使用config内置对象，但因为你的JSP编译后的servlet一般不会被<br />加到web.xml中的，所以一般不会通过jsp来取对本JSP编译后的servlet的配置参数，那么在servlet<br />中要得到ServletConfig对象有两种方法：<br /><br />在inii()方法中取到：通过init的重载方法传递<br /><br />.....<br />public class Test extends HttpServlet <br />{<br />ServletConfig config;<br />public void init(ServletConfig config) throws ServletException {<br />this.config = config;<br />}<br />..................<br />}<br />然后在下面的方法中就可以访问config对象。但要注意，为了确保能从构造方法中到到当前servlet的<br />config对象，应该调用父类的构造方法：<br />.....<br />public class Test extends HttpServlet <br />{<br />ServletConfig config;<br />public void init(ServletConfig config) throws ServletException {<br />super.init(config);<br />this.config = config;<br />}<br />..................<br />}<br /><br />通过getServletConfig()方法直接到时，这样做的好处是不必调手工传递属性，想在任何时候都可<br />以得到。<br /><br />还有第三种方法，要自己实现一些接口，这里作为一般讨论就不介绍了。<br /><br />要访问ServletContext对象，只要从现有的ServletConfig对象getServletContext（）就可以了，然后<br />调用它的getInitParameter()方法就可以获取它的参数。<br /><br />按说：ServletContext对象的作用域比ServletConfig作用域大，为什么要从ServletConfig中到得<br />ServletContext对象呢？我个人认为：容器保存了很多个ServletContext对象，请求时容器到底取哪一个<br />给你呢？那就取其中包含ServletConfig信息的那个给你，就是说取ServletConfig对象的父级对象。就好<br />象HttpSession要从requset中取得一样，就是取那个包含当前requese对象的session对象给你，这只是我<br />的个人想法，还没有来得及看具体实现。反正就这么用吧。</div>
		</div>
<img src ="http://www.blogjava.net/songfei/aggbug/36295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-03-20 13:05 <a href="http://www.blogjava.net/songfei/articles/36295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中的日期加一个月的计算</title><link>http://www.blogjava.net/songfei/articles/31961.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Wed, 22 Feb 2006 06:35:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/31961.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/31961.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/31961.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/31961.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/31961.html</trackback:ping><description><![CDATA[//請求処理に1ヶ月加算した結果(次回請求予定)を画面表示<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd", Locale.US);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date date = simpleDateFormat.parse(selectQuery.getString("SIMEYMD"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Calendar calender = Calendar.getInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; calender.setTime(date);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; calender.add(Calendar.MONTH, 1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; simpleDateFormat.format(calender.getTime());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; argConditionData.setSimeymd(simpleDateFormat.format(calender.getTime()).toString());<img src ="http://www.blogjava.net/songfei/aggbug/31961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-02-22 14:35 <a href="http://www.blogjava.net/songfei/articles/31961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> java中在链接中提取一些信息</title><link>http://www.blogjava.net/songfei/articles/29043.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Mon, 23 Jan 2006 12:03:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/29043.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/29043.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/29043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/29043.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/29043.html</trackback:ping><description><![CDATA[在编写JSP/Servlet应用时常常需要从传入的链接中提取一些信息。HttpServletRequest提供了多个方法，这些方法之间容易混淆。总结并举例如下，希望能对大家有所帮助。 <BR>举例：<BR><A href="http://localhost:7001/myservlet/somepath/test?someparam=somevalue">http://localhost:7001/myservlet/somepath/test?someparam=somevalue</A> <BR>request.getPathInfo()：返回/somepath/test <BR>request.getRequestURL()：返回<A href="http://localhost:7001/myservlet/somepath/test">http://localhost:7001/myservlet/somepath/test</A> <BR>request.getRequestURI()：返回/myservlet/somepath/test <BR>request.getServletPath()：返回/myservlet <BR>request.getQueryString()：返回someparam=somevalue <BR><img src ="http://www.blogjava.net/songfei/aggbug/29043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-01-23 20:03 <a href="http://www.blogjava.net/songfei/articles/29043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置MyEclipse的WebLogic服务器 </title><link>http://www.blogjava.net/songfei/articles/28867.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Sat, 21 Jan 2006 04:31:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/28867.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/28867.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/28867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/28867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/28867.html</trackback:ping><description><![CDATA[<DIV><FONT size=2>配置<SPAN style="COLOR: #ffa34f"><B>MyEclipse</B></SPAN>的WebLogic服务器 <BR><SPAN style="COLOR: #ffa34f"><B>MyEclipse</B></SPAN>默认的应用服务器为JBoss3，这里我们使用WebLogic8.1。启动Eclipse，选择“窗口\首选项”菜单，打开首选项对话框。展开<SPAN style="COLOR: #ffa34f"><B>MyEclipse</B></SPAN>下的Application Servers结点，点击JBoss 3，选中右面的Disable单选按钮，停用JBoss 3。然后点击WebLogic 8，选中右边的Enable单选按钮，启用WebLogic服务器。同时下面的配置如下： <BR>(1)BEA home directory：D:\BEA。假定WebLogic安装在D:\BEA文件夹中。 <BR>(2)WebLogic installation directory：D:\BEA\weblogic81。 <BR>(3)Admin username：user。 <BR>(4)Admin password：12345678。 <BR>(5)Execution domain root：D:\BEA\user_projects\dev。 <BR>(6)Execution domain name：dev。 <BR>(7)Execution server name：admin。 <BR>(8)Hostname:PortNumber：localhost:7001。 <BR>(9)Security policy file：D:\BEA\weblogic81\server\lib\weblogic.policy。 <BR>(10)JAAS login configuration file：省略。 <BR>接着展开WebLogic 8结点，点击JDK，在右边的WLS JDK name处选择WebLogic 8的默认JDK。这里组合框中缺省为j2re1.4.2_03，即之前单独安装的jre。单击Add按钮，弹出WebLogic &gt; Add JVM对话框，在JRE名称处随便输入一个名字，如jre1.4.1_02。然后在JRE主目录处选择WebLogic安装文件夹中的JDK文件夹，如D:\BEA\jdk141_02，程序会自动填充Javadoc URL文本框和JRE系统库列表框。单击确定按钮关闭对话框。这时候就可以在WLS JDK name组合框中选择jre1.4.1_02了。之后还要在下面的Optional Java VM arguments，如-ms64m -mx64m -Djava.library.path="D:/BEA/weblogic81/server/bin" -Dweblogic.management.discover=false -Dweblogic.ProductionModeEnabled=false <BR>最后点击Paths，在右边的Prepend to classpath列表框中，通过Add JAR/ZIP按钮，加入D:\BEA\weblogic81\server\lib\weblogic.jar、D:\BEA\weblogic81\server\lib\webservices.jar。如果用到数据库，还需把数据库的驱动类库加进来，这里我们用WebLogic自带的SQL Server数据库驱动库D:\BEA\weblogic81\server\lib\mssqlserver4v65.jar。 <BR>至此，<SPAN style="COLOR: #ffa34f"><B>MyEclipse</B></SPAN>中WebLogic8的配置工作就算完成了。下面可以看看在Eclipse中能否启动WebLogic了？自从安装了<SPAN style="COLOR: #ffa34f"><B>MyEclipse</B></SPAN>之后，Eclipse工具栏中就会有一个Run/Stop Servers下拉按钮。点击该按钮的下拉部分，选择“WebLogic 8\Start”菜单，即开始启动WebLogic了。通过查看下面的控制台消息，就可以知道启动是否成功，或有什么异常发生。停止WebLogic可选择“WebLogic\Stop”菜单。</FONT></DIV><BR><img src ="http://www.blogjava.net/songfei/aggbug/28867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-01-21 12:31 <a href="http://www.blogjava.net/songfei/articles/28867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP取得在WEB.XML中定义的参数 </title><link>http://www.blogjava.net/songfei/articles/28687.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Thu, 19 Jan 2006 10:34:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/28687.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/28687.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/28687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/28687.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/28687.html</trackback:ping><description><![CDATA[<BR>
<TABLE cellSpacing=0 cellPadding=0 width="95%" border=0>
<TBODY>
<TR>
<TD align=middle width="100%"><FONT size=3><B>JSP取得在WEB.XML中定义的参数</B></FONT> </TD></TR>
<TR>
<TD class=text9pt align=middle width="100%">
<HR width="50%" noShade SIZE=1>
</TD></TR>
<TR>
<TD align=right width="100%" height=10></TD></TR>
<TR>
<TD width="100%">
<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD class=text9pt>
<TABLE align=right border=0>
<TBODY>
<TR>
<TD width="100%" height=10>
<SCRIPT language=javascript src="http://usms.tom.com/wlqy_flash.js?tomuserid=9247"></SCRIPT>
</TD></TR></TBODY></TABLE>
<P>在WEB.XML文件中设置参数: <BR>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; <BR>&lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "<A href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</A>"&gt; <BR>&lt;web-app&gt; </P><BR>
<P>&lt;servlet&gt; <BR>&lt;servlet-name&gt; myjsp &lt;/servlet-name&gt; <BR>&lt;jsp-file&gt; /MyJsp.jsp &lt;/jsp-file&gt; <BR>&lt;init-param&gt; <BR>&lt;param-name&gt;firstparam&lt;/param-name&gt; <BR>&lt;param-value&gt;firstparamvalue&lt;/param-value&gt; <BR>&lt;/init-param&gt; <BR>&lt;/servlet&gt; </P><BR>
<P>&lt;servlet-mapping&gt; <BR>&lt;servlet-name&gt; myjsp &lt;/servlet-name&gt; <BR>&lt;url-pattern&gt; /myurl/* &lt;/url-pattern&gt; <BR>&lt;/servlet-mapping&gt; </P><BR>
<P>&lt;/web-app&gt; </P><BR>
<P>下面的程序无法取出在WEB.XML中定义的参数firstparam的值firstparamvalue <BR>&lt;html&gt; <BR>&lt;HEAD&gt;&lt;TITLE&gt;my jsp page .jsp&lt;/TITLE&gt;&lt;/HEAD&gt; <BR>My init parameter is &lt;%= application.getInitParameter("firstparam") %&gt; <BR>&lt;/html&gt; </P><BR>
<P>下面的程序就可以取出在WEB.XML中定义的参数firstparam的值firstparamvalue <BR>&lt;% <BR>String Str1; <BR>Str1=config.getInitParameter("firstparam"); <BR>Out.println(Str1); <BR>%&gt; </P><BR>
<P>因为config是类javax.servlet.ServletConfig的对象,而application 是类 javax.servlet.ServletContext的对象. <BR>如果指定WebLogic SERVER的侦听端口为80，那么在IE中就不用输入端口 <BR><A href="http://hostname/myfile.html">http://hostname/myfile.html</A>取代<A href="http://hostname:portnumber/myfile.html">http://hostname:portnumber/myfile.html</A>.</P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/songfei/aggbug/28687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-01-19 18:34 <a href="http://www.blogjava.net/songfei/articles/28687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP请求头概述 </title><link>http://www.blogjava.net/songfei/articles/28686.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Thu, 19 Jan 2006 10:32:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/28686.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/28686.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/28686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/28686.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/28686.html</trackback:ping><description><![CDATA[<TABLE width="90%" align=center border=0>
<TBODY>
<TR>
<TD class=text9pt>
<TABLE align=right border=0>
<TBODY>
<TR>
<TD width="100%" height=10>
<SCRIPT language=javascript src="http://usms.tom.com/wlqy_flash.js?tomuserid=9247"></SCRIPT>
</TD></TR></TBODY></TABLE>4.1 HTTP请求头概述 <BR>&nbsp;&nbsp; <BR>&nbsp; 　　 HTTP客户程序（例如浏览器），向服务器发送请求的时候必须指明请求类型（一般是GET或者POST）。如有必要，客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的，但Content-Length除外。对于POST请求来说Content-Length必须出现。&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 下面是一些最常见的请求头：&nbsp;&nbsp;&nbsp; <BR>&nbsp; Accept：浏览器可接受的MIME类型。 <BR>&nbsp; Accept-Charset：浏览器可接受的字符集。 <BR>&nbsp; Accept-Encoding：浏览器能够进行解码的数据编码方式，比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。 <BR>&nbsp; Accept-Language：浏览器所希望的语言种类，当服务器能够提供一种以上的语言版本时要用到。 <BR>&nbsp; Authorization：授权信息，通常出现在对服务器发送的WWW-Authenticate头的应答中。 <BR>&nbsp; Connection：表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”，或者看到请求使用的是HTTP 1.1（HTTP 1.1默认进行持久连接），它就可以利用持久连接的优点，当页面包含多个元素时（例如Applet，图片），显著地减少下载所需要的时间。要实现这一点，Servlet需要在应答中发送一个Content-Length头，最简单的实现方法是：先把内容写入ByteArrayOutputStream，然后在正式写出内容之前计算它的大小。 <BR>&nbsp; Content-Length：表示请求消息正文的长度。 <BR>&nbsp; Cookie：这是最重要的请求头信息之一，参见后面《Cookie处理》一章中的讨论。 <BR>&nbsp; From：请求发送者的email地址，由一些特殊的Web客户程序使用，浏览器不会用到它。 <BR>&nbsp; Host：初始URL中的主机和端口。 <BR>&nbsp; If-Modified-Since：只有当所请求的内容在指定的日期之后又经过修改才返回它，否则返回304“Not Modified”应答。 <BR>&nbsp; Pragma：指定“no-cache”值表示服务器必须返回一个刷新后的文档，即使它是代理服务器而且已经有了页面的本地拷贝。 <BR>&nbsp; Referer：包含一个URL，用户从该URL代表的页面出发访问当前请求的页面。 <BR>&nbsp; User-Agent：浏览器类型，如果Servlet返回的内容与浏览器类型有关则该值非常有用。 <BR>&nbsp; UA-Pixels，UA-Color，UA-OS，UA-CPU：由某些版本的IE浏览器所发送的非标准的请求头，表示屏幕大小、颜色深度、操作系统和CPU类型。 <BR>&nbsp; 　　 有关HTTP头完整、详细的说明，请参见<A href="http://www.w3.org/Protocols/">http://www.w3.org/Protocols/</A> 的HTTP规范。&nbsp;&nbsp;&nbsp; <BR>4.2 在Servlet中读取请求头&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 在Servlet中读取HTTP头是非常方便的，只需要调用一下HttpServletRequest的getHeader方法即可。如果客户请求中提供了指定的头信息，getHeader返回对应的字符串；否则，返回null。部分头信息经常要用到，它们有专用的访问方法：getCookies方法返回Cookie头的内容，经解析后存放在Cookie对象的数组中，请参见后面有关Cookie章节的讨论；getAuthType和getRemoteUser方法分别读取Authorization头中的一部分内容；getDateHeader和getIntHeader方法读取指定的头，然后返回日期值或整数值。&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 除了读取指定的头之外，利用getHeaderNames还可以得到请求中所有头名字的一个Enumeration对象。&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 最后，除了查看请求头信息之外，我们还可以从请求主命令行获得一些信息。getMethod方法返回请求方法，请求方法通常是GET或者POST，但也有可能是HEAD、PUT或者DELETE。getRequestURI方法返回URI（URI是URL的从主机和端口之后到表单数据之前的那一部分）。getRequestProtocol返回请求命令的第三部分，一般是“HTTP/1.0”或者“HTTP/1.1”。&nbsp;&nbsp;&nbsp; <BR>4.3 实例：输出所有的请求头&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 下面的Servlet实例把所有接收到的请求头和它的值以表格的形式输出。另外，该Servlet还会输出主请求命令的三个部分：请求方法，URI，协议/版本。&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 ShowRequestHeaders.java <BR>&nbsp; package hall; <BR>&nbsp;&nbsp; <BR>&nbsp; import java.io.*; <BR>&nbsp; import javax.servlet.*; <BR>&nbsp; import javax.servlet.http.*; <BR>&nbsp; import java.util.*; <BR>&nbsp;&nbsp; <BR>&nbsp; public class ShowRequestHeaders extends HttpServlet { <BR>&nbsp;&nbsp; public void doGet(HttpServletRequest request, <BR>&nbsp;&nbsp; HttpServletResponse response) <BR>&nbsp;&nbsp; throws ServletException, IOException { <BR>&nbsp;&nbsp; response.setContentType("text/html"); <BR>&nbsp;&nbsp; PrintWriter out = response.getWriter(); <BR>&nbsp;&nbsp; String title = "显示所有请求头"; <BR>&nbsp;&nbsp; out.println(ServletUtilities.headWithTitle(title) + <BR>&nbsp;&nbsp; "＜BODY BGCOLOR=＼"#FDF5E6＼"＞＼n" + <BR>&nbsp;&nbsp; "＜H1 ALIGN=CENTER＞" + title + "＜/H1＞＼n" + <BR>&nbsp;&nbsp; "＜B＞Request Method: ＜/B＞" + <BR>&nbsp;&nbsp; request.getMethod() + "＜BR＞＼n" + <BR>&nbsp;&nbsp; "＜B＞Request URI: ＜/B＞" + <BR>&nbsp;&nbsp; request.getRequestURI() + "＜BR＞＼n" + <BR>&nbsp;&nbsp; "＜B＞Request Protocol: ＜/B＞" + <BR>&nbsp;&nbsp; request.getProtocol() + "＜BR＞＜BR＞＼n" + <BR>&nbsp;&nbsp; "＜TABLE BORDER=1 ALIGN=CENTER＞＼n" + <BR>&nbsp;&nbsp; "＜TR BGCOLOR=＼"#FFAD00＼"＞＼n" + <BR>&nbsp;&nbsp; "＜TH＞Header Name＜TH＞Header Value"); <BR>&nbsp;&nbsp; Enumeration headerNames = request.getHeaderNames(); <BR>&nbsp;&nbsp; while(headerNames.hasMoreElements()) { <BR>&nbsp;&nbsp; String headerName = (String)headerNames.nextElement(); <BR>&nbsp;&nbsp; out.println("＜TR＞＜TD＞" + headerName); <BR>&nbsp;&nbsp; out.println(" ＜TD＞" + request.getHeader(headerName)); <BR>&nbsp;&nbsp; } <BR>&nbsp;&nbsp; out.println("＜/TABLE＞＼n＜/BODY＞＜/HTML＞"); <BR>&nbsp;&nbsp; } <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; public void doPost(HttpServletRequest request, <BR>&nbsp;&nbsp; HttpServletResponse response) <BR>&nbsp;&nbsp; throws ServletException, IOException { <BR>&nbsp;&nbsp; doGet(request, response); <BR>&nbsp;&nbsp; } <BR>&nbsp; } </TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/songfei/aggbug/28686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-01-19 18:32 <a href="http://www.blogjava.net/songfei/articles/28686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>表单数据概述</title><link>http://www.blogjava.net/songfei/articles/28684.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Thu, 19 Jan 2006 10:25:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/28684.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/28684.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/28684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/28684.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/28684.html</trackback:ping><description><![CDATA[<TABLE align=right border=0>
<TBODY>
<TR>
<TD width="100%" height=10>
<SCRIPT language=javascript src="http://usms.tom.com/wlqy_flash.js?tomuserid=9247"></SCRIPT>
</TD></TR></TBODY></TABLE>4.1 表单数据概述&nbsp;&nbsp; <BR>&nbsp; 　　 如果你曾经使用过Web搜索引擎，或者浏览过在线书店、股票价格、机票信息，或许会留意到一些古怪的URL，比如“http://host/path?user=Marty+Hall&amp;origin=bwi&amp;dest=lax”。这个URL中位于问号后面的部分，即“user=Marty+Hall&amp;origin=bwi&amp;dest=lax”，就是表单数据，这是将Web页面数据发送给服务器程序的最常用方法。对于GET请求，表单数据附加到URL的问号后面（如上例所示）；对于POST请求，表单数据用一个单独的行发送给服务器。&nbsp;&nbsp; <BR>&nbsp; 　　 以前，从这种形式的数据提取出所需要的表单变量是CGI编程中最麻烦的事情之一。首先，GET请求和POST请求的数据提取方法不同：对于GET请求，通常要通过QUERY_STRING环境变量提取数据；对于POST请求，则一般通过标准输入提取数据。第二，程序员必须负责在“&amp;”符号处截断变量名字-变量值对，再分离出变量名字（等号左边）和变量值（等号右边）。第三，必须对变量值进行URL反编码操作。因为发送数据的时候，字母和数字以原来的形式发送，但空格被转换成加号，其他字符被转换成“%XX”形式，其中XX是十六进制表示的字符ASCII（或者ISO Latin-1）编码值。例如，如果HTML表单中名为“users”的域值为“~hall, ~gates, and ~mcnealy”，则实际向服务器发送的数据为“users=%7Ehall%2C+%7Egates%2C+and+%7Emcnealy”。最后，即第四个导致解析表单数据非常困难的原因在于，变量值既可能被省略（如“param1=val1＆param2=＆param3=val3”），也有可能一个变量拥有一个以上的值，即同一个变量可能出现一次以上（如“param1=val1＆param2=val2＆param1=val3”）。&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 Java Servlet的好处之一就在于所有上述解析操作都能够自动完成。只需要简单地调用一下HttpServletRequest的getParameter方法、在调用参数中提供表单变量的名字（大小写敏感）即可，而且GET请求和POST请求的处理方法完全相同。&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 getParameter方法的返回值是一个字符串，它是参数中指定的变量名字第一次出现所对应的值经反编码得到得字符串（可以直接使用）。如果指定的表单变量存在，但没有值，getParameter返回空字符串；如果指定的表单变量不存在，则返回null。如果表单变量可能对应多个值，可以用getParameterValues来取代getParameter。getParameterValues能够返回一个字符串数组。&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 最后，虽然在实际应用中Servlet很可能只会用到那些已知名字的表单变量，但在调试环境中，获得完整的表单变量名字列表往往是很有用的，利用getParamerterNames方法可以方便地实现这一点。getParamerterNames返回的是一个Enumeration，其中的每一项都可以转换为调用getParameter的字符串。 <BR>&nbsp;&nbsp; <BR>4.2 实例：读取三个表单变量&nbsp;&nbsp; <BR>&nbsp; 　　 下面是一个简单的例子，它读取三个表单变量param1、param2和param3，并以HTML列表的形式列出它们的值。请注意，虽然在发送应答内容之前必须指定应答类型（包括内容类型、状态以及其他HTTP头信息），但Servlet对何时读取请求内容却没有什么要求。&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 另外，我们也可以很容易地把Servlet做成既能处理GET请求，也能够处理POST请求，这只需要在doPost方法中调用doGet方法，或者覆盖service方法（service方法调用doGet、doPost、doHead等方法）。在实际编程中这是一种标准的方法，因为它只需要很少的额外工作，却能够增加客户端编码的灵活性。&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 如果你习惯用传统的CGI方法，通过标准输入读取POST数据，那么在Servlet中也有类似的方法，即在HttpServletRequest上调用getReader或者getInputStream，但这种方法对普通的表单变量来说太麻烦。然而，如果是要上载文件，或者POST数据是通过专门的客户程序而不是HTML表单发送，那么就要用到这种方法。&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 注意用第二种方法读取POST数据时，不能再用getParameter来读取这些数据。&nbsp;&nbsp;&nbsp; <BR>ThreeParams.java <BR>&nbsp; package hall; <BR>&nbsp;&nbsp; <BR>&nbsp; import java.io.*; <BR>&nbsp; import javax.servlet.*; <BR>&nbsp; import javax.servlet.http.*; <BR>&nbsp; import java.util.*;&nbsp;&nbsp;&nbsp; <BR>&nbsp; public class ThreeParams extends HttpServlet { <BR>&nbsp;&nbsp; public void doGet(HttpServletRequest request, <BR>&nbsp;&nbsp; HttpServletResponse response) <BR>&nbsp;&nbsp; throws ServletException, IOException { <BR>&nbsp;&nbsp; response.setContentType("text/html"); <BR>&nbsp;&nbsp; PrintWriter out = response.getWriter(); <BR>&nbsp;&nbsp; String title = "读取三个请求参数"; <BR>&nbsp;&nbsp; out.println(ServletUtilities.headWithTitle(title) + <BR>&nbsp;&nbsp; "＜BODY＞＼n" + <BR>&nbsp;&nbsp; "＜H1 ALIGN=CENTER＞" + title + "＜/H1＞＼n" + <BR>&nbsp;&nbsp; "＜UL＞＼n" + <BR>&nbsp;&nbsp; " ＜LI＞param1: " <BR>&nbsp;&nbsp; + request.getParameter("param1") + "＼n" + <BR>&nbsp;&nbsp; " ＜LI＞param2: " <BR>&nbsp;&nbsp; + request.getParameter("param2") + "＼n" + <BR>&nbsp;&nbsp; " ＜LI＞param3: " <BR>&nbsp;&nbsp; + request.getParameter("param3") + "＼n" + <BR>&nbsp;&nbsp; "＜/UL＞＼n" + <BR>&nbsp;&nbsp; "＜/BODY＞＜/HTML＞"); <BR>&nbsp;&nbsp; } <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; public void doPost(HttpServletRequest request, <BR>&nbsp;&nbsp; HttpServletResponse response) <BR>&nbsp;&nbsp; throws ServletException, IOException { <BR>&nbsp;&nbsp; doGet(request, response); <BR>&nbsp;&nbsp; } <BR>&nbsp; } <BR>4.3 实例：输出所有的表单数据&nbsp;&nbsp; <BR>&nbsp; 　　 下面这个例子寻找表单所发送的所有变量名字，并把它们放入表格中，没有值或者有多个值的变量都突出显示。&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 首先，程序通过HttpServletRequest的getParameterNames方法得到所有的变量名字，getParameterNames返回的是一个Enumeration。接下来，程序用循环遍历这个Enumeration，通过hasMoreElements确定何时结束循环，利用nextElement得到Enumeration中的各个项。由于nextElement返回的是一个Object，程序把它转换成字符串后再用这个字符串来调用getParameterValues。&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 getParameterValues返回一个字符串数组，如果这个数组只有一个元素且等于空字符串，说明这个表单变量没有值，Servlet以斜体形式输出“No Value”；如果数组元素个数大于1，说明这个表单变量有多个值，Servlet以HTML列表形式输出这些值；其他情况下Servlet直接把变量值放入表格。&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 ShowParameters.java&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 注意，ShowParameters.java用到了前面介绍过的ServletUtilities.java。 <BR>&nbsp; package hall; <BR>&nbsp;&nbsp; <BR>&nbsp; import java.io.*; <BR>&nbsp; import javax.servlet.*; <BR>&nbsp; import javax.servlet.http.*; <BR>&nbsp; import java.util.*; <BR>&nbsp;&nbsp; <BR>&nbsp; public class ShowParameters extends HttpServlet { <BR>&nbsp;&nbsp; public void doGet(HttpServletRequest request, <BR>&nbsp;&nbsp; HttpServletResponse response) <BR>&nbsp;&nbsp; throws ServletException, IOException { <BR>&nbsp;&nbsp; response.setContentType("text/html"); <BR>&nbsp;&nbsp; PrintWriter out = response.getWriter(); <BR>&nbsp;&nbsp; String title = "读取所有请求参数"; <BR>&nbsp;&nbsp; out.println(ServletUtilities.headWithTitle(title) + <BR>&nbsp;&nbsp; "＜BODY BGCOLOR=＼"#FDF5E6＼"＞＼n" + <BR>&nbsp;&nbsp; "＜H1 ALIGN=CENTER＞" + title + "＜/H1＞＼n" + <BR>&nbsp;&nbsp; "＜TABLE BORDER=1 ALIGN=CENTER＞＼n" + <BR>&nbsp;&nbsp; "＜TR BGCOLOR=＼"#FFAD00＼"＞＼n" + <BR>&nbsp;&nbsp; "＜TH＞参数名字＜TH＞参数值"); <BR>&nbsp;&nbsp; Enumeration paramNames = request.getParameterNames(); <BR>&nbsp;&nbsp; while(paramNames.hasMoreElements()) { <BR>&nbsp;&nbsp; String paramName = (String)paramNames.nextElement(); <BR>&nbsp;&nbsp; out.println("＜TR＞＜TD＞" + paramName + "＼n＜TD＞"); <BR>&nbsp;&nbsp; String[] paramValues = request.getParameterValues(paramName); <BR>&nbsp;&nbsp; if (paramValues.length == 1) { <BR>&nbsp;&nbsp; String paramValue = paramValues[0]; <BR>&nbsp;&nbsp; if (paramValue.length() == 0) <BR>&nbsp;&nbsp; out.print("＜I＞No Value＜/I＞"); <BR>&nbsp;&nbsp; else <BR>&nbsp;&nbsp; out.print(paramValue); <BR>&nbsp;&nbsp; } else { <BR>&nbsp;&nbsp; out.println("＜UL＞"); <BR>&nbsp;&nbsp; for(int i=0; i＜paramValues.length; i++) { <BR>&nbsp;&nbsp; out.println("＜LI＞" + paramValues[i]); <BR>&nbsp;&nbsp; } <BR>&nbsp;&nbsp; out.println("＜/UL＞"); <BR>&nbsp;&nbsp; } <BR>&nbsp;&nbsp; } <BR>&nbsp;&nbsp; out.println("＜/TABLE＞＼n＜/BODY＞＜/HTML＞"); <BR>&nbsp;&nbsp; } <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; public void doPost(HttpServletRequest request, <BR>&nbsp;&nbsp; HttpServletResponse response) <BR>&nbsp;&nbsp; throws ServletException, IOException { <BR>&nbsp;&nbsp; doGet(request, response); <BR>&nbsp;&nbsp; } <BR>&nbsp; } <BR>&nbsp;&nbsp; <BR>测试表单&nbsp;&nbsp;&nbsp; <BR>&nbsp; 　　 下面是向上述Servlet发送数据的表单PostForm.html。就像所有包含密码输入域的表单一样，该表单用POST方法发送数据。我们可以看到，在Servlet中同时实现doGet和doPost这两种方法为表单制作带来了方便。 <BR>&nbsp; ＜!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"＞ <BR>&nbsp; ＜HTML＞ <BR>&nbsp; ＜HEAD＞ <BR>&nbsp;&nbsp; ＜TITLE＞示例表单＜/TITLE＞ <BR>&nbsp; ＜/HEAD＞ <BR>&nbsp;&nbsp; <BR>&nbsp; ＜BODY BGCOLOR="#FDF5E6"＞ <BR>&nbsp; ＜H1 ALIGN="CENTER"＞用POST方法发送数据的表单＜/H1＞ <BR>&nbsp;&nbsp; <BR>&nbsp; ＜FORM ACTION="/servlet/hall.ShowParameters" <BR>&nbsp;&nbsp; METHOD="POST"＞ <BR>&nbsp;&nbsp; Item Number: <BR>&nbsp;&nbsp; ＜INPUT TYPE="TEXT" NAME="itemNum"＞＜BR＞ <BR>&nbsp;&nbsp; Quantity: <BR>&nbsp;&nbsp; ＜INPUT TYPE="TEXT" NAME="quantity"＞＜BR＞ <BR>&nbsp;&nbsp; Price Each: <BR>&nbsp;&nbsp; ＜INPUT TYPE="TEXT" NAME="price" VALUE="$"＞＜BR＞ <BR>&nbsp;&nbsp; ＜HR＞ <BR>&nbsp;&nbsp; First Name: <BR>&nbsp;&nbsp; ＜INPUT TYPE="TEXT" NAME="firstName"＞＜BR＞ <BR>&nbsp;&nbsp; Last Name: <BR>&nbsp;&nbsp; ＜INPUT TYPE="TEXT" NAME="lastName"＞＜BR＞ <BR>&nbsp;&nbsp; Middle Initial: <BR>&nbsp;&nbsp; ＜INPUT TYPE="TEXT" NAME="initial"＞＜BR＞ <BR>&nbsp;&nbsp; Shipping Address: <BR>&nbsp;&nbsp; ＜TEXTAREA NAME="address" ROWS=3 COLS=40＞＜/TEXTAREA＞＜BR＞ <BR>&nbsp;&nbsp; Credit Card:＜BR＞ <BR>&nbsp;&nbsp; ＜INPUT TYPE="RADIO" NAME="cardType" <BR>&nbsp;&nbsp; VALUE="Visa"＞Visa＜BR＞ <BR>&nbsp;&nbsp; ＜INPUT TYPE="RADIO" NAME="cardType" <BR>&nbsp;&nbsp; VALUE="Master Card"＞Master Card＜BR＞ <BR>&nbsp;&nbsp; ＜INPUT TYPE="RADIO" NAME="cardType" <BR>&nbsp;&nbsp; VALUE="Amex"＞American Express＜BR＞ <BR>&nbsp;&nbsp; ＜INPUT TYPE="RADIO" NAME="cardType" <BR>&nbsp;&nbsp; VALUE="Discover"＞Discover＜BR＞ <BR>&nbsp;&nbsp; ＜INPUT TYPE="RADIO" NAME="cardType" <BR>&nbsp;&nbsp; VALUE="Java SmartCard"＞Java SmartCard＜BR＞ <BR>&nbsp;&nbsp; Credit Card Number: <BR>&nbsp;&nbsp; ＜INPUT TYPE="PASSWORD" NAME="cardNum"＞＜BR＞ <BR>&nbsp;&nbsp; Repeat Credit Card Number: <BR>&nbsp;&nbsp; ＜INPUT TYPE="PASSWORD" NAME="cardNum"＞＜BR＞＜BR＞ <BR>&nbsp;&nbsp; ＜CENTER＞ <BR>&nbsp;&nbsp; ＜INPUT TYPE="SUBMIT" VALUE="Submit Order"＞ <BR>&nbsp;&nbsp; ＜/CENTER＞ <BR>&nbsp; ＜/FORM＞ <BR>&nbsp;&nbsp; <BR>&nbsp; ＜/BODY＞ <BR>&nbsp; ＜/HTML＞ <img src ="http://www.blogjava.net/songfei/aggbug/28684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2006-01-19 18:25 <a href="http://www.blogjava.net/songfei/articles/28684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>weblogic的jsp问题解决方法</title><link>http://www.blogjava.net/songfei/articles/23888.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Wed, 14 Dec 2005 08:00:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/23888.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/23888.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/23888.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/23888.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/23888.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD class=title1 align=middle width="100%" bgColor=#eeeeee colSpan=3 height=40><B>weblogic的jsp问题解决方法</B></TD></TR>
<TR>
<TD align=middle width="100%" bgColor=#eeeeee><A href="http://www.javaresearch.org/profile.jsp?user=2120">littleboys</A> 原创&nbsp; (参与分：47498，专家分：330)&nbsp;&nbsp; 发表：2002-08-27 19:26 &nbsp;&nbsp;版本：1.0 &nbsp;&nbsp;阅读：<B>16714</B>次 </TD></TR></TBODY></TABLE></TD></TR><!-- end of article title -->
<TR>
<TD vAlign=top align=middle width="100%"><!--start of article content -->
<TABLE width="98%" border=0>
<TBODY>
<TR>
<TD class=text align=left width="100%"><BR>在做项目的时候，jsp在运行的时候出现了一些问题，现将我的问题解决方法做一个小结，供以后作项目的参考。<BR><BR>问题1：<BR>weblogic&nbsp;的数据库连接数目在程序运行中不断增长，最后连接数目超过最大数，导致weblogic服务关闭<BR>原因：<BR>在操作完数据库后，没有关闭数据库连接；或者是返回结果集（Resultset），而无法在jsp中关闭数据库连接。<BR>解决方法：<BR>1．&nbsp;&nbsp;&nbsp;&nbsp;在操作完数据库要关闭数据库连接。<BR>2．&nbsp;&nbsp;&nbsp;&nbsp;尽量不要返回结果集Resultset,&nbsp;可以返回Vector（一个字段）、Hashtable（多个字段），这样可以在javabean中关闭数据库。<BR>3．&nbsp;&nbsp;&nbsp;&nbsp;如果javabean中返回的是结果集（Resultset），也可以在javaBean中写一个connectDB（连接数据库）、closeDB(关闭数据库)的方法，然后jsp里面调用connectDB（），建立数据库连接，同时就可以对数据库进行操作了，操作数据库完毕，可以通过closeDB()&nbsp;来关闭数据库。<BR>使用第二种方法<BR>问题2：<BR>在运行某一个jsp&nbsp;程序的时候，weblogic&nbsp;的内存陡然增长，而且居高不下。最终导致weblogic&nbsp;内存不足，甚至当机。<BR>原因：<BR>过度使用内存。<BR>解决方法：<BR>1．&nbsp;&nbsp;&nbsp;&nbsp;由于数据量比较大，在对字符串进行操作的时候，使用&nbsp;+&nbsp;进行字符串连接，而<BR>&nbsp;&nbsp;&nbsp;相信大家对String都非常熟悉，我们也经常要用它来做字符串的连接什么的，例如：<BR>String&nbsp;a&nbsp;=b+c&nbsp;file://b,c&nbsp;都是String&nbsp;<BR>但是在实际的编译中却是这样：&nbsp;<BR>String&nbsp;a=new&nbsp;StringBuffer().append(b).append(c).toString()&nbsp;显然,在一个简单的语句中却意外的多生成了2个对象：<BR>.StringBuffer()&nbsp;<BR>.toString返回的一个String<BR>我们比较一下这两段程序的性能：<BR>程序片断一：<BR>StringBuffer&nbsp;s=new&nbsp;StringBuffer();<BR>long&nbsp;start&nbsp;=&nbsp;System.currentTimeMillis();<BR>for&nbsp;(int&nbsp;i=0;i&lt;10000;i++){<BR>s1+="a";<BR>}<BR>long&nbsp;stop&nbsp;=&nbsp;System.currentTimeMillis();<BR>System.out.println(stop-start);<BR>程序片断二：&nbsp;<BR>StringBuffer&nbsp;s=new&nbsp;StringBuffer(10000);//<BR>long&nbsp;start=System.currentTimeMillis();&nbsp;<BR>for&nbsp;(int&nbsp;i=0;i&lt;10000;i++){<BR>s.append("a");&nbsp;<BR>}<BR>long&nbsp;stop=System.currentTimeMillis();<BR>System.out.println(stop-start);<BR>比较一下结果，差距很明显。<BR>至于为什么String的连接这么做，因为String无法直接改变其长度，而必须采用StringBuffer的用法。<BR>因此建议使用StringBuffer&nbsp;的append&nbsp;方法来进行字符串相连。<BR>2．&nbsp;&nbsp;&nbsp;&nbsp;在解决这个问题的时候，我也尝试使用上面的方法，效果并不是很明显(消耗内存上)。后来在显示大量数据的时候，避免字符串相连的步骤，而直接使用out.println(),直接输出。<BR>问题3：Java并不阻止程序占用过多的内存,当对象向堆所请求的内存不足时,垃圾收集器(Garbage&nbsp;Collector)就会自动启动,释放那些引用数为零的对象所占用的内存，Java也不会自动释放无用的对象的引用,如果程序忘记释放指向对象的引用,则程序运行时的内存随着时间的推移而增加,发生所谓内存泄漏(memory&nbsp;leaks)，创建对象不但消耗CPU的时间和内存,同时,为释放对象内存JVM需不停地启动垃圾收集器(Garbage&nbsp;Collector),这也会消耗大量的CPU时间。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>解决方法：&nbsp;由于在运行一段时间jsp程序后，weblogic&nbsp;的内存会有一个缓慢的增长，这样也会导致内存溢出，为了避免这总现象的出现，最终的解决方法是：&nbsp;编写一个servlet程序，在启动服务器的时候，启动一个这个servlet，每隔20分钟运行在服务器端运行一次，来定时回收内存。<BR>&nbsp;问题4：<BR>log文件里面的调试信息没有注释去掉。<BR>&nbsp;解决方法：<BR>在程序通过后，尽量把调试的信息注释去掉。<BR>同时在捕捉错误的时候要写明程序名称，方便查找，这一点做的还不够。<BR>最好能写一个记录log的方法，以便程序调用。<BR>问题5<BR>改善性能，提高速度。<BR>具体实例：<BR>&nbsp;我们再来看一个有关Vector类的代码片段：<BR>for(int&nbsp;I=0;&nbsp;I&lt;v.size();&nbsp;I++)&nbsp;{&nbsp;System.out.println(&nbsp;v.get(I).getClass().toString());&nbsp;}<BR>如果v包含100,000个元素，这个代码片段将调用v.size()方法100,000次。虽然size方法是一个简单的方法，但它仍旧需要一次方法调用的开销，至少JVM需要为它配置以及清除堆栈环境。在这里，for循环内部的代码不会以任何方式修改Vector类型对象v的大小，因此上面的代码最好改写成下面这种形式：<BR>int&nbsp;size&nbsp;=&nbsp;v.size();&nbsp;for(int&nbsp;I=0;&nbsp;I&lt;size;&nbsp;I++)&nbsp;{&nbsp;System.out.println(&nbsp;v.get(I).getClass().toString());&nbsp;}<BR>虽然这是一个简单的改动，但它仍旧赢得了性能。毕竟，每一个CPU周期都是宝贵的。<BR>问题&nbsp;6：<BR>在&nbsp;jsp&nbsp;文件里面&nbsp;不要写&nbsp;&lt;%@&nbsp;page&nbsp;import="java.lang.*"&nbsp;%&gt;<BR>因为java&nbsp;不需要引入此包就可以引用里面的类文件。<BR><BR>问题7：<BR>使用vector+hashtable&nbsp;一次返回查询结果resulset.<BR><BR>解决方法：&nbsp;记录集：将一条记录放到一个hashtable里面，然后把它再<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;添加到vector里面，循环记录下结果集，返回vector<BR>具体见后面的java文件的部分代码（不包扩数据库的连接和关闭）<BR><BR><BR>&nbsp;package&nbsp;zjdx.bean.common;<BR><BR>/********************************************<BR>&nbsp;*****&nbsp;Title:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hashtable_vector_rs&nbsp;&nbsp;<BR>&nbsp;*****&nbsp;Description:&nbsp;数据显示&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;*****&nbsp;Copyright:&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2002&nbsp;&nbsp;&nbsp;<BR>&nbsp;*****&nbsp;Company:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DHC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;*****&nbsp;author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wangyl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;*****&nbsp;version:&nbsp;&nbsp;&nbsp;&nbsp;1.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;*****&nbsp;说明：<BR>&nbsp;*****&nbsp;记录集：一条记录用放到一个hashtable里面，然后把它再<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;放到vector里面，循环记录下结果集，返回vector<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>*********************************************/<BR><BR>import&nbsp;java.io.*;<BR>import&nbsp;java.sql.*;<BR>import&nbsp;java.util.*;<BR>import&nbsp;java.text.*;<BR><BR>public&nbsp;class&nbsp;hashtable_vector_rs<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*----------------------------------------------------------------*/<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;函数名称：&nbsp;getMultiRowInfo<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;功能描述：&nbsp;返回记录集，放到Hashtable里面<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;参数：&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;语句,字段个数<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;返回值:&nbsp;&nbsp;&nbsp;成功---htable,&nbsp;失败---null<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*----------------------------------------------------------------*/<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Vector&nbsp;ListResult(String&nbsp;sqlStatement,int&nbsp;num)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vector&nbsp;ListRs=new&nbsp;Vector();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connectDB();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs=stmt.executeQuery(sqlStatement);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//判断字段数据类型&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//date型&nbsp;返回&nbsp;93&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//int型&nbsp;返回&nbsp;2,4<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//bigint型&nbsp;返回&nbsp;3&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//String型&nbsp;返回&nbsp;12<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//(char&nbsp;型)返回&nbsp;1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;t&nbsp;=&nbsp;-1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rsmd&nbsp;=&nbsp;rs.getMetaData();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ColumnCount=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(num&gt;0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnCount&nbsp;=&nbsp;num;<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;&nbsp;&nbsp;ColumnCount&nbsp;=&nbsp;rsmd.getColumnCount();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(rs.next())<BR>&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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hashtable&nbsp;htable&nbsp;=new&nbsp;Hashtable();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;ColumnCount;&nbsp;i++)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t=rsmd.getColumnType(i);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("i="+i+",t="+t+"name="+rsmd.getColumnName(i));&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(t==12||t==1||t==3)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(rs.getString(i)==null||&nbsp;rs.getString(i).equals(""))<BR>&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;htable.put(rsmd.getColumnName(i),"");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;htable.put(rsmd.getColumnName(i),rs.getString(i));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(t==93)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;htable.put(rsmd.getColumnName(i),rs.getDate(i).toString());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(t==2||t==4)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;htable.put(rsmd.getColumnName(i),Integer.toString(rs.getInt(i)));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListRs.add(htable);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}//e<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ListRs;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch(Exception&nbsp;listError)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("数据库操作失败！"+listError);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closeDB();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch(Exception&nbsp;closeErr)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("关闭数据库出错："+closeErr);&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR>&nbsp;问题8:&nbsp;jsp的程序也有设计的不够合理的地方<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例如：选择一个下拉框，提交一次，列出所选的数据，选择另外一个下拉框再次提交，再次列出所选的数据。<BR>解决方法：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;尽量一次把条件选择完毕，然后列出所选择的数据，并且在数据多的时候，尽量使用翻页，减少运行时间。<BR><BR>问题9：性能优化，尽量使用PreparedStatement<BR>解决方法：<BR>PreparedStatement&nbsp;对象和使用的普通的&nbsp;Statement&nbsp;对象有两点不同。<BR>第一，&nbsp;&nbsp;&nbsp;&nbsp;它们是为了性能更快而由&nbsp;JDBC&nbsp;驱动程序或数据库编译（预编译）的。<BR>第二，&nbsp;&nbsp;&nbsp;&nbsp;它们接受一个或多个动态输入参数，称为&nbsp;IN&nbsp;参数。这两点让&nbsp;PreparedStatement&nbsp;对象适用于重复的&nbsp;SQL&nbsp;操作，其中操作基本上都是一样的，只有微小的差异（如数据载入）。要让&nbsp;SQL&nbsp;语句在使用前预备好，在&nbsp;PreparedStatement&nbsp;对象创建时必须将&nbsp;SQL&nbsp;传送到&nbsp;JDBC&nbsp;驱动程序，而不是在其执行时才传送。&nbsp;<BR><BR>IN&nbsp;参数用&nbsp;SQL&nbsp;String&nbsp;中的&nbsp;?&nbsp;占位符表示。在&nbsp;PreparedStatement&nbsp;能够成功地执行前，还必须调用&nbsp;PreparedStatement&nbsp;对象的&nbsp;setXXX()&nbsp;方法来设置&nbsp;IN&nbsp;参数，在这里&nbsp;XXX&nbsp;被设置的参数的数据类型所替换。因而，要将第一个&nbsp;IN&nbsp;参数设置为整数值&nbsp;100，您应该调用&nbsp;setInt(1,&nbsp;100)。同样地，要将第二个&nbsp;IN&nbsp;参数设置为字符串值“rjb”，您应该调用&nbsp;setString(2,&nbsp;"rjb")。最后一点是，设置好的参数值在设置为一个新的值，或用&nbsp;clearParameters()&nbsp;显式地清除之前会保持不变。这很重要，因为&nbsp;PreparedStatement&nbsp;可以被多次执行；如果您不注意的话，就会让您的数据库充满无用数据。<BR>问题10&nbsp;：<BR>&nbsp;&nbsp;1、我把包含SQLBridge&nbsp;的java文件改了一遍，有32个java文件（已经改完）。<BR>&nbsp;&nbsp;&nbsp;2、我把包含SQLPool&nbsp;的java文件改了一遍，有27个java文件（已经改完）。<BR>&nbsp;&nbsp;&nbsp;3、我把不用的jsp文件整理了一下，大概有17&nbsp;个目录的jsp文件不用或者没有上线。（整理完毕）<BR>问题11：提交页面，每次都提交两次。<BR>原因：<BR>&nbsp;&nbsp;1、<BR>&lt;input&nbsp;type="submit"&nbsp;name="sendit"&nbsp;value="发送"&nbsp;class=button&nbsp;onclick="javascript:if(chkit())form_submit('broadcast_operation.jsp?s_coming=1&amp;s_num=&lt;%=str_num%&gt;')"&gt;<BR>这里如果type=”sbumit”,页面就会提交两次。（花费了一天的时间才找到原因）。<BR>在onclick事件里面会提交一次，而submit&nbsp;按钮本身也会提交一次。<BR><BR>解决方法：<BR>&nbsp;&nbsp;&nbsp;如果在onclick&nbsp;事件里面提交页面，按钮的类型type&nbsp;一定不可以是”submit”&nbsp;&nbsp;按钮。<BR>可以是”button”.<BR>&nbsp;&nbsp;&nbsp;全文搜索共有33个类似的文件。<BR>java.net.SocketException:&nbsp;ReadFile&nbsp;failed:&nbsp;指定的网络名不再可用。<BR>主要是由于这个引起的。<BR>问题12：定时刷新页面，600秒（不是必要的，不要这样做）&nbsp;<BR>原因：<BR>&nbsp;&nbsp;&nbsp;&lt;meta&nbsp;http-equiv="refresh"&nbsp;content="600"&gt;<BR>解决方法：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;去掉这样的语句。<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>全文搜索共有12个类似的文件。<BR><BR>问题13：在跳转到别的页面的时候，要加return。<BR>否则可能会引起错误。跳转不过去。<BR>If{<BR>request.getRequestDispatcher("/zjdx/jsp/common/ErrorPage.jsp?s_mark=error:record&nbsp;have&nbsp;existed").forward(request,response);&nbsp;<BR>return;<BR>}<BR>else<BR>{<BR>response.sendRedirect();<BR>//建议用上面的方法<BR>return;<BR>}<BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/songfei/aggbug/23888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2005-12-14 16:00 <a href="http://www.blogjava.net/songfei/articles/23888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java正则表达式详解</title><link>http://www.blogjava.net/songfei/articles/23686.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Tue, 13 Dec 2005 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/songfei/articles/23686.html</guid><wfw:comment>http://www.blogjava.net/songfei/comments/23686.html</wfw:comment><comments>http://www.blogjava.net/songfei/articles/23686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/songfei/comments/commentRss/23686.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/songfei/services/trackbacks/23686.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java正则表达式详解仙人掌工作室 01-7-31 下午 04:13:03如果你曾经用过Perl或任何其他内建正则表达式支持的语言，你一定知道用正则表达式处理文本和匹配模式是多么简单。如果你不熟悉这个术语，那么“正则表达式”（Regular Expression）就是一个字符构成的串，它定义了一个用来搜索匹配字符串的模式。 许多语言，包括Perl、P...&nbsp;&nbsp;<a href='http://www.blogjava.net/songfei/articles/23686.html'>阅读全文</a><img src ="http://www.blogjava.net/songfei/aggbug/23686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/songfei/" target="_blank">天外飞仙</a> 2005-12-13 15:50 <a href="http://www.blogjava.net/songfei/articles/23686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>