??xml version="1.0" encoding="utf-8" standalone="yes"?>久久综合九色综合久99,中文字幕va一区二区三区,亚洲女色avhttp://www.aygfsteel.com/xzclog/category/17330.htmlzh-cnTue, 09 Aug 2011 21:11:52 GMTTue, 09 Aug 2011 21:11:52 GMT60Spring事务理与数据库q接http://www.aygfsteel.com/xzclog/archive/2011/08/09/356124.htmlxzcxzcTue, 09 Aug 2011 06:59:00 GMThttp://www.aygfsteel.com/xzclog/archive/2011/08/09/356124.htmlhttp://www.aygfsteel.com/xzclog/comments/356124.htmlhttp://www.aygfsteel.com/xzclog/archive/2011/08/09/356124.html#Feedback0http://www.aygfsteel.com/xzclog/comments/commentRss/356124.htmlhttp://www.aygfsteel.com/xzclog/services/trackbacks/356124.html转自Q?a >http://www.iteye.com/topic/11738
前几天解释了Spring的抽象事务机制。这ơ讲讲Spring中的DataSource 事务?
DataSource事务相关的类比较多,我们一步步来拨开其中的密团?

1 如何获得q接
看DataSourceUtils代码
Java代码 复制代码 收藏代码
  1. protected static Connection doGetConnection(DataSource dataSource, boolean allowSynchronization);   
  2.             throws SQLException {   
  3.            
  4.         ConnectionHolder conHolder = (ConnectionHolder); TransactionSynchronizationManager.getResource(dataSource);;   
  5.         if (conHolder != null); {   
  6.             conHolder.requested();;   
  7.             return conHolder.getConnection();;   
  8.         }   
  9.   
  10.            
  11.         Connection con = dataSource.getConnection();;   
  12.         if (allowSynchronization && TransactionSynchronizationManager.isSynchronizationActive();); {   
  13.                         conHolder = new ConnectionHolder(con);;   
  14.             TransactionSynchronizationManager.bindResource(dataSource, conHolder);;   
  15.             TransactionSynchronizationManager.registerSynchronization(new ConnectionSynchronization(conHolder, dataSource););;   
  16.             conHolder.requested();;   
  17.         }   
  18.   
  19.         return con;   
  20.     }  

原来q接是从TransactionSynchronizationManager中获取,如果TransactionSynchronizationManager中已l有了,那么拿过来然后调用conHolder.requested()。否则从原始的DataSourceq创Z个连接,攑ֈ一个ConnectionHolderQ然后再调用TransactionSynchronizationManager.bindResourcel定?
好,我们又遇C个新的类TransactionSynchronizationManager和ConnectionHolder和。l跟t?


2 TransactionSynchronizationManager
看其中的一些代?
Java代码 复制代码 收藏代码
  1. private static ThreadLocal resources = new ThreadLocal();;   
  2. public static Object getResource(Object key); {   
  3.         Map map = (Map); resources.get();;   
  4.         if (map == null); {   
  5.             return null;   
  6.         }   
  7.         Object value = map.get(key);;   
  8.                 return value;   
  9.     }   
  10. public static void bindResource(Object key, Object value); throws IllegalStateException {   
  11.         Map map = (Map); resources.get();;   
  12.                 if (map == null); {   
  13.             map = new HashMap();;   
  14.             resources.set(map);;   
  15.         }   
  16.         map.put(key, value);;   
  17.             }  
原来TransactionSynchronizationManager内部建立了一个ThreadLocal的resourcesQ这个resources又是和一个map联系在一LQ这个map在某个线E第一ơ调用bindResource时生成?
联系前面的DataSourceUtils代码Q我们可以ȝ出来?
某个U程使用DataSourceUtilsQ当W一ơ要求创接将在TransactionSynchronizationManager中创建出一个ThreadLocal的map。然后以DataSource作ؓ键,ConnectionHolder为值放到map中。等q个U程下一ơ再h的这个DataSource的时候,׃q个map中获取对应的ConnectionHolder。用map是ؓ了解军_一个线E上多个DataSource?
然后我们来看看ConnectionHolder又是什么?



3 对连接进行引用计?
看ConnectionHolder代码Q这个类很简单,看不Z所以然Q只好再ȝ父类代码ResourceHolderSupportQ我们感兴趣的是q两个方?
Java代码 复制代码 收藏代码
  1. public void requested(); {   
  2.         this.referenceCount++;   
  3.     }   
  4.   
  5.     public void released(); {   
  6.         this.referenceCount--;   
  7.     }  

看得是一个引用计数的技巧。原来Spring中对Connection是竟量用已创徏的对象,而不是每ơ都创徏一个新对象。这是DataSourceUtils?
Java代码 复制代码 收藏代码
  1. if (conHolder != null); {   
  2.             conHolder.requested();;   
  3.             return conHolder.getConnection();;   
  4.         }  
的原?


4 释放q接
完成事物后DataSourceTransactionManager有这L代码
Java代码 复制代码 收藏代码
  1. protected void doCleanupAfterCompletion(Object transaction); {   
  2.         DataSourceTransactionObject txObject = (DataSourceTransactionObject); transaction;   
  3.   
  4.         // Remove the connection holder from the thread.   
  5.         TransactionSynchronizationManager.unbindResource(this.dataSource);;   
  6.         txObject.getConnectionHolder();.clear();;   
  7.   
  8.         //...       DataSourceUtils.closeConnectionIfNecessary(con, this.dataSource);;   
  9.     }  

DataSourceUtils
Java代码 复制代码 收藏代码
  1. protected static void doCloseConnectionIfNecessary(Connection con, DataSource dataSource); throws SQLException {   
  2.         if (con == null); {   
  3.             return;   
  4.         }   
  5.   
  6.         ConnectionHolder conHolder = (ConnectionHolder); TransactionSynchronizationManager.getResource(dataSource);;   
  7.         if (conHolder != null && con == conHolder.getConnection();); {   
  8.             // It's the transactional Connection: Don't close it.   
  9.             conHolder.released();;   
  10.             return;   
  11.         }   
  12.            
  13.         // Leave the Connection open only if the DataSource is our   
  14.         // special data source, and it wants the Connection left open.   
  15.         if (!(dataSource instanceof SmartDataSource); || ((SmartDataSource); dataSource);.shouldClose(con);); {   
  16.             logger.debug("Closing JDBC connection");;   
  17.             con.close();;   
  18.         }   
  19.     }  

恍然大悟。如果事物完成,那么?
TransactionSynchronizationManager.unbindResource(this.dataSource);当前的ConnectionHolder
从TransactionSynchronizationManager上脱,然后doCloseConnectionIfNecessary。最后会把连接关闭掉?

5 两个辅助cJdbcTemplate和TransactionAwareDataSourceProxy
JdbcTemplate中的executeҎ的第一句和最后一?
Java代码 复制代码 收藏代码
  1. public Object execute(PreparedStatementCreator psc, PreparedStatementCallback action);   
  2.             throws DataAccessException {   
  3.   
  4.         Connection con = DataSourceUtils.getConnection(getDataSource(););;   
  5.         //其他代码   
  6.     DataSourceUtils.closeConnectionIfNecessary(con, getDataSource(););;   
  7.         }   
  8.     }  

作用不言自明了吧

从TransactionAwareDataSourceProxy中获取的q接是这个样子的
Java代码 复制代码 收藏代码
  1. public Connection getConnection(); throws SQLException {   
  2.         Connection con = DataSourceUtils.doGetConnection(getTargetDataSource();, true);;   
  3.         return getTransactionAwareConnectionProxy(con, getTargetDataSource(););;   
  4.     }  

万变不离其宗Q不q我们还是看看getTransactionAwareConnectionProxy
Java代码 复制代码 收藏代码
  1. protected Connection getTransactionAwareConnectionProxy(Connection target, DataSource dataSource); {   
  2.         return (Connection); Proxy.newProxyInstance(   
  3.                 ConnectionProxy.class.getClassLoader();,   
  4.                 new Class[] {ConnectionProxy.class},   
  5.                 new TransactionAwareInvocationHandler(target, dataSource););;   
  6.     }  

原来q回的是jdk的动态代理。l看TransactionAwareInvocationHandler
Java代码 复制代码 收藏代码
  1. public Object invoke(Object proxy, Method method, Object[] args); throws Throwable {   
  2.         //...           if (method.getName();.equals(CONNECTION_CLOSE_METHOD_NAME);); {   
  3.                 if (this.dataSource != null); {   
  4.                     DataSourceUtils.doCloseConnectionIfNecessary(this.target, this.dataSource);;   
  5.                 }   
  6.                 return null;   
  7.             }   
  8.   
  9.                     }  

