??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成人套图,情趣视频网站在线免费观看,91午夜在线http://www.aygfsteel.com/WshmAndLily/category/20697.htmlzh-cnMon, 31 Dec 2007 01:49:31 GMTMon, 31 Dec 2007 01:49:31 GMT60Quartz的cron表达?/title><link>http://www.aygfsteel.com/WshmAndLily/articles/171333.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 28 Dec 2007 14:07:00 GMT</pubDate><guid>http://www.aygfsteel.com/WshmAndLily/articles/171333.html</guid><wfw:comment>http://www.aygfsteel.com/WshmAndLily/comments/171333.html</wfw:comment><comments>http://www.aygfsteel.com/WshmAndLily/articles/171333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/WshmAndLily/comments/commentRss/171333.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/WshmAndLily/services/trackbacks/171333.html</trackback:ping><description><![CDATA[一个cron表达式有臛_6个(也可?个)有空格分隔的旉元素?br /> <font size="2"></font> <h4 class="TextColor1" style="margin-bottom: 0px"><font size="2">按顺序依ơؓ</font> </h4> <h4 class="TextColor1" style="margin-bottom: 0px"><font size="2">U(0~59Q?/font> </h4> <div class="wmqeeuq" id="msgcns!FEB4FAFDF8FBDF68!105"> <p><font size="2">分钟Q?~59Q?/font> </p> <p><font size="2">时Q?~23Q?/font> </p> <p><font size="2">天(月)Q?~31Q但是你需要考虑你月的天敎ͼ</font> </p> <p><font size="2">月(0~11Q?/font> </p> <p><font size="2">天(星期Q(1~7 1=SUN ?SUNQMONQTUEQW(xu)EDQTHUQFRIQSATQ?/font> </p> <p><font size="2">7.q䆾Q?970Q?099Q?br /> <br /> <font color="#000000">其中每个元素可以是一个??),一个连l区?9-12),一个间隔时?8-18/4)(/表示每隔4时),一个列?1,3,5),通配W。由?月䆾中的日期"?星期中的日期"q两个元素互斥的,必须要对其中一个设|?.</font></font> </p> <p><font size="2">0 0 10,14,16 * * ? 每天上午10点,下午2点,4?br /> 0 0/30 9-17 * * ??? 朝九(ji)晚五工作旉内每半小?br /> </font><font size="2">0 0 12 ? * WED 表示每个星期三中?2?/font> </p> <p><font size="2">有些子表辑ּ能包含一些范围或列表</font> </p> <p><font size="2">例如Q子表达式(<strong>天(星期Q?/strong>Q可以ؓ “MON-FRI”Q?#8220;MONQW(xu)EDQFRI”Q?#8220;MON-WED,SAT”</font> </p> <p><font size="2">“*”字符代表所有可能的?/font> </p> <p><font size="2">因此Q?#8220;*”在子表达式(<strong>?/strong>Q里表示每个月的含义Q?#8220;*”在子表达式(<strong>天(星期Q?/strong>Q表C星期的每一?/font> </p> <p><font size="2"></font>?</p> <p><font size="2">“/”字符用来指定数值的增量</font> </p> <p><font size="2">例如Q在子表辑ּQ分钟)里的“0/15”表示从第0分钟开始,?5分钟</font> </p> <p><font size="2">?????? ? 在子表达式(分钟Q里?#8220;3/20”表示从第3分钟开始,?0分钟Q它?#8220;3Q?3Q?3”Q的含义一?/font> </p> <p><font size="2"><br /> “Q?#8221;字符仅被用于天(月)和天Q星期)两个子表辑ּQ表CZ指定?/font> </p> <p><font size="2">?个子表达式其中之一被指定了g后,Z避免冲突Q需要将另一个子表达式的D?#8220;Q?#8221;</font> </p> <p><font size="2"></font>?</p> <p><font size="2">“L” 字符仅被用于天(月)和天Q星期)两个子表辑ּQ它是单?#8220;last”的羃?/font> </p> <p><font size="2">但是它在两个子表辑ּ里的含义是不同的?/font> </p> <p><font size="2">在天Q月Q子表达式中Q?#8220;L”表示一个月的最后一?/font> </p> <p><font size="2">在天Q星期)自表辑ּ中,“L”表示一个星期的最后一天,也就是SAT</font> </p> <p><font size="2">如果?#8220;L”前有具体的内容,它就h其他的含义了</font> </p> <p><font size="2">例如Q?#8220;6L”表示q个月的倒数W6天,“QRQL”表示q个月的最一个星期五</font> </p> <p><font size="2">注意Q在使用“L”参数Ӟ不要指定列表或范_因ؓq会D问题</font> </p> </div> <img src ="http://www.aygfsteel.com/WshmAndLily/aggbug/171333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/WshmAndLily/" target="_blank">semovy</a> 2007-12-28 22:07 <a href="http://www.aygfsteel.com/WshmAndLily/articles/171333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quartz 在Spring中动态设|cronExpressionhttp://www.aygfsteel.com/WshmAndLily/articles/145634.htmlsemovysemovySun, 16 Sep 2007 13:36:00 GMThttp://www.aygfsteel.com/WshmAndLily/articles/145634.htmlhttp://www.aygfsteel.com/WshmAndLily/comments/145634.htmlhttp://www.aygfsteel.com/WshmAndLily/articles/145634.html#Feedback0http://www.aygfsteel.com/WshmAndLily/comments/commentRss/145634.htmlhttp://www.aygfsteel.com/WshmAndLily/services/trackbacks/145634.html阅读全文

