More servicesWindows Live
HomeHotmailSpacesOneCare
 
MSN
Sign in
 
 
Spaces home  蚯蚓PhotosProfileFriendsBlog Tools Explore the Spaces community

Blog

March 26

终于实现了Tapestry4 EntityForm和QueryTable的组件化

取代以前的BaseEditPage 和 BaseListingPage 两个基础抽象类,所有的Page统一继承自 BasePage(自定义的继承自org.apache.tapestry.html.BasePage)
实现BasePage的单一化
 
QueryTable的实现思路
传入Query和Parameters 取代掉source参数,用Query和Parameters构建一个model提供给TableView
 
看下demo 类
EmployeeList.java
package app.demo.web.pages;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.event.PageBeginRenderListener;
import org.apache.tapestry.event.PageEvent;
import common.tapestry.components.table.QueryTable;
import common.tapestry.html.BasePage;
public abstract class EmployeeList extends BasePage implements
  PageBeginRenderListener {
 
 public abstract String getName();
 public void pageBeginRender(PageEvent event) {
 }
 QueryTable getTable_1() {
  return (QueryTable) getComponent("table1");
 }
 public void doSubmit() {
  Map map = new HashMap();
  map.put("A", "1");
  
  String hql = "select a from Employee a where 1=:A";
  if(StringUtils.isNotBlank(getName())){
   hql = hql +" and a.Name like :name";
   map.put("name", "%" + getName() +"%");
  }
  getTable_1().setQueryAndParameters(hql, map);
 }
 public void activateExternalPage(Object[] obj,IRequestCycle cycle){
  super.activateExternalPage(obj, cycle);
  getTable_1().setQueryAction(false);
 }
}
html模板
<t3
jwcid="table1@ext:QueryTable"
title="ognl:components.border.title"
columns="a_Name:名字:Name,a_Age:年龄:Age,a_Remark:备注:Remark,a_Birthday:生日:Birthday,!Operate:操作:operate" class="data_window"
cellSpacing="1" cellPadding="3" border="0" pageSize="10">
<t3 jwcid="OperateColumnValue@Block">
<a jwcid="@ExternalLink" page="EmployeeEdit" parameters="ognl:{components.table1.row.Id}" > 查 看</a>
<a jwcid="delete@ext:EntityDeleteLink" entity="ognl:components.table1.row">删除</a>
</t3>
</t3>
 
 
March 24

Extension Tapestry4`s restart service to clear my login cookies

接上篇,自定义一个logout service 把我的login cookies 清楚掉

Tapestry .java

package common.tapestry;

public final  class Tapestry {
  public static final String LOGOUT_SERVICE = "logout";
}

LogoutService.java
package common.tapestry.engine;

import java.io.IOException;

import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.engine.RestartService;

import common.tapestry.Tapestry;

public class LogoutService extends RestartService {
 private LoginCookiesManager loginCookiesManager;


 public void setLoginCookiesManager(
   LoginCookiesManager loginCookiesManager) {
  this.loginCookiesManager = loginCookiesManager;
 }

 public void service(IRequestCycle cycle) throws IOException {
  loginCookiesManager.removeCookies();
  super.service(cycle);
 }

 public String getName() {
  return Tapestry.LOGOUT_SERVICE;
 }
}

hivemodule.xml
<?xml version="1.0"?>
<module id="common.tapestry" version="1.0.0">

 <!-- extends tapestry RestartService and clear the login cookies info-->
    <service-point id="LogoutService" interface="org.apache.tapestry.engine.IEngineService">
        <invoke-factory>
            <construct class="common.tapestry.engine.LogoutService">
             <set-service property="request" service-id="tapestry.globals.HttpServletRequest" />
                <set-service property="response" service-id="tapestry.globals.HttpServletResponse" />
                <set-object property="servletPath" value="app-property:org.apache.tapestry.servlet-path" />
                <set-object property="linkFactory" value="infrastructure:linkFactory" />
                <set-object property="loginCookiesManager" value="service:common.tapestry.LoginCookiesManager"/>
             </construct>
        </invoke-factory>
    </service-point>

    <contribution configuration-id="tapestry.services.ApplicationServices">
        <service name="logout" object="service:common.tapestry.LogoutService" />
    </contribution>

</module>

in your Pages
<a jwcid="@ServiceLink" href="#" service="ognl:@common.tapestry.Tapestry@LOGOUT_SERVICE" target="_top">退出</a>

How to use cookies in tapestry4? my Tapestry4.1.5`LoginCookiesManagerImpl

