<?xml version="1.0" encoding="UTF-8"?>


<rss version="2.0">
	<channel>
	<title>风信Java论坛</title>
	<link>http://www.javawind.net/index.jsp</link>
	<Description>Latest 20 article of this forum</Description>
	<language>zh-cn</language>
	<copyright>Copyright (C) 风信Java论坛</copyright>
	<generator>Rss Generator By JavaWind.Net</generator>
	<image>
		<title>风信Java论坛</title> 
		<url>http://www.javawind.net/images/logos.gif</url> 
		<link>http://www.javawind.net/</link>
	</image>

	
	<item>
		<title><![CDATA[非诚勿扰!]]></title>
		<link>http://www.javawind.net/8a8080a229fa769d012a1839611805f9.jhtml</link>
		<author>djlove</author>  
		<description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt">本人自学<span lang="EN-US">JAVA</span>一年有余，虽颇有心得，但是缺少一个实战的地方，因此，想与更多喜欢和从事<span lang="EN-US">JAVA</span>的朋友多多交流，本人<span lang="EN-US">QQ</span>：</span><font face="宋体"><code><span lang="EN-US" style="color: black; mso-bidi-font-size: 10.5pt; mso-ansi-font-size: 10.5pt">1092735976</span></code><code><span style="color: black; mso-bidi-font-size: 10.5pt; mso-ansi-font-size: 10.5pt">，非诚勿扰，谢谢合作<span lang="EN-US">~</span></span></code></font></font><span lang="EN-US" style="font-family: 宋体; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2010-07-28 16:44:27.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[西安有没有JAVA交流群啊？	]]></title>
		<link>http://www.javawind.net/8a8080a229fa769d012a1838303a05f8.jhtml</link>
		<author>djlove</author>  
		<description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 15.75pt; mso-char-indent-count: 1.5"><font size="3"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我是名</span><span lang="EN-US"><font face="Times New Roman">JAVA</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">爱好者，自学的，有很多东西不是很清楚，所以希望能够有高人指点一下。另外，如果和我一样，也是自学的</span><span lang="EN-US"><font face="Times New Roman">XDJM</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">并且愿意交流的，都请加我</span><span lang="EN-US"><font face="Times New Roman">QQ</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><code><span lang="EN-US" style="font-size: 12pt; color: black"><font face="宋体">296621778</font></span></code></font><code><span style="font-size: 12pt; color: black"><font face="宋体">，谢谢大家<span lang="EN-US">~~<o:p></o:p></span></font></span></code></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; mso-char-indent-count: 1.5"><code><span style="font-size: 12pt; color: black"><font face="宋体">加我时请注明：<span lang="EN-US">JAVA</span>交流。</font></span></code></p>
<p>&nbsp;</p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2010-07-28 16:43:09.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[西安JAVA爱好者集合了~]]></title>
		<link>http://www.javawind.net/8a8080a229fa769d012a18371ef805f7.jhtml</link>
		<author>djlove</author>  
		<description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0"><code><span style="font-size: 12pt; color: black"><font face="宋体">现在培训机构太多，有人说培训没有用，真正可以依靠的还是自己。只要自己学的好，那么才能找份好工作！<span lang="EN-US"><o:p></o:p></span></font></span></code></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0"><code><span style="font-size: 12pt; color: black"><font face="宋体">我也是<span lang="EN-US">JAVA</span>爱好者之一，因此，希望能寻找到西安或其他地方志同道合的朋友，一起交流学习的心得和学习中遇到的问题。<span lang="EN-US"><o:p></o:p></span></font></span></code></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; mso-char-indent-count: 2.0"><code><span style="font-size: 12pt; color: black"><font face="宋体">欢迎喜欢<span lang="EN-US">JAVA</span>的朋友加我的<span lang="EN-US">QQ</span>：<span lang="EN-US">296621778</span>（男同胞），姐妹们请加：<span lang="EN-US">1092735976</span>（<span lang="EN-US">(*^__^*)</span>，可以顺面一起探讨点时尚话题 嘻嘻&hellip;&hellip;）<span lang="EN-US"><o:p></o:p></span></font></span></code></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><code><span lang="EN-US" style="font-size: 12pt; color: black"><o:p><font face="宋体">&nbsp;</font></o:p></span></code></p>
