??xml version="1.0" encoding="utf-8" standalone="yes"?>色婷婷综合网,超碰97免费在线,国产一区网站http://www.aygfsteel.com/pdw2009/category/17723.htmlJ2EE相关应用技术日?/description>zh-cnMon, 26 May 2008 04:23:58 GMTMon, 26 May 2008 04:23:58 GMT60spring+atomikos+JTA完整例子http://www.aygfsteel.com/pdw2009/archive/2008/05/25/202725.html有猫怼的日?/dc:creator>有猫怼的日?/author>Sun, 25 May 2008 07:19:00 GMThttp://www.aygfsteel.com/pdw2009/archive/2008/05/25/202725.htmlhttp://www.aygfsteel.com/pdw2009/comments/202725.htmlhttp://www.aygfsteel.com/pdw2009/archive/2008/05/25/202725.html#Feedback0http://www.aygfsteel.com/pdw2009/comments/commentRss/202725.htmlhttp://www.aygfsteel.com/pdw2009/services/trackbacks/202725.html
    <!--Atomikos  JTA 事务 begin-->   
    
<bean id="dataSource1" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">   
        
<property name="uniqueResourceName">   
            
<value>mysql/main</value>   
        
</property>   
        
<property name="xaDataSourceClassName">   
            
<!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->   
            
<value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>   
        
</property>   
        
<property name="xaDataSourceProperties">   
            
<value>URL=jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8;user=root;password=123456</value>   
        
</property>   
        
<property name="exclusiveConnectionMode">   
            
<value>true</value>   
        
</property>   
        
<property name="connectionPoolSize">   
            
<value>3</value>   
        
</property>   
        
<property name="validatingQuery">   
            
<value>SELECT 1</value>   
        
</property>   
    
</bean>       
    
    
<bean id="dataSource2" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">   
        
<property name="uniqueResourceName">   
            
<value>mysql/secondary</value>   
        
</property>   
        
<property name="xaDataSourceClassName">   
            
<!-- 使用Mysql XADataSource(mysql>=5.0, Connector/J>=5.0才可以支持XADatasource)-->   
            
<value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>   
        
</property>
        
<property name="xaDataSourceProperties">   
            
<value>URL=jdbc:mysql://localhost:3306/aotsf?useUnicode=true&amp;characterEncoding=utf-8;user=root;password=123456</value>   
        
</property>
        
<property name="exclusiveConnectionMode">   
            
<value>true</value>   
        
</property>
        
<property name="connectionPoolSize">   
            
<value>3</value>   
        
</property>
        
<property name="validatingQuery">
            
<value>SELECT 1</value>   
        
</property>   
    
</bean>     
    
    
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">   
        
<property name="forceShutdown"><value>true</value></property>   
    
</bean>
    
       
    
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">   
        
<property name="transactionTimeout" value="300"/>    
    
</bean>
    
<bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">   
        
<property name="transactionManager">
            
<ref bean="atomikosTransactionManager"/>
        
</property>
        
<property name="userTransaction">
            
<ref bean="atomikosUserTransaction"/>
        
</property>
    
</bean>
    
     
<bean id="atomikosTransactionProxy"
          class
="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
          abstract
="true">
          
<property name="transactionManager">
               
<ref bean="springTransactionManager" />
          
</property>
          
<property name="transactionAttributes">
               
<props>
                
<prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
               
</props>
          
</property>
     
</bean>
    
    
    
<bean id="jdbcBookDAO" class="dao.jdbc.BookDAO">
        
<property name="dataSource">
            
<ref bean="dataSource1"/>
        
</property>
    
</bean>
    
    
<bean id="jdbcTestDAO" class="dao.jdbc.TestDAO">
        
<property name="dataSource">
            
<ref bean="dataSource2"/>
        
</property>
    
</bean>
    
    
<bean id="atomikosJTAServiceDemo" parent="atomikosTransactionProxy">
        
<property name="target">
            
<bean class="service.AtomikosJTAServiceDemo">
                
<property name="jdbcBookDAO">
                    
<ref bean="jdbcBookDAO"/>
                
</property>
                
<property name="jdbcTestDAO">
                    
<ref bean="jdbcTestDAO"/>
                
</property>                
            
</bean>
        
</property>
    
</bean>
    
    
    
<!--Atomikos  JTA 事务 end  -->

DAO层代?br />
package dao.jdbc;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;

import domain.Book;

public class BookDAO extends JdbcDaoSupport{
    
public void addBook(Book book){
        
try{
            JdbcTemplate jt
=getJdbcTemplate();
            String str_sql
="insert into Book(isbn,bookname,author,note)VALUES(?,?,?,?)";
            String[] args
={book.getIsbn(),book.getBookname(),book.getAuthor(),book.getNote()};
            jt.update(str_sql, args);
        }
catch(RuntimeException e){
            System.out.println(
"dBookp|");
            e.printStackTrace();
            
throw e;
        }
    }
}

package dao.jdbc;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;


public class TestDAO extends JdbcDaoSupport{
    
    
public void addBook(Integer id, String email){
        
try{
            JdbcTemplate jt
=getJdbcTemplate();
            String str_sql
="insert into test(id,email)VALUES(?,?)";
            Object[] args
={id,email};
            jt.update(str_sql, args);
        }
catch(RuntimeException e){
            System.out.println(
"dTestp|");
            e.printStackTrace();
            
throw e;
        }
    }
}

