paulwong

#

EJB的基本觀念介紹

從J2EE推出以來,已經逐漸為企業所熟知,投入J2EE相關技術的資訊從業人員也不斷增加。在J2EE的各項技術中,EJB 是十分值得投資的新技術。

你可能已經知道EJB是Enterprise Java Bean的縮寫,但是可能還不知道EJB的用處和架構。本文的主要目的就是讓讀者先有初步的認識,之後在接下來的各期爪哇藍報中再分別介紹更為入的應用介紹。
1. 基本架構及名詞介紹

EJB從意義上來說,是一種「技術規範」,而不是一種產品,
‧Bean Instance :表示在記憶體中實際產生的物件。一個 Bean Class 可以產生多個 Bean Instance 。Bean Instance 才是真正執行 EJB method 的物件。

‧Container:容器是可提供特定元件(Components)服務的標準執行環境。例如,Web Container必須提供必要的程序(呼叫特定頁面、處理程式等),回應Client端的需求,並將處理結果傳回Client端。

‧EJB Container: 是EJB 標準執行環境,所有 EJB 的產生,或是消滅,或是執行等等,均透過 EJB Container 來處理。當使用者呼叫某個EJB 的時候,實際上也是透過 EJB Container 來執行。

‧Deploy:一個寫好的 EJB 並不能單獨執行,他必須被「放」到EJB Container 之後才能夠執行,而這個動作就是Deploy。Deploy通常只是執行某個動作、按鈕,之後的動作就交由Application Server自行處理。

‧EJB Client:負責使用者介面呈現的元件,可能是JSP/Servlet,或者是一個Standalone Java Application。

‧Message Queue:在程式中要傳達的資料片斷稱為Message,存在於記憶體中,而Message都可經由Message Queue提供給不同的Process進行處理。Message Queue儲存了每個的Message的位址(Address)、型態(Type)、大小(size)、指到下一個Message的指標(pointer)等,它的資料結構基本上是一個Linked List。

2. EJB的種類及用處

EJB 依照特性的不同,區分為幾種。
‧Session Bean:主要的目的是讓程式開發者將邏輯層抽離,這些「邏輯」通常就是一個應用程式中的Business Logic,在整個系統開發中佔有相當重要的一部份。系統開發者可以多加利用Session Bean,將複雜的邏輯放在 Session Bean 的Method中。

  ‧ Stateful Session Bean:可以記錄呼叫者的狀態,因此通常來說,一個使用者會有一個相對應的 Stateful Session Bean 的實體(Instance)。

‧Stateless Session Bean:也是邏輯元件,但是他卻不負責記錄使用者狀態,也就是說當使用者呼叫 Stateless Session Bean 的時候,EJB Container 並不會找尋特定的 Stateless Session Bean 的實體來執行這個 method。

