Apr 10
日本は火山が多い。したがって温泉も多い。

東京は日本の首都(しゅうと)である。したがって、国会(こっかい)議事堂(ぎじどう)をはじめ、外務省(がいむしょう)など各省(かくしょう)や国の重要機関が集中している。

毎日遊んでばかりいる。したがって、学校の成績も悪い。
このタイプの殺虫剤(さっちゅうざい)は人には無害(むがい)です。したがって、家庭用(かていよう)としてだけでなく、農薬(のうやく)としても広く利用されるでしょう。


とともに、にしたがって、につれて、に伴って的区别??
Apr 10
因为需要将项目从IBM WebSphere Application Server移植到Tomcat上开发,所以研究了一下在Tomcat中通过JNDI查找和使用JDBC及JTA的方法。

Tomcat是Servlet容器,但它也提供了一个JNDI InitialContext实现,因此用户可以像在J2EE应用程序服务器中一样在Tomcat中使用JNDI查找JDBC数据源。不过在事务处理方面,Tomcat本身并不支持JTA(Java Transaction API),所以需要借助其他的方案。JOTM(Java Open Transaction Manager)是ObjectWeb的一个开源JTA实现,它本身也是开源应用程序服务器JOnAS(Java Open Application Server)的一部分,为其提供JTA支持和分布式事务管理。JOTM同样可以为Tomcat提供JTA支持,以下将对相关的配置进行简单说明,使用的相应版本为:

Tomcat 5.5.x
JOTM 2.0.x
Oracle 9i


1. 配置Tomcat环境

在$TOMCAT_HOME/conf/context.xml文件中添加以下内容:

引用

type="javax.sql.DataSource"
factory="org.objectweb.jndi.DataSourceFactory"
username="user" password="pwd"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@172.18.136.200:1521:ORADB"
maxActive="30" maxIdle="30"/>

jotm.timeout="60"/>

2. 添加所需的JAR文件

下载JOTM,将以下文件添加到$TOMCAT_HOME/common/lib/:
jotm.jar
jotm_jrmp_stubs.jar
jotm_iiop_stubs.jar
ow_carol.jar
jta-spec1_0_1.jar
jts1_0.jar
objectweb-datasource.jar
xapool.jar
howl.jar
connector-1_5.jar
同时,还需要添加相应数据库的JDBC包,例如Oracle的classes12.jar

3. 配置JOTM

新建一个carol.properties文件,置于$TOMCAT_HOME/common/classes/,文件内容如下:

# JNDI (Protocol Invocation)
carol.protocols=jrmp

# Local RMI Invocation
carol.jvm.rmi.local.call=true

# do not use CAROL JNDI wrapper
carol.start.jndi=false

# do not start a name server
carol.start.ns=false

# Naming Factory
carol.jndi.java.naming.factory.url.pkgs=org.apache.naming

这样JOTM将不会使用CAROL JNDI wrapper,从而可以避免类装载错误的发生

4. 说明

4.1 JOTM目前的版本在JDK1.5或以上可能无法正常运行,解决的方法有两个:使用JDK1.5重新编译carol库,或者将Tomcat运行在JDK1.4中

4.2 是Tomcat 5中的新标记,对于不支持此标记的老版本,需要使用以下语句代替事务资源的声明:


type="javax.transaction.UserTransaction"
factory = "org.objectweb.jotm.UserTransactionFactory"
jotm.timeout = "60"/>

4.3 需要注意的是,使用节点声明的资源默认上下文前缀是"java:comp/env",而使用< Transaction>节点时则是"java:comp"。因此,当使用4.2的方式声明用户事务时,相应的JNDI查找代码也应该改为 UserTransaction ut = (UserTransaction)initCtx.lookup("java:comp/env/UserTransaction");

5. 测试

6. 参考
How to use JDBC and transactions in Tomcat with JOTM
How to use JDBC and transactions in Tomcat with JOTM(For Tomcat 5.5.x)
UserTransaction, JOTM and Tomcat 5.5.x


Apr 10

JTA学习 不指定

wanglei , 14:11 , J2EE开发 , 评论(0) , 引用(0) , 阅读(1346) , Via 本站原创

public class DBConnectionPool {  
          // singleton Pattern  
          public Connection fetchConnection() ;  
          public void releaseConnection(Connection conn);
}

public class ThreadConnectionMap {  
          // singleton pattern.  
          private Map threadConnectionMap = new HashMap();  
 
          public Connection getConnection() {    
               if(threadConnectionMap.get(Thread.currentThread()) != null)  {             return (Connection)threadConnectionMap.get(Thread.currentThread());    }    
               return DBConnectionPool.fetchConnection();  
          }  
 