semovy 2007-09-16 21:36 发表评论
]]>
Open Session In Viewhttp://www.aygfsteel.com/WshmAndLily/articles/143817.htmlsemovysemovySun, 09 Sep 2007 10:15:00 GMThttp://www.aygfsteel.com/WshmAndLily/articles/143817.htmlhttp://www.aygfsteel.com/WshmAndLily/comments/143817.htmlhttp://www.aygfsteel.com/WshmAndLily/articles/143817.html#Feedback0http://www.aygfsteel.com/WshmAndLily/comments/commentRss/143817.htmlhttp://www.aygfsteel.com/WshmAndLily/services/trackbacks/143817.html在没有?/font>Spring提供?/span>Open Session In View情况下,因需要在service(or Dao)层里?/span>session关闭Q所?/span>lazy loading ?/span>true的话Q要在应用层内把关系集合都初始化Q如 company.getEmployees()Q否?/span>Hibernate?/span>session already closed Exception;    Open Session In View提供了一U简便的Ҏ(gu)Q较好地解决?/span>lazy loading问题.

    它有两种配置方式OpenSessionInViewInterceptor?span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">OpenSessionInViewFilter(具体参看SpringSide)Q功能相同,只是一个在web.xml配置Q另一个在application.xml配置而已?/span>

    Open Session In View?/span>request?/span>sessionl定到当?/span>thread期间一直保?/span>hibernate session?/span>open状态,?/span>session?/span>request的整个期间都可以使用Q如?/span>View层里PO也可?/span>lazy loading数据Q如 ${ company.employees }。当View 层逻辑完成后,才会通过Filter?/span>doFilterҎ(gu)?/span>Interceptor?/span>postHandleҎ(gu)自动关闭session?/span> 

OpenSessionInViewInterceptor配置

<beans>
   
<bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
         
<property name="sessionFactory">
         
<ref bean="sessionFactory"/>
    
</property>
   
</bean>
   
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
       
<property name="interceptors">
         
<list>
            
<ref bean="openSessionInViewInterceptor"/>
       
</list>
     
</property>
     
<property name="mappings">
     ... 
    
</property>
   
</bean> ...
</beans> 

OpenSessionInViewFilter配置

<web-app>
 ... 
  
<filter>
     
<filter-name>hibernateFilter</filter-name>
     
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class>
     
<!-- singleSession默认为true,若设为false则等于没用OpenSessionInView -->
    
<init-param>
       
<param-name>singleSession</param-name>
       
<param-value>true</param-value>
    
</init-param>
  
</filter>
 ... 
  
<filter-mapping>
     
<filter-name>hibernateFilter</filter-name>
     
<url-pattern>*.do</url-pattern>
   
</filter-mapping>
 ... 
</web-app> 

很多人在使用OpenSessionInViewq程中提及一个错误:

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition 

看看OpenSessionInViewFilter里的opensessionҎ(gu)

protected Session openSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
    Session session 
= SessionFactoryUtils.getSession(sessionFactory, true);
    session.setFlushMode(FlushMode.NEVER);
    
return session;
}

    可以看到OpenSessionInViewFilter在getSession的时?会把获取回来的session的flush mode 设ؓFlushMode.NEVER。然后把该sessionFactoryl定到TransactionSynchronizationManagerQrequest的整个过E都使用同一个sessionQ在hq后再接除该sessionFactory的绑定,最?span class="me1">closeSessionIfNecessaryҎ(gu)该session是否已和transactionl定来决定是否关闭session。在q个q程中,若HibernateTemplate 发现自当前session有不是readOnly的transactionQ就会获取到FlushMode.AUTO SessionQҎ(gu)拥有写权限?/p>

    也即是,如果有不是readOnly的transaction可以由Flush.NEVER转ؓFlush.AUTO,拥有insert,update,delete操作权限Q如果没有transactionQƈ且没有另外h为地设flush model的话Q则doFilter的整个过E都是Flush.NEVER。所以受transaction保护的方法有写权限,没受保护的则没有?/p>

采用spring的事务声?使方法受transaction控制

    <bean id="baseTransaction" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"       abstract="true">
         
<property name="transactionManager" ref="transactionManager"/>
         
<property name="proxyTargetClass" value="true"/>
         
