paulwong

#

struts2笔记:与spring2集成


struts2基本上就是webwork的翻版,所以迁移过程倒是很简单,只需要修改下配置文件和一些包名就可以了。如果在Eclipse、Netbeans这些集成开发工具的帮助下,记不清包名也很容易找到想要的类的,呵呵。


在Eclipse下建立一个Dynamic Web Application。


从struts2.0.6的lib目录中复制下面的库文件到WEB-INF/lib目录下:
commons-logging-1.1.jar
freemarker-2.3.8.jar
ognl-2.6.9.jar
struts-api-2.0.6.jar
struts-core-2.0.6.jar
struts-spring-plugin-2.0.6.jar
xwork-2.0.0.jar


从spring中lib目录中复制下面的库文件到WEB-INF/lib目录下:
spring.jar


修改web.xml,增加一个struts的分派器filter,映射所有的url-pattern,再增加一个spring的ContextLoaderListener监听器。修改后的内容如下:


<?xml version="1.0" encoding="UTF-8"?>   
<web-app id="WebApp_ID" version="2.4"   
    xmlns
="http://java.sun.com/xml/ns/j2ee"   
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"   
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">   
    
<display-name>struts2tutorial</display-name>   
        
    
<filter>   
        
<filter-name>struts2</filter-name>   
        
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>   
    
</filter>   
        
    
<filter-mapping>   
        
<filter-name>struts2</filter-name>   
        
<url-pattern>*.action</url-pattern>   
    
</filter-mapping>   
        
    
<welcome-file-list>   
        
<welcome-file>index.jsp</welcome-file>   
    
</welcome-file-list>   
        
    
<listener>   
        
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
    
</listener>   
        
</web-app>   

 

写一个简单的Action,HelloWorld:


package tutorial;    
import com.opensymphony.xwork2.ActionSupport;    
public class HelloWorld extends ActionSupport {    
   
    
public static final String MESSAGE = "Struts is up and running ";    
   
    
public String execute() throws Exception {    
        setMessage(MESSAGE);    
        
return SUCCESS;    
    }
    
   
    
private String message;    
   
    
public void setMessage(String message){    
        
this.message = message;    
    }
    
   
    
public String getMessage() {    
        
return message;    
    }
    
}
   


在源文件路径下(项目的src目录)增加struts.xml配置action。这个文件是集成spring的关键所在,这里面描述有如何将spring2集成到struts2的相关信息:


<!DOCTYPE struts PUBLIC    
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    
    "http://struts.apache.org/dtds/struts-2.0.dtd"
>   
<struts> 
    
<!-- 下面这句表明对象是由spring负责产生的.加上这句后,struts会产生让spring负责产生bean,如果spring不能产生bean,则由struts自己产生.也可以在struts.properties文件内定义这个属性.--> 
    
<constant name="objectFactory" value="spring"></constant>   
    
<package name="struts2tutoial" extends="struts-default" namespace="/">   
        
<!-- 注意,现在action的class属性不再是类的名字了,而是在spring中的bean的id,详细信息请看下面的spring的bean配置文件applicationContext.xml --> 
        
<action name="HelloWorld" class="helloWorld">   
            
<result>/helloWorld.jsp</result>   
        
</action>   
        
<!-- Add your actions here -->   
    
</package>   
</struts>   


在WEB-INF/目录下增加spring的bean配置文件applicationContext.xml:


<?xml version="1.0" encoding="UTF-8"?>   
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">   
<beans>   
   
    
<bean id="helloWorld" class="tutorial.HelloWorld"></bean>   
   
</beans>  


配置很简单,只有一个bean。

最后,在WebContent目录下增加helloWorld.jsp:


<%@ taglib prefix="s" uri="/struts-tags" %>   
   
<html>   
    
<head>   
        
<title>Hello World!</title>   
    
</head>   
    
<body>   
        
<h2><s:property value="message" /></h2>   
    
</body>   
</html> 

posted @ 2007-07-16 23:38 paulwong 阅读(568) | 评论 (0)编辑 收藏

Struts-Menu结合角色权限的应用

     摘要: STRUTS-MENU简介:STRUTS-MENU支持静态和动态菜单,数据来源和显示方式分开,菜单文字国际化,权限。 <menu:useMenuDisplayer name="Velocity" config="/framework/res/menucomp/templates/xtree.html"  bundle="org.apache.stru...  阅读全文