事层代码
package service;

import dao.jdbc.BookDAO;
import dao.jdbc.TestDAO;
import domain.Book;

public class AtomikosJTAServiceDemo {
    
private BookDAO jdbcBookDAO;
    
private TestDAO jdbcTestDAO;
    
    
public String ok(){
        System.out.println(
"开?img src="http://www.aygfsteel.com/Images/dot.gif" alt="" />.");
        jdbcTestDAO.addBook(Integer.valueOf(
"2"), "pdw2009  tom.com");
        
        Book book
=new Book();
        book.setIsbn(
"ccdada66");
        book.setAuthor(
"");
        book.setNote(
"JTA试");
        book.setBookname(
"Atomikos学习");
        jdbcBookDAO.addBook(book);
        
        System.out.println(
"l束.");
        
return "ok";
    }

    
public BookDAO getJdbcBookDAO() {
        
return jdbcBookDAO;
    }

    
public void setJdbcBookDAO(BookDAO jdbcBookDAO) {
        
this.jdbcBookDAO = jdbcBookDAO;
    }

    
public TestDAO getJdbcTestDAO() {
        
return jdbcTestDAO;
    }

    
public void setJdbcTestDAO(TestDAO jdbcTestDAO) {
        
this.jdbcTestDAO = jdbcTestDAO;
    }
    
    
}
试用例
package services;


import static org.junit.Assert.*;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import service.AtomikosJTAServiceDemo;

public class AtomikosJTAServiceDemoTest {
    ApplicationContext acx
=null;
    AtomikosJTAServiceDemo atomikosJTAServiceDemo
=null;
    @BeforeClass
    
public static void setUpBeforeClass() throws Exception {
    }

    @AfterClass
    
public static void tearDownAfterClass() throws Exception {
    }

    @Before
    
public void setUp() throws Exception {
        acx
=new ClassPathXmlApplicationContext("applicationContext.xml");
        atomikosJTAServiceDemo
=(AtomikosJTAServiceDemo) acx.getBean("atomikosJTAServiceDemo");
    }

    @After
    
public void tearDown() throws Exception {
    }
    