TransactionAwareDataSourceProxy会先从DataSourceUtils获取q接。然后将q个q接用jdk的动态代理包一下返回。外部代码如果调用的q个冒牌的ConnectionQ就会先调用TransactionAwareInvocationHandler的invokeQ在q个invoke 中,完成原来调用DataSourceUtils的功能?

ȝ上面的流E?
Spring 对DataSourceq行事务理的关键在于ConnectionHolder和TransactionSynchronizationManager?
  0.先从TransactionSynchronizationManager中尝试获取连?
  1.如果前一步失败则在每个线E上Q对每个DataSouce只创Z个Connection
   2.q个Connection用ConnectionHolder包装hQ由TransactionSynchronizationManager理
  3.再次h同一个连接的时候,从TransactionSynchronizationManagerq回已经创徏的ConnectionHolderQ然后调用ConnectionHolder的request引用计?1
  4.释放q接时要调用ConnectionHolder的releasedQ将引用计数-1
  5.当事物完成后Q将ConnectionHolder从TransactionSynchronizationManager中解除。当谁都不用Q这个连接被close

以上所有都是可以调用DataSourceUtils化简代码Q而JdbcTemplate又是调用DataSourceUtils的。所以在Spring文档中要求尽量首先用JdbcTemplateQ其ơ是用DataSourceUtils来获取和释放q接。至于TransactionAwareDataSourceProxyQ那是下{的下策。不q可以将Spring事务理和遗留代码无~集成?

所以如某位朋友说要使用Spring的事务管理,但是又不想用JdbcTemplateQ那么可以考虑TransactionAwareDataSourceProxy。这个类是原来DataSource的代理?
其次Q想使用Spring事物Q又不想对Springq行依赖是不可能的。与其试图自己模拟DataSourceUtilsQ不如直接用现成的?


xzc 2011-08-09 14:59 发表评论
]]>
j2ee异常处理机制http://www.aygfsteel.com/xzclog/archive/2010/03/13/315329.htmlxzcxzcSat, 13 Mar 2010 03:59:00 GMThttp://www.aygfsteel.com/xzclog/archive/2010/03/13/315329.htmlhttp://www.aygfsteel.com/xzclog/comments/315329.htmlhttp://www.aygfsteel.com/xzclog/archive/2010/03/13/315329.html#Feedback0http://www.aygfsteel.com/xzclog/comments/commentRss/315329.htmlhttp://www.aygfsteel.com/xzclog/services/trackbacks/315329.htmlhttp://mofeichen.javaeye.com/blog/557426

异常的处理是每个JavaE序员时帔R对的问题Q但是很多h没有原则Q遇到异怹不知道如何去处理Q于是遇到检查异常就胡ؕtry...catch...一把,然后e.printStackTrace()一下了事,q种做法通常除了调试排错有点作用外,没Q何h倹{对于运行时异常Q则q脆|之不理?/p>

  原因是很多开发者缺乏对异常的认识和分析Q首先应该明白Java异常体系l构Q一U分层承的关系Q你必须对层ơ结构熟烂于心:

  Throwable(必须?

  Error(非必L?

  Exception(必须?

  RuntimeException(非必L?

  一般把Exception异常及其直接子类(除了RuntimeException之外)的异常称之ؓ查异常。把RuntimeException以及其子cȝ异常UC为非查异常,也叫q行时异常?/p>

  对于Throwable和ErrorQ则用的很少Q一般会用在一些基框架中,q里不做讨论?/p>

  下面针对J2EE的分层架构:DAO层、业务层、控制层、展C层的异常处理做个分析,q给Z般处理准则?/p>

  一、DAO层异常处?/span>

  如果你用了Spring的DAO模板来实玎ͼ则DAO层没有检查异常抛出,代码非常的优雅。但是,如果你的DAO采用了原始的JDBC来写Q这时候,你不能不对异常做处理了,因ؓ难以避免的SQLException会如影随形的跟着你。对已这UDAOU别的异常,异常了你又能如何?与其q样胡ؕtry...catch...Q囫囵吞枣消灭了异常不如让异总另外一U非查的方式向外传递。这样做好处有二Q?/p>

  1)、DAO的接口不被异常所污染Q假设你抛出了SQLExceptionQ以后要是换了Spring DAO模板Q那DAO接口׃再抛ZSQLExceptionQ这P你的接口抛出异常是Ҏ口的污染?/p>

  2)、DAO异常向外传播l更高层处理Q以便异常的错误原因不丢失,便于排查错误或进行捕获处理?/p>

  q里q有一个设计上常常令h困扰的问题:很多Z问,那定义一个什么样的异常抛出呢Q或者是直接抛出一个throw RuntimeException(e)? 对于q个问题Q需要分场合Q如果系l小Q你可以直接抛出一个throw RuntimeException(e)Q但对于一个庞大的多模块系l来_不要抛这U原生的非检查异常,而要抛出自定义的非检查异常,q样不但利于排错Q而且有利于系l异常的处理Q通常针对每一个模块,_粒度的定义一个运行时DAO异常。比如:throw new ModelXxxDAORuntimeException(".....",e)Q对于msg信息Q你可写也可不写Q根据需要灵zL出?/p>

  q里常见一个很愚昧的处理方式,为每个DAO定义一个异常,呵呵Q这L不篏啊,有多大意义,在Service层中调用时候,如果要捕Pq要捕获Z堆异常。这栯命的问题是代码؜乱,l护困难Q阅M困难QDAO的异常应该是_粒度的?/p>

  二、业务层异常处理

  习惯上把业务层称之ؓService层或者服务层QService层的代表的是业务逻辑Q不要迷信分太多太多层有多大好处Q除非需要,否则别盲目划分不必要的层Q层多Q效率越差,Ҏ需要够用就行了?/p>

  Service接口中的每个Ҏ代表一个特定的业务Q而这个业务一定是一个完整的业务Q通常会看C些傻X的做法,数据库事务配|在Service层,而Service的实现就是DAO的直接调用,然后在控制层(Action)中,调用了好多Serviced成一个业务,你气得已l无语了Q低头找砖头?!!

  搞明白以上两个问题后再回q头看异常怎么处理QService层通常依赖DAOQ而Service层的通常也会因ؓ调用别的非检查异常方法而必面对异常处理的问题Q这里和DAO层又有所不同Q彼一Ӟ此一时嘛!

  一般来说一个小模块对应一个ServiceQ当然也许有两个或多个,针对q个模块的Service定义一个非查异常,以应付那些不可避免的异常查,q个自定义异常可以简单的命名为XxxServiceRuntimeExceptionQ将捕获到的异常势转译为非查异常后抛出。我喜欢q么做,因ؓ前台是J2EE应用Q前台是web面Q它们的Struts2{框架会自动捕获所有Service层的异常Qƈ把异怺l开发者去自由处理?/p>

  但是q有一U情况,׃一些特D的限制Q如果某个异怸旦发生,必须做什么什么处理,而这U处理时性要求,或者调用某个ServiceҎQ必L查处理什么异常,也可以抛出非查的自定义异常,往往出现q种情况的是政治原因。不推崇q种做法Q但也不排斥?/p>

  MQ对于接口,可能不ȝ异常污染?

  三、控制层异常

  控制层说的简单些是常见的Action层,主要是控刉面请求的处理。控制层通常都依赖于Service层,现在比较行的框架对控制层做得都相当的到位,比如Struts2、SpringMVC{等Q他们的控制层框架会捕获业务层的所有异常,q在控制层中声明可能抛出ExceptionQ因此控制层一般不处理什么异常?/p>

  如果是控制层中因用了一些非查异常的ҎQ比如IO操作{,可以单处理下异常Q保证流的安全,q才是目的?/p>

  四、显C层异常处理

  对于面异常Q处理的方式多种多样Q一是不处理异常Q一旦异怺Q页面就报错。二是定义出错页面,Ҏ异常的类型以及所在的模块Q导航到出错面?/p>

  一般来_出错面是更友好的做法?/p>

  另外q有Ҏ的处理方式,展示面的模板可以捕获异常,q根据情况将异常信息铺到相应的位|,q样更友好了,不过复杂度较高?/p>

  怎么处理Q就看需要了?/p>

  五、ȝ

  1)、对于异常处理,应该从设计、需要、维护等多个角度l合考虑Q有一个通用准则Q千万别捕获了异总么事情都不干Q这样一旦出现异怺Q你没法依据异常信息来排错?/p>

  2)、对于J2EE多层架构pȝ来说Q尽可能避免(因抛出异常带来的)接口污染?/p>



xzc 2010-03-13 11:59 发表评论
]]>
proxoolq接池配|详l说?/title><link>http://www.aygfsteel.com/xzclog/archive/2010/01/30/311320.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 30 Jan 2010 04:02:00 GMT</pubDate><guid>http://www.aygfsteel.com/xzclog/archive/2010/01/30/311320.html</guid><wfw:comment>http://www.aygfsteel.com/xzclog/comments/311320.html</wfw:comment><comments>http://www.aygfsteel.com/xzclog/archive/2010/01/30/311320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/xzclog/comments/commentRss/311320.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/xzclog/services/trackbacks/311320.html</trackback:ping><description><![CDATA[     摘要: 目前市面上三个主连接池从性能上排名如下:proxool>c3p0>dbcpQproxoolq提供了可视化的q接池实时监控工P所以既E_又方便,配置也是非常Ҏ的事情。下面我来讲讲我如何配置proxoolq接池的?       1、下载相兌源?      从http://pr...  <a href='http://www.aygfsteel.com/xzclog/archive/2010/01/30/311320.html'>阅读全文</a><img src ="http://www.aygfsteel.com/xzclog/aggbug/311320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/xzclog/" target="_blank">xzc</a> 2010-01-30 12:02 <a href="http://www.aygfsteel.com/xzclog/archive/2010/01/30/311320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的三U连接池讄C3P0、Proxool和DBCP http://www.aygfsteel.com/xzclog/archive/2010/01/30/311319.htmlxzcxzcSat, 30 Jan 2010 04:00:00 GMThttp://www.aygfsteel.com/xzclog/archive/2010/01/30/311319.htmlhttp://www.aygfsteel.com/xzclog/comments/311319.htmlhttp://www.aygfsteel.com/xzclog/archive/2010/01/30/311319.html#Feedback0http://www.aygfsteel.com/xzclog/comments/commentRss/311319.htmlhttp://www.aygfsteel.com/xzclog/services/trackbacks/311319.html
Xml代码
  1. <!-- JDBC驱动E序 -->  
  2. <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/struts?useUnicode=true&characterEncoding=GBK</property> <!-- 数据库用户名 -->  
  3. <property name="connection.username">root</property> <!-- 数据库密?nbsp;-->  
  4. <property name="connection.password">8888</property>   


上面的一D配|,?span class="hilite2" style="background-color: #ffffff">c3p0
?span class="hilite1" style="background-color: #ffffff">dbcp中,都是必需的,因ؓhibernate会根据上q的配置来生成connectionsQ再交给c3p0?span class="hilite1" style="background-color: #ffffff">dbcp理.

1 C3P0

只需在hibernate.cfg.xml中加?
Xml代码
  1. <property name="c3p0.min_size">5</property>  
  2. <property name="c3p0.max_size">30</property>  
  3. <property name="c3p0.time_out">1800</property>  
  4. <property name="c3p0.max_statement">50</property>   


q有在classespath中加?span class="hilite2" style="background-color: #ffffff">c3p0
-0.8.4.5.jar


2 dbcp

在hibernate.cfg.xml中加?

Xml代码
  1. <property name="dbcp.maxActive">100</property>  
  2. <property name="dbcp.whenExhaustedAction">1</property>  
  3. <property name="dbcp.maxWait">60000</property>  
  4. <property name="dbcp.maxIdle">10</property>  
  5.   
  6. <property name="dbcp.ps.maxActive">100</property>  
  7. <property name="dbcp.ps.whenExhaustedAction">1</property>  
  8. <property name="dbcp.ps.maxWait">60000</property>  
  9. <property name="dbcp.ps.maxIdle">10</property>  

q有在classespath中加入commons-pool-1.2.jar 和commons-dbcp-1.2.1.jar.


3 proxool

׃数据库connection在较长时间没有访问下会自动断开q接Q导致浏览出错,增加proxool作ؓ数据库pool。它有自动连接功能?br /> 1)、从
http://proxool.sourceforge...下蝲proxoolQ释放proxool.jar到WEB-INF/lib

2)、在hibernate.cfg.xml中增加:
Xml代码
  1. <property name="hibernate.proxool.pool_alias">dbpool</property>  
  2. <property name="hibernate.proxool.xml">proxool.xml</property>  
  3. <property name="connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>  