posted @ 2007-07-16 23:07 paulwong 阅读(1822) | 评论 (1)编辑 收藏

Spring Module---cache

项目需要缓存,google了一下,发现spring module有现成的东西可用,随即拿来看看。发现还是比较好用的。
改cache采用了aop的方式进行cache的写入和刷出。使用spring风格,上手容易。
系统负载不高,因此对于该缓存方法的性能等等不做评价,目前满足需要。
使用方法:
有这么几个概念需要提前知道1.XXCacheFacade,比如如果是oscache,那么XX就是oscachefacade.该类负责缓存的写入和刷出

<bean id="oscacheFacade" class="org.springmodules.cache.provider.oscache.OsCacheFacade">  
    
<property name="failQuietlyEnabled" value="true"/>  
    
<property name="cacheManager">  
        
<bean id="oscacheManager" class="org.springmodules.cache.provider.oscache.OsCacheManagerFactoryBean"/>  
    
</property>  
  
</bean>  


里面的cacheManager必须要有,改类负责提供底层具体的cache实现,比如oscache或者EHcache等。
2.MethodMapCachingInterceptor这个拦截器是官方提供的同类型的拦截器之一,根据方法名,参数匹配拦截。

<bean id="cachingInterceptor001" class="org.springmodules.cache.interceptor.caching.MethodMapCachingInterceptor">  
    
<property name="cacheProviderFacade" ref="oscacheFacade"/>  
    
<property name="cachingModels">  
        
<props>  
            
<prop key="com.company.jncz.TestItIF.get*">groups=aa;refreshPeriod=10</prop>  
            
<prop key="com.company.jncz.TestItIF.load*">groups=bb;refreshPeriod=10</prop>  
        
</props>  
    
</property>  
  
</bean>  


注意cachingModels。有两种方式写法,一种是上面看到的使用props另一种是使用Map.在有些情况下只能使用Map方式,下面解释

<map>  
  
<entry key="com.company.jncz.TestIt.get*">  
    
<ref local="oscacheCachingModel"/>  
  
</entry>  
</map>  

 

 

<bean id="oscacheCachingModel" class="org.springmodules.cache.provider.oscache.OsCacheCachingModel">  
    
<property name="groups">  
            
<list>  
               
<value>aa</value>  
               
<value>bb</value>  
            
</list>  
       
</property>  
    
<property name="refreshPeriod" value="10"/>  
 
</bean>  


尤其当groups(对于oscache来说是groups)的值不止一个的时候,就需要使用map的方式。
否则不生效(也许还有什么我没有注意到).另外需要注意的是对于model来说他的key很重要。有以下需要注意:如果AImpl是A接口的实现类,而且你在其他地方使用时都是用A接口来声明的,那么key就必须写成接口的全限定名比如:com.company.jncz.A.getXX,否则无法识别。

 

对于与cachingModel相对应的flushingModel写法是类似的,参考api很容易写出来。

最后

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
        
<property name="beanNames">  
            
<value>*Service</value>  
        
</property>  
        
<property name="interceptorNames">  
            
<list>  
                
<value>cachingInterceptor001</value>  
                
<value>flushingInterceptor001</value>  
            
</list>  
        
</property>  
  
</bean>  
  
<bean id="testService" class="com.company.jncz.TestItStub"/>  


这些不做介绍。
总之比较简单。这两天感冒,昏昏沉沉,不知道有没有表达清楚。。。。

 

自己看了一眼,的确没说清楚,要清楚的几个概念是cacheFacade.CachingModel.FlushingModel.CachingInterceptor.FlushingInterceptor.这些算是比较重要的。其他aop内容略。caching拦截器拦截某方法,根据cachingModel定义的规则由cacheFacade将之放入cache。flushing拦截器拦截到某方法,根据flushingModel定义的规则由cacheFacade将对应的cache清除。嗯,基本上流程就这样子了。

posted @ 2007-07-16 17:01 paulwong 阅读(1394) | 评论 (0)编辑 收藏

applicationContext解析

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

  建立一个数据源
 
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  
<property name="driverClassName">
   
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
  
