﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-新青年-随笔分类-Java/J2EE</title><link>http://www.cnitblog.com/canny/category/6441.html</link><description>放飞梦想 持续优化 追求完美</description><language>zh-cn</language><lastBuildDate>Sat, 01 Oct 2011 05:56:36 GMT</lastBuildDate><pubDate>Sat, 01 Oct 2011 05:56:36 GMT</pubDate><ttl>60</ttl><item><title>Tomcat设置虚拟目录的方法, 不修改server.xml</title><link>http://www.cnitblog.com/canny/archive/2007/11/08/36017.html</link><dc:creator>新青年</dc:creator><author>新青年</author><pubDate>Thu, 08 Nov 2007 08:49:00 GMT</pubDate><guid>http://www.cnitblog.com/canny/archive/2007/11/08/36017.html</guid><wfw:comment>http://www.cnitblog.com/canny/comments/36017.html</wfw:comment><comments>http://www.cnitblog.com/canny/archive/2007/11/08/36017.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/canny/comments/commentRss/36017.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/canny/services/trackbacks/36017.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">在tomcat文件夹的<strong>conf\catalina\localhost</strong>(对于Tomcat6版本及其以上，需要自己创建catalina和localhost这两个文件夹)</font>
		</p>
		<p>
				<font size="2">增加project</font>
				<font size="2">.xml文件（该文件名的project要和下面的“path=“/xxx"”的xxx相同）<br /></font>
				<font size="2">文件内容: </font>
		</p>
		<p>
				<font size="2">&lt;Context path="/project" reloadable="true" docBase="E:\javastudio\oob" workDir="E:\javastudio\oob\work" /&gt;<br />//docBase是项目文件夹的<strong>web-inf文件夹的上一层目录</strong></font>
		</p>
		<p>
				<font size="2">//workDir是指Tomcat解析Jsp转换为Java文件，并编译为class存放的文件夹，设置在项目文件夹里面，可以避免移植到其他地方首次读取jsp文件需要重新解析</font>
				<font size="2">。<strong>一般格式：项目文件夹\work</strong></font>
		</p>
		<p>
				<font size="2">//reloadable是指可以重新加载，<strong>一般设置为true</strong>，方便使用，不需要经常重启Tomcat。</font>
		</p>
		<p>
				<font size="2">以后启动Tomcat，在浏览器输入<a href="http://localhost:8080/project">http://localhost:8080/project</a>就能访问该项目的welcome文件。</font>
		</p>
<img src ="http://www.cnitblog.com/canny/aggbug/36017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/canny/" target="_blank">新青年</a> 2007-11-08 16:49 <a href="http://www.cnitblog.com/canny/archive/2007/11/08/36017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断ResultSet结果集的记录数是否为0的折衷解决方案</title><link>http://www.cnitblog.com/canny/archive/2007/11/08/36015.html</link><dc:creator>新青年</dc:creator><author>新青年</author><pubDate>Thu, 08 Nov 2007 08:28:00 GMT</pubDate><guid>http://www.cnitblog.com/canny/archive/2007/11/08/36015.html</guid><wfw:comment>http://www.cnitblog.com/canny/comments/36015.html</wfw:comment><comments>http://www.cnitblog.com/canny/archive/2007/11/08/36015.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/canny/comments/commentRss/36015.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/canny/services/trackbacks/36015.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在网上看到许多判断ResultSet结果集的记录数是否为0的方法都需要结果集next移动，虽然有的说不移动，使用isBeforeFirst函数（获取光标是否位于此 <code>ResultSet</code> 对象的第一行之前），但是我认为光标初始时就是在第一行之前，所以没有意义。</p> <p>考虑到如果next移动了，需要后退，ResultSet则要设置</p> <p><code><b>TYPE_SCROLL_INSENSITIVE</b></code><br>该常量指示可滚动但通常不受 <code>ResultSet</code> 底层数据更改影响的 <code>ResultSet</code> 对象的类型。 <p><code><b>或</b></code></p> <p><code><b>TYPE_SCROLL_SENSITIVE</b></code><br>该常量指示可滚动并且通常受 <code>ResultSet</code> 底层数据更改影响的 <code>ResultSet</code> 对象的类型。</p> <p>挺麻烦，后来看到一个折衷的解决方案，希望对大家有帮助：</p><pre class="csharpcode"><font size="1"><span class="kwrd">if</span>  ( rs.next())   
{
     <span class="rem">// 记录数不为0</span>
}
 <span class="kwrd">else</span>   
{
    <span class="rem">//记录数为0</span>
}
      