3)、在与hibernate.cfg.xml同目录Qsrc根目录下Q增加proxool.xml文gQ?br />
Xml代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!-- the proxool configuration can be embedded within your own application's.   
  3.  Anything outside the "proxool" tag is ignored. -->  
  4. <something-else-entirely>  
  5.  <proxool>  
  6.    <alias>dbpool</alias>  
  7.    <!--proxool只能理p׃生的q接-->  
  8.    <driver-url>  
  9.      jdbc:mysql://127.0.0.1:3306/wlsh?characterEncoding=GBK&useUnicode=true&autoReconnect=true     </driver-url>  
  10.    <driver-class>com.mysql.jdbc.Driver</driver-class>  
  11.    <driver-properties>  
  12.        <property name="user" value="root" />  
  13.        <property name="password" value="123456" />  
  14.    </driver-properties>  
  15.    <!-- proxool自动侦察各个q接状态的旉间隔(毫秒),侦察到空闲的q接马上回?时的销?->  
  16.    <house-keeping-sleep-time>90000</house-keeping-sleep-time>  
  17.    <!-- 最保持的I闲q接?->  
  18.    <prototype-count>5</prototype-count>  
  19.    <!-- 允许最大连接数,过了这个连接,再有hӞ排在队列中{候,最大的{待h数由maximum-new-connections军_-->  
  20.    <maximum-connection-count>100</maximum-connection-count>  
  21.    <!-- 最连接数-->  
  22.    <minimum-connection-count>10</minimum-connection-count>  
  23.  </proxool>  
  24. </something-else-entirely>  

于在hibernate3.0中,已经不再支持dbcp了,hibernate的作者在hibernate.org中,明确指出在实践中发现dbcp?BUG,在某些种情会产生很多I接不能释放,所以抛弃了对dbcp的支持。至?/span>c3p0Q有评论说它的算法不是最优的Q因为网上查资料得知Q有|友做了一个实验,在同一目中分别用了几个常用的q接池,然后试其性能Q发?/span>c3p0占用资源比较大,效率也不高。所以,Z上述原因Q?/span>proxool不少行家推荐使用Q而且暂时来说Q是负面评h是最的一个。在三星中也有项目是?/span>proxool的?span style="color: #000000">从性能和出错率来说QproxoolE微比前两种好些?strong>C3P0Q稳定性似乎不错,在这斚wg有很好的口碑。至?strong style="color: black; background-color: #99ff99">性能Q应该不是最好的Q算是中规中矩的cd?
  Proxool的口似乎很好,不大见到负面的评P从官方资料上来看Q有许多有用的特性和特点Q也是许多h推荐的?/span>


xzc 2010-01-30 12:00 发表评论
]]>
spring获取webapplicationcontext,applicationcontext几种Ҏ详解 http://www.aygfsteel.com/xzclog/archive/2009/10/22/299410.htmlxzcxzcThu, 22 Oct 2009 10:02:00 GMThttp://www.aygfsteel.com/xzclog/archive/2009/10/22/299410.htmlhttp://www.aygfsteel.com/xzclog/comments/299410.htmlhttp://www.aygfsteel.com/xzclog/archive/2009/10/22/299410.html#Feedback0http://www.aygfsteel.com/xzclog/comments/commentRss/299410.htmlhttp://www.aygfsteel.com/xzclog/services/trackbacks/299410.html转自:http://www.aygfsteel.com/Todd/archive/2009/09/15/295112.html
Ҏ一Q在初始化时保存ApplicationContext对象
代码Q?br /> ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId");
说明Q这U方式适用于采用Spring框架的独立应用程序,需要程序通过配置文g手工初始化Spring的情c?/p>

Ҏ二:通过Spring提供的工L获取ApplicationContext对象
代码Q?br /> import org.springframework.web.context.support.WebApplicationContextUtils;
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
ac1.getBean("beanId");
ac2.getBean("beanId");
说明Q?br /> q种方式适合于采用Spring框架的B/SpȝQ通过ServletContext对象获取ApplicationContext对象Q然后在通过它获取需要的cd例?/p>

上面两个工具方式的区别是Q前者在获取p|时抛出异常,后者返回null?/span>