          public Connection getConnectionInTx() {    
               return (Connection)threadConnectionMap.get(Thread.currentThread());  
          }  
 
          public void releaseConnectionInTx() {    
               Connection con = getConnectionInTx();    
               threadConnectionMap.remove(Thread.currentThread());    DBConnectionPool.releaseConnection(con);  
          }    
         
          public Connection newConnectionInTx() {    
               if(inTransaction()) {      
                    throw new TransactionException("Transaction already started!");      }    
               Connection conn = DBConnectionPool.fetchConnection();    threadConnectionMap.put(Thread.currentThread(), conn);    
               return conn;
          }  
 
          public boolean inTransaction() {    
                  return threadConnectionMap.get(Thread.currentThread()) != null;    
          }    
          ..............
}

public class VendorDataSource() implements javax.sql.DataSource {  
         public Connection getConnection() {    
                return ThreadConnectionMap.getConnection();    
         }    
         ..........
}

public class VendorUserTransaction implements javax.transaction.UserTransaction {  public void begin() {    
                     Connection con = ThreadConnectionMap.newConnectionInTx();           con.setAutoCommit(false);  
               }
 
                public void commit() {    
                      Connection con = ThreadConnectionMap.getConnectionInTx();    
                      if(con == null) {      
                              throw new TransactionException("cannot commit transaction,                   UserTransaction not started!");      
                      }        
                      con.commit();    
                      ThreadConnectionMap.releaseConnectionInTx();  
                }  
   
                 public void rollback(){    
                        Connection con = ThreadConnectionMap.getConnectionInTx();    
                         if(con == null) {      
                                 throw new TransactionException("cannot rollback transaction, UserTransaction not started!");      
                         }        
                 con.rollback();    
                 ThreadConnectionMap.releaseConnectionInTx();  
                }    

                 public boolean inTransaction() {    
                            return ThreadConnectionMap.inTransaction();  
                 }  ....    
}
Tags:
Apr 10
一、cocoon的安装

     cocoon本身是一个web application,需要在有Servlet engine的服务器中运行。 解开cocoon的安装包(现在稳定的版本是2.0.3),会有一个名为cocoon.war的WAR包, 这是安装唯一用到的文件。将它Copy到TOMCAT_HOME/webapps目录下,然后启动Tomcat, Tomcat会自动解开cocoon.war到TOMCAT_HOME/webapps/cocoon目录,这时键入URL: http://localhost:8080/cocoon ,如果看到cocoon的Welcome页面,就表明Cocoon已经成功的安装了,非常简单。需要注意的是,这时应该关了tomcat,将cocoon.war删除,原因是我们将要在以后的时间里不断的修改和配置TOMCAT_HOME/webapps/cocoon中的文件, 而cocoon.war已经无用了。

二、cocoon是一个高度的可配置性的环境,有几个文件是和配置有直接关系的。

     TOMCAT_HOME/webapps/cocoon/WEB-INF/web.xml
     TOMCAT_HOME/webapps/cocoon/WEB-INF/cocoon.xconf
     TOMCAT_HOME/webapps/cocoon/WEB-INF/logkit.xconf
     TOMCAT_HOME/webapps/cocoon/sitemap.xmap

     cocoon本身是web application,自然有web.xml

     cocoon.xconf是cocoon的配置文件,相当于JSP中的web.xml文件在JSP中的作用logkit.xconf是cocoon的日志配置文件,灵活性很大。
     sitemap是cocoon的一个核心的概念,sitemap.xmap中有许多复杂的配置项,要会配置他们,首先要对cocoon有一个整体的认识,随着你对cocoon认识的更多,你对sitemap.xmap的配置也就越了解。

三.cocoon的基本概念

     Pipeline是Cocoon2(cocoon2和cocoon1是有很大的不同的,所以无需知道任何关于cocoon1的东西)的基本概念.Pipeline由多个cocoon 组件构成,输入流经过Pipeline到输出流,每个组件会对输入流进行处理,然后送到下一个组件处理,直到最后的输出。处理的组件和输入流都是在前面提到的sitemap中配置的。在一个应用中可以有多个Pipleline,每个Pipeline中可以有多个不同的处理,每个处理和输入的URL有关。

4.cocoon的基本组件

     Matcher :是捕获URL地址,将其和Pipeline的一个处理流向关联
     Generator :将输入流转换成Java 的SAX程序,为后续的处理提供SAX程序
     Transformer :对Generators产生的SAX程序进行格式转换
     Serializers :对经过Generators和Transformer转换的结果产生最后的输出流,
     输出流可以是html,xml,wml,jpeg,png,pdf等不同格式的文件.
     XSP:全称是eXtension Server Page,也有人叫XML Server Page,是Cocoon提供的一种服务器脚本语言,类似于JSP或ASP,但是完全基于XML的,它可以作为Generator的输入流