<property name="transactionAttributes">
             
<props>
                 
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                 
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
                 
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
                 
<prop key="save*">PROPAGATION_REQUIRED</prop>
                 
<prop key="add*">PROPAGATION_REQUIRED</prop>
                 
<prop key="update*">PROPAGATION_REQUIRED</prop>
                 
<prop key="remove*">PROPAGATION_REQUIRED</prop>
             
</props>
         
</property>
     
</bean>

     
<bean id="userService" parent="baseTransaction">
         
<property name="target">
             
<bean class="com.phopesoft.security.service.impl.UserServiceImpl"/>
         
</property>
    
</bean> 

对于上例Q则以save,add,update,remove开头的Ҏ(gu)拥有可写的事务,如果当前有某个方法,如命名ؓimportExcel()Q则因没有transaction而没有写权限Q这时若Ҏ(gu)内有insert,update,delete操作的话Q则需要手动设|flush model为Flush.AUTO,?/p>

session.setFlushMode(FlushMode.AUTO); 
session.save(user);  
session.flush(); 

     管Open Session In View看v来还不错Q其实副作用不少。看回上面OpenSessionInViewFilter的doFilterInternalҎ(gu)代码Q这个方法实际上是被父类的doFilter调用的,因此Q我们可以大U了解的OpenSessionInViewFilter调用程: request(h)->open sessionq开始transaction->controller->View(Jsp)->l束transactionqclose session.

     一切看h很正,其是在本地开发测试的时候没出现问题Q但试想下如果流E中的某一步被d的话Q那在这期间connection׃直被占用而不释放。最有可能被d的就是在写Jspq步Q一斚w可能是页面内容大Qresponse.write的时间长Q另一斚w可能是网速慢Q服务器与用户间传输旉久。当大量q样的情况出现时Q就有连接池q接不Q造成面假死现象?/p>

Open Session In View是个双刃剑,攑֜公网上内容多量大的|站h用?/p>

 

hibernate open session in view 抛出异常解决Ҏ(gu)

 在用open-session-in-view的时候,如果使用不当Q有可能抛出两种异常
1QNonUniqueObjectException
2Q在配合spring使用的时候会可能会抛出org.springframework.dao.InvalidDataAccessApiUsageException

先说1Q这个异常的抛出原因和解军_法见q里Q?br /> javaeye上有了很好的事例:http://www.javaeye.com/topic/11581
解决办法可以用mergeQ也可以别的办法?br /> 出现的原因,可以参考一下我前边的文章中merge和update的区别的内容?br /> http://www.aygfsteel.com/dreamstone/archive/2007/07/29/133071.html

2的解军_法:在这?br /> springside的一文章做了详l说?br /> http://calvin.blog.javascud.org/post/46.htm

好了Q现在问题解决了Q但关于open-session-in-view的用还有一些探讨,是否应该使用Q用的好处与坏处?br /> 见这两篇jdon上的文章:
http://www.jdon.com/jivejdon/thread/22374.html
http://www.jdon.com/jivejdon/thread/28955.html



semovy 2007-09-09 18:15 发表评论
]]>
Spring ?Hibernate 的gq加载和 Dao 模式http://www.aygfsteel.com/WshmAndLily/articles/143690.htmlsemovysemovySat, 08 Sep 2007 14:49:00 GMThttp://www.aygfsteel.com/WshmAndLily/articles/143690.htmlhttp://www.aygfsteel.com/WshmAndLily/comments/143690.htmlhttp://www.aygfsteel.com/WshmAndLily/articles/143690.html#Feedback0http://www.aygfsteel.com/WshmAndLily/comments/commentRss/143690.htmlhttp://www.aygfsteel.com/WshmAndLily/services/trackbacks/143690.html阅读全文

