??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产日韩在线人成下载,亚洲av日韩av激情亚洲,国产亚洲美女精品久久久http://m.tkk7.com/lifenote/category/27921.html&nbsp; Try to find something different in your life and then write it down&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>Java乐园Q?lt;a target='_blank'><font color='red' size="+1">www.java-bj.cn</font></a> 资料下蝲</strong> <div style="float:left"> <script type="text/javascript"><!-- google_ad_client = "pub-4636496036365579"; /* 468x60, 创徏?08-4-23 */ google_ad_slot = "3356926921"; google_ad_width = 468; google_ad_height = 60; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> </div> <div style="float:left"> <script type="text/javascript"><!-- google_ad_client = "pub-4636496036365579"; /* 468x60, 创徏?08-4-23 */ google_ad_slot = "5017273295"; google_ad_width = 468; google_ad_height = 60; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> </div> <div style="clear:both;"></div>zh-cnThu, 24 Apr 2008 07:47:09 GMTThu, 24 Apr 2008 07:47:09 GMT60Eclipse下的Java反编译插ӞJode Decompilerhttp://m.tkk7.com/lifenote/archive/2008/04/24/195588.htmlLifeNoteLifeNoteThu, 24 Apr 2008 07:05:00 GMThttp://m.tkk7.com/lifenote/archive/2008/04/24/195588.htmlhttp://m.tkk7.com/lifenote/comments/195588.htmlhttp://m.tkk7.com/lifenote/archive/2008/04/24/195588.html#Feedback2http://m.tkk7.com/lifenote/comments/commentRss/195588.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/195588.html 安装ҎQ?
    help => Software Updates => Find and Install... => Search for new features to install,单击"New Remote Site..." 在URL栏输?http://www.technoetic.com/eclipse/update.然后下一步,可以看?#8220;jode decompiler plugin *.*”Q选上安装可以了?

安装好后可以看到Window => Preferences... => Java => Jode Decompiler选项卡?

配置QWindow => Preferences... => General => Editors => File Associations扑ֈ"*.class"?Associated editors"里面可以看到"Jode class file viewer"选中它再单击Default按钮.

在Eclipse中展开jar文g,双击class文g卛_看到反编译之后的源代?


LifeNote 2008-04-24 15:05 发表评论
]]>
使用动态代理实现用AOPҎ据库q行操作http://m.tkk7.com/lifenote/archive/2008/04/22/194687.htmlLifeNoteLifeNoteTue, 22 Apr 2008 01:54:00 GMThttp://m.tkk7.com/lifenote/archive/2008/04/22/194687.htmlhttp://m.tkk7.com/lifenote/comments/194687.htmlhttp://m.tkk7.com/lifenote/archive/2008/04/22/194687.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/194687.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/194687.html要实现对数据库的操作Q离不开数据源(DataSourceQ或者连接(ConnectionQ?但是通常来说Ҏ据库的操作都应该攑֜DAO中,而DAO又不应该与应用服务器相关联,所以一般都使用q接QConnectionQ。现在我们这里就有一个问题了Q怎么在拦截器中获得连接。我惛_以通过两种方式获得Q?br /> 在分别讨两种Ҏ之前Q我们需要先讨论一下在处理数据库的时候的异常的处理。我q里做了一个TransactionExceptionl承至RuntimeException然后在拦截器里面抛出Q再又应用框架处理这个异常。下面试q个cȝ代码Q?br /> public class TransactionException extends RuntimeException {
    private Throwable superException;
    private String myMessage;
    
    public TransactionException(Throwable throwable){
        super(throwable);
        this.superException = throwable;
    }
    
    public TransactionException(Throwable throwable,String message){
        super(message,throwable);
        this.superException = throwable;
        this.myMessage = message;
    }

    /**
     * @return Returns the myMessage.
     */
    public String getMessage() {
        return myMessage;
    }

    /**
     * @return Returns the superException.
     */
    public Throwable getSuperException() {
        return superException;
    }

    /**
     * @param myMessage The myMessage to set.
     */
    public void setMyMessage(String message) {
        this.myMessage = message;
    }

    /**
     * @param superException The superException to set.
     */
    public void setSuperException(Throwable superException) {
        this.superException = superException;
    }
    
    
}
1Q?nbsp;   通过Ҏ的第一个参Cq去
l    DAO
import java.sql.Connection;

public class TestDao {
    public void insertA(Connection con,String a,String b,……){
        …………………………………………
一pd操作
…………………………………………
    }
    
    public String queryA(Connection con,…….){
    …………………………………………
一pd操作
…………………………………………
}

    public void updateA(Connection con,…….){
        …………………………………………
一pd操作
…………………………………………
}
}

l    拦截?br /> import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class TransactionInterceptor implements Interceptor {

    public void before(InvokeJniInfo invInfo) {
        if(isNeedTransactions(invInfo)){
            Connection conn = (Connection) invInfo.getArgs()[0];
            try {
                conn.setAutoCommit(false);
            } catch (SQLException e) {
                throw new TransactionException(e);
            }
        }
    }

    public void after(InvokeJniInfo invInfo) {
        if(isNeedTransactions(invInfo)){
            Connection conn = (Connection) invInfo.getArgs()[0];
            try {
                conn.commit();
            } catch (SQLException e) {
                throw new TransactionException(e);
            }finally{
                if(conn != null){
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        throw new TransactionException(e,"Close Connection is failure!");
                    }
                }
            }
        }
    }

    public void exceptionThrow(InvokeJniInfo invInfo) {
        if(isNeedTransactions(invInfo)){
            Connection conn = (Connection) invInfo.getArgs()[0];
            try {
                conn.rollback();
            } catch (SQLException e) {
                throw new TransactionException(e);
            }finally{
                if(conn != null){
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        throw new TransactionException(e,"Close Connection is failure!");
                    }
                }
            }
        }
    }
    
    private List getNeedTransaction(){
        List needTransactions = new ArrayList();
        needTransactions.add("insert");
        needTransactions.add("update");
        return needTransactions;
    }
    
    private boolean isNeedTransactions(InvokeJniInfo invInfo){
        String needTransaction = "";
        List needTransactions = getNeedTransaction();
        for(int i = 0;i             needTransaction = (String)needTransactions.get(i);
            if(invInfo.getMethod().getName().startsWith(needTransaction)){
                return true;
            }
        }
        return false;
    }
}

需要注意的是:getNeedTransaction是需要进行事务处理的Ҏ的开_q个Ҏ可以写成一个从配置文g里面去读Q这里我写d里面了。只是对insert和update开头的Ҏq行事务控制?br /> 2Q?nbsp;   Connection对象攑֜ThreadLocal?br /> l    ConnectionUtilc:
import java.sql.Connection;

public final class ConnectionUtil {
    private static ThreadLocal connections = new ThreadLocal();
    public static Connection getConnection(){
        Connection conn = null;
        conn = (Connection) connections.get();
        if(conn == null){
            conn = getRealConnection();
            connections.set(conn);
        }
        return conn;
    }
    public static void realseConnection(Connection conn){
        connections.set(null);
    }
    private static Connection getRealConnection() {
        实现自己获取q接的代?br />         return null;
    }
}
l    DAOc?br /> public class TestDao {
    public void insertA(String a,String b){
        Connection conn = getConnection();
        …………………………………………
一pd操作
…………………………………………
    }
        public String queryA(Connection con,…….){
        Connection conn = getConnection();
    …………………………………………
一pd操作
…………………………………………
}

    public void updateA(Connection con,…….){
Connection conn = getConnection();
        …………………………………………
一pd操作
…………………………………………
}

    private Connection getConnection(){
        return ConnectionUtil.getConnection();
    }
    
}
l    拦截?br /> import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class TransactionInterceptor implements Interceptor {

    public void before(InvokeJniInfo invInfo) {
        if(isNeedTransactions(invInfo)){
            Connection conn = getConnection();
            try {
                conn.setAutoCommit(false);
            } catch (SQLException e) {
                throw new TransactionException(e);
            }
        }
    }

    public void after(InvokeJniInfo invInfo) {
        if(isNeedTransactions(invInfo)){
            Connection conn = getConnection();
            try {
                conn.commit();
            } catch (SQLException e) {
                throw new TransactionException(e);
            }finally{
                if(conn != null){
                    try {
                        conn.close();
                        releaseConnection(conn);
                    } catch (SQLException e) {
                        throw new TransactionException(e,"Close Connection is failure!");
                    }
                }
            }
        }
    }

    public void exceptionThrow(InvokeJniInfo invInfo) {
        if(isNeedTransactions(invInfo)){
            Connection conn = getConnection();
            try {
                conn.rollback();
            } catch (SQLException e) {
                throw new TransactionException(e);
            }finally{
                if(conn != null){
                    try {
                        conn.close();
                        releaseConnection(conn);
                    } catch (SQLException e) {
                        throw new TransactionException(e,"Close Connection is failure!");
                    }
                }
            }
        }
    }
    
    private Connection getConnection(){
        return ConnectionUtil.getConnection();
    }
    
    private void releaseConnection(Connection conn){
        ConnectionUtil.releaseConnection(conn);
    }
    private List getNeedTransaction(){
        List needTransactions = new ArrayList();
        needTransactions.add("insert");
        needTransactions.add("update");
        return needTransactions;
    }
    
    private boolean isNeedTransactions(InvokeJniInfo invInfo){
        String needTransaction = "";
        List needTransactions = getNeedTransaction();
        for(int i = 0;i             needTransaction = (String)needTransactions.get(i);
            if(invInfo.getMethod().getName().startsWith(needTransaction)){
                return true;
            }
        }
        return false;
    }
}
    最后将q个拦截器添加到AOP拦截框架中去QInterceptorHandlercM的getIntercetorsҎ中添加一个:

    private synchronized List getIntercetors(){
        if(null == interceptors){
            interceptors = new ArrayList();
            ……………………………………
interceptors.add(new TransactionInterceptor ());
            ……………………………………
        }
        return interceptors;
}


LifeNote 2008-04-22 09:54 发表评论
]]>
Hibernate中Criteria的完整用?http://m.tkk7.com/lifenote/archive/2008/03/12/185708.htmlLifeNoteLifeNoteWed, 12 Mar 2008 07:24:00 GMThttp://m.tkk7.com/lifenote/archive/2008/03/12/185708.htmlhttp://m.tkk7.com/lifenote/comments/185708.htmlhttp://m.tkk7.com/lifenote/archive/2008/03/12/185708.html#Feedback2http://m.tkk7.com/lifenote/comments/commentRss/185708.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/185708.html 
设计上可以灵zȝҎ Criteria 的特Ҏ方便地进行查询条件的l装。现在对 Hibernate的Criteria 的用法进行ȝQ?/font>
   Hibernate 设计?CriteriaSpecification 作ؓ Criteria 的父接口Q下面提供了 Criteria和DetachedCriteria ?
   Criteria ?DetachedCriteria 的主要区别在于创建的形式不一P Criteria 是在U的Q所

以它是由 Hibernate Session q行创徏的;?DetachedCriteria 是离U的Q创建时无需
SessionQDetachedCriteria 提供?2 个静态方?forClass(Class) ?forEntityName(Name)
q行DetachedCriteria 实例的创建?Spring 的框架提供了getHibernateTemplate
().findByCriteria(detachedCriteria) Ҏ可以很方便地ҎDetachedCriteria 来返回查询结
果?
   Criteria ?DetachedCriteria 均可使用 Criterion ?Projection 讄查询条g。可以设

|?FetchMode( 联合查询抓取的模?) Q设|排序方式。对?Criteria q可以设|?FlushModel
Q冲?Session 的方式)?LockMode Q数据库锁模式)?
下面?Criterion ?Projection q行详细说明?/font>
     Criterion ?Criteria 的查询条件。Criteria 提供?add(Criterion criterion) Ҏ?/font>