5.一个简单的URL请求处理的过程

     cocoon在sitemap中寻找和URL匹配的Matcher项,然后对应Generator中配置的输入流(通常是XML文件或XSP文件A,用相关的Generator处理组件处理输入流,接着读取Transformer的中的输入流B(通常是XSL文件,Transformer组件用B对A进行格式转换(如将XML文件转换为HTML格式),一个管道中可以有0个或连续多个Transformer处理,最后Serializer组件根据Serialize的类型(html,wml,pdf,jpeg等)产生最后的输出。
相关的Sitemap片断

<map:pipelines>
    <map:pipeline>
          <map:match pattern="hello">
          <map:generate src="hello.xsp" type="servERPPages"/>
          <map:transform src="dynamic-page2html.xsl"/>
          <map:serialize/>
          </map:match>
     </map:pipeline>
</map:pipelines>

注意,正如JSP的内嵌Java代码可以实现业务逻辑,JSP的TagLib技术,一样可以用于实现业务逻辑。当然使用TagLib将比内嵌Java代码好许多,因为代码被封装到了TagLib中,因此对于小的应用还是可以使用JSP,而不用写Servlet。例如使用JSTL的sql tag,来直接处理数据库(这实际上意味着基本没有或者只有极其简单的包含在sql语句中的业务逻辑)。也可以用像之类的tag来处理业务逻辑,虽然通常应该只被用来处理显示逻辑。固然,这些功能会“引诱”一些人过度使用TagLib的能力而破坏了设计原则,但对于原型开发、测试以及轻量级应用,实在是太有用了!如果是企业级应用,相信有能力做企业级应用的程序员,也会有足够的意识来按照MVC模式开发。
而Cocoon,用XML表示数据(内容),用XSP(非常类似JSP的XML形式)编写业务逻辑,用XSLT实现表示层(HTML、WML、某种格式的XML甚至PDF),并用sitemap(Cocoon 2)集中管理。XSP逻辑单则与JSP的TagLib从概念到用法非常相似,只是实现方法略有不同。JSP的TagLib包括一个xml格式的定义文件和实现的Tag类,并被编译使用;而XSP逻辑单则在运行时(当然可以进行Cache)应用XSLT进行从标记到代码的转换。
一个处理流程可以被描述为:
     从用户接受请求。
     确定用来解释该请求并生成响应的适当管道(使用匹配器)。
     从可用的预配置的组件构造管道。
     指示管道为请求服务。
     将由管道生成的响应返回用户,可能对结果进行高速缓存以便以后使用。
从角色任务上看,站点管理员负责定义Sitemap,程序员主要负责XSP逻辑单,设计者编写XSLT样式表(包括XSLT和目标代码如HTML),因为程序员和设计者都使用XSLT,其实就是在写格式转换,只是编写者需要熟悉如何处理输入和输出(如设计者要面对HTML,程序员要考虑数据库)。此外,在此之前需要有额外的角色来定义所用到的XML或其他中间格式。我认为这种框架比较适合于非Java程序员为主的团队,管理员只要熟悉XML,程序员和设计者需要掌握XSLT;以及适合于业务逻辑相对简单,而着重于xml数据和灵活的格式转换需求的应用。
Tags:
Apr 6

王木犊传 不指定

wanglei , 16:39 , 没有分类 , 评论(0) , 引用(0) , 阅读(1165) , Via 本站原创
八十年代,西安出了两个滑稽人物:一个是石国庆,一个是王木犊。石国庆,祖籍于湖北,出生在四川,十一岁入陕,正值关中年馑,发育缺乏健美:面长,嘴阔,皱纹纵横其上,人见其形象皆乐。平日不善言笑,但出语则逗,正话反说,反话正说,颠三倒四,幽默而不油滑,世称“冷脸蔫怪”,他四十岁演独角戏,名噪古城,后却销声隐迹,穿一件长过膝头的涤纶哔叽上衣,衣不附体,于街头巷尾寻找王木犊。

  王木犊无父无母,说一口地道关中话,多去声,咬透铁锹似的。两人先前并不相识。相传这年春天,石国庆害了一场病,突然口吃起来,往城中寻王木犊不见,在十字街口问路,对一人结结巴巴提说了半天,此人则不言不语,他愤怒离去。去后,旁人不满那人,斥责为什么对问路人一言不发,那人才开口,原来也是个口吃者,说:我患了病,说话结巴,我若回答他,他必以为我是故意学他,故不言最好。旁人觉得有理有趣,问其姓名,回答竟是王木犊也。石国庆事后得知与王木犊交臂而过,又惊又喜,又十分后悔,再寻找却未见,倒不时听到关于王木犊的事情。说是王木犊曾任一个小单位的负责人,但官不大,僚不小。一天妻子不在家,小儿子要撒尿,对他说了,他竟要求儿子写一份关于撒尿的申请报告,供他研究研究。小儿惊疑。他说:你要撒尿,不给我说我是不管的,既然给我说了,我就要对你负责,要么发生什么事故,你妈回来责怪,我如何是好?儿子问报告怎么写。他说:“那不是常用的格式吗?兹有大王木犊之子小王木犊,因喝水过多,渠道畅通,新陈代谢加速,但年纪幼小,尿库容量有限,又缺乏控制能力,需五分钟排泄一次,特申请报告,望家长批准为荷。”小儿却说:“我已经尿了。”王木犊忙问尿在哪儿?小儿说已经尿在裤子上了!结果其妻回来,王木犊非但没有推卸掉责任,反被其妻臭骂了一通。他羞愧万分,遂在单位改革中,主动退出领导岗位,闲在家中。他后去演戏,却因容貌丑陋,不能任主角,在一出戏中充当国民党士兵。原导演安排出场后,他站在台子左边,另一伪兵站在台子右边,红军战士持枪相打,先右后左,枪响人倒,但持枪者向右一打,他却先倒下了,引起观众哄堂大笑,因此剧团便把他辞退了。后来他到街道居委会任计划生育宣传干部,却不让其妻吃避孕药,偷偷将药品丢在后院的水井里。没想以井水喂狗,狗再不生崽子;以井水饮鸡,鸡不再生蛋;以井水浇灌花木、麦子,花木不再开花,麦子不再生穗,又被罢免了。当看见社会上好多人经商,发了大财,他也就领了个体营业证,自制一种“月亮牌”生发油出卖。但为了赚钱,胡乱配料,生产出来又到处作广告,搞宣传。其妻便第一个使用,没想发没新生,反将一头黑发脱个精光。夫妻反了目,市管会来人罚款,法院又传讯,他后悔莫及,在家痛哭三天。消息传出来,众人哗然。

  石国庆觉得此人普通而又绝妙,说:王木犊正是我要找的人啊!他自卑和自尊结合,倔犟和脆弱相融,既聪明又糊涂,既善良又自私,既能忍让又爱嫉妒,是个可笑可悲又可爱的角色。此人若能与我搭班演独角戏,是最好不过的了。他又迫切地寻访,终于找到王木犊。王木犊正痛不欲生,要寻短见:用头猛碰棉花包,但未碰死;用丝线狠勒其腿,但未勒死;听人说“白沙糖真把人甜死了”,便一气吃下十二斤白糖,也未甜死;还要再去死,石国庆拦住了,邀他去演独角戏,两人一见如知己,从此搭班在古城演出。

  王木犊演的独角戏,讲述的都是他自己经历过的事情。令人捧腹大笑,笑过之后,越嚼越有味,还要再笑。因而王木犊的名字就家喻户晓,甚至成了一个代名词。据说,某某单位整顿会上,群众给领导提意见,开口就是:我给咱王木犊主任进一言。有一个体摊贩使奸取巧,顾客就当众指着鼻子说,你这个王木犊!更有甚者,市北十字路口交警一天之内竟罚款了十二个违犯交通规则的王木犊。

  王木犊名气大起来,满城人揶揄他,讥笑他,又不讨厌他,憎恶他。有人说他像阿Q,有人又说他像堂·吉诃德,但他谁也不是,他就是他。那个个体摊贩受了顾客责斥,从此也真效仿起王木犊,知错改错,竟将自己“闻香下马”的牛羊肉泡馍店招牌摘下,换上了“王木犊”字名,而一家报纸也准备以“王木犊”为名开辟一个专栏。

  有个外地漫画家来到西安,在街头,在饭店,在公共电车上,不时听到有人互相斥责“你真是个王木犊”之语,甚觉奇怪,一经打问,颇感兴趣,顿时产生以王木犊的事迹作一系列漫画的想法,就四处查访王木犊其人。但半月过去,没有收获。有人向画家提供线索:石国庆是王木犊的至朋友好,他定知王木犊的出身籍贯,居家住址。这位漫画家好不容易找着石国庆,一相问,才得知王木犊这个“公民”,这个典型角色,却无真人,是石国庆的独角戏里的人物也。

                                                                                                             摘自  贾平凹 《朋友》
Tags:
分页: 66/116 第一页 上页 61 62 63 64 65 66 67 68 69 70 下页 最后页 [ 显示模式: 摘要 | 列表 ]