??xml version="1.0" encoding="utf-8" standalone="yes"?>
其实q一些代码都是早几个月写?自己很懒,所以到今天才写到自q博客?高深的文章自己写不了(jin)Q只能记录下一些简单的记录与点_(d)其中的代码算是自p乐的Q希望高手不要把重构之类的砸下来...
1、在windowspȝ下的的C盘,Z个名叫s的文件夹,在该文g多w面随便徏三个txt文gQ随便v名啦Q就?1.txt","2.txt"?3.txt"?
其中1.txt的内容如下:(x)
2、下载lucene包,攑֜classpath路径?
建立索引:
索引的结果:(x)
3、徏立了(jin)索引之后Q查询啦....
其运行结果:(x)
q是lucene1.4.3版的API
Lucene 其实很简单的,它最主要是做两件事:建立索引和进行搜?
来看一些在lucene中用的术语,q里q不打算作详l的介绍,只是点一下而已----因ؓ(f)q一个世界有一U好东西Q叫搜烦(ch)?/p>
IndexWriter:lucene中最重要的的cM一Q它主要是用来将文加入索引Q同时控制烦(ch)引过E中的一些参C用?/p>
Analyzer:分析?主要用于分析搜烦(ch)引擎遇到的各U文本。常用的有StandardAnalyzer分析?StopAnalyzer分析?WhitespaceAnalyzer分析器等?/p>
Directory:索引存放的位|?lucene提供?jin)两U烦(ch)引存攄位置Q一U是盘Q一U是内存。一般情况将索引攑֜盘上;相应地l(f)ucene提供?jin)FSDirectory和RAMDirectory两个cR?/p>
Document:文档;Document相当于一个要q行索引的单元,M可以惌被烦(ch)引的文g都必{化ؓ(f)Document对象才能q行索引?/p>
FieldQ字Dc(din)?/p>
IndexSearcher:是lucene中最基本的检索工P所有的(g)索都?x)用到IndexSearcher工具;
Query:查询Qlucene中支持模p查询,语义查询Q短语查询,l合查询{等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery{一些类?/p>
QueryParser: 是一个解析用戯入的工具Q可以通过扫描用户输入的字W串Q生成Query对象?/p>
Hits:在搜索完成之后,需要把搜烦(ch)l果q回q显C给用户Q只有这h是完成搜烦(ch)的目的。在lucene中,搜烦(ch)的结果的集合是用Hitscȝ实例来表C的?/p>
上面作了(jin)一大堆名词解释Q下面就看几个简单的实例?
1、简单的的StandardAnalyzer试例子
2、看另一个实?单地建立索引Q进行搜?
很久没有看lucene?jin),q两三天又复?fn)?jin)一?上一些代码都是前几个月写的,只是改动?jin)一些字W串和包名显C。{载时误明,文章来自:http://lighter.javaeye.com?
如有什么错误的地方Q恳h出,谢谢?br />
StandardAnalyzer是lucene中内|的"标准分析?,可以做如下功?
1、对原有句子按照I格q行?jin)分?
2、所有的大写字母都可以能转换为小写的字母
3、可以去掉一些没有用处的单词Q例?is","the","are"{单词,也删除了(jin)所有的标点
同时也可以对中文q行分词(效果不好),现在有很多的中文分词包可以采?
下面的这个站收录的比较全Q收藏之?
东西q真不少Q慢慢学啦,可惜没有我想要的
【Java开?Jsp标签库?
Posted by E_wsq 2006-3-29 9:32:00
displytag
与Strutsl合使用最出名的一个tag主要是显C格数据很漂亮、完善?
500)this.style.width=500;?border=0> http://displaytag.sourceforge.net/
cewolf tag
用来在web上显C复杂图形报表的一个jsp tag?
500)this.style.width=500;?border=0> http://cewolf.sourceforge.net/
Loading Tab
当一个复杂的操作可以加蝲比较长的旉Ӟ用这个tag?
500)this.style.width=500;?border=0> http://www.mycgiserver.com/~eboudrant/#taglibs
DbForms
DbForms!它是一个基?Java (Servlet,JSP/Taglib)的快速应用程序开发环境,可以帮助开发h员快速徏造基于Web的数据库应用E序?
500)this.style.width=500;?border=0> http://jdbforms.sourceforge.net/
Jakarta Taglibs
Jakarta Taglibs 是ؓ(f)JSP定制标签库和相关的项目提供的一个开源仓库,?TagLibraryValidatorc,和对面生成工具的扩展来支持标签库。Jakarta Taglibs 也包括了(jin)对JSP Standard Tag Library (JSTL)的参考实现。这个实现基于项目标准。目前,在Jakarta Taglibs 中没有其它标{ֺ代表?jin)Java Community Process (JCP) 标准?
500)this.style.width=500;?border=0> http://jakarta.apache.org/taglibs/index.html
EasyLDAP
Q?@ page contentType="text/html; charset=gb2312" language="java"%Q?br />Q?@ taglib uri="/WEB-INF/tlds/c.tld" prefix="c"%Q?br />Q?DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"Q?br />QhtmlQ?br />QbodyQ?br />Q? String tut = "tutorial"; request.setAttribute("tut",tut); %Q?br />The String in request is : Qc:out value="${tut}"/Q? Q?bodyQ?br />Q?htmlQ?/td> |
public void setValue(Object value)throws JspException { this.value = ExpressionEvaluatorManager.evaluate( "value", value.toString(), Object.class, this, pageContext); } |
private Object value = null; |
package diegoyun; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager; public class NewOutputTag extends TagSupport { private Object name = null; public void setName(Object name) throws JspException { this.name = ExpressionEvaluatorManager.evaluate( "name", name.toString(), Object.class, this, pageContext); } public int doStartTag() throws JspException{ try { JspWriter out = pageContext.getOut(); out.print("Hello! " + name); } catch (Exception e) { throw new JspException(e); } return EVAL_PAGE; } } |
Q?--NewOutputTag--Q?br />QtagQ?br />QnameQnewoutQ?nameQ?br />Qtag-classQdiegoyun.NewOutputTagQ?tag-classQ?br />Qbody-contentQemptyQ?body-contentQ?br />QattributeQ?br />QnameQnameQ?nameQ?br />QrequiredQfalseQ?requiredQ?br />QrtexprvalueQtrueQ?rtexprvalueQ?br />Q?attributeQ?br />Q?tagQ?/td> |
Q?@ page language="java" %Q?br />Q?@ taglib uri="/WEB-INF/tlds/diego.tld" prefix="diego"%Q?br />QhtmlQ?br />Qbody bgcolor="#FFFFFF"Q?br />Q? String s = "diego"; request.setAttribute("name",s); %Q?br />Test El supported tag: QbrQ?br />Qdiego:newout name="${name}"/Q?br /> Q?bodyQ?br />Q?htmlQ?/td> |
cȝ初始化和对象初始化是 JVM 理的类型生命周期中非常重要的两个环节,Google ?jin)一遍网l,有关c装载机制的文章倒是不少Q然而类初始化和对象初始化的文章q不多,特别是从字节码和 JVM 层次来分析的文章更是鲜有所见?/p>
本文主要对类和对象初始化全过E进行分析,通过一个实际问题引入,源代码转换?JVM 字节码后Q对 JVM 执行q程的关键点q行全面解析Qƈ在文中穿插入?jin)相?JVM 规范?JVM 的部分内部理论知识,以理Z实际l合的方式介l对象初始化和类初始化之间的协作以及(qing)可能存在的冲H问题?/p>
q日我在调试一个枚丄型的解析器程序,该解析器是将数据库内一万多条枚举代码装载到~存中,Z(jin)实现快速定位枚举代码和具体枚Dcd的所有枚丑օ素,该类在装载枚举代码的同时对其采取两种{略建立内存索引。由于该cL一个公共服务类Q在E序各个层面都会(x)使用到它Q因此我它实现Z个单例类。这个类在我调整cd例化语句位置之前q行正常Q但当我把该cd例化语句调整到静(rn)态初始化语句之前Ӟ我的E序不再为我工作?jin)?/p>
下面是经q我化后的示例代码:(x)
|
惛_大家看了(jin)上面的代码后?x)感觉有些茫(dng)q个cȝh没有问题啊,q的属于典型的饿汉式单态模式啊Q怎么?x)有问题呢?/p>
是的Q他看v来的没有问题,可是如果他 run hӞ其结果是他不?x)?f)你正?work。运行该c,它的执行l果是:(x)
|
我的E序怎么?x)这PZ么在 initEnum() Ҏ(gu)?CODE_MAP_CACHE 为空Qؓ(f)什么我输出?CODE_MAP_CACHE 内容只有一个元素,其它两个元素呢?Q?Q!Q?/p>
看到q里Q如果是你在调试该程序,你此M定觉得很奇怪,N是我?Jvm 有问题吗Q非也!如果不是Q那我的E序是怎么?jin)?q绝对不是我惌的结果。可事实上无论怎么修改 initEnum() Ҏ(gu)都无于事,L(fng)我最初是一定不?x)怀疑到问题可能出在创徏 CachingEnumResolver 实例q一环节上。正是因为我太相信我创徏 CachingEnumResolver 实例的方法,加之?Java cd始化与对象实例化底层原理理解有所偏差Q我ؓ(f)此付Z(jin)三、四个小?-U半个工作日的大好青春?/p>
那么问题I竟出在哪里呢?Z么会(x)出现q样的怪事呢?在解册个问题之前,先让我们来了(jin)解一下JVM的类和对象初始化的底层机制?/p>
![]() ![]() |
![]()
|
上图展示的是cȝ命周期流向;在本文里Q我只打谈谈类?初始?以及(qing)"对象实例?两个阶段?/p>
![]() ![]() |
![]()
|
c?初始?阶段Q它是一个类或接口被首次使用的前阶段中的最后一工作,本阶D负责ؓ(f)cd量赋予正的初始倹{?/p>
Java ~译器把所有的cd量初始化语句和类型的?rn)态初始化器通通收集到 <clinit> Ҏ(gu)内,该方法只能被 Jvm 调用Q专门承担初始化工作?/p>
除接口以外,初始化一个类之前必须保证其直接超cd被初始化Qƈ且该初始化过E是?Jvm 保证U程安全的。另外,q所有的c都?x)拥有一?<clinit>() Ҏ(gu)Q在以下条g中该cM?x)拥?<clinit>() Ҏ(gu)Q?/p>
![]() ![]() |
![]()
|
在类被装载、连接和初始化,q个cd随时都可能用了(jin)。对象实例化和初始化是就是对象生命的起始阶段的活动,在这里我们主要讨论对象的初始化工作的相关特点?/p>
Java ~译器在~译每个cL都会(x)c至生成一个实例初始化Ҏ(gu)--?"<init>()" Ҏ(gu)。此Ҏ(gu)与源代码中的每个构造方法相对应Q如果类没有明确地声明Q何构造方法,~译器则cȝ成一个默认的无参构造方法,q个默认的构造器仅仅调用父类的无参构造器Q与此同时也?x)生成一个与默认构造方法对应的 "<init>()" Ҏ(gu).
通常来说Q?lt;init>() Ҏ(gu)内包括的代码内容大概为:(x)调用另一?<init>() Ҏ(gu)Q对实例变量初始化;与其对应的构造方法内的代码?/p>
如果构造方法是明确C调用同一个类中的另一个构造方法开始,那它对应?<init>() Ҏ(gu)体内包括的内容ؓ(f)Q一个对本类?<init>() Ҏ(gu)的调用;对应用构造方法内的所有字节码?/p>
如果构造方法不是通过调用自ncȝ其它构造方法开始,q且该对象不?Object 对象Q那 <init>() 法内则包括的内容为:(x)一个对父类 <init>() Ҏ(gu)的调用;对实例变量初始化Ҏ(gu)的字节码Q最后是对应构造子的方法体字节码?/p>
如果q个cL ObjectQ那么它?<init>() Ҏ(gu)则不包括对父c?<init>() Ҏ(gu)的调用?/p>
![]() ![]() |
![]()
|
本文到目前ؓ(f)止,我们已经大概有了(jin)解到?jin)类生命周期中都l历?jin)哪些阶D,但这个类的生命周期的开始阶D?-c装载又是在什么时候被触发呢?cd是何时被初始化的呢?让我们带着q三个疑问l去L{案?/p>
Java 虚拟范ؓ(f)cȝ初始化时机做?jin)严格定义?x)"initialize on first active use"--" 在首ơ主动用时初始?。这个规则直接媄(jing)响着c装载、连接和初始化类的机?-因ؓ(f)在类型被初始化之前它必须已经被连接,然而在q接之前又必M证它已经被装载了(jin)?/p>
在与初始化时机相关的c装载时机问题上QJava 虚拟范ƈ没有对其做严格的定义Q这׃?JVM 在实C可以Ҏ(gu)自己的特Ҏ(gu)供采用不同的装蝲{略。我们可以思考一?Jboss AOP 框架的实现原理,它就是在对你?class 文g装蝲环节做了(jin)手脚--插入?AOP 的相x截字节码Q这使得它可以对E序员做到完全透明化,哪怕你?new 操作W创建出的对象实例也一栯?AOP 框架拦截--与之相对应的 Spring AOPQ你必须通过他的 BeanFactory 获得?AOP 代理q的受管对象Q当?Jboss AOP 的缺点也很明?-他是?JBOSS 服务器绑定很紧密的,你不能很L的移植到其它服务器上。嗯~……,说到q里有些跑题?jin),要知?AOP 实现{略_以写一本厚厚的书了(jin)Q嘿嘿,此打住?/p>
说了(jin)q么多,cȝ初始化时机就是在"在首ơ主动用时"Q那么,哪些情Ş下才W合首次d使用的要求呢Q?/p>
首次d使用的情形:(x)
除了(jin)以上几种情Ş以外Q所有其它用JAVAcd的方式都是被动用的Q他们不?x)导致类的初始化?/p>
![]() ![]() |
![]()
|
好了(jin)Q了(jin)解了(jin)JVM的类初始化与对象初始化机制后Q我们就有了(jin)理论基础Q也可以理性的d析问题了(jin)?/p>
下面让我们来看看前面[清单一]的JAVA源代码反l译出的字节码:(x)
|
如果上面QL单一Q显C,清单内容是在 JDK1.4 环境下的字节码内容,可能q䆾清单对于很大部分兄弟来说实没有多少吸引力,因ؓ(f)q些 JVM 指o(h)实不像源代码那h亮易懂。但它的的确是查找和定位问题最直接的办法,我们惌的答案就在这?JVM 指o(h)清单里?/p>
现在Q让我们对该cMcd始化到对象实例初始化全过E分析[清单一]中的代码执行轨迹?/p>
如前面所qͼcd始化是在cȝ正可用时的最后一前阶工作,该阶D负责对所有类正确的初始化|此项工作是线E安全的QJVM?x)保证多U程同步?/p>
W1步:(x)调用cd始化Ҏ(gu) CachingEnumResolver.<clinit>()Q该Ҏ(gu)对外界是不可见的Q换句话说是 JVM 内部专用Ҏ(gu)Q?lt;clinit>() 内包括了(jin) CachingEnumResolver 内所有的h指定初始值的cd量的初始化语句。要注意的是q每个c都h该方法,具体的内容在前面已有叙述?/p>
W2步:(x)q入 <clinit>() Ҏ(gu)内,让我们看字节码中?"? 行,该行与其上面两行l合h代表 new 一?CachingEnumResolver 对象实例Q而该代码行本w是指调?CachingEnumResolver cȝ <init>Q)(j)Ҏ(gu)。每一?Java c都h一?<init>() Ҏ(gu)Q该Ҏ(gu)?Java ~译器在~译时生成的Q对外界不可见,<init>() Ҏ(gu)内包括了(jin)所有具有指定初始化值的实例变量初始化语句和javacȝ构造方法内的所有语句。对象在实例化时Q均通过该方法进行初始化。然而到此步Q一个潜在的问题已经在此埋伏好,q着你来犯了(jin)?/p>
W3步:(x)让我们顺着执行序向下看,"? 行,该行所在方法就是该cȝ构造器Q该Ҏ(gu)先调用父cȝ构造器 <init>() 对父对象q行初始化,然后调用 CachingEnumResolver.initEnum() Ҏ(gu)加蝲数据?/p>
W4步:(x)"? 行,该行获取 "CODE_MAP_CACHE" 字段|其运行时该字Dgؓ(f) null。注意,问题已经开始显C(jin)。(作ؓ(f)E序员的你一定是希望该字D已l被初始化过?jin),而事实上它还没有被初始化Q。通过判断Q由于该字段?NULLQ因此程序将l箋执行?"? 行,该字段实例化ؓ(f) HashMap()?/p>
W5步:(x)?"??? 行,其功能就是ؓ(f) "CODE_MAP_CACHE" 字段填入两条数据?/p>
W6步:(x)退出对象初始化Ҏ(gu) <init>()Q将生成的对象实例初始化l类字段 "SINGLE_ENUM_RESOLVER"。(注意Q此刻该对象实例内的cd量还未初始化完全Q刚才由 <init>() 调用 initEnum() Ҏ(gu)赋值的cd?"CODE_MAP_CACHE" ?<clinit>() Ҏ(gu)q未初始化字D,它还在后面的类初始化过E再ơ被覆盖Q?/p>
W7步:(x)l箋执行 <clinit>Q)(j)Ҏ(gu)内的后代码Q?? 行,该行?"CODE_MAP_CACHE" 字段实例化ؓ(f) HashMap 实例Q注意:(x)在对象实例化时已l对该字D赋D?jin),现在又重新赋gؓ(f)另一个实例,此刻Q?CODE_MAP_CACHE"变量所引用的实例的cd量D覆盖Q到此我们的疑问已经有了(jin){案Q?/p>
W?步:(x)cd始化完毕Q同时该单态类的实例化工作也完成?/p>
通过对上面的字节码执行过E分析,或许你已l清楚了(jin)解到D错误的深层原因了(jin)Q也或许你可能早已被上面的分析过E给弄得晕头转向?jin),不过也没折,虽然我也可以从源代码的角度来阐述问题Q但q样不够深度Q同时也?x)有仅?f)个h观点、不_信之嫌?/p>
![]() ![]() |
![]()
|
要解决上面代码所存在的问题很单,那就是将 "SINGLE_ENUM_RESOLVER" 变量的初始化赋D句{Ud getInstance() Ҏ(gu)中去卛_。换句话说就是要避免在类q未初始化完成时从内部实例化该类或在初始化过E中引用q未初始化的字段?/p>
![]() ![]() |
![]()
|
?rn)下燥之?j)Q仔l思量自己是否真的掌握?jin)本文主题所引出的知识,如果(zhn)觉得?zhn)已经完全或基本掌握?jin)Q那么很好,在最后,我将前面的代码稍做下修改Q请思考下面两l程序是否同样会(x)存在问题呢?
|
|
最后,一点关?JAVA 体的感aQ时下正是各U开源框架盛行时期,Spring 更是大行光Q吸引着一大批 JEE 开发者的眼球Q我也是 fans 中的一员)(j)。然而,让我们仔l观察一?-?Spring 体ZQ在那么多的 Spring fans 当中Q有多少人去研究q?Spring 源代码?又有多少人对 Spring 设计思想有真正深入了(jin)解呢Q当?dng)我是没有资格以这L(fng)口吻来说事的Q我只是惌明一个观?-学东西一定要"正本清源"?/p>
献上此文Q}以共勉?/p>
解决思\:
1.对公式进行字W合法性检?
2.对公式中出现的变量进行取值替?
3.(g)查语句的合法?(l合规则)
4.(g)查运的合法?(除数?的情?
5.求?
具体解决Ҏ(gu):
str1 = "(r1c1+r1c2)/r1c3)"
str1 = replace(str1," ","") '去除公式中间出现的空?br /> 1. 对公式进行字W合法性检?
bool1 = getDataOperationCharCheck(str1)
if bool1 = false then
Response.write "公式不合?有异常字W出?<br>"
else
Response.write "公式(g)查通过!<br>"
end if
2.对公式中出现的变量进行取值替?/p>
RCstr = getdataoperation(str1)
3.(g)查语句的合法?(l合规则)
bool2 = getDataOperationSyntaxCheck(RCstr)
if bool2 = false then
Response.write "q算公式语法不合?有组合异常字W出?<br>"
else
Response.Write "q算公式语法(g)查通过!<br>"
end if
4.(g)查运的合法?(除数?的情?
bool3 = getDataOperationRunCheck(RCstr)
if bool3 = false then
Response.write "q算公式q算不合?有除Cؓ(f)0出现.<br>"
else
Response.write "q算公式q算合法性检查通过!<br>"
end if
5.求?
intValue = getRunSearch(RCstr)
6.q算l果:
(((7*1.0)+(2*1.0))/(4*1.0)) = 2.25
'1.=============================================================
'对原始公式进行字W检?是否有不合法的字W?/p>
function getDataOperationCharCheck(datastr)
datastr = replace(datastr," ","")
sumchar = "rc0123456789+-*/()"
strlen = len(datastr)
strreturn = true
for i = 1 to strlen
singlechar = mid(datastr,i,1)
if instr(sumchar,singlechar) = 0 then
strreturn = false
exit for
end if
next
getDataOperationCharCheck = strreturn
end function
'2.==============================================================
'对原始计划公式进行取值替?
'实现Ҏ(gu):对原始字W串q行单个字符(g)?
'在出?"+-*/()" 中的M一个字W时,对已l组合生成的变量q行取?
'在取到值的同时对其q行 double 转换 ,实现Ҏ(gu)?(intvalue * 1.0)
function getdataoperation(datastr)
strlen = len(datastr)
sunstr = ""
strID = ""
intvalue = 0
singlechar = ""
operationstr="()+-*/"
for i=1 to strlen
'Response.write mid(datastr,i,1) & "<br>"
singlechar = mid(datastr,i,1)
if instr(operationstr,singlechar) > 0 then
if strID <> "" then
intvalue = getValue(strID)
sunstr = sunstr & "(" & intvalue & "*1.0)" '(1)
intvalue = 0
strID = ""
end if
sunstr = sunstr & singlechar
singlechar = ""
else
strID = strID & singlechar
end if
next
getdataoperation = sunstr
end function
'变量取值函?
'下列数据是ؓ(f)试使用.
'
function getValue(strRC)
select case strRC
case "r1c1"
getValue = 2
case "r1c2"
getValue = 7
case "r1c3"
getValue = 2
end select
end function
'3.==============================================================
'对公式进行语法合法性检?
'eg.(g)?(),--,++,**,//,(/,*) {?是否成对出现.
'(g)查是否有
function getDataOperationSyntaxCheck(datastr)
strreturn = true
datastr = replace(datastr," ","") '去除所有的I格
strlen = len(datastr)
num1 = 0 '记录 括号?个数 采用 ?( ?, ?) ?
upsinglechar = "" '相对本次的字W的上一个字W?br /> singlechar = ""
operationstr1="()+-*/"
operationstr2="(+-*/" '相对 ?( 左边出现的运的符h正确?
for i = 1 to strlen
singlechar = mid(datastr,i,1)
select case singlechar
case "("
num1 = num1 + 1
if upsinglechar <> "" then
if instr(operationstr2,upsinglechar) = 0 then '在左括号的左边若不ؓ(f)I?必需出现 "(+-*/" 中的一?
strreturn = false
exit for
end if
end if
case ")"
num1 = num1 - 1
if num1 < 0 then
strreturn = false
exit for
end if
if instr(operationstr2,upsinglechar) > 0 then '在右括号的左边若不ؓ(f)I?必需不能出现 "(+-*/" 中的一?br /> strreturn = false
exit for
end if
case "+"
if instr(operationstr2,upsinglechar) > 0 then '在加L(fng)左边若不I?必需不能出现 "(+-*/" 中的一?br /> strreturn = false
exit for
end if
case "-"
if instr(operationstr2,upsinglechar) > 0 then '在减L(fng)左边若不I?必需不能出现 "(+-*/" 中的一?br /> strreturn = false
exit for
end if
case "*"
if instr(operationstr2,upsinglechar) > 0 then '在乘L(fng)左边若不I?必需不能出现 "(+-*/" 中的一?br /> strreturn = false
exit for
end if
case "/"
if instr(operationstr2,upsinglechar) > 0 then '在除L(fng)左边若不I?必需不能出现 "(+-*/" 中的一?br /> strreturn = false
exit for
end if
end select
upsinglechar = singlechar
singlechar = ""
next
getDataOperationSyntaxCheck = strreturn
end function
'4.==============================================================
'对组合公式进行运合法性的(g)?br />'首选查找有没有 "/0"出现.
'其次查找cM "/(****)" = /0 出现
function getDataOperationRunCheck(datastr)
strreturn = true
if instr(datastr,"/")>0 then
if instr(datastr,"/0") > 0 then
strreturn = false
else
'? 后面出现?)内的数据q行q算,取值是否会(x)?出现.
'首先计算 "/" 出现的次?br /> '再次判断 "/(" 出现的次?br /> '?"/(" 出现的次? 则安?
intnum1 = getInstrNum(datastr,"/")
intnum2 = getInstrNum(datastr,"/(")
if intnum2 > 0 then
for j = intnum2 to 1 step -1
intpoint1 = getInstrPoint(datastr,"/(",j)
if intpoint1 > 0 then
sumpoint = getRunCheck(datastr,intpoint1)
if CDbl(sumpoint) = CDbl(0) then
strreturn = false
exit for
end if
end if
next
end if
end if
end if
getDataOperationRunCheck= strreturn
end function
'(g)查字W运行的合法?
'主要是对/()出现的字公式q行计算是否?x)等?
function getRunCheck(datastr,intpoint1)
strlen = len(datastr)
intpoint = intpoint1 + 1
intnum = 0
singlechar = ""
rcsearch = ""
intreturn = 0
for m = intpoint to strlen
singlechar = mid(datastr,m,1)
if singlechar = "(" then
intnum = intnum + 1
end if
if singlechar = ")" then
intnum = intnum - 1
end if
rcsearch = rcsearch & singlechar
if intnum = 0 then
intreturn = getRunSearch(rcsearch)
exit for
end if
next
getRunCheck = intreturn
end function
'5.==============================================================
'求?
function getRunSearch(strrcsearch)
sql = "select " & strrcsearch & " as rcvalue "
Set rs = conn.execute(sql)
'Response.write "<br>" & strrcsearch & "=" & rs("rcvalue") & "<br>"
getRunSearch = rs("rcvalue")
end function
'公共函数==============================================================
'q回substr ?str1 中出现的ơ数
function getInstrNum(str1,substr)
strlen = len(str1)
substrlen = len(substr)
singlechar = ""
intreturn = 0
for i = 1 to strlen
singlechar = mid(str1,i,substrlen)
if singlechar = substr then
intreturn = intreturn + 1
end if
next
getInstrNum = intreturn
end function
'q回substr ?str1 ?W?intnum ơ出现的位置
'intnum 必需是大?的正整数
function getInstrPoint(str1,substr,intnum)
intreturn = 0
strlen = len(str1)
substrlen = len(substr)
singlechar = ""
intcount = 0
for i = 1 to strlen
singlechar = mid(str1,i,substrlen)
if singlechar = substr then
intcount = intcount + 1
end if
if intcount = intnum then
intreturn = i
exit for
end if
next
getInstrPoint = intreturn
end function
package jdbc;
import javax.sql.*;
import java.sql.*;
public class Bank
{
private DataSource dataSource;
public Bank() {}
public void setDataSource ( DataSource dataSource )
{
this.dataSource = dataSource;
}
private DataSource getDataSource()
{
return this.dataSource;
}
private Connection getConnection()
throws SQLException
{
Connection ret = null;
if ( getDataSource() != null ) {
ret = getDataSource().
getConnection();
}
return ret;
}
private void closeConnection ( Connection c )
throws SQLException
{
if ( c != null ) c.close();
}
public void checkTables()
throws SQLException
{
Connection conn = null;
try {
conn = getConnection();
Statement s = conn.createStatement();
try {
s.executeQuery (
"select * from Accounts" );
}
catch ( SQLException ex ) {
//table not there => create it
s.executeUpdate (
"create table Accounts ( " +
"account VARCHAR ( 20 ), " +
"owner VARCHAR(300), " +
"balance DECIMAL (19,0) )" );
for ( int i = 0; i < 100 ; i++ ){
s.executeUpdate (
"insert into Accounts values ( " +
"'account"+i +"' , 'owner"+i +"', 10000 )"
);
}
}
s.close();
}
finally {
closeConnection ( conn );
}
//That concludes setup
}
//
//Business methods are below
//
public long getBalance ( int account )
throws SQLException
{
long res = -1;
Connection conn = null;
try {
conn = getConnection();
Statement s = conn.createStatement();
String query =
"select balance from Accounts where account='"+
"account" + account +"'";
ResultSet rs = s.executeQuery ( query );
if ( rs == null || !rs.next() )
throw new SQLException (
"Account not found: " + account );
res = rs.getLong ( 1 );
s.close();
}
finally {
closeConnection ( conn );
}
return res;
}
public void withdraw ( int account , int amount )
throws Exception
{
Connection conn = null;
try {
conn = getConnection();
Statement s = conn.createStatement();
String sql =
"update Accounts set balance = balance - "+
amount + " where account ='account"+
account+"'";
s.executeUpdate ( sql );
s.close();
}
finally {
closeConnection ( conn );
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="datasource"
class="com.atomikos.jdbc.nonxa.NonXADataSourceBean">
<property name="user">
<value>sa</value>
</property>
<property name="url">
<value>jdbc:hsqldb:SpringNonXADB
</value>
</property>
<property name="driverClassName">
<value>org.hsqldb.jdbcDriver</value>
</property>
<property name="poolSize">
<value>1</value>
</property>
<property name="connectionTimeout">
<value>60</value>
</property>
</bean>
<bean id="bank" class="jdbc.Bank">
<property name="dataSource">
<ref bean="datasource"/>
</property>
</bean>
</beans>
package jdbc;
import com.atomikos.icatch.jta.UserTransactionImp;
import junit.framework.TestCase;
import java.io.FileInputStream;
import java.io.InputStream;
import org.springframework.beans.factory.xml.XmlBeanFactory;
public class BankTest extends TestCase
{
private UserTransactionImp utx;
private Bank bank;
public BankTest ( String name )
{
super ( name );
utx = new UserTransactionImp();
}
protected void setUp()
throws Exception
{
//start a new transaction
//so we can rollback the
//effects of each test
//in teardown!
utx.begin();
//open bean XML file
I(yng)nputStream is =
new FileInputStream("config.xml");
//the factory is Spring's entry point
//for retrieving the configured
//objects from the XML file
XmlBeanFactory factory =
new XmlBeanFactory(is);
bank = ( Bank ) factory.getBean ( "bank" );
bank.checkTables();
}
protected void tearDown()
throws Exception
{
//rollback all DBMS effects
//of testing
utx.rollback();
}
public void testBank()
throws Exception
{
int accNo = 10;
long initialBalance = bank.getBalance ( accNo );
bank.withdraw ( accNo , 100 );
long newBalance = bank.getBalance ( accNo );
if ( ( initialBalance - newBalance ) != 100 )
fail ( "Wrong balance after withdraw: " +
newBalance );
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!--
Use a JTA-aware DataSource
to access the DB transactionally
-->
<bean id="datasource"
class="com.atomikos.jdbc.nonxa.NonXADataSourceBean">
<property name="user">
<value>sa</value>
</property>
<property name="url">
<value>jdbc:hsqldb:SpringNonXADB</value>
</property>
<property name="driverClassName">
<value>org.hsqldb.jdbcDriver</value>
</property>
<property name="poolSize">
<value>1</value>
</property>
<property name="connectionTimeout">
<value>60</value>
</property>
</bean>
<!--
Construct a TransactionManager,
needed to configure Spring
-->
<bean id="jtaTransactionManager"
class="com.atomikos.icatch.jta.UserTransactionManager"/>
<!--
Also configure a UserTransaction,
needed to configure Spring
-->
<bean id="jtaUserTransaction"
class="com.atomikos.icatch.jta.UserTransactionImp"/>
<!--
Configure the Spring framework to use
JTA transactions from the JTA provider
-->
<bean id="springTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<ref bean="jtaTransactionManager"/>
</property>
<property name="userTransaction">
<ref bean="jtaUserTransaction"/>
</property>
</bean>
<!-- Configure the bank to use our datasource -->
<bean id="bankTarget" class="jdbc.Bank">
<property name="dataSource">
<ref bean="datasource"/>
</property>
</bean>
<!--
Configure Spring to insert
JTA transaction logic for all methods
-->
<bean id="bank"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="springTransactionManager"/>
</property>
<property name="target">
<ref bean="bankTarget"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="*">
PROPAGATION_REQUIRED, -Exception
</prop>
</props>
</property>
</bean>
</beans>
package jms;
import jdbc.Bank;
import javax.jms.Message;
import javax.jms.MapMessage;
import javax.jms.MessageListener;
public class MessageDrivenBank
implements MessageListener
{
private Bank bank;
public void setBank ( Bank bank )
{
this.bank = bank;
}
//this method can be private
//since it is only needed within
//this class
private Bank getBank()
{
return this.bank;
}
public void onMessage ( Message msg )
{
try {
MapMessage m = ( MapMessage ) msg;
int account = m.getIntProperty ( "account" );
int amount = m.getIntProperty ( "amount" );
bank.withdraw ( account , amount );
System.out.println ( "Withdraw of " +
amount + " from account " + account );
}
catch ( Exception e ) {
e.printStackTrace();
//force rollback
throw new RuntimeException (
e.getMessage() );
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!--
NOTE: no explicit transaction manager bean
is necessary
because the QueueReceiverSessionPool will
start transactions by itself.
-->
<beans>
<bean id="datasource"
class="com.atomikos.jdbc.nonxa.NonXADataSourceBean">
<property name="user">
<value>sa</value>
</property>
<property name="url">
<value>jdbc:hsqldb:SpringNonXADB</value>
</property>
<property name="driverClassName">
<value>org.hsqldb.jdbcDriver</value>
</property>
<property name="poolSize">
<value>1</value>
</property>
<property name="connectionTimeout">
<value>60</value>
</property>
</bean>
<bean id="xaFactory"
class="org.activemq.ActiveMQXAConnectionFactory">
<property name="brokerURL">
<value>tcp://localhost:61616</value>
</property>
</bean>
<bean id="queue"
class="org.activemq.message.ActiveMQQueue">
<property name="physicalName">
<value>BANK_QUEUE</value>
</property>
</bean>
<bean id="bank" class="jdbc.Bank">
<property name="dataSource">
<ref bean="datasource"/>
</property>
</bean>
<bean id="messageDrivenBank"
class="jms.MessageDrivenBank">
<property name="bank">
<ref bean="bank"/>
</property>
</bean>
<bean id="queueConnectionFactoryBean"
class="com.atomikos.jms.QueueConnectionFactoryBean">
<property name="resourceName">
<value>QUEUE_BROKER</value>
</property>
<property name="xaQueueConnectionFactory">
<ref bean="xaFactory"/>
</property>
</bean>
<bean id="queueReceiverSessionPool"
class="com.atomikos.jms.QueueReceiverSessionPool"
init-method="start">
<property name="queueConnectionFactoryBean">
<ref bean="queueConnectionFactoryBean"/>
</property>
<property name="transactionTimeout">
<value>120</value>
</property>
<!--
default license allows only limited
concurrency so keep pool small
-->
<property name="poolSize">
<value>1</value>
</property>
<property name="queue">
<ref bean="queue"/>
</property>
<property name="messageListener">
<ref bean="messageDrivenBank"/>
</property>
</bean>
</beans>
package jms;
import java.io.FileInputStream;
import java.io.InputStream;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import com.atomikos.jms.QueueReceiverSessionPool;
import jdbc.Bank;
public class StartBank
{
public static void main ( String[] args )
throws Exception
{
//open bean XML file
I(yng)nputStream is =
new FileInputStream(args[0]);
//the factory is Spring's entry point
//for retrieving the configured
//objects from the XML file
XmlBeanFactory factory =
new XmlBeanFactory(is);
//retrieve the bank to initialize
//alternatively, this could be done
//in the XML configuration too
Bank bank =
( Bank ) factory.getBean ( "bank" );
//initialize the bank if needed
bank.checkTables();
//retrieve the pool;
//this will also start the pool
//as specified in the beans XML file
//by the init-method attribute!
QueueReceiverSessionPool pool =
( QueueReceiverSessionPool )
factory.getBean (
"queueReceiverSessionPool" );
//Alternatively, start pool here
//(if not done in XML)
//pool.start();
System.out.println (
"Bank is listening for messages..." );
}
}