</property>
  
<property name="url">
   
<value>jdbc:microsoft:sqlserver://192.168.0.6:1433</value>
  
</property>
  
<property name="username">
   
<value>sa</value>
  
</property>
  
<property name="password">
   
<value></value>
  
</property>
 
</bean>

  建立会话工厂类,这个类使用spring专门为hibernate3提供LocalSessionFactoryBean
 
 
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  
<property name="dataSource">
   
<ref local="dataSource" />  --引用上面的数据源
  
</property>
  
<property name="mappingResources">  --调入映射文档
   
<list>
    
<value>com/yourcompany/User.hbm.xml</value>  
   
</list>
  
</property>
  
<property name="hibernateProperties">  --相关设置
   
<props>
    
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
    
<prop key="hibernate.show_sql">true</prop>
   
</props>
  
</property>
 
</bean>
  

    定义事务管理器,这个也是 spring专门为hibernate3提供的HibernateTransactionManager 事务管理器
 
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  
<property name="sessionFactory">
   
<ref local="sessionFactory" />   --引用会话工厂类
  
</property>
 
</bean>


 定义实体DAO
 
<bean id="userDAO" class="com.yourcompany.UserDAOImp">
  
<property name="sessionFactory">
   
<ref local="sessionFactory" />--引用会话工厂类
  
</property>
 
</bean>
 

 为上面的实体DAO定义一个代理(proxy)类,这是spring为解决事务问题而提供TransactionProxyFactoryBean动态事务代理类
 
<bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  
<property name="transactionManager">
   
<ref bean="transactionManager" />  --指定事务管理器(需要是spring专用的)
  
</property>
  
<property name="target"> --目标实体DAO类
   
<ref local="userDAO" />
  
</property>
  
<property name="transactionAttributes"> --定义要使用事务的方法
   
<props>
    
<prop key="insert*">PROPAGATION_REQUIRED</prop>  --所有insert开头的方法都使用事务,出错要回滚
    
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> --所有get开头的方法都使用只读事务
    
<prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>--所有ist开头的方法都使用只读事务
   
</props>
  
</property>
 
</bean>


  为 path="/login" 的struts action 定义实际的action类,该action 已经进行 type="org.springframework.web.struts.DelegatingActionProxy"设置
  
<bean name="/login" class="com.yourcompany.struts.action.LoginAction" singleton="false">
    
<property name="userDAO">
    
<ref bean="userDAOProxy" />  --注意,这里指定的userDAO是上面定义的代理类
  
</property>
 
</bean>
</beans> 

posted @ 2007-04-06 16:19 paulwong 阅读(298) | 评论 (0)编辑 收藏

RFID 应用

小心「RFID 智能型陈列货架」就在你身边!


还有什么比自己的一举一动受人监控还要恐怖的事呢?现在,日本的 DNP、Tana-X 和SEARS(不是美国的那个Sears喔!)正在研发一种智能型陈列货架,可以追踪挂着RFID 标签的商品,进而分析消费者的行为模式,像是:商品的「访客率」及购买率,消费者的「平均考虑时间」及「同次购买物品」(比方说消费者可能会同时购买 PSP和UMD光盘),当消费者拿起商品扫进店内的 POP 系统,查询产品的相关信息时,系统背后的营销人员也在悄悄收集相关信息,进而获得所需的营销信息。


目前我们还不太确定今年十二月圣诞节采购旺季时,哪里的消费者会被「试用」,不过建议大家在逛街的同时,还是多回头看看,小心「RFID 智能型陈列货架」就在你身边。



IBM 发布标签箝技术,让 RFID 可靠一点点...


RFID 无线辨识系统的数据安全,实在是让人冷汗直流。特别是在护照及信用卡方面,已经传出了相当多的问题之后,让人必须快点找到应对的方法。而咱们的蓝色巨人,不玩笔电很久的 IBM 公司,近来则是在不改变 RFID 运作的方法之下,改进了其安全性上的问题。


利用这个叫做标签箝的方式(clipped tag),将天线的接收讯号的范围缩小到只有短短的几吋之内,将 RFID 的读取限制在一个很小的范围,迫使有心人必须非常接近相关的卡片、卷标,才能有效的读取并窃取数据,试想,如果有人故意贴在你身上拿个扫描装置来探测你,你会不反击吗?