How to use cookies in tapestry4? my Tapestry4.1.5`LoginCookiesManagerImpl

思路
首先BasePage是需要登陆的 protected ,
BasePage实现org.apache.tapestry.event.PageValidateListener方法,判断asm对象Visit是否已经登陆
如没visit==null,去cookies找回用户名和密码从cycle中获得Login页面
Login页面实现common.tapestry.IConstructVisit接口。LoginPage登陆时保存用户名密码到cookies中,并对cookies的值加密,
cookies的key是baseUrl+key,取回时对cookies值解密,加密解密的password放到Application的meta信息中

实现代码如下
抽象接口LoginCookiesManager

package common.tapestry.engine;

public interface LoginCookiesManager {
 
 String APPLICATION_META_KEY_DEFAULT_COOKIES_IS_ENCRYPTION = "common.tapestry.default-cookies-encrypt";//是否需要加密,默认加密
 String APPLICATION_META_KEY_DEFAULT_COOKIES_ENCRYPTION_KEY = "common.tapestry.default-cookies-encryption-key";//加密的password

 public static final String COOKIES_KEY_LOGIN_USERNAME = "USERNAME";
 public static final String COOKIES_KEY_LOGIN_PASSWORD = "PASSWORD";
 
 /**
  * 将用户名和密码写入cookies
  * @param username
  * @param password
  * @param maxAge
  */
 void writeCookies(String username,String password,int maxAge);
 /**
  * 清除用户名和密码cookies
  */
 void removeCookies();
 /**
  * 从cookies中获得用户名
  * @return
  */
 String getUsername();
 /**
  * 从cookies中获得密码
  * @return
  */
 String getPassword();
}

LoginCookiesManagerImpl 实现

package common.tapestry.engine;

import org.apache.hivemind.ApplicationRuntimeException;
import org.apache.tapestry.engine.IPropertySource;
import org.apache.tapestry.services.AbsoluteURLBuilder;
import org.apache.tapestry.services.CookieSource;
import org.apache.tapestry.web.WebRequest;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.exceptions.EncryptionOperationNotPossibleException;

public class LoginCookiesManagerImpl implements LoginCookiesManager {
 private static StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
 private IPropertySource applicationPropertySource;
 private CookieSource cookieSource;
 private WebRequest request;
 private AbsoluteURLBuilder absoluteURLBuilder;

 public void setApplicationPropertySource(
   IPropertySource applicationPropertySource) {
  this.applicationPropertySource = applicationPropertySource;
  String encrypKey = getCookiesEncryptionKey();
  standardPBEStringEncryptor.setPassword(encrypKey);
 }

 private String decrypt(String value) {
  String tmp = value;
  try {
   tmp = standardPBEStringEncryptor.decrypt(value);
  } catch (EncryptionOperationNotPossibleException e) {
   throw new ApplicationRuntimeException("please clear your cookies");
  }
  return tmp;
 }

 private String encrypt(String value) {
  return standardPBEStringEncryptor.encrypt(value);
 }

 private String getCookiesEncryptionKey() {
  String temp = applicationPropertySource
    .getPropertyValue(APPLICATION_META_KEY_DEFAULT_COOKIES_ENCRYPTION_KEY);
  return (temp != null) ? temp : "crypassword";
 }

 private boolean isCookiesEncryption() {
  String temp = applicationPropertySource
    .getPropertyValue(APPLICATION_META_KEY_DEFAULT_COOKIES_IS_ENCRYPTION);
  return (temp != null) ? Boolean.valueOf(temp).booleanValue() : true;
 }

 public void removeCookies() {
  String cookiesKeyLogin_username = generateApplicationCookiesKey_Login__Username();
  String cookiesKeyLogin_password = generateApplicationCookiesKey_Login__Password();
  cookieSource.removeCookieValue(cookiesKeyLogin_username);
  cookieSource.removeCookieValue(cookiesKeyLogin_password);
 }

 public void writeCookies(String username, String password, int maxAge) {
  writeCookiesValue_Login__Username(username, maxAge);
  writeCookiesValue_Login__Password(password, maxAge);
 }

 public String getUsername() {
  String value = cookieSource
    .readCookieValue(generateApplicationCookiesKey_Login__Username());
  if (isCookiesEncryption()) {
   value = decrypt(value);
  }
  return value;
 }

 public String getPassword() {
  String value = cookieSource
    .readCookieValue(generateApplicationCookiesKey_Login__Password());
  if (isCookiesEncryption()) {
   value = decrypt(value);
  }
  return value;
 }

 private void writeCookiesValue_Login__Username(String username, int maxAge) {
  String key = generateApplicationCookiesKey_Login__Username();
  String value = username;
  if (isCookiesEncryption()) {
   value = encrypt(username);
  }
  cookieSource.writeCookieValue(key, value, maxAge);
 }

 private void writeCookiesValue_Login__Password(String password, int maxAge) {
  String key = generateApplicationCookiesKey_Login__Password();
  String value = password;
  if (isCookiesEncryption()) {
   value = encrypt(password);
  }
  cookieSource.writeCookieValue(key, value, maxAge);
 }

 private String generateApplicationCookiesKey_Login__Username() {
  return generateApplicationCookiesKey(COOKIES_KEY_LOGIN_USERNAME);
 }

 private String generateApplicationCookiesKey_Login__Password() {
  return generateApplicationCookiesKey(COOKIES_KEY_LOGIN_PASSWORD);
 }

 private String generateApplicationCookiesKey(String key) {
  String contextPath = request.getContextPath();
  return absoluteURLBuilder.constructURL(contextPath + "/") + key;
 }

 public void setCookieSource(CookieSource cookieSource) {
  this.cookieSource = cookieSource;
 }

 public void setRequest(WebRequest request) {
  this.request = request;
 }

 public void setAbsoluteURLBuilder(AbsoluteURLBuilder absoluteURLBuilder) {
  this.absoluteURLBuilder = absoluteURLBuilder;
 }

}

hivemodule.xml配置

<?xml version="1.0"?>
<module id="common.tapestry" version="1.0.0">
<service-point id="LoginCookiesManager" interface="common.tapestry.engine.LoginCookiesManager">
<invoke-factory>
   <construct class="common.tapestry.engine.LoginCookiesManagerImpl" >
     <set-object property="cookieSource" value="infrastructure:cookieSource"/>
     <set-service property="absoluteURLBuilder" service-id="tapestry.request.AbsoluteURLBuilder"/>
              <set-service property="request" service-id="tapestry.globals.WebRequest"/>  
              <set-object property="applicationPropertySource" value="service:tapestry.props.ApplicationPropertySource"/>             
      </construct>
  </invoke-factory> 
</service-point>

<contribution configuration-id="tapestry.Infrastructure">
    <property name="loginCookiesManager" object="service:common.tapestry.LoginCookiesManager"/>
</contribution>
</module>

使用

在BasePage中获得该service

public LoginCookiesManager getLoginCookiesManager() {
  LoginCookiesManager svc = (LoginCookiesManager) getRequestCycle().getInfrastructure().getProperty("loginCookiesManager");
  return svc;
 }
 
/**
  * 判断用户是否已经登陆
  *
  * @return
  */
 private boolean isUserLoggedIn() {
  Object asmVisit = this.getRequestCycle().getInfrastructure().getApplicationStateManager().get(ASM_VISIT);

  if (!(asmVisit instanceof IVisit)) {
   throw new ApplicationRuntimeException(
     "The visit class must implements " + IVisit.class);
  }
  IVisit visit = (IVisit) asmVisit;
  if (visit == null || (visit != null && !visit.isLoggedIn())) {
   IPage loginPage = getRequestCycle().getPage(PAGE_LOGIN);
   if (loginPage instanceof IConstructVisit) {
    //从cookies中找回用户名和密码
    String cookiesLoginUsername = getLoginCookiesManager().getUsername();
    String cookiesLoginPassword = getLoginCookiesManager().getPassword();
    IConstructVisit constructVisit = (IConstructVisit) loginPage;
    visit = constructVisit.doConstructVisit(this.getRequestCycle(),
      cookiesLoginUsername, cookiesLoginPassword);
   } else {
    throw new ApplicationRuntimeException("The " + PAGE_LOGIN
      + " class must implements " + IConstructVisit.class);
   }
  }
  if (visit == null)
   return Boolean.FALSE.booleanValue();
  return visit.isLoggedIn();
 } 


Login类必须实现如下接口
package common.tapestry;

import org.apache.tapestry.IRequestCycle;

public interface IConstructVisit {
 public IVisit doConstructVisit(IRequestCycle cycle, String username,String password);
}

 

Tapestry4.1.5`s common Base Border Component