semovy 2007-09-08 22:49 发表评论
]]>
关于spring中的aop的解?/title><link>http://www.aygfsteel.com/WshmAndLily/articles/143446.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 07 Sep 2007 07:58:00 GMT</pubDate><guid>http://www.aygfsteel.com/WshmAndLily/articles/143446.html</guid><wfw:comment>http://www.aygfsteel.com/WshmAndLily/comments/143446.html</wfw:comment><comments>http://www.aygfsteel.com/WshmAndLily/articles/143446.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/WshmAndLily/comments/commentRss/143446.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/WshmAndLily/services/trackbacks/143446.html</trackback:ping><description><![CDATA[<p><font face="Arial">AOP是OOP的gl,是Aspect   Oriented   Programming的羃写,意思是面向斚w~程。AOP实际是GoF设计模式的gl,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这U目标的一U实现?/font></p> <p><font face="Arial">     举例Q假设有在一个应用系l中Q有一个共享的数据必须被ƈ发同时访问,首先Q将q个数据装在数据对象中Q称为Data   ClassQ同Ӟ有多个讉Kc,专门用于在同一时刻讉Kq同一个数据对象?br />   Z完成上述q发讉K同一资源的功能,需要引入锁Lock的概念,也就是说Q某个时刻,当有一个访问类讉Kq个数据对象Ӟq个数据对象必须上锁LockedQ用完后q卌锁unLockedQ再供其它访问类讉K?br />   使用传统的编E习(fn)惯,我们会创Z个抽象类Q所有的讉Kcȝ承这个抽象父c,如下Q?br /> abstract   class   Worker{<br />   abstract   void   locked();<br />   abstract   void   accessDataObject();<br />   abstract   void   unlocked();<br /> }<br /> <br />  ~点Q?/font></p> <p><font face="Arial">        *   accessDataObject()Ҏ(gu)需要有“?#8221;状态之cȝ相关代码?br />         *   Java只提供了单承,因此具体讉Kcd能承这个父c,如果具体讉Kc还要承其它父c,比如另外一个如Worker的父c,无法方便实现?br />         *   重用被打折扣Q具体访问类因ؓ也包?#8220;?#8221;状态之cȝ相关代码Q只能被重用在相x“?#8221;的场合,重用范围很窄?/font></p> <p><font face="Arial">            仔细研究q个应用?#8220;?#8221;Q它其实有下列特性:<br />         *   “?#8221;功能不是具体讉Kcȝ首要或主要功能,讉KcM要功能是讉K数据对象Q例如读取数据或更改动作?nbsp; </font></p> <p><font face="Arial">“?#8221;行ؓ其实是和具体讉Kcȝ主要功能可以独立、区分开来的</font></p> <p><font face="Arial">“?#8221;功能其实是这个系l的一个纵向切面,涉及许多cR许多类的方法?nbsp; </font></p> <p><font face="Arial"> 因此Q一个新的程序结构应该是xpȝ的纵向切面,例如q个应用?#8220;?#8221;功能Q这个新的程序结构就是aspectQ方面)<br />   在这个应用中Q?#8220;?#8221;斚wQaspectQ应该有以下职责Q?br />   提供一些必备的功能Q对被访问对象实现加锁或解锁功能。以保证所有在修改数据对象的操作之前能够调用lock()加锁Q在它用完成后Q调用unlock()解锁?br /> AOP应用范围</font></p> <p><font face="Arial">  很明显,AOP非常适合开发J2EE容器服务器,目前JBoss   4.0正是使用AOP框架q行开发?br />   具体功能如下Q?br /> Authentication   权限<br /> Caching   ~存<br /> Context   passing   内容传?br /> Error   handling   错误处理<br /> Lazy   loading 懒加?br /> Debugging  调试<br /> logging,   tracing,   profiling   and   monitoring 记录跟踪 优化 校准</font></p> <p><font face="Arial"><br /> Performance   optimization 性能优化<br /> Persistence  持久?br /> Resource   pooling 资源?br /> Synchronization 同步<br /> Transactions   事务<br /> AOP有必要吗Q?br />   当然Q上q应用范例在没有使用AOP情况下,也得C解决Q例如JBoss   3.XXX也提供了上述应用功能Q但是没有用AOP?br />   但是Q用AOP可以让我们从一个更高的抽象概念来理解Y件系l,AOP也许提供一U有价值的工具。可以这么说Q因Z用AOPl构Q现在JBoss   4.0的源码要比JBoss   3.XҎ(gu)理解多了Q这对于一个大型复杂系l来说是非常重要的?br />   从另外一个方面说Q好像不是所有的人都需要关心AOPQ它可能是一U架构设计的选择Q如果选择J2EEpȝQAOPx的上q通用斚w都已l被J2EE容器实现了,J2EE应用pȝ开发者可能需要更多地x行业应用斚waspect?/font></p> <img src ="http://www.aygfsteel.com/WshmAndLily/aggbug/143446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/WshmAndLily/" target="_blank">semovy</a> 2007-09-07 15:58 <a href="http://www.aygfsteel.com/WshmAndLily/articles/143446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring中配|二U缓?http://www.aygfsteel.com/WshmAndLily/articles/137244.htmlsemovysemovyThu, 16 Aug 2007 06:12:00 GMThttp://www.aygfsteel.com/WshmAndLily/articles/137244.htmlhttp://www.aygfsteel.com/WshmAndLily/comments/137244.htmlhttp://www.aygfsteel.com/WshmAndLily/articles/137244.html#Feedback0http://www.aygfsteel.com/WshmAndLily/comments/commentRss/137244.htmlhttp://www.aygfsteel.com/WshmAndLily/services/trackbacks/137244.html1.首先,在spring的hibernate配置?我的是applicationContext-hibernate.xml) 加上如下属?

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">         
  <property name="dataSource">
   <ref bean="dataSource"/>
  </property>
  <property name="mappingResources">
   <list>
    <value>org/appfteaching/model/TArticleclass.hbm.xml</value>
   </list>
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
          <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
          <prop key="hibernate.jdbc.fetch_size">${hibernate.jdbc.fetch_size}</prop>
          <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
          <prop key="hibernate.cache.use_query_cache">true</prop>
          <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
   </props>   
  </property>  
 </bean> 