如果判断后需要依次读取，则可以参考下面代码
    
<span class="kwrd">if</span>(rs.next())   
{   
     <span class="kwrd">do</span> {   
        str = rs.getString(1);
        ...
     }<span class="kwrd">while</span>(rs.next());   
}   
<span class="kwrd">else</span>   
{   
      System.<span class="kwrd">out</span>.println(<span class="str">"暂无记录"</span>);   
}</font></pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style><img src ="http://www.cnitblog.com/canny/aggbug/36015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/canny/" target="_blank">新青年</a> 2007-11-08 16:28 <a href="http://www.cnitblog.com/canny/archive/2007/11/08/36015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 日期格式化及其使用例子收集</title><link>http://www.cnitblog.com/canny/archive/2007/11/04/35804.html</link><dc:creator>新青年</dc:creator><author>新青年</author><pubDate>Sun, 04 Nov 2007 11:20:00 GMT</pubDate><guid>http://www.cnitblog.com/canny/archive/2007/11/04/35804.html</guid><wfw:comment>http://www.cnitblog.com/canny/comments/35804.html</wfw:comment><comments>http://www.cnitblog.com/canny/archive/2007/11/04/35804.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/canny/comments/commentRss/35804.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/canny/services/trackbacks/35804.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 突然需要Java的时间日期格式化的例子，经过一番搜索，现在把较为有用的例子收集，以便日后使用！<br>其中包括数据库的日期输出和插入，格式化小数，字符串和日期的转换等！&nbsp;&nbsp;<a href='http://www.cnitblog.com/canny/archive/2007/11/04/35804.html'>阅读全文</a><img src ="http://www.cnitblog.com/canny/aggbug/35804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/canny/" target="_blank">新青年</a> 2007-11-04 19:20 <a href="http://www.cnitblog.com/canny/archive/2007/11/04/35804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]为什么要始终使用PreparedStatement代替Statement?</title><link>http://www.cnitblog.com/canny/archive/2007/10/27/35471.html</link><dc:creator>新青年</dc:creator><author>新青年</author><pubDate>Sat, 27 Oct 2007 12:22:00 GMT</pubDate><guid>http://www.cnitblog.com/canny/archive/2007/10/27/35471.html</guid><wfw:comment>http://www.cnitblog.com/canny/comments/35471.html</wfw:comment><comments>http://www.cnitblog.com/canny/archive/2007/10/27/35471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/canny/comments/commentRss/35471.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/canny/services/trackbacks/35471.html</trackback:ping><description><![CDATA[<strong> <p><br></strong>在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement.<br>基于以下的原因:<br><strong>一.代码的可读性和可维护性</strong>.<br>虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:<br>stmt.executeUpdate("insert&nbsp;into&nbsp;tb_name&nbsp;(col1,col2,col2,col4)&nbsp;values&nbsp;('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");<br>perstmt&nbsp;=&nbsp;con.prepareStatement("insert&nbsp;into&nbsp;tb_name&nbsp;(col1,col2,col2,col4)&nbsp;values&nbsp;(?,?,?,?)");<br>perstmt.setString(1,var1);<br>perstmt.setString(2,var2);<br>perstmt.setString(3,var3);<br>perstmt.setString(4,var4);<br>perstmt.executeUpdate();<br>不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心.</p> <p><br><strong>二.PreparedStatement尽最大可能提高性能</strong>.<br>每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如:<br>insert&nbsp;into&nbsp;tb_name&nbsp;(col1,col2)&nbsp;values&nbsp;('11','22');<br>insert&nbsp;into&nbsp;tb_name&nbsp;(col1,col2)&nbsp;values&nbsp;('11','23');<br>即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.<br>当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句.</p> <p><br><strong>三.最重要的一点是极大地提高了安全性</strong>.<br>即使到目前为止,仍有一些人连基本的恶义SQL语法都不知道.<br>String&nbsp;sql&nbsp;=&nbsp;"select&nbsp;*&nbsp;from&nbsp;tb_name&nbsp;where&nbsp;name=&nbsp;'"+varname+"'&nbsp;and&nbsp;passwd='"+varpasswd+"'";<br>如果我们把['&nbsp;or&nbsp;'1'&nbsp;=&nbsp;'1]作为varpasswd传入进来.用户名随意,看看会成为什么?<br>select&nbsp;*&nbsp;from&nbsp;tb_name&nbsp;=&nbsp;'随意'&nbsp;and&nbsp;passwd&nbsp;=&nbsp;''&nbsp;or&nbsp;'1'&nbsp;=&nbsp;'1';<br>因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者:<br>把[';drop&nbsp;table&nbsp;tb_name;]作为varpasswd传入进来,则:<br>select&nbsp;*&nbsp;from&nbsp;tb_name&nbsp;=&nbsp;'随意'&nbsp;and&nbsp;passwd&nbsp;=&nbsp;'';drop&nbsp;table&nbsp;tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行.<br>而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.</p> <p>转自<a title="http://blog.csdn.net/Sammy_chan/archive/2007/10/23/1840424.aspx" href="http://blog.csdn.net/Sammy_chan/archive/2007/10/23/1840424.aspx">http://blog.csdn.net/Sammy_chan/archive/2007/10/23/1840424.aspx</a></p><img src ="http://www.cnitblog.com/canny/aggbug/35471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/canny/" target="_blank">新青年</a> 2007-10-27 20:22 <a href="http://www.cnitblog.com/canny/archive/2007/10/27/35471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的引用传递</title><link>http://www.cnitblog.com/canny/archive/2007/10/27/35463.html</link><dc:creator>新青年</dc:creator><author>新青年</author><pubDate>Sat, 27 Oct 2007 08:31:00 GMT</pubDate><guid>http://www.cnitblog.com/canny/archive/2007/10/27/35463.html</guid><wfw:comment>http://www.cnitblog.com/canny/comments/35463.html</wfw:comment><comments>http://www.cnitblog.com/canny/archive/2007/10/27/35463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/canny/comments/commentRss/35463.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/canny/services/trackbacks/35463.html</trackback:ping><description><![CDATA[
		<p>
				<strong>
						<em>
								<font color="#ff0000">引用传递---对象作为参数</font>
						</em>
				</strong>
		</p>
		<p>如果在方法中把对象（或数组）作为参数，方法调用时，参数传递的是对象的引用（地址），即在方法调用时，实际参数把对对象的引用（地址）传递给形式参数。这是实际参数与形式参数指向同一个地址，即同一个对象（数组），方法执行时，对形式参数的改变实际上就是对实际参数的改变，这个结果在调用结束后被保留了下来。<br />class Book{<br />    String name;<br />    private folat price;<br />    Book(String n,    float ){                //构造方法<br />        name = n;<br />        price = p;<br />    }<br />    static  void  change(Book a_book,    String n,    float p){    //静态方法，对象作为参数<br />            a_book.name = n;<br />            a_book.price = p;<br />    }<br />    public void output(){        //实例方法，输出对象信息<br />        System.out.println("name: " + name + "\t" + "price: " + price);<br />    }<br />}<br /> public class PassAddr{<br />    public static void main(String [] args){<br />        Book b = new Book("java2",    32.5f);<br />        System.out.print("before call:\t");        //调用前<br />        b.output();<br />        b.change(b,    "c++",    45.5f);            //引用传递，传递对象b的引用，修改对象b的值<br />        System.out.print("after call:\t");            //调用后<br />        b.output();<br />    }<br />}<br />运行结果：<br />        before    call:    name:java2        price:32.5<br />        after       call:    name:c++          price:45.5<br />说明：调用change(b,"c++",45.5f)时，对象b作为实际参数，把引用传递给相应的形式参数a_book,实际上a_book也指向同一个对象，即该对象有两个引用名：b和a_book。在执行方法change()时，对形式参数a_book操作就是对实际参数b的操作。</p>
		<p>摘自<a title="http://www.blogjava.net/jiafang83/archive/2007/10/23/155412.html" href="http://www.blogjava.net/jiafang83/archive/2007/10/23/155412.html">http://www.blogjava.net/jiafang83/archive/2007/10/23/155412.html</a></p>
<img src ="http://www.cnitblog.com/canny/aggbug/35463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/canny/" target="_blank">新青年</a> 2007-10-27 16:31 <a href="http://www.cnitblog.com/canny/archive/2007/10/27/35463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>