Tapestry4.1.5`s common Base Border Component

考虑到每个项目都必须具有Border组件,所以把这个组件提到Base项目的ext组件库
但是每个项目的基本css又各不相同,这个css可以使用Tapestry的meta提供给Border
我在{yourTapestyServlet}.application中增加
<meta key="common.tapestry.components.border.stylesheets" value="css/POJO*.css,css/sys*.css"/>
其value是一个通配符表达式,灵感来源于spring的加载*.xml的写法,","号分割多个匹配

来看我们的Border.jwc规范

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE component-specification PUBLIC
  "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
  "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">

<component-specification allow-body="yes" allow-informal-parameters="no" class="common.tapestry.components.Border">                        
<parameter name="title"/>
<parameter name="ajaxDelegate"/>

<component id="shell" type="Shell">
    <binding name="title" value="ognl:title+' - '+messages.getMessage('appname')"/>
    <binding name="doctype" value="literal:html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;" />
 <binding name="delegate" value="new org.apache.tapestry.components.BlockRenderer(components.remainingHead)"/>
    <binding name="renderBaseTag" value="ognl:false" />
    <binding name="disableTapestryMeta" value="ognl:true" />
    <inherited-binding name="ajaxDelegate" parameter-name="ajaxDelegate" />
    <binding name="stylesheets" value="ognl:stylesheets"/>   
</component>

<inject property="httpServletRequest" object="service:tapestry.globals.HttpServletRequest"/>
<inject property="webContext" object="service:tapestry.globals.WebContext"/>

<!--
<inject property="stylesheetResource" type="meta" object="common.tapestry.components.border.stylesheets"/>
-->
</component-specification>

html模板

<html jwcid="shell">
<head jwcid="remainingHead@Block">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body jwcid="@Body">
<span jwcid="@RenderBody"/>
</body>
</html>


Border.java

package common.tapestry.components;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.tapestry.BaseComponent;
import org.apache.tapestry.IAsset;
import org.apache.tapestry.asset.ContextAsset;
import org.apache.tapestry.web.WebContext;
import org.apache.tapestry.web.WebContextResource;
import org.springframework.core.io.Resource;
import org.springframework.web.context.support.ServletContextResource;
import org.springframework.web.context.support.ServletContextResourcePatternResolver;

public abstract class Border extends BaseComponent {
 // public abstract String getStylesheetResource(); //inject meta can`not
 // use?

 public abstract HttpServletRequest getHttpServletRequest();

 public abstract WebContext getWebContext();

 public static final String APPLICATION_META_KEY_DEFAULT_BORDER_STYLE = "common.tapestry.components.border.stylesheets";
 public static final String DEFAULT_STYLESHEET_RESOURCE = "css/system_*.css";

 public String getStylesheetResource() {
  String tmp = getPage().getRequestCycle().getInfrastructure()
    .getApplicationPropertySource().getPropertyValue(
      APPLICATION_META_KEY_DEFAULT_BORDER_STYLE);
  return (tmp != null) ? tmp : DEFAULT_STYLESHEET_RESOURCE;
 }

 public abstract IAsset[] getCssAsset();

 public abstract void setCssAsset(IAsset[] oo);

 public IAsset[] getStylesheets() {

  if (getCssAsset() == null) {

   String _stylesheetResource = (getStylesheetResource() != null) ? getStylesheetResource()
     : DEFAULT_STYLESHEET_RESOURCE;
   List list = new ArrayList();
   ServletContext _servletContext = getHttpServletRequest()
     .getSession().getServletContext();
   ServletContextResourcePatternResolver servletContextResourcePatternResolver = new ServletContextResourcePatternResolver(
     _servletContext);

   String[] _stylesheetResources = _stylesheetResource.split(",");

   for (int i = 0; i < _stylesheetResources.length; i++) {

    try {
     Resource[] resources = servletContextResourcePatternResolver
       .getResources(_stylesheetResources[i]);

     for (int j = 0; j < resources.length; j++) {
      ServletContextResource resource = (ServletContextResource) resources[j];

      WebContextResource _resourceLocation = new WebContextResource(
        getWebContext(), resource.getPath());
      IAsset asset = new ContextAsset(
        common.tapestry.TapestryUtils
          .getContextPath(getPage()
            .getRequestCycle()),
        _resourceLocation, getLocation(), getPage()
          .getRequestCycle());
      list.add(asset);
     }

    } catch (IOException e) {
     e.printStackTrace();
    }
   }

IAsset[] tmp = (IAsset[])list.toArray(new IAsset[list.size()]);
   setCssAsset(tmp);
  }
  return getCssAsset();
 }
}