其中 servletContext sc 可以具体 换成 servlet.getServletContext()或?this.getServletContext() 或?request.getSession().getServletContext(); 另外Q由于spring是注入的对象攑֜ServletContext中的Q所以可以直接在ServletContext取出 WebApplicationContext 对象Q?WebApplicationContext webApplicationContext = (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

Ҏ三:l承自抽象类ApplicationObjectSupport
说明Q抽象类ApplicationObjectSupport提供getApplicationContext()ҎQ可以方便的获取到ApplicationContext?br /> Spring初始化时Q会通过该抽象类的setApplicationContext(ApplicationContext context)ҎApplicationContext 对象注入?/p>

Ҏ四:l承自抽象类WebApplicationObjectSupport
说明Q类g面方法,调用getWebApplicationContext()获取WebApplicationContext

Ҏ五:实现接口ApplicationContextAware
说明Q实现该接口的setApplicationContext(ApplicationContext context)ҎQƈ保存ApplicationContext 对象?br /> Spring初始化时Q会通过该方法将ApplicationContext对象注入?br />

在web应用中一般用ContextLoaderListener加蝲webapplication,如果需要在action之外或者controlcM外获取webapplication思\之一是,单独写个cL在static变量中,
cM于:
public class AppContext {

  
private static AppContext instance;

  
private AbstractApplicationContext appContext;

  
public synchronized static AppContext getInstance() {
    
if (instance == null) {
      instance 
= new AppContext();
    }
    
return instance;
  }

  
private AppContext() {
    
this.appContext = new ClassPathXmlApplicationContext(
        
"/applicationContext.xml");
  }

  
public AbstractApplicationContext getAppContext() {
    
return appContext;
  }
}

不过q样Q还是加载了2ơapplicationcontext,servlet一ơ,路径加蝲一ơ;觉得不如直接用\径加载,舍掉servlet加蝲
在网上也找了些其他说?实现ApplicationContextAwareQ,Q?接口Q或者servletcontextAware接口,q要写配|文件。有的竟然要把配|文仉?/span>listenerQ?span style="color: red">换成自己的类Q这L_多此一举。不q有的应用不是替换,是在补一个listenerQ?br /> 我在一版的jpetstoreQ具体那一版不知道Q里发现了这个:
[web.xml]?br />      
    <listener>
        
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    
</listener>
    
    
<listener>
        
<listener-class>com.ibatis.jpetstore.util.SpringInit</listener-class>
    
</listener>
其中SpringInit实现接口ServletContextListener Q?br />
package com.ibatis.jpetstore.util;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;


public class SpringInit implements ServletContextListener {
    

    
private static WebApplicationContext springContext;
    
    
public SpringInit() {
        
super();
    }
    
    
public void contextInitialized(ServletContextEvent event) {
        springContext 
= WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
    }
    

    
public void contextDestroyed(ServletContextEvent event) {
    }
    
    
public static ApplicationContext getApplicationContext() {
        
return springContext;
    }

    
}

在其中的一个bean的构造里SpringInit获取applicationcontext,代码Q?br />
  public OrderBean() {
    
this(
            (AccountService) SpringInit.getApplicationContext().getBean(
"accountService"),
            (OrderService) SpringInit.getApplicationContext().getBean(
"orderService") );
  }

恩,q种在action,servlet之外的bean里获取applicationcontext的方法值得参考,应该有用


xzc 2009-10-22 18:02 发表评论
]]>
Spring 2.5 标注开发的单例?/title><link>http://www.aygfsteel.com/xzclog/archive/2009/06/25/284109.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Thu, 25 Jun 2009 07:06:00 GMT</pubDate><guid>http://www.aygfsteel.com/xzclog/archive/2009/06/25/284109.html</guid><wfw:comment>http://www.aygfsteel.com/xzclog/comments/284109.html</wfw:comment><comments>http://www.aygfsteel.com/xzclog/archive/2009/06/25/284109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/xzclog/comments/commentRss/284109.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/xzclog/services/trackbacks/284109.html</trackback:ping><description><![CDATA[<p>研究了很久新出的 Spring 2.5, ȝ大致明白了如何用标注定义 Bean, 但是如何定义和注入类型ؓ java.lang.String ?bean 仍然未解? 希望得到高h帮助.</p> <p>ȝ来看 Java EE 5 的标注开发方式开来是得到了大家的认可?</p> <p>@Service 相当于定?bean, 自动Ҏ bean 的类名生成一个首字母写?bean</p> <p>@Autowired 则是自动注入依赖的类, 它会在类路径中找成员对应的类/接口的实现类, 如果扑ֈ多个, 需要用 @Qualifier("chineseMan") 来指定对应的 bean ?ID.<br /> </p> <p>一定程度上大大化了代码的编? 例如一对一?bean 映射现在完全不需要写M额外?bean 定义?<br /> </p> <p>下面是代码的q行l果:</p> <p>man.sayHello()=抽你丫的<br /> SimpleMan said: Hi<br /> org.example.EnglishMan@12bcd4b said: Fuck you! </p> <p> </p> <p>代码:</p> <p>beans.xml</p> <div> <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #0000ff"><?</span><span style="color: #800000">xml</span> <span style="color: #ff0000">version</span><span style="color: #0000ff">="1.0"</span> <span style="color: #ff0000">encoding</span><span style="color: #0000ff">="UTF-8"</span>?<span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">beans</span> <span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans"</span> <span style="color: #ff0000">xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span> <span style="color: #ff0000">xmlns:context</span><span style="color: #0000ff">="http://www.springframework.org/schema/context"</span> <span style="color: #ff0000">xsi:schemaLocation</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"</span><span style="color: #0000ff">></span> <span style="color: #0000ff"><</span><span style="color: #800000">context:annotation-config</span><span style="color: #0000ff">/></span> <span style="color: #0000ff"><</span><span style="color: #800000">context:component-scan</span> <span style="color: #ff0000">base-package</span><span style="color: #0000ff">="org.example"</span><span style="color: #0000ff">/></span> <span style="color: #0000ff"></</span><span style="color: #800000">beans</span><span style="color: #0000ff">></span></pre> </div> <p>试c?</p> <p>import org.example.IMan;<br /> import org.example.SimpleMan;<br /> import org.springframework.context.ApplicationContext;<br /> import org.springframework.context.support.ClassPathXmlApplicationContext; </p> <p>public class SpringTest {<br />     public static void main(String[] args) {<br />         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");<br />         SimpleMan dao = (SimpleMan) ctx.getBean("simpleMan");<br />         System.out.println(dao.hello());<br />         IMan man = (IMan) ctx.getBean("usMan");<br />         System.out.println(man.sayHello());<br />     }<br /> } </p> <p>自动探测和注入bean的类:</p> <p>package org.example; </p> <p>import org.springframework.beans.factory.annotation.Autowired;<br /> import org.springframework.beans.factory.annotation.Qualifier;<br /> import org.springframework.stereotype.Service; </p> <p>@Service<br /> public class SimpleMan {<br />     // 自动注入名称?Man ?Bean<br />     @Autowired(required = false)<br />     @Qualifier("chineseMan")<br />     //@Qualifier("usMan")<br />     private IMan man;    </p> <p>    /**<br />      * @return the man<br />      */<br />     public IMan getMan() {<br />         return man;<br />     } </p> <p>    /**<br />      * @param man the man to set<br />      */<br />     public void setMan(IMan man) {<br />         this.man = man;<br />     } </p> <p>    public String hello() {<br />         System.out.println("man.sayHello()=" + man.sayHello());<br />         return "SimpleMan said: Hi";<br />     }<br /> } </p> <p> </p> <p>一个接口和两个实现c?</p> <p>package org.example; </p> <p>/**<br /> * 抽象的h接口.<br /> * @author BeanSoft<br /> * @version 1.0<br /> */<br /> public interface IMan {<br />     /**<br />      * 打招呼的抽象定义.<br />      * @return 招呼的内容字W串<br />      */<br />     public String sayHello();<br /> } </p> <p> </p> <p>package org.example; </p> <p>import org.springframework.stereotype.Service; </p> <p>/**<br /> * 中国人的实现.<br /> * @author BeanSoft<br /> */<br /> @Service<br /> public class ChineseMan implements IMan { </p> <p>    public String sayHello() {<br />         return "抽你丫的";<br />     } </p> <p>} </p> <p>  </p> <p>package org.example; </p> <p>import org.springframework.stereotype.Service; </p> <p>/**<br /> * @author BeanSoft<br /> * 国大兵<br /> */<br /> @Service("usMan")<br /> // q里定义了一?id ?usMan ?Bean, 标注里面的属性是 bean ?id<br /> public class EnglishMan implements IMan { </p> <p>    public String sayHello() {<br />         return this + " said: Fuck you!";<br />     } </p> <p>} </p> <img src ="http://www.aygfsteel.com/xzclog/aggbug/284109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/xzclog/" target="_blank">xzc</a> 2009-06-25 15:06 <a href="http://www.aygfsteel.com/xzclog/archive/2009/06/25/284109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring中autowire属?/title><link>http://www.aygfsteel.com/xzclog/archive/2009/06/25/284065.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Thu, 25 Jun 2009 01:44:00 GMT</pubDate><guid>http://www.aygfsteel.com/xzclog/archive/2009/06/25/284065.html</guid><wfw:comment>http://www.aygfsteel.com/xzclog/comments/284065.html</wfw:comment><comments>http://www.aygfsteel.com/xzclog/archive/2009/06/25/284065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/xzclog/comments/commentRss/284065.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/xzclog/services/trackbacks/284065.html</trackback:ping><description><![CDATA[<table style="border-collapse: collapse; word-wrap: break-word" cellspacing="0" cellpadding="0" width="760" align="center" bgcolor="#ffffff" border="0"> <tbody> <tr> <td align="center" height="30"><font style="font-size: 14pt" color="#02368d"><strong>Spring中autowire属?/strong></font><br /> </td> </tr> <tr> <td align="center" height="9"><img height="9" alt="" src="http://blog.chinaunix.net/templates/default/images/right_line.gif" width="502" border="0" /></td> </tr> <tr> <td align="center"> <table style="border-collapse: collapse; word-wrap: break-word" cellspacing="0" cellpadding="0" width="740" border="0"> <tbody> <tr> <td width="740"> <div class="wmqeeuq" id="art" style="margin: 15px" width="560">default-autowire="x"<br /> x?个选择QbyName,byType,constructor和autodetect<br /> <br /> 我感觉byName和byType用的多点<br /> <br /> 1. byName:<br /> <br /> Service.java<br /> <table style="border-collapse: collapse" bordercolor="#999999" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" border="1"> <tbody> <tr> <td> <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">class</span> Service<br /> <span style="color: rgb(0,0,204)">{</span><br />     <span style="color: rgb(255,0,0)">Source</span> <span style="color: rgb(255,0,0)">source</span><span style="color: rgb(0,0,204)">;</span><br /> <br />     <span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">void</span> <span style="color: rgb(255,0,0)">setSource</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,0)">Source</span> <span style="color: rgb(255,0,0)">source</span><span style="color: rgb(0,0,204)">)</span><br />     <span style="color: rgb(0,0,204)">{</span><br />         <span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">source</span> <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(255,0,0)">source</span><span style="color: rgb(0,0,204)">;</span><br />     <span style="color: rgb(0,0,204)">}</span><br /> <span style="color: rgb(0,0,204)">}</span></span></code></p> </td> </tr> </tbody> </table> <br /> applicationContext.xml<br /> <table style="border-collapse: collapse" bordercolor="#999999" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" border="1"> <tbody> <tr> <td> <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,204)"><</span>beans <br /> </span></code></p> <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)">   ...</span></code></p> <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)">   default-autowire<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"byName"</span><span style="color: rgb(0,0,204)">></span><br />     <br />     <span style="color: rgb(0,0,204)"><</span>bean id<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"source"</span> class<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"cn.hh.spring.DBCPSource"</span> scope<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"prototype"</span><span style="color: rgb(0,0,204)">/</span><span style="color: rgb(0,0,204)">></span><br />     <span style="color: rgb(0,0,204)"><</span>bean id<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"service"</span> class<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"cn.hh.spring.Service"</span> scope<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"prototype"</span><span style="color: rgb(0,0,204)">></span><br />     <span style="color: rgb(0,0,204)"><</span><span style="color: rgb(0,0,204)">/</span>bean<span style="color: rgb(0,0,204)">></span><br /> <span style="color: rgb(0,0,204)"><</span><span style="color: rgb(0,0,204)">/</span>beans<span style="color: rgb(0,0,204)">></span></span></code></p> </td> </tr> </tbody> </table> <br /> <font size="2"><code style="color: rgb(0,1,2)">cn.hh.spring.DBCPSource实现了Source接口<br /> xml中ƈ没有l?bean service配Source属性,但在beans中设|了autowire="byName",q样配置文g会自动根?cn.hh.spring.Service 中的set<span style="color: rgb(255,1,2)">Source</span>找bean id="<span style="color: rgb(255,1,2)">Source</span>"的bean Q然后自动配上去Q如果没扑ֈ׃装配?br /> 注意QbyName的name是java中setXxxx 的Xxxx, 和上面设|的Source source中source拼写毫无关系Q完全可以是<br /> </code></font> <table style="border-collapse: collapse" bordercolor="#999999" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" border="1"> <tbody> <tr> <td> <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">class</span> Service<br /> <span style="color: rgb(0,0,204)">{</span><br />     <span style="color: rgb(255,0,0)">Source</span> <span style="color: rgb(255,0,0)">source1</span><span style="color: rgb(0,0,204)">;</span><br /> <br />     <span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">void</span> <span style="color: rgb(255,0,0)">setSource</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,0)">Source</span> <span style="color: rgb(255,0,0)">source1</span><span style="color: rgb(0,0,204)">)</span><br />     <span style="color: rgb(0,0,204)">{</span><br />         <span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">source1</span> <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(255,0,0)">source1</span><span style="color: rgb(0,0,204)">;</span><br />     <span style="color: rgb(0,0,204)">}</span><br /> <br /> <span style="color: rgb(0,0,204)">}</span></span></code></p> </td> </tr> </tbody> </table> <br /> l果相同?br /> <br /> 2. byType:<br /> <br /> Service.java同上<br /> <br /> applicationContext.xml<br /> <table style="border-collapse: collapse" bordercolor="#999999" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" border="1"> <tbody> <tr> <td> <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,204)"><</span>beans<br />    <span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span><br />    default-autowire<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"byType"</span><span style="color: rgb(0,0,204)">></span><br />    <br />     <span style="color: rgb(0,0,204)"><</span>bean id<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"dbcpSource"</span> class<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"cn.hh.spring.DBCPSource"</span> scope<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"prototype"</span><span style="color: rgb(0,0,204)">/</span><span style="color: rgb(0,0,204)">></span><br />     <span style="color: rgb(0,0,204)"><</span>bean id<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"service"</span> class<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"cn.hh.spring.Service"</span> scope<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"prototype"</span><span style="color: rgb(0,0,204)">></span><br />     <span style="color: rgb(0,0,204)"><</span><span style="color: rgb(0,0,204)">/</span>bean<span style="color: rgb(0,0,204)">></span><br /> <span style="color: rgb(0,0,204)"><</span><span style="color: rgb(0,0,204)">/</span>beans<span style="color: rgb(0,0,204)">></span></span></code></p> </td> </tr> </tbody> </table> <br /> 同样没有配置setSourceQautowireҎ "byType"Q配|文件会扑֮CSource接口的bean,q里 <font size="2"><code style="color: rgb(0,1,2)">cn.hh.spring.DBCPSource 实现了Source接口Q所以自动装配,如果没找到则不装配?br /> 如果同个配制文g中两个bean实现了Source接口Q则报错?br /> q里?Type是指setSource(<span style="color: rgb(255,1,2)">Source</span> source)中参数的cd?br /> <br /> </code></font>3. constructor: <br /> <br /> 试图在容器中L与需要自动装配的bean的构造函数参C致的一个或多个beanQ如果没扑ֈ则抛出异常?br /> <br /> <br /> 4. autodetect: <br /> <br /> 首先试使用constructor来自动装配,然后再?span style="color: rgb(255,1,2)">byType</span>方式?br /> </div> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <img src ="http://www.aygfsteel.com/xzclog/aggbug/284065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/xzclog/" target="_blank">xzc</a> 2009-06-25 09:44 <a href="http://www.aygfsteel.com/xzclog/archive/2009/06/25/284065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring的applicationContext.xml文ghttp://www.aygfsteel.com/xzclog/archive/2008/06/07/206514.htmlxzcxzcSat, 07 Jun 2008 05:48:00 GMThttp://www.aygfsteel.com/xzclog/archive/2008/06/07/206514.htmlhttp://www.aygfsteel.com/xzclog/comments/206514.htmlhttp://www.aygfsteel.com/xzclog/archive/2008/06/07/206514.html#Feedback1http://www.aygfsteel.com/xzclog/comments/commentRss/206514.htmlhttp://www.aygfsteel.com/xzclog/services/trackbacks/206514.htmlSpring的程序员们都有这L感觉QSpring把逻辑层封装的太完了Q个人感觉View层封装的不是很好Q。以至于有的初学者都不知道Spring配置文g的意思,拿来用了。所以今天我l大家详l解释一下Spring的applicationContext.xml文g。OkQ我q是通过代码加注释的方式为大家演C:
以下是详解Spring的applicationContext.xml文g代码Q?br /> <!-- 头文Ӟ主要注意一下编?-->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
 <!-- 建立数据?-->
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  <!-- 数据库驱动,我这里用的是Mysql数据?-->
  <property name="driverClassName">
   <value>com.mysql.jdbc.Driver</value>
  </property>
  <!-- 数据库地址Q这里也要注意一下编码,不然q可是很郁L哦! -->
  <property name="url">
   <value>
       jdbc:mysql://localhost:3306/tie?useUnicode=true&amp;characterEncoding=utf-8
   </value>
  </property>
  <!-- 数据库的用户?-->
  <property name="username">
   <value>root</value>
  </property>
  <!-- 数据库的密码 -->
  <property name="password">
   <value>123</value>
  </property>
 </bean>
 <!-- 把数据源注入lSession工厂 -->
 <bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource">
   <ref bean="dataSource" />
  </property>
  <!-- 配置映射文g -->
  <property name="mappingResources">
   <list>
    <value>com/alonely/vo/User.hbm.xml</value>
   </list>
  </property>
 </bean>
 <!-- 把Session工厂注入lhibernateTemplate -->
 <!-- 解释一下hibernateTemplateQhibernateTemplate提供了很多方便的ҎQ在执行时自动徏?HibernateCallback 对象Q例如:load()、get()、save、delete(){方法?-->

 <bean id="hibernateTemplate"
  class="org.springframework.orm.hibernate3.HibernateTemplate">
  <constructor-arg>
   <ref local="sessionFactory" />
  </constructor-arg>
 </bean>
 <!-- 把DAO注入lSession工厂 -->
 <bean id="userDAO" class="com.alonely.dao.UserDAO">
  <property name="sessionFactory">
   <ref bean="sessionFactory" />
  </property>
 </bean>
 <!-- 把Service注入lDAO -->
 <bean id="userService" class="com.alonely.service.UserService">
  <property name="userDAO">
   <ref local="userDAO" />
  </property>
 </bean>
 <!-- 把Action注入lService -->
 <bean name="/user" class="com.alonely.struts.action.UserAction">
  <property name="userService">
   <ref bean="userService" />
  </property>
 </bean>
</beans>
以上Spring的applicationContext.xml文g我是用的SSH架构Q如果您用Spring?a target="_blank">MVC架构Q其原理也是一L?

xzc 2008-06-07 13:48 发表评论
]]>
JdbcTemplate学习W记http://www.aygfsteel.com/xzclog/archive/2008/06/07/206512.htmlxzcxzcSat, 07 Jun 2008 05:37:00 GMThttp://www.aygfsteel.com/xzclog/archive/2008/06/07/206512.htmlhttp://www.aygfsteel.com/xzclog/comments/206512.htmlhttp://www.aygfsteel.com/xzclog/archive/2008/06/07/206512.html#Feedback0http://www.aygfsteel.com/xzclog/comments/commentRss/206512.htmlhttp://www.aygfsteel.com/xzclog/services/trackbacks/206512.html
Java代码 复制代码
  1. jdbcTemplate.execute("CREATE TABLE USER (user_id integer, name varchar(100))");  