2.其次,在src目录下的ehcache.xml中配|如下信?如果是默认ehcache.xml则会?lt;cache name="sampleCache1">?lt;cache name="sampleCache2>",L)

<cache name="org.hibernate.cache.StandardQueryCache"
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="300"
        timeToLiveSeconds="4200"
        overflowToDisk="true"
        />

    <!-- Sample cache named sampleCache2
        This cache contains 1000 elements. Elements will always be held in memory.
        They are not expired. -->

    <cache name="org.hibernate.cache.UpdateTimestampsCache"
        maxElementsInMemory="5000"
        eternal="true"
        timeToIdleSeconds="0"
        timeToLiveSeconds="0"
        overflowToDisk="false"
        />

3.你要缓存的model加进ehcache.xml?/p>

<cache name="org.appfteaching.model.TArticleclass"
     maxElementsInMemory="1000"
        eternal="false"
        timeToIdleSeconds="100"
        timeToLiveSeconds="4200"
        overflowToDisk="true"
     />  

4.最后一?在TArticleclass.hbm.xml里加?/p>

<cache usage="read-write"/>

启动Tomcat,如发现如下错?/p>

Could not find configuration [org.hibernate.cache.UpdateTimestampsCache]; using defaults.
Could not find configuration [org.hibernate.cache.StandardQueryCache]; using defaults.

则是W二步没有做,加上卛_.配置完毕



semovy 2007-08-16 14:12 发表评论
]]>
ApplicationContexthttp://www.aygfsteel.com/WshmAndLily/articles/136979.htmlsemovysemovyWed, 15 Aug 2007 09:15:00 GMThttp://www.aygfsteel.com/WshmAndLily/articles/136979.htmlhttp://www.aygfsteel.com/WshmAndLily/comments/136979.htmlhttp://www.aygfsteel.com/WshmAndLily/articles/136979.html#Feedback0http://www.aygfsteel.com/WshmAndLily/comments/commentRss/136979.htmlhttp://www.aygfsteel.com/WshmAndLily/services/trackbacks/136979.html   1. FileSystemXmlApplicationContext
           eg1. ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml"); //加蝲单个配置文g
           eg2.
                   String[] locations = {"bean1.xml", "bean2.xml", "bean3.xml"};
                   ApplicationContext ctx = new FileSystemXmlApplicationContext(locations ); //加蝲?font color=#333333>个配|文?br>           eg3.        
        ApplicationContext ctx =new FileSystemXmlApplicationContext("D:/project/bean.xml");//Ҏ(gu)具体路径加蝲文g
  2. ClassPathXmlApplicationContext
           eg1.  ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
           eg2.
                   String[] locations = {"bean1.xml", "bean2.xml", "bean3.xml"};
                   ApplicationContext ctx = new ClassPathXmlApplication(locations);
           注:其中FileSystemXmlApplicationContext和ClassPathXmlApplicationContext与BeanFactory的xml文g定位方式一hZ路径的?br>3. XmlWebApplicationContext
       eg1. ServletContext servletContext = request.getSession().getServletContext();    
            ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);



?: 一般是 ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());


 加蝲器目前有两种选择QContextLoaderListener和ContextLoaderServlet?
         q两者在功能上完全等同,只是一个是ZServlet2.3版本中新引入的Listener接口实现Q而另一个基于Servlet接口实现。开发中可根据目标Web容器的实际情况进行选择?

配置非常单,在web.xml中增加:
<listener>
       <listener-class>
          org.springframework.web.context.ContextLoaderListener
       </listener-class>
</listener>
或:
<servlet>
         <servlet-name>context</servlet-name>
         <servlet-class>
           org.springframework.web.context.ContextLoaderServlet
         </servlet-class>
         <load-on-startup>1</load-on-startup>
</servlet>


通过以上配置QW(xu)eb容器会自动加?WEB-INF/applicationContext.xml初始?
ApplicationContext实例Q如果需要指定配|文件位|,可通过context-param加以指定Q?
<context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/myApplicationContext.xml</param-value>
</context-param>

配置完成之后Q即可通过
WebApplicationContextUtils.getWebApplicationContextҎ(gu)在Web应用中获取ApplicationContext引用?

如:ApplicationContext ctx=WebApplicationContextUtils.getWebApplicationContext();
         LoginAction action=(LoginAction)ctx.getBean("action");



