??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>。按我们寚w辑q算的正常认识,逻辑q算的结果因该是ture或者false。但是JScript的逻辑q算却不完全是这么定义的Q这里只?q算WLq回true|falseQ而||?amp;&q算比较的好玩?br />
JScript对于逻辑q算?font color="#0000ff">true|false是这么定义的Q?
可是逻辑q算W?strong>||?strong>&&虽然遵@上面的定义规则,但是它们q回的值却很有意思?br /> 对于&&q算Q按照上面的规则Q表辑ּ if ( 'abc' && '123' && new Date() ) 是执行true分支Q可是这个表辑ּ如果写成Q?/p>
l果value=Fri Jan 21 00:01:17 UTC+0800 2005Q原它从左到x,如果C最后一个表辑ּ也是为true的,p回那个表辑ּ?/p>
对于||q算同理Q对于下面的表达式:
l果value1='abc'Qvalue2='ok'。这是因为||q算会有"短\"Ҏ,他也是从左向x,只不q它是一但发现有为true的|q卌回该表达式?br /> q样的特性可以帮l我们写出精的代码,可是同时也带来代码不便于阅读l护的问题?br /> ׃我手头暂时没有NS和moz什么的览器,不知道标准JavaScript是否也是q样支持的?如果您方便的话,请告如我q行后的l果
typeof函数的用法可能不用我多说Q大安知道怎么用。而constructor属性大家可能就陌生炏V在《精通JavaScript》这本书中有提到construct的用法,但我用自q几个览器(IE7.0 / Firefox1.9 / Opera9.50Q测试的l果却和书上说的不一栗但是仍然是有办法通过constructor属性来查变量类型的?br />
q里先补充一下,Z么明明有typeof函数可以很方便地用来类型,q要用constructor呢?
因ؓtypeof会把所有的数组cd以及用户自定义类型判断ؓobjectQ从而无法知道更切的信息。而constructor却可以解册个问题?/span>
okQ明白了我们Z么要用constructorQ现在让我带大家一步步认识一下typeof和constructor用法之间的差异吧?/span>
首先我们q行一下下面这D代码:
q?行代码告诉你什么情况下可以用constructor?br />
你可以看到第2行返回了字符?undefined'Q而第三行则发生了错误Q原因是i变量q没有类型定义,自然也没有constructor的存在?
从这一点上看,typeof可以查到变量是否有定义,?strong>construct只能查已定义变量的类?/strong>?/span>
再运行一下下面这D代码:
你会看到W?行返回了字符?number’Q第3行返回了一串类似函数定义的代码字符Ԍq就是跟《精通JavaScript》一书中介绍的不一L地方Q?br /> 我们再用typeof查一下constructor到底是个什么样cd的属性,W?行返回结?function'Q也是_实际上constructor是一个函敎ͼ更确切地说是一个构造函数。这时你可以知道,Z么constructor可以查出各种cd了?/span>
有经验的E序员看到这里应该知道要怎么利用constructor来检查变量类型了。方法有多种Q这里提供一U比较容易理解的Ҏ?/span>
其实x很简单,是把construcor转化为字W串Q通过L匚w字符Ԍfunction名)来确定是否指定类?/strong>。如下例子:
q仅仅是个简单的例子。如果返回true则变量i不是usercdQ返回false则变量是usercd?br /> 当然Q这h是不够_的,比如其实他是一个myusercd的时候,同样会被认ؓ是usercR所以你需要书写更_的正则表辑ּ去进行匹配?/span>
可以q样单改q你的正则表辑ּQ?br />
替换上面代码D中?user/。当Ӟ如果你的构造函数原型是user(a)Q那么应该这样书写你的正则表辑ּQ?br />
到这里你应该知道怎样使用constructorcdL查变量类型了吧?
okQ最后再提个醒,如果你要用基于constructor的方法去查一些基本类型,?br />
Object / Array / Function / String / Number / Boolean
在你的正则表辑ּ中,一定要这些单词的首字母大?/strong>Q!而如果该cd是自定义cdQ则Ҏ你定义的时候标识符的写法确定?/span>
反射
相对而言Q反比内省更容易理解一炏V用一句比较白的话来概括,反射是让你可以通过名称来得到对?c,属性,Ҏ)的技术。例如我们可以通过cd来生成一个类的实例;知道了方法名Q就可以调用q个ҎQ知道了属性名可以访问这个属性的倹{?/span>
q是写两个例子让大家更直观的了解反射的用方法:
上面的两个例子是比较常用Ҏ。看C面的例子有发问了:Z么要q么ȝ呢?本来一条语句就完成的事情干吗要整这么复杂?没错Q在上面的例子中实没有必要q么ȝ。不q你惛_q样一个应用程序,它支持动态的功能扩展Q也是说程序不重新启动但是可以自动加蝲新的功能Q这个功能用一个具体类来表C。首先我们必Mؓq些功能定义一个接口类Q然后我们要求所有扩展的功能cdd现我指定的接口,q个规定了应用程序和可扩展功能之间的接口规则Q但是怎么动态加载呢Q我们必让应用E序知道要扩展的功能cȝcdQ比如是test.Func1Q当我们把这个类?字符?告诉应用E序后,它就可以使用我们W一个例子的Ҏ来加载ƈ启用新的功能。这是cȝ反射Q请问你有别的选择吗?
内省
内省是Java语言对Beancd性、事件的一U缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设|新的倹{通过getName/setName来访问name属性,q就是默认的规则。Java中提供了一套API用来讉K某个属性的getter/setterҎQ通过q些API可以使你不需要了解这个规则(但你最好还是要搞清楚)Q这些API存放于包java.beans中?/span>
一般的做法是通过cIntrospector来获取某个对象的BeanInfo信息Q然后通过BeanInfo来获取属性的描述器(PropertyDescriptorQ,通过q个属性描q器可以获取某个属性对应的getter/setterҎQ然后我们就可以通过反射机制来调用这些方法。下面我们来看一个例子,q个例子把某个对象的所有属性名U和值都打印出来Q?br />
Web开发框架Struts中的FormBean是通过内省机制来将表单中的数据映射到类的属性上Q因此要求FormBean的每个属性要有getter/setterҎ。但也ƈ不Lq样Q什么意思呢Q就是说对一个BeancLԌ我可以没有属性,但是只要有getter/setterҎ中的其中一个,那么Java的内省机制就会认为存在一个属性,比如cM有方法setMobileQ那么就认ؓ存在一个mobile的属性,q样可以方便我们把Beanc通过一个接口来定义而不用去关系具体实现Q不用去关系Bean中数据的存储。比如我们可以把所有的getter/setterҎ攑ֈ接口里定义,但是真正数据的存取则是在具体cMd玎ͼq样可提高系l的扩展性?/span>
ȝ
Java的反以及内省应用到E序设计中去可以大大的提供程序的化和可扩展性。有很多目都是采取q两U技术来实现其核心功能,例如我们前面提到的StrutsQ还有用于处理XML文g的Digester目Q其实应该说几乎所有的目都或多或的采用q两U技术。在实际应用q程中二者要怺l合方能发挥真正的智能化以及高度可扩展性?/span>
首先 我们?find()ҎQ?br />
现在有一个页面,里面HTML代码为:
如果我们使用find()ҎQ?br />
会输出Q?br />
如果使用filter()ҎQ?br />
会输出Q?br />
也许你已l看出它们的区别了?br /> find()会在div元素?L class为rain 的元素?br /> 而filter()则是{选div的class为rain的元素?br /> 一个是对它的子集操作,一个是对自w集合元素筛选?/strong>
另外find()其实q可以用选择器表C?
单的几步下来p|好了,如果q有q的话退出然后重新登陆一下。如果你x有的q接都用这个默认配|,可以?#8220;全局选项”中设|?#8220;默认的会话选项”Q这样以后新建的q接会自动应用上面的讄了?/span>
PS:
以前用putty的时候,字体q接用我在Linux最qMonacoQ但在SecureCRT中用Monaco字体的话Q中文会昄Zؕ码,q是因ؓMonaco字体中不包含中文字符Q而SecureCRT也不会自动的选择pȝ默认的中文字体?/span>
Z解决q个问题Q我们只要去找一个包含中文的{宽字体来用Q我从网上找了一个Consolas和雅黑的混合字体Q虽然没有Monaco好看Q但效果也还不错。这里有个地斚w要注意一下,在选择q个字体的字体选择对话框中Q字体的默认字符集是“西方”Q需要改成CHINESE_GB2312?/span>
如果你也想用q个字体的话Q可以从q里下蝲?/span>
在读完robbin的这两个_֍贴的时候,感觉清晰了很多,实好文章?
http://www.javaeye.com/topic/2712
http://www.javaeye.com/topic/1604?page=1
q有q个_֍?
http://www.javaeye.com/topic/7484
也很不错?/span>
里面ȝ的很好了Q我l合以上三个帖子、自q试验Q版本hibernate-3.0.5Q和Hibernate文档也ȝ了一点,加深理解?strong>希望对刚开始学Hibernate的同学有所帮助?/strong>
一、saveorUpdate与unsaved-value
到底是savaq是update
Hibernate需要判断被操作的对象究竟是一个已l持久化q的持久对象q是临时对象?
1Q.主键Hibernate的id generator产生
<id name="id" type="java.lang.Long">
<column name="ID" precision="22" scale="0" />
<generator class="increment" />
</id>
Project project = new Project();
project.setId(XXX);
this.projectDao.saveOrUpdate(project);
1、默认unsaved-value="null"
主键是对象类型,hebernate判断project的主键是否位nullQ来判断project是否已被持久?/strong>
是的话,对project对象发送save(project)Q?
若自p|了主键则直接生成update的sqlQ发送update(project)Q即便数据库里没有那条记录?
主键是基本类型如int/long/double/
自己讄unsaved-null="0"?
所以这L话save和update操作肯定不会报错?/span>
2、unsaved-value="none"Q?
׃不论主键属性ؓM|都不可能为noneQ因此HibernateL对project对象发送update(project)
3、unsaved-value="any"
׃不论主键属性ؓM|都肯定ؓanyQ因此HibernateL对project对象发送save(project)Qhibernate生成主键?/span>
Hibernate文档中写?
saveOrUpdate()完成了如下工作:
如果对象已经在这个session中持久化q了Q什么都不用?
如果对象没有标识|调用save()来保存它
如果对象的标识gunsaved-value中的条g匚wQ调用save()来保存它
如果对象使用了版?version或timestamp),那么除非讄unsaved-value="undefined",版本查会发生在标识符查之?
如果q个session中有另外一个对象具有同L标识W,抛出一个异?
2Q.主键p己来赋?/strong>
<id name="id" type="java.lang.Long">
<column name="ID" precision="22" scale="0" />
<generator class="assigned" />
</id>
Project project = new Project();
project.setId(XXX);
this.projectDao.saveOrUpdate(project);
1、默认unsaved-value="null"
q时有所不同Qhibernate会根据主键生一个selectQ来判断此对象是否已被持久化
已被持久化则updateQ未被持久化则save?
2、unsaved-value="none"Qupdate对象Q同?/span>
3、unsaved-value="any" Qsave对象Q?
如果自己自己讄的ID在数据库中已存在Q则报错?/span>
二、save与update操作
昑ּ的用session.save()或者session.update()操作一个对象的时候,实际上是用不到unsaved-value?
在同一SessionQsave没什么可说得
update对象? 最直接的更改一个对象的Ҏ是load()它,保持Session打开Q然后直接修改即?
Session s =…
Project p = (Project) sess.load(Project.class, id) );
p.setName(“test”);
s.flush();
不用调用s.update(p);hibernate能察觉到它的变化Q会自动更新。当然显C用的话也不会?/span>
Hibernate文档中写?
update()Ҏ在下列情形下使用Q?
E序在前面的session中装载了对象
对象被传递到UIQ界面)?
对该对象q行了一些修?
对象被传递回业务?
应用E序在第二个session中调用update()保存修改
三、delete操作
删除时直接自己构造一个project卛_删除
this.projectDao.delete(preojct);
以前删除我是q样写的
public void deleteProject(String id) {
Project project = (Project) this.projectDao.get(Project.class, id);
if (project != null) {
this.projectDao.delete(project);
}
卌样也是可以的
Project project = new Project();
project.setId(id);
this.projectDao.delete(project).
如果有联关p,需要把U联的子cM构造出来addq去Q同样可以删除?/span>
好了Q罗嗦的够多了?/span>