2、如果是UPDATE或INSERT,可以用update()Ҏ?
Java代码 复制代码
  1. jdbcTemplate.update("INSERT INTO USER VALUES('"  
  2.            + user.getId() + "', '"  
  3.            + user.getName() + "', '"  
  4.            + user.getSex() + "', '"  
  5.            + user.getAge() + "')");  

3、带参数的更?
Java代码 复制代码
  1. jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?"new Object[] {name, id});  

Java代码 复制代码
  1. jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)"new Object[] {user.getId(), user.getName(), user.getSex(), user.getAge()});  

4、用JdbcTemplateq行查询Ӟ使用queryForXXX(){方?
Java代码 复制代码
  1. int count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM USER");  


Java代码 复制代码
  1. String name = (String) jdbcTemplate.queryForObject("SELECT name FROM USER WHERE user_id = ?"new Object[] {id}, java.lang.String.class);  


Java代码 复制代码
  1. List rows = jdbcTemplate.queryForList("SELECT * FROM USER");  


Java代码 复制代码
  1. List rows = jdbcTemplate.queryForList("SELECT * FROM USER");   
  2. Iterator it = rows.iterator();   
  3. while(it.hasNext()) {   
  4.     Map userMap = (Map) it.next();   
  5.     System.out.print(userMap.get("user_id") + "\t");   
  6.     System.out.print(userMap.get("name") + "\t");   
  7.     System.out.print(userMap.get("sex") + "\t");   
  8.     System.out.println(userMap.get("age") + "\t");   
  9. }  


JdbcTemplate我们用的JDBC的流E封装v来,包括了异常的捕捉、SQL的执行、查询结果的转换{等。spring大量使用Template Method模式来封装固定流E的动作QXXXTemplate{类别都是基于这U方式的实现?
除了大量使用Template Method来封装一些底层的操作l节Qspring也大量用callback方式cd调相关类别的Ҏ以提供JDBC相关cd的功能,使传l的JDBC的用者也能清楚了解spring所提供的相兛_装类别方法的使用?

JDBC的PreparedStatement
Java代码 复制代码
  1. final String id = user.getId();   
  2. final String name = user.getName();   
  3. final String sex = user.getSex() + "";   
  4. final int age = user.getAge();   
  5.   
  6. jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)",   
  7.                      new PreparedStatementSetter() {   
  8.                          public void setValues(PreparedStatement ps) throws SQLException {   
  9.                              ps.setString(1, id);   
  10.                              ps.setString(2, name);             
  11.                              ps.setString(3, sex);   
  12.                              ps.setInt(4, age);   
  13.                          }   
  14.                      });  


Java代码 复制代码
  1. final User user = new User();   
  2. jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?",   
  3.                     new Object[] {id},   
  4.                     new RowCallbackHandler() {   
  5.                         public void processRow(ResultSet rs) throws SQLException {   
  6.                             user.setId(rs.getString("user_id"));   
  7.                             user.setName(rs.getString("name"));   
  8.                             user.setSex(rs.getString("sex").charAt(0));   
  9.                             user.setAge(rs.getInt("age"));   
  10.                         }   
  11.                     });  