<p>&nbsp;</p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2010-07-28 16:41:59.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[ 如何让Jgraph生成的流程图显示到web页面上]]></title>
		<link>http://www.javawind.net/8a8080a2298e8eac0129a10084bd0026.jhtml</link>
		<author>xmg2009</author>  
		<description><![CDATA[<p>我现在使用的是静态图片方式显示在页面上，不能拖拽。 要做成一个可以拖拽布局的，就和它原来桌面程序一样，请各位高手帮忙 谢谢啊<br />
&nbsp;</p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2010-07-05 13:07:32.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Statement和PreparedStatement之间的区别]]></title>
		<link>http://www.javawind.net/8a8080a22969bf4b01298e5173590034.jhtml</link>
		<author>菜鸟</author>  
		<description><![CDATA[<div style="background-color: rgb(255, 255, 255); padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: Arial, Verdana, sans-serif; font-size: 12px; ">以Oracle为例吧&nbsp;<br />
Statement为一条Sql语句生成执行计划，&nbsp;<br />
如果要执行两条sql语句&nbsp;<br />
select colume from table where colume=1;&nbsp;<br />
select colume from table where colume=2;&nbsp;<br />
会生成两个执行计划&nbsp;<br />
一千个查询就生成一千个执行计划！&nbsp;<br />
<br />
PreparedStatement用于使用绑定变量重用执行计划&nbsp;<br />
select colume from table where colume=:x;&nbsp;<br />
通过set不同数据只需要生成一次执行计划，可以重用&nbsp;<br />
<br />
是否使用绑定变量对系统影响非常大，生成执行计划极为消耗资源&nbsp;<br />
两种实现 速度差距可能成百上千倍&nbsp;<br />
<br />
1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程&nbsp;<br />
2.使用 Statement 对象。在对数据库只执行一次性存取的时侯，用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大，对于一次性操作并不会带来额外的好处。&nbsp;<br />
3.statement每次执行sql语句，相关数据库都要执行sql语句的编译，preparedstatement是预编译得, preparedstatement支持批处理&nbsp;<br />
4.&nbsp;<br />
Code Fragment 1:&nbsp;<br />
<br />
String updateString = &quot;UPDATE COFFEES SET SALES = 75 &quot; + &quot;WHERE COF_NAME LIKE &prime;Colombian&prime;&quot;;&nbsp;<br />
stmt.executeUpdate(updateString);&nbsp;<br />
<br />
Code Fragment 2:&nbsp;<br />
<br />
PreparedStatement updateSales = con.prepareStatement(&quot;UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? &quot;);&nbsp;<br />
updateSales.setInt(1, 75);&nbsp;<br />
updateSales.setString(2, &quot;Colombian&quot;);&nbsp;<br />
updateSales.executeUpdate();&nbsp;<br />
<br />
片断2和片断1的区别在于，后者使用了PreparedStatement对象，而前者是普通的Statement对象。PreparedStatement对象不仅包含了SQL语句，而且大多数情况下这个语句已经被预编译过，因而当其执行时，只需DBMS运行SQL语句，而不必先编译。当你需要执行Statement对象多次的时候，PreparedStatement对象将会大大降低运行时间，当然也加快了访问数据库的速度。&nbsp;<br />
这种转换也给你带来很大的便利，不必重复SQL语句的句法，而只需更改其中变量的值，便可重新执行SQL语句。选择PreparedStatement对象与否，在于相同句法的SQL语句是否执行了多次，而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话，它应该和普通的对象毫无差异，体现不出它预编译的优越性。&nbsp;<br />
5.执行许多SQL语句的JDBC程序产生大量的Statement和PreparedStatement对象。通常认为PreparedStatement对象比Statement对象更有效,特别是如果带有不同参数的同一SQL语句被多次执行的时候。PreparedStatement对象允许数据库预编译SQL语句，这样在随后的运行中可以节省时间并增加代码的可读性。&nbsp;<br />
<br />
然而，在Oracle环境中，开发人员实际上有更大的灵活性。当使用Statement或PreparedStatement对象时，Oracle数据库会缓存SQL语句以便以后使用。在一些情况下,由于驱动器自身需要额外的处理和在Java应用程序和Oracle服务器间增加的网络活动，执行PreparedStatement对象实际上会花更长的时间。&nbsp;<br />
<br />
然而，除了缓冲的问题之外，至少还有一个更好的原因使我们在企业应用程序中更喜欢使用PreparedStatement对象,那就是安全性。传递给PreparedStatement对象的参数可以被强制进行类型转换，使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配。&nbsp;<br />
<br />
当处理公共Web站点上的用户传来的数据的时候，安全性的问题就变得极为重要。传递给PreparedStatement的字符串参数会自动被驱动器忽略。最简单的情况下，这就意味着当你的程序试着将字符串&ldquo;D'Angelo&rdquo;插入到VARCHAR2中时，该语句将不会识别第一个&ldquo;，&rdquo;，从而导致悲惨的失败。几乎很少有必要创建你自己的字符串忽略代码。&nbsp;<br />
<br />
在Web环境中，有恶意的用户会利用那些设计不完善的、不能正确处理字符串的应用程序。特别是在公共Web站点上,在没有首先通过PreparedStatement对象处理的情况下，所有的用户输入都不应该传递给SQL语句。此外，在用户有机会修改SQL语句的地方，如HTML的隐藏区域或一个查询字符串上，SQL语句都不应该被显示出来。&nbsp;<br />
在执行SQL命令时，我们有二种选择：可以使用PreparedStatement对象，也可以使用Statement对象。无论多少次地使用同一个SQL命令，PreparedStatement都只对它解析和编译一次。当使用Statement对象时，每次执行一个SQL命令时，都会对它进行解析和编译。&nbsp;<br />
<br />
第一：&nbsp;<br />
prepareStatement会先初始化SQL，先把这个SQL提交到数据库中进行预处理，多次使用可提高效率。&nbsp;<br />
createStatement不会初始化，没有预处理，没次都是从0开始执行SQL&nbsp;<br />
<br />
第二：&nbsp;<br />
prepareStatement可以替换变量&nbsp;<br />
在SQL语句中可以包含?，可以用ps=conn.prepareStatement(&quot;select * from Cust where ID=?&quot;);&nbsp;<br />
int sid=1001;&nbsp;<br />
ps.setInt(1, sid);&nbsp;<br />
rs = ps.executeQuery();&nbsp;<br />
可以把?替换成变量。&nbsp;<br />
而Statement只能用&nbsp;<br />
int sid=1001;&nbsp;<br />
Statement stmt = conn.createStatement();&nbsp;<br />
ResultSet rs = stmt.executeQuery(&quot;select * from Cust where ID=&quot;+sid);&nbsp;<br />
来实现。&nbsp;<br />
<br />
第三：&nbsp;<br />
prepareStatement会先初始化SQL，先把这个SQL提交到数据库中进行预处理，多次使用可提高效率。&nbsp;<br />
createStatement不会初始化，没有预处理，没次都是从0开始执行SQL。</div>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2010-07-01 22:03:09.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[解决webLogic无法使用jasperreports生成报表的问题]]></title>
		<link>http://www.javawind.net/8a8080a22969bf4b012982da0e590022.jhtml</link>
		<author>jastby</author>  
		<description><![CDATA[<p>Unix/Linux下webLogic无法使用jasperreports(iReport)生成报表的问题解决方法<br />
<br />
今天在Unix下的webLogic部署一个项目后，发现报表无法导出了(<span style="color: #ff0000">但是在Windows开发环境下正常</span>)，后台报错如下：<br />
<br />
java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at sun.awt.X11GraphicsEnvironment.initDisplay()V(X11GraphicsEnvironment.java:???)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at sun.awt.X11GraphicsEnvironment.&lt;clinit&gt;()V(X11GraphicsEnvironment.java:134)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at jrockit.vm.Classes.forName0(Ljava.lang.String;ZI)I(Unknown Source)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at jrockit.vm.Classes.forName(Ljava.lang.String;ZLjava.lang.ClassLoader;)Ljava.lang.Class;(Unknown Source)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.lang.Class.forName(Ljava.lang.String;I)Ljava.lang.Class;(Unknown Source)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment()Ljava.awt.GraphicsEnvironment;(GraphicsEnvironment.java:62)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at net.sf.jasperreports.engine.util.JRGraphEnvInitializer.initializeGraphEnv()V(JRGraphEnvInitializer.java:58)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at net.sf.jasperreports.engine.fill.JRBaseFiller.&lt;init&gt;(Lnet.sf.jasperreports.engine.JasperReport;Lnet.sf.jasperreports.engine.fill.JREvaluator;Lnet.sf.jasperreports.engine.fill.JRBaseFiller;)V(JRBaseFiller.java:307)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at net.sf.jasperreports.engine.fill.JRVerticalFiller.&lt;init&gt;(Lnet.sf.jasperreports.engine.JasperReport;Lnet.sf.jasperreports.engine.fill.JREvaluator;Lnet.sf.jasperreports.engine.fill.JRBaseFiller;)V(JRVerticalFiller.java:92)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at net.sf.jasperreports.engine.fill.JRVerticalFiller.&lt;init&gt;(Lnet.sf.jasperreports.engine.JasperReport;)V(JRVerticalFiller.java:74)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at net.sf.jasperreports.engine.fill.JRFiller.createFiller(Lnet.sf.jasperreports.engine.JasperReport;)Lnet.sf.jasperreports.engine.fill.JRBaseFiller;(JRFiller.java:147)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at net.sf.jasperreports.engine.fill.JRFiller.fillReport(Lnet.sf.jasperreports.engine.JasperReport;Ljava.util.Map;Lnet.sf.jasperreports.engine.JRDataSource;)Lnet.sf.jasperreports.engine.JasperPrint;(JRFiller.java:83)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at net.sf.jasperreports.engine.JasperFillManager.fillReport(Lnet.sf.jasperreports.engine.JasperReport;Ljava.util.Map;Lnet.sf.jasperreports.engine.JRDataSource;)Lnet.sf.jasperreports.engine.JasperPrint;(JasperFillManager.java:601)<br />
&nbsp;...<br />
<br />
经过左问Baidu，右问Google，加上验证得到Debug方法如下：<br />
<br />
<span style="background-color: #ccffff">在startWebLogic.sh中加一行：<strong><span style="color: #ff0000">JAVA_OPTIONS = -Djava.awt.headless=true</span><br />
</strong>如果已有JAVA_OPTIONS配置行，则可以追加 </span><span style="color: #ff0000"><span style="background-color: #ccffff">-Djava.awt.headless=true</span></span><br />
<br />
重启webLogic，问题解决！</p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2010-06-29 16:36:55.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[java.sql ResultSet概论]]></title>
		<link>http://www.javawind.net/fdc1ee6a25220fa601252e91feaf0430.jhtml</link>
		<author>唧唧</author>  
		<description><![CDATA[<p>这篇文章并没有给出如何使用ResultSet的具体例子，只是从ResultSet的功能性上进行了详细的讲述。希望这篇文章对大家理解ResultSet能够有所帮助。下面就是这篇文章的具体内容。</p>
<p>结果集(ResultSet)是数据中查询结果返回的一种对象，可以说结果集是一个存储查询结果的对象，但是结果集并不仅仅具有存储的功能，他同时还具有操纵数据的功能，可能完成对数据的更新等。</p>
<p>结果集读取数据的方法主要是getXXX()，他的参数可以使整型表示第几列（是从1开始的），还可以是列名。返回的是对应的XXX类型的值。如果对应那列时空值，XXX是对象的话返回XXX型的空值，如果XXX是数字类型，如Float等则返回0，boolean返回false。使用getString()可以返回所有的列的值，不过返回的都是字符串类型的。XXX可以代表的类型有：基本的数据类型如整型(int)，布尔型(Boolean)，浮点型(Float,Double)等，比特型(byte)，还包括一些特殊的类型，如：日期类型(java.sql.Date)，时间类型(java.sql.Time)，时间戳类型(java.sql.Timestamp)，大数型(BigDecimal和BigInteger等)等。还可以使用getArray(int colindex/String columnname)，通过这个方法获得当前行中，colindex所在列的元素组成的对象的数组。使用getAsciiStream(int colindex/String colname)可以获得该列对应的当前行的ascii流。也就是说所有的getXXX方法都是对当前行进行操作。</p>
<p>结果集从其使用的特点上可以分为四类，这四类的结果集的所具备的特点都是和Statement语句的创建有关，因为结果集是通过Statement语句执行后产生的，所以可以说，结果集具备何种特点，完全决定于Statement，当然我是说下面要将的四个特点，在Statement创建时包括三种类型。首先是无参数类型的，他对应的就是下面要介绍的基本的ResultSet对应的Statement。下面的代码中用到的Connection并没有对其初始化，变量conn代表的就是Connection对应的对象。SqlStr代表的是响应的SQL语句。</p>
<p><strong>1、最基本的ResultSet。 </strong><br />
之所以说是最基本的ResultSet是因为，这个ResultSet他起到的作用就是完成了查询结果的存储功能，而且只能读去一次，不能够来回的滚动读取。这种结果集的创建方式如下：<br />
Statement st = conn.CreateStatement()<br />
ResultSet rs = Statement.excuteQuery(sqlStr);</p>
<p>由于这种结果集不支持，滚动的读去功能所以，如果获得这样一个结果集，只能使用它里面的next()方法，逐个的读去数据。</p>
<p><strong>2、可滚动的ResultSet类型。</strong> <br />
这个类型支持前后滚动取得纪录next()、previous()，回到第一行first()，同时还支持要去的ResultSet中的第几行absolute(int n)，以及移动到相对当前行的第几行relative(int n)，要实现这样的ResultSet在创建Statement时用如下的方法。</p>
<p>Statement st = conn.createStatement(int resultSetType, int resultSetConcurrency) <br />
ResultSet rs = st.executeQuery(sqlStr)</p>
<p>其中两个参数的意义是： <br />
resultSetType是设置ResultSet对象的类型可滚动，或者是不可滚动。取值如下： <br />
ResultSet.TYPE_FORWARD_ONLY只能向前滚动 <br />
ResultSet.TYPE_SCROLL_INSENSITIVE和Result.TYPE_SCROLL_SENSITIVE这两个方法都能够实现任意的前后滚动，使用各种移动的ResultSet指针的方法。二者的区别在于前者对于修改不敏感，而后者对于修改敏感。 <br />
resultSetConcurency是设置ResultSet对象能够修改的，取值如下： <br />
ResultSet.CONCUR_READ_ONLY 设置为只读类型的参数。 <br />
ResultSet.CONCUR_UPDATABLE 设置为可修改类型的参数。 <br />
所以如果只是想要可以滚动的类型的Result只要把Statement如下赋值就行了。</p>
<p>Statement st = conn.createStatement(Result.TYPE_SCROLL_INSENITIVE, <br />
ResultSet.CONCUR_READ_ONLY); <br />
ResultSet rs = st.excuteQuery(sqlStr)；</p>
<p>用这个Statement执行的查询语句得到的就是可滚动的ResultSet。</p>
<p><strong>3、可更新的ResultSet <br />
</strong>这样的ResultSet对象可以完成对数据库中表的修改，但是我知道ResultSet只是相当于数据库中表的视图，所以并不时所有的ResultSet只要设置了可更新就能够完成更新的，能够完成更新的ResultSet的SQL语句必须要具备如下的属性： <br />
a、只引用了单个表。 <br />
b、不含有join或者group by子句。 <br />
c、那些列中要包含主关键字。 <br />
具有上述条件的，可更新的ResultSet可以完成对数据的修改，可更新的结果集的创建方法是：<br />
Statement st = createstatement(Result.TYPE_SCROLL_INSENSITIVE,Result.CONCUR_UPDATABLE)</p>
<p><strong>4、可保持的ResultSet </strong><br />
正常情况下如果使用Statement执行完一个查询，又去执行另一个查询时这时候第一个查询的结果集就会被关闭，也就是说，所有的Statement的查询对应的结果集是一个，如果调用Connection的commit()方法也会关闭结果集。可保持性就是指当ResultSet的结果被提交时，是被关闭还是不被关闭。JDBC2.0和1.0提供的都是提交后ResultSet就会被关闭。不过在JDBC3.0中，我们可以设置ResultSet是否关闭。要完成这样的ResultSet的对象的创建，要使用的Statement的创建要具有三个参数，这个Statement的创建方式也就是，我所说的Statement的第三种创建方式。如下：<br />
Statement st=createStatement(int resultsetscrollable,int resultsetupdateable,int resultsetSetHoldability) <br />
ResultSet rs = st.excuteQuery(sqlStr);</p>
<p>前两个参数和两个参数的createStatement方法中的参数是完全相同的，这里只介绍第三个参数： <br />
resultSetHoldability表示在结果集提交后结果集是否打开，取值有两个： <br />
ResultSet.HOLD_CURSORS_OVER_COMMIT:表示修改提交时，不关闭数据库。 <br />
ResultSet.CLOSE_CURSORS_AT_COMMIT：表示修改提交时ResultSet关闭。</p>
<p>不过这种功能只是在JDBC3.0的驱动下才能成立。</p>
<p>上面就是关于ResultSet的介绍，如果有什么不正确的地方，欢迎大家指出。</p>
<p>这样的Statement的执行结果得到的就是可更新的结果集。更新的方法是，把ResultSet的游标移动到你要更新的行，然后调用updateXXX()，这个方法XXX的含义和getXXX()是相同的。updateXXX（）方法，有两个参数，第一个是要更新的列，可以是列名或者序号。第二个是要更新的数据，这个数据类型要和XXX相同。每完成对一行的update要调用updateRow()完成对数据库的写入，而且是在ResultSet的游标没有离开该修改行之前，否则修改将不会被提交。</p>
<p>使用updateXXX方法还可以完成插入操作。但是首先要介绍两个方法： <br />
<strong>moveToInsertRow</strong>()是把ResultSet移动到插入行，这个插入行是表中特殊的一行，不需要指定具体那一行，只要调用这个方法系统会自动移动到那一行的。 <br />
<strong>moveToCurrentRow</strong>()这是把ResultSet移动到记忆中的某个行，通常当前行。如果没有使用insert操作，这个方法没有什么效果，如果使用了insert操作，这个方法用于返回到insert操作之前的那一行，离开插入行，当然也可以通过next(),previous()等方法离开插入行。 <br />
要完成对数据库的插入，首先调用moveToInsertRow()移动到插入行，然后调用updateXXX的方法完成对，各列数据的更新，完成更新后和更新操作一样，要写到数据库，不过这里使用的是insertRow()，也要保证在该方法执行之前ResultSet没有离开插入列，否则插入不被执行，并且对插入行的更新将丢失。</p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2009-11-26 11:38:57.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[用Commons Dbutils不能添加留言]]></title>
		<link>http://www.javawind.net/fdc1ee6a2413479a0124bfe25bb123ea.jhtml</link>
		<author>guogeleixi</author>  
		<description><![CDATA[<p>各位大拿好：<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 我的问题是建立在留言板上的，guestbook2用的技术是servlet，用tomcat自带的连接池连接的，数据库用的是ora9,留言的表是guestbook,添加查看留言，没问题的!!而guestbook3除了连接数据库的方式不一样（用的是Commons Dbutils组件），其它都一样，但是用组件后添加留言就是不成功，出现以下提示：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
java.sql.SQLException: 不支持的特性 Query: insert into guestbook(id,name,email,phone,title,content,time) values(gb_seq.nextval,?,?,?,?,?,?) Parameters: [12313, <a href="mailto:123123@qq.com">123123@qq.com</a>, 1231232, 1231232, &lt;p&gt;123123&lt;/p&gt;, 2009-11-03 08:44:45]<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.commons.dbutils.QueryRunner.rethrow(QueryRunner.java:540)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:597)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:653)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at com.v512.guestbook.AddMessageServlet.doPost(AddMessageServlet.java:59)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)<br />
&nbsp; &nbsp; &nbsp; &nbsp; at java.lang.Thread.run(Thread.java:595)<br />
<br />
我真的找不到错误了 希望大拿们帮帮我。我把guestbook2,guestbook3都上传上去。</p>
<p><a target="_blank" href="Upload/2009-11/04_2344_50496A6.jpg"><img border="0" alt="点击在新窗口打开" onload="reSizeImg(this);" src="http://www.javawind.net/Upload/2009-11/04_2344_50496A6.jpg" /></a></p>
<p><a title="点击下载附件" target="_blank" href="Upload/2009-11/04_2348_B7380B7.rar"><img border="0" alt="下载附件" src="http://www.javawind.net/images/filetype/rar.gif" /> 04_2348_B7380B7.rar</a></p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2009-11-04 23:48:53.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[为什么国内对工作流的重视远不如国外]]></title>
		<link>http://www.javawind.net/fdc1ee6a23e1a7c30123ffc1c03a06bb.jhtml</link>
		<author>lionlion</author>  
		<description><![CDATA[<div class="postInfo">该用户已经被锁定！</div>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2009-09-28 16:26:10.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[servlet2.5与el表达式]]></title>
		<link>http://www.javawind.net/5b016f38232c551b01234f2150c2053b.jhtml</link>
		<author>唧唧</author>  
		<description><![CDATA[<p>Servlet2.4版本默认支持EL，如果在MyEclipse新建web项目时，选择Java EE5.0的时候是用Servlet2.5的。它默认是不支持EL.要在页面声明</p>
<p>可以在jsp文件前面新增一行：<br />
&lt;%@ page isELIgnored=&quot;false&quot; %&gt;</p>
<p>设置EL有效，或者在web.xml里设置：<br />
<br />
&lt;jsp-config&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;jsp-property-group&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;el-ignored&gt;false&lt;/el-ignored&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/jsp-property-group&gt; <br />
&lt;/jsp-config&gt;</p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2009-08-25 09:17:46.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[cookie机制和session机制的原理和区别]]></title>
		<link>http://www.javawind.net/5b016f382218328f0122e9d65ae41c9e.jhtml</link>
		<author>唧唧</author>  
		<description><![CDATA[<p>一、cookie机制和session机制的区别<br />
　　具体来说cookie机制采用的是在客户端保持状态的方案，而session机制采用的是在服务器端保持状态的方案。<br />
　　同时我们也看到，由于在服务器端保持状态的方案在客户端也需要保存一个标识，所以session机制可能需要借助于cookie机制来达到保存标识的目的，但实际上还有其他选择。</p>
<p>二、会话cookie和持久cookie的区别<br />
　　如果不设置过期时间，则表示这个cookie生命周期为浏览器会话期间，只要关闭浏览器窗口，cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。<br />
　　如果设置了过期时间，浏览器就会把cookie保存到硬盘上，关闭后再次打开浏览器，这些cookie依然有效直到超过设定的过期时间。<br />
　　存储在硬盘上的cookie可以在不同的浏览器进程间共享，比如两个IE窗口。而对于保存在内存的cookie，不同的浏览器有不同的处理方式。</p>
<p>三、如何利用实现自动登录<br />
　　当用户在某个网站注册后，就会收到一个惟一用户ID的cookie。客户后来重新连接时，这个用户ID会自动返回，服务器对它进行检查，确定它是否为注册用户且选择了自动登录，从而使用户无需给出明确的用户名和密码，就可以访问服务器上的资源。</p>
<p>四、如何根据用户的爱好定制站点<br />
　　网站可以使用cookie记录用户的意愿。对于简单的设置，网站可以直接将页面的设置存储在cookie中完成定制。然而对于更复杂的定制，网站只需仅将一个惟一的标识符发送给用户，由服务器端的数据库存储每个标识符对应的页面设置。</p>
<p>五、cookie的发送<br />
1.创建Cookie对象<br />
2.设置最大时效<br />
3.将Cookie放入到HTTP响应报头<br />
　　如果你创建了一个cookie，并将他发送到浏览器，默认情况下它是一个会话级别的cookie:存储在浏览器的内存中，用户退出浏览器之后被删除。如果你希望浏览器将该cookie存储在磁盘上，则需要使用maxAge，并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该 cookie。<br />
　　发送cookie需要使用HttpServletResponse的addCookie方法，将cookie插入到一个 Set-Cookie HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头，而是创建新的报头，因此我们将这个方法称为是addCookie，而非setCookie。同样要记住响应报头必须在任何文档内容发送到客户端之前设置。</p>
<p>六、cookie的读取<br />
1.调用request.getCookie<br />
　　要获取有浏览器发送来的cookie，需要调用HttpServletRequest的getCookies方法，这个调用返回Cookie对象的数组，对应由HTTP请求中Cookie报头输入的值。<br />
2.对数组进行循环，调用每个cookie的getName方法，直到找到感兴趣的cookie为止<br />
　　cookie与你的主机(域)相关，而非你的servlet或JSP页面。因而，尽管你的servlet可能只发送了单个cookie，你也可能会得到许多不相关的cookie。<br />
例如：<br />
　　String cookieName = &ldquo;userID&rdquo;;<br />
Cookie cookies[] = request.getCookies();<br />
if (cookies!=null){<br />
for(int i=0;i&lt;cookies.length;i++){<br />
Cookie cookie = cookies[i];<br />
if (cookieName.equals(cookie.getName())){<br />
doSomethingWith(cookie.getValue());<br />
}<br />
}<br />
}</p>
<p>七、如何使用cookie检测初访者<br />
A.调用HttpServletRequest.getCookies()获取Cookie数组<br />
B.在循环中检索指定名字的cookie是否存在以及对应的值是否正确<br />
C.如果是则退出循环并设置区别标识<br />
D.根据区别标识判断用户是否为初访者从而进行不同的操作</p>
<p>八、使用cookie检测初访者的常见错误<br />
　　不能仅仅因为cookie数组中不存在在特定的数据项就认为用户是个初访者。如果cookie数组为null，客户可能是一个初访者，也可能是由于用户将cookie删除或禁用造成的结果。<br />
　　但是，如果数组非null,也不过是显示客户曾经到过你的网站或域，并不能说明他们曾经访问过你的servlet。其它servlet、JSP页面以及非Java Web应用都可以设置cookie，依据路径的设置，其中的任何cookie都有可能返回给用户的浏览器。<br />
　　正确的做法是判断cookie数组是否为空且是否存在指定的Cookie对象且值正确。</p>
<p>九、使用cookie属性的注意问题<br />
　　属性是从服务器发送到浏览器的报头的一部分；但它们不属于由浏览器返回给服务器的报头。　<br />
　　因此除了名称和值之外，cookie属性只适用于从服务器输出到客户端的cookie；服务器端来自于浏览器的cookie并没有设置这些属性。　<br />
　　因而不要期望通过request.getCookies得到的cookie中可以使用这个属性。这意味着，你不能仅仅通过设置cookie的最大时效，发出它，在随后的输入数组中查找适当的cookie,读取它的值，修改它并将它存回Cookie，从而实现不断改变的cookie值。</p>
<p>十、如何使用cookie记录各个用户的访问计数<br />
1.获取cookie数组中专门用于统计用户访问次数的cookie的值<br />
2.将值转换成int型<br />
3.将值加1并用原来的名称重新创建一个Cookie对象<br />
4.重新设置最大时效<br />
5.将新的cookie输出</p>
<p>十一、session在不同环境下的不同含义<br />
　　session，中文经常翻译为会话，其本来的含义是指有始有终的一系列动作/消息，比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。<br />
　　然而当session一词与网络协议相关联时，它又往往隐含了&ldquo;面向连接&rdquo;和/或&ldquo;保持状态&rdquo;这样两个含义。<br />
　　session在Web开发环境下的语义又有了新的扩展，它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构。</p>
<p>十二、session的机制<br />
　　session机制是一种服务器端的机制，服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。<br />
　　但程序需要为某个客户端的请求创建一个session的时候，服务器首先检查这个客户端的请求里是否包含了一个session标识－称为session id,如果已经包含一个session id则说明以前已经为此客户创建过session，服务器就按照session id把这个session检索出来使用(如果检索不到，可能会新建一个，这种情况可能出现在服务端已经删除了该用户对应的session对象，但用户人为地在请求的URL后面附加上一个JSESSION的参数)。<br />
　　如果客户请求不包含session id，则为此客户创建一个session并且生成一个与此session相关联的session id，这个session id将在本次响应中返回给客户端保存。</p>
<p>十三、保存session id的几种方式<br />
A．保存session id的方式可以采用cookie，这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。<br />
B．由于cookie可以被人为的禁止，必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器，经常采用的一种技术叫做URL重写，就是把session id附加在URL路径的后面，附加的方式也有两种，一种是作为URL路径的附加信息，另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态，就必须在每个客户端可能请求的路径后面都包含这个session id。<br />
C．另一种技术叫做表单隐藏字段。就是服务器会自动修改表单，添加一个隐藏字段，以便在表单提交时能够把session id传递回服务器。</p>
<p>十四、session什么时候被创建<br />
　　一个常见的错误是以为session在有客户端访问时就被创建，然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建。</p>
<p>十五、session何时被删除<br />
session在下列情况下被删除：<br />
A．程序调用HttpSession.invalidate()<br />
B．距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间<br />
C．服务器进程被停止<br />
　　再次注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效，不会使服务器端的session对象失效。</p>
<p>十六、URL重写有什么缺点<br />
　　对所有的URL使用URL重写，包括超链接，form的action，和重定向的URL。每个引用你的站点的URL，以及那些返回给用户的URL(即使通过间接手段，比如服务器重定向中的Location字段)都要添加额外的信息。<br />
　　这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此，每个页面都必须使用servlet或 JSP动态生成。即使所有的页面都动态生成，如果用户离开了会话并通过书签或链接再次回来，会话的信息都会丢失，因为存储下来的链接含有错误的标识信息－该URL后面的SESSION ID已经过期了。　　</p>
<p>十七、使用隐藏的表单域有什么缺点<br />
仅当每个页面都是有表单提交而动态生成时，才能使用这种方法。单击常规的&lt;A HREF..&gt;超文本链接并不产生表单提交，因此隐藏的表单域不能支持通常的会话跟踪，只能用于一系列特定的操作中，比如在线商店的结账过程。</p>
<p>十八、会话跟踪的基本步骤<br />
1．访问与当前请求相关的会话对象<br />
2．查找与会话相关的信息<br />
3．存储会话信息<br />
4．废弃会话数据</p>
<p>十九、getSession()/getSession(true)、getSession(false)的区别<br />
getSession()/getSession(true)：当session存在时返回该session，否则新建一个session并返回该对象<br />
getSession(false)：当session存在时返回该session，否则不会新建session，返回null</p>
<p>二十、如何将信息与会话关联起来<br />
　　setAttribute会替换任何之前设定的值；如果想要在不提供任何代替的情况下移除某个值，则应使用removeAttribute。这个方法会触发所有实现了HttpSessionBindingListener接口的值的valueUnbound方法。</p>
<p>二十一、会话属性的类型有什么限制吗<br />
　　通常会话属性的类型只要是Object就可以了。除了null或基本类型，如int,double,boolean。<br />
　　如果要使用基本类型的值作为属性，必须将其转换为相应的封装类对象</p>
<p>二十二、如何废弃会话数据<br />
A．只移除自己编写的servlet创建的数据：<br />
调用removeAttribute(&ldquo;key&rdquo;)将指定键关联的值废弃<br />
B．删除整个会话(在当前Web应用中)：<br />
调用invalidate，将整个会话废弃掉。这样做会丢失该用户的所有会话数据，而非仅仅由我们servlet或JSP页面创建的会话数据<br />
C．将用户从系统中注销并删除所有属于他(或她)的会话<br />
调用logOut，将客户从Web服务器中注销，同时废弃所有与该用户相关联的会话(每个Web应用至多一个)。这个操作有可能影响到服务器上多个不同的Web应用。</p>
<p>二十三、使用isNew来判断用户是否为新旧用户的错误做法<br />
　　public boolean isNew()方法如果会话尚未和客户程序(浏览器)发生任何联系，则这个方法返回true，这一般是因为会话是新建的，不是由输入的客户请求所引起的。<br />
　　但如果isNew返回false，只不过是说明他之前曾经访问该Web应用，并不代表他们曾访问过我们的servlet或JSP页面。<br />
　　因为session是与用户相关的，在用户之前访问的每一个页面都有可能创建了会话。因此isNew为false只能说用户之前访问过该Web应用，session可以是当前页面创建，也可能是由用户之前访问过的页面创建的。<br />
　　正确的做法是判断某个session中是否存在某个特定的key且其value是否正确</p>
<p>二十四、Cookie的过期和Session的超时有什么区别<br />
　　会话的超时由服务器来维护，它不同于Cookie的失效日期。首先，会话一般基于驻留内存的cookie不是持续性的cookie，因而也就没有截至日期。即使截取到JSESSIONID cookie，并为它设定一个失效日期发送出去。浏览器会话和服务器会话也会截然不同。</p>
<p>二十五、session cookie和session对象的生命周期是一样的吗<br />
　　当用户关闭了浏览器虽然session cookie已经消失，但session对象仍然保存在服务器端</p>
<p>二十六、是否只要关闭浏览器，session就消失了<br />
　　程序一般都是在用户做log off的时候发个指令去删除session，然而浏览器从来不会主动在关闭之前通知服务器它将要被关闭，因此服务器根本不会有机会知道浏览器已经关闭。服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。<br />
　　之所以会有这种错误的认识，是因为大部分session机制都使用会话cookie来保存session id，而关闭浏览器后这个session id就消失了，再次连接到服务器时也就无法找到原来的session。<br />
　　如果服务器设置的cookie被保存到硬盘上，或者使用某种手段改写浏览器发出的HTTP请求报头，把原来的session id发送到服务器，则再次打开浏览器仍然能够找到原来的session。<br />
　　恰恰是由于关闭浏览器不会导致session被删除，迫使服务器为session设置了一个失效时间，当距离客户上一次使用session的时间超过了这个失效时间时，服务器就可以认为客户端已经停止了活动，才会把session删除以节省存储空间。<br />
　　由此我们可以得出如下结论：<br />
　　关闭浏览器，只会是浏览器端内存里的session cookie消失，但不会使保存在服务器端的session对象消失，同样也不会使已经保存到硬盘上的持久化cookie消失。</p>
<p>二十七、打开两个浏览器窗口访问应用程序会使用同一个session还是不同的session<br />
　　通常session cookie是不能跨窗口使用的，当你新开了一个浏览器窗口进入相同页面时，系统会赋予你一个新的session id，这样我们信息共享的目的就达不到了。<br />
　　此时我们可以先把session id保存在persistent cookie中(通过设置session的最大有效时间)，然后在新窗口中读出来，就可以得到上一个窗口的session id了，这样通过session cookie和persistent cookie的结合我们就可以实现了跨窗口的会话跟踪。</p>
<p>二十八、如何使用会话显示每个客户的访问次数<br />
　　由于客户的访问次数是一个整型的变量，但session的属性类型中不能使用int，double，boolean等基本类型的变量，所以我们要用到这些基本类型的封装类型对象作为session对象中属性的值<br />
　　但像Integer是一种不可修改(Immutable)的数据结构：构建后就不能更改。这意味着每个请求都必须创建新的Integer对象，之后使用setAttribute来代替之前存在的老的属性的值。例如：<br />
HttpSession session = request.getSession();<br />
SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(&ldquo;SomeIdentifier&rdquo;);<br />
if (value= =null){<br />
value = new SomeImmutableClass(&hellip;);　// 新创建一个不可更改对象<br />
}else{<br />
value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对象<br />
}<br />
session.setAttribute(&ldquo;someIdentifier&rdquo;,value); // 使用新创建的对象覆盖原来的老的对象</p>
<p>二十九、如何使用会话累计用户的数据<br />
　　使用可变的数据结构，比如数组、List、Map或含有可写字段的应用程序专有的数据结构。通过这种方式，除非首次分配对象，否则不需要调用setAttribute。例如<br />
HttpSession session = request.getSession();<br />
SomeMutableClass value = (SomeMutableClass)session.getAttribute(&ldquo;someIdentifier&rdquo;);<br />
if(value = = null){<br />
value = new SomeMutableClass(&hellip;);<br />
session.setAttribute(&ldquo;someIdentifier&rdquo;,value);<br />
}else{<br />
value.updateInternalAttribute(&hellip;); // 如果已经存在该对象则更新其属性而不需重新设置属性<br />
}</p>
<p>三十、不可更改对象和可更改对象在会话数据更新时的不同处理<br />
　　不可更改对象因为一旦创建之后就不能更改，所以每次要修改会话中属性的值的时候，都需要调用 setAttribute(&ldquo;someIdentifier&rdquo;,newValue)来代替原有的属性的值，否则属性的值不会被更新可更改对象因为其自身一般提供了修改自身属性的方法，所以每次要修改会话中属性的值的时候，只要调用该可更改对象的相关修改自身属性的方法就可以了。这意味着我们就不需要调用 setAttribute方法了。</p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2009-08-05 17:14:15.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[execute、executeQuery和executeUpdate之间的区别(转)]]></title>
		<link>http://www.javawind.net/5b016f382218328f0122e848ca771c04.jhtml</link>
		<author>唧唧</author>  
		<description><![CDATA[<p>在用纯JSP做一个页面报警功能的时候习惯性的用executeQuery来执行SQL语句，结果执行update时就遇到问题，语句能执行，但返回结果出现问题，另外还忽略了executeUpdate的返回值不是结果集ResultSet,而是数值！特收藏如下一篇文章（感谢网友们对各种信息的贡献）： <br />
<br />
　　<strong>JDBC<sup>TM</sup>中Statement接口提供的execute、executeQuery和executeUpdate之间的区别<br />
</strong><br />
　　 Statement 接口提供了三种执行 SQL 语句的方法：executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。 <br />
<br />
　　 <strong>方法executeQuery </strong><br />
　　 用于产生单个结果集的语句，例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法是 executeQuery。这个方法被用来执行 SELECT 语句，它几乎是使用最多的 SQL 语句。 <br />
<br />
　　 <strong>方法executeUpdate <br />
</strong>　　 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL（数据定义语言）语句，例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数，指示受影响的行数（即更新计数）。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句，executeUpdate 的返回值总为零。&nbsp;<br />
<br />
　　 使用executeUpdate方法是因为在 createTableCoffees 中的 SQL 语句是 DDL （数据定义语言）语句。创建表，改变表，删除表都是 DDL 语句的例子，要用 executeUpdate 方法来执行。你也可以从它的名字里看出，方法 executeUpdate 也被用于执行更新表 SQL 语句。实际上，相对于创建表来说，executeUpdate 用于更新表的时间更多，因为表只需要创建一次，但经常被更新。&nbsp; <br />
<br />
　　 <strong>方法execute：</strong> <br />
　　 用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能 <br />
<br />
　　 execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程 或动态执行未知 SQL 字符串（即应用程序程序员在编译时未知）时，有可能出现多个结果的情况，尽管这种情况很少见。 <br />
　　 因为方法 execute 处理非常规情况，所以获取其结果需要一些特殊处理并不足为怪。例如，假定已知某个过程返回两个结果集，则在使用方法 execute 执行该过程后，必须调用方法 getResultSet 获得第一个结果集，然后调用适当的 getXXX 方法获取其中的值。要获得第二个结果集，需要先调用 getMoreResults 方法，然后再调用 getResultSet 方法。如果已知某个过程返回两个更新计数，则首先调用方法 getUpdateCount，然后调用 getMoreResults，并再次调用 getUpdateCount。 <br />
　　 对于不知道返回内容，则情况更为复杂。如果结果是 ResultSet 对象，则方法 execute 返回 true；如果结果是 Java int，则返回 false。如果返回 int，则意味着结果是更新计数或执行的语句是 DDL 命令。在调用方法 execute 之后要做的第一件事情是调用 getResultSet 或 getUpdateCount。调用方法 getResultSet 可以获得两个或多个 ResultSet 对象中第一个对象；或调用方法 getUpdateCount 可以获得两个或多个更新计数中第一个更新计数的内容。 <br />
　　 当 SQL 语句的结果不是结果集时，则方法 getResultSet 将返回 null。这可能意味着结果是一个更新计数或没有其它结果。在这种情况下，判断 null 真正含义的唯一方法是调用方法 getUpdateCount，它将返回一个整数。这个整数为调用语句所影响的行数；如果为 -1 则表示结果是结果集或没有结果。如果方法 getResultSet 已返回 null（表示结果不是 ResultSet 对象），则返回值 -1 表示没有其它结果。也就是说，当下列条件为真时表示没有结果（或没有其它结果）： <br />
<br />
　　((stmt.getResultSet() == null) &amp;&amp; (stmt.getUpdateCount() == -1)) <br />
<br />
　　 如果已经调用方法 getResultSet 并处理了它返回的 ResultSet 对象，则有必要调用方法 getMoreResults 以确定是否有其它结果集或更新计数。如果 getMoreResults 返回 true，则需要再次调用 getResultSet 来检索下一个结果集。如上所述，如果 getResultSet 返回 null，则需要调用 getUpdateCount 来检查 null 是表示结果为更新计数还是表示没有其它结果。 <br />
<br />
　　 当 getMoreResults 返回 false 时，它表示该 SQL 语句返回一个更新计数或没有其它结果。因此需要调用方法 getUpdateCount 来检查它是哪一种情况。在这种情况下，当下列条件为真时表示没有其它结果： <br />
<br />
　　((stmt.getMoreResults() == false) &amp;&amp; (stmt.getUpdateCount() == -1)) <br />
<br />
　　 下面的代码演示了一种方法用来确认已访问调用方法 execute 所产生的全部结果集和更新计数： <br />
<br />
<br />
　　stmt.execute(queryStringWithUnknownResults); <br />
　　while (true) { <br />
　　int rowCount = stmt.getUpdateCount(); <br />
　　if (rowCount &gt; 0) { // 它是更新计数 <br />
　　&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;Rows changed = &quot; + count); <br />
　　&nbsp;&nbsp;&nbsp;&nbsp; stmt.getMoreResults(); <br />
　　&nbsp;&nbsp;&nbsp;&nbsp; continue; <br />
　　} <br />
　　if (rowCount == 0) { // DDL 命令或 0 个更新 <br />
　　&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot; No rows changed or statement was DDL&nbsp; command&quot;); <br />
　　&nbsp;&nbsp;&nbsp;&nbsp; stmt.getMoreResults(); <br />
　　&nbsp;&nbsp;&nbsp;&nbsp; continue; <br />
　　} <br />
　　 <br />
　　// 执行到这里，证明有一个结果集 <br />
　　// 或没有其它结果 <br />
　　 <br />
　　ResultSet rs = stmt.getResultSet; <br />
　　if (rs != null) { <br />
　　. . . // 使用元数据获得关于结果集列的信息 <br />
　　while (rs.next()) { <br />
　　. . . // 处理结果 <br />
　　stmt.getMoreResults(); <br />
　　continue; <br />
　　} <br />
　　break; // 没有其它结果</p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2009-08-05 10:00:00.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Cookie跨域操作]]></title>
		<link>http://www.javawind.net/5b016f382218328f0122e647f2611b84.jhtml</link>
		<author>唧唧</author>  
		<description><![CDATA[<p>正常的cookie只能在一个应用中共享，即一个cookie只能由创建它的应用获得。 <br />
1.可在同一应用服务器内共享方法：设置cookie.setPath(&quot;/&quot;); <br />
&nbsp;&nbsp;&nbsp; 本机tomcat/webapp下面有两个应用：cas和webapp_b， <br />
&nbsp;&nbsp;&nbsp; 1）原来在cas下面设置的cookie，在webapp_b下面获取不到，path默认是产生cookie的应用的路径。 <br />
&nbsp;&nbsp;&nbsp; 2）若在cas下面设置cookie的时候，增加一条cookie.setPath(&quot;/&quot;);或者cookie.setPath(&quot;/webapp_b/&quot;);就可以在webapp_b下面获取到cas设置的cookie了。 <br />
&nbsp;&nbsp;&nbsp; 3）此处的参数，是相对于应用服务器存放应用的文件夹的根目录而言的(比如tomcat下面的webapp)，因此cookie.setPath(&quot;/&quot;);之后，可以在webapp文件夹下的所有应用共享cookie，而cookie.setPath(&quot;/webapp_b/&quot;);是指cas应用设置的cookie只能在webapp_b应用下的获得，即便是产生这个cookie的cas应用也不可以。 <br />
&nbsp;&nbsp;&nbsp; 4）设置cookie.setPath(&quot;/webapp_b/jsp&quot;)或者cookie.setPath(&quot;/webapp_b/jsp/&quot;)的时候，只有在webapp_b/jsp下面可以获得cookie，在webapp_b下面但是在jsp文件夹外的都不能获得cookie。 <br />
&nbsp;&nbsp;&nbsp; 5）设置cookie.setPath(&quot;/webapp_b&quot;);，是指在webapp_b下面才可以使用cookie，这样就不可以在产生cookie的应用cas下面获取cookie了 <br />
&nbsp;&nbsp;&nbsp; 6）有多条cookie.setPath(&quot;XXX&quot;);语句的时候，起作用的以最后一条为准。 <br />
&nbsp;&nbsp;&nbsp; 6）设置多个path的方法？？？ <br />
<br />
2.跨域共享cookie的方法：设置cookie.setDomain(&quot;.jszx.com&quot;); <br />
&nbsp;&nbsp;&nbsp; A机所在的域：home.langchao.com,A有应用cas <br />
&nbsp;&nbsp;&nbsp; B机所在的域：jszx.com，B有应用webapp_b <br />
&nbsp;&nbsp;&nbsp; 1）在cas下面设置cookie的时候，增加cookie.setDomain(&quot;.jszx.com&quot;);，这样在webapp_b下面就可以取到cookie。 <br />
&nbsp;&nbsp;&nbsp; 2）这个参数必须以&ldquo;.&rdquo;开始。 <br />
&nbsp;&nbsp;&nbsp; 3）输入url访问webapp_b的时候，必须输入域名才能解析。比如说在A机器输入：http://lc-bsp.jszx.com:8080/webapp_b,可以获取cas在客户端设置的cookie，而B机器访问本机的应用，输入：http://localhost:8080/webapp_b则不可以获得cookie。 <br />
&nbsp;&nbsp;&nbsp; 4）设置了cookie.setDomain(&quot;.jszx.com&quot;);，还可以在默认的home.langchao.com下面共享。 <br />
&nbsp;&nbsp;&nbsp; 5）设置多个域的方法？？？ <br />
最近的工作经常用到cookie，看了一些资料，虽然原来依赖cookie比较多的方案已经改成现在这个了，但是当时看得一些东西还是最好记下来，免得过些天就一干二净了，怪可惜的。老梁说过这样的文字最好不要是纯文本的，说得是。本来就已经很抽象了，最好弄点图表，就算用123列出来也好</p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2009-08-05 00:39:50.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[有关request.getSession参数(true或者false)的含义]]></title>
		<link>http://www.javawind.net/5b016f382218328f01223954d3680413.jhtml</link>
		<author>jastby</author>  
		<description><![CDATA[<p>session你可以认为是每一个IE进程对应一个会话（你新开一个IE进程就可以对应两个会话的）<br />
<br />
getSession都是返回当前用户的会话对象，参数的区别在于<br />
<br />
参数为true，则如果&ldquo;当前用户的会话对象&rdquo;为空（第一次访问时）则创建一个新的会话对象返回<br />
<br />
参数为false，则如果&ldquo;当前用户的会话对象&rdquo;为空，则返回null（即不自动创建会话对象）</p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2009-07-02 10:39:36.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[JSP中JavaBean应用步骤详解]]></title>
		<link>http://www.javawind.net/5b016f38218d0dea012210ef013e15fd.jhtml</link>
		<author>nbsven</author>  
		<description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 编写JSP动态网页设计时，怎么应用JavaBean呢？下面是对JavaBean的使用讲解，并根据UFO的一个JavaBean演示实例做详解，有兴趣的朋</p>
<p>友可以去<a href="http://www.gm365.com">www.gm365.com</a>下载最新版本的UFO，里面附带了近50个JSP、JavaBean、servlet的典型实例(针对中文用户)。</p>
<p>一、编写使用JavaBean的JSP文件，如UFO中的演示实例time.jsp:</p>
<p>&lt;%@ page contentType=&quot;text/html;Charset=GB2312&quot; %&gt;<br />
&lt;%@ page import=&quot;ufobean.ShowCalendar&quot; %&gt;<br />
&lt;HTML&gt;&lt;BODY&gt;<br />
&lt;jsp:useBean id=&quot;clock&quot; class=&quot;ufobean.ShowCalendar&quot; scope=&quot;page&quot; /&gt;<br />
&lt;Table border=4&gt;<br />
&lt;tr&gt;<br />
&nbsp; &lt;td align=&quot;center&quot;&gt;&lt;font color=&quot;blue&quot;&gt;&lt;jsp:getProperty name=&quot;clock&quot; property=&quot;year&quot;/&gt;&lt;/font&gt;年&lt;/td&gt;<br />
&nbsp; &lt;td&gt;&lt;jsp:getProperty name=&quot;clock&quot; property=&quot;month&quot;/&gt;月<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;jsp:getProperty name=&quot;clock&quot; property=&quot;dayOfMonth&quot;/&gt;日<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 星期&lt;jsp:getProperty name=&quot;clock&quot; property=&quot;day&quot;/&gt;<br />
&nbsp; &lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&nbsp; &lt;td&gt;当前时间为&lt;/td&gt;<br />
&nbsp; &lt;td&gt;&lt;jsp:getProperty name=&quot;clock&quot; property=&quot;time&quot;/&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&nbsp; &lt;td&gt;今天是今年的第&lt;/td&gt;<br />
&nbsp; &lt;td&gt;&lt;jsp:getProperty name=&quot;clock&quot; property=&quot;dayOfYear&quot;/&gt;天&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&nbsp; &lt;td&gt;本周是今年的第&lt;/td&gt;<br />
&nbsp; &lt;td&gt;&lt;jsp:getProperty name=&quot;clock&quot; property=&quot;weekOfYear&quot;/&gt;周&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&nbsp; &lt;td&gt;本周是本月的第&lt;/td&gt;<br />
&nbsp; &lt;td&gt;&lt;jsp:getProperty name=&quot;clock&quot; property=&quot;weekOfMonth&quot;/&gt;周&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/Table&gt;<br />
&lt;jsp:getProperty name=&quot;clock&quot; property=&quot;date&quot;/&gt;<br />
&lt;/BODY&gt;&lt;/HTML&gt;</p>
<p>在上面代码中的第二行&lt;%@ page import=&quot;ufobean.ShowCalendar&quot;%&gt;这个语句，意思是引入ufobean包以及包中的文件；其次要注意<br />
&lt;jsp:useBean id=&quot;clock&quot; class=&quot;ufobean.ShowCalendar&quot; scope=&quot;page&quot;/&gt;语句，其中id的值是自定义的，class值是包名加点再加JavaBean名，scope有几个值，默认值是page，另外还有session，application等等，这里用page。time.jsp多次用到&lt;jsp:getProperty&gt;，其作用是获取JavaBean(ShowCalendar)的属性值，显示在页面中 。</p>
<p>JavaBean(ShowCalendar.java)代码如下：<br />
package ufobean;<br />
import java.util.*;<br />
public class ShowCalendar{<br />
&nbsp;&nbsp; Calendar&nbsp; calendar = null;<br />
&nbsp;&nbsp; int year,dayOfMonth,dayOfYear,weekOfYear,<br />
&nbsp;&nbsp; weekOfMonth,dayOfWeek,hour,minute,second;<br />
&nbsp;&nbsp; String&nbsp; day,date,time;<br />
&nbsp;&nbsp; public ShowCalendar(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; calendar = Calendar.getInstance();<br />
&nbsp;&nbsp;&nbsp;&nbsp; Date time = new Date();<br />
&nbsp;&nbsp;&nbsp;&nbsp; calendar.setTime(time);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public int getYear(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; return calendar.get(Calendar.YEAR);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public String getMonth(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; int m=1+calendar.get(Calendar.MONTH);<br />
&nbsp;&nbsp;&nbsp;&nbsp; String months[]={&quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;, &quot;5&quot;, &quot;6&quot;, &quot;7&quot;, &quot;8&quot;, &quot;9&quot;, &quot;10&quot;, &quot;11&quot;, &quot;12&quot; };<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(m&gt;12) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;0&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return months[m-1];<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public String getDay(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; int n =getDayOfWeek();<br />
&nbsp;&nbsp;&nbsp;&nbsp; String days[]={&quot;日&quot;,&quot;一&quot;, &quot;二&quot;, &quot;三&quot;,&quot;四&quot;, &quot;五&quot;, &quot;六&quot;};<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(n&gt;7)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;星期？&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return days[n];<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public String getDate(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; getYear()+ &quot;/&quot; + getMonth()+&quot;/&quot;+getDayOfMonth();<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public String getTime(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; return getHour() + &quot;:&quot; + getMinute() + &quot;:&quot; + getSecond();<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public int getDayOfMonth(){ <br />
&nbsp;&nbsp;&nbsp;&nbsp; return calendar.get(Calendar.DAY_OF_MONTH);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public int getDayOfYear(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; return calendar.get(Calendar.DAY_OF_YEAR);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public int getWeekOfYear(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; return calendar.get(Calendar.WEEK_OF_YEAR);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public int getWeekOfMonth(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; return calendar.get(Calendar.WEEK_OF_MONTH);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public int getDayOfWeek(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; return calendar.get(Calendar.DAY_OF_WEEK)-1;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public int getHour(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; return calendar.get(Calendar.HOUR_OF_DAY);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public int getMinute(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; return calendar.get(Calendar.MINUTE);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public int getSecond(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; return calendar.get(Calendar.SECOND);<br />
&nbsp;&nbsp; }<br />
}</p>
<p>二、编译ShowCalendar.java文件<br />
&nbsp;&nbsp;&nbsp; 这里介绍在DOS下怎么编译JavaBean：开始&mdash;&mdash;运行&mdash;&mdash;输入cmd&mdash;&mdash;通过cd..或者cd进入到JavaBean(ShowCalendar.java)所在目录，然后输入命令：javac ShowCalendar.java后，就可以得到生成在ufobean包中的ShowCalendar.class字节文件了，到此编译完毕。 如果重新修改过JavaBean，那么要先把以前的旧的.class文件删除掉，然后重新编译JavaBean。</p>
<p>三、在UFO中访问time.jsp文件调用JavaBean<br />
1、在UFO原有的目录下运行time.jsp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp; a)、将time.jsp放置于UFO\webapps\ROOT目录下，将ShowCalendar.class放置于UFO\webapps\ROOT\WEB-INF\classes\ufobean目录下，<br />
启动UFO，输入如下地址<a href="http://localhost:80/time.jsp">http://localhost:80/time.jsp</a>,便可成功运行了。<br />
&nbsp; b)、将time.jsp放置于UFO\webapps\examples目录下，将ShowCalendar.class放置于UFO\webapps\examples\WEB-INF\classes\ufobean<br />
目录下，启动UFO，输入如下地址<a href="http://localhost:80/examples/time.jsp">http://localhost:80/examples/time.jsp</a>,就OK了。 <br />
2、自己在webapps目录下建立新目录<br />
&nbsp;&nbsp;&nbsp; 建立目录的时候要注意：文件夹名是WEB-INF，而不是WEN_INF，注意中间的横杠要写对；文件夹名是classes而不是class；classes下的包名也得注意，它是跟你JavaBean里所起的包名相同，比如，你在JavaBean文件中有以下语句：import ufobean；就意味着你引入了名为ufobean的包，那么在classes文件夹下的包名（文件夹名）应该是ufobean了。剩余步骤对比1、b)中的方法做就OK了。</p>
<p>四、整个jsp使用JavaBean的过程就是这样，大家都会了吧。</p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2009-06-24 14:23:34.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[从Java的角度理解设计模式（连载）]]></title>
		<link>http://www.javawind.net/5b016f38218d0dea0121f75d5cfa11a2.jhtml</link>
		<author>jiameng198</author>  
		<description><![CDATA[<div class="t_msgfont" id="postmessage_153869">从Java的角度理解设计模式1：什么是重构 <br />
<br />
MF在《重构》一书中是这样定义重构的：重构是这样一个过程，在不改变代码外在行为的前提下，对代码作出修改，以改进程序的内部结构。重构是一种有纪律的、经过训练的、有条不紊的程序整理方法，可以将整理过程中不小心引入错误的机率降到最低。本质上说，重构就是在代码写好之后改进它的设计。 <br />
通常，软件开发总是先设计后编码，然而难免地，程序员编码风格的随意性、系统庞大化等诸多因素，导致代码质量将变得愈发难以控制。重构使得即使在面对糟糕设计，甚至是代码一片混乱的情况下，也能逐步改良代码的设计。大多数重构的步骤非常简单，比如为一个方法添加一个参数（Refactoring：Add Parameter）、（在类间）搬动一个方法（Refactoring ：Move Method）、在类阶层中上下迁移代码：如值域（Refactoring ：Push Up/Down Field）。然而正是这些微小的步骤，保障了代码朝着优良的结构持续演变，或者说不会日益&ldquo;腐烂&rdquo;。 <br />
此外，重构的工作方法也使得所谓的精心设计不再如此举足轻重了，因为设计可以在持续重构中得到强化。 <br />
如下展示了一个非常简单的重构，它采用了（Refactoring：Add Parameter）： <br />
private void mainTestBody() { <br />
ApplicationContext context = <br />
new ClassPathXmlApplicationContext(&quot;ch6/prototype/setter-injection.xml&quot;); <br />
BookList booklist = (BookList)context.getBean(&quot;bookList&quot;); <br />
Book[] books = booklist.findBooksWrittenBy(&quot;天下霸唱&quot;); <br />
assertEquals(&quot;鬼吹灯&quot;,books[0].getName()); <br />
} <br />
<br />
<br />
private void mainTestBody(String configMetadata) { <br />
ApplicationContext context = <br />
new ClassPathXmlApplicationContext(configMetadata); <br />
BookList booklist = (BookList)context.getBean(&quot;bookList&quot;); <br />
Book[] books = booklist.findBooksWrittenBy(&quot;天下霸唱&quot;); <br />
assertEquals(&quot;鬼吹灯&quot;,books[0].getName()); <br />
} <br />
本书对于重构剖析的侧重点有两个：一个是如何将重构应用于Java模式和框架设计的编程中；一个则是如何利用自动化重构工具对代码实施重构（当然并不是所有的重构技巧都得到工具支持）。</div>
<div class="t_msgfont"><br />
本书对重构提供的阅读方法是：本章将会列出所有本书中用到的重构技巧名录（按字母顺序排列），而在后续各个章节中，对这些重构技巧的应用时机和方法会有更贴近实际的讲解；关于自动化重构工具的使用仅在本章列出，在后续章节中如果希望得到自动化的重构指导（对于每个重构技巧，如果自动化重构工具支持的话，都会有相应的指导），可参考本章。</div>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2009-06-19 15:13:59.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[jstl之数字、日期格式化---fmt:formatNumber,fmt:formatDate]]></title>
		<link>http://www.javawind.net/5b016f38218d0dea0121ce823b330acf.jhtml</link>
		<author>jastby</author>  
		<description><![CDATA[<p><a target="_blank" href="Upload/2009-06/11_1647_9D6FC0E.jpg"><img alt="点击在新窗口打开" border="0" onload="reSizeImg(this);" src="http://www.javawind.net/Upload/2009-06/11_1647_9D6FC0E.jpg" /></a></p>
<div class="codeText">
<div class="codeHead"><span class="right"><label onclick="RunCode('2009061116490629');">运行</label>&nbsp;<label onclick="CopyCode('2009061116490629');">复制</label>&nbsp;<label onclick="SaveCode('2009061116490629');">保存</label>&nbsp;</span>xhtml<strong>代码</strong></div>
<div id="2009061116490629">
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span>%@&nbsp;page&nbsp;</span><span class="attribute">language</span><span>=</span><span class="attribute-value">&quot;java&quot;</span><span>&nbsp;</span><span class="attribute">contentType</span><span>=</span><span class="attribute-value">&quot;text/html;&nbsp;charset=gb18030&quot;</span><span>%</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>
    <li><span class="tag">&lt;</span><span>%@&nbsp;taglib&nbsp;</span><span class="attribute">uri</span><span>=</span><span class="attribute-value">&quot;http://java.sun.com/jsp/jstl/fmt&quot;</span><span>&nbsp;</span><span class="attribute">prefix</span><span>=</span><span class="attribute-value">&quot;fmt&quot;</span><span>&nbsp;%</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;</span><span>%@&nbsp;taglib&nbsp;</span><span class="attribute">uri</span><span>=</span><span class="attribute-value">&quot;http://java.sun.com/jsp/jstl/core&quot;</span><span>&nbsp;</span><span class="attribute">prefix</span><span>=</span><span class="attribute-value">&quot;c&quot;</span><span>&nbsp;%</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>My&nbsp;JSP&nbsp;'fmt.jsp'&nbsp;starting&nbsp;page</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li><span>&nbsp;&nbsp; &nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">c:set</span><span>&nbsp;</span><span class="attribute">var</span><span>=</span><span class="attribute-value">&quot;salary&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;3540.2301&quot;</span><span class="tag">/&gt;</span><span>&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">c:set</span><span>&nbsp;</span><span class="attribute">var</span><span>=</span><span class="attribute-value">&quot;total&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;56225.2301&quot;</span><span class="tag">/&gt;</span><span>&nbsp;</span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">fmt:setLocale</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;en_US&quot;</span><span class="tag">/&gt;</span><span>&nbsp;</span></li>
    <li class="alt"><span>currency:</span><span class="tag">&lt;</span><span class="tag-name">fmt:formatNumber</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;${salary}&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;currency&quot;</span><span>&nbsp;</span><span class="attribute">currencyCode</span><span>=</span><span class="attribute-value">&quot;USD&quot;</span><span class="tag">/&gt;</span><span class="tag">&lt;</span><span class="tag-name">br</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li><span>percent:</span><span class="tag">&lt;</span><span class="tag-name">fmt:formatNumber</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;${salary/total}&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;percent&quot;</span><span>&nbsp;</span><span class="attribute">maxFractionDigits</span><span>=</span><span class="attribute-value">&quot;4&quot;</span><span class="tag">/&gt;</span><span class="tag">&lt;</span><span class="tag-name">br</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">hr</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li><span class="tag">&lt;</span><span class="tag-name">jsp:useBean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;now&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;java.util.Date&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">jsp:useBean</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">fmt:setLocale</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;zh_CN&quot;</span><span class="tag">/&gt;</span><span>&nbsp;</span></li>
    <li><span>full--</span><span class="tag">&amp;gt;</span><span class="tag">&lt;</span><span class="tag-name">fmt:formatDate</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;${now}&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;both&quot;</span><span>&nbsp;</span><span class="attribute">dateStyle</span><span>=</span><span class="attribute-value">&quot;full&quot;</span><span>&nbsp;</span><span class="attribute">timeStyle</span><span>=</span><span class="attribute-value">&quot;full&quot;</span><span class="tag">/&gt;</span><span class="tag">&lt;</span><span class="tag-name">br</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li class="alt"><span>long--</span><span class="tag">&amp;gt;</span><span class="tag">&lt;</span><span class="tag-name">fmt:formatDate</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;${now}&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;both&quot;</span><span>&nbsp;</span><span class="attribute">dateStyle</span><span>=</span><span class="attribute-value">&quot;long&quot;</span><span>&nbsp;</span><span class="attribute">timeStyle</span><span>=</span><span class="attribute-value">&quot;long&quot;</span><span class="tag">/&gt;</span><span class="tag">&lt;</span><span class="tag-name">br</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li><span>medium--</span><span class="tag">&amp;gt;</span><span class="tag">&lt;</span><span class="tag-name">fmt:formatDate</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;${now}&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;both&quot;</span><span>&nbsp;</span><span class="attribute">dateStyle</span><span>=</span><span class="attribute-value">&quot;medium&quot;</span><span>&nbsp;</span><span class="attribute">timeStyle</span><span>=</span><span class="attribute-value">&quot;medium&quot;</span><span class="tag">/&gt;</span><span class="tag">&lt;</span><span class="tag-name">br</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li class="alt"><span>default--</span><span class="tag">&amp;gt;</span><span class="tag">&lt;</span><span class="tag-name">fmt:formatDate</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;${now}&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;both&quot;</span><span>&nbsp;</span><span class="attribute">dateStyle</span><span>=</span><span class="attribute-value">&quot;default&quot;</span><span>&nbsp;</span><span class="attribute">timeStyle</span><span>=</span><span class="attribute-value">&quot;default&quot;</span><span class="tag">/&gt;</span><span class="tag">&lt;</span><span class="tag-name">br</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li><span>short--</span><span class="tag">&amp;gt;</span><span class="tag">&lt;</span><span class="tag-name">fmt:formatDate</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;${now}&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;both&quot;</span><span>&nbsp;</span><span class="attribute">dateStyle</span><span>=</span><span class="attribute-value">&quot;short&quot;</span><span>&nbsp;</span><span class="attribute">timeStyle</span><span>=</span><span class="attribute-value">&quot;short&quot;</span><span class="tag">/&gt;</span><span class="tag">&lt;</span><span class="tag-name">br</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
    <li><span>&nbsp;</span></li>
    <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;</span></li>
</ol>
</div>
</div>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2009-06-11 16:49:49.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[Servlet引擎的内部工作]]></title>
		<link>http://www.javawind.net/5b016f38218d0dea0121bdf734250857.jhtml</link>
		<author>菜鸟</author>  
		<description><![CDATA[<p>可以把Servlet引擎看成是Servlet代码的容器,就像Web浏览器是小程序代码的容器一样. <br />
Servlet引擎进行许多工作,能大大简化编程人员工作.下面是使用标准纯种模型时Servlet的生命周期.</p>
<p>1.创建Servlet实例. <br />
Servlet引擎装入JAVA类,在Servlet引擎启动时或首次请求特定Servlet时创建Servlet实例.发生时间取决于特定Servlet的设置.通常Servlet引擎只生成Servlet对象的一个备份,每次请求时复用这个对象,即使同时处理多个请求.这种方法可以节省对每个请求生成新的对象的时间,但需要在编程时认真计划.替换方法见&quot;单线程模型&quot;.</p>
<p>2.实例初始化. <br />
Servlet引擎调用Servlet的init()方法.利用此方法,通常要设置Servlet周期中的常量参数,如文件路径和数据库连接池.实例初始化之后,放在内存中,直到收到请求.</p>
<p>3.请求处理. <br />
Servlet引擎收到的每个请求由单独的Java线程处理.Servlet引擎可能创建新线程,也可能从池中分配一个线程.线程创建请求并响应对象,然后调用Servlet的service()方法.service()方法确定如何处理请求.</p>
<p>4.线程管理. <br />
多个线程可以同时执行一个对象的方法,各有自己的请求与响应对象.将代码设计成线程安全是Servlet编程的主要部分.</p>
<p>5.其它服务 <br />
Servlet引擎提供的典型服务是对话跟踪,使程序可以跟踪属于特定用户的数据.</p>
<p>6.实例删除 <br />
Servlet引擎需要安全关闭时,或需要恢复内存时,调用Servlet的destroy()方法.这时Servlet可以关闭文件并优雅地关闭.</p>
<p>Servlet引擎向Servlet提供的服务之一是管理标准输出System.out与System.err.这些输出流的文本输出定向到日志.文件的具体地址随Servlet引擎的不同而不同.向这些输出流写入信息时,记住,其他Servlet可能也在写入数据,因此一定要标好消息,以区别其来自哪个Servlet.</p>
<p>Servlet API <br />
javax.servlet  基本一般化Servlet API包 <br />
javax.servlet.http web页面专用扩展 <br />
javax.servlet.jsp 创建JavaServer Pages的类 <br />
javax.servlet.jsp.tagext jsp类专用扩展</p>
<p>javax.servlet包中的几个接口定义提供整个API的基本结构.最常用的接口包括: <br />
Servlet 这个接口定义所有Servlet都要实现的方法.GenericServlet类实现Servlet的接口. <br />
ServletRequest 关于客户机请求的所有信息可以通过实现这个接口的对象访问.Servlet引擎负责创建ServletRequest对象. <br />
ServletResponse Servlet引擎要创建实现这个接口的对象和传入的Servlet的service方法,用于向客户机输出MIME体. <br />
除了上述接口之外,javax.servlet包还有下实用程序接口 <br />
RequestDispatcher <br />
ServletConfig <br />
ServletContext <br />
SingleThreadModel <br />
... <br />
... <br />
一种资源管理方法是对象池,这对需要较多时间创建而又占用较少资源的对象特别有用.数据库连接通常用对象池管理.</p>
<p>在Servlet启动时创建指定最小个数的连接对象. <br />
Servlet需要数据库连接时,从池管理器中请求.如果池中连接已经用光,且池中个数小于最大值,则创建新连接.如果池中个数等于最大值而池中连接已经用光,则Servlet线程受阻,直到能使用一个连接对象.</p>
<p>基本Servlet的生命周期有三个阶段:初始化,响应请求和断裂.</p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2009-06-08 11:44:03.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[JSP application用法]]></title>
		<link>http://www.javawind.net/5b016f3821546d3601217b6e93e9068c.jhtml</link>
		<author>jastby</author>  
		<description><![CDATA[<p>application、session、request、page他们的使用方法基本上都是一致的，只不过作用范围不一样而已：</p>
<p>application：全局作用范围，整个应用程序共享，就是在部署文件中的同一个webApp共享，生命周期为：应用程序启动到停止。 <br />
session：会话作用域，当用户首次访问时，产生一个新的会话，以后服务器就可以记住这个会话状态。生命周期：会话超时，或者服务器端强制使会话失效。 <br />
request：请求作用域，就是客户端的一次请求。 <br />
page：一个JSP页面。</p>
<p>服务器启动后就产生了这个application对象，当客户再所访问的网站的各个页面之间浏览时，这个application对象都是同一个，直到服务 器关闭。但是与session不同的是，所有客户的application对象都是同一个，即所有客户共享这个内置的application对象。<br />
&lt;%@page contentType=&quot;text/html;charset=GB2312&quot;%&gt;<br />
&lt;html&gt;<br />
&lt;head&gt; &lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;center&gt;<br />
&lt;font size=&quot;5&quot;&gt;application对象的使用&lt;/font&gt;<br />
&lt;hr/&gt;<br />
&lt;%<br />
Object o = null;<br />
String strNum = (String) application.getAttribute(&quot;Num&quot;); //与session相同<br />
int Num = 0;<br />
if (strNum != null)<br />
Num = Integer.parseInt(strNum) + 1;<br />
application.setAttribute(&quot;Num&quot;, String.valueOf(Num));<br />
%&gt;<br />
application对象中的<br />
&lt;font color=&quot;blue&quot;&gt;Num&lt;/font&gt;<br />
变量值为：<br />
&lt;font color=&quot;red&quot;&gt;&lt;%=Num %&gt; &lt;/font&gt;<br />
&lt;br/&gt;<br />
&lt;/center&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>1返回由name指定的名字的application对象的属性的值．<br />
2. getAttributeNames()<br />
返回所有的application对象的属性的名字，其结果是一个枚举的实例．<br />
3. getInitParameter( String name )<br />
返回由name指定的名字的application对象的某个属性的初始值．<br />
4. getServletInfo()<br />
返回servlet编译器的版本的信息．<br />
5. setAttribute( String name , Object object )<br />
设置由name指定的名字的application对象的属性的值object.</p>
<p>需要说明的是在一个所用范围内setAttruibute时请尽量不要多次set同一个对象ID，以防止对象所保存的信息被改变而无用。（但某些情况下这恰恰是有用处的！）</p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2009-05-26 13:39:52.0</pubDate> 
	</item>
	
	<item>
		<title><![CDATA[ServletContext与ServletConfig分析]]></title>
		<link>http://www.javawind.net/5b016f3821546d3601217b6d1dc4068b.jhtml</link>
		<author>jastby</author>  
		<description><![CDATA[<p>对于web容器来说，ServletContext接口定义了一个servlet环境对象，这个对象定义了一个在servlet引擎上的servlet的视图。通过使用这个对象，servlet可以记录事件，得到资源并得到来自servlet的引擎类。</p>
<p>servlet容器在启动时会加载web应用，并为每个web应用创建唯一的servlet context对象，可以把ServletContext看成是一个Web应用的服务器端组件的共享内存，在ServletContext中可以存放共享 数据，他提供了4个读取和设置共享数据的方法。具体见api帮助文档。</p>
<p>另外，ServletContext对象只在web应用被关闭的时候才被销毁，不同的web应用，ServletContext各自独立存在。</p>
<p>一个web应用由jsp,servlet，javabean等web组件的集合构成，每一个web应用，容器都会有一个背景对象，而 javax.servlet.ServletContext接口就提供了访问这个背景对象的途径。你可以通过一个servlet实例的 getServletContext()方法得到该servlet运行其中的这个背景对象，从这个背景对象中你可以访问如下信息资源：<br />
1.初始化参数<br />
2.存储在背景中的对象<br />
3.与背景关联的资源<br />
4.日志</p>
<p>最后针对ServletContext我自己的总结是：<br />
ServletContext即servlet容器，其内提供的方法可以在同一web应用下的所有servlet中被使用</p>
<p>而对于config对象来说，他与context相比，就有了很大的局限性。<br />
当ServletConfig对象在servlet中被实例化后，对任何客户端在任何时候访问有效。但是一个servlet的ServletConfig 对象不能被另一个servlet访问，也就是说，在本servlet声明后的ServletConfig只能在本servlet内被访问，属于内部持久有 效的变量。</p>
<p>下有一例，可供深刻理解：</p>
<p>一般来说，对整个应用的配置，为了不使用&ldquo;硬编码&rdquo;，应该配置为ServletContext参数，比如字符集设定。<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以后的标准格式，旧容器（引擎）采用服务商自己的格式配置。注意它的父元素应该是&lt;web-app&gt;也就是说它是对一个应用作用的。</p>
<p>而如果只有一个特定的servlet要设定的参数，其它servlet不能共享，应该配置为ServletConfig参数，如一个读取附件的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这个servlet中才能取到path,而别的Servlet是不能取到的。</p>
<p>前面我们讲了对这连个属性的认识，下面让我们来共同学习一下，如何获取这两个对象的参数：</p>
<p>访问ServletConfig参数：<br />
首先要取得ServletConfig对象，然后调用它的getInitParameter();方法。要访问ServletConfig对象，jsp中直接使用config内置对象，但因为你的JSP编译后的servlet一般不会被加到web.xml中的，所以一般不会通过jsp来取对本JSP编译后的servlet的配置参数，那么在servlet中要得到ServletConfig对象有两种方法：</p>
<p>在inii()方法中取到：通过init的重载方法传递</p>
<p>.....<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的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 />
}</p>
<p>通过getServletConfig()方法直接到时，这样做的好处是不必调手工传递属性，想在任何时候都可以得到。</p>
<p>还有第三种方法，要自己实现一些接口，这里作为一般讨论就不介绍了。<br />
要访问ServletContext对象，只要从现有的ServletConfig对象getServletContext（）就可以了，然后\r调用它的getInitParameter()方法就可以获取它的参数。</p>
<p>按说：ServletContext对象的作用域比ServletConfig作用域大，为什么要从ServletConfig中到得ServletContext对象呢？我个人认为：容器保存了很多个ServletContext对象，请求时容器到底取哪一个\r给你呢？那就取其中包 含ServletConfig信息的那个给你，就是说取ServletConfig对象的父级对象。就好象HttpSession要从requset中取 得一样，就是取那个包含当前request对象的session对象给你，这只是我的个人想法，还没有来得及看具体实现。反正就这么用吧。</p>]]></description>
		<category><![CDATA[2]]></category>
		<pubDate>2009-05-26 13:38:17.0</pubDate> 
	</item>
		
	</channel>
</rss>