那这项技术广泛应用要等多久呢?一年?不用!一个月?不用!根据 InfoWorld,再过几天,他就会开始在市面上使用(特定区域、对象),而该杂志也专访了加拿大一位专家 Ann Cavoukian 博士,请教她对于这项技术的看法,她则表示,这项技术解决了相当多让人头痛的问题,进而让 RFID 技术能让消费者隐私的安全,多上了点保护。


虽然这目前只是个折冲的办法,但是只要消费者小心点,重要证件、档案不要落到有心人手里,我们就可以不用担心,没事走在路上,私人资料就被扫走的问题。



IBM 将利用 RFID 技术来防止假药流入市面


RFID 无线辨识技术上的应用,算是越来越广泛了,虽然也曾经出了不少问题,但经过一番努力,这项技术,相信还是能为全体民众带来更多的便利及保障。


近来 IBM 则是要将 RFID 应用在药品运送的管控上,让有心人无机可乘。利用瓶身上的 RFID 标签,在经由各个转运站时,工作人员透过相对应的接收装置,将 RFID 里头的信息读入电脑,并上传到药厂,让药厂能够追踪药品在通路期间的转运地点,并且实时更新相关数据,到了中游的通路商、下游的药局手中时,也能利用药厂提供的数据,来作比对,确保没有被掉包之疑虑。



飞利浦推出使用 RFID 技术的植物标本箱
 

飞利浦公司又将触角伸向另一项前无古人的新科技-植物标本箱-运用RFID(无线射频辨识技术)的植物温室。这个植物温室能够侦测你种植在它贴了标签的花盆里植物的品种,然后针对该品种制造完美的成长环境,这样你就可以很简便地在家栽种新鲜荷兰芹、鼠尾草、迷迭香和百里香等调味植物,免除了出门去市集或是有机食物专卖超市购物的麻烦。



将行李置入 RFID 标签,从此时无走失之虑



我们想有一天,这个世界应该会布满 RFID 标签, 正要出门旅行的您,手上的行李相当不能例外。位在拉斯维加司的马卡伦国际机场(McCarran International Airport),在他们三条航线中,设立了一个系统,为您家的行李装上 RFID 标签,透过单音道的扫射,可以追踪标签自动地将您的行李送到正确的目的地,停留在原地等待进一步的扫射。官方声称这套系统将有99.5%的准确性,所以朋友们,赌上一把的时候,别忘了顺别跟上帝祷告一下,您的行李不在0.5%的误差范围内。



RFID 帮消费者选择化妆用品


日本 Seijo 药妆店贴心的为消费者推出了一项化妆品试用服务,今后消费者就不用将摆在架上不知几个人试用过的化妆品抹在脸上试用,可以改用一款由 NTT 设计的 RFID 仿真化妆软件来看看心仪的化妆品是否适合自己。


消费者只需要坐在电脑屏幕前,由网络摄影机帮他拍张脸部正面照,照片出现在屏幕后,消费者就可以开始把自己想要试用的化妆品用电脑内置的 RFID 扫描仪读取,然后软件会根据扫描进来的化妆品项目自动判断应该涂抹在脸部的哪个部位,消费者便可由屏幕上出现的照片来判断此化妆品的颜色或质感是否适合自己或符合自己所需。


此软件还会根据消费者选用的产品再推荐其它能够相互搭配的色彩,所有配色和试用的动作完成后,消费者还可以把屏幕上完妆后的照片印出来,做为日后购物的参考。


这个所有程序都由电脑完成的化妆品试用软件,保证比传统专柜一对一试用来得迅速方便,造福的除了女性外,应该还有常需要陪另一半逛公司,并在一旁苦等的男性朋友吧。



确保清酒瓷具组安全的 RFID 标签


像这样顶级清酒瓷器组,如果不能在恒温底下保存,可能本身的质量会受影响,尤其是在长途运送的过程,更是苦煞制造商。


于是NTT和数家瓷器公司一同合作,利用监测程序来侦测贴在瓷器上具温度传感器的RFID卷标,并让运送的卡车上装载感应器,实时将标签的感应值藉由3G来传送至总部,如果有任何异状,可以实时反应(如果司机想趁机开箱行窃,是逃不过感应器法眼的!)。