Java代码 复制代码
  1. class UserRowMapper implements RowMapper {   
  2.     public Object mapRow(ResultSet rs, int index) throws SQLException {   
  3.         User user = new User();   
  4.   
  5.         user.setId(rs.getString("user_id"));   
  6.         user.setName(rs.getString("name"));   
  7.         user.setSex(rs.getString("sex").charAt(0));   
  8.         user.setAge(rs.getInt("age"));   
  9.   
  10.         return user;   
  11.     }   
  12. }   
  13.   
  14. public List findAllByRowMapperResultReader() {   
  15.     String sql = "SELECT * FROM USER";   
  16.     return jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));   
  17. }  


在getUser(id)里面使用UserRowMapper
Java代码 复制代码
  1. public User getUser(final String id) throws DataAccessException {   
  2.     String sql = "SELECT * FROM USER WHERE user_id=?";   
  3.     final Object[] params = new Object[] { id };   
  4.     List list = jdbcTemplate.query(sql, params, new RowMapperResultReader(new UserRowMapper()));   
  5.   
  6.     return (User) list.get(0);   
  7. }  


|上攉
org.springframework.jdbc.core.PreparedStatementCreator q回预编译SQL 不能于Object[]一L
Java代码 复制代码
  1. public PreparedStatement createPreparedStatement(Connection con) throws SQLException {   
  2.  return con.prepareStatement(sql);   
  3. }  

1.增删?
org.springframework.jdbc.core.JdbcTemplate c?必须指定数据源dataSource)
Java代码 复制代码
  1. template.update("insert into web_person values(?,?,?)",Object[]);  