semovy 2007-08-15 17:15 发表评论
]]>
spring mail发?/title><link>http://www.aygfsteel.com/WshmAndLily/articles/116822.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 11 May 2007 09:58:00 GMT</pubDate><guid>http://www.aygfsteel.com/WshmAndLily/articles/116822.html</guid><wfw:comment>http://www.aygfsteel.com/WshmAndLily/comments/116822.html</wfw:comment><comments>http://www.aygfsteel.com/WshmAndLily/articles/116822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/WshmAndLily/comments/commentRss/116822.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/WshmAndLily/services/trackbacks/116822.html</trackback:ping><description><![CDATA[<p>package com.action;</p> <p>import java.util.ArrayList;<br>import java.util.Date;<br>import java.util.Iterator;<br>import java.util.List;</p> <p>import javax.activation.DataHandler;<br>import javax.activation.FileDataSource;<br>import javax.mail.Message;<br>import javax.mail.MessagingException;<br>import javax.mail.Multipart;<br>import javax.mail.internet.InternetAddress;<br>import javax.mail.internet.MimeBodyPart;<br>import javax.mail.internet.MimeMessage;<br>import javax.mail.internet.MimeMultipart;</p> <p>import org.springframework.context.ApplicationContext;<br>import org.springframework.context.support.FileSystemXmlApplicationContext;<br>import org.springframework.mail.SimpleMailMessage;<br>import org.springframework.mail.javamail.JavaMailSender;<br>import org.springframework.mail.javamail.MimeMessagePreparator;</p> <p> </p> <p>public class SpringMail {<br> public static void main(String[] args) throws Exception {<br>        ApplicationContext ctx = new FileSystemXmlApplicationContext(<br>                "applicationContext.xml");<br>        JavaMailSender sender = (JavaMailSender) ctx.getBean("mailSender");<br>        SpringMail springMail = new SpringMail();<br>        <br>        //试发送只有文本信息的单测?br>        springMail.sendTextMail(sender);<br>        <br>        //试发送带附g的邮?br>        springMail.sendMimeMessage(sender);<br>    }<br>    <br>    /** *//**<br>     * 试发送只有文本信息的单测?br>     * @param sender 邮g发送器<br>     * @throws Exception<br>     */<br>    private void sendTextMail(JavaMailSender sender) throws Exception {<br>        SimpleMailMessage mail = new SimpleMailMessage();<br>        mail.setTo("<a href="mailto:superman_wshm@126.com">superman_wshm@126.com</a>");<br>        mail.setFrom("<a href="mailto:superman_wshm@126.com">superman_wshm@126.com</a>");<br>        mail.setSubject("test by amigo");<br>        mail.setText("spring Mail的简单测?);<br>        sender.send(mail);<br>        <br>        System.out.println("成功发送文本文Ӟ");<br>    }<br>    <br>    /** *//**<br>     * 发送带附g的邮?br>     * @param sender 邮g发送器 <br>     * @throws Exception<br>     */<br>    private void sendMimeMessage(final JavaMailSender sender) throws Exception {<br>        //附g文g集合<br>        final List files = new ArrayList();<br>        MimeMessagePreparator mimeMail = new MimeMessagePreparator() {<br>            public void prepare(MimeMessage mimeMessage) throws MessagingException {<br>                mimeMessage.setRecipient(Message.RecipientType.TO, <br>                        new InternetAddress("<a href="mailto:superman_wshm@126.com">superman_wshm@126.com</a>"));<br>                mimeMessage.setFrom(new InternetAddress("<a href="mailto:superman_wshm@126.com">superman_wshm@126.com</a>"));<br>                mimeMessage.setSubject("Spring发送带附g的邮?, "gb2312"); <br>                <br>                Multipart mp = new MimeMultipart();<br>                <br>                //向Multipartd正文</p> <p>                MimeBodyPart content = new MimeBodyPart();<br>                content.setText("内含spring邮g发送的例子Q请查收!");<br>                <br>                //向MimeMessagedQMultipart代表正文Q?br>                mp.addBodyPart(content);<br>                files.add("com/action/SpringMail.java");<br>                files.add("applicationContext.xml");<br>                <br>                //向Multipartd附g<br>                Iterator it = files.iterator();<br>                while(it.hasNext()) {<br>                    MimeBodyPart attachFile = new MimeBodyPart();<br>                    String filename = it.next().toString();<br>                    FileDataSource fds = new FileDataSource(filename);<br>                    attachFile.setDataHandler(new DataHandler(fds));<br>                    attachFile.setFileName(fds.getName());<br>                    mp.addBodyPart(attachFile);<br>                }<br>                <br>                files.clear();<br>                <br>                //向MultipartdMimeMessage<br>                mimeMessage.setContent(mp);<br>                mimeMessage.setSentDate(new Date());<br>            }<br>        };</p> <p>        //发送带附g的邮?br>        sender.send(mimeMail);<br>        <br>        System.out.println("成功发送带附g邮g!");<br>    }</p> <p>}</p> <p><br>Spring配置文gapplicationContext.xml<br><br><?xml version="1.0" encoding="UTF-8"?><br><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a ></p> <p><beans><br> <bean id="mailSender"<br>  class="org.springframework.mail.javamail.JavaMailSenderImpl"><br>  <property name="host"><br>   <value>smtp.126.com</value><br>  </property><br>  <property name="javaMailProperties"><br>   <props><br>    <prop key="mail.smtp.auth">true</prop><br>    <prop key="mail.smtp.timeout">25000</prop><br>   </props><br>  </property><br>  <property name="username"><br>   <value>superman_wshm</value><br>  </property><br>  <property name="password"><br>   <value>******</value><br>  </property><br> </bean></p> <p><br></beans><br><br><br> 刚才发现一bugQ当附g名ؓ中文Ӟ会出C文ؕ码问题,对sendMimeMessageҎ(gu)q行了部分修改,如下Q?br>    </p> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">               <img src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">sun.misc.BASE64Encoder enc </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> sun.misc.BASE64Encoder();<br><img src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" align=top>                files.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">src/SpringMail.java</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" align=top>                files.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">src/applicationContext.xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" align=top>                files.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">src/谢星?xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" align=top>                <br><img src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" align=top>                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">向Multipartd附g</span><span style="COLOR: #008000"><br><img src="http://www.aygfsteel.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">                Iterator it </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> files.iterator();<br><img id=Codehighlighter1_342_772_Open_Image onclick="this.style.display='none'; Codehighlighter1_342_772_Open_Text.style.display='none'; Codehighlighter1_342_772_Closed_Image.style.display='inline'; Codehighlighter1_342_772_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_342_772_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_342_772_Closed_Text.style.display='none'; Codehighlighter1_342_772_Open_Image.style.display='inline'; Codehighlighter1_342_772_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>             </span><span style="COLOR: #0000ff">while </span><span style="COLOR: #000000">(it.hasNext()) </span><span id=Codehighlighter1_342_772_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif"></span><span id=Codehighlighter1_342_772_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.aygfsteel.com/Images/OutliningIndicators/InBlock.gif" align=top>                    MimeBodyPart attachFile </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> MimeBodyPart();<br><img src="http://www.aygfsteel.com/Images/OutliningIndicators/InBlock.gif" align=top>                    String filename </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> it.next().toString();<br><img src="http://www.aygfsteel.com/Images/OutliningIndicators/InBlock.gif" align=top>                    FileDataSource fds </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileDataSource(filename);<br><img src="http://www.aygfsteel.com/Images/OutliningIndicators/InBlock.gif" align=top>                    attachFile.setDataHandler(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> DataHandler(fds));<br><img src="http://www.aygfsteel.com/Images/OutliningIndicators/InBlock.gif" align=top>                    attachFile.setFileName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">=?GBK?B?</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">enc.encode(fds.getName().getBytes())</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">?=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.aygfsteel.com/Images/OutliningIndicators/InBlock.gif" align=top>                    mp.addBodyPart(attachFile);<br><img src="http://www.aygfsteel.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>                }</span></span></div> <img src ="http://www.aygfsteel.com/WshmAndLily/aggbug/116822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/WshmAndLily/" target="_blank">semovy</a> 2007-05-11 17:58 <a href="http://www.aygfsteel.com/WshmAndLily/articles/116822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring MVChttp://www.aygfsteel.com/WshmAndLily/articles/104190.htmlsemovysemovyFri, 16 Mar 2007 03:50:00 GMThttp://www.aygfsteel.com/WshmAndLily/articles/104190.htmlhttp://www.aygfsteel.com/WshmAndLily/comments/104190.htmlhttp://www.aygfsteel.com/WshmAndLily/articles/104190.html#Feedback0http://www.aygfsteel.com/WshmAndLily/comments/commentRss/104190.htmlhttp://www.aygfsteel.com/WshmAndLily/services/trackbacks/104190.html1.M设计

      MVC框架如Struts、WebworkQ都在Servlet的基上创Z一个自ql对I间Q在自己的空间里定义MVC世界和规则。无个世界定义得是否漂亮Q程序员都有一个学?fn)世界的q程?/p>

      而Spring MVC则完全保留着Servlet概念中的requestQresponse和sessionQƈ没有强制建立一个自q概念模型Q当Ӟ他也有很烂的SimpleFormControllerQ但你完全可以把它踢在一旁不)Q也不强刉要FormBean和一堆XML定义?/p>

      同时Q它透明完成了与Spring的集成,Multi-action的派发,提供了绑定request数据用的binder{基本API?/p>

      所以,如果想简单,使用Spring MVC的原始Ş态是一个很好的Q类gRoR中ActionPack的方案?/p>

      推荐使用一个Controller响应一l相兛_作的MultiActionController。同Ӟ虽然一点不喜欢FormController定义的概忉|型,但还是不影响发挥拿来MQ在共性比较明昑֐台管理模块,定义MultiActionFormControllerQ自动完成某些共同的Form程?/p>

      你还是很喜欢WebWork?好在我们也提供了sampleQ见2.4 WebWork ?/p>

2.写给在用其他MVC框架E序员的快速入?/h2>

      也许Q所有程序员都先放下自己框架里的概念模型Q还原回一个JSP/ServletE序员的角度Q思考一个JSP/Servlet框架需要的功能?/p>

     0. 配置文g

         Spring的配|文仉认ؓWEB-INF/xxxx-servelet.xml?/p>

         其中xxx为web.xml中org.springframework.web.servlet.DispatcherServlet的servlet-name?/p>

     1. 与Spring集成及IOC

          天然兮,由DispatcherServlet完成?/p>

      2. Action及Multi-Action 分发

          Spring按照配|文件定义的URLQMapping到具体Controllerc,再根据URL里的action= xxx或其他参敎ͼ利用反射调用Controller里对应的ActionҎ(gu)?/p>

      3. 输入数据l定

          Spring提供Binder 通过名字的一一对应反射l定PojoQ也可以直接从request.getParameter()取数据?/p>

          如果没有另外加入框架装Q需要手工调用Binder.

      4. 输入数据验证

          Sping 提供?a >Validator接口Q而Spring Moduleq整合了Commons-Validaor ?/p>

      5. l果数据攑֛View

          有个ModelAndView的概念,代表了返回的View名及数据(ModelQ一个Map)。可以用modelAndView.addObject()攑օ数据。当Ӟ也可以直接request.setAttribute()?/p>

      6. Interceptor

          AOP概念Q其实Servlet里面早有Filter概念Q不qInteceptor可以更灵zȝMappingQ另提供postHandle的插入点

          preHandle() handler开工之前?br />          postHandle() hander开工之后,但DispatchServletq没有渲染页面?br />          afterCompletion() 一切完工之后?br />        

      7. RedirectQForward面及Token防止重复提交?/strong>

          Spring提供 "redirect:index.jsp", "forward:index.jsp"q样的简写?/p>

          Spring Simple Form提供了防止重复提交的机制?/p>

      8. 如果想直接编写Responseq回字符? 而不是返回一个View

          函数的q回cd设ؓvoidQ用ss装?rendText(response,String text)函数?/p>

3.Spring MVC Multi-action

3.1 基本配置

   <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
        <property name="paramName">
            <value>method</value>
        </property>
        <property name="defaultMethodName">
            <value>index</value>         </property> </bean>

以上配置按xxx.do?method= list 调用controller的list()Ҏ(gu)

不过q要争取早日改ؓWeb2.0式的写法./book/list.htm 要优?book.do?action= list?/p>

其余配置和其他Spring MVC配置差不多,L(fng)bookstore-servlet.xmlQ留意下面几个关键节?br /><bean id="exceptionResolver">
<bean id="methodNameResolver">
<bean id="viewResolver">
<bean id="urlMapping">(留意最新的urlMapping写语?)

4.SpringSide BaseController

   l承于Spring的MultiActionController, 对其作了量扩展--主要是对数据l定的扩展,q加了一个SaveMessage函数?/p>

   1.Ҏ(gu)据绑定的扩展Q?/strong>

   a.InitBinder() 初始化BinderQ注册日期类q允许数字类为空?/p>

   b.对Bind and Validate函数的再包装
   本来Spring已有bind函数完成bind and validate, 但这个函C来没有用BindException作返回D是抛出一个ServletException只好自己另外实现一个bindObject()函数?/p>

   c.另外E稍扩展了一些函C其更好用?/p>

2.SaveMessage():

如果是redirect的关p,message信息攑֜request.attribute()׃丢失QSaveMessage()其攑֜session?br /> 配合messageFilterQ在渲染面前,把它从session又移回request?

5.后台理通用的BaseManageController

  Spring MVC中的SimpleFormController中的交互机制有值得参考的部分Q但其只有一个onSubmit函数不能很好的表达CRUD的语义,所以将两者结合成Multi-ActionFormController是比较好的方法。通过U定命名Q在基类实现l(f)ist()Qcreate(){函数和默认程Q而在子类实现onList(),onCreate()函数?/p>

   目前只是初步l合两者,q有很大的改q空间?/p>

   参考了RoR中的命名。BaseManageControllerx照此命名定义基类?/p>

  1. list 昄对象列表的页?/font>
  2. create新增对象的输入界?/div>
  3. edit 修改对象的输入界?/div>
  4. show 只读昄对象detai的页?/div>
  5. save 新增对象的保?/div>
  6. update 修改对象的保?/div>
  7. remove 删除单个对象
  8. removeAll 扚w删除对象
  9. query 查询


semovy 2007-03-16 11:50 发表评论
]]> վ֩ģ壺 Ͽ| | | | | ½| Ƕ| | | ¦| | ɽ| ˮ| | | | ԭ| ɼ| | | Ϫ| ͭ| | | ֵ| ̩| | | | ֹ| | ƽ| | Ҫ| ٹ| | ͺ| | | | Դ|