当运送到买家手上,就可以调阅其温度记录,看看是否被动手脚。看来这对于其它的高档货而言,可能会是的不错的防盗措施!



美国将在八月正式对一般民众发行 RFID 护照


经过了各方角力争议,最终美国还是会在八月对一般民众发行 RFID 护照 ePassport(先前已经让外交人员使用。)。而新的带有 RFID 标签的护照,里头将会包含姓名、地址、国籍、相片、数字化的指纹文件等个人相关资料。


而先前所担心的防伪、资料外泄等问题,美国政府仍然十分自信,表示他们已经做好万全的准备。不过自从荷兰发行的 RFID 护照遭破解、窃取数据后,人们就开始对 RFID 护照的可靠与否感到怀疑。而这项科技,最终将是会便利机场的安检、节省大家的时间,或是让科技罪犯更容易的侵犯他人隐私,大家可以好好观察后续的发展。



VoIP 和 RFID High 翻日本试衣间


爱逛街的女生要注意啰,日本三越百货最近引进一个新系统,让消费者在试衣间时,可透过无线辨识系统 (RFID) 先将衣服上的吊牌扫入,然后使用网络语音电话 (VoIP) 查看目前店内的库存,并通知店员展示其它所需商品。


这个系统利用三越百货本身的销售端管理系统 (Point of Sale System),可实时掌控店内的库存,配合使用 Cisco 的网络电话,整个安装成本只需美金 700~800元,相较之下,成本高达美金 20,000~25,000 的触碰式银幕型导览器 (touchscreen kiosk),实在贵多了。


当衣服被扫入辨识系统之后,可供选择的尺寸、颜色及其它类似款式的服饰会显示在电话上的触碰式银幕,消费者拿起话机就可与店员通话,这可比在试衣间扯着嗓子喊着自己所需的尺寸低调多了。


系统供货商 Litescape 宣称,目前已向许多美国零售商(Abercrombie、HomeDepot、Gap、Virgin Mega…等)推销这个系统,不知何时才轮到中国?



韩国公司 Rocket 发展「纸电池」,主要应用在 RFID 等方面


虽然韩国公司 Rocket 开发的这个产品被自称为「纸电池」,但似乎应该只是指它和纸一样薄(像 NEC 一年前的产品一样),而不是真的用纸做的。在技术的部份我们是一个字儿也看不懂,不过大致上就是「电池科技」+「薄膜科技」产生一个像纸一样薄、无毒、而且不会着火也不会爆炸(重要!)的新电池之类的吧。


Rocket 估计主要的应用应该是在 RFID、智能卡和「化妆品、药品输送系统」等需要迷你电池的地方。奇怪的是,Rocket 还提出了「牙齿美白、抗老化、去皱纹」的应用,我们实在猜不出电击牙齿是怎么能让它变白?总之,让我们期待看看它是如何神奇吧!


http://cn.engadget.com/search/?q=rfid

posted @ 2006-12-23 11:38 paulwong 阅读(263) | 评论 (0)编辑 收藏

JSP + Jndi + Spring + Hibernate 心得筆記

這几天小試了一下JSP +Jndi + Spring + Hibernate組合的功能,想讓JSP網頁可以秀出Database裡的資料。試了老半天,發現要讓這組合成功運作,還真的是很麻煩,很多細節要注意。而且很多設定找不到文件,很讓人...DeadDeadDead


以下是這個組合成功運作所需注意的地方。


1.系統建置環境如下
AP Server : Tomcat 5.5.x
Database : Oracle 10g
Framework : Spring 1.2.x + Hibernate 3.x


2.相關重要修改設定如下
2.1 首先,我要利用Tomcat的DBCP Connection pool功能,所以必需先改Tomcat裡面的Server.xml設定檔,加入下面藍字所示的相關設定

<Host>
  
  中略
  
  
<Context 中略>
    
    
<!-- Tomcat5.5的DBCP設定方式寫法與之前版本完全不同 -->
    
<Resource 
      
name="jdbc/scott"
      auth
="Container"
      factory
="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"             
      type