?
Java代码 复制代码
  1. template.update("insert into web_person values(?,?,?)",new PreparedStatementSetter(){ 匿名内部c?nbsp;只能讉K外部最l局部变?  
  2.   
  3.  public void setValues(PreparedStatement ps) throws SQLException {   
  4.   ps.setInt(index++,3);   
  5. });  

org.springframework.jdbc.core.PreparedStatementSetter 接口 处理预编译SQL
Java代码 复制代码
  1. public void setValues(PreparedStatement ps) throws SQLException {   
  2.  ps.setInt(index++,3);   
  3. }  

2.查询JdbcTemplate.query(String,[Object[]/PreparedStatementSetter],RowMapper/RowCallbackHandler)
org.springframework.jdbc.core.RowMapper 记录映射接口 处理l果?
Java代码 复制代码
  1. public Object mapRow(ResultSet rs, int arg1) throws SQLException {   int表当前行?  
  2.   person.setId(rs.getInt("id"));   
  3. }   
  4. List template.query("select * from web_person where id=?",Object[],RowMapper);  

org.springframework.jdbc.core.RowCallbackHandler 记录回调理器接?处理l果?
Java代码 复制代码
  1. template.query("select * from web_person where id=?",Object[],new RowCallbackHandler(){   
  2.  public void processRow(ResultSet rs) throws SQLException {   
  3.   person.setId(rs.getInt("id"));   
  4. });  


xzc 2008-06-07 13:37 发表评论
]]>
javad配置文g的几U方?/title><link>http://www.aygfsteel.com/xzclog/archive/2008/06/06/206354.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 06 Jun 2008 07:56:00 GMT</pubDate><guid>http://www.aygfsteel.com/xzclog/archive/2008/06/06/206354.html</guid><wfw:comment>http://www.aygfsteel.com/xzclog/comments/206354.html</wfw:comment><comments>http://www.aygfsteel.com/xzclog/archive/2008/06/06/206354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/xzclog/comments/commentRss/206354.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/xzclog/services/trackbacks/206354.html</trackback:ping><description><![CDATA[ 在现实工作中Q我们常帔R要保存一些系l配|信息,大家一般都会选择配置文g来完成,本文ҎW者工作中用到的读取配|文件的Ҏ小ȝ一下,主要叙述的是springd配置文g的方法? <div><strong>一.dxml配置文g</strong></div> <blockquote dir="ltr" style="margin-right: 0px"> <div>(一)新徏一个java bean(HelloBean.java) <div id="wmqeeuq" class="code_title">java 代码</div> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"></div> <ol class="dp-j"> <li id="wmqeeuq" class="alt"><span><span id="wmqeeuq" class="keyword">package</span><span> chb.demo.vo;   </span></span> <li id="wmqeeuq" class=""><span>  </span> <li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">class</span><span> HelloBean {   </span> <li id="wmqeeuq" class=""><span> </span><span id="wmqeeuq" class="keyword">private</span><span> String helloWorld;   </span> <li id="wmqeeuq" class="alt"><span>  </span> <li id="wmqeeuq" class=""><span> </span><span id="wmqeeuq" class="keyword">public</span><span> String getHelloWorld() {   </span> <li id="wmqeeuq" class="alt"><span>  </span><span id="wmqeeuq" class="keyword">return</span><span> helloWorld;   </span> <li id="wmqeeuq" class=""><span> }   </span> <li id="wmqeeuq" class="alt"><span>  </span> <li id="wmqeeuq" class=""><span> </span><span id="wmqeeuq" class="keyword">public</span><span> </span><span id="wmqeeuq" class="keyword">void</span><span> setHelloWorld(String helloWorld) {   </span> <li id="wmqeeuq" class="alt"><span>  </span><span id="wmqeeuq" class="keyword">this</span><span>.helloWorld = helloWorld;   </span> <li id="wmqeeuq" class=""><span> }   </span> <li id="wmqeeuq" class="alt"><span>}   </span> <li id="wmqeeuq" class=""><span>  </span> </li> </ol> </div> </div> <p>(?构造一个配|文?beanConfig.xml)</p> <div id="wmqeeuq" class="code_title">xml 代码</div> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"></div> <ol class="dp-xml"> <li id="wmqeeuq" class="alt"><span><span id="wmqeeuq" class="tag"><!--sp--><span id="wmqeeuq" class="tag-name">xml</span><span> </span><span id="wmqeeuq" class="attribute">version</span><span>=</span><span id="wmqeeuq" class="attribute-value">"1.0"</span><span> </span><span id="wmqeeuq" class="attribute">encoding</span><span>=</span><span id="wmqeeuq" class="attribute-value">"UTF-8"</span><span id="wmqeeuq" class="tag">?></span><span>  </span></span> </span> <li id="wmqeeuq" class=""><span><!--CTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" </sp--><span id="wmqeeuq" class="tag">></span><span>  </span> </span> <li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">beans</span><span id="wmqeeuq" class="tag">></span><span>  </span> <li id="wmqeeuq" class=""><span> </span><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">bean</span><span> </span><span id="wmqeeuq" class="attribute">id</span><span>=</span><span id="wmqeeuq" class="attribute-value">"helloBean"</span><span> </span><span id="wmqeeuq" class="attribute">class</span><span>=</span><span id="wmqeeuq" class="attribute-value">"chb.demo.vo.HelloBean"</span><span id="wmqeeuq" class="tag">></span><span>  </span> <li id="wmqeeuq" class="alt"><span>  </span><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">property</span><span> </span><span id="wmqeeuq" class="attribute">name</span><span>=</span><span id="wmqeeuq" class="attribute-value">"helloWorld"</span><span id="wmqeeuq" class="tag">></span><span>  </span> <li id="wmqeeuq" class=""><span>   </span><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">value</span><span id="wmqeeuq" class="tag">></span><span>Hello!chb!</span><span id="wmqeeuq" class="tag"><span id="wmqeeuq" class="tag-name">value</span><span id="wmqeeuq" class="tag">></span><span>  </span> </span> <li id="wmqeeuq" class="alt"><span>  </span><span id="wmqeeuq" class="tag"><span id="wmqeeuq" class="tag-name">property</span><span id="wmqeeuq" class="tag">></span><span>  </span> </span> <li id="wmqeeuq" class=""><span> </span><span id="wmqeeuq" class="tag"><span id="wmqeeuq" class="tag-name">bean</span><span id="wmqeeuq" class="tag">></span><span>  </span> </span> <li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="tag"><span id="wmqeeuq" class="tag-name">beans</span><span id="wmqeeuq" class="tag">></span><span>  </span> </span></li> </ol> </div> <p>(?dxml文g</p> <div>1.利用ClassPathXmlApplicationContext <div id="wmqeeuq" class="code_title">java 代码</div> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"></div> <ol class="dp-j"> <li id="wmqeeuq" class="alt"><span><span>ApplicationContext context = </span><span id="wmqeeuq" class="keyword">new</span><span> ClassPathXmlApplicationContext(</span><span id="wmqeeuq" class="string">"beanConfig.xml"</span><span>);   </span></span> <li id="wmqeeuq" class=""><span>HelloBean helloBean = (HelloBean)context.getBean(</span><span id="wmqeeuq" class="string">"helloBean"</span><span>);   </span> <li id="wmqeeuq" class="alt"><span>System.out.println(helloBean.getHelloWorld());  </span> </li> </ol> </div> </div> <div>2.利用FileSystemResourced</div> <div id="wmqeeuq" class="code_title">java 代码</div> <div> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"></div> <ol class="dp-j"> <li id="wmqeeuq" class="alt"><span><span>Resource rs = </span><span id="wmqeeuq" class="keyword">new</span><span> FileSystemResource(</span><span id="wmqeeuq" class="string">"D:/software/tomcat/webapps/springWebDemo/WEB-INF/classes/beanConfig.xml"</span><span>);   </span></span> <li id="wmqeeuq" class=""><span>  BeanFactory factory = </span><span id="wmqeeuq" class="keyword">new</span><span> XmlBeanFactory(rs);   </span> <li id="wmqeeuq" class="alt"><span>  HelloBean helloBean = (HelloBean)factory.getBean(</span><span id="wmqeeuq" class="string">"helloBean"</span><span>);\   </span> <li id="wmqeeuq" class=""><span>  System.out.println(helloBean.getHelloWorld());   </span> </li> </ol> </div> </div> <div></div> <div> 值得注意的是Q利用FileSystemResourceQ则配置文g必须攑֜project直接目录下,或者写明绝对\径,否则׃抛出找不到文件的异常</div> </blockquote> <div><strong>?dproperties配置文g</strong></div> <blockquote dir="ltr" style="margin-right: 0px"> <div>q里介绍两种技术:利用springdproperties 文g和利用java.util.Propertiesd</div> <div></div> <div></div> <div>(一)利用springdproperties 文g</div> <div></div> <div></div> <div>我们q利用上面的HelloBean.java文gQ构造如下beanConfig.properties文g: <div id="wmqeeuq" class="code_title">properties 代码</div> <div id="wmqeeuq" class="dp-highlighter"> <ol class="dp-css"> <li id="wmqeeuq" class="alt"><span><span>helloBean.class=chb.demo.vo.HelloBean   </span></span> <li id="wmqeeuq" class=""><span>helloBean.helloWorld=Hello!chb!  </span> </li> </ol> </div> </div> <div></div> <div>属性文件中?helloBean"名称xBean的别名设定,.class用于指定cL源?/div> <div>然后利用org.springframework.beans.factory.support.PropertiesBeanDefinitionReader来读取属性文? <div id="wmqeeuq" class="code_title">java 代码</div> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"></div> <ol class="dp-j"> <li id="wmqeeuq" class="alt"><span><span>BeanDefinitionRegistry reg = </span><span id="wmqeeuq" class="keyword">new</span><span> DefaultListableBeanFactory();   </span></span> <li id="wmqeeuq" class=""><span> PropertiesBeanDefinitionReader reader = </span><span id="wmqeeuq" class="keyword">new</span><span> PropertiesBeanDefinitionReader(reg);   </span> <li id="wmqeeuq" class="alt"><span> reader.loadBeanDefinitions(</span><span id="wmqeeuq" class="keyword">new</span><span> ClassPathResource(</span><span id="wmqeeuq" class="string">"beanConfig.properties"</span><span>));   </span> <li id="wmqeeuq" class=""><span> BeanFactory factory = (BeanFactory)reg;   </span> <li id="wmqeeuq" class="alt"><span> HelloBean helloBean = (HelloBean)factory.getBean(</span><span id="wmqeeuq" class="string">"helloBean"</span><span>);   </span> <li id="wmqeeuq" class=""><span> System.out.println(helloBean.getHelloWorld());   </span> </li> </ol> </div> </div> <div></div> <div> </div> <div>(?利用java.util.Propertiesd属性文?/div> <div></div> <div></div> <div>比如Q我们构造一个ipConfig.properties来保存服务器ip地址和端口,如: <div id="wmqeeuq" class="code_title">properties 代码</div> <div id="wmqeeuq" class="dp-highlighter"> <ol class="dp-css"> <li id="wmqeeuq" class="alt"><span><span>ip=192.168.0.1   </span></span> <li id="wmqeeuq" class=""><span>port=8080  </span> </li> </ol> </div> </div> <div></div> <div>则,我们可以用如下程序来获得服务器配|信息: <div id="wmqeeuq" class="code_title">java 代码</div> <div id="wmqeeuq" class="dp-highlighter"> <div id="wmqeeuq" class="bar"></div> <ol class="dp-j"> <li id="wmqeeuq" class="alt"><span><span>InputStream inputStream = </span><span id="wmqeeuq" class="keyword">this</span><span>.getClass().getClassLoader().getResourceAsStream(</span><span id="wmqeeuq" class="string">"ipConfig.properties"</span><span>);   </span></span> <li id="wmqeeuq" class=""><span>  Properties p = </span><span id="wmqeeuq" class="keyword">new</span><span> Properties();   </span> <li id="wmqeeuq" class="alt"><span>  </span><span id="wmqeeuq" class="keyword">try</span><span> {   </span> <li id="wmqeeuq" class=""><span>   p.load(inputStream);   </span> <li id="wmqeeuq" class="alt"><span>  } </span><span id="wmqeeuq" class="keyword">catch</span><span> (IOException e1) {   </span> <li id="wmqeeuq" class=""><span>   e1.printStackTrace();   </span> <li id="wmqeeuq" class="alt"><span>  }   </span> <li id="wmqeeuq" class=""><span>System.out.println(</span><span id="wmqeeuq" class="string">"ip:"</span><span>+p.getProperty(</span><span id="wmqeeuq" class="string">"ip"</span><span>)+</span><span id="wmqeeuq" class="string">",port:"</span><span>+p.getProperty(</span><span id="wmqeeuq" class="string">"port"</span><span>));  </span> </li> </ol> </div> </div> </blockquote> <div>本文只介l了一些简单操作,不当之处希望大家多多指教</div> <img src ="http://www.aygfsteel.com/xzclog/aggbug/206354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/xzclog/" target="_blank">xzc</a> 2008-06-06 15:56 <a href="http://www.aygfsteel.com/xzclog/archive/2008/06/06/206354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 生成Excel和PDF文g http://www.aygfsteel.com/xzclog/archive/2006/10/06/73538.htmlxzcxzcFri, 06 Oct 2006 07:07:00 GMThttp://www.aygfsteel.com/xzclog/archive/2006/10/06/73538.htmlhttp://www.aygfsteel.com/xzclog/comments/73538.htmlhttp://www.aygfsteel.com/xzclog/archive/2006/10/06/73538.html#Feedback0http://www.aygfsteel.com/xzclog/comments/commentRss/73538.htmlhttp://www.aygfsteel.com/xzclog/services/trackbacks/73538.htmlHTML面q不L向用hC数据输出的最好方式,有时候需要生成不可改变的文g打印QPDF可能是种不错的选择?br />
Spring支持从数据动态生成PDF或Excel文g