‧Entity Bean:它的角色是主要是資料元件,主要目的在於提供資料,讓系統開發人員直接將Entity Bean 當作程式中所要用到的資料;至於 Entity Bean如何存取一個Relational Databse或LDAP,就可以作為另外一項獨立的事情。

  ‧Bean-Managed Persistence(BMP):由名稱上就可以直接了解到BMP是由Bean自行維護資料的一致。`而Bean從資料庫取得資料後,BMP 中需要自行宣告欄位來存放這些資料,相關的 JDBC 語法等程式,也都須要自行撰寫。適用於開發人員想要完全控制 BMP 的資料存取行為時。

‧ Container-Managed Persistence(CMP):
相對於BMP,CMP是由 EJB Container 負責維護資料。撰寫 CMP 的程式設計師並不需要撰寫大多數的 JDBC 語法,通常只需要撰寫Deployment Description,就可以產生 CMP ;實際上的程式碼是 EJB Container在Deploy EJB 的時候所產生。CMP似乎有助於快速開發系統(大部份的工作都交給EJB Container了嘛),但是須要配合使用支援 CMP 的Application Server,而截至目前為止,每一家不同Application Server對CMP 的支援程度也不大相同。

‧ Message Driven Bean:
主要的目的在於反應 Message Queue 中的事件,當 Message Queue 中有訊息傳入時,Message Driven Bean 可以被觸發,做出對應的反應;所以Message Driven Bean可以說是主動反應,而不是「呼叫某個Method」這樣的方式被動觸發。

其中 Session Bean 與Entity Bean在 EJB 規格 1.x 的時候就已經存在了,而 Message Driven Bean 則出現在 EJB 2.0 的規格中。

posted @ 2008-12-04 11:27 paulwong 阅读(525) | 评论 (0)编辑 收藏

在jsp页面中使用oscache标签实现可配置的页面缓存

最近在学习oscache的相关内容,写点东西作为巩固

如果在jsp中使用如下标签

<cache:cache key="foobar" scope="session">  
          some jsp content   
</cache:cache> 


那么这中间的一段jsp代码将会以key="foobar"缓存在session中,任何其他页面中使用这个key
的cache标签都能共享这段存在缓存中的执行结果

考虑一个需求,一个页面是有许多个不同的jsp文件拼出来的
可能在页首有随机的广告,登录用户的信息,系统的即时信息,固定的目录信息等等
这其中可以考虑将固定的目录信息放入缓存中,而其他动态信息则即时刷新
再进一步考虑 有时候页面之间的信息是关联的,只有当其中一条信息的内容变化了才需要去刷新
对于这种需求就可以考虑在<cache:cache/>标签中配置group属性,将不同的具有关联关系的cache内容
分组,这样oscache会自动的帮你检查该组缓存内容的变化情况,如果有任何一子成员组的内容变化了
则会执行刷新,这样就可以在页面实现数据的动态同步
代码如下:(来源oscache:groupTest.jsp )



<%@ page import="java.util.*" %>  
<%@ taglib uri="http://www.opensymphony.com/oscache" prefix="cache" %>  
   
 
<head>  
 
<title>Test Page</title>  
 
<style type="text/css">  
 body 
{font-family: Arial, Verdana, Geneva, Helvetica, sans-serif}  
 
</style>  
 
</head>  
 
<body>  
   
 
<href="<%= request.getContextPath() %>/">Back to index</a><p>  
 
<hr>Flushing 'group2'<hr>  
 
<cache:flush group='group2' scope='application'/>  
 
<hr>  
 
<cache:cache key='test1' groups='group1,group2' duration='5s'>  
     
<b>Cache Time</b><%= (new Date()).getTime() %><br>  
     This is some cache content test1 that is in 'group1' and 'group2'. Normally it would refresh if it  
     was more than 5 seconds old, however the 
<cache:flush group='group2' scope='application'>  
     tag causes this entry to be flushed on every page refresh.
<br>  
 
</cache:cache>  
 
<hr> 



这里有两个cache分组group1和group2,将group2设置为每次都执行刷新,所以test1为key的cache每次刷新页面内容都是重新执行过的

<cache:cache key='test2' groups='group1' duration='5s'>  
    
<b>Cache Time</b><%= (new Date()).getTime() %><br>  
     This is some cache content test2 that is in 'group1' (refreshes if more than 5 seconds old)
<br>  
 
</cache:cache>  
 
<hr> 


而test2只有当间隔时间超过5秒才会更新内容

 <cache:cache key='test3' duration='20s'>  
     
<b>Cache Time</b><%= (new Date()).getTime() %><br>  
     This is some cache content test3 that is in 'group1' and 'group2'. The groups are added using the 
<cache:addgroup /> tag.<br>  
     
<cache:addgroup group='group1'/>  
     
<cache:addgroup group='group2'/>  
 
</cache:cache>  
 
<hr>  
 
<cache:cache key='test4' duration='20s'>  
     
<b>Cache Time</b><%= (new Date()).getTime() %><br>  
     This is some cache content test4 that is in 'group1' and 'group2'. The groups are added using the 
<cache:addgroups /> tag.<br>  
     
<cache:addgroups groups='group1,group2'/>  
</cache:cache>  
 
<hr>  
 
</body>  
</html> 


<cache:addgroup group='{you_group}'/>可以将所在的cache加入存在的group中

posted @ 2008-02-19 22:28 paulwong 阅读(1507) | 评论 (0)编辑 收藏

用Hibernate实现领域对象的自定义字段

     摘要: 导言 在开发企业级业务应用(企业规模)时,客户往往要求在不修改系统源代码的情况下对应用对象模型的扩展性提供支持。利用可扩展域模型可以实现新功能的开发,而不需要额外的精力和成本 应用的使用周期将被延长;  外部因素改变时,系统工作流也可以随之被修改; 已经被部署的应用可以被“设定”,使其符合企业的特定情况。 完成以上功能...  阅读全文

posted @ 2008-01-23 11:57 paulwong 阅读(2191) | 评论 (1)编辑 收藏

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 阅读(576) | 评论 (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 阅读(1832) | 评论 (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 阅读(1403) | 评论 (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 阅读(305) | 评论 (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 阅读(270) | 评论 (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 阅读(1691) | 评论 (0)编辑 收藏

可变列宽的表格

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

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

仅列出标题
共116页: First 上一页 108 109 110 111 112 113 114 115 116 下一页