="javax.sql.DataSource"
      driverClassName
="oracle.jdbc.driver.OracleDriver"            
      url
="jdbc:oracle:thin:@localhost:1521:orcl"              
      username
="scott"            
      password
="tiger"
      maxIdle
="10"
      maxWait
="1000"              
      maxActive
="100"/>    
      
  
</Context>
</Host>


2.2 接下來修改web.xml設定檔藍字所示內容

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
  xmlns
="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
  
<!-- 指定log4j設定檔位置 -->
  
<context-param>
    
<param-name>log4jConfigLocation</param-name>
    
<param-value>/WEB-INF/log4j.properties</param-value>
  
</context-param>
      
  
<!-- 指定spring設定檔位置 -->
  
<context-param>
    
<param-name>contextConfigLocation</param-name>
    
<param-value>/WEB-INF/beans-config.xml</param-value>
  
</context-param> 
  
  
<!-- 一定要在ContextLoaderListener設定之前加上Log4jConfigListener設定,如此一來ContextLoaderListener才可以正常運作 -->
  
<listener>
    
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  
</listener>
 
  
<listener>
    
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  
</listener>  
 
  
<!-- 指定此項Filter可使Spring取回的DomainObject在JSP(View層)作完所有的事情後,才將Hiberante Session給Close -->
  
<filter>
      
<filter-name>hibernateFilter</filter-name>
      
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  
</filter> 
  
  
<filter-mapping>
      
<filter-name>hibernateFilter</filter-name>
       