下面q个单实现的例子实现了spring输出PDF和Excel文gQؓ了用Excel电子表格Q你需要在你的classpath中加入poi-2.5.1.jar库文Ӟ而对PDF文gQ则需要iText.jar文g。它们都包含在Spring的主发布包中?br />
下面是测试项目代码:


1、控制器配置代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    
<bean id="beanNameViewResolver"
        class
="org.springframework.web.servlet.view.BeanNameViewResolver" />

    
<bean id="viewController" class="com.zhupan.spring.ViewController" />
    
<bean id="urlMapping"
        class
="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        
<property name="mappings">
            
<props>
                
<prop key="/view*.shtml">viewController</prop>
            
</props>
        
</property>
    
</bean>
</beans>

 3、用于Excel视图的视囑֭cd
Z在生成输出文档的q程中实现定制的行ؓQ我们将l承合适的抽象cR对于ExcelQ这包括提供一?org.springframework.web.servlet.view.document.AbstractExcelView的子c,q实?buildExcelDocumentҎ?br />
package com.zhupan.view;

import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.servlet.view.document.AbstractExcelView;


public class ViewExcel extends AbstractExcelView {

  
public void buildExcelDocument(
             Map model, HSSFWorkbook workbook,
             HttpServletRequest request, HttpServletResponse response)
    
throws Exception {
  
       HSSFSheet sheet 
= workbook.createSheet("list");
       sheet.setDefaultColumnWidth((
short12);
       
       
       HSSFCell cell 
= getCell(sheet, 00);
       setText(cell, 
"Spring Excel test");
  
       HSSFCellStyle dateStyle 
= workbook.createCellStyle();
       dateStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat(
"m/d/yy"));
       cell 
= getCell(sheet, 10);
       cell.setCellValue(
new Date());
       cell.setCellStyle(dateStyle);
       getCell(sheet, 
20).setCellValue(458);
  
       HSSFRow sheetRow 
= sheet.createRow(3);
       
for (short i = 0; i < 10; i++{
             sheetRow.createCell(i).setCellValue(i 
* 10);
       }


  }

  
}


4、用于PDF视图的视囑֭cd
需要象下面一L承org.springframework.web.servlet.view.document.AbstractPdfViewQƈ实现buildPdfDocument()Ҏ?
package com.zhupan.view;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.view.document.AbstractPdfView;

import com.lowagie.text.Document;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;

public class ViewPDF extends AbstractPdfView {
    
public void buildPdfDocument(Map model, Document document,
            PdfWriter writer, HttpServletRequest request,
            HttpServletResponse response) 
throws Exception {

        List list 
= (List) model.get("list");

        
for (int i = 0; i < list.size(); i++)
            document.add(
new Paragraph((String) list.get(i)));
    }


}

5、其他文?br />1Q控制器ViewController
package com.zhupan.spring;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import com.zhupan.view.ViewExcel;
import com.zhupan.view.ViewPDF;


public class ViewController extends MultiActionController{
     
     
public ModelAndView viewPDF(HttpServletRequest request, HttpServletResponse response) throws Exception {
       List list 
= new ArrayList();
       Map model
=new HashMap();
       list.add(
"test1");
       list.add(
"test2");
       model.put(
"list",list);
       ViewPDF viewPDF
=new ViewPDF();
       
return new ModelAndView(viewPDF,model);
  }

     
      
public ModelAndView viewExcel(HttpServletRequest request, HttpServletResponse response) throws Exception {
            List list 
= new ArrayList();
        Map model
=new HashMap();
        list.add(
"test1");
        list.add(
"test2");
        model.put(
"list",list);
        ViewExcel viewExcel
=new ViewExcel();
        
return new ModelAndView(viewExcel,model);
      }

}
2Qweb.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>

    
<display-name>springPDFTest</display-name>
    
<servlet>
        
<servlet-name>springPDFTest</servlet-name>
        
<servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        
</servlet-class>
        
<load-on-startup>1</load-on-startup>
    
</servlet>

    
<servlet-mapping>
        
<servlet-name>springPDFTest</servlet-name>
        
<url-pattern>*.shtml</url-pattern>
    
</servlet-mapping>

    
<welcome-file-list>
        
<welcome-file>index.jsp</welcome-file>
    
</welcome-file-list>

</web-app>

3)index.jsp
<%@ page contentType="text/html; charset=gb2312"%>

<href="viewPDF.shtml">PDF视图打开 </a>
<br>
<href="viewExcel.shtml">Excel视图打开</a>


xzc 2006-10-06 15:07 发表评论
]]>
Spring AOP Review http://www.aygfsteel.com/xzclog/archive/2006/08/19/64494.htmlxzcxzcSat, 19 Aug 2006 02:23:00 GMThttp://www.aygfsteel.com/xzclog/archive/2006/08/19/64494.htmlhttp://www.aygfsteel.com/xzclog/comments/64494.htmlhttp://www.aygfsteel.com/xzclog/archive/2006/08/19/64494.html#Feedback0http://www.aygfsteel.com/xzclog/comments/commentRss/64494.htmlhttp://www.aygfsteel.com/xzclog/services/trackbacks/64494.html阅读全文

xzc 2006-08-19 10:23 发表评论
]]>
վ֩ģ壺 | | | ޶| | ʡ| | | ֦| ٲ| | | ̫| | | | | | ɽ| ԫ| | ɽ| | | | | ͬ| ԭ| ߰| ̶| | | | | | | | ƽ| ׷| ƽԶ| |