    @Test
    
public void notnullTest()throws Exception{
        assertNotNull(atomikosJTAServiceDemo);
    }
    @Test
    
public void okTest()throws Exception{
        assertEquals(atomikosJTAServiceDemo.ok(),
"ok");
        
    }
}



]]>
struts2和spring2整合Q{Q?/title><link>http://www.aygfsteel.com/pdw2009/archive/2007/10/24/155648.html</link><dc:creator>有猫怼的日?/dc:creator><author>有猫怼的日?/author><pubDate>Wed, 24 Oct 2007 09:54:00 GMT</pubDate><guid>http://www.aygfsteel.com/pdw2009/archive/2007/10/24/155648.html</guid><wfw:comment>http://www.aygfsteel.com/pdw2009/comments/155648.html</wfw:comment><comments>http://www.aygfsteel.com/pdw2009/archive/2007/10/24/155648.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/pdw2009/comments/commentRss/155648.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/pdw2009/services/trackbacks/155648.html</trackback:ping><description><![CDATA[<br /> <div style="margin-top: 1px; margin-left: 15px"> <h2><a title="怹链接Q整?Spring ?Strust2 一起工? >整合 Spring ?Strust2 一起工?/a> </h2> </div> <div style="margin-top: 5px; margin-left: 15px"><strong>关键?</strong>   struts2 spring     </div> <div style="margin-top: 10px; margin-left: 15px; overflow: auto"> <table width="100%"> <tbody> <tr> <td>在Struts2中整合Spring的IoC支持是一件十分简单的事情。让我们一步一步来实现Q?br /> 1Q复制struts2-spring-plugin-x-x-x.jar和相应的spring.jar?WEB-INF/lib目录下?br /> 2Q在struts.properties中设|struts.objectFactory属性?br /> <br /> <div id="wmqeeuq" class="code_title">struts.properties</div> <div id="wmqeeuq" class="dp-highlighter"> <ol class="dp-j"> <li id="wmqeeuq" class="alt"><span><span>struts.objectFactory = spring  </span></span> </li> </ol> </div> <p>或者是在XML文g中进行常量配|?/p> <div id="wmqeeuq" class="code_title">struts.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"><</span><span id="wmqeeuq" class="tag-name">struts</span><span id="wmqeeuq" class="tag">></span><span>  </span></span> <li id="wmqeeuq" class=""><span>    </span><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">constant</span><span> </span><span id="wmqeeuq" class="attribute">name</span><span>=</span><span id="wmqeeuq" class="attribute-value">"struts.objectFactory"</span><span> </span><span id="wmqeeuq" class="attribute">value</span><span>=</span><span id="wmqeeuq" class="attribute-value">"spring"</span><span> </span><span id="wmqeeuq" class="tag">/></span><span>  </span> <li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="tag"></</span><span id="wmqeeuq" class="tag-name">struts</span><span id="wmqeeuq" class="tag">></span><span>  </span> </li> </ol> </div> <p>3Q配|Spring监听?/p> <div id="wmqeeuq" class="code_title">web.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"><</span><span id="wmqeeuq" class="tag-name">listener</span><span id="wmqeeuq" class="tag">></span><span>  </span></span> <li id="wmqeeuq" class=""><span>    </span><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">listener-class</span><span id="wmqeeuq" class="tag">></span><span>org.springframework.web.context.ContextLoaderListener</span><span id="wmqeeuq" class="tag"></</span><span id="wmqeeuq" class="tag-name">listener-class</span><span id="wmqeeuq" class="tag">></span><span>  </span> <li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="tag"></</span><span id="wmqeeuq" class="tag-name">listener</span><span id="wmqeeuq" class="tag">></span><span>  </span> </li> </ol> </div> <p>通过Spring配置来注册对?/p> <div id="wmqeeuq" class="code_title">applicationContext.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"><?</span><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> <li id="wmqeeuq" class=""><span><!DOCTYPE beans PUBLIC    </span> <li id="wmqeeuq" class="alt"><span>    "-//SPRING//DTD BEAN//EN"   </span> <li id="wmqeeuq" class=""><span>    "http://www.springframework.org/dtd/spring-beans.dtd"</span><span id="wmqeeuq" class="tag">></span><span>  </span> <li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">beans</span><span> </span><span id="wmqeeuq" class="attribute">default-autowire</span><span>=</span><span id="wmqeeuq" class="attribute-value">"autodetect"</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">"hello"</span><span> </span><span id="wmqeeuq" class="attribute">class</span><span>=</span><span id="wmqeeuq" class="attribute-value">"hpfyeah.struts2.spring.HelloWorldAction"</span><span id="wmqeeuq" class="tag">/></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> </ol> </div> <p>当然你也可以拥有更多的Spring配置文g。在web.xml中进行下列设|,从而Spring的ApplicationContext通过匚w所l定模式的文件来初始化对?/p> <div id="wmqeeuq" class="code_title">web.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="comments"><!-- 用来定位Spring XML文g的上下文配置 --></span><span>  </span></span> <li id="wmqeeuq" class=""><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">context-param</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">param-name</span><span id="wmqeeuq" class="tag">></span><span>contextConfigLocation</span><span id="wmqeeuq" class="tag"></</span><span id="wmqeeuq" class="tag-name">param-name</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">param-value</span><span id="wmqeeuq" class="tag">></span> <li id="wmqeeuq" class=""><span id="wmqeeuq" class="tag">        </span><span>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</span> <li id="wmqeeuq" class=""><span>    </span><span id="wmqeeuq" class="tag"></</span><span id="wmqeeuq" class="tag-name">param-value</span><span id="wmqeeuq" class="tag">></span><span>  </span> <li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="tag"></</span><span id="wmqeeuq" class="tag-name">context-param</span><span id="wmqeeuq" class="tag">></span><span>  </span> </li> </ol> </div> <p>4Q修改你的Struts配置文g</p> <div id="wmqeeuq" class="code_title">struts.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><!DOCTYPE struts PUBLIC      </span></span> <li id="wmqeeuq" class=""><span>    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"      </span> <li id="wmqeeuq" class="alt"><span>    "http://struts.apache.org/dtds/struts-2.0.dtd"</span><span id="wmqeeuq" class="tag">></span><span>     </span> <li id="wmqeeuq" class=""><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">struts</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">include</span><span> </span><span id="wmqeeuq" class="attribute">file</span><span>=</span><span id="wmqeeuq" class="attribute-value">"struts-default.xml"</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">package</span><span> </span><span id="wmqeeuq" class="attribute">name</span><span>=</span><span id="wmqeeuq" class="attribute-value">"default"</span><span> </span><span id="wmqeeuq" class="attribute">extends</span><span>=</span><span id="wmqeeuq" class="attribute-value">"struts-default"</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">action</span><span> </span><span id="wmqeeuq" class="attribute">name</span><span>=</span><span id="wmqeeuq" class="attribute-value">"pureStruts"</span><span> </span><span id="wmqeeuq" class="attribute">class</span><span>=</span><span id="wmqeeuq" class="attribute-value">"hpfyeah.struts2.spring.HelloWorldAction"</span><span id="wmqeeuq" class="tag">></span> <li id="wmqeeuq" class=""><span>            </span><span id="wmqeeuq" class="tag"><</span><span id="wmqeeuq" class="tag-name">result</span><span id="wmqeeuq" class="tag">></span><span>hello.jsp</span><span id="wmqeeuq" class="tag"></</span><span id="wmqeeuq" class="tag-name">result</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">action</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">action</span><span> </span><span id="wmqeeuq" class="attribute">name</span><span>=</span><span id="wmqeeuq" class="attribute-value">"springStruts"</span><span> </span><span id="wmqeeuq" class="attribute">class</span><span>=</span><span id="wmqeeuq" class="attribute-value">"hello"</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">result</span><span id="wmqeeuq" class="tag">></span><span>hello.jsp</span><span id="wmqeeuq" class="tag"></</span><span id="wmqeeuq" class="tag-name">result</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">action</span><span id="wmqeeuq" class="tag">></span><span>     </span> <li id="wmqeeuq" class="alt"><span id="wmqeeuq" class="tag"></</span><span id="wmqeeuq" class="tag-name">struts</span><span id="wmqeeuq" class="tag">></span><span>  </span> </li> </ol> </div> <p>默认情况下,Spring从上面显C的applicationContext.xml文g中寻找ؓhello所做的配置</p> <p>5Q好了,现在你的Struts2和Springp正常的一起工作了。有几个配置技术点需要详l说明下Q?br /> <strong>装配模式</strong>。你可以通过讄修改struts.properties中下列属性的值来改变装配模式?/p> <p> <table cellspacing="3" cellpadding="0" width="80%" summary="" border="0"> <tbody> <tr> <td><strong>name</strong></td> <td>按照你的action的属性的名字和Spring里的bean的名字匹配,如果匚wp动装配。这?strong>~省?/strong></td> </tr> <tr> <td><strong>type</strong></td> <td>按照你的action的属性的cdQ在Spring注册的bean中查找,如果相同p动装配。这需要你在Spring中仅注册了一个此cd的bean</td> </tr> <tr> <td><strong>auto</strong></td> <td>Spring会试图自动监来扑ֈ最好的Ҏ自动装配你的action</td> </tr> <tr> <td><strong>constructor</strong></td> <td>Spring会自动装配bean的构造函数的参数</td> </tr> </tbody> </table> </p> <p><strong>是否使用cȝ?/strong>。你可以通过讄修改struts.properties中下列属性的值来改变是否使用Spring自n的类~存机制。可以设定的gؓtrue或falseQ默认ؓtrue?/p> <div id="wmqeeuq" class="code_title">struts.properties</div> <div id="wmqeeuq" class="dp-highlighter"> <ol class="dp-j"> <li id="wmqeeuq" class="alt"><span><span>struts.objectFactory.spring.useClassCache = false </span></span> </li> </ol> </div> </td> </tr> </tbody> </table> </div> 按照以上步骤做了Q但出错、异怿息如?br /> <table> <tbody> <tr> <td><strong>Messages</strong>:</td> <td> <ol> <li>springhello <li>Action class [springhello] not found </li> </ol> </td> </tr> <tr> <td><strong>File</strong>:</td> <td>com/caucho/loader/DynamicClassLoader.java</td> </tr> <tr> <td><strong>Line number</strong>:</td> <td>1,124</td> </tr> </tbody> </table> <img src ="http://www.aygfsteel.com/pdw2009/aggbug/155648.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/pdw2009/" target="_blank">有猫怼的日?/a> 2007-10-24 17:54 <a href="http://www.aygfsteel.com/pdw2009/archive/2007/10/24/155648.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SpringMVC http://www.aygfsteel.com/pdw2009/archive/2007/10/04/150366.html有猫怼的日?/dc:creator>有猫怼的日?/author>Thu, 04 Oct 2007 07:25:00 GMThttp://www.aygfsteel.com/pdw2009/archive/2007/10/04/150366.htmlhttp://www.aygfsteel.com/pdw2009/comments/150366.htmlhttp://www.aygfsteel.com/pdw2009/archive/2007/10/04/150366.html#Feedback0http://www.aygfsteel.com/pdw2009/comments/commentRss/150366.htmlhttp://www.aygfsteel.com/pdw2009/services/trackbacks/150366.html Spring 角色Q?br /> 1、核心控制器DispatcherServlet
       它类gstruts中的ActionServlet,WebWork中的ServletDispacher.
负责拦截LQ将h参数装成对象,然后Ҏ处理器映策略,请求{发给不同的业务控制器。DispatcherServlet应该配置成load-on-startup Servlet方式Q它不仅负责处理hQ而且负责创徏ApplicationContextQ核心控制器启动时加载,在web.xml配置如下?br />
  <servlet>
    
<servlet-name>firstmvc</servlet-name>
    
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    
<load-on-startup>1</load-on-startup>
  
</servlet>
  
<servlet-mapping>
    
<servlet-name>firstmvc</servlet-name>
    
<url-pattern>*.do</url-pattern>
  
</servlet-mapping>
如上面配|?DispatcherServlet应对的配|文件是firstmvc-servlet.xml文g?br />
2、业务控制器
       不管直接实现q是l承实现c,Spring的业务控制器都必d现Controller接口,Spring提供了多U控制器实现的接口。这个业务控制器{同于Struts中的Actionc,但两者实现方法不一?Struts使用了类l承QSpring使用了接口。ƈ提供了以下实现类
AbstractController  功以有限通常不支持?br /> ParameterizableViewController Q与上面那个cȝ|但可以返回视囑֐Q而不是硬~码的视囑֐
UrlFilenameViewController : ҎURLq获取请求的文g?br /> ServletForwardingController: 请求{发给某Servlet?br /> SimpleFormController Q?用于处理表单参数的控制器
MultiActionController :  多动作控制器
AbstractCommandController Q命令控制器

在这里详说MultiActionControllerQ其它控制器自己找资?br />  MultiActionController有两U用方?br /> 1、承MultiActionControllerQƈ在子cM指定MethodNameResolver解析的方法,在这U情况下Q不需要配|Delegate参数
2、不l承MultiActionControllerQ将动作定义在代理对象里Q由代理调用Resolver解析的方法?br /> MethodNameResolver主要有如下三U实玎ͼ需要的时候可以也可以自己提供
1、ParameterMethodNameResolverQ解析特定参数|参数g为方法名?br /> 2、InternalPathMethodNameResolver:从请求\径中解析文g名作为方法名?br /> 3、PropertiesMethodNameResolverQ用自定义属性对?请求的URL景射到方法名.
firstmvc-servlet.xml配置如下Q?br />
    <!-- 动作代理 -->
    
<bean id="paramResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
        
<property name="paramName">
            
<value>method</value>
        
</property>
    
</bean>
    
<bean name="/paramMultiController.do" class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
        
<property name="methodNameResolver">
            
<ref bean="paramResolver"/>
        
</property>
        
<property name="delegate">
            
<ref bean="sampleDelegate"/>
        
</property>
    
</bean>
    
<bean id="sampleDelegate" class="com.mvc.SampleDelegate" />




3、处理媄?nbsp; 
      控制器根据该{略Q将h转发l对应的业务控制器。通常有下面两U策?br />       BeanNameUrlHandlerMapping Ҏh名{?br />       SimpleUrlHandlerMapping Ҏ定义转发h
      HandlerMapping 的基本功能是请求传递到HandlerExecutionChain。BeanNameUrlHandlerMapping 是一个简单而强大的控制映射器,它将HTTP的请求映{发给context中同名的bean。firstmvc-servlet.xml文g如下
<?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="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
    
<bean name="/hello.do" class="com.mvc.HelloAction">
        
<property name="jsp">
            
<value>WEB-INF/jsp/hello.jsp</value>
        
</property>
    
</bean>
</beans>
HelloAction.java代码如下Q?br />
package com.mvc;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class HelloAction implements Controller{
    
    
public String jsp;
    
public void setJsp(String jsp){
        
this.jsp=jsp;
    }
    
    
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
        
        
return new ModelAndView(jsp,"model",null); 
        
    }
    
}
SimpleUrlHandlerMapping 是功能强大的控制器映,但不喜欢用,
用的时候再找资料吧。。。?br />

4、视囑֒视图解析
5、模?br />      SpringҎ没提供专门的模型角色QSpring的Model对象由普通map对象充当QKey不能为空Q值可以ؓI?br /> 6、Command对象
     Command对象是普通的java对象Q用于封装用记请求参?nbsp;    



]]>
Spring 事务理和mysqlq解决http://www.aygfsteel.com/pdw2009/archive/2007/09/28/149392.html有猫怼的日?/dc:creator>有猫怼的日?/author>Fri, 28 Sep 2007 15:51:00 GMThttp://www.aygfsteel.com/pdw2009/archive/2007/09/28/149392.htmlhttp://www.aygfsteel.com/pdw2009/comments/149392.htmlhttp://www.aygfsteel.com/pdw2009/archive/2007/09/28/149392.html#Feedback0http://www.aygfsteel.com/pdw2009/comments/commentRss/149392.htmlhttp://www.aygfsteel.com/pdw2009/services/trackbacks/149392.html
package com.spring;

import java.sql.Connection;
import java.sql.Statement;

import javax.sql.DataSource;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.orm.toplink.TopLinkTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;

public class TransactionDemo {
    
/**
     * spring事务模板例子
     *
     
*/
    
public void templateTemplateDemo(){
        
final ApplicationContext ctx=new ClassPathXmlApplicationContext("src/bean.xml"); 
        
//ClassPathResource cpr=new ClassPathResource("bean.xml");
        
//final XmlBeanFactory factory=new XmlBeanFactory(cpr);
        PlatformTransactionManager ptm=(PlatformTransactionManager)ctx.getBean("transactionManager");
        TransactionTemplate tt
=new TransactionTemplate(ptm);
        tt.execute(
new TransactionCallbackWithoutResult(){
            @Override
            
protected void doInTransactionWithoutResult(TransactionStatus ts) {
                
try{
                    DataSource ds
=(DataSource)ctx.getBean("dataSource");
                    Connection conn
=DataSourceUtils.getConnection(ds);
                    Statement stmt
=conn.createStatement();
                    stmt.execute(
"insert into tuser values(123,'裴d?)");
                    
                }
catch(Exception e){
                    ts.setRollbackOnly();
                    e.printStackTrace();
                }
            }
            
        });
    }
    
/**
     * 使用PlatforTransactionManager实现cȝ理事?br />      *
     
*/
    
public void PlatforTransactionManagerDemo(){
        ApplicationContext ctx
=new ClassPathXmlApplicationContext("bean.xml"); 
        PlatformTransactionManager tm
=(PlatformTransactionManager)ctx.getBean("transactionManager");
        DefaultTransactionDefinition dtf
=new DefaultTransactionDefinition();//初始化一个默认事?/span>
        dtf.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);//讄事务定义对象的事务传辑֮播属?/span>
        TransactionStatus ts=tm.getTransaction(dtf);//TransactionStatus代表事务对象本nQgetTransaction开始一个事?/span>
        try{
            DataSource ds
=(DataSource)ctx.getBean("dataSource");
            Connection conn
=DataSourceUtils.getConnection(ds);
            Statement stmt
=conn.createStatement();
            stmt.execute(
"insert into tuser values(123,'裴d?)");
            tm.commit(ts);
        }
catch(Exception e){
            tm.rollback(ts);
            e.printStackTrace();
        }
    }
    
public static void main(String[] args){
        TransactionDemo td
=new TransactionDemo();
        td.templateTemplateDemo();
    }
    
}
对应的XML文g配置(jdbc)如下Q?br />
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        
<property name="driverClassName">
            
<value>com.mysql.jdbc.Driver</value>
        
</property>
        
<property name="url">
            
<value>jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8</value>
        
</property>
        
<property name="username">
            
<value>root</value>
        
</property>
        
<property name="password">
            
<value>123456</value>
        
</property>
        
    
</bean>

JTA的配|如?br />
    <bean id="transactionManager" class="org.springframework.jndi.JndiObjectFactoryBean">
    
<property name="dataSource">
           
<property name="jndiName">
              
<value>jdbc/kkmei</value>
           
</property>
    
</bean>

<bean id="jtatm" class="org.springframework.transaction.jta.JtaTransactionManager">
   
</bean>
使用ApplicationContext时只能通过applicationContext.xml来初始化容器
final ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");

mysql q问题由来已久Q今天发现把my.ini中的字符~码改ؓutf-8Ӟmysql无法启动。在q个例子中我们用了utf-8~码Q那么我们要把test数据库的~码Q表~码Q字D늼码全Ҏutf-8没问题了,mysql-front停止开发了Q郁?

]]>
BeanFactory与Application的区?/title><link>http://www.aygfsteel.com/pdw2009/archive/2007/09/28/149382.html</link><dc:creator>有猫怼的日?/dc:creator><author>有猫怼的日?/author><pubDate>Fri, 28 Sep 2007 15:15:00 GMT</pubDate><guid>http://www.aygfsteel.com/pdw2009/archive/2007/09/28/149382.html</guid><wfw:comment>http://www.aygfsteel.com/pdw2009/comments/149382.html</wfw:comment><comments>http://www.aygfsteel.com/pdw2009/archive/2007/09/28/149382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/pdw2009/comments/commentRss/149382.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/pdw2009/services/trackbacks/149382.html</trackback:ping><description><![CDATA[自从q初看了李刚写的那本《Spring2.0宝典》,好久没看qSpringM资料Q对于《Spring2.0宝典》的评hQ我只能说一句话垃圾中的垃圾。我已经不敢再买国内作家写的书了?br /> <p>在Spring中,两个最基本最重要的包?<tt class="literal">org.springframework.beans</tt> ?<tt class="literal">org.springframework.context</tt>. q两个包中的代码为Spring?span class="emphasis"><em>反向控制</em></span> Ҏ(也叫?span class="emphasis"><em>依赖注射</em></span>Q提供了基础?<tt class="literal"><a target="_top">BeanFactory</a></tt>提供了一U先q的配置机制来管理Q何种cbean(对象)Q这U配|机制考虑CQ何一U可能的存储方式?<a target="_top">ApplicationContext</a>建立在BeanFactory之上Qƈ增加了其他的功能,比如更容易同Spring AOPҎ整合, 消息资源处理Q用于国际化Q,事g传递,以声明的方式创徏ApplicationContextQ?可选的父上下文和与应用层相关的上下文(比如<tt class="literal">WebApplicationContext</tt>Q,以及其他斚w的增强?</p> <p>而言之,<tt class="literal">BeanFactory</tt>提供了配|框架和基本的功能, ?<tt class="literal">ApplicationContext</tt>为它增加了更强的功能Q这些功能中的一些或许更加接qJ2EEq且围绕企业U应用。一般来_ApplicationContext是BeanFactory的完全超集, MBeanFactory功能和行为的描述也同栯认ؓ适用于ApplicationContext</p> <p>用户有时不能定BeanFactory和ApplicationContext中哪一个在特定场合下更适合?通常大部分在J2EE环境的应用中Q?span class="emphasis"><em>最好选择使用ApplicationContext</em></span>Q?因ؓ它不仅提供了BeanFactory所有的Ҏ以及它自己附加的特性,而且q提供以声明的方式用一些功能, q通常是o人满意的。BeanFactory主要是在非常x内存使用的情况下 Q比如在一个每kb都要计算的applet中)使用Q而且你也不需要用到ApplicationContext的所有特性?</p> <p>q一章粗略地分ؓ两部分,W一部分包括对BeanFactory和ApplicationContext都适用的一些基本原则。第二部分包括仅仅适用于ApplicationContext的一些特?/p> <br /> 生成BeanFactory的方?br /> <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"><span style="color: #000000">InputStream is </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> FileInputStream(</span><span style="color: #000000">"</span><span style="color: #000000">beans.xml</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> XmlBeanFactory factory </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> XmlBeanFactory(is);<br /> </span><span style="color: #008000">//</span><span style="color: #008000">或?br /> ClassPathResource res = new ClassPathResource("beans.xml");<br /> XmlBeanFactory factory = new XmlBeanFactory(res);</span></div> <br /> 生成ApplicationContextҎ<br /> <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.18%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 85px; background-color: #eeeeee"><span style="color: #000000">ClassPathXmlApplicationContext appContext </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> ClassPathXmlApplicationContext(<br />         </span><span style="color: #0000ff">new</span><span style="color: #000000"> String[] {</span><span style="color: #000000">"</span><span style="color: #000000">applicationContext.xml</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">applicationContext-part2.xml</span><span style="color: #000000">"</span><span style="color: #000000">});<br /> <br /> <br /> ClassPathXmlApplicationContext appContext </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> ClassPathXmlApplicationContext(</span><span style="color: #000000">""</span><span style="color: #000000">);</span></div> <br /> applicationContxt是可以{换成beanFactory?br /> <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"><span style="color: #000000">BeanFactory factory </span><span style="color: #000000">=</span><span style="color: #000000"> (BeanFactory) appContext;</span></div> <br /> <p>Beans被定义ؓ两种部v模式中的一U:singleton或non-singleton?Q后一U也别叫作prototypeQ尽这个名词用的不_因ؓ它ƈ不是非常适合Q?如果一个bean是singleton形态的Q那么就只有一?span class="emphasis"><em>׃n?/em></span>实例存在Q?所有和q个bean定义的idW合的beanh都会q回q个唯一的、特定的实例?</p> <p>如果bean以non-singletonQprototype模式部v的话Q对q个bean的每ơ请求都?span class="emphasis"><em>创徏一个新的bean实例</em></span>。这对于例如每个user需要一个独立的user对象q样的情冉|非常理想的?</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"><span style="color: #000000"><</span><span style="color: #000000">bean id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">exampleBean</span><span style="color: #000000">"</span><span style="color: #000000"><br />       </span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">examples.ExampleBean</span><span style="color: #000000">"</span><span style="color: #000000"> singleton</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">false</span><span style="color: #000000">"</span><span style="color: #000000">/></span><span style="color: #000000"><br /> </span><span style="color: #000000"><</span><span style="color: #000000">bean name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">yetAnotherExample</span><span style="color: #000000">"</span><span style="color: #000000"><br />       </span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">examples.ExampleBeanTwo</span><span style="color: #000000">"</span><span style="color: #000000"> singleton</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">true</span><span style="color: #000000">"</span><span style="color: #000000">/></span></div> <img src ="http://www.aygfsteel.com/pdw2009/aggbug/149382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/pdw2009/" target="_blank">有猫怼的日?/a> 2007-09-28 23:15 <a href="http://www.aygfsteel.com/pdw2009/archive/2007/09/28/149382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Bean 装机制学习W记http://www.aygfsteel.com/pdw2009/archive/2006/11/25/83507.html有猫怼的日?/dc:creator>有猫怼的日?/author>Sat, 25 Nov 2006 12:30:00 GMThttp://www.aygfsteel.com/pdw2009/archive/2006/11/25/83507.htmlhttp://www.aygfsteel.com/pdw2009/comments/83507.htmlhttp://www.aygfsteel.com/pdw2009/archive/2006/11/25/83507.html#Feedback0http://www.aygfsteel.com/pdw2009/comments/commentRss/83507.htmlhttp://www.aygfsteel.com/pdw2009/services/trackbacks/83507.html
1、Bean Wrapper
       q个BeanWrappercd单,提供了一套Bean的操作方法,如apache -BeanUtils一栗通过BeanWrapperQ我们可以无需在编码时指定JavaBean的实现类和属性|通过在配|文?br />加以讑֮Q就可以在运行期动态创建对象ƈ讑֮其属性(依赖关系Q?一个简单的例子Q?br />
    public static void testBeanWrapper(){
        
try {
            Object obj
=Class.forName("com.spring.UpperAction").newInstance();
            BeanWrapper bw
=new BeanWrapperImpl(obj);

            bw.setPropertyValue(
"message","peidw");
            System.out.println(bw.getPropertyValue(
"message"));
        } 
catch (InstantiationException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (IllegalAccessException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        } 
catch (ClassNotFoundException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

2、Bean Factory
      BeanFactory负责Ҏ配置配置文g创徏Bean实例Q可以配|的目有:
      1 、Bean属性值及依赖关系
      2、Bean创徏模式(是否单态模?
      3、Bean初始化及销?br />      4、Bean的依赖关p?br />
<beans>
<description>Spring Bean Configuration Sample</description>
<bean
id
="TheAction" ?br />class="net.xiaxin.spring.qs.UpperAction" ?br />singleton="true" ?br />init-method="init" ?br />destroy-method="cleanup" ?br />depends-on="ActionManager" ?br />>
<property name="message">
<value>HeLLo</value> ?br /></property>
<property name="desc">
<null/>
</property>
<property name="dataSource">
<ref local="dataSource"/> ?br /></property>
</bean>
<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/sample</value>
</property>
</bean>
q是一个比较完整的Bean配置Qid表示一个类在BeanFactory中的唯一标识
class 是javacdQsingleton 为true表示使用单态,init-method初始化方法在BeanFactory创徏Bean后执行的初始化方法。destroy-method销毁方法,在bean销毁时执行Q一般用于资源释放。depends-on  Bean的依懒关pR?lt;value>节点用于指定一个属性|ref节点用于引用另一个bean的属性?br />
       联合上面关于BeanWrapper的内容,我们可以看到QBeanWrapper实现了针对单个Bean的属性设定操作。而BeanFactory则是针对多个Bean的管理容器,Ҏl定的配|文ӞBeanFactory从中dcd、属性名/|然后通过Reflection机制q行Bean加蝲和属性设定?br />
3、ApplicationContext
BeanFactory提供了针对Java Bean的管理功能,而ApplicationContext提供了一个更为框架化?br />实现Q从上面的示例中可以看出QBeanFactory的用方式更加类g个APIQ而非Framework styleQ?br />ApplicationContext覆盖了BeanFactory的所有功能,q提供了更多的特性。此外,
ApplicationContextZ现有应用框架相整合,提供了更为开攑ּ的实玎ͼ如对于Web应用Q我们可以在
web.xml中对ApplicationContextq行配置Q?br />相对BeanFactory而言QApplicationContext提供了以下扩展功能:
1Q?国际化支?br />我们可以在Beans.xml文g中,对程序中的语a信息Q如提示信息Q进行定义,程序中的提C?br />信息抽取到配|文件中加以定义Qؓ我们q行应用的各语言版本转换提供了极大的灉|性?br />2Q?资源讉K
支持Ҏ件和URL的访问?br />3Q?事g传播
事g传播Ҏؓpȝ中状态改变时的检提供了良好支持?br />4Q?多实例加?br />可以在同一个应用中加蝲多个Context实例?br />
一个国际化支持例子
public static void testLanguage(){
        ApplicationContext ac
=new FileSystemXmlApplicationContext("src/bean.xml");
        Object[] arg
=new Object[]{"kkui",Calendar.getInstance().getTime()};
        
//以系l默认的Locale加蝲信息Q对winxp而言默认的是zh_CNQ?/span>

        String zhmsg
=ac.getMessage("userinfo",arg, Locale.CHINA);
        String usmsg
=ac.getMessage("userinfo",arg, Locale.US);
        System.out.println(zhmsg);
        System.out.println(usmsg);
    }
需要在beans.xml文g配置使用多资?br />
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        
<property name="basenames">
            
<list>
                
<value>messages</value>
            
</list>
        
</property>
    
</bean>
q里声明了一个名为messageSource的BeanQ注意对于Message定义QBean ID必须?br />messageSourceQ这是目前Spring的编码规U)Q对应类为ResourceBundleMessageSourceQ?br />目前Spring中提供了两个MessageSource接口的实玎ͼ?br />ResourceBundleMessageSource和ReloadableResourceBundleMessageSourceQ后
者提供了无需重启卛_重新加蝲配置信息的特性?br />资源文gmessage_zh.properties
userinfo=登陆用户:[{0}] 登陆旉[{1}]

国际化支持在实际开发中可能是最常用的特性。对于一个需要支持不同语a环境的应用而言Q我们所采取的最常用的策略一般是通过一个独立的资源文gQ如一个properties文gQ完成所有语a信息Q如界面上的提示信息Q的配置QSpring对这U传l的方式q行了封装,q提供了更加强大的功?

资源讉K例子

Resource rs = ctx.getResource("classpath:config.properties");
File file = rs.getFile();
事g传播机制例子
ApplicationContextZObserver模式Qjava.util包中有对应实玎ͼQ提供了针对Bean的事件传播功能。通过Application. publishEventҎQ我们可以将事g通知pȝ内所有的ApplicationListener。下面是一个例?
package com.spring;


import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;

public class LoginAction implements ApplicationContextAware{
    
private ApplicationContext ac;
    
public void setApplicationContext(ApplicationContext arg0) throws BeansException {
        
// TODO Auto-generated method stub
        this.ac=arg0;
    }
    
public int login(String username,String password){
        ActionEvent ae
=new ActionEvent(username);
        
this.ac.publishEvent(ae);
        
return 0;
    }
    
}
package com.spring;

import org.springframework.context.ApplicationEvent;

public class ActionEvent extends ApplicationEvent {
    
public ActionEvent(Object source) {
        
super(source);
    }
}
package com.spring;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;

public class ActionListener implements ApplicationListener{

    
public void onApplicationEvent(ApplicationEvent event) {
        
if(event instanceof ActionEvent){
            System.out.println(event.toString());
        }
        
    }
    
}
需要在beans.xml文g里添加以下配|?br />
<bean id="loginaction" class="net.xiaxin.beans.LoginAction"/>
<bean id
="listener" class="net.xiaxin.beans.ActionListener"/>
试ҎQ?br />
    public static void testListener(){
        ApplicationContext ac
=new FileSystemXmlApplicationContext("src/bean.xml");
        LoginAction la
=(LoginAction)ac.getBean("loginaction");
        la.login(
"peidw""123456");
    }
Struts in Spring
Struts和Spring是如何整?Z在struts加加载Spring Context;在struts-config.xml文g中添加以下配|?br />
<struts-config>
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value
="/WEB-INF/applicationContext.xml" />
</plug-in>
</struts-config>
通过plug-in我们实现了Spring Context的加载,不过仅仅加蝲Contextq没有什么实际意义,我们q需要修攚w|,Struts Action交给Spring容器q行理Q?br />

]]>
վ֩ģ壺 | | | | | | ̨| żҽ| Զ| | | | | | ʯ| | | | ų| | ˿| | ɽ| | | ϳ| ˴| | ӽ| ɽ| | | | տ| ƽɽ| Ӽ| | ζ| ƽ̶| ̨ɽ| |