<url-pattern>/*</url-pattern>
  
</filter-mapping>
  
  
<!-- 指定JNDI JDBC DataSource -->
  
<resource-ref>
    
<description>JNDI JDBC DataSource</description>
    
<res-ref-name>jdbc/scott</res-ref-name>
    
<res-type>javax.sql.DataSource</res-type>
    
<res-auth>Container</res-auth>
  
</resource-ref>
  
  中略

</web-app>


2.3 在/WEB-INF目錄裡面,增加beans-config.xml這個Srping設定檔,修改藍字所示內容


<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 
 "http://www.springframework.org/dtd/spring-beans.dtd"
> 
<beans> 
    中略
     
    
<!-- 利用JNDI的方式連結到DataSource -->
    
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
        
<property name="jndiName">  
            
<!-- 不可省略"java:comp/env/"字串,否則會出現異常 -->
            
<value>java:comp/env/jdbc/scott</value> 
        
</property>  
    
</bean>         
    
    中略
</beans>


2.4 在/WEB-INF目錄裡面,增加log4j.properties這個log4j設定檔

#這是我用的設定檔,請自行修改成以符合實務上需求
log4j.rootLogger=info,consoleAppender
log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=%d [%t] %-5p %c - %m%n


3.大功告成...寫個測試的JSP網頁試試看吧...Big SmileBig SmileBig Smile...以下是我測試用的JSP,請自行修改以符合實務上需求

<%@ page language="java" contentType="text/html; charset=utf-8"  pageEncoding="utf-8"%>
<%@ page import="org.springframework.web.context.WebApplicationContext"%>
<%@ page import="org.springframework.web.context.support.WebApplicationContextUtils"%>
<%@ page import="com.db.table.Emp"%>
<%@ page import="com.db.dao.IEmpDAO;"%>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Spring Test</title>
</head>
<body>
<%
  WebApplicationContext context 
= WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());  
  IEmpDAO empDAO 
= (IEmpDAO)context.getBean("empDAOImpl");
  Emp emp 
= empDAO.find(new Short((short)7369));
  out.println(
"Ename: " + emp.getEname() + "<br>");
  out.println(
"Dname: " + emp.getDept().getDname() + "<br>");
%>
</body>
</html>

posted @ 2006-12-20 14:53 paulwong 阅读(1682) | 评论 (0)编辑 收藏

可变列宽的表格

     摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> /*  表格  */ .ResizedColTable {     border-bottom : ...  阅读全文

posted @ 2006-11-24 16:05 paulwong 阅读(842) | 评论 (0)编辑 收藏

分析设计工作

1.需求调研
2.需求分析
3.数据库设计(数据字典)
4.系统概要分析
5.详细设计
6.集成测试方案设计,确认指导开发工程师工作 其它要求:
1、做详细或部分概要(核心)设计;
2、按时提供提交件(UML格式设计文档或数据模型文档);
3、按设计提交件编码;
4、指导程序员做详细设计或编码;
5、确保核心代码质量保证。

posted @ 2006-11-10 19:13 paulwong 阅读(252) | 评论 (0)编辑 收藏

oracle的clob问题

为了实现与数据库无关,可以方便的在mysql和oracle之间移植,所以不能对于数据库操作进行硬编码。当然是使用hibernate,但是实现mysql的text字段和oracle的clob字段之间的转换确实有点麻烦,幸好hibernate提供了net.sf.hibernate.type.TextType 类型。它可以方便的在clob和text数据类型之间转换。


在转换完成之后,总是报告“streams type cannot be used in batching”,将hibernate的配置文件中,设置hibernate.jdbc.batch_size =0 即可解决此问题。


在解决上问题后,我发现向clob字段写入小数据量可以,但是数据量一大就会有问题,不能正常写入,hibernate也不会报告错误。经jaoso的作者提醒,可在hbm文件中,设置length="10000"(你许可的最大长度) 就可以了。

posted @ 2006-11-08 00:41 paulwong 阅读(604) | 评论 (0)编辑 收藏

科学破解江湖骗术

 科学破解江湖骗术
   
科学破解江湖骗术赤手空拳伸进滚滚油锅、烧而不断的棉线、白纸突现血手印……这都是那些巫婆神汉用来欺骗大众的小把戏,他们就是通过这些看似违背常理的现象,让一些有病乱投医的人相信他们拥有某种神秘力量,能为人消灾避祸。无辜的人不仅被骗去钱财,甚至还搭上了性命。这些江湖骗术究竟暗藏哪些猫腻,我们将一一为您破解。

骗术一:


油炸厉鬼


一锅热气腾腾的油,眼看就要烧开了。但是一些自称拥有法术的大师们竟然可以将手伸进翻滚的油锅。这通常让旁人目瞪口呆。一般人炒菜的时候如果有油溅到手上通常都受不了,滚滚油锅难道他们真的不怕烫吗?


骗术揭秘


其实这并不是一锅真正的油,一锅油沸腾以后,温度会达到两三百摄氏度,肯定会对人造成伤害,这锅油里面一定会有其他的东西,一般情况下会是醋,因为醋的密度会比较大,所以放入锅中会沉在油的下面。我们从上面看上去,就像是一锅油,看不到醋。加热以后,因为醋的沸点低,所以它会首先沸腾。那气泡就会鼓到油面上来,看上去像是油开了,但实际上这个时候的温度只有60摄氏度左右,并不会对人造成伤害。如果想进一步降低温度,还可以向锅中加入碳酸钙,或者是硼砂之类的化学物质,这样因为发生化学反应,同样会产生气体,气泡也会鼓到油面的上方,看上去油也像开了,而这个时候的温度会更低,就更不会对人造成伤害了,就可以放心大胆地施加法术了。


骗术二:


白纸血印


原本是一张雪白的纸,只见“大师”用力一拍,纸上竟然出现了一个血手印,这个时候“大师”们往往告诉你家里的狐狸精、妖魔鬼怪已经被他降服了。“大师”接下来把出现血手印的纸往水盆里面一放,血手印又慢慢消失了,“大师”的解释是,鬼怪最终被驱走了。


骗术揭秘


在这个招术中,主要是一种化学试剂酚酞在起作用,酚酞遇碱会变成红色,遇酸就自然地会褪色,其实“大师”就是利用了这个简单化学反应。先把酚酞喷到一张白纸上,晾干了,看起来还是一张好端端的白纸,然后做法的时候,手上再沾点碱水,往上一拍,于是反应出来之后,一个红手印就有了,等搁到水盆里的时候,水里面可以兑点稀盐酸、白醋,所以纸往里一搁,遇酸它自然就褪色了,血手印它就没了。


骗术三:


火烧棉线


一枚铜钱用一根普通的棉线悬吊着,“大师”将棉线点燃,可奇怪的是棉线明明已经烧着了,却怎么也不断。这也是大师们通常用的一招,声称这是因为鬼怪的法术太高明,所以才让棉线怎么烧也不断。


骗术揭秘


大师用的棉线,其实是被他动了手脚的,棉线可能用盐卤水泡过,盐卤水是用来点豆腐的,里面含有氯化钾、氯化镁等物质,用这样的线系住那个铜钱,看起来是点着了,其实烧着的仅仅就在线的表面,而这个线的内部由于受到氯化钾和氯化镁的保护,并没有接触空气,所以并没有烧掉。


骗术四:


清水爆炸


“大师”手中拿着一根针,念念有词地绕着一盆水转着,一会儿那根针竟然在水面上漂浮起来。“大师”这个时候往往都说这是因为水鬼把针托了起来。证明了有水鬼, “大师”自然要拿钱消灾了,声称可以除掉水鬼。只见“大师”的手指在水盆中慢慢悠悠地转,水盆中突然冒出来个东西,难道水里还真的有鬼?这个时候,水盆竟然爆炸了,冒出一股浓烟。


骗术揭秘


其实针可以浮在水面上,并不是因为神或者鬼的作用,这其实主要是因为水具有一定的表面张力,当我们把针或者是平常认为一定会沉入水底的硬币轻轻地平放在水面上的时候,我们就会看到水面会凹陷下去一部分,凹陷下去的水面就会产生一个向上的力来托着这根针或者是硬币,让它不至沉入水底,这其实是一个很简单的物理现象,所谓的“大师”们只是利用了他的这个知识,蒙骗了当事人,达到了他骗钱的目的。而水又怎么会爆炸呢?其实是偷偷地往水盆里扔了一块钠。金属钠个性是非常活泼的,遇到了水就会迅速地燃烧,并且起剧烈的化学反应,甚至会出现这种爆炸的场面,第一次扔块小的,第二次扔块大一点的,一旦爆开了就说,鬼被除掉了。


骗术五:手指自燃


“天灵灵、地灵灵,我要驱鬼了。”大师们通常先把手沾湿了,然后把手全弄上面粉,只见大师左一拍,右一拍,手指在桌上晃来晃去,嘴里还念念有词,“拍死你”、“抓住你”,紧接着手指那么一晃,突然手指上就出现了一股火。据说这样也就把鬼怪擒住了。


骗术揭秘


手指怎么能够着火呢?实际上也是挺简单的,一般大师都会预先在桌子上洒上三种粉末,第一种就是樟脑,第二种是磷,第三种是硫黄,那么他事先手指上沾了面粉,于是在桌子上这样来回晃动的同时,就把这三种粉末都沾到了手上,然后满屋子都是烟雾,他又在空气中使劲地喊,使劲地抖,樟脑易挥发,硫和磷容易燃烧,这么一抖一抖,热度一合适,自然就着了,那大师为什么烧不着自己呢?因为事先他的手上有一层面粉,而且火马上也被他掐灭了,根本不成什么问题。


骗术六:蛇妖现身


一张普通的黄纸就能让蛇妖显形?这本是十分荒谬的事情,可是却骗了很多人。大师通常都会先说你已经被鬼缠身,比如蛇妖之类,只有他能让蛇妖显形,不过这自然少不了钱的作用,一旦拿到钱,大师拿出一张黄纸放在香火头上开始烧,黄纸首先被烫出了一个洞。随着黑洞不断地扩大,黄纸上真的就如大师所言出了一条蛇的样子,也就是他所谓的蛇妖现身了。


骗术揭秘


我们看到那张纸遇到香火头,就神奇般地出现了蛇的形状,其实是“大师”事先在那纸上,用一种化学药品画出来的,那化学药品通常是硝酸钾,因为硝酸钾是造火药的一种成分,在化学上是一种强氧化剂,也是一种助燃剂,它比较容易溶于水,“大师”可能就是用硝酸钾溶液在纸上面画出那条蛇的形状,然后把它晾干。在晾干后,硝酸钾颗粒就附着在纸上了,这样的纸一旦遇火,附着硝酸钾的那一部分就特别容易燃烧。

posted @ 2006-10-29 14:30 paulwong 阅读(209) | 评论 (0)编辑 收藏

仅列出标题
共112页: First 上一页 104 105 106 107 108 109 110 111 112 下一页