d查询条g?br />      Criterion 接口的主要实现包括: Example ?Junction ?SimpleExpression 。?
Junction 的实际用是它的两个子类 conjunction ?disjunction Q分别是使用 AND ?OR ?/font>
作符q行来联l查询条仉合?br />      Criterion 的实例可以通过 Restrictions 工具cL创徏QRestrictions 提供了大量的静?/font>
ҎQ如 eq Q等于)?ge Q大于等于)?between {来Ҏ的创?Criterion 查询条g
QSimpleExpression 实例Q。除此之外, Restrictions q提供了Ҏ来创?conjunction ?
disjunction 实例Q通过往该实例的 add(Criteria) Ҏ来增加查询条件Ş成一个查询条仉?/font>
?br />      至于 Example 的创建有所不同Q?Example 本n提供了一个静态方?create(Object
entity) Q即Ҏ一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设|一?/font>
qo条gQ?
Example exampleUser =Example.create(u)
.ignoreCase() // 忽略大小?
.enableLike(MatchMode.ANYWHERE);
// ?String cd的属性,无论在那里值在那里都匹配。相当于 %value%

  Project 主要是让 Criteria 能够q行报表查询Qƈ可以实现分组?Project 主要?
SimpleProjection ?ProjectionList ?Property 三个实现。其?SimpleProjection ?
ProjectionList 的实例化是由内徏?Projections 来完成,如提供的 avg ?count ?max ?
min ?sum 可以让开发者很ҎҎ个字D进行统计查询?
       Property 是对某个字段q行查询条g的设|,如通过Porperty.forName(“color”).in

(new String[]{“black”,”red”,”write”}); 则可以创Z?Project 实例。通过
criteria ?add(Project) Ҏ加入到查询条件中厅R?
    使用 Criteria q行查询Q主要要清晰的是 Hibernate 提供了那些类和方法来满开发中?/font>
询条件的创徏和组装,下面介绍几种用法Q?/font>
1. 创徏一个Criteria 实例
org.hibernate.Criteria接口表示特定持久cȝ一个查询。Session?Criteria实例的工厂?br /> Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
 
2. 限制l果集内?br /> 一个单独的查询条g是org.hibernate.criterion.Criterion 接口的一个实例?/font>

org.hibernate.criterion.Restrictionsc?定义了获得某些内|Criterioncd的工厂方法?br /> List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .add( Restrictions.between("weight", minWeight, maxWeight) )
    .list();


U束可以按逻辑分组?
 
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .add( Restrictions.or(
        Restrictions.eq( "age", new Integer(0) ),
        Restrictions.isNull("age")
    ) )
    .list();
 
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )
    .add( Restrictions.disjunction()
        .add( Restrictions.isNull("age") )
        .add( Restrictions.eq("age", new Integer(0) ) )
        .add( Restrictions.eq("age", new Integer(1) ) )
        .add( Restrictions.eq("age", new Integer(2) ) )
    ) )
    .list();
 
Hibernate提供了相当多的内|criterioncd(Restrictions 子类), 但是其有用的是可以允许


你直接用SQL?br />  
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%",


Hibernate.STRING) )
    .list();
 
{alias}占位W应当被替换查询实体的列别名?
Property实例是获得一个条件的另外一U途径。你可以通过调用Property.forName() 创徏一?/font>

Property?
 
  Property age = Property.forName("age");
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.disjunction()
        .add( age.isNull() )
        .add( age.eq( new Integer(0) ) )
        .add( age.eq( new Integer(1) ) )
        .add( age.eq( new Integer(2) ) )
    ) )
    .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )
    .list();
 
3. l果集排?br /> 你可以用org.hibernate.criterion.Order来ؓ查询l果排序?
 
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "F%")
    .addOrder( Order.asc("name") )
    .addOrder( Order.desc("age") )
    .setMaxResults(50)
    .list();
 
List cats = sess.createCriteria(Cat.class)
    .add( Property.forName("name").like("F%") )
    .addOrder( Property.forName("name").asc() )
    .addOrder( Property.forName("age").desc() )
    .setMaxResults(50)
    .list();
 
