??xml version="1.0" encoding="utf-8" standalone="yes"?>久久亚洲国产精品五月天婷,久久久久久亚洲精品成人,亚洲人成网站在线播放2019http://www.tkk7.com/alinglau36/category/38704.htmlone platform thousands thinkingzh-cnSat, 26 Jan 2013 19:32:07 GMTSat, 26 Jan 2013 19:32:07 GMT60http://java.dzone.com/articles/immutability-with-builder-design-patternhttp://www.tkk7.com/alinglau36/archive/2013/01/25/394783.htmllaulauFri, 25 Jan 2013 10:16:00 GMThttp://www.tkk7.com/alinglau36/archive/2013/01/25/394783.htmlhttp://www.tkk7.com/alinglau36/comments/394783.htmlhttp://www.tkk7.com/alinglau36/archive/2013/01/25/394783.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/394783.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/394783.htmlhttp://java.dzone.com/articles/immutability-with-builder-design-pattern

lau 2013-01-25 18:16 发表评论
]]>
Hibernate中get和loadҎ的区?/title><link>http://www.tkk7.com/alinglau36/archive/2009/06/10/281088.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Wed, 10 Jun 2009 03:10:00 GMT</pubDate><guid>http://www.tkk7.com/alinglau36/archive/2009/06/10/281088.html</guid><wfw:comment>http://www.tkk7.com/alinglau36/comments/281088.html</wfw:comment><comments>http://www.tkk7.com/alinglau36/archive/2009/06/10/281088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/alinglau36/comments/commentRss/281088.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/alinglau36/services/trackbacks/281088.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="3"><span style="font-family: 宋体;">q次我们来谈一?/span><font face="Times New Roman"><strong><span style="color: #99cc00;">Hibernate3.2</span></strong> Session</font><span style="font-family: 宋体;">加蝲数据?/span><font face="Times New Roman">get</font><span style="font-family: 宋体;">?/span><font face="Times New Roman">load</font><span style="font-family: 宋体;">Ҏ的区别,其实q个在网上有很多的论qͼ可大多语焉不详或l不起实늚推敲Q让很多初学者学的满腹疑H,现在我给大家讲解一下:</span></font></p> <p style="margin: 0cm 0cm 0pt; text-indent: 17.95pt;"><font size="3"><font face="Times New Roman">1. </font><span style="font-family: 宋体;">对于</span><font face="Times New Roman">get</font><span style="font-family: 宋体;">ҎQ?/span><font face="Times New Roman">hibernate</font><span style="font-family: 宋体;">会确认一下该</span><font face="Times New Roman">id</font><span style="font-family: 宋体;">对应的数据是否存在,首先?/span><font face="Times New Roman">session</font><span style="font-family: 宋体;">~存中查找,然后在二U缓存中查找Q还没有查询数据库Q数据库中没有就q回</span><font face="Times New Roman">null</font><span style="font-family: 宋体;">。这个相Ҏ较简单,也没有太大的争议。主要要说明的一点就是在q个版本?/span><font face="Times New Roman">get</font><span style="font-family: 宋体;">Ҏ也会查找二~存Q?/span></font></p> <p style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><font size="3"><font face="Times New Roman">2. load</font><span style="font-family: 宋体;">Ҏ加蝲实体对象的时候,Ҏ映射文g上类U别?/span><font face="Times New Roman">lazy</font><span style="font-family: 宋体;">属性的配置</span><font face="Times New Roman">(</font><span style="font-family: 宋体;">默认?/span><font face="Times New Roman">true)</font><span style="font-family: 宋体;">Q分情况讨论Q?/span></font></p> <p style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><font size="3"><font face="Times New Roman">(1)</font><span style="font-family: 宋体;">若ؓ</span><font face="Times New Roman">true,</font><span style="font-family: 宋体;">则首先在</span><font face="Times New Roman">Session</font><span style="font-family: 宋体;">~存中查找,看看?/span><font face="Times New Roman">id</font><span style="font-family: 宋体;">对应的对象是否存在,不存在则使用延迟加蝲Q返回实体的代理cd?/span><font face="Times New Roman">(</font><span style="font-family: 宋体;">该代理类为实体类的子c,?/span><font face="Times New Roman">CGLIB</font><span style="font-family: 宋体;">动态生?/span><font face="Times New Roman">)</font><span style="font-family: 宋体;">。等到具体用该对象</span><font face="Times New Roman">(</font><span style="font-family: 宋体;">除获?/span><font face="Times New Roman">OID</font><span style="font-family: 宋体;">以外</span><font face="Times New Roman">)</font><span style="font-family: 宋体;">的时候,再查询二U缓存和数据库,若仍没发现符合条件的记录Q则会抛Z?/span><font face="Times New Roman">ObjectNotFoundException</font><span style="font-family: 宋体;">?/span></font></p> <p style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><font size="3"><font face="Times New Roman">(2)</font><span style="font-family: 宋体;">若ؓ</span><font face="Times New Roman">false,</font><span style="font-family: 宋体;">p</span><font face="Times New Roman">get</font><span style="font-family: 宋体;">Ҏ查找序一P只是最l若没发现符合条件的记录Q则会抛Z?/span><font face="Times New Roman">ObjectNotFoundException</font><span style="font-family: 宋体;">?/span></font></p> <p style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><font size="3"><span style="font-family: 宋体;">q里</span><font face="Times New Roman">get</font><span style="font-family: 宋体;">?/span><font face="Times New Roman">load</font><span style="font-family: 宋体;">有两个重要区?/span><font face="Times New Roman">:</font></font></p> <ol style="margin-top: 0cm;" type="1"> <li style="margin: 0cm 0cm 0pt;"><font size="3"><span style="font-family: 宋体;">如果未能发现W合条g的记录,</span><font face="Times New Roman">get</font><span style="font-family: 宋体;">Ҏq回</span><font face="Times New Roman">null</font><span style="font-family: 宋体;">Q?/span><font face="Times New Roman">load</font><span style="font-family: 宋体;">Ҏ会抛Z?/span><font face="Times New Roman">ObjectNotFoundException</font><span style="font-family: 宋体;">?/span></font></li> <li style="margin: 0cm 0cm 0pt;"><font size="3"><font face="Times New Roman">load</font><span style="font-family: 宋体;">Ҏ可返回没有加载实体数据的代理cd例,?/span><font face="Times New Roman">get</font><span style="font-family: 宋体;">Ҏ永远q回有实体数据的对象?/span><font face="Times New Roman">(</font><span style="font-family: 宋体;">对于</span><font face="Times New Roman">load</font><span style="font-family: 宋体;">?/span><font face="Times New Roman">get</font><span style="font-family: 宋体;">Ҏq回cdQ好多书中都_</span><font face="Times New Roman">“get</font><span style="font-family: 宋体;">Ҏ永远只返回实体类</span><font face="Times New Roman">”</font><span style="font-family: 宋体;">Q实际上q不正确Q?/span><font face="Times New Roman">get</font><span style="font-family: 宋体;">Ҏ如果?/span><font face="Times New Roman">session</font><span style="font-family: 宋体;">~存中找C?/span><font face="Times New Roman">id</font><span style="font-family: 宋体;">对应的对象,如果刚好该对象前面是被代理过的,如被</span><font face="Times New Roman">load</font><span style="font-family: 宋体;">Ҏ使用q,或者被其他兌对象延迟加蝲q,那么q回的还是原先的代理对象Q而不是实体类对象Q如果该代理对象q没有加载实体数据(是</span><font face="Times New Roman">id</font><span style="font-family: 宋体;">以外的其他属性数据)Q那么它会查询二U缓存或者数据库来加载数据,但是q回的还是代理对象,只不q已l加载了实体数据?/span><font face="Times New Roman">)</font></font></li> </ol> <p style="margin: 0cm 0cm 0pt; text-indent: 18pt;"><font size="3"><strong><span style="color: #99cc00; font-family: 宋体;">M对于</span><span style="color: #99cc00;"><font face="Times New Roman">get</font></span></strong><strong><span style="color: #99cc00; font-family: 宋体;">?/span><span style="color: #99cc00;"><font face="Times New Roman">load</font></span></strong><strong><span style="color: #99cc00; font-family: 宋体;">的根本区别,一句话Q?/span><span style="color: #99cc00;"><font face="Times New Roman">hibernate</font></span></strong><strong><span style="color: #99cc00; font-family: 宋体;">对于</span><span style="color: #99cc00;"><font face="Times New Roman">load</font></span></strong><strong><span style="color: #99cc00; font-family: 宋体;">Ҏ认ؓ该数据在数据库中一定存在,可以攑ֿ的用代理来延迟加蝲Q如果在使用q程中发C问题Q只能抛异常Q而对?/span><span style="color: #99cc00;"><font face="Times New Roman">get</font></span></strong><strong><span style="color: #99cc00; font-family: 宋体;">ҎQ?/span><span style="color: #99cc00;"><font face="Times New Roman">hibernate</font></span></strong><strong><span style="color: #99cc00; font-family: 宋体;">一定要获取到真实的数据Q否则返?/span><span style="color: #99cc00;"><font face="Times New Roman">null</font></span></strong><strong><span style="color: #99cc00; font-family: 宋体;">?/span></strong></font></p> <p style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="3"><span style="font-family: 宋体;">最后,我们分析下ؓ什么网路上那么多关于二者区别的文章不太准确Q首先可能是版本问题Q?/span><font face="Times New Roman">Hibernate</font><span style="font-family: 宋体;">? 本不同,q行机制不太一P其次是很多朋友只是把自q验所得与人分享,q没有经q全方位代码的检;最后就是有些技术牛人,表达比较随意。所以我希望 大家以后学习知识的时候不要盲从他信权威,一定要l合多方资料Q比较和整理Q再l过自己实践验,q样得到的知识才是真实有效的?/span></font></p> <img src ="http://www.tkk7.com/alinglau36/aggbug/281088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/alinglau36/" target="_blank">lau</a> 2009-06-10 11:10 <a href="http://www.tkk7.com/alinglau36/archive/2009/06/10/281088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK自带的native2ascii工具完全揭密http://www.tkk7.com/alinglau36/archive/2009/06/04/280000.htmllaulauThu, 04 Jun 2009 05:52:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/06/04/280000.htmlhttp://www.tkk7.com/alinglau36/comments/280000.htmlhttp://www.tkk7.com/alinglau36/archive/2009/06/04/280000.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/280000.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/280000.html
背景Q?br />       在做Java开发的时候,常常会出C些ؕ码,或者无法正识别或d的文Ӟ比如常见的validator验证用的消息资源QpropertiesQ文 件就需要进行Unicode重新~码。原因是java默认的编码方式ؓUnicodeQ而我们的计算机系l编码常常是GBK{编码。需要将pȝ的编码{? 为java正确识别的编码问题就解决了?/font>
                                                                                    
1、native2ascii?/strong>
Q?br />     native2ascii是sun java sdk提供的一个工兗用来将别的文本cLӞ比如*.txt,*.ini,*.properties,*.java{等Q编码{为Unicode~码? Z么要q行转码Q原因在于程序的国际化。Unicode~码的定义:UnicodeQ统一码、万国码、单一码)是一U在计算Z使用的字W编码。它为每 U语a中的每个字符讑֮了统一q且唯一的二q制~码Q以满跨语a、跨q_q行文本转换、处理的要求?990q开始研发,1994q正式公布。随着计算 机工作能力的增强QUnicode也在面世以来的十多年里得到普及?/font>
2、获取native2asciiQ?br />       安装了jdk后,假如你是在windows上安装,那么在jdk的安装目录下Q会有一个bin目录Q其中native2ascii.exe正是?br />

3、native2ascii的命令行的命名格?/strong>Q?br /> native2ascii -[options] [inputfile [outputfile]]

说明Q?/font>
-[options]Q表C命令开养I有两个选项可供选择
-reverseQ将Unicode~码转ؓ本地或者指定编码,不指定编码情况下Q将转ؓ本地~码?br /> -encoding encoding_nameQ{换ؓ指定~码Qencoding_name为编码名U?/font>
 
[inputfile [outputfile]]
inputfileQ表C入文件全名?br /> outputfileQ输出文件名。如果缺此参数Q将输出到控制台?/font>



4、最佛_?/strong>Q?br />      首先JDK的bin目录加入pȝ变量path。在盘下建立一个test目录Q在test目录里徏立一个zh.txt文gQ文件内容ؓQ?#8220;熔岩”Q打开“ 命o行提C符”Qƈq入C:"test目录下。下面就可以按照说明一步一步来操作Q注意观察其中编码的变化?br />

AQ将zh.txt转换为Unicode~码Q输出文件到u.txt
native2ascii zh.txt u.txt
打开u.txtQ内容ؓ“"u7194"u5ca9”?/font>


BQ将zh.txt转换为Unicode~码Q输出到控制?/font>
C:"test>native2ascii zh.txt
"u7194"u5ca9
可以看到Q控制台输出?#8220;"u7194"u5ca9”?/font>

CQ将zh.txt转换为ISO8859-1~码Q输出文件到i.txt
native2ascii -encoding ISO8859-1 zh.txt i.txt
打开i.txt文gQ内容ؓ“"u00c8"u00db"u00d1"u00d2”?/font>

DQ将u.txt转换为本地编码,输出到文件u_nv.txt
native2ascii -reverse u.txt u_nv.txt
打开u_nv.txt文gQ内容ؓ“熔岩”?/font>


EQ将u.txt转换为本地编码,输出到控制台

C:"test>native2ascii -reverse u.txt
熔岩
可以看到Q控制台输出?#8220;熔岩”?/font>


FQ将i.txt转换为本地编码,输出到i_nv.txt
native2ascii -reverse i.txt i_nv.txt
打开i_nv.txt文gQ内容ؓ“"u00c8"u00db"u00d1"u00d2”。发现{码前后完全一L。也是_{于没有转,或者说思想p涂Q对命名没有理解?br />

GQ将i.txt转换为GBK~码Q输出到i_gbk.txt
native2ascii -reverse -encoding GBK i.txt i_gbk.txt
打开i_gbk.txt文gQ内容ؓ“"u00c8"u00db"u00d1"u00d2”。发现{码前后完全一L。也是_{于没有转,或者说思想p涂Q对命名没有理解?br />

HQ将u_nv.txt转码到本地编码GBKQ输出到控制?br />
C:"test>native2ascii -reverse -encoding ISO8859-1 i.txt
熔岩
从这个结果看Q目标达到到了,~码i.txt为ISO8859-1Q{为本地编码后内容?#8220;熔岩”。从q里应该意识刎ͼnative2ascii -reverse命o?encoding指定的编码ؓ源文件的~码格式。而在native2ascii 命o?encoding指定的编码ؓQ生成的Q目标文件的~码格式。这一炚w常的重要Q切讎ͼQ?br />

l箋探烦Q新建文?2a.txtQ内?#8220;12axyz”。看看纯字母数字的编码又如何?br />

IQ将U字母数字的文本文g12a.txt转换为Unicode~码

native2ascii 12a.txt 12a_nv.txt
打开12a_nv.txt文gQ内容ؓ“12axyz”?br /> l箋试Q{为ISO8859-1~码看看
C:"test>native2ascii -encoding ISO8859-1 12a.txt
12axyz
l果q是没有转码?br />
从结果可以得出结论:对于U数字和字母的文本类型文Ӟ只有ASCII码)Q{码前后的内容是一L?br />


5、ȝ
Q?br />      native2ascii是一个非常的好{码工Pq且转码是可逆的Q而其真正的含义ƈ非本地编码—?gt;转码为ASCII码,而是一个通用的文本文件编码{换工兗在做编码{换的时候有两类指定~码的情形,分别指输出文件编码和输入文g~码Q?font size="2">具体可以看看最佛_践部?/font>?/font>



lau 2009-06-04 13:52 发表评论
]]>
The project cannot be built until build path errors are resolvedhttp://www.tkk7.com/alinglau36/archive/2009/05/31/279259.htmllaulauSun, 31 May 2009 10:19:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/05/31/279259.htmlhttp://www.tkk7.com/alinglau36/comments/279259.htmlhttp://www.tkk7.com/alinglau36/archive/2009/05/31/279259.html#Feedback1http://www.tkk7.com/alinglau36/comments/commentRss/279259.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/279259.html问题解决:The project cannot be built until build path errors are resolved收藏

1,看看project -- Build Automatically有没有勾?如果没有,勾上以后,clean一?重启eclipse

2,看看你的lib里面有没有不用的jar?看你?classpath文g中有没有错误的\?

3,q是最重要的一?有problems视图中查看有没有关于本项目的错误信息,一般都会有q样的话:      The project cannot be built until build path errors are resolved 然后下面提示unbound classpath, 一般在.classpath中删除这些path可以了

4. 安装Tomcat?保{tomcat_home}/common/lib文g夹下有jasper-runtime.jar、jsp-api.jar、servlet-api.jar、jndi.jar几个文g。启动Eclipse,W一ơ启动会有一个配|过E,选择菜单上的window/preferencesQ选java/classpath variablesQNewd一个名为JDK_TOOLSq指向你的{jdk_home}/lib/tools.jar的环境变量?/p>



lau 2009-05-31 18:19 发表评论
]]>
ClassPathXmlApplicationContext 和FileSystemXmlApplicationContext的区?http://www.tkk7.com/alinglau36/archive/2009/05/26/278050.htmllaulauTue, 26 May 2009 09:30:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/05/26/278050.htmlhttp://www.tkk7.com/alinglau36/comments/278050.htmlhttp://www.tkk7.com/alinglau36/archive/2009/05/26/278050.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/278050.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/278050.html   如果要用绝对\径,需要加?file: 前缀表示q是l对路径Q?


  对于FileSystemXmlApplicationContext:

   默认表示的是两种Q?

  1Q没有盘W的?目工作路径Q?即项目的根目录;
  2Q有盘符表示的是 文gl对路径?
 
  如果要用classpath路径Q?需要前~ classpath: . 

  public class HelloClient {

  protected static final Log log = LogFactory.getLog(HelloClient.class);

  public static void main(String[] args) {

  // Resource resource = new ClassPathResource("appcontext.xml");
  // BeanFactory factory = new XmlBeanFactory(resource);

  //用classpath路径也可?
  // ApplicationContext factory=new ClassPathXmlApplicationContext("classpath:appcontext.xml");
  // ApplicationContext factory=new ClassPathXmlApplicationContext("appcontext.xml");

  // ClassPathXmlApplicationContext 使用了file前缀也是可以使用l对路径?br />   // ApplicationContext factory=new ClassPathXmlApplicationContext("file:G:/1Java实用目资源/2Spring/1_NSpring? Jar代码/workspace/workspace/example6/src/appcontext.xml");

//用文件系l的路径 默认是指目的根路径
// ApplicationContext factory=new FileSystemXmlApplicationContext("src/appcontext.xml");

//使用?classpath: 前缀,作ؓ标志, q样,FileSystemXmlApplicationContext 也能够读入classpath下的相对路径
// ApplicationContext factory=new FileSystemXmlApplicationContext("classpath:appcontext.xml");
// ApplicationContext factory=new FileSystemXmlApplicationContext("file:G:/1Java实用目资源/2Spring/1_NSpring? Jar代码/workspace/workspace/example6/src/appcontext.xml");

//也可以不加file前缀
ApplicationContext factory=new FileSystemXmlApplicationContext("G:/1Java实用目资源/2Spring/1_NSpring全Jar代码 /workspace/workspace/example6/src/appcontext.xml");

IHelloWorld hw = (IHelloWorld) factory.getBean("helloworldbean");
log.info(hw.getContent("luoshifei"));

}

}

lau 2009-05-26 17:30 发表评论
]]>
Myeclipse中web.xml中找不到applicationContext.xmlhttp://www.tkk7.com/alinglau36/archive/2009/05/26/278036.htmllaulauTue, 26 May 2009 08:27:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/05/26/278036.htmlhttp://www.tkk7.com/alinglau36/comments/278036.htmlhttp://www.tkk7.com/alinglau36/archive/2009/05/26/278036.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/278036.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/278036.html
<context-param>
    <param-name>contextConfigLocation </param-name>
    <param-value>/WEB-INF/classes/applicationContext.xml </param-value>
</context-param>

问题主要׃加蝲spring的默认配|文件位|一般是?WEB-INF/下找applicationContext.xml文g。? Myeclipse文g自动生成的applicationContext文g是放?WEB-INF/classes /applicationContext.xml。所以在默认加蝲中是找不到applicationContext.xml文g的,必须加入上面配置?

lau 2009-05-26 16:27 发表评论
]]>
Cookie和Session专题Q{载)http://www.tkk7.com/alinglau36/archive/2009/05/19/271572.htmllaulauTue, 19 May 2009 10:21:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/05/19/271572.htmlhttp://www.tkk7.com/alinglau36/comments/271572.htmlhttp://www.tkk7.com/alinglau36/archive/2009/05/19/271572.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/271572.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/271572.html一、cookie机制和session机制的区?br /> *************************************************************************************
具体来说cookie机制采用的是在客L保持状态的ҎQ而session机制采用的是在服务器端保持状态的Ҏ?br /> 同时我们也看刎ͼ׃才服务器端保持状态的Ҏ在客L也需要保存一个标识,所以session
机制可能需要借助于cookie机制来达C存标识的目的Q但实际上还有其他选择
*************************************************************************************

二、会话cookie和持久cookie的区?br /> *************************************************************************************
如果不设|过期时_则表C个cookie生命周期为浏览器会话期间Q只要关闭浏览器H口Qcookie消׃。这U生命期为浏览会话期的cookie被称Z话cookie。会话cookie一般不保存在硬盘上而是保存在内存里?br /> 如果讄了过期时_览器就会把cookie保存到硬盘上Q关闭后再次打开览器,q些cookie依然有效直到过讑֮的过期时间?br /> 存储在硬盘上的cookie可以在不同的览器进E间׃nQ比如两个IEH口。而对于保存在内存的cookieQ不同的览器有不同的处理方式?br /> *************************************************************************************

三、如何利用实现自动登?br /> *************************************************************************************
当用户在某个|站注册后,׃收到一个惟一用户ID的cookie。客户后来重新连接时Q这?br /> 用户ID会自动返回,服务器对它进行检查,定它是否ؓ注册用户且选择了自动登录,从而用户务需l出明确的用户名和密码,可以访问服务器上的资源?br /> *************************************************************************************

四、如何根据用L爱好定制站点
*************************************************************************************
|站可以使用cookie记录用户的意ѝ对于简单的讄Q网站可以直接将面的设|存储在cookie中完成定制。然而对于更复杂的定Ӟ|站只需仅将一个惟一的标识符发送给用户Q由服务器端的数据库存储每个标识W对应的面讄?br /> *************************************************************************************

五、cookie的发?br /> *************************************************************************************
1.创徏Cookie对象
2.讄最大时?br /> 3.Cookie攑օ到HTTP响应报头
如果你创Z一个cookieQƈ他发送到览器,默认情况下它是一个会话别的cookie:存储在浏览器的内存中Q用户退出浏览器之后被删除。如果你希望览器将该cookie存储在磁盘上Q则
需要用maxAgeQƈl出一个以Uؓ单位的时间。将最大时效设?则是命o览器删除该cookie?br /> ? 送cookie需要用HttpServletResponse的addCookieҎQ将cookie插入C个Set-Cookie HTTPh 报头中。由于这个方法ƈ不修改Q何之前指定的Set-Cookie报头Q而是创徏新的报头Q因此我们将q个ҎUCؓ是addCookieQ而非 setCookie。同栯C响应报头必须在Q何文档内容发送到客户端之前设|?br />
六、cookie的读?br /> *************************************************************************************
1.调用request.getCookie
要获取有览器发送来的cookieQ需要调用HttpServletRequest的getCookiesҎQ这个调用返回Cookie对象的数l,对应由HTTPh中Cookie报头输入的倹{?br /> 2.Ҏl进行@环,调用每个cookie的getNameҎQ直到找到感兴趣的cookie为止
cookie与你的主??相关Q而非你的servlet或JSP面。因而,管你的servlet可能只发送了单个cookieQ你也可能会得到许多不相关的cookie?br /> 例如Q?br /> String cookieName = “userID”;
    Cookie cookies[] = request.getCookies();
    if (cookies!=null){
        for(int i=0;i<cookies.length;i++){
    Cookie cookie = cookies[i];
    if (cookieName.equals(cookie.getName())){
        doSomethingWith(cookie.getValue());
}
}
}
*************************************************************************************

七、如何用cookie初访?br /> *************************************************************************************
A.调用HttpServletRequest.getCookies()获取Cookie数组
B.在@环中索指定名字的cookie是否存在以及对应的值是否正?br /> C.如果是则退出@环ƈ讄区别标识
D.Ҏ区别标识判断用户是否为初访者从而进行不同的操作
*************************************************************************************

八、用cookie初访者的常见错误
*************************************************************************************
不能仅仅因ؓcookie数组中不存在在特定的数据就认ؓ用户是个初访者。如果cookie数组为nullQ客户可能是一个初访者,也可能是׃用户cookie删除或禁用造成的结果?br /> 但是Q如果数l非null,也不q是昄客户曄到过你的|站或域Qƈ不能说明他们曄讉Kq你的servlet。其它servlet、JSP面以及非Java Web应用都可以设|cookieQ依据\径的讄Q其中的Mcookie都有可能q回l用L览器?br /> 正确的做法是判断cookie数组是否为空且是否存在指定的Cookie对象且值正?br /> *************************************************************************************

九、用cookie属性的注意问题
*************************************************************************************
属性是从服务器发送到览器的报头的一部分Q但它们不属于由览器返回给服务器的报头。 
因此除了名称和g外,cookie属性只适用于从服务器输出到客户端的cookieQ服务器端来自于览器的cookieq没有设|这些属性。 
因而不要期望通过request.getCookies得到的cookie中可以用这个属性。这意味着Q你不能仅仅通过讄cookie的最大时效, 发出它,在随后的输入数组中查N当的cookie,d它的|修改它ƈ它存回CookieQ从而实C断改变的cookie倹{?br /> *************************************************************************************

十、如何用cookie记录各个用户的访问计?br /> *************************************************************************************
1.获取cookie数组中专门用于统计用戯问次数的cookie的?br /> 2.D{换成int?br /> 3.值加1q用原来的名U重新创Z个Cookie对象
4.重新讄最大时?br /> 5.新的cookie输出
*************************************************************************************

十一、session在不同环境下的不同含?br /> *************************************************************************************
sessionQ中文经常翻译ؓ会话Q其本来的含义是指有始有l的一pd动作/消息Q比如打电话是从拿v电话拨号到挂断电话这中间的一pdq程可以UCZ个session?br /> 然而当session一词与|络协议相关联时Q它又往往隐含?#8220;面向q接”??#8220;保持状?#8221;q样两个含义?br /> session在Web开发环境下的语义又有了新的扩展Q它的含义是指一cȝ来在客户端与服务器端之间保持状态的解决Ҏ。有时候Session也用来指q种解决Ҏ的存储结构?br /> *************************************************************************************

十二、session的机?br /> *************************************************************************************
session机制是一U服务器端的机制Q服务器使用一U类g散列表的l构(也可能就是用散列表)来保存信息?br /> ? E序需要ؓ某个客户端的h创徏一个session的时候,服务器首先检查这个客L的请求里是否包含了一个session标识Q称? session id,如果已经包含一个session id则说明以前已lؓ此客户创sessionQ服务器按照session id把这? session索出来?如果索不刎ͼ可能会新Z个,q种情况可能出现在服务端已经删除了该用户对应的session对象Q但用户Zؓ地在h? URL后面附加上一个JSESSION的参??br /> 如果客户h不包含session idQ则为此客户创徏一个sessionq且生成一个与此session相关联的session idQ这个session id在本次响应中返回给客户端保存?br /> *************************************************************************************

十三、保存session id的几U方?br /> *************************************************************************************
AQ保存session id的方式可以采用cookieQ这样在交互q程中浏览器可以自动的按照规则把q个标识发送给服务器?br /> BQ? ׃cookie可以被h为的止Q必L其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,l常采用的一U技术叫? URL重写Q就是把session id附加在URL路径的后面,附加的方式也有两U,一U是作ؓURL路径的附加信息,另一U是作ؓ查询字符串附加在 URL后面。网l在整个交互q程中始l保持状态,必d每个客户端可能请求的路径后面都包含这个session id?br /> CQ另一U技术叫做表单隐藏字Dc就是服务器会自动修改表单,d一个隐藏字D,以便在表单提交时能够把session id传递回服务器?br /> *************************************************************************************

十四、session什么时候被创徏
*************************************************************************************
一个常见的错误是以为session在有客户端访问时p创徏Q然而事实是直到某server端程?如Servlet)调用HttpServletRequest.getSession(true)q样的语句时才会被创建?br /> *************************************************************************************

十五、session何时被删?br /> *************************************************************************************
session在下列情况下被删除:
AQ程序调用HttpSession.invalidate()
BQ距M一ơ收到客L发送的session id旉间隔过了session的最大有效时?br /> CQ服务器q程被停?br />
再次注意关闭览器只会存储在客L览器内存中的session cookie失效Q不会服务器端的session对象失效?br /> *************************************************************************************

十六、URL重写有什么缺?br /> *************************************************************************************
Ҏ有的URL使用URL重写Q包括超链接Qform的actionQ和重定向的URL。每个引用你的站点的URLQ以及那些返回给用户的URL(即通过间接手段Q比如服务器重定向中的Location字段)都要d额外的信息?br /> q意味着在你的站点上不能有Q何静态的HTML面(臛_静态页面中不能有Q何链接到站点动态页面的链接)。因此,每个面都必M用servlet 或JSP动态生成。即使所有的面都动态生成,如果用户d了会话ƈ通过书签或链接再ơ回来,会话的信息都会丢失,因ؓ存储下来的链接含有错误的标识信息 Q该URL后面的SESSION ID已经q期了。  
*************************************************************************************

十七、用隐藏的表单域有什么缺?br /> *************************************************************************************
    仅当每个面都是有表单提交而动态生成时Q才能用这U方法。单d规的<A HREF..>文本链接ƈ不生表单提交,因此隐藏的表单域不能支持通常的会话跟t,只能用于一pd特定的操作中Q比如在U商店的l̎q程
*************************************************************************************

十八、会话跟t的基本步骤
*************************************************************************************
1Q访问与当前h相关的会话对?br /> 2Q查找与会话相关的信?br /> 3Q存储会话信?br /> 4Q废弃会话数?br /> *************************************************************************************

十九、getSession()/getSession(true)、getSession(false)的区?br /> *************************************************************************************
getSession()/getSession(true)Q当session存在时返回该sessionQ否则新Z个sessionq返回该对象
getSession(false)Q当session存在时返回该sessionQ否则不会新建sessionQ返回null
*************************************************************************************

二十、如何将信息于会话关联v?br /> *************************************************************************************
setAttribute会替换Q何之前设定的|如果惌在不提供M代替的情况下U除某个|则应使用removeAttribute。这个方法会触发所有实CHttpSessionBindingListener接口的值的valueUnbound
Ҏ?br /> *************************************************************************************

二十一、会话属性的cd有什么限制吗
*************************************************************************************
通常会话属性的cd只要是Object可以了。除了null或基本类型,如int,double,boolean?br /> 如果要用基本类型的g为属性,必须其转换为相应的装cd?br /> *************************************************************************************

二十二、如何废弃会话数?br /> *************************************************************************************
AQ只U除自己~写的servlet创徏的数据:
   调用removeAttribute(“key”)指定键兌的值废?br /> BQ删除整个会?在当前Web应用?Q?br />    调用invalidateQ将整个会话废弃掉。这样做会丢p用户的所有会话数据,而非仅仅由我?br /> servlet或JSP面创徏的会话数?br /> CQ将用户从系l中注销q删除所有属于他(或她)的会?br />    调用logOutQ将客户从Web服务器中注销Q同时废弃所有与该用L兌的会?每个Web应用臛_一?。这个操作有可能影响到服务器上多个不同的Web应用
*************************************************************************************

二十三、用isNew来判断用h否ؓ新旧用户的错误做?br /> *************************************************************************************
public boolean isNew()Ҏ如果会话未和客L?览?发生M联系Q则q个Ҏq回trueQ这一般是因ؓ会话是新建的Q不是由输入的客戯求所引v的?br /> 但如果isNewq回falseQ只不过是说明他之前曄讉K该Web应用Qƈ不代表他们曾讉Kq我们的servlet或JSP面?br /> 因ؓsession是与用户相关的,在用户之前访问的每一个页面都有可能创Z会话。因此isNew为false只能说用户之前访问过该Web应用Qsession可以是当前页面创建,也可能是q户之前访问过的页面创建的?br /> 正确的做法是判断某个session中是否存在某个特定的key且其value是否正确
*************************************************************************************

二十四、Cookie的过期和Session的超时有什么区?br /> *************************************************************************************
会话的超时由服务器来l护Q它不同于Cookie的失效日期。首先,会话一般基于驻留内存的cookie
不是持箋性的cookieQ因而也没有截x期。即使截取到JSESSIONID cookieQƈ为它讑֮一个失效日期发送出厅R浏览器会话和服务器会话也会截然不同?br /> *************************************************************************************

二十五、session cookie和session对象的生命周期是一L?br /> *************************************************************************************
当用户关闭了览器虽然session cookie已经消失Q但session对象仍然保存在服务器?br /> *************************************************************************************

二十六、是否只要关闭浏览器Qsession消׃
*************************************************************************************
E序一般都是在用户做log off的时候发个指令去删除sessionQ然而浏览器从来不会d在关闭之前通知服务器它要被关闭,因此服务器根本不会有Z知道览器已l关闭。服务器会一直保留这个会话对象直到它处于非活动状态超q设定的间隔为止?br /> 之所以会有这U错误的认识Q是因ؓ大部分session机制都用会话cookie来保存session idQ而关闭浏览器后这个session id消׃Q再ơ连接到服务器时也就无法扑ֈ原来的session?br /> 如果服务器设|的cookie被保存到盘上,或者用某U手D|写浏览器发出的HTTPh报头Q把原来的session id发送到服务器,则再ơ打开览器仍然能够找到原来的session?br /> 恰恰是由于关闭浏览器不会Dsession被删除,q服务器ؓsession讄了一个失效时_当距d户上一ơ用session的时间超q了q个失效旉Ӟ服务器就可以认ؓ客户端已l停止了zdQ才会把session删除以节省存储空间?br /> 由此我们可以得出如下l论Q?br /> 关闭览器,只会是浏览器端内存里的session cookie消失Q但不会使保存在服务器端的session对象消失Q同样也不会使已l保存到盘上的持久化cookie消失?br /> *************************************************************************************


二十七、打开两个览器窗口访问应用程序会使用同一个sessionq是不同的session
*************************************************************************************
通常session cookie是不能跨H口使用的,当你新开了一个浏览器H口q入相同面Ӟpȝ会赋予你一个新的session idQ这h们信息共享的目的p不到了?br /> ? 时我们可以先把session id保存在persistent cookie?通过讄session的最大有效时?Q然后在新窗口中d来,可 以得C一个窗口的session id了,q样通过session cookie和persistent cookie的结合我们就可以实现了跨H口? 会话跟踪?br /> *************************************************************************************

二十八、如何用会话显C每个客L讉Kơ数
*************************************************************************************
׃客户的访问次数是一个整型的变量Q但session的属性类型中不能使用intQdoubleQboolean{基本类型的变量Q所以我们要用到q些基本cd的封装类型对象作为session对象中属性的?br /> 但像Integer是一U不可修?Immutable)的数据结构:构徏后就不能更改。这意味着每个h都必d建新的Integer对象Q之后用setAttribute来代替之前存在的老的属性的倹{例如:
HttpSession session = request.getSession();
SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”);
if (value= =null){
    value = new SomeImmutableClass(…); // 新创Z个不可更改对?br /> }else{
    value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对?br /> }
session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象
*************************************************************************************

二十九、如何用会话篏计用L数据
*************************************************************************************
使用可变的数据结构,比如数组、List、Map或含有可写字D늚应用E序专有的数据结构。通过q种方式Q除非首ơ分配对象,否则不需要调用setAttribute。例?br />
HttpSession session = request.getSession();
SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”);
if(value = = null){
    value = new SomeMutableClass(…);
    session.setAttribute(“someIdentifier”,value);
}else{
    value.updateInternalAttribute(…);     // 如果已经存在该对象则更新其属性而不需重新讄属?br /> }
*************************************************************************************

三十、不可更改对象和可更改对象在会话数据更新时的不同处理
*************************************************************************************
不可更改对象因ؓ一旦创Z后就不能更改Q所以每ơ要修改会话中属性的值的时候,都需?br /> 调用setAttribute(“someIdentifier”,newValue)来代替原有的属性的|否则属性的g会被更新
可更改对象因为其自n一般提供了修改自n属性的ҎQ所以每ơ要修改会话中属性的值的?br /> 候,只要调用该可更改对象的相关修改自w属性的Ҏ可以了。这意味着我们׃需要调
用setAttributeҎ?br /> *************************************************************************************

lau 2009-05-19 18:21 发表评论
]]>
How to validate email, SSN, phone number in Java using Regular expressions.http://www.tkk7.com/alinglau36/archive/2009/05/14/270638.htmllaulauThu, 14 May 2009 08:28:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/05/14/270638.htmlhttp://www.tkk7.com/alinglau36/comments/270638.htmlhttp://www.tkk7.com/alinglau36/archive/2009/05/14/270638.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/270638.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/270638.html They are patterns of characters used to perform search, extract or replace operations on the given text. Regular expressions can also be used to validate that the input conforms to a given format.

For example, we can use Regular Expression to check whether the user input is a valid Social Security number, a valid phone number or a valid email number, etc.

Regular Expressions are supported by many languages. Sun added support for regualer expression in Java 1.4 by introducing java.util.regex package. This package provides the necessary classes for using Regular Expressions in a java application. It consists of following three main classes ,

  • Pattern
  • Matcher
  • PatternSyntaxException

The java.util.regex package has several other features for appending, text replacement, and greedy/non-greedy pattern matching. See the JDK Documentation on java.util.regex to learn more about using regular expressions in Java.

Using this package I created a utility class to validate some commonly used data elements. My FieldsValidation class has following methods:

1. isEmailValid:

Validate email address using Java regex

/** isEmailValid: Validate email address using Java reg ex.
* This method checks if the input string is a valid email address.
* @param email String. Email address to validate
* @return boolean: true if email address is valid, false otherwise.
*/


public static boolean isEmailValid(String email){
boolean isValid = false;

/*
Email format: A valid email address will have following format:

  • [""w"".-]+ : Begins with word characters, (may include periods and hypens).
  • @ : It must have a ‘@’ symbol after initial characters.
  • ([""w""-]+"".)+ : ‘@’ must follow by more alphanumeric characters (may include hypens.).
    This part must also have a “.” to separate domain and subdomain names.
  • [A-Z]{2,4}$ : Must end with two to four alaphabets.
    (This will allow domain names with 2, 3 and 4 characters e.g pa, com, net, wxyz)

Examples: Following email addresses will pass validation
abc@xyz.net; ab.c@tx.gov
*/



//Initialize reg ex for email.

String expression = “^[""w"".-]+@([""w""-]+"".)+[A-Z]{2,4}$”;
CharSequence inputStr = email;


//Make the comparison case-insensitive.


Pattern pattern = Pattern.compile(expression,Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(inputStr);
if(matcher.matches()){
isValid = true;
}
return isValid;
}

Update: Read this post for a more thorough Java regular expression to validate email address.

2. isPhoneNumberValid:

Validate phone number using Java reg ex.

/** isPhoneNumberValid: Validate phone number using Java reg ex.
* This method checks if the input string is a valid phone number.
* @param email String. Phone number to validate
* @return boolean: true if phone number is valid, false otherwise.
*/


public static boolean isPhoneNumberValid(String phoneNumber){
boolean isValid = false;

/* Phone Number format: (nnn)nnn-nnnn; nnnnnnnnnn; nnn-nnn-nnnn

  • ^""(? : May start with an option “(” .
  • (""d{3}): Followed by 3 digits.
  • "")? : May have an optional “)”
  • [- ]? : May have an optional “-” after the first 3 digits or after optional ) character.
  • (""d{3}) : Followed by 3 digits.
  • [- ]? : May have another optional “-” after numeric digits.
  • (""d{4})$ : ends with four digits.

Examples: Matches following phone numbers:
(123)456-7890, 123-456-7890, 1234567890, (123)-456-7890

//Initialize reg ex for phone number.
String expression = “^""(?(""d{3})"")?[- ]?(""d{3})[- ]?(""d{4})$”;
CharSequence inputStr = phoneNumber;
Pattern pattern = Pattern.compile(expression);
Matcher matcher = pattern.matcher(inputStr);
if(matcher.matches()){
isValid = true;
}
return isValid;
}

3. isValidSSN:

Validate Social Security Number (SSN) using Java reg ex.

/** isSSNValid: Validate Social Security number (SSN) using Java reg ex.
* This method checks if the input string is a valid SSN.
* @param email String. Social Security number to validate
* @return boolean: true if social security number is valid, false otherwise.
*/


public static boolean isSSNValid(String ssn){
boolean isValid = false;

/*SSN format xxx-xx-xxxx, xxxxxxxxx, xxx-xxxxxx; xxxxx-xxxx:

  • ^""d{3} : Starts with three numeric digits.
  • [- ]? : Followed by an optional “-”
  • ""d{2} : Two numeric digits after the optional “-”
  • [- ]? : May contain an optional second “-” character.
  • ""d{4} : ends with four numeric digits.

Examples: 879-89-8989; 869878789 etc.
*/



//Initialize reg ex for SSN.

String expression = “^""d{3}[- ]?""d{2}[- ]?""d{4}$”;
CharSequence inputStr = ssn;
Pattern pattern = Pattern.compile(expression);
Matcher matcher = pattern.matcher(inputStr);
if(matcher.matches()){
isValid = true;
}
return isValid;
}

4. isNumeric:

Validate a number using Java regex.

/**isNumeric: Validate a number using Java regex.
* This method checks if the input string contains all numeric characters.
* @param email String. Number to validate
* @return boolean: true if the input is all numeric, false otherwise.
*/


public static boolean isNumeric(String number){
boolean isValid = false;

/*Number: A numeric value will have following format:

  • ^[-+]? : Starts with an optional “+” or “-” sign.
  • [0-9]* : May have one or more digits.
  • "".? : May contain an optional “.” (decimal point) character.
  • [0-9]+$ : ends with numeric digit.

*/



//Initialize reg ex for numeric data.

String expression = “^[-+]?[0-9]*"".?[0-9]+$”;
CharSequence inputStr = number;
Pattern pattern = Pattern.compile(expression);
Matcher matcher = pattern.matcher(inputStr);
if(matcher.matches()){
isValid = true;
}
return isValid;
}

This example demonstrates how easy it is to validate email address, ssn, phone number in Java using regular expressions. You can read more about regular expression format here .

You can download complete Java code for this class here .

Feel free to modify and use this class in your projects. Let me know if you have any questions or comments.

Enjoy.

Share and Enjoy:
  • StumbleUpon
  • Digg
  • del.icio.us
  • Reddit
  • Sphinn
  • blinkbits How to validate email, SSN, phone number in Java using Regular expressions.
  • NewsVine
  • Smarking
  • Yahoo! Buzz

If you enjoyed this post, make sure you subscribe to my RSS feed!

Related posts:

Jan 10, 2008
Filed under: Java
Tags: , , , , , ,

12 Responses

  1. haro:

    This explanation is very helpful. Very.
    One minor question: It seems that the email validation accepts an underscore (”_”). I would have expected the validation to reject the character, because it is not specified in expression.

    Posted on January 23rd, 2008 at 12:29 pm

  2. zparacha:

    Haro, the regular expression for email validation has a ‘"w’. "w stands for “word character” and that includes [A-Z], [a-z], [0-9] and the “underscore (_)” character. That is why if you have an “_” in your email address it will pass this validation.
    Hope that clears it a bit.

    Posted on January 24th, 2008 at 2:41 pm

  3. GDD:

    Really nice article

    Posted on January 27th, 2008 at 1:06 am

  4. Linoleum:

    Regular expressions in Java…

    Confused by regular expressions in Java? This brief tutorial by zparacha may help shed some light on them……

    Posted on January 31st, 2008 at 2:43 am

  5. Deliggit.com | The social sites' most interesting urls:

    How To essentials - Regular expressions in Java | Deliggit.com…

    zparacha.com

    How to validate email, SSN, phone number in Java using Regular expressions.

    This…



lau 2009-05-14 16:28 发表评论
]]>
Spring 的MVC I18NQ国际化相关配置http://www.tkk7.com/alinglau36/archive/2009/05/08/269609.htmllaulauFri, 08 May 2009 06:58:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/05/08/269609.htmlhttp://www.tkk7.com/alinglau36/comments/269609.htmlhttp://www.tkk7.com/alinglau36/archive/2009/05/08/269609.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/269609.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/269609.html 一、基于浏览器语言的国际化配置

使用Spring的MVCQƈ且配|中有配|Resource文g

<!-- 资源文gl定?-->        
<bean id="messageSource" class="org.springframework.cont>               

<property name="basename" value="message-info" />               
<property name="useCodeAsDefaultMessage" value="true" />      

</bean>

其中Q?font color="#ff0000">message-info
是你的properties文g的通用名。如Q我的配|文件叫message-info.properties,message-info_zh_CN.properties{等

只要有了q个配置Q然后配|JSP渲染器ؓJSTL支持的,那么在你的JSP文g中用fmt标记可以实现客h览器语言国际化了?
如:<fmt:message key="info.login.title" />
其中的info.login.title和你的资源文件对?

二、基于动态加载的国际化配|?/font>

1、基于请求的国际化配|?/font>

Zh的国际化配置是指Q在当前h内,国际化配|生效,否则自动以浏览器Z?

配置方式如下Q?
首先配置拦截?
<!-- 国际化操?拦截?必需配置Q可以和其它国际化方式通用 -->      

<bean id="localeChangeInterceptor" class="org.springframework.web. />


q个配置呢,是不求别的国际化,q是CookieU别的国际化Q再或者SessionU别的国际化Q都必需有配|这个拦截器Q否则会不能使用?

配好上面的拦截器之后Q就拦截器注入C的UrlHandlerMapping中,例如:
<bean id="defaultUrlMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">               

<property name="interceptors" ref="localeChangeInterceptor" />               

<property name="order">                        
<value>1</value>               
</property>      

</bean>


q个时候,但凡有了W合UrlMapping的请求,׃被拦截,q且开始配|国际化参数
        <bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver">        </bean>


默认的参数名?font color="#ff0000">locale
L大小写。里面放的就是你的提交参数。如:en_USQzh_CN之类的,q个时候,你在面上加一?
<a href="?locale=zh_CN">体中?lt;/a>
如果你的资源中,饱含中文的配|,那么׃变成你确定的体中文拉?

2、基于Session的国际化配置

拦截器和Zh的相?

Session的配|如下:
        <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">        </bean>


在你的处理的Controller中,提交上来的locale字段信息生成真正的Locale对象Q然后将对象保存在Session中,默认保存的ID?
SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME



q样Q当你的Session不过期,那么语言U类始终保持正确的说。我一直是q样子用的,我觉得还是Session的好Q老外们用了很满意?

3、基于Cookie的国际化配置

q个我就不说了,反正用的不多Q至我做的目能不用Cookie׃用CookieQ所以,ZCookie的国际化配置我就不细说了Q如果想知道怎么配置Q那?span onclick="tagshow(event)" >下蝲一个SpringQ其中的例子E序是用Cookie配置的,你自p代码OK了?

三、注意事?/font>

如果不用默认的浏览器语言国际化方式,那么拦截器一定要配置Q如果你有多个UrlMappingQ那么就每个都配上拦截器?
至于配置的LocaleResolver的名字,一定要用上面的配置中的名字localeResolver当然了,q个是默认的名字来的Q自p|成别的也可以,但是是ȝQ反正我用默认的感觉不?



lau 2009-05-08 14:58 发表评论
]]>BeanFactory与Application的区?/title><link>http://www.tkk7.com/alinglau36/archive/2009/05/06/269270.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Wed, 06 May 2009 09:27:00 GMT</pubDate><guid>http://www.tkk7.com/alinglau36/archive/2009/05/06/269270.html</guid><wfw:comment>http://www.tkk7.com/alinglau36/comments/269270.html</wfw:comment><comments>http://www.tkk7.com/alinglau36/archive/2009/05/06/269270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/alinglau36/comments/commentRss/269270.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/alinglau36/services/trackbacks/269270.html</trackback:ping><description><![CDATA[<div> <a id="viewpost1_TitleUrl" class="postTitle2" href="../../pdw2009/archive/2007/09/28/149382.html">BeanFactory与Application的区?/a> </div> 自从q初看了李刚写的那本《Spring2.0宝典》,好久没看qSpringM资料Q对于《Spring2.0宝典》的评hQ我只能说一句话垃圾中的垃圾。我已经不敢再买国内作家写的书了?br /> <p>在Spring中,两个最基本最重要的包?<tt>org.springframework.beans</tt> ?<tt>org.springframework.context</tt>. q两个包中的代码为Spring?em>反向控制</em> Ҏ(也叫?em>依赖注射</em>Q提供了基础?<tt><a target="_top">BeanFactory</a></tt>提供了一U先q的配置机制来管理Q何种cbean(对象)Q这U配|机制考虑CQ何一U可能的存储方式?<a target="_top">ApplicationContext</a>建立在BeanFactory之上Qƈ增加了其他的功能,比如更容易同Spring AOPҎ整合, 消息资源处理Q用于国际化Q,事g传递,以声明的方式创徏ApplicationContextQ?可选的父上下文和与应用层相关的上下文(比如<tt>WebApplicationContext</tt>Q,以及其他斚w的增强?</p> <p>而言之,<tt>BeanFactory</tt>提供了配|框架和基本的功能, ?<tt>ApplicationContext</tt>? 它增加了更强的功能,q些功能中的一些或许更加接qJ2EEq且围绕企业U应用。一般来_ApplicationContext? BeanFactory的完全超集, MBeanFactory功能和行为的描述也同栯认ؓ适用于ApplicationContext</p> <p>用户有时不能定BeanFactory和ApplicationContext中哪一个在特定场合下更适合?通常大部分在J2EE环境的应用中Q?em>最好选择使用ApplicationContext</em>Q? 因ؓ它不仅提供了BeanFactory所有的Ҏ以及它自己附加的特性,而且q提供以声明的方式用一些功能, q通常是o人满意的。BeanFactory主要是在非常x内存使用的情况下 Q比如在一个每kb都要计算的applet中)使用Q而且你也不需要用到ApplicationContext的所有特性?</p> <p>q一章粗略地分ؓ两部分,W一部分包括对BeanFactory和ApplicationContext都适用的一些基本原则。第二部分包括仅仅适用于ApplicationContext的一些特?/p> <br /> 生成BeanFactory的方?br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;">InputStream is </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> FileInputStream(</span><span style="color: #000000;">"</span><span style="color: #000000;">beans.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /> XmlBeanFactory factory </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> XmlBeanFactory(is);<br /> </span><span style="color: #008000;">//</span><span style="color: #008000;">或?br /> ClassPathResource res = new ClassPathResource("beans.xml");<br /> XmlBeanFactory factory = new XmlBeanFactory(res);</span></div> <br /> 生成ApplicationContextҎ<br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98.18%; height: 85px; background-color: #eeeeee;"><span style="color: #000000;">ClassPathXmlApplicationContext appContext </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> ClassPathXmlApplicationContext(<br />         </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> String[] {</span><span style="color: #000000;">"</span><span style="color: #000000;">applicationContext.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">"</span><span style="color: #000000;">applicationContext-part2.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">});<br /> <br /> <br /> ClassPathXmlApplicationContext appContext </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> ClassPathXmlApplicationContext(</span><span style="color: #000000;">""</span><span style="color: #000000;">);</span></div> <br /> applicationContxt是可以{换成beanFactory?br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;">BeanFactory factory </span><span style="color: #000000;">=</span><span style="color: #000000;"> (BeanFactory) appContext;</span></div> <br /> <p>Beans被定义ؓ两种部v模式中的一U:singleton或non-singleton?Q后一U也别叫作prototypeQ尽这个名词用的不_因ؓ它ƈ不是非常适合Q?如果一个bean是singleton形态的Q那么就只有一?em>׃n?/em>实例存在Q?所有和q个bean定义的idW合的beanh都会q回q个唯一的、特定的实例?</p> <p>如果bean以non-singletonQprototype模式部v的话Q对q个bean的每ơ请求都?em>创徏一个新的bean实例</em>。这对于例如每个user需要一个独立的user对象q样的情冉|非常理想的?</p> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;"><</span><span style="color: #000000;">bean id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">exampleBean</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />       </span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">examples.ExampleBean</span><span style="color: #000000;">"</span><span style="color: #000000;"> singleton</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">false</span><span style="color: #000000;">"</span><span style="color: #000000;">/></span><span style="color: #000000;"><br /> </span><span style="color: #000000;"><</span><span style="color: #000000;">bean name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">yetAnotherExample</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />       </span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">examples.ExampleBeanTwo</span><span style="color: #000000;">"</span><span style="color: #000000;"> singleton</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">/></span></div> <img src ="http://www.tkk7.com/alinglau36/aggbug/269270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/alinglau36/" target="_blank">lau</a> 2009-05-06 17:27 <a href="http://www.tkk7.com/alinglau36/archive/2009/05/06/269270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中的异常处理--转蝲http://www.tkk7.com/alinglau36/archive/2009/04/21/266772.htmllaulauTue, 21 Apr 2009 08:02:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/04/21/266772.htmlhttp://www.tkk7.com/alinglau36/comments/266772.htmlhttp://www.tkk7.com/alinglau36/archive/2009/04/21/266772.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/266772.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/266772.html Java~程中的异常处理是一个很常见的话题了Q几乎Q何一门介l性的Java评都会提到异常处理。不q,我认为很多h其实q没有真正掌握正处理异? 情况的方法和{略Q最多也׃q了解个大概Q知道点概念。本文就对三U不同程度和质量的Java异常处理q行了讨论,所阐述的处理异常的方式按手法的高下 分ؓQ?
好,不好和恶劣三U?/font>

      同时向你提供了一些解册些问题的技巧?

      首先解释一些Java异常处理中必L清楚的定义和机制。Java语言规范自ErrorcLRuntimeExceptionc衍生出来的Mq例都称?#8220;不可?#8221;(Unchecked)异常Q其他所有异常则UC“可检?#8221;(Checked)异常?

所谓可查异常,是指我们应该自行处理的异常。至于处理的手段Q要么加以控?try catch)Q要么通告(throws)他们有可能生。通常Q应捕捉那些已知如何处理的异常,而通告那些不知如何处理的异常?

而对那些不可查异常来_他们要么在我们的控制之外(Error)Q要么是我们首先׃该允许的情况(RuntimeException)?

至于异常的指定,Java的规则非常简单:一个方法必通告自己可能产生的所有可 查异常。编写自qҎӞq不一定要通告出方法实际可能生的每一个异常对象,要想理解什么时候必要Ҏ的throws丛句来通告异常Q就必须知道 对一个异常来_他只有可能在下面四种情况下才会生:

1、调用了可能产生异常的方法。比如BufferedReadercȝreadLineҎ。该Ҏ通告java.io.IOException异常?/font>

2、侦到一个错误,q用throw语句产生异常?

3、出C个编E错误。比如a[-1] = 0?

4、Java产生内部错误?

如果出现头两U情况之一Q必d诉打用自己方法的人:假如使用q个ҎQ可能造成一个异常的产生(卛_Ҏ头上使用throws)Q一个简单的记忆ҎQ?

只要含有throwQ就要通告throws。如果一个方法必d时处理多个异常,必d头内指出所有异常。就像下例展C的那样Q用逗号对他们进行分Ԍ

1234567 class Animation { public Image loadImage(Strint s)   throws EOFException,MalformedURLException{  ………… } }


然而,我们不需要通告内部java错误Q也不应该通告自RuntimeException衍生出来的异常?

好的异常处理

好异常处理提供了处理E序错误的统一机制。事实上QJava语言通过向调用者提? 异常警告的方式而显著地提升了Y件开发中的异常处理能力。这U方式把Java语言中的“ҎQmethodQ?#8221;q行了扩展和增强Q之包括了自n的错误条 件。下面就让我们看一个例子,q个例子说明了这U情c?

以下是FileInputStream构造器之一的原型:

public FileInputStream(String name) throws FileNotFoundException Java


的方法和构造器必须声明他们在被调用时可?#8220;扔出”的异常,采用的关键字是“throws”。这U在Ҏ原型中出现的异常提示增加了编E的可靠性?

显而易见,q种方式是向Ҏ的调用者提CZ可能出现的异常条Ӟq样调用者就可以对这些异怽出适当的相应处理。以下代码示意我们是如何捕获q且处理FileNotFoundException q一异常的:

1234567891011 try {   FileInputStream fis = new FileInputStream(args[0]);     // other code here ...   } catch (FileNotFoundException fnfe) { System.out.println("File: " + args[0] + " not found. Aborting."); System.exit(1); }


Java异常处理q有其他一些优U的特性,q就是可查异常、用户定义异常和在JDK 1.4中推出的新型Java记录APIQJava Logging APIQ。java.lang.Exception的所有子c都属于可检查异常。可查异常(checked exceptionQ是扔出该异常的Ҏ所必须提示的异常,q种异常必须被捕h者向调用者提C。用户定义异常(User-defined exceptionsQ是定制的异常类Q这U异常类扩展了java.lang.ExceptioncR优良的JavaE序规定定制异常装、报告和处理? 们自q有的情况。最新的Java记录APIQlogging APIQ则可以集中记录异常?/font>

不好的Java异常处理

不好的一面包括两U情况:滥用不可查异常(unchecked exceptionsQ和滥用catchall构造器{。这两种方式都得问题变得复杂v来?

有一U类别的异常属于RuntimeException的子c,q种异常不会受到 ~译器的查。比如,NullPointerException? ArrayStoreException是q种cd异常的实例。程序员可以对RuntimeExceptionq行子类化以回避查异常的限制Q从而便 于生这些异常的Ҏ为其调用者所使用?

专业的开发团队应当只允许在很的情况下才可以q样做?

W二U异常处理的陋习是catchall构造器。所谓的“catchall 构造器”是一U异常捕获代码模块,它可以处理所有扔l它的可能异常?

以下是catchall处理器的实例Q?

123456789   try { // code here with checked exceptions } catch (Throwable t) { t.printStackTrace(); }


我得承认Q我自己在编写一般程序的时候就曄用过q种技术;但是Q在~写关键E序的时候这U类型的构造器一定要避免使用Q除非他们被授权可以和中央错误处理器联合使用才可以这样做?

除此之外Qcatchall构造器不过只是一U通过避免错误处理而加快编E进度的机制?

异常处理的一个不之处是难以采用优良的错误处理策略。从低容内存状态恢复、写入错误和法错误{异常情况都不是L能得到解决的。你可以试一下@环、垃圾收集和提醒用户{常用技术来应付以上的局面?

恶劣的处理方?/strong>

和许多JavaҎ及其APIcMQJava的异常处理机制也?#8220;霸王上?#8221;cȝ滑稽错误。比方说Qؓ了扔出某个异常竟然毫不犹豫地?#8220;new”关键词ؓ其分配内存就是这L例子?

我自׃知道有多次因为犯了这U错误而在严肃的编译器面前屡屡壁。在q种情况下,我们其实都是在伺候语a而不是让语言为我们所用。还有我们碰到的OutOfMemoryErrors是异常处理的缺陗这一处理q程是:

使用finally模块关闭文gQ解析异总得到出现问题的方法和代码行。在q一 q程之内最大的~陷是需要捕获OutOfMemoryErrorQ而这一异常却ƈ不是可检查异常!x看,内存耗尽是相当常见的情况。Q何与内存使用状? 紧密相关的程序都应当捕获和处理这一错误?

使用异常时的一些徏?/strong>

1、异常控制的设计宗旨q不是用来代替一些简单的试。只有在异常情况下才使用异常Q?

2、不要过分细化异常。不要在每个语句上都加上异常处理Q最好将整个d都放在try块内。如果其中有一Ҏ作失败,可以随即攑ּd?

3、不?#8220;压制”异常。对于需要通告异常的方法,我们可以改用捕捉的方法来异常强行关闭,如果真的出现异常Q那个异怼?#8220;静悄?#8221;的忽略。如果觉得生的异常会非帔R要,必d费些功夫Q对其进行正的控制?

4、不要介意异常的传递。如果调用的Ҏ会生异常,比如readLineҎQ他们天生就能捕捉自己可能生的异常Q在q种情况下,一U更好地做法是将q些异常传递出去,而不是自己动手来捕捉它?/font>



lau 2009-04-21 16:02 发表评论
]]> 配置Spring数据?/title><link>http://www.tkk7.com/alinglau36/archive/2009/04/17/266167.html</link><dc:creator>lau</dc:creator><author>lau</author><pubDate>Fri, 17 Apr 2009 07:29:00 GMT</pubDate><guid>http://www.tkk7.com/alinglau36/archive/2009/04/17/266167.html</guid><wfw:comment>http://www.tkk7.com/alinglau36/comments/266167.html</wfw:comment><comments>http://www.tkk7.com/alinglau36/archive/2009/04/17/266167.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/alinglau36/comments/commentRss/266167.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/alinglau36/services/trackbacks/266167.html</trackback:ping><description><![CDATA[配置一个数据源 <br />     Spring在第三方依赖包中包含了两个数据源的实现类包,其一是Apache的DBCPQ其二是 C3P0。可以在Spring配置文g中利用这两者中M一个配|数据源?br /> <br />  DBCP数据?nbsp;<br />     DBCP cd位于 /lib/jakarta-commons/commons-dbcp.jarQDBCP是一个依?nbsp;Jakarta commons- pool对象池机制的数据库连接池Q所以在c\径下q必d?lib/jakarta- commons/commons-pool.jar。下面是? 用DBCP配置MySql数据源的配置片断Q?br /> <br /> xml 代码<br /> <div> <div> <div><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div> </div> <ol start="1"> <li><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"          </li> <li>        destroy-method="close">          </li> <li>    <property name="driverClassName" value="com.mysql.jdbc.Driver" />         </li> <li>    <property name="url" value="jdbc:mysql://localhost:3309/sampledb" />         </li> <li>    <property name="username" value="root" />         </li> <li>    <property name="password" value="1234" />         </li> <li></bean>     </li> </ol> </div> <textarea style="display: none;" name="code" class="xml"><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3309/sampledb" /> <property name="username" value="root" /> <property name="password" value="1234" /> </bean> </textarea><br /> BasicDataSource提供了close()Ҏ关闭数据源,所以必设定destroy-method=”close”属性, 以便Spring容器关闭Ӟ数据源能够正常关闭。除以上必须的数据源属性外Q还有一些常用的属性: <br />     defaultAutoCommitQ设|从数据源中q回的连接是否采用自动提交机Ӟ默认gؓ trueQ?nbsp;<br />     defaultReadOnlyQ设|数据源是否仅能执行只读操作Q?nbsp;默认gؓ falseQ?nbsp;<br />     maxActiveQ最大连接数据库q接敎ͼ讄?Ӟ表示没有限制Q?nbsp;<br />     maxIdleQ最大等待连接中的数量,讄?Ӟ表示没有限制Q?nbsp;<br />     maxWaitQ最大等待秒敎ͼ单位为毫U, 过旉会报出错误信息; <br />     validationQueryQ用于验证连接是否成功的查询SQL语句QSQL语句必须臛_要返回一行数据, 如你可以单地讄为:“select count(*) from user”Q?nbsp;<br />     removeAbandonedQ是否自我中断,默认?nbsp;false Q?nbsp;<br />     removeAbandonedTimeoutQ几U后数据q接会自动断开Q在removeAbandoned为trueQ提供该| <br />     logAbandonedQ是否记录中断事Ӟ 默认?nbsp;falseQ?nbsp;<br /> <br /> C3P0数据?nbsp;<br />     C3P0 是一个开放源代码的JDBC数据源实现项目,它在lib目录中与Hibernate一起发布,实现了JDBC3和JDBC2扩展规范说明 ?nbsp;Connection 和Statement 池。C3P0cd位于/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用C3P0配置 一?nbsp;oracle数据源:<br /> <br /> xml 代码<br /> <div> <div> <div><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div> </div> <ol start="1"> <li><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"          </li> <li>        destroy-method="close">         </li> <li>    <property name="driverClass" value=" oracle.jdbc.driver.OracleDriver "/>         </li> <li>    <property name="jdbcUrl" value=" jdbc:oracle:thin:@localhost:1521:ora9i "/>         </li> <li>    <property name="user" value="admin"/>         </li> <li>    <property name="password" value="1234"/>         </li> <li></bean>     </li> </ol> </div> <textarea style="display: none;" name="code" class="xml"><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value=" oracle.jdbc.driver.OracleDriver "/> <property name="jdbcUrl" value=" jdbc:oracle:thin:@localhost:1521:ora9i "/> <property name="user" value="admin"/> <property name="password" value="1234"/> </bean> </textarea><br /> ComboPooledDataSource和BasicDataSource一h供了一个用于关闭数据源的close()ҎQ这h们就可以保证Spring容器关闭时数据源能够成功释放?nbsp;<br />     C3P0拥有比DBCP更丰富的配置属性,通过q些属性,可以Ҏ据源q行各种有效的控Ӟ <br />     acquireIncrementQ当q接池中的连接用完时QC3P0一ơ性创建新q接的数目; <br />     acquireRetryAttemptsQ定义在从数据库获取新连接失败后重复试获取的次敎ͼ默认?0Q?nbsp;<br />     acquireRetryDelayQ两ơ连接中间隔旉Q单位毫U,默认?000Q?nbsp;<br />     autoCommitOnCloseQ连接关闭时默认所有未提交的操作回滚。默认ؓfalseQ?nbsp;<br />     automaticTestTableQ?nbsp;C3P0 徏一张名为Test的空表,q用其自带的查询语句进行测试。如果定义了q个参数Q那么属性preferredTestQuery被忽略。你 不能? q张Test表上q行M操作Q它中为C3P0试所用,默认为nullQ?nbsp;<br />     breakAfterAcquireFailureQ获? q接p|会引v所有等待获取连接的U程抛出异常。但是数据源仍有效保留,q在下次?nbsp;  用getConnection()的时候l尝试获取连接。如 果设为trueQ那么在试获取q接p|后该数据源将x已断开q永久关闭。默认ؓ falseQ?nbsp;<br />     checkoutTimeoutQ当q接池用完时客户端调用getConnection()后等待获取新q接的时_时后将抛出SQLExceptionQ如设ؓ0则无限期{待。单位毫U,默认?Q?nbsp;<br />     connectionTesterClassNameQ?nbsp;? q实现ConnectionTester或QueryConnectionTester的类来测试连接,cd需讄为全限定名。默? ?nbsp;com.mchange.v2.C3P0.impl.DefaultConnectionTesterQ?nbsp;<br />     idleConnectionTestPeriodQ隔多少U检查所有连接池中的I闲q接Q默认ؓ0表示不检查; <br />     initialPoolSizeQ初始化时创建的q接敎ͼ应在minPoolSize与maxPoolSize之间取倹{默认ؓ3Q?nbsp;<br />     maxIdleTimeQ最大空闲时_过I闲旉的连接将被丢弃。ؓ0或负数则怸丢弃。默认ؓ0Q?nbsp;<br />     maxPoolSizeQ连接池中保留的最大连接数。默认ؓ15Q?nbsp;<br />     maxStatementsQJDBC 的标准参敎ͼ用以控制数据源内加蝲的PreparedStatement数量。但׃预缓存的Statement?nbsp;于单个Connection而不是整 个连接池。所以设|这个参数需要考虑到多斚w的因素,如果maxStatements?nbsp;maxStatementsPerConnection均ؓ0Q? 则缓存被关闭。默认ؓ0Q?nbsp;<br />     maxStatementsPerConnectionQ连接池内单个连接所拥有的最大缓存Statement数。默认ؓ0Q?nbsp;<br />     numHelperThreadsQC3P0是异步操作的Q缓慢的JDBC操作通过帮助q程完成。扩展这些操作可以有效的提升性能Q通过多线E实现多个操作同时被执行。默认ؓ3Q?nbsp;<br />     preferredTestQueryQ定义所有连接测试都执行的测试语句。在使用q接试的情况下q个参数能显著提高测试速度。测试的表必d初始数据源的时候就存在。默认ؓnullQ?nbsp;<br />     propertyCycleQ?nbsp;用户修改pȝ配置参数执行前最多等待的U数。默认ؓ300Q?nbsp;<br />     testConnectionOnCheckoutQ? 因性能消耗大请只在需要的时候用它。如果设为true那么在每个connection提交的时候都 校验其有效性。徏议? idleConnectionTestPeriod或automaticTestTable <br /> {方法来提升q接试的性能。默认ؓfalseQ?nbsp;<br />     testConnectionOnCheckinQ如果设为true那么在取得连接的同时校验连接的有效性。默认ؓfalse?nbsp;<br /> <br /> 读配|文件的方式引用属性: <br /> <div> <div> <div><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div> </div> <ol start="1"> <li><bean id="propertyConfigurer"        </li> <li>class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">         </li> <li>    <property name="location" value="/WEB-INF/jdbc.properties"/>         </li> <li></bean>         </li> <li><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"          </li> <li>        destroy-method="close">         </li> <li>    <property name="driverClassName" value="${jdbc.driverClassName}" />         </li> <li>    <property name="url" value="${jdbc.url}" />         </li> <li>    <property name="username" value="${jdbc.username}" />         </li> <li>    <property name="password" value="${jdbc.password}" />         </li> <li></bean>      </li> </ol> </div> <textarea style="display: none;" name="code" class="xml"><bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="/WEB-INF/jdbc.properties"/> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> </textarea><br />     在jdbc.properties属性文件中定义属性| <br />    jdbc.driverClassName= com.mysql.jdbc.Driver <br />     jdbc.url= jdbc:mysql://localhost:3309/sampledb <br />     jdbc.username=root <br />     jdbc.password=1234 <br />     提示 l常有开发者在${xxx}的前后不心键入一些空|q些I格字符和变量合ƈ后作为属性的倹{如Q?nbsp;的属性配|项Q在前后都有I格Q被解析后,username的gؓ“ 1234 ”Q这造成最l的错误Q因此需要特别小心?br /> <br />  获取JNDI数据?nbsp;<br />     ? 果应用配|在高性能的应用服务器Q如WebLogic或Websphere{)上,我们可能更希望用应用服务器本n提供的数据源。应用服务器的数? ?nbsp;使用JNDI开放调用者用,Spring为此专门提供引用JNDI资源的JndiObjectFactoryBeancR下面是一个简单的配置Q?br /> <br /> xml 代码<br /> <div> <div> <div><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div> </div> <ol start="1"> <li><bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">         </li> <li>    <property name="jndiName" value="java:comp/env/jdbc/bbt"/>         </li> <li></bean>     </li> </ol> </div> <textarea style="display: none;" name="code" class="xml"><bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="java:comp/env/jdbc/bbt"/> </bean> </textarea><br /> 通过jndiName指定引用的JNDI数据源名U?nbsp;<br />     Spring 2.0取J2EE资源提供了一个jee命名I间Q通过jee命名I间Q可以有效地化J2EE资源的引用。下面是使用jee命名I间引用JNDI数据源的配置Q?nbsp;<br /> <br /> xml 代码<br /> <div> <div> <div><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div> </div> <ol start="1"> <li><beans xmlns=http://www.springframework.org/schema/beans       </li> <li>xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance       </li> <li>xmlns:jee=http://www.springframework.org/schema/jee       </li> <li>xsi:schemaLocation="http://www.springframework.org/schema/beans        </li> <li>http://www.springframework.org/schema/beans/spring-beans-2.0.xsd        </li> <li>http://www.springframework.org/schema/jee       </li> <li>http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">         </li> <li><jee:jndi-lookup id="dataSource" jndi-name=" java:comp/env/jdbc/bbt"/>         </li> <li></beans>     </li> </ol> </div> <textarea style="display: none;" name="code" class="xml"><beans xmlns=http://www.springframework.org/schema/beans xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:jee=http://www.springframework.org/schema/jee xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd"> <jee:jndi-lookup id="dataSource" jndi-name=" java:comp/env/jdbc/bbt"/> </beans> </textarea><br /> Spring的数据源实现c?nbsp;<br />     Spring本n也提供了一个简单的数据源实现类 DriverManagerDataSource Q它位于org.springframework.jdbc.datasource包中。这个类实现? javax.sql.DataSource接口Q但 它ƈ没有提供池化q接的机Ӟ每次调用getConnection()获取新连接时Q只是简单地创徏 一个新的连接。因此,q个数据源类比较适合在单元测?nbsp;或简单的独立应用中用,因ؓ它不需要额外的依赖cR?nbsp;<br />      下面Q我们来看一下DriverManagerDataSource的简单用:当然Q我们也可以通过配置的方式直接用DriverManagerDataSource?br /> <br /> java 代码<br /> <div> <div> <div><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div> </div> <ol start="1"> <li>DriverManagerDataSource ds = new DriverManagerDataSource ();         </li> <li>ds.setDriverClassName("com.mysql.jdbc.Driver");         </li> <li>ds.setUrl("jdbc:mysql://localhost:3309/sampledb");         </li> <li>ds.setUsername("root");         </li> <li>ds.setPassword("1234");         </li> <li>Connection actualCon = ds.getConnection();     </li> </ol> </div> <textarea style="display: none;" name="code" class="java">DriverManagerDataSource ds = new DriverManagerDataSource (); ds.setDriverClassName("com.mysql.jdbc.Driver"); ds.setUrl("jdbc:mysql://localhost:3309/sampledb"); ds.setUsername("root"); ds.setPassword("1234"); Connection actualCon = ds.getConnection(); </textarea><br /> 结 <br />     不管采用何种持久化技术,都需要定义数据源。Spring附带了两个数据源的实现类包,你可以自? 选择q行定义。在实际部vӞ我们可能会直接采用应用服 务器本n提供的数据源Q这Ӟ则可以通过JndiObjectFactoryBean或jee? 名空间引用JNDI中的数据源?nbsp;<br /> <br /> DBCP与C3PO配置的区别:<br /> <br /> C3PO Q?br /> xml 代码<br /> <div> <div> <div><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div> </div> <ol start="1"> <li><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">     </li> <li>    <property name="driverClass">     </li> <li>        <value>oracle.jdbc.driver.OracleDrivervalue>     </li> <li>    </property>     </li> <li>    <property name="jdbcUrl">                </li> <li>        <value>jdbc:oracle:thin:@10.10.10.6:1521:DataBaseNamevalue>     </li> <li>    </property>     </li> <li>    <property name="user">     </li> <li>        <value>testAdminvalue>     </li> <li>    </property>     </li> <li>    <property name="password">     </li> <li>        <value>123456value>     </li> <li>    </property>     </li> <li></bean>     </li> </ol> </div> <textarea style="display: none;" name="code" class="xml"><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass"> <value>oracle.jdbc.driver.OracleDrivervalue> </property> <property name="jdbcUrl"> <value>jdbc:oracle:thin:@10.10.10.6:1521:DataBaseNamevalue> </property> <property name="user"> <value>testAdminvalue> </property> <property name="password"> <value>123456value> </property> </bean> </textarea><br />  DBCPQ?br /> <br /> xml 代码<br /> <div> <div> <div><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div> </div> <ol start="1"> <li><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">     </li> <li>    <property name="driverClassName">     </li> <li>        <value>oracle.jdbc.driver.OracleDrivervalue>     </li> <li>    </property>     </li> <li>    <property name="url">                </li> <li>        <value>jdbc:oracle:thin:@10.10.10.6:1521:DataBaseNamevalue>     </li> <li>     </property>     </li> <li>    <property name="username">     </li> <li>        <value>testAdminvalue>     </li> <li>    </property>     </li> <li>    <property name="password">     </li> <li>        <value>123456value>     </li> <li>    </property>     </li> <li></bean>     </li> </ol> </div> <textarea style="display: none;" name="code" class="xml"><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>oracle.jdbc.driver.OracleDrivervalue> </property> <property name="url"> <value>jdbc:oracle:thin:@10.10.10.6:1521:DataBaseNamevalue> </property> <property name="username"> <value>testAdminvalue> </property> <property name="password"> <value>123456value> </property> </bean</textarea><br /> <br /> <img src="http://www.xyhot.com/images/icon_trackback.gif" style="margin: 0px 2px -4px 0px;" alt="" /><strong>引用地址:</strong> <a target="_blank">http://www.xyhot.com/trackback.asp?tbID=274</a> <img src ="http://www.tkk7.com/alinglau36/aggbug/266167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/alinglau36/" target="_blank">lau</a> 2009-04-17 15:29 <a href="http://www.tkk7.com/alinglau36/archive/2009/04/17/266167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 泛型http://www.tkk7.com/alinglau36/archive/2009/03/05/257984.htmllaulauThu, 05 Mar 2009 05:53:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/03/05/257984.htmlhttp://www.tkk7.com/alinglau36/comments/257984.htmlhttp://www.tkk7.com/alinglau36/archive/2009/03/05/257984.html#Feedback1http://www.tkk7.com/alinglau36/comments/commentRss/257984.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/257984.html泛型是JAVA SE 1.5的新Ҏ,泛型的本质是参数化类型,也就是说所操作的数据类型被指定Z个参数。这U参数类型可以用在类、接口和Ҏ的创ZQ分别称为泛型类、泛型接口、泛型方法?/div>
 
JAVA语言引入泛型的好处是安全单?/div>
 
在JAVA SE 1.5之前Q没有泛型的情况的下Q通过对类型Object的引用来实现参数?#8220;L?#8221;Q?#8220;L?#8221;带来的缺Ҏ要做昑ּ的强制类型{换,而这U{换是要求开发者对实际参数cd可以预知的情况下q行的。对于强制类型{换错误的情况Q编译器可能不提C错误,在运行的时候才出现异常Q这是一个安全隐患?/div>
 
泛型的好处是在编译的时候检查类型安全,q且所有的强制转换都是自动和隐式的Q提高代码的重用率?/div>
 
泛型在用中q有一些规则和限制Q?/strong>
1、泛型的cd参数只能是类cdQ包括自定义c)Q不能是单类型?/div>
2、同一U泛型可以对应多个版本(因ؓ参数cd是不定的)Q不同版本的泛型cd例是不兼容的?/div>
3、泛型的cd参数可以有多个?/div>
4、泛型的参数cd可以使用extends语句Q例?lt;T extends superclass>。习惯上成ؓ“有界cd”?/div>
5、泛型的参数cdq可以是通配W类型。例如Class<?> classType = Class.forName(java.lang.String);
 
泛型q有接口、方法等{,内容很多Q需要花费一番功夫才能理解掌握ƈ熟练应用。在此给出我曄了解泛型时候写出的两个例子Q根据看的印象写的)Q实现同L功能Q一个用了泛型Q一个没有用,通过ҎQ可以很快学会泛型的应用Q学会这个基本上学会了泛?0%的内宏V?/div>
 
估计你快{不及了Q现在就贴出源码Q?/div>
 
例子一Q用了泛型
 
public class Gen<T> {
    private T ob;   //定义泛型成员变量
 
    public Gen(T ob) {
        this.ob = ob;
    }
 
    public T getOb() {
        return ob;
    }
 
    public void setOb(T ob) {
        this.ob = ob;
    }
 
    public void showTyep() {
        System.out.println("T的实际类型是: " + ob.getClass().getName());
    }
}
 
public class GenDemo {
    public static void main(String[] args){
        //定义泛型cGen的一个Integer版本
        Gen<Integer> intOb=new Gen<Integer>(88);
        intOb.showTyep();
        int i= intOb.getOb();
        System.out.println("value= " + i);
 
        System.out.println("----------------------------------");
 
        //定义泛型cGen的一个String版本
        Gen<String> strOb=new Gen<String>("Hello Gen!");
        strOb.showTyep();
        String s=strOb.getOb();
        System.out.println("value= " + s);
    }
}
 
 
例子二:没有使用泛型
 
public class Gen2 {
    private Object ob;      //定义一个通用cd成员
 
    public Gen2(Object ob) {
        this.ob = ob;
    }
 
    public Object getOb() {
        return ob;
    }
 
    public void setOb(Object ob) {
        this.ob = ob;
    }
 
    public void showTyep() {
        System.out.println("T的实际类型是: " + ob.getClass().getName());
    }
}
 
 
public class GenDemo2 {
    public static void main(String[] args) {
        //定义cGen2的一个Integer版本
        Gen2 intOb = new Gen2(new Integer(88));
        intOb.showTyep();
        int i = (Integer) intOb.getOb();
        System.out.println("value= " + i);
 
        System.out.println("----------------------------------");
 
        //定义cGen2的一个String版本
        Gen2 strOb = new Gen2("Hello Gen!");
        strOb.showTyep();
        String s = (String) strOb.getOb();
        System.out.println("value= " + s);
    }
}
 
 
q行l果Q?/font>
 
两个例子q行Demol果是相同的,控制台输出结果如下:
 
T的实际类型是: java.lang.Integer
value= 88
----------------------------------
T的实际类型是: java.lang.String
value= Hello Gen!
 
Process finished with exit code 0
 
 
看明白这个,以后基本的泛型应用和代码阅读׃成问题了?/div>
 
 

本文 “??/a>” 博客


http://lavasoft.blog.51cto.com/62575/42400


lau 2009-03-05 13:53 发表评论
]]>Collection List Set Map 区别http://www.tkk7.com/alinglau36/archive/2009/03/04/257746.htmllaulauWed, 04 Mar 2009 03:51:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/03/04/257746.htmlhttp://www.tkk7.com/alinglau36/comments/257746.htmlhttp://www.tkk7.com/alinglau36/archive/2009/03/04/257746.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/257746.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/257746.html
Collection List Set Map 区别

有序?/font>
允许元素重复?/font>
Collection
?/font>
?/font>
List
?/font>
?/font>
Set
AbstractSet
?/font>
?/font>
HashSet
TreeSet
是(用二叉树排序Q?/font>
Map
AbstractMap
?/font>
使用key-value来映和存储数据QKey必须惟一Qvalue可以重复
HashMap
TreeMap
是(用二叉树排序Q?/font>
U性表Q链表,哈希表是常用的数据结构,在进?/span>Java开发时Q?/span>JDK已经为我们提供了一pd相应的类来实现基本的数据l构。这些类均在java.util包中。本文试N过单的描述Q向读者阐q各个类的作用以及如何正用这些类?/span>
Collection
?/font>List
│├
LinkedList
│├
ArrayList
│└
Vector
?/span> ?/span>
Stack
?/span>
Set
Map
?/span>
Hashtable
?/span>
HashMap
?/span>
WeakHashMap
Co
llection接口

  Collection是最基本的集合接口,一?/span>Collection代表一l?/span>ObjectQ即Collection的元素(ElementsQ。一?/span>Collection允许相同的元素而另一些不行。一些能排序而另一些不行?/span>Java SDK不提供直接承自Collection的类Q?/span>Java SDK提供的类都是l承?/span>Collection?/span>子接?/span>?/span>List?/span>Set?/span>

  所有实?/span>Collection接口的类都必L供两个标准的构造函敎ͼ无参数的构造函数用于创Z个空?/span>CollectionQ有一?/span>Collection参数的构造函数用于创Z个新?/span>CollectionQ这个新?/span>Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一?/span>Collection?/span>

  如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一?/span>iterator()的方法,该方法返回一个P代子Q用该q代子即可逐一讉KCollection中每一个元素。典型的用法如下Q?/span>

    Iterator it = collection.iterator(); // 获得一个P代子

    
while(it.hasNext()) {
      Object obj = it.next(); // 得到下一个元?/span>

    
}
  ?/span>Collection接口z的两个接口是List?/span>Set?/span>

List
接口

List
是有序的CollectionQ用此接口能够_的控制每个元素插入的位置。用戯够用烦引(元素?/span>List中的位置Q类g数组下标Q来讉KList中的元素Q这cM?/span>Java的数l?/span>

和下面要提到?/span>Set不同Q?/span>List允许有相同的元素?/span>

  除了hCollection接口必备?/span>iterator()Ҏ外,Listq提供一?/span>listIterator()ҎQ返回一?/span>ListIterator接口Q和标准?/span>Iterator接口相比Q?/span>ListIterator多了一?/span>add()之类的方法,允许dQ删除,讑֮元素Q还能向前或向后遍历?/span>

  实现List接口的常用类?/span>LinkedListQ?/span>ArrayListQ?/span>Vector?/span>Stack?/span>

LinkedList
c?/strong>

  LinkedList实现?/span>List接口Q允?/span>null元素。此?/span>LinkedList提供额外?/span>getQ?/span>removeQ?/span>insertҎ?/span>LinkedList的首部或N。这些操作LinkedList可被用作堆栈Q?/span>stackQ,队列Q?/span>queueQ或双向队列Q?/span>dequeQ?/span>

  注意LinkedList没有同步Ҏ。如果多个线E同时访问一?/span>ListQ则必须自己实现讉K同步。一U解x法是在创?/span>List时构造一个同步的ListQ?/span>

    
List list = Collections.synchronizedList(new LinkedList(...));
ArrayList
c?/font>
  ArrayList实现了可变大的数组。它允许所有元素,包括null?/span>ArrayList没有同步?/span>sizeQ?/span>isEmptyQ?/span>getQ?/span>setҎq行旉为常数。但?/span>addҎ开销为分摊的常数Q添?/span>n个元素需?/span>O(n)的时间。其他的Ҏq行旉为线性?/span>

  每个ArrayList实例都有一个容量(CapacityQ,即用于存储元素的数组的大。这个容量可随着不断d新元素而自动增加,但是增长法q没有定义。当需要插入大量元素时Q在插入前可以调?/span>ensureCapacityҎ来增?/span>ArrayList的容量以提高插入效率?/span>

  ?/span>LinkedList一PArrayList也是非同步的Q?/span>unsynchronizedQ?/span>

Vector
c?/font>
  Vector非常cMArrayListQ但?/span>Vector是同步的。由Vector创徏?/span>IteratorQ虽然和ArrayList创徏?/span>Iterator是同一接口Q但是,因ؓVector是同步的Q当一?/span>Iterator被创且正在被用,另一个线E改变了Vector的状态(例如Q添加或删除了一些元素)Q这时调?/span>Iterator的方法时抛?/span>ConcurrentModificationExceptionQ因此必L莯异常?/span>

Stack
c?/font>
  Stackl承?/span>VectorQ实C个后q先出的堆栈?/span>Stack提供5个额外的Ҏ使得Vector得以被当作堆栈用。基本的push?/span>popҎQ还?/span>peekҎ得到栈顶的元素,emptyҎ试堆栈是否为空Q?/span>searchҎ一个元素在堆栈中的位置?/span>Stack刚创建后是空栈?/span>

Set
接口

  Set是一U不包含重复的元素的CollectionQ即L的两个元?/span>e1?/span>e2都有e1.equals(e2)=falseQ?/span>Set最多有一?/span>null元素?/span>

  很明显,Set的构造函数有一个约束条Ӟ传入?/span>Collection参数不能包含重复的元素?/span>

h意:必须心操作可变对象Q?/span>Mutable ObjectQ。如果一?/span>Set中的可变元素改变了自w状?/span>DObject.equals(Object)=true导致一些问题?/span>
Map
接口

  h意,Map没有l承Collection接口Q?/span>Map提供key?/span>value的映。一?/span>Map中不能包含相同的keyQ每?/span>key只能映射一?/span>value?/span>Map接口提供3U集合的视图Q?/span>Map的内容可以被当作一l?/span>key集合Q一l?/span>value集合Q或者一l?/span>key-value映射?/span>

Hashtable
c?/font>
  Hashtablel承Map接口Q实C?/span>key-value映射的哈希表。Q何非I(non-nullQ的对象都可作ؓkey或?/span>value?/span>

  d数据使用put(key, value)Q取出数据?/span>get(key)Q这两个基本操作的时间开销为常数?/span>

  Hashtable通过initial capacity?/span>load factor两个参数调整性能。通常~省?/span>load factor 0.75较好地实C旉和空间的均衡。增?/span>load factor可以节省I间但相应的查找旉增大,q会影响?/span>get?/span>putq样的操作?/span>

使用Hashtable的简单示例如下,?/span>1Q?/span>2Q?/span>3攑ֈHashtable中,他们?/span>key分别?/span>”one”Q?/span>”two”Q?/span>”three”Q?/span>

    
Hashtable numbers = new Hashtable();
    
numbers.put(“one”, new Integer(1));
    
numbers.put(“two”, new Integer(2));
    
numbers.put(“three”, new Integer(3));
  要取Z个数Q比?/span>2Q用相应?/span>keyQ?/span>

    
Integer n = (Integer)numbers.get(“two”);
    
System.out.println(“two = ” + n);
  ׃作ؓkey的对象将通过计算其散列函数来定与之对应?/span>value的位|,因此M作ؓkey的对象都必须实现hashCode?/span>equalsҎ?/span>hashCode?/span>equalsҎl承自根c?/span>ObjectQ如果你用自定义的类当作key的话Q要相当心Q按照散列函数的定义Q如果两个对象相同,?/span>obj1.equals(obj2)=trueQ则它们?/span>hashCode必须相同Q但如果两个对象不同Q则它们?/span>hashCode不一定不同,如果两个不同对象?/span>hashCode相同Q这U现象称为冲H,冲突会导致操作哈希表的时间开销增大Q所以尽量定义好?/span>hashCode()ҎQ能加快哈希表的操作?/span>

  如果相同的对象有不同?/span>hashCodeQ对哈希表的操作会出现意想不到的l果Q期待的getҎq回nullQ,要避免这U问题,只需要牢C条:要同时复?/span>equalsҎ?/span>hashCodeҎQ而不要只写其中一个?/span>

  Hashtable是同步的?/span>

HashMap
c?/font>
  HashMap?/span>HashtablecMQ不同之处在?/span>HashMap是非同步的,q且允许nullQ即null value?/span>null key。,但是?/span>HashMap视ؓCollectionӞvalues()Ҏ可返?/span>CollectionQ,其P代子操作旉开销?/span>HashMap的容量成比例。因此,如果q代操作的性能相当重要的话Q不要将HashMap的初始化定w讑־q高Q或?/span>load factorq低?/span>

WeakHashMap
c?/font>
  WeakHashMap是一U改q的HashMapQ它?/span>key实行弱引?/span>Q如果一?/span>key不再被外部所引用Q那么该key可以?/span>GC回收?/span>
ȝ

  如果涉及到堆栈,队列{操作,应该考虑?/span>ListQ对于需要快速插入,删除元素Q应该?/span>LinkedListQ如果需要快速随问元素,应该使用ArrayList?/span>

  如果E序在单U程环境中,或者访问仅仅在一个线E中q行Q考虑非同步的c,其效率较高,如果多个U程可能同时操作一个类Q应该用同步的cR?/span>

  要特别注意对哈希表的操作Q作?/span>key的对象要正确复写equals?/span>hashCodeҎ?/span>

  量q回接口而非实际的类型,如返?/span>List而非ArrayListQ这样如果以后需要将ArrayList换成LinkedListӞ客户端代码不用改变。这是针对抽象~程?/span>


lau 2009-03-04 11:51 发表评论
]]>
TokenQo牌)的机制来解决重复提交http://www.tkk7.com/alinglau36/archive/2009/02/18/255283.htmllaulauWed, 18 Feb 2009 07:39:00 GMThttp://www.tkk7.com/alinglau36/archive/2009/02/18/255283.htmlhttp://www.tkk7.com/alinglau36/comments/255283.htmlhttp://www.tkk7.com/alinglau36/archive/2009/02/18/255283.html#Feedback0http://www.tkk7.com/alinglau36/comments/commentRss/255283.htmlhttp://www.tkk7.com/alinglau36/services/trackbacks/255283.html
假设Q假设有一个新增用L填写表单面Q填写完后点击"提交Q按钮完成数据库录入功能Q要求不能重复提交(指类似刷新页面的情况Q.此时Q需要有两个actionQ第一个action用来生成hidden的token|W二个action用来校验token|通过判断来决定是不是重复提交Q不是则提交操作Q否则提C错误)和至一个页面(保存token值和填写用户信息的录入页面)来完成校验是否重复提交.此处有两个页面来完成Q?

Z方便Q用戯只有两个字段用户名<usernameQ和密码QpasswordQ:

具体逻辑如下Q?

index.jsp--链接--> PrepareAddUserAction.java--转发q生成token--> addUser.jsp--提交-->
AddUserAction.java--首先校验 '是否重复提交 ',是提C错误信?不是,执行数据库操?

部分相关代码(省略formbean的代?:
========index.jsp========
<html> <head> <title> 试 </title> </head> <body>
    <a   href= " <%=request.getContextPath()%> /PrepareAddUserAction.java "> 新增用户 </a>
</body> </html>

=========PrepareAddUserAction.java=========
package   com.tseyimwah.struts.action;

import   javax.servlet.http.HttpServletRequest;
import   javax.servlet.http.HttpServletResponse;

import   org.apache.struts.action.Action;
import   org.apache.struts.action.ActionForm;
import   org.apache.struts.action.ActionForward;
import   org.apache.struts.action.ActionMapping;

public   class   PrepareAddUserAction   extends   Action   {
public   ActionForward   execute(
ActionMapping   mapping,
ActionForm   form,
HttpServletRequest   request,
HttpServletResponse   response)   throws   HibernateException   {
                                    .........//相关Ҏ
                                    saveToken(request);     //在下一个页面addUser.jsp生成hiddencd的token?
return   mapping.findForward( "addUser ");//面跌{
}
}

==========addUser.jsp=============
此处代码没有什么要?含有form的普通struts面,代码省略,里面?"提交 "按纽lAddUserAction.java,? <html:form     action= "/AddUserAction.do "   method= "post ">

============AddUserAction.java=====
package   com.tseyimwah.struts.action;

import   javax.servlet.http.HttpServletRequest;
import   javax.servlet.http.HttpServletResponse;

import   org.apache.struts.action.Action;
import   org.apache.struts.action.ActionForm;
import   org.apache.struts.action.ActionForward;
import   org.apache.struts.action.ActionMapping;

public   class   AddUserAction   extends   Action   {
public   ActionForward   execute(
ActionMapping   mapping,
ActionForm   form,
HttpServletRequest   request,
HttpServletResponse   response)   throws   HibernateException   {
         
      //判断token?如果是重复提交蟩转到错误面则提C出错信?否则执行相关的数据库操作
      if   (!isTokenValid(request)){
            request.setAttribute(GlobalKeys.MESSAGE_ID,   "不允讔R复提? ");//讄出错信息
            return   (mapping.findForward( "errorPage "));
      }   else
          resetToken(request);   //重新讄token?可不?
      }
      ......
      ......//其他的相x?如设|相兛_性?调用相关的数据库操作{?
      return   (mapping.findForward( "addUserSucess "));//新增用户成功的页?
}


q只是将相关的必要代码写?Ҏ需要可以改写相关的代码.

lau 2009-02-18 15:39 发表评论
]]>
վ֩ģ壺 AVӰ߹ۿ | avӰ| СƵ߹ۿ| avպav| þþþav| aһƵ| þþþ뾫Ʒպ| avh˶ڵ| þþƷAVý | ëƬ߹ۿַ| 99ŮŮѾƷƵ߹ۿ| Ƶ| վѹۿ| ˬָ߳ëƬ | þùɫAVѿ| 99߹ۿƷ99| ѹۿ㶮| ëƬӰƬ| ŮſȵͰƵ | ձĻ| ѿƬ߹ۿ| Ů18ëƬˮѿ| ˾Ʒ123Ƶ| Ƶ| Ʒþþ| ޾Ʒ**ëƬ| ޹һ߹ۿ| ߹ۿAVպAV| ˳վ߹ۿ| sssձ߹ۿ| ھƷһëƬѿ| Ƶվwww| Ƶ߹ۿ| Ƭһ| ޳˼| | aëƬѸƵ| 67194ֻѹۿ| ββ8xѾþ| ۺav뾫Ʒһ| 99riƷ|