March 21

Tapestry4.1.5 how to inject spring`s bean to pages

Tapestry4.1.5 how to inject spring`s bean to pages

1、in web.xml config spring

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>

2、put the tapestry-spring-1.0.0.jar to your classpath
you can download here
http://howardlewisship.com/tapestry-javaforge/tapestry-spring/


ok you can use  <inject property="userInfoService" object="spring:userInfoService"/> in your .page file
or use Annotations inject the service

but how to get the spring`s beans in the java code ?
--------------------------------------------------------------

3、config your ${yourApp}/WEB-INF/hivemodule.xml

<contribution configuration-id="tapestry.Infrastructure">
    <property name="springObjectProvider" object="service:hivemind.lib.SpringObjectProvider"/>
</contribution>

put the springObjectProvider to the tapestry.Infrastructure

ok in your code you can

org.apache.hivemind.service.ObjectProvider springprovider springprovider = (ObjectProvider) infrastructure.getProperty("springprovider");

YourSpringBean yourSpringBean = (YourSpringBean)springprovider.provideObject(null, null, yourSpringBeanId, null);

 

 

皮鞋又坏了

皮鞋又坏了,该买新的了
May 14

Tapestry5的无侵入式框架实现use Annotations?

Tapestry5称使用JDK5的Annotations实现无侵入式的框架,我看起来Annotations依然是侵入到了类,:(
敏捷的思维正在一步步渗透到Java Framework中,现在不仅要求类与类之间要解藕,类和Framework之间也要解耦,
 
途径:1)硬编码,extends/implements
      2)xml
      3)Framework的实践约定,比如说 public void **doActionListener(),方法名称的匹配说明了这是个Action监听器,够敏捷吧
 
我期待的Tapestry Control BackingBean是更纯的Java类,看来这个实现除了xml + implments,只剩下Framework的约定才能实现了,毕竟不用xml,不用Annotations,不用extends/implements 你得告诉Framework container 这个BackingBean 是怎么跟template粘起来的!
 
May 06

革命

“在我们力图改善文明这个整体的种种努力中,我们还必须始终在这个给定的整体中进行工作,旨在点滴建设,而不是全盘的建构,并在发展的每一个阶段中都运用既有的历史材料,一步一步地改进细节,而不是力图重新建设这个整体。”

——著名政治思想家弗里德里希·冯·哈耶克

April 28

DAO exception/business exception 粒度

Interface UserInfo{
public void login(String userName,String password) throw Exception/RuntimeException/or CustomException/or CustomRuntimeException
}
 
UserNotFonundException extends Exception ?
 
PassWordWorngException ?
 
Whe in Action/listener
use try{
 
}catch(){
          throw new ApplicationRuntimeException(e.getMessage());
}
 
困惑中~
Exception handling in DAOs
 

DAO / Service层的划分

由于Hibernate等ORM映射tools的出现,DAO并不在直接跟数据库RDB打交道,而是多了 应用服务器持久层,从广义上讲RDB也算是持久,
应用服务器对象持久层 是为了能管理ORM映射的对象的状态和周期而存在的
 
DAO ---> Persisent  ---->RDB
 
April 23

When customEditorConfigurer depend on propertyConfigurer

 <bean id="propertyConfigurer"
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
   <list>
    <value>classpath*:jdbc-dev.properties</value>
   </list>
  </property>
 </bean>
 
在BeanFactory载入所有Bean后,实例化Bean前,对BeanFactor做一些后处理工作,PropertyPlaceholderConfiger和CustomEditorConfigurer是SpringFrameWork自定义的BeanFactoryPostProcessor.
某一个CustomEditorConfigurer依赖Datasource,Datasource依赖propertyConfigurer
这时候propertyConfigurer没有生效
 
抛出错误
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customEditorConfigurer' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot create inner bean 'acegi.security.service.impl.DataSourceMethodDefinitionSourceEditor#f38b42' of type [acegi.security.service.impl.DataSourceMethodDefinitionSourceEditor] while setting bean property 'customEditors' with key [TypedStringValue: value [org.acegisecurity.intercept.method.MethodDefinitionSource], target type [null]]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'acegi.security.service.impl.DataSourceMethodDefinitionSourceEditor#f38b42' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot resolve reference to bean 'jdbcTemplate' while setting bean property 'jdbcTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcTemplate' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-datasource.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClass' threw exception; nested exception is java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'.
Caused by:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'acegi.security.service.impl.DataSourceMethodDefinitionSourceEditor#f38b42' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot resolve reference to bean 'jdbcTemplate' while setting bean property 'jdbcTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcTemplate' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-datasource.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClass' threw exception; nested exception is java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'.
Caused by:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcTemplate' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-datasource.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClass' threw exception; nested exception is java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'.
Caused by:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-datasource.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClass' threw exception; nested exception is java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'.
Caused by:
org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessException details (1) are:
PropertyAccessException 1:
org.springframework.beans.MethodInvocationException: Property 'driverClass' threw exception; nested exception is java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'.
Caused by:
java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'.
 at com.mchange.v2.c3p0.DriverManagerDataSource$1.vetoableChange(DriverManagerDataSource.java:68)
 at java.beans.VetoableChangeSupport.fireVetoableChange(VetoableChangeSupport.java:300)
 at java.beans.VetoableChangeSupport.fireVetoableChange(VetoableChangeSupport.java:217)
 at com.mchange.v2.c3p0.impl.DriverManagerDataSourceBase.setDriverClass(DriverManagerDataSourceBase.java:65)
 at com.mchange.v2.c3p0.ComboPooledDataSource.setDriverClass(ComboPooledDataSource.java:119)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:324)
 at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:821)
 at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:645)
 at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:78)
 at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:59)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1100)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:835)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:423)
 at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:144)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:261)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:109)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1073)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:835)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:423)
 at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:144)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:261)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:109)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1073)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:835)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:423)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:215)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:122)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedMap(BeanDefinitionValueResolver.java:314)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:139)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1073)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:835)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:423)
 at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:144)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
 at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:426)
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:342)
 at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:241)
 at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:184)
 at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)
 at weblogic.servlet.internal.WebAppServletContext$FireContextListenerAction.run(WebAppServletContext.java:6515)
 at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
 at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
 at weblogic.servlet.internal.WebAppServletContext.notifyCreated(WebAppServletContext.java:1666)
 at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:3203)
 at weblogic.servlet.internal.HttpServer.preloadResources(HttpServer.java:694)
 at weblogic.servlet.internal.WebService.preloadResources(WebService.java:483)
 at weblogic.servlet.internal.ServletInitService.resume(ServletInitService.java:30)
 at weblogic.t3.srvr.SubsystemManager.resume(SubsystemManager.java:131)
 at weblogic.t3.srvr.T3Srvr.resume(T3Srvr.java:966)
 at weblogic.t3.srvr.T3Srvr.run(T3Srvr.java:361)
 at weblogic.Server.main(Server.java:32)
<2007-4-23 下午09时38分10秒 CST> <Warning> <HTTP> <BEA-101162> <User defined listener org.springframework.web.context.ContextLoaderListener failed: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customEditorConfigurer' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot create inner bean 'acegi.security.service.impl.DataSourceMethodDefinitionSourceEditor#f38b42' of type [acegi.security.service.impl.DataSourceMethodDefinitionSourceEditor] while setting bean property 'customEditors' with key [TypedStringValue: value [org.acegisecurity.intercept.method.MethodDefinitionSource], target type [null]]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'acegi.security.service.impl.DataSourceMethodDefinitionSourceEditor#f38b42' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot resolve reference to bean 'jdbcTemplate' while setting bean property 'jdbcTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcTemplate' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-datasource.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClass' threw exception; nested exception is java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'..>
2007-04-23 21:38:10,609 DEBUG -  - HttpSessionEventPublisher - Received ServletContextEvent: javax.servlet.ServletContextEvent[source=ServletContext(id=31277299,name=web,context-path=/study)]
<2007-4-23 下午09时38分10秒 CST> <Warning> <HTTP> <BEA-101162> <User defined listener org.acegisecurity.ui.session.HttpSessionEventPublisher failed: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customEditorConfigurer' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot create inner bean 'acegi.security.service.impl.DataSourceMethodDefinitionSourceEditor#f38b42' of type [acegi.security.service.impl.DataSourceMethodDefinitionSourceEditor] while setting bean property 'customEditors' with key [TypedStringValue: value [org.acegisecurity.intercept.method.MethodDefinitionSource], target type [null]]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'acegi.security.service.impl.DataSourceMethodDefinitionSourceEditor#f38b42' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot resolve reference to bean 'jdbcTemplate' while setting bean property 'jdbcTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcTemplate' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-datasource.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClass' threw exception; nested exception is java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'..>
<2007-4-23 下午09时38分10秒 CST> <Error> <HTTP> <BEA-101165> <Could not load user defined filter in web.xml: org.acegisecurity.util.FilterToBeanProxy.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customEditorConfigurer' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot create inner bean 'acegi.security.service.impl.DataSourceMethodDefinitionSourceEditor#f38b42' of type [acegi.security.service.impl.DataSourceMethodDefinitionSourceEditor] while setting bean property 'customEditors' with key [TypedStringValue: value [org.acegisecurity.intercept.method.MethodDefinitionSource], target type [null]]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'acegi.security.service.impl.DataSourceMethodDefinitionSourceEditor#f38b42' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot resolve reference to bean 'jdbcTemplate' while setting bean property 'jdbcTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcTemplate' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-datasource.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClass' threw exception; nested exception is java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'.
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'acegi.security.service.impl.DataSourceMethodDefinitionSourceEditor#f38b42' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot resolve reference to bean 'jdbcTemplate' while setting bean property 'jdbcTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcTemplate' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-datasource.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClass' threw exception; nested exception is java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'.
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcTemplate' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-acegi-security.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-datasource.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClass' threw exception; nested exception is java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'.
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in file [D:\eclipse-SDK-3.2.1-win32\workspace\study\web\WEB-INF\classes\applicationContext-datasource.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClass' threw exception; nested exception is java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'.
Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessException details (1) are:
PropertyAccessException 1:
org.springframework.beans.MethodInvocationException: Property 'driverClass' threw exception; nested exception is java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'.
Caused by: java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'.
 at com.mchange.v2.c3p0.DriverManagerDataSource$1.vetoableChange(DriverManagerDataSource.java:68)
 at java.beans.VetoableChangeSupport.fireVetoableChange(VetoableChangeSupport.java:300)
 at java.beans.VetoableChangeSupport.fireVetoableChange(VetoableChangeSupport.java:217)
 at com.mchange.v2.c3p0.impl.DriverManagerDataSourceBase.setDriverClass(DriverManagerDataSourceBase.java:65)
 at com.mchange.v2.c3p0.ComboPooledDataSource.setDriverClass(ComboPooledDataSource.java:119)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:324)
 at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:821)
 at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:645)
 at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:78)
 at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:59)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1100)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:835)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:423)
 at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:144)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:261)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:109)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1073)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:835)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:423)
 at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:144)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:261)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:109)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1073)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:835)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:423)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:215)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:122)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedMap(BeanDefinitionValueResolver.java:314)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:139)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1073)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:835)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:423)
 at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:144)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
 at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:426)
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:342)
 at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:241)
 at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:184)
 at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49)
 at weblogic.servlet.internal.WebAppServletContext$FireContextListenerAction.run(WebAppServletContext.java:6515)
 at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
 at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
 at weblogic.servlet.internal.WebAppServletContext.notifyCreated(WebAppServletContext.java:1666)
 at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:3203)
 at weblogic.servlet.internal.HttpServer.preloadResources(HttpServer.java:694)
 at weblogic.servlet.internal.WebService.preloadResources(WebService.java:483)
 at weblogic.servlet.internal.ServletInitService.resume(ServletInitService.java:30)
 at weblogic.t3.srvr.SubsystemManager.resume(SubsystemManager.java:131)
 at weblogic.t3.srvr.T3Srvr.resume(T3Srvr.java:966)
 at weblogic.t3.srvr.T3Srvr.run(T3Srvr.java:361)
 at weblogic.Server.main(Server.java:32)
 
March 27

利用org.apache.commons.io.FileUtils快速读写文件

String fileName = "C://11.txt";
  File file = new File(fileName);
  String fileContent = "";
  try {
   fileContent = org.apache.commons.io.FileUtils.readFileToString(file, "GBK");
  } catch (IOException e) {
   e.printStackTrace();
  }
  fileContent +="Helloworld";
  try {
   org.apache.commons.io.FileUtils.writeStringToFile(file, fileContent, "GBK");
  } catch (IOException e) {
   e.printStackTrace();
  }

Tapestry4Localization本地/国际化

1、方法1 -- 使用Tapestry内置message
1)Home.html
<span jwcid="@Insert" value="message:required"/> //使用message前缀
或者使用ognl:messages
<span jwcid="@Insert" value="ognl:messages.format('required', '第{0}个元素','第{1}个元素')"/>
不建议使用
<span jwcid="@Insert" value="ognl:getMessage('required')"/>
因为getMessage方法在T4中被@deprecated
-----the key 'title'---- will be first find in Home_zh.properties or Home.properties
if in Home.properties can not be founded
it will find WEB-INF/myapp.properties,
The specification may also have a message catalog; for instance,
for WEB-INF/myapp.application,
the files would be named WEB-INF/myapp.properties,
etc. Again, the name of the file is based on the servlet name ("myapp").
2)
myapp_zh.properties
required=\u8bf7\u8f93\u5165{0}\u7684\u503c{1}
3)
Home_zh.properties
required=\u8bf7\u8f93\u5165{0}\u7684\u503c{1}
 
2、方法2 --使用spring的MessageSource
1)利用spring加载messges_*local.properties
 <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
  <!--<property name="basename" value="classpath:messages"/>-->
   <property name="basenames">
      <list>
        <value>classpath:messages</value>
      </list>
    </property>  
 </bean>
把messageSource注入到Tapestry Components/Pages中
2)BasePage.java
import org.springframework.context.MessageSource;
public abstract BasePage extends org.apache.tapestry.html.BasePage{
 public abstract MessageSource getMessageSource();
  //need inject //or direct impl it;
 
 
}

3)HomePage.java extends BasePage.java
4)Home.page
  <inject property="messageSource" object="spring:messageSource" />
5)Home.html
<span jwcid="@Insert" value="ognl:messageSource.getMessage('required',new java.lang.Object [] {'Login','!'}, 'Default', null)"/>
6)messges_zh.properties
required=\u8bf7\u8f93\u5165{0}\u7684\u503c{1}
------------------------------------------------------------------
7)或者再封装以下
public abstract BasePage extends org.apache.tapestry.html.BasePage{
 public abstract MessageSource getMessageSource();
 public String getCustomMessage(java.lang.String arg0,java.lang.Object[] arg1,java.lang.String arg2,java.util.Locale arg3){
  return this.getMessageSource().getMessage(arg0,arg1,arg2,arg3);
 }
}
then in the Home.html
<span jwcid="@Insert" value="ognl:getCustomMessage('required',new java.lang.Object [] {'Login','!'}, 'Default', null)"/>
 
 

在web application 调用Spring的Beanfactory

1)配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
 <context-param>
  <param-name>contextConfigLocation</param-name>
     <!-- 配置加载的bean factory xml -->
  <param-value>
   WEB-INF/applicationContext*.xml
   classpath:applicationContext-datasource.xml
   classpath:applicationContext-hibernate.xml
   classpath:applicationContext-dao.xml
   classpath:applicationContext-service.xml
  </param-value>
 </context-param>
 <listener>
  <listener-class>
   org.springframework.web.context.ContextLoaderListener
  </listener-class>
 </listener>
</web-app>
2)Jsp页面中调用spring
<%
org.springframework.beans.factory.BeanFactory beanFactory = (org.springframework.beans.factory.BeanFactory)
pageContext.getServletContext().getAttribute(org.springframework.web.context.WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
%>
3)Servlet中调用spring
ServletContext context = this.getServletContext();
org.springframework.beans.factory.BeanFactory beanFactory = (org.springframework.beans.factory.BeanFactory)
context.getAttribute(org.springframework.web.context.WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
4)ClassPath加载
ApplicationContext beanFactory = new ClassPathXmlApplicationContext(
    new String[] { "applicationContext-datasource.xml",
      "applicationContext-hibernate.xml",
      "applicationContext-service-freemarker.xml",
      "applicationContext-service.xml"
    });
March 26

ActiveRecord or 贫血的POJO

ActiveRecord实现Dao 和business validation 的功能似乎更能快速的开发整个项目,但他的Dao实现必须继承,导致 code 不pure
 
我们可以把外部的Crud操作集中到一个Container or Tier中实现,这个Container或者Tier (Persist Logic)中操作的可能不是pure 的POJO 而是Container Wapper后的ActiveRecord,我们不用去关心,交给EntityManager来管理好了
 
这样我们不用继承ActiveRecord Base!!

Run Jboss seam

Run Jboss seam On my computer
1、download Java SDK5 (jdk-1_5_0_11-windows-i586-p.exe), intall it and config the JAVA_HOME env
2、download JEMS installer 1.2.0.BETA3 and install JBoss AS 4.0.5 with the ejb3 profile selected
3、Download Seam and unpack it.
Edit build.properties in your Seam directory and configure the path to your JBoss AS installation directory.

4、Run Jboss AS
5、In the jboss-seam/examples/booking directory, type ant deploy and check for any error messages.
6、Point your browser to http://localhost:8080/seam-booking/ and register an account.


http://labs.jboss.com/portal/jbossseam/gettingstarted/index.html

就seam的booking demo而言
主要分了3部分

---------------------------------------------------------------------------------
view/webui  -- jsp+jsf helper/taglib/components 负责收集表单信息(element language自动get set对象) 构造dto对象(就是ejb3实体对象)
Controller  -- face filter and face-config.xml 请求分发
Action use jobss ejb3 Session Bean      -- face-config and annotation调用business service impl
---------------------------------------------------------------------------------
Model   use jobss ejb3 Entity Bean (ORM映射,DTO,Business Object Validation)
---------------------------------------------------------------------------------
Service/Dao - javax.persistence.EntityManager (数据库持久化)
---------------------------------------------------------------------------------

ORM pojo (数据库映射对象) ---  business domain class领域模型(业务对象)
---Data Transfer Object(数据传输对象) -- Presentation Value Object(值对象)


"简单就是美","约定胜于配置"敏捷思想

Active Record
An object that wraps a row in a database table or view, encapsulates the database access, and adds domain logic on that data

ActiveRecord - 活动记录 :一个对象,它包装数据库表或视图中的某一行,封装数据库访问,并在这些数据上增加了领域逻辑。


ActiveRecord可以实现真正的Domain-Driven Design,或者叫Rich Domain Model

拆分
Java --- POJO(贫血的JavaBean)  ---   Dao        ---Business Domain Logic Validation

POJO or ActiveRecord?