4. 兌
你可以用createCriteria()非常Ҏ的在互相兌的实体间建立 U束?br />  
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "F%")
    .createCriteria("kittens")
        .add( Restrictions.like("name", "F%")
    .list();



注意W二?createCriteria()q回一个新?Criteria实例Q该实例引用kittens 集合中的元素?
接下来,替换形态在某些情况下也是很有用的?br />  
List cats = sess.createCriteria(Cat.class)
    .createAlias("kittens", "kt")
    .createAlias("mate", "mt")
    .add( Restrictions.eqProperty("kt.name", "mt.name") )
    .list();



(createAlias()q不创徏一个新?Criteria实例?
Cat实例所保存的之前两ơ查询所q回的kittens集合?没有被条仉qo的。如果你希望只获?/font>

W合条g的kittensQ?你必M用returnMaps()?
 
List cats = sess.createCriteria(Cat.class)
    .createCriteria("kittens", "kt")
    .add( Restrictions.eq("name", "F%") )
    .returnMaps()
    .list();
Iterator iter = cats.iterator();
while ( iter.hasNext() ) {
    Map map = (Map) iter.next();
    Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
    Cat kitten = (Cat) map.get("kt");
}


5. 动态关联抓?br /> 你可以用setFetchMode()在运行时定义动态关联抓取的语义?
 
List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .setFetchMode("mate", FetchMode.EAGER)
    .setFetchMode("kittens", FetchMode.EAGER)
    .list();
 
q个查询可以通过外连接抓取mate和kittens?br />  
6. 查询CZ
org.hibernate.criterion.Examplecd怽通过一个给定实?构徏一个条件查询?br />  
Cat cat = new Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)
    .add( Example.create(cat) )
    .list();



版本属性、标识符和关联被忽略。默认情况下gؓnull的属性将被排除?
可以自行调整Example使之更实用?
 
Example example = Example.create(cat)
    .excludeZeroes()           //exclude zero valued properties
    .excludeProperty("color")  //exclude the property named "color"
    .ignoreCase()              //perform case insensitive string comparisons
    .enableLike();             //use like for string comparisons
List results = session.createCriteria(Cat.class)
    .add(example)
    .list();



甚至可以使用examples在关联对象上攄条g?br />  
List results = session.createCriteria(Cat.class)
    .add( Example.create(cat) )
    .createCriteria("mate")
        .add( Example.create( cat.getMate() ) )
    .list();



7. 投媄(Projections)、聚合(aggregationQ和分组QgroupingQ?br /> org.hibernate.criterion.Projections?Projection 的实例工厂。我们通过调用


setProjection()应用投媄C个查询?
 
List results = session.createCriteria(Cat.class)
    .setProjection( Projections.rowCount() )
    .add( Restrictions.eq("color", Color.BLACK) )
    .list();
 
List results = session.createCriteria(Cat.class)
    .setProjection( Projections.projectionList()
        .add( Projections.rowCount() )
        .add( Projections.avg("weight") )
        .add( Projections.max("weight") )
        .add( Projections.groupProperty("color") )
    )
    .list();




在一个条件查询中没有必要昑ּ的?"group by" 。某些投q型就是被定义?分组投媄Q他


们也出现在SQL的group by子句中?

可以选择把一个别名指z一个投影,q样可以使投影DU束或排序所引用。下面是两种不同?/font>

实现方式Q?br />  
List results = session.createCriteria(Cat.class)
    .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )
    .addOrder( Order.asc("colr") )
    .list();




List results = session.createCriteria(Cat.class)
    .setProjection( Projections.groupProperty("color").as("colr") )
    .addOrder( Order.asc("colr") )
    .list();
 
alias()和as()Ҏ便的一个投影实例包装到另外一?别名的Projection实例中。简而言之,


当你d一个投影到一个投影列表中?你可以ؓ它指定一个别名:
 
List results = session.createCriteria(Cat.class)
    .setProjection( Projections.projectionList()
        .add( Projections.rowCount(), "catCountByColor" )
        .add( Projections.avg("weight"), "avgWeight" )
        .add( Projections.max("weight"), "maxWeight" )
        .add( Projections.groupProperty("color"), "color" )
    )
    .addOrder( Order.desc("catCountByColor") )
    .addOrder( Order.desc("avgWeight") )
    .list();



List results = session.createCriteria(Domestic.class, "cat")
    .createAlias("kittens", "kit")
    .setProjection( Projections.projectionList()
        .add( Projections.property("cat.name"), "catName" )
        .add( Projections.property("kit.name"), "kitName" )
    )
    .addOrder( Order.asc("catName") )
    .addOrder( Order.asc("kitName") )
    .list();



也可以用Property.forName()来表C投影:
 
List results = session.createCriteria(Cat.class)
    .setProjection( Property.forName("name") )
    .add( Property.forName("color").eq(Color.BLACK) )
    .list();

List results = session.createCriteria(Cat.class)
    .setProjection( Projections.projectionList()
        .add( Projections.rowCount().as("catCountByColor") )
        .add( Property.forName("weight").avg().as("avgWeight") )
        .add( Property.forName("weight").max().as("maxWeight") )
        .add( Property.forName("color").group().as("color" )
    )
    .addOrder( Order.desc("catCountByColor") )
    .addOrder( Order.desc("avgWeight") )
    .list();



8. ȝ(detached)查询和子查询
DetachedCriteriacM你在一个session范围之外创徏一个查询,q且可以使用L?Session?/font>

执行它?br />  
DetachedCriteria query = DetachedCriteria.forClass(Cat.class)
    .add( Property.forName("sex").eq('F') );
//创徏一个Session
Session session = .;
Transaction txn = session.beginTransaction();
List results = query.getExecutableCriteria(session).setMaxResults(100).list();
txn.commit();
session.close();



DetachedCriteria也可以用以表C子查询。条件实例包含子查询可以通过 Subqueries或?/font>
Property获得?br />  
DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)
    .setProjection( Property.forName("weight").avg() );
session.createCriteria(Cat.class)
    .add( Property.forName("weight).gt(avgWeight) )
    .list();

DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)
    .setProjection( Property.forName("weight") );
session.createCriteria(Cat.class)
    .add( Subqueries.geAll("weight", weights) )
    .list();


怺兌的子查询也是有可能的Q?br />  
DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")
    .setProjection( Property.forName("weight").avg() )
    .add( Property.forName("cat2.sex").eqProperty("cat.sex") );
session.createCriteria(Cat.class, "cat")
    .add( Property.forName("weight).gt(avgWeightForSex) )
    .list();



LifeNote 2008-03-12 15:24 发表评论
]]>
深入理解Tapestry的Rewindhttp://m.tkk7.com/lifenote/archive/2008/03/08/184695.htmlLifeNoteLifeNoteSat, 08 Mar 2008 08:03:00 GMThttp://m.tkk7.com/lifenote/archive/2008/03/08/184695.htmlhttp://m.tkk7.com/lifenote/comments/184695.htmlhttp://m.tkk7.com/lifenote/archive/2008/03/08/184695.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/184695.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/184695.html 我们来看一下最单的TextFieldlgQ组件定义如?
Java代码 复制代码
  1. <input  jwcid="price@TextField" type="text" value="ognl:picture.price"  translator="translator:number,pattern=##.##"  validators="validators:min=0" displayName="h" class="input_text"/>  

再看一下TextField中的rewindFormComponentlgҎ
Java代码 复制代码
  1. protected void rewindFormComponent(IMarkupWriter writer, IRequestCycle cycle) {   
  2.        //从请求中得到参数?  
  3.         String value = cycle.getParameter(getName());   
  4.   
  5.         try {   
  6.              //用translator来{换?  
  7.             Object object = getTranslatedFieldSupport().parse(this, value);   
  8. //用validators来验证?  
  9.             getValidatableFieldSupport().validate(this, writer, cycle, object);   
  10.             //赋值给容器或者页?  
  11.             setValue(object);   
  12.         } catch (ValidatorException e) {   
  13.             getForm().getDelegate().record(e);   
  14.         }   
  15.     }  

可以看到在rewindFormComponent中,主要是从h中取得用戯入的|然后q行处理Q最后赋值给容器或者页面,上面的例子中会调用页面类的getPicture().setPrice(“用户输入的?#8221;)来进行赋倹{这h个表单的提交可以理解ؓ所有的表单lgd用户输入的值ƈ赋值给面的过E?
整个表单提交的详l处理过E如下:
    * initialize():面初始?
    * pageBeginRender() ("rewind"):getRequestCycle().isRewinding()为true
    * rewind of the form / setting of properties:所有表单组件调用rewindFormComponent来取D?
    * Deferred listeners (for Submit components):调用Submitlg的listener
    * Form's listenerQ调用Formlg的listener
    * pageEndRender() ("rewind"): getRequestCycle().isRewinding()为true
    * pageBeginRender() (normal): getRequestCycle().isRewinding()为false
    * pageEndRender() (normal): getRequestCycle().isRewinding()为false
我们可以看到pageBeginRender和pageEndRender被调用了两次Q两ơ中的区别ؓRequestCycle().isRewindingQ因为我们在使用时经常利用pageBeginRender的初始化|所以这里有很多使用上的误区Q如果在pageBeginRender中从数据库读取数据来初始化跟表单提交无关的变量的话,可能被调用两次Q这个是应该避免的。什么叫跟表单提交无关的变量呢,是表单lg中跟赋值无关的Q例如上Ҏ到的value="ognl:picture.price",q时picture是与表单提交相关的变量Q如果你没有初始化,那么在赋值时调用getPicture().setPrice()׃出现I指针异常,因ؓq是的picture为null。我们D个例子来看一下表单无关的变量Q假如这个picture面会显CZ个创建picture的表单和所有picture的列表,那这个picture的列表就是与表单提交无关的变量,如果你在pageBeginRender中初始化的话Q就需要区分是否rewindQ否则表单提交时׃被初始化两次Q让我们看一下代码:
Java代码 复制代码
  1. public abstract void setPictures(List<Picture> pictures);   
  2. public abstract void setPictureInList();//用于For中的value   
  3. public abstract void setPicture(Picture picture);//用于表单创徏   
  4. public abstract Picture getPicture();   
  5. public void pageBeginRender(PageEvent event) {   
  6. if(getPicture()==null){   
  7. setPicture(new Picture());   
  8. }   
  9. setPictures(getPictureService().findAll());   
  10. }  
判断picture是否为nullq赋值在面昄和rewind中都是需要的Q因为页面显C时Q需要调用getPicture().getPrice(),面rewindӞ需要调用getPicture().setPrice(),q两个阶D中的picture都不能ؓnull。但setPictures会在表单提交时被调用两次Q在rewind阶段初始化它是没有用处的Q所以这时就要对是否rewindq行判断。修改后的代码如下:
Java代码 复制代码
  1. public void pageBeginRender(PageEvent event) {   
  2. if(getPicture()==null){   
  3. setPicture(new Picture());   
  4. }   
  5. if (!event.getRequestCycle().isRewinding()) {   
  6. setPictures(getPictureService().findAll());   
  7. }   
  8. }  
q样可以避免在rewind时对picturesq行不必要的赋倹{这里还要提到的一Ҏ面昄和提交后的页面很可能不是同一个页面类的实例,大家都知道页面类的实例是从实例池取到的,用户打开面昄表单完后的页面类实例和用h交表单时的用来rewind的页面类实例不一定是同一个,即是一个实例,也是被重新初始化q的Q不要想当然的认为显C单后再提交那个实例应该保存原来显C的东西Q这个应该理清楚?

原文地址Qhttp://www.javaeye.com/article/41724

LifeNote 2008-03-08 16:03 发表评论
]]>
《J2EE核心模式?DAO模式)http://m.tkk7.com/lifenote/archive/2008/02/15/180110.htmlLifeNoteLifeNoteFri, 15 Feb 2008 09:09:00 GMThttp://m.tkk7.com/lifenote/archive/2008/02/15/180110.htmlhttp://m.tkk7.com/lifenote/comments/180110.htmlhttp://m.tkk7.com/lifenote/archive/2008/02/15/180110.html#Feedback2http://m.tkk7.com/lifenote/comments/commentRss/180110.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/180110.html很多的J2EE应用E序需要用持久性数?数据库、文件等)。不同的E序Q持久性存储是各不相同的,q且用来讉Kq些不同的持久性存储机制的API也有很大的不同。如果应用程序要在不同的持久性存储间q移Q这些访问特定持久存储层的代码将面重写?br /> 如何解决q个问题?且看"DAO模式"

数据讉K对象(Data Acess Object) 模式
一.环境
Ҏ数据源不同,数据讉K也不同。根据存储的cd(关系数据库、面向对象数据库、文件等{?和供应商实现不同Q持久性存?比如数据?的访问差别也很大

?问题
许多真是的J2EE应用E序需要在一定程度上使用持久性数据。对于许多应用程序,持久性存储是使用不同的机制实现的,q且用来讉Kq些不同的持久性存储机制的API也有很大的不同?br /> 比如Q应用程序用实体bean(q里应该是指BMP的beanQCMP的bean已大大降低了与RDBMS的耦合)的分布式lg来表C持久性数据,或者用JDBC API来访问驻留在某关pL据库理pȝ(RDBMS)中的数据Q这些组件中包含q接性性和数据讉K代码会引入这些组件与数据源实C间的紧密耦合。组件中q类代码依赖性应用E序从某U数据源q移到其他种cȝ数据源将变得非常ȝ和困难。当数据源变化时Q组件也需要改变,以便于能够处理新cd的数据源

(举个例子来说Q我们UPTELpȝ是用JDBC API?nbsp;ORACLE数据库进行连接和数据讉K的,q些JDBC API与SQL语句散布在系l中Q当我们需要将UPTELq移到其他RDBMSӞ比如曄q移到INFORMIXQ就面重写数据库连接和讉K数据的模块?

?作用?br /> 1.诸如bean理的实体bean、会话bean、servlet{组件往往需要从持久性存储数据源中检索数据,以及q行数据存储{操作?br /> 2.Ҏ产品供应商的不同Q持久性存储API差别也很大,q些API和其能力同样Ҏ存储的类型不同也有差别,q样存在以下~点Q即讉Kq些独立pȝ的API很不l一?br /> 3.lg需要透明于实际的持久性存储或者数据源实现Q以便于提供C同供应商产品、不同存储类型和不同数据源类型的更容易的UL性?/p>

?解决Ҏ
使用数据讉K对象(DAO)模式来抽象和装所有对数据源的讉K。DAO理着与数据源的连接以便检索和存储数据?br /> DAO实现了用来操作数据源的访问机制。数据源可以时RDBMS,LDAP,File{。依赖于DAO的业务组件ؓ其客L使用DAO提供更简单的接口。DAO完全向客L隐藏了数据源实现l节。由于当低层数据源实现变化时QDAO向客L提供的接口不会变化,所有该模式允许DAO调整C同的存储模式Q而不会媄响其客户端或者业务组件。重要的?DAO充当lg和数据源之间的适配器?/p>

(按照q个理论Q如果我们UPTELpȝ使用了DAO模式,可以无~的从ORACLEq移CQ何一个RDBMS了。梦xL很完的Q且看看DAO模式如何实现)



LifeNote 2008-02-15 17:09 发表评论
]]>
JSF中文输入q问题解决Ҏhttp://m.tkk7.com/lifenote/archive/2008/01/31/178680.htmlLifeNoteLifeNoteThu, 31 Jan 2008 07:05:00 GMThttp://m.tkk7.com/lifenote/archive/2008/01/31/178680.htmlhttp://m.tkk7.com/lifenote/comments/178680.htmlhttp://m.tkk7.com/lifenote/archive/2008/01/31/178680.html#Feedback2http://m.tkk7.com/lifenote/comments/commentRss/178680.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/178680.html该方法已知适用的版本tomact5.0.18,tomcat5.0.9?br /> 已知不适用的版本ؓtomcat5.0.28?br /> 问题描述Q?br /> 在inputtext中输入中文,然后在输出,昄Zؕ码?br /> 解决ҎQ?br /> 1、自定义转器
package util;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.convert.Converter;
import javax.faces.context.FacesContext;
import javax.faces.convert.ConverterException;

public class StringConverter implements Converter {
 public Object getAsObject(FacesContext context, UIComponent component,
   String newValues) throws ConverterException {
  String newstr = "";
  if (newValues == null) {
   newValues = "";
  }
  byte[] byte1 = null;
  try {
   byte1 = newValues.getBytes("ISO-8859-1");
   newstr = new String(byte1, "GB2312");
   UIInput input=(UIInput)component;//
   input.setSubmittedValue(newstr);
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  }

  return newstr;

 }

 public String getAsString(FacesContext context, UIComponent component,
   Object Values) throws ConverterException { 
  return (String) Values;
 }
}

2、注册{换器
faces-config.xml片段
<converter>
  <converter-id>util.stringconverter</converter-id>
  <converter-class>util.StringConverter</converter-class>
</converter>

3、在面使用转换?br /> <h:inputText id="account" value="#{util.account}" required="true" styleClass="input" > 
 <f:converter converterId="utilstringconverter"/>



LifeNote 2008-01-31 15:05 发表评论
]]>
Tomcat,Weblogic {服务器 SSL 安全登陆的例?--附证书文件生成器http://m.tkk7.com/lifenote/archive/2008/01/15/175432.htmlLifeNoteLifeNoteTue, 15 Jan 2008 04:32:00 GMThttp://m.tkk7.com/lifenote/archive/2008/01/15/175432.htmlhttp://m.tkk7.com/lifenote/comments/175432.htmlhttp://m.tkk7.com/lifenote/archive/2008/01/15/175432.html#Feedback2http://m.tkk7.com/lifenote/comments/commentRss/175432.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/175432.html公司今天一个登陆的地方要修改,需要加一个SSL安全登陆,于是查些资料qȝ如下Q希望对有用的着的朋友有帮助
文g打包地址Qhttp://m.tkk7.com/Files/lifenote/tomcat配置ssl.rar
一下ؓ帮助说明Q?br />
1.1. 安全d SSL
1.1.1  WebLogic下面SSL配置Q?br /> 1Q生?keystoreFileQ?br />  * keystoreFile 文g的生成:
%Java_Home%\bin\keytool -genkey -alias localhost-weblogic -keyalg RSA -validity 365 -keystore ./testKey.jks

 * csr 文g的生成:
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks

 * 注意Q?http 的默认端口是80Qhttps 的默认端口是433Qftp 的默认端口是21?br /> 2Q部|keystore 文g
?<http://hostname:7001/console>  中配|刚才生成的 testKey.jks 文g?/p>

1.1.2 Tomcat 下面SSL配置


1Q生?keystoreFileQ?br />  * keystoreFile 文g的生成:
%Java_Home%\bin\keytool -genkey -alias localhost-weblogic -keyalg RSA -validity 365 -keystore ./testKey.jks

Example for inner testQ?br /> [root@localhost ~]#
/home/tomcat/jdk1.5.0_12/bin/keytool -genkey -alias localhost-tomcat -keyalg RSA -validity 365 -keystore /home/tomcat/apache-tomcat-5.5.23/conf/VCMarketKey.jks
Enter keystore password:  someday2007
What is your first and last name?
  [Unknown]:  lifenote
What is the name of your organizational unit?
  [Unknown]:  Java
What is the name of your organization?
  [Unknown]:  Sunxc
What is the name of your City or Locality?
  [Unknown]:  Beijing
What is the name of your State or Province?
  [Unknown]:  Beijing
What is the two-letter country code for this unit?
  [Unknown]:  ZH
Is CN=lifenote, OU=Java, O=Sunxc, L=Beijing, ST=Beijing, C=ZH correct?
  [no]:  y

Enter key password for <localhost-tomcat>
        (RETURN if same as keystore password):  someday2007
[root@localhost ~]#

 

 * csr 文g的生成:
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks

 * 注意Q?http 的默认端口是80Qhttps 的默认端口是433Qftp 的默认端口是21?/p>


2Q部|keystore 文g
  打开 server.xml 文gQ修改内容如下:
 
 * 只需L server.xml 中对SSL定义的注释,在加?keystoreFile、keystorePass q两个属性即可?br />   <Service
      name="Catalina">
    <Connector
        port="8080"
  ...
    </Connector>
   
 <!-- Define a SSL HTTP/1.1 Connector on port 8443 --------------------- 要加入的内容在这?-->
    <Connector port="8443" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
      keystoreFile="e:/temp_E/ssl/testKey.jks"
      keystorePass="aaaaaa"/>

    <Connector
        port="8009"
  ...
    </Connector>
 ...
Example for inner testQ?br />     <Connector port="443" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
      keystoreFile="/home/tomcat/apache-tomcat-5.5.23/conf/VCMarketKey.jks"
      keystorePass="password"/>


 注意需默认要?443 而不?8443Q要使用8443要在apache中配|,保证从apachehtomcat 采用 <https://ip:8443/>... 的格式?/p>


1.1.3 使用http讉KWebService s的客L配置
Servlet服务器配|好SSL之后Q客L可以使用https讉K了?br /> 对于用户使用览器访问https的方式,览器会弹出安装证书的对话框Q确认之后可以正怋用https讉K?br />  对于WebService 通过https方式讉KQ按照一下步骤:
1Q?nbsp;WebService客户端要先取得keyStore文gQ?br /> 2Q?nbsp;虚拟机系l?System.setProperties(…) 讄keyStore信息Q?br /> 3Q?nbsp;使用 url=<https://ip:port/...> 讉KWebService服务

 

 



LifeNote 2008-01-15 12:32 发表评论
]]>
一个Struts的上传下载文件的E序http://m.tkk7.com/lifenote/archive/2008/01/14/175299.htmlLifeNoteLifeNoteMon, 14 Jan 2008 13:24:00 GMThttp://m.tkk7.com/lifenote/archive/2008/01/14/175299.htmlhttp://m.tkk7.com/lifenote/comments/175299.htmlhttp://m.tkk7.com/lifenote/archive/2008/01/14/175299.html#Feedback3http://m.tkk7.com/lifenote/comments/commentRss/175299.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/175299.html Z节省I间Q文件中没有导入java包,导入eclipse后请自行加入java?br />
http://m.tkk7.com/Files/lifenote/
使用struts实现文g上传下蝲.rar

要把上面的地址都复制哦

LifeNote 2008-01-14 21:24 发表评论
]]>
java.lang.OutOfMemoryError 的解军_?/title><link>http://m.tkk7.com/lifenote/archive/2008/01/09/173982.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Wed, 09 Jan 2008 05:27:00 GMT</pubDate><guid>http://m.tkk7.com/lifenote/archive/2008/01/09/173982.html</guid><wfw:comment>http://m.tkk7.com/lifenote/comments/173982.html</wfw:comment><comments>http://m.tkk7.com/lifenote/archive/2008/01/09/173982.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/lifenote/comments/commentRss/173982.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lifenote/services/trackbacks/173982.html</trackback:ping><description><![CDATA[最q在使用Tomcat +Tapestry的时候遇见一个问题,׃Tapestry修改些内容后要重新启动(即配置了一下那参数有时候也要重启)当我修改了页面的内容 需要调试不断刷斎ͼ发现面昄的速度来慢 最后就出现?500错误java.lang.OutOfMemoryError  内存溢出Q在|上查了一下资?br /> 最后ȝ如下希望可以帮你解决同样的问?br /> 解决java.lang.OutOfMemoryError的方法有如下几种Q?br /> 1。增加jvm的内存大。方法有Q?nbsp;<br />              1Q在执行某个class文g时候,可以使用java -Xmx256M aa.class来设|运行aa.class时jvm所允许占用的最大内存ؓ256M?br />              2Q对tomcat容器Q可以在启动时对jvm讄内存限度。对tomcatQ可以在catalina.bat中添加:<br />   set CATALINA_OPTS=-Xms128M -Xmx256M<br />    set JAVA_OPTS=-Xms128M -Xmx256M<br /> 或者把%CATALINA_OPTS%?JAVA_OPTS%代替?Xms128M -Xmx256M <p>             3Q对resin容器Q同样可以在启动时对jvm讄内存限度。在bin文g夹下创徏一个startup.bat文gQ内容如下:<br />                   @echo off<br />                    call "httpd.exe"  "-Xms128M" "-Xmx256M"<br />                    :end <br />                    其中"-Xms128M"为最内存,"-Xmx256M"为最大内存?/p> <p> 2.    优化E序Q释攑֞圾?/p> <img src ="http://m.tkk7.com/lifenote/aggbug/173982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lifenote/" target="_blank">LifeNote</a> 2008-01-09 13:27 <a href="http://m.tkk7.com/lifenote/archive/2008/01/09/173982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多模块Struts应用E序的几个问题(及部分解x法)http://m.tkk7.com/lifenote/archive/2008/01/04/172726.htmlLifeNoteLifeNoteFri, 04 Jan 2008 05:35:00 GMThttp://m.tkk7.com/lifenote/archive/2008/01/04/172726.htmlhttp://m.tkk7.com/lifenote/comments/172726.htmlhttp://m.tkk7.com/lifenote/archive/2008/01/04/172726.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/172726.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/172726.htmlStruts?.1版本开始支持把应用E序分ؓ多个模块Q每个模块可以看作独立的应用E序Q在带来方便的同Ӟ我也发现了一些问题。比如有一?a class="UBBWordLink" target="_blank">struts应用E序分了大约十个模块Q现在有以下问题不知道大家一般是怎么解决的:

1、因q行验证Q所以在每个模块对应的资源文仉都要?#8220;errors.required={0} is required.”{资源,有没有只用在一个文仉定义的方法?


2、用tiles的时候,要在每个模块对应的tiles-defs.xml里定义几乎相同的definitionQ有没有只用在一个文仉定义的方法?Q我试过在缺省模块里定义一个definitionQ然后在模块里extends它,但不行,extendsg只找当前模块Q?/p>

3、用ExceptionHandler的时候,Z么在exception标签里指定了bundle属性还是只在当前模块里找资源?我希望把一些重复用的异常处理声明在一个文仉Q例如NotLoginException、NoSuchObjectException{等Qƈ且它们对应的key也指向同一个资源文仉的资源(利用bundle属性)Q怎么实现Q?/p>

l过一D|间的摸烦Q第一个和W三个问题基本上解决了,其实它们可以看作同一c问题,是资源的问题。在struts-config-xxx.xml里定义资源文件时Q可以指定一个factory属性,不指定时使用~省?#8220;org.apache.struts.util.PropertyMessageResourcesFactory”cR我的解x法是自定义一个CustomMessageResourcesFactoryc,多个资源文件以逗号分隔的Ş式作为参敎ͼ即message-resources的parameter属性)传给它,在需要资源的地方会遍历它们进行查找。同时还要自定义一个CustomMessageResourcesc,它的getMessage()Ҏ里是查找资源的关键代码,而factory只是解析逗号分隔的参数构造ƈq回CustomMessageResources实例?/p>

CustomMessageResourcesFactory的代码比较简单,如下所C:



package eg;

import java.util.Arrays;

import org.apache.struts.util.MessageResources;
import org.apache.struts.util.MessageResourcesFactory;

public class CustomMessageResourcesFactory extends MessageResourcesFactory{

    public MessageResources createResources(String config) {
        
        return new CustomMessageResources(Arrays.asList(config.split(",")));
    }

}
 

 


CustomMessageResourcesq微复杂一些,不过很幸q,我在|上扑ֈ了一个完全符合自p求的c,下蝲地址?A&NBSP;HREF="HTTP: javaboutique.internet.com tutorials Dynaform source.zip?>

<message-resources factory="eg.CustomMessageResourcesFactory" 
    parameter="eg.ApplicationResources,eg.ErrorResources" />
 

 


上面参考了q篇文章



LifeNote 2008-01-04 13:35 发表评论
]]>
JSF和Spring集成http://m.tkk7.com/lifenote/archive/2008/01/03/172506.htmlLifeNoteLifeNoteThu, 03 Jan 2008 08:31:00 GMThttp://m.tkk7.com/lifenote/archive/2008/01/03/172506.htmlhttp://m.tkk7.com/lifenote/comments/172506.htmlhttp://m.tkk7.com/lifenote/archive/2008/01/03/172506.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/172506.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/172506.htmlJSF和Spring集成原理是获得彼此的上下文引?以此q一步获得各自管理的bean,q是可能?因ؓ两者是web应用框架都遵循servlet规范,Z者整合提供了可能和基.
 
在Spring中ApplicationContext是相当重要的c?对于web应用,它还包装了javax.servlet.ServletContext,为web应用提供了所有可以利用的数据,包括可管理bean,Faces中通过FacesContextcd以获得所有可以利用的资源,同样包括JSF的可理支持bean,它们都围l着ServletContext提供了自q门面,通过各自的门面在Servlet容器的世界里彼此盔R?
本文介绍两种方式,实现二者集?
1.         通过写自qcL完成二者的q?实际上只是获得彼此世界里存活的bean,对于JSF中事件处理可能需要更q一步的构思和~码,Zq点,W二个方法介l了一U框?
2.         使用框架完成二者集?
 
一  自己动手,下面的代码以CZZ,其它涉及的类和接口略?
q个工具cL供在JSF世界里查找Spring理的bean.也实现在Spring中查找JSFlg的方?
package com.skysoft.rbac.dao;
 
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.faces.el.ValueBinding;
import javax.faces.FactoryFinder;
import javax.faces.application.Application;
import javax.faces.application.ApplicationFactory;
 
public final class SpringFacesUtil {
  public SpringFacesUtil() {
  }
  /**
   * 从Spring中查找bean.
   * @param beanname String
   * @return Object
   */
  public static Object findBean(String beanname) {
    ServletContext context = (ServletContext) FacesContext.getCurrentInstance().
        getExternalContext().getContext();
    ApplicationContext appctx = WebApplicationContextUtils.
        getRequiredWebApplicationContext(context);
    return appctx.getBean(beanname);
  }
  /**
   * 从JSF中查找bean.
   * @param beanname String
   * @return Object
   */
  public static Object lookupBean(String beanname) {
    Object obj = getValueBinding(getJsfEl(beanname)).getValue(FacesContext.
        getCurrentInstance());
    return obj;
  }
 
  private static ValueBinding getValueBinding(String el) {
    return getApplication().createValueBinding(el);
  }
 
  private static Application getApplication() {
    ApplicationFactory appFactory = (ApplicationFactory) FactoryFinder.
        getFactory(FactoryFinder.APPLICATION_FACTORY);
    //FactoryFinder.FACES_CONTEXT_FACTORY
    //FactoryFinder.RENDER_KIT_FACTORY
    return appFactory.getApplication();
  }
 
  private static String getJsfEl(String value) {
    return "#{" + value + "}";
  }
}
下面定义一个由JSF理的bean:
package com.skysoft.rbac.dao;
 
import javax.servlet.ServletContext;
 
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.skysoft.struts.jsf.util.FacesUtils;
 
public class ServiceLocatorBean
    implements ServiceLocator {
  private static final String DAO_SERVICE_BEAN_NAME = "userDAO";
  //q个dao是由Spring提供的管理bean,q个dao可以使用Hibernate实现.
  private UserDAO dao;
 
  public ServiceLocatorBean() {
    this.dao = (UserDAO)SpringFacesUtil.findBean(DAO_SERVICE_BEAN_NAME);
  }
 
  public UserDAO getDao() {
    return dao;
  }
}
下面是一个用ServiceLocatorBean的类.
public class UserDAOImp
    extends HibernateDaoSupport implements UserDAO {
  private UserDAO dao;
  private List list;
 
  public UserDAOImp() {}
 
  public List getList() {
    if (list == null) {
      list = dao.getList();
    }
    return list;
  }
 
  public UserDAO getDao() {
    return dao;
  }
 
  public void setDao(UserDAO dao) {
    this.dao = dao;
  }
}
 
在faces-config.xml中的配置:
       <managed-bean>
              <managed-bean-name>serviceLocatorBean</managed-bean-name>
              <managed-bean-class>com.skysoft.rbac.dao.ServiceLocatorBean</managed-bean-class>
              <managed-bean-scope>session</managed-bean-scope>
       </managed-bean>
       <managed-bean>
              <managed-bean-name>User</managed-bean-name>
              <managed-bean-class>com.skysoft.rbac.User</managed-bean-class>
              <managed-bean-scope>request</managed-bean-scope>
              <managed-property>
                     <property-name>serviceLocator</property-name>
                     <property-class>com.skysoft.rbac.dao.ServiceLocatorBean</property-class>
                     <value>#{serviceLocatorBean}</value>
              </managed-property>
       </managed-bean>
在applicationContext.xml中的配置:
       <bean id="userDAO" class="com.skysoft.rbac.dao.UserDAOImp">
              <property name="sessionFactory">
                     <ref local="sessionFactory" />
              </property>
       </bean>
?使用框架
1 介绍
q个框架是Spring相关目,提供一个包de.mindmatters.faces.spring,q个包包含JSF和Spring框架l合集成的粘合代?q些代码以独立于一个实现的方式完成,q样它能和Q何JSF实现一起?
本包的提供的代码主要目的是尽可能透明的集成两个框?主要特征:
l         JSF/JSP开发者应该能讉KSpring理的Beans,好象它们是由JSF理?
l         JSF可管理beans应能集成入Spring.
l         RequestHandledEvent事g也应该能被发布到Spring.
2  JSF配置集成
本包构造了一个基于faces配置文g(e.g. /WEB-INF/faces-config.xml)的WebApplicationContextc? 让它成ؓ遵@"spring-beans" DTD配置文g(e.g. defined in /WEB-INF/applicationContext.xml)来配|的ApplicationContext的孩?q样依从"faces-config" DTD的WebApplicationContext是全特征的,卌动拥有如下功?
l         JSF可管理beans实现了Spring?Aware interfaces:
ApplicationContextAware
BeanFactoryAware
BeanNameAware
ResourceLoaderAware
ServletContextAware
l         JSF可管理beans实现Spring的lifecycle interfaces:
InitializingBean
DisposableBean
l         实现Spring的FactoryBean interface
l         实现Spring的ApplicationListener interface
l         发布ApplicationEvent事g.
l         从资源中d消息.
{等,更多可看Spring.
3 讉K方式
1) 从JSF中程序化的访问Spring理的beans.
因ؓ在FacesWebApplicationContext和ApplicationContext之间有层ơ关p?所以你的JSF可管理支持beans能容易的实现ApplicationContextAware接口,q能通过getBeanҎ讉K它而不它是否定义在FacesWebApplicationContext中还是定义在父ApplicationContextcd象中.
2) 通过JSF EL从JSF中访问Spring理的beans.
能够使用JSF EL讉Kbeans无论你引用的bean由JSF理q是由Spring理.两个bean上下文在存取旉合ƈ.
a) 直接讉K:
如果一个带有请求名字的bean只存在于Spring上下文内的话,q个bean被?bean的singleton属性设|被完全保持.
b) 区域化访?scoped access):
如果你要从JSF定义bean的作用域的能力上得益q想让那个bean由Spring理,那么p在两个上下文中定?只是对于JSF上下文中的定义的cȝ型要使用de.mindmatters.faces.spring.SpringBeanFactoryc?你还应该讄那个bean的singleton属性到false,因这能覆盖你的作用域讄.在你使用JSF EL讉Kbean?你总能获得一个遵从你在JSF上下文中定义的作用域讄的由Spring理的bean的实?
 
?用法
通常,p讄M其它JSF web应用一栯|你的web应用,下面的样例配|展C怎样使能上面提到的特征?br /> 在web.xml配置中必d入下列配|条?同时注意把该库的jsf-spring.jar攑֜适当的位|?
<web-app>
    .........
    <!--
        qo器用于向Spring发布RequestHandledEvent,它应该媄到和FacesServlet url相同的模?
    -->   
    <filter>
        <filter-name>RequestHandled</filter-name>
        <filter-class>de.mindmatters.faces.spring.support.RequestHandledFilter</filter-class>
    </filter>
      
    <filter-mapping>
        <filter-name>RequestHandled</filter-name>
        <url-pattern>*.faces</url-pattern>
    </filter-mapping>
 
    <!--
    q个侦听器用于装入Spring beans的父应用上下?
    -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    .........
</web-app>
下面的一些说?都可以通过下蝲q个Spring相关目得到,列在q里只ؓ演示上面的说明的功能.
WEB-INF/faces-config.xml
<!-- 一个纯JSF理的bean -->
<managed-bean>
    <managed-bean-name>jsfBean</managed-bean-name>
    <managed-bean-class>example.NameBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
        <property-name>name</property-name>
    </managed-property>
</managed-bean>
<!--一个SpringBeanScope用来定义Spring可管理bean的作用域.-->
       <managed-bean>
              <managed-bean-name>scopedAccessSpringBean</managed-bean-name>
       <managed-bean-class>de.mindmatters.faces.spring.SpringBeanScope</managed-bean-class>
              <managed-bean-scope>session</managed-bean-scope>
       </managed-bean>
<!-- q是一个纯JSF可管理bean,它持有一个到Spring可管理bean的一个引? -->
<managed-bean>
    <managed-bean-name>referencingBean</managed-bean-name>
    <managed-bean-class>example.ReferencingBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
        <property-name>referencedBean</property-name>
        <value>#{managedPropertyAccessSpringBean}</value>
    </managed-property>
</managed-bean>
WEB-INF/applicationContext.xml (partial)
<!-- 一个纯Spring的可理bean -->
<bean id="directAccessSpringBean" class="example.NameBean"/>
<!-- 一个向JSF作用域提供的可管理bean.  -->
<bean id="scopedAccessSpringBean" class="example.NameBean" singleton="false"/>
<!-- 一个纯Spring的可理bean,它由一个JSF可管理bean引用.(当然?它也能被直接讉K?) -->
<bean id="managedPropertyAccessSpringBean" class="example.NameBean" singleton="false"/>
参?
http://jsf-spring.sourceforge.net/   JSF-Spring,Spring相关目官方站点,提供本文介绍的框架下载以及实例下?
javaworld.com/javaworld/jw-07-2004/jw-0719-jsf.html">http://www.javaworld.com/javaworld/jw-07-2004/jw-0719-jsf.html 一关于JSF和Spring的文?
bean的singleton属性设|被完全保持.

b) 区域化访?scoped access):
如果你要从JSF定义bean的作用域的能力上得益q想让那个bean由Spring理,那么p在两个上下文中定?只是对于JSF上下文中的定义的cȝ型要使用de.mindmatters.faces.spring.SpringBeanFactoryc?你还应该讄那个bean的singleton属性到false,因这能覆盖你的作用域讄.在你使用JSF EL讉Kbean?你总能获得一个遵从你在JSF上下文中定义的作用域讄的由Spring理的bean的实?
 
?用法
通常,p讄M其它JSF web应用一栯|你的web应用,下面的样例配|展C怎样使能上面提到的特征?br /> 在web.xml配置中必d入下列配|条?同时注意把该库的jsf-spring.jar攑֜适当的位|?
<web-app>
    .........
    <!--
        qo器用于向Spring发布RequestHandledEvent,它应该媄到和FacesServlet url相同的模?
    -->   
    <filter>
        <filter-name>RequestHandled</filter-name>
        <filter-class>de.mindmatters.faces.spring.support.RequestHandledFilter</filter-class>
    </filter>
      
    <filter-mapping>
        <filter-name>RequestHandled</filter-name>
        <url-pattern>*.faces</url-pattern>
    </filter-mapping>
 
    <!--
    q个侦听器用于装入Spring beans的父应用上下?
    -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    .........
</web-app>
下面的一些说?都可以通过下蝲q个Spring相关目得到,列在q里只ؓ演示上面的说明的功能.
WEB-INF/faces-config.xml
<!-- 一个纯JSF理的bean -->
<managed-bean>
    <managed-bean-name>jsfBean</managed-bean-name>
    <managed-bean-class>example.NameBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
        <property-name>name</property-name>
    </managed-property>
</managed-bean>
<!--一个SpringBeanScope用来定义Spring可管理bean的作用域.-->
       <managed-bean>
              <managed-bean-name>scopedAccessSpringBean</managed-bean-name>
       <managed-bean-class>de.mindmatters.faces.spring.SpringBeanScope</managed-bean-class>
              <managed-bean-scope>session</managed-bean-scope>
       </managed-bean>
<!-- q是一个纯JSF可管理bean,它持有一个到Spring可管理bean的一个引? -->
<managed-bean>
    <managed-bean-name>referencingBean</managed-bean-name>
    <managed-bean-class>example.ReferencingBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
        <property-name>referencedBean</property-name>
        <value>#{managedPropertyAccessSpringBean}</value>
    </managed-property>
</managed-bean>
WEB-INF/applicationContext.xml (partial)
<!-- 一个纯Spring的可理bean -->
<bean id="directAccessSpringBean" class="example.NameBean"/>
<!-- 一个向JSF作用域提供的可管理bean.  -->
<bean id="scopedAccessSpringBean" class="example.NameBean" singleton="false"/>
<!-- 一个纯Spring的可理bean,它由一个JSF可管理bean引用.(当然?它也能被直接讉K?) -->
<bean id="managedPropertyAccessSpringBean" class="example.NameBean" singleton="false"/>
参?
http://jsf-spring.sourceforge.net/   JSF-Spring,Spring相关目官方站点,提供本文介绍的框架下载以及实例下?
http://www.javaworld.com/javaworld/jw-07-2004/jw-0719-jsf.html 一关于JSF和Spring的文?



LifeNote 2008-01-03 16:31 发表评论
]]>
博客搬家E序是如何实现的http://m.tkk7.com/lifenote/archive/2007/12/27/170914.htmlLifeNoteLifeNoteThu, 27 Dec 2007 08:28:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/27/170914.htmlhttp://m.tkk7.com/lifenote/comments/170914.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/27/170914.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/170914.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/170914.html

LifeNote 2007-12-27 16:28 发表评论
]]>
★★oracle易忘函数用法★★http://m.tkk7.com/lifenote/archive/2007/12/14/167677.htmlLifeNoteLifeNoteFri, 14 Dec 2007 02:02:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/14/167677.htmlhttp://m.tkk7.com/lifenote/comments/167677.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/14/167677.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/167677.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/167677.html===================★★oracle易忘函数用法★★=====================================
                                                                开发积累资?br />                                                                 Author:SunXianchao
                                                                2006q于湖南长沙
==============================================================================
一般的to_char是这L的to_char(sysdate,'YYYY-MM-DD hh:mi:ss AM') Q也有几个突出点的用法:

to_char(sysdate, 'dd') 查看今天是几号to_char(sysdate, 'ww') 查看q是q个月第几个星期

to_char(sysdate, 'mm')  查看q是一q中W几个月

to_char(sysdate, 'yyyy') 查看q䆾last_day(to_date('2007-02-01','YYYY-MM-DD'))查看一个月的最后一天,add_months(sysdate,10)查看若干个月后的今天Qnext_day(sysdate,'星期?)l个日期查看后面的最q的星期几的日期Q不q这个星期五要是换成英文居然有问题,W?个参数可以是数字1-7Q分别表C周日到周六?/p>

下面贴个全的Q需要的时候顺便查一下?/p>

一、PL/SQL单行函数和组函数详解

函数是一U有零个或多个参数ƈ且有一个返回值的E序。在SQL中Oracle内徏了一pd函数Q这些函数都可被UCؓSQL或PL/SQL语句Q函C要分Z大类Q单行函数和l函数?/p>

本文讨论如何利用单行函C及用规则?br /> 1、SQL中的单行函数

SQL和PL/SQL中自带很多类型的函数Q有字符、数字、日期、{换、和混合型等多种函数用于处理单行数据Q因此这些都可被l称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY{子句中Q例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX{单行函数?/p>

SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)


单行函数也可以在其他语句中用,如update的SET子句QINSERT的VALUES子句QDELET的WHERE子句,认证考试特别注意在SELECT语句中用这些函敎ͼ所以我们的注意力也集中在SELECT语句中?/p>

2、NULL和单行函?/p>

在如何理解NULL上开始是很困隄Q就是一个很有经验的Z然对此感到困惑。NULLDCZ个未知数据或者一个空|术操作W的M一个操作数为NULL|l果均ؓ提个NULL?q个规则也适合很多函数Q只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL倹{在q些中NVL函数时最重要的,因ؓ他能直接处理NULL|NVL有两个参?NVL(x1,x2),x1和x2都式表达式,当x1为null时返回X2,否则q回x1?/p>

下面我们看看emp数据表它包含了薪水、奖金两,需要计ȝ补偿?/p>

column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2


不是单的薪水和奖金加v来就可以了,如果某一行是null值那么结果就是nullQ比如下面的例子Q?/p>

update empset salary=(salary+bonus)*1.1


q个语句中,雇员的工资和奖金都将更新Z个新的|但是如果没有奖金Q即 salary + null,那么׃得出错误的结论,q个时候就要用nvl函数来排除null值的影响?/p>

所以正的语句是:

update empset salary=(salary+nvl(bonus,0)*1.1


3、单行字W串函数

单行字符串函数用于操作字W串数据Q他们大多数有一个或多个参数Q其中绝大多数返回字W串?/p>

ASCII()

c1是一字符Ԍq回c1W一个字母的ASCII码,他的逆函数是CHR()

SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122


CHR()[NCHAR_CS]

i是一个数字,函数q回十进制表C的字符?/p>

select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B


CONCAT(,)

c1,c2均ؓ字符Ԍ函数c2q接到c1的后面,如果c1为null,返回c2.如果c2为null,则返回c1Q如果c1、c2都ؓnullQ则q回null。他和操作符||q回的结果相?/p>

select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda
INITCAP()

c1Z字符丌Ӏ函数将每个单词的第一个字母大写其它字母小写返回。单词由I格Q控制字W,标点W号限制?/p>

select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici


INSTR(,[,[,]])

c1,c2均ؓ字符Ԍi,j为整数。函数返回c2在c1中第jơ出现的位置Q搜索从c1的第i个字W开始。当没有发现需要的字符时返?,如果i敎ͼ那么搜烦从叛_左进行,但是位置的计还是从左到叻Ii和j的缺省gؓ1?/p>

select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2


INSTRB(,[,i[,j])

与INSTR()函数一P只是他返回的是字节,对于单字节INSTRB(){于INSTR()?/p>

LENGTH()

c1为字W串Q返回c1的长度,如果c1为nullQ那么将q回null倹{?/p>

select LENGTH('Ipso Facto') ergo from dualergo10


LENGTHb()

与LENGTH()一Pq回字节?/p>

lower()

q回c的小写字W,l常出现在where子串中?/p>

select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite


LPAD(,[,])

c1,c2均ؓ字符Ԍi为整数。在c1的左侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ单空|参见RPAD?/p>

select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe


LTRIM(,)

把c1中最左边的字W去掉,使其W一个字W不在c2中,如果没有c2Q那么c1׃会改变?/p>

select LTRIM('Mississippi','Mis') from dualLTRppi


RPAD(,[,])

在c1的右侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ单空?其他与LPAD怼?/p>

RTRIM(,)

把c1中最双的字W去掉,使其W后一个字W不在c2中,如果没有c2Q那么c1׃会改变?/p>

REPLACE(,[,])

c1,c2,c3都是字符Ԍ函数用c3代替出现在c1中的c2后返回?/p>

select REPLACE('uptown','up','down') from dualREPLACEdowntown


STBSTR(,[,])

c1Z字符Ԍi,j为整敎ͼ从c1的第i位开始返回长度ؓj的子字符Ԍ如果j为空Q则直到串的N?/p>

select SUBSTR('Message',1,4) from dualSUBSMess


SUBSTRB(,[,])

与SUBSTR大致相同Q只是I,J是以字节计算?/p>

SOUNDEX()

q回与c1发音怼的词?/p>

select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250


TRANSLATE(,,)

c1中与c2相同的字W以c3代替

select TRANSLATE('fumble','uf','ar') test from dualTEXTramble


TRIM([[]] from c3)

c3串中的第一个,最后一个,或者都删除?/p>

select TRIM(' space padded ') trim from dual TRIMspace padded


UPPER()

q回c1的大写,常出现where子串?/p>

select name from dual where UPPER(name) LIKE 'KI%'NAMEKING


4、单行数字函?/p>

单行数字函数操作数字数据Q执行数学和术q算。所有函数都有数字参数ƈq回数字倹{所有三角函数的操作数和值都是弧度而不是角度,oracle没有提供内徏的弧度和角度的{换函数?/p>

ABS()

q回n的绝对?/p>

ACOS()

反余弦函敎ͼq回-1?之间的数。n表示弧度

select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0


ASIN()

反正弦函敎ͼq回-1?Qn表示弧度

ATAN()

反正切函敎ͼq回n的反正切|n表示弧度?/p>

CEIL()

q回大于或等于n的最整数?/p>

COS()

q回n的余玄|n为弧?/p>

COSH()

q回n的双曲余玄|n 为数字?/p>

select COSH(<1.4>) FROM dualCOSH(1.4)2.15089847


EXP()

q回e的nơ幂Qe=2.71828183.

FLOOR()

q回于{于N的最大整数?/p>

LN()

q回N的自然对敎ͼN必须大于0

LOG(,)

q回以n1为底n2的对?/p>

MOD()

q回n1除以n2的余?br /> POWER(,)

q回n1的n2ơ方

ROUND(,)

q回舍入数点右边n2位的n1的|n2的缺省gؓ0Q这回将数Ҏ接近的整敎ͼ如果n2数就舍入到小数点左边相应的位上,n2必须是整数?/p>

select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54


SIGN()

如果n敎ͼq回-1,如果n为正敎ͼq回1Q如果n=0q回0

SIN()

q回n的正玄?n为弧度?/p>

SINH()

q回n的双曲正玄?n为弧度?/p>

SQRT()

q回n的^Ҏ,n为弧?/p>

TAN()

q回n的正切?n为弧?/p>

TANH()

q回n的双曲正切?n为弧?/p>

TRUNC(,)

q回截尾到n2位小数的n1的|n2~省讄?Q当n2为缺省设|时会将n1截尾为整敎ͼ如果n2|截֜数点左边相应的位上?/p>

5、单行日期函?/p>

单行日期函数操作DATA数据cdQ绝大多数都有DATA数据cd的参敎ͼl大多数q回的也是DATA数据cd的倹{?/p>

ADD_MONTHS(,)

q回日期d加上i个月后的l果。i可以使Q意整数。如果i是一个小敎ͼ那么数据库将隐式的他转换成整敎ͼ会截去数点后面的部分?/p>

LAST_DAY()

函数q回包含日期d的月份的最后一?/p>

MONTHS_BETWEEN(,)

q回d1和d2之间月的数目,如果d1和d2的日的日期都相同Q或者都使该月的最后一天,那么返回一个整敎ͼ否则会返回的l果包含一个分数?/p>

NEW_TIME(,,)

d1是一个日期数据类型,当时区tz1中的日期和时间是dӞq回时区tz2中的日期和时间。tz1和tz2时字W串?/p>

NEXT_DAY(,)

q回日期d后由dowl出的条件的W一天,dow使用当前会话中给出的语言指定了一周中的某一天,q回的时间分量与d的时间分量相同?/p>

select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004


ROUND([,])

日期d按照fmt指定的格式舍入,fmt为字W串?/p>

SYADATE

函数没有参数Q返回当前日期和旉?/p>

TRUNC([,])

q回由fmt指定的单位的日期d
6、单行{换函?/p>

单行转换函数用于操作多数据类型,在数据类型之间进行{换?/p>

CHARTORWID()

c 使一个字W串Q函数将c转换为RWID数据cd?/p>

SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA')


CONVERT(,[,])

c֭W串Qdset、sset是两个字W集Q函数将字符串c由sset字符集{换ؓdset字符集,sset的缺省设|ؓ数据库的字符集?/p>

HEXTORAW()

x?6q制的字W串Q函数将16q制的x转换为RAW数据cd?/p>

RAWTOHEX()

x是RAW数据cd字符Ԍ函数RAW数据c{换ؓ16q制的数据类型?/p>

ROWIDTOCHAR()

函数ROWID数据cd转换为CHAR数据cd?/p>

TO_CHAR([[,)

x是一个data或number数据cdQ函数将x转换成fmt指定格式的char数据cdQ如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制q回的月份和日䆾所使用的语a。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定数位和千分位的分隔W,以及货币W号?/p>

NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"


TO_DATE([,[,)

c表示字符Ԍfmt表示一U特D格式的字符丌Ӏ返回按照fmt格式昄的c,nlsparm表示使用的语a。函数将字符串c转换成date数据cd?/p>

TO_MULTI_BYTE()

c表示一个字W串Q函数将c的担子截字符转换成多字节字符?/p>

TO_NUMBER([,[,)

c表示字符Ԍfmt表示一个特D格式的字符Ԍ函数q回值按照fmt指定的格式显C。nlsparm表示语言Q函数将q回c代表的数字?/p>

TO_SINGLE_BYTE()

字W串c中得多字节字W{化成{h的单字节字符。该函数仅当数据库字W集同时包含单字节和多字节字W时才?/p>

7、其它单行函?/p>

BFILENAME(,)


dir是一个directorycd的对象,fileZ文g名。函数返回一个空的BFILE位置值指C符Q函数用于初始化BFILE变量或者是BFILE列?/p>

DECODE(,,[,,,[])

x是一个表辑ּQm1是一个匹配表辑ּQx与m1比较Q如果m1{于xQ那么返回r1,否则,x与m2比较Q依ơ类推m3,m4,m5....直到有返回结果?/p>

DUMP(,[,[,[,]]])

x是一个表辑ּ或字W,fmt表示8q制?0q制?6q制、或则单字符。函数返回包含了有关x的内部表CZ息的VARCHAR2cd的倹{如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回?/p>

EMPTY_BLOB()

该函数没有参敎ͼ函数q回 一个空的BLOB位置指示W。函数用于初始化一个BLOB变量或BLOB列?/p>

EMPTY_CLOB()

该函数没有参敎ͼ函数q回 一个空的CLOB位置指示W。函数用于初始化一个CLOB变量或CLOB列?/p>

GREATEST()

exp_list是一列表辑ּQ返回其中最大的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,那么q回的结果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?br /> LEAST()

exp_list是一列表辑ּQ返回其中最的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,返回的l果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?/p>

UID

该函数没有参敎ͼq回唯一标示当前数据库用L整数?/p>

USER

q回当前用户的用户名

USERENV()

Zoptq回包含当前会话信息。opt的可选gؓQ?/p>

ISDBA  会话中SYSDBA脚色响应Q返回TRUE

SESSIONID  q回审计会话标示W?/p>

ENTRYID q回可用的审计项标示W?/p>

INSTANCE在会话连接后Q返回实例标C符。该值只用于q行Parallel 服务器ƈ且有 多个实例的情况下使用?/p>

LANGUAGEq回语言、地域、数据库讄的字W集?/p>

LANGq回语言名称的ISO~写?/p>

TERMINAL为当前会话用的l端或计机q回操作pȝ的标C符?/p>

VSIZE()            x是一个表辑ּ。返回x内部表示的字节数?/p>

二、SQL中的l函?/p>

l函C叫集合函敎ͼq回Z多个行的单一l果Q行的准数量无法确定,除非查询被执行ƈ且所有的l果都被包含在内。与单行函数不同的是Q在解析时所有的行都是已知的。由于这U差别ɾl函C单行函数有在要求和行Z有微的差异.

1、组(多行)函数

与单行函数相比,oracle提供了丰富的Zl的Q多行的函数。这些函数可以在select或select的having子句中用,当用于select子串时常帔R和GROUP BY一起用?/p>

AVG([{DISYINCT|ALL}])

q回数值的q_倹{缺省设|ؓALL

SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413


COUNT({*|DISTINCT|ALL} )

q回查询中行的数目,~省讄是ALL,*表示q回所有的行?/p>

MAX([{DISTINCT|ALL}])

q回选择列表目的最大|如果x是字W串数据cdQ他q回一个VARCHAR2数据cdQ如果X是一个DATA数据cdQ返回一个日期,如果X是numeric数据cdQ返回一个数字。注意distinct和all不v作用Q应为最大gq两U设|是相同的?/p>

MIN([{DISTINCT|ALL}])

q回选择列表目的最倹{?/p>

STDDEV([{DISTINCT|ALL}])

q回选者的列表目的标准差Q所谓标准差是方差的qx栏V?/p>

SUM([{DISTINCT|ALL}])

q回选择列表目的数值的d?/p>

VARIANCE([{DISTINCT|ALL}])

q回选择列表目的统计方差?/p>

2、用GROUP BYl数据分l?/p>

正如题目暗示的那L函数是操作那些已经分好l的数据Q我们告诉数据库用GROUP BY怎样l数据分l或者分c,当我们在SELECT语句的SELECT子句中用组函数Ӟ我们必须把ؓ分组或非常数列放|在GROUP BY子句中,如果没有用group byq行专门处理Q那么缺省的分类是将整个l果设ؓ一cR?/p>

select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982


在这个例子中Q我们用state字段分类;如果我们要将l果按照zip_codes排序,可以用ORDER BY语句QORDER BY子句可以使用列或l函数?/p>

select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982


3、用HAVING子句限制分组数据

现在你已l知道了在查询的SELECT语句和ORDER BY子句中用主函数Q组函数只能用于两个子串中,l函C能用于WHERE子串中,例如下面的查询是错误的:

错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk

q个语句中数据库不知道SUM()是什么,当我们需要指C数据库对行分组Q然后限制分l后的行的输出时Q正的Ҏ是用HAVING语句Q?/p>

SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)>10000;


4、嵌套函?/p>

函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可l承的执行过E。但函数的优先权只是Z位置Q函数遵循由内到外,由左到右的原则。嵌套技术一般用于象DECODEq样的能被用于逻辑判断语句IF....THEN...ELSE的函数?/p>

嵌套函数可以包括在组函数中嵌套单行函敎ͼ或者组函数嵌套入单行函数或l函C。比如下面的例子Q?/p>

SELECT deptno, GREATEST(COUNT(DISTINCT job),COUNT(DISTINCT mgr) cnt,COUNT(DISTINCT job) jobs,COUNT(DISTINCT mgr) mgrsFROM empGROUP BY deptno;DEPTNO CNT JOBS MGRS------ --- ---- ----10 4 4 220 4 3 430 3 3 2


 



LifeNote 2007-12-14 10:02 发表评论
]]>
Java 软gI间http://m.tkk7.com/lifenote/archive/2007/12/14/167656.htmlLifeNoteLifeNoteFri, 14 Dec 2007 01:23:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/14/167656.htmlhttp://m.tkk7.com/lifenote/comments/167656.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/14/167656.html#Feedback0http://m.tkk7.com/lifenote/comments/commentRss/167656.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/167656.html注册了一个网站,使用的是下面的这个空_常来|,无限I间大小完全免费Q上传速度很不错,感觉挺好推荐l大Ӟ来注册一个空间上传资料?br /> http://web.99081.com/sysweb/RegTrans.aspx?CodeProvider=sunxian99


LifeNote 2007-12-14 09:23 发表评论
]]>
Tapestry 开发笔讎ͼU篏Q?/title><link>http://m.tkk7.com/lifenote/archive/2007/12/13/167528.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Thu, 13 Dec 2007 08:21:00 GMT</pubDate><guid>http://m.tkk7.com/lifenote/archive/2007/12/13/167528.html</guid><wfw:comment>http://m.tkk7.com/lifenote/comments/167528.html</wfw:comment><comments>http://m.tkk7.com/lifenote/archive/2007/12/13/167528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/lifenote/comments/commentRss/167528.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lifenote/services/trackbacks/167528.html</trackback:ping><description><![CDATA[<p>====================================================================================<br /> ' 说明QTapestry 开发笔?br /> ' Note Author: Sunxianchao<br /> ' 阅读日期Q?nbsp;2007-9-18(北京.七彩?<br /> '====================================================================================<br /> <br /> <br /> <br /> '先做个小q告 免费的无限空间还可以是要积?下面是我的注册地址 直接注册可以了 奖励10个积?br /> http://web.99081.com/sysweb/RegTrans.aspx?CodeProvider=sunxian99<br /> ȝ帮忙一?多谢<br /> <br /> <br /> 【各U组Z用?br /> 说明Q只是说明一些需要注意的东西Q更多的学习参考Tapestry官方文档<br /> 1、For<br /> source:是对应的javac里的List 对象或者是个数l?需要抽?或者提供set getҎ<br /> value:是@环这个source对象代表当前的一?Q需要在page文g中设|问一个属性,可以不在对应的javac里有这个属?br /> index:是@环的索引?同value一?在page文g中设|一个属性即?<property name="index"/><br /> 在@环的时?会自动ؓvlaue和index赋当前的?/p> <p>2、Foreach 和For一样?/p> <p>3、Hiddenlg L多余S的处?br />  <input jwcid="@Hidden" type="hidden" value="ognl:blahblah" encode="false"/></p> <p><br /> 4?Insert lg <br /> e.g. <br />     <input type="text" jwcid="name@Insert" value="ognl:user.name"/> <br />     面表现?会到页面类中寻找getUser().getName()Ҏ获取初值ƈ输出 <br />     相当于在面上显C数?</p> <p>5?TextField lg <br /> e.g. <br />     <input type="text" jwcid="username@TextField" value="ognl:username"/> <br />     面表现?会到页面类中寻找getUsername()Ҏ获取初?<br />     *如果是修改信息页?通常初始D在页面表C前由setUsername()手动讄从数据库中读取出来的?<br />     表单提交?通过setUsername()写入新?即用戯入?,在类中通过getUsername()获取新?<br />     相当于在修改个h信息?首先d用户名赋予文本框(用户?初?用户修改时填入新?后台获取?<br />     *Hidden属性区分是普通文本输入框(默认false)和密码输入框(hidden="ognl:true") <br />     readonly属性设|只?readonly="true"为只?后台可读? <br />     *disabled属性设|是否可?diabled="true"Z可写(后台也不可读?</p> <p>6?TextArea lg <br /> e.g. <br />     <textarea jwcid="content@TextArea" value="ognl:content" cols="40" rows="10"></textarea> <br />     面表现?会到页面类中寻找getContent()Ҏ获取初?<br />     工作原理同TextField</p> <p>7?RadioGroup/Radio lg <br /> e.g. <br />     <span jwcid="headImage@RadioGroup" selected="ognl:headImage"> <br />       <input jwcid="@Radio" type="radio" value="1"/>头像1 <br />       <input jwcid="@Radio" type="radio" value="2"/>头像2 <br />       <input jwcid="@Radio" type="radio" value="3"/>头像3 <br />       <input jwcid="@Radio" type="radio" value="4"/>头像4 <br />       <input jwcid="@Radio" type="radio" value="5"/>头像5 <br />       <input jwcid="@Radio" type="radio" value="6"/>头像6 <br />     </span> <br />     RadioGroup为每一个Radio提供一个唯一的ID。RadioGroup跟踪当前被选中的属性|q且只有一个Radio能够被选中. <br />     面提交ӞRadioGrouplg利用OGNL表达式向headImage字段写入被选中的Radiolg的value参数? <br />     面表现?修改面),会到页面类中寻找getHeadImage()Ҏ获取初?然后L@Radiolg中与其相同的lgq勾选上.</p> <p>8?PropertySelection lg <br />     使用PropertySelectionlg必须要构造一个类来实现IPropertySelectionModel接口Qƈ且重写该接口?个方? <br />     public int getOptionCount() //提供下拉菜单的长?<br />     public Object getOption(int index) //提供select标签的option <br />     public String getLabel(int index) //提供select标签的Label|也就是下拉菜单显C的内容 <br />     public String getValue(int index) //提供select标签的value?<br />     public Object translateValue(String value) //selected后的q回|value值未必就是我们需要的q回|可以在这个方法里面对q回的value做对应的转换或修? <br /> e.g.1. 性别下拉?<br />     <select jwcid="gender@ProPertySelection" name="genderSelect" value="ognl:gender" model="supportedGender"> <br />       <option selected>先生</option> <br />       <option>奛_</option> <br />     </select> </p> <p><br /> 代码<br /> GenderSelectionModel.java   <br /> public class GenderSelectionModel implements IPropertySelectionModel {   <br />   <br />     public static final String male = "先生";   <br />   <br />     public static final String female = "奛_";   <br />   <br />     public static final String[] genderOptions = { male, female };   <br />   <br />     public int getOptionCount() {   <br />         return genderOptions.length;   <br />     }   <br />   <br />     public Object getOption(int index) {   <br />         return this.translateValue(genderOptions[index]);   <br />     }   <br />   <br />     public String getLabel(int index) {   <br />         return genderOptions[index].toString();   <br />     }   <br />   <br />     public String getValue(int index) {   <br />         return genderOptions[index];   <br />     }   <br />   <br />     public Object translateValue(String value) {   <br />         if (value.equals("先生")) {   <br />             return "1";   <br />         } else {   <br />             return "0";   <br />         }   <br />     }   <br /> }  </p> <p> </p> <p>代码<br /> ModUserInfo.java   <br /> public IPropertySelectionModel getSupportedGender() {   <br />     return new GenderSelectionModel();   <br /> }  </p> <p><br />     存入数据库中"1"代表先生,"0"代表奛_,通过translateValue(String value)Ҏ转换 <br />     面表现?通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedGender(). <br />     然后通过getGender()Ҏ获取初?比如获取"0",则在面昄时寻找valuegؓ"0"的选项即ؓ"奛_",q择之作为初始选择?</p> <p>e.g.2. 日志cd下拉?<br />     <select jwcid="logType@PropertySelection" name="typeSelect" value="ognl:logType" model="supportedType"> <br />       <option>心情日记</option> <br />       <option>情感天地</option> <br />       <option>生活感触</option> <br />     </select> </p> <p><br /> 代码<br /> TypeSelectionModel.java   <br /> public class TypeSelectionModel implements IPropertySelectionModel {   <br />        <br />     private List typeList = new ArrayList();   <br />   <br />     public TypeSelectionModel(List typeList) {   <br />         this.typeList = typeList;   <br />     }   <br />   <br />     public int getOptionCount() {   <br />         return typeList.size();   <br />     }   <br />   <br />     public Object getOption(int index) {   <br />         return ((LogType)typeList.get(index)).getValue();   <br />     }   <br />   <br />     public String getLabel(int index) {   <br />         return ((LogType) typeList.get(index)).getName();   <br />     }   <br />   <br />     public String getValue(int index) {   <br />         return ((LogType) typeList.get(index)).getValue();   <br />     }   <br />   <br />     public Object translateValue(String value) {   <br />         return value;   <br />     }   <br /> }  </p> <p> </p> <p>代码<br /> ModLog.java   <br /> public IPropertySelectionModel getSupportedType() {   <br />     TypeSelectionModel typeSelectionModel =    <br />                            new TypeSelectionModel(loadType(getUser().getUserId()));   <br />     return typeSelectionModel;   <br /> }   <br />   <br /> private List loadType(int userid) {   <br />     ...//从数据库载入该用L日志cd列表   <br /> }  </p> <p><br />     面表现?通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedType(). <br />     然后通过value属性给出的初始值即,getLogType()Ҏ获取初?比如获取"2",则在面昄时寻找valuegؓ"2"的选项即ؓ"生活感触",q择之作为初始选择?</p> <p>9?Formlg <br /> e.g. <br />     <form jwcid="logForm@Form"> <br />       ... <br />     </form> <br />     Form的监?listener)Ҏ可以有两U方? <br />       1. 在Formlg中声? <br />         <form jwcid="logForm@Form" listener="ognl:listener:onLogin"> <br />           ... <br />         </form> <br />       2. 在submitcdlg中声? <br />         <input type="submit" jwcid="onLogin@Submit" listener="listener:onLogin" value="发表"/>或?<br />         <span jwcid="@ImageSubmit" image="..." listener="listener:onLogin"><img src="..." width="" height=""/></span> <br />       前一U方式当Form中只要有submit׃触发监听Ҏ,后一U方式是Form中有多个submit,各自实现不同的监听方?</p> <p>G) Foreach lg <br /> e.g. <br />     <span jwcid="@Foreach" source="ognl:logList" value="ognl:item"> <br />     循环lg,遍历source参数,在表现其内容前更新value参数,Foreachlg所包含的内定w复表?其中可以通过value参数获取所需昄内容. <br />     本例?面表现旉过getLogList()Ҏ获取日志列表,循环取出其中数据更新item(日志对象)q予以显C?其中item需要在面规范(.page)文g中声? <br />     <property name="item"/> <br />     *class参数用来LcMCSS的文件对Foreachq行修饰. <br />     Foreachlg: class="ognl:beans.evenOdd.next" <br />     Page文g: <bean name="evenOdd" class="org.apache.tapestry.bean.EvenOdd"/> <br />     CSS文g: tr.odd{background-color: #ffffff;}tr.even{background-color: #eeeeee;}</p> <p>10?Conditional lg <br /> e.g. <br />     <span jwcid="@Conditional" condition='ognl:item.sex.equals("1")'>先生</span> <br />     <span jwcid="@Conditional" condition='ognl:item.sex.equals("0")'>奛_</span> <br />     conditional参数为true时运行Conditionallg中的HTML模板内容. <br />     在Tapestry4.0以后׃支持该组件了, 可以使用其他lg来实? <br />     1. Contrib:Choose和Contrib:When <br />     <library id="contrib" specification-path="classpath:/org/apache/tapestry/contrib/Contrib.library"/>(.application文g中引入Contribcd) <br />     <span jwcid="@contrib:Choose"> <br />       <span jwcid="@contrib:When" condition='ognl:user.gender.equals("1")'>先生</span> <br />       <span jwcid="@contrib:When" condition='ognl:user.gender.equals("0")'>奛_</span> <br />     </span> <br />     2. Iflg <br />     <span jwcid="@If" condition='ognl:item.sex.equals("1")'>先生</span> <br />     <span jwcid="@If" condition='ognl:item.sex.equals("0")'>奛_</span> <br />     3. Elselg<br />     <span jwcid="@Else">man</span> </p> <p>?===========================ts的函数执行顺?=======================================?br /> 对之前的该文章进行了一些修正,主要是针对finishLoad()Ҏ?<br /> 我觉得对初学者会有一些帮助?<br /> 下面q几个函数是我在使用的,它们的执行顺序依ơ从上到下?<br /> 1.protected void finishLoad() {} *** <br /> 2.public void pageValidate(PageEvent event) {} <br /> 3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {} <br /> 4.public void pageBeginRender(PageEvent event) {} <br /> // 如果有表单提交,则将form中的各字D늚Dl页面类 <br /> 5. ...... 赋?<br /> 6.public void submit() // 表单提交{用listenter:调用的方?<br /> 7.protected void prepareForRender(IRequestCycle cycle) {} <br /> ---------------------------------------------------- <br /> 1.protected void finishLoad() {} <br /> q个函数最先执行,但是它实际上没有什么用处(我感觉)。因为: <br />   q个函数只在面池中没有某一个页面类、需要生成一个新的页面对象时才调用。这里就有一个陷阱:如果你的tomcat启动时用了-Dorg.apache.tapestry.disable-caching=true(Z调试方便而设)Q那么你每次h面Ӟ它都会执行(因ؓ每个request都会新生成一个页面类对象Q,造成了它L执行的假象。在实际的部|时Q会使用cachingQ则q个函数执行的机会很。所以要注意?<br />   初始化的代码攑֜4 pageBeginRender()?<br /> 2.public void pageValidate(PageEvent event) {} <br /> 如果实现了PageValidateListener接口Q则可以在这里进行验证,比如讉K权限{。执行完1后,它就开始执行?<br /> 3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {} <br /> 如果实现了IExternalPage接口Q则可以从这里取得由外面传过来的参数。执?后,执行到这里。在q里可以把那些参数取出,赋给面cR?<br /> 4.public void pageBeginRender(PageEvent event) {} <br /> 执行?后,执行本函数。但是这时从客户端传q来的参数还没有被赋?如果提交了表单的?。这里可以进行一些初始化操作?<br /> 5.执行?后,如果有表单提交,在这里将会取出那些|赋给对应的字Dc?注意Q只是将表单中有的Dq来) <br /> 6.public void submit() <br /> 如果有表单提交的话,在这里将q行对应的操作。因为此时各字段已经取好gQ所以可以拿来直接用?<br /> 7.protected void prepareForRender(IRequestCycle cycle) {} <br /> 最后才执行q个Ҏ。我们可以在其中q行Z在页面上昄数据而进行的操作Q比如取得什么对象什么的Q因里页面类的属性赋值已l结束,可以直接拿来使用了?<br /> 注意Q如果执行了6Q则q要执行4Q再执行7。如果没?Q?完了q接是7?<br /> 以上是我所ȝ的执行顺序,不当之处h出?nbsp;      </p> <p>----------------------------------------------------- <br /> 最开始学tapestry的时候,觉得“怎么有这么多地方需要持久啊”。原来以前只知道pageBeginRenderq个函数Q什么初始化操作都放在它里面。可是它是在赋g前执行,所以拿到的字段多都是空的,却都以ؓ是没有持久化的缘故。所以在客户端里放了一大堆的@HiddenQ或者session中持久,非常ȝQ,Q对tapestry也生的怀疑。现在才知道那些需要取得客L传来的参数的代码Q最好放在prepareForRender里,很多不必要的持久都可以省掉了</p> <img src ="http://m.tkk7.com/lifenote/aggbug/167528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lifenote/" target="_blank">LifeNote</a> 2007-12-13 16:21 <a href="http://m.tkk7.com/lifenote/archive/2007/12/13/167528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>装了一个hibernate 整合spring 的dao对象http://m.tkk7.com/lifenote/archive/2007/12/10/166636.htmlLifeNoteLifeNoteMon, 10 Dec 2007 05:41:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/10/166636.htmlhttp://m.tkk7.com/lifenote/comments/166636.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/10/166636.html#Feedback7http://m.tkk7.com/lifenote/comments/commentRss/166636.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/166636.html 暂时没有写web?仅用了一个main试的hibernate 整合spring的部?框架大概是这L
StudentDAO l承AbstractService q个是我使用spring的hibernate摸板装好的和数据库讉K的方?br />                      实现StudentServer q个接口是和自己业务相关的方?在调用StudentDAO 的时候用接口指向子c?br />

public class Test {

    
/**
     * 
@param args
     * 
@throws QueryException 
     
*/

    
public static void main(String[] args) throws QueryException{
        
/**
         * 修改了配|文件用于测试hibernate整合spring是否正常
         
*/

        ApplicationContext context 
= new FileSystemXmlApplicationContext("src/applicationContext.xml"); 
        context.getBean(
"sessionFactory"); 
    
        StudentServer server 
= (StudentDAO) context.getBean("studentDAO"); 
        
        
/*        Student stu = new Student();
        stu.setStuname("qq22222222");
        stu.setAge(56);
        stu.setSex("?);
        stu.setPhone(555);
        //server.addStudentByCondition(stu);
        
        server.addStudent(stu);
*/

        List
<Student> list = server.getStudent("s""?/span>");
        
for(Student stu : list) 
            System.out.println(stu.getStuname());
        }

        
        
        
/**
         * 使用select  查询字段
         
        List<Object[]> list = server.getStudent("s", "?);
        for(Object[] c : list){
            for(Object a : c){
                System.out.print(a + "\t");
            }
            System.out.println();
        }
        
*/

    }

}


查询提供了两U方式,一U是使用DAODelegate提供的查询(q和普通的hibernate一LQ?br /> W二U方式是 装了一个查询类HqlQuery 具体使用例子中有?br />

Ҏ架提Z下几点:
1、我现在xAbstractService  q个cdspring注入的时候设|成为静态的 可以提高效率 但不知会有别的什么媄响?Q?q请哪个朋友指点一?十分感谢

2、StudentServer q个接口 和StudentDAOq个c?是一一对应?StudentDAOq个必须实现接口的方?而接口中定义和业务相关的方?StudentDAO在spring中注?调用时候用StudentServer 指向子类
但这L每在StudentServer 增加一个业务方法就要在dao实现cMd一?不知道这样好不好Q?
q请朋友们帮忙看?

3、因没有涉及到web开?但查询中~少分页查询Q正在整理,有好的分늻件请大家分n下我的邮?br /> sunxianchao@gmail.com

有什么好的徏议和提议请大家留a 十分感谢!!!

http://exs.mail.qq.com/cgi-bin/downloadfilepart?svrid=12&fid=644bd873e37da73f4ceeef5962b2eeae94fa6298069572c4
提取码:20dc1eb4
希望可以提出您的宝贵意见

 



LifeNote 2007-12-10 13:41 发表评论
]]>
getHibernateTemplate() 学习的疑?/title><link>http://m.tkk7.com/lifenote/archive/2007/12/10/166573.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Mon, 10 Dec 2007 01:54:00 GMT</pubDate><guid>http://m.tkk7.com/lifenote/archive/2007/12/10/166573.html</guid><wfw:comment>http://m.tkk7.com/lifenote/comments/166573.html</wfw:comment><comments>http://m.tkk7.com/lifenote/archive/2007/12/10/166573.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://m.tkk7.com/lifenote/comments/commentRss/166573.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lifenote/services/trackbacks/166573.html</trackback:ping><description><![CDATA[<p>         使用spring的HibernateTemplate q程中发现有很多Ҏ和直接用hibernate 查询的方法不?br /> 1、比如String hql = "select s from ShopInfo s where s.userId=:userid"; q个hql语句 使用hibernate查询<br /> Query query = this.getDaoDelegate().createQuery( hql ).setParameter("userid", userid);  q样得到一个query?可以通过setParameterҎ写对参数赋|可是通过HibernateTemplate  如何q行查询?br /> 2、用HibernateTemplate 的executeFind 和execute{方法的时候是q回一个HibernateCallback对象 要实现doInHibernateq个Ҏ q样查询的时候就都用了一个匿名函?br /> public List getAll(){<br />   return getHibernateTemplate().executeFind(new HibernateCallback() { <br />      public Object doInHibernate(Session s) { <br />         return s.createQuery("from Student").list(); <br />       } <br />     }); <br />  }<br /> 感觉q样很麻?有什么好的方法解决么 q请朋友多多指教 在线{?/p> <img src ="http://m.tkk7.com/lifenote/aggbug/166573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lifenote/" target="_blank">LifeNote</a> 2007-12-10 09:54 <a href="http://m.tkk7.com/lifenote/archive/2007/12/10/166573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring整合Hibernate 莫名其妙的错?http://m.tkk7.com/lifenote/archive/2007/12/07/165968.htmlLifeNoteLifeNoteFri, 07 Dec 2007 02:20:00 GMThttp://m.tkk7.com/lifenote/archive/2007/12/07/165968.htmlhttp://m.tkk7.com/lifenote/comments/165968.htmlhttp://m.tkk7.com/lifenote/archive/2007/12/07/165968.html#Feedback11http://m.tkk7.com/lifenote/comments/commentRss/165968.htmlhttp://m.tkk7.com/lifenote/services/trackbacks/165968.html
Hibernate: insert into test.student (STUNAME, AGE, SEX, PHONE) values (????)
java.lang.RuntimeException
    at com.stu.server.StudentServer.addStudentByCondition(StudentServer.java:
30)
    at com.stu.server.StudentServer$$FastClassByCGLIB$$8fef4d1a.invoke(
<generated>)
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:
149)
    at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:
696)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:
149)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:
106)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:
171)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:
631)
    at com.stu.server.StudentServer$$EnhancerByCGLIB$$f5f4d830.addStudentByCondition(
<generated>)
    at com.stu.test.Test.main(Test.java:
33)
Hibernate: update test.student set STUNAME
=?, AGE=?, SEX=?, PHONE=? where ID=?
q麻烦各位帮忙指点一?E序我上传上来了Q另外还请哪个大哥帮忙指E序的不之?

E序下蝲地址Q?a href="http://m.tkk7.com/Files/lifenote/HibernateInSpring.rar">http://m.tkk7.com/Files/lifenote/HibernateInSpring.rar

LifeNote 2007-12-07 10:20 发表评论
]]>
վ֩ģ壺 ձѵӰһ| avһĦ| ĻӰԺѹۿ| Ʒһ16| С˵| ޹Ƶֻ| ɫƷaһ| վѹۿ| պϵ | ŮƵվ| ˮĻӰ| ޳aƬ77777˾| Ʒ޾߹ۿ| ҹѸ| þþwwwëƬ| 2021߹ۿƵƷ| ˬˬƵ߹ۿ | ޳AƬ| ëƬaëƬѲ100| 99һ| ձѹۿ| ѾѾӰԺ߹ۿ| ƷϵƵ | ޳avƬ| Ƶ߹ۿӰԺ| ŷǾƷһ| ޾Ʒ| պϵ| AVƬ| һëƬ| ˾Ƶ| 㽶97ѹ| | Ů18Ƶ| ëƬѹۿƵ| ëƬƵ| պһ| Ѵѧ߹ۿp| ޹Ʒ߲| ҹAVëƬþ| ޾ƷëƬ|