??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV无码乱码在线观看裸奔,亚洲永久中文字幕在线,亚洲Av永久无码精品三区在线 http://www.tkk7.com/cgogg/category/23080.htmlTake Easyzh-cnTue, 19 Jun 2007 21:45:13 GMTTue, 19 Jun 2007 21:45:13 GMT60Spring aophttp://www.tkk7.com/cgogg/articles/124987.htmlchenguochenguoMon, 18 Jun 2007 10:06:00 GMThttp://www.tkk7.com/cgogg/articles/124987.htmlhttp://www.tkk7.com/cgogg/comments/124987.htmlhttp://www.tkk7.com/cgogg/articles/124987.html#Feedback0http://www.tkk7.com/cgogg/comments/commentRss/124987.htmlhttp://www.tkk7.com/cgogg/services/trackbacks/124987.htmlZ(jin)理解AOP如何做到q点Q考虑一下记日志的工作。日志本w不太可能是你开发的ȝ序的主要d。如果能?#8220;不可见的”、通用的日志代码注入主E序中,那该多好啊。AOP可以帮助你做到?
Spring framework是很有前途的AOP技术。作ZU非늕性的Q轻型的AOP frameworkQ你无需使用预编译器或其他的元标{,便可以在JavaE序中用它。这意味着开发团队里只需一对付AOP frameworkQ其他hq是象往(xin)怸L(fng)E?
AOP是很多直觉难以理解的术语的根源。幸q的是,你只要理解三个概念,可以编写AOP? 块。这三个概念是:(x)adviceQpointcut和advisor。advice是你惛_别的E序内部不同的地Ҏ(gu)入的代码。pointcut定义?jin)需 要注入advice的位|,通常是某个特定的cȝ一个publicҎ(gu)。advisor是pointcut和advice的装配器Q是advice注入 ȝ序中预定义位|的代码?

既然我们知道?jin)需要用advisor向主要代码中注入“不可见的”adviceQ让我们实现一? Spring AOP的例子。在q个例子中,我们实C个before adviceQ这意味着advice的代码在被调用的publicҎ(gu)开始前被执行。以下是q个before advice的实C码:(x)

代码:
package com.company.springaop.test;

import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;

public class TestBeforeAdvice implements MethodBeforeAdvice {

  public void before(Method m, Object[] args, Object target)
  throws Throwable {
    System.out.println("Hello world! (by "
        + this.getClass().getName()
        + ")");
  }
}
 


? 口MethodBeforeAdvice只有一个方法before需要实玎ͼ它定义了(jin)advice的实现。beforeҎ(gu)q三个参数Q它们提供了(jin)相当 丰富的信息。参数Method m是advice开始后执行的方法。方法名U可以用作判断是否执行代码的条g。Object[] args是传l被调用的publicҎ(gu)的参数数l。当需要记日志Ӟ参数args和被执行Ҏ(gu)的名Uͼ都是非常有用的信息。你也可以改变(sh)lm的参敎ͼ 但要心(j)使用q个功能Q编写最初主E序的程序员q不知道ȝ序可能会(x)和传入参数的发生冲突。Object target是执行方法m对象的引用?

在下面的BeanImplcMQ每个publicҎ(gu)调用前,都会(x)执行adviceQ?

代码:
package com.company.springaop.test;

public class BeanImpl implements Bean {

  public void theMethod() {
    System.out.println(this.getClass().getName()
        + "." + new Exception().getStackTrace()[0].getMethodName()
        + "()"
        + " says HELLO!");
  }
}


cBeanImpl实现?jin)下面的接口BeanQ?

代码:
package com.company.springaop.test;

public interface Bean {
  public void theMethod();
}



虽然不是必须使用接口Q但面向接口而不是面向实现编E是良好的编E实践,Spring也鼓p样做?

pointcut和advice通过配置文g来实玎ͼ因此Q接下来你只需~写L法的Java代码Q?
代码:


package com.company.springaop.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Main {

  public static void main(String[] args) {
    //Read the configuration file
    ApplicationContext ctx
        = new FileSystemXmlApplicationContext("springconfig.xml");

    //Instantiate an object
    Bean x = (Bean) ctx.getBean("bean");

    //Execute the public method of the bean (the test)
    x.theMethod();
  }
}



我们从读入和处理配置文g开始,接下来马上要创徏它。这个配|文件将作ؓ(f)_合E序不同部分?#8220;胶水”。读入和处理配置文g后,我们?x)得C个创建工厂ctx。Q何一个Spring理的对象都必须通过q个工厂来创建。对象通过工厂创徏后便可正怋用?

仅仅用配|文件便可把E序的每一部分l装h?
代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC  "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
  <!--CONFIG-->
  <bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
      <value>com.company.springaop.test.Bean</value>
    </property>
    <property name="target">
      <ref local="beanTarget"/>
    </property>
    <property name="interceptorNames">
      <list>
        <value>theAdvisor</value>
      </list>
    </property>
  </bean>

  <!--CLASS-->
  <bean id="beanTarget" class="com.company.springaop.test.BeanImpl"/>

  <!--ADVISOR-->
  <!--Note: An advisor assembles pointcut and advice-->
  <bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice">
      <ref local="theBeforeAdvice"/>
    </property>
    <property name="pattern">
      <value>com\.company\.springaop\.test\.Bean\.theMethod</value>
    </property>
  </bean>

  <!--ADVICE-->
  <bean id="theBeforeAdvice" class="com.company.springaop.test.TestBeforeAdvice"/>
</beans>
 


四个bean定义的次序ƈ不重要。我们现在有?jin)一个adviceQ一个包含了(jin)正则表达式pointcut的advisorQ一个主E序cd一个配|好的接口,通过工厂ctxQ这个接口返回自己本w实现的一个引用?

BeanImpl和TestBeforeAdvice都是直接配置。我们用一个唯一的ID创徏一个bean元素Qƈ指定?jin)一个实现类。这是全部的工作?

advisor 通过Spring framework提供的一个RegexMethodPointcutAdvisorcL实现。我们用advisor的一个属性来指定它所需? advice-bean。第二个属性则用正则表辑ּ定义?jin)pointcutQ确保良好的性能和易L?

最后配|的是beanQ它可以通过一个工厂来创徏。bean的定义看h比实际上要复杂。bean是ProxyFactoryBean的一个实玎ͼ它是Spring framework的一部分。这个bean的行为通过一下的三个属性来定义Q?


  • 属性proxyInterface定义?jin)接口类?
  • 属性target指向本地配置的一个beanQ这个beanq回一个接口的实现?
  • 属性interceptorNames是唯一允许定义一个值列表的属性。这个列表包含所有需要在beanTarget上执行的advisor。注意,advisor列表的次序是非常重要的?


Spring工具

? 然你可以手工修改Ant构徏脚本Q但使用SpringUIQ译注:(x)SpringUI现在是Spring framework的一部分Qƈ改名为spring-ideQ,使用Spring AOP变得很简单,只要点点鼠标卛_。你可以把SpringUI安装成Eclipse的一个plug-in。然后,你只需在你的project上右击鼠 标,q择“add Spring Project Nature”。在project属性中Q你可以?#8220;Spring Project”下添加Spring配置文g。在~译前把下面的类库加入projectQaopalliance.jarQcommons- logging.jarQjakarta-oro-2.0.7.jar和spring.jar。运行程序时你会(x)看到下面的信息:(x)

... (logging information)
Hello world! (by com.company.springaop.test.TestBeforeAdvice)
com.company.springaop.test.BeanImpl.theMethod() says HELLO!


优点和缺?/span>

Spring 比v其他的framework更有优势Q因为除?jin)AOP以外Q它提供?jin)更多别的功能。作Z个轻型frameworkQ它在J2EE不同的部分都可以发挥 作用。因此,即不想使用Spring AOPQ你可能q是想用Spring。另一个优Ҏ(gu)QSpringq不要求开发团队所有的人员都会(x)用它。学?fn)Spring应该从Spring reference的第一开始。读?jin)本文后Q你应该可以更好地理解Spring reference?jin)。Spring唯一的缺Ҏ(gu)~Z更多的文,但它的mailing list是个很好的补充,而且?x)不断地出现更多的文?/span>


chenguo 2007-06-18 18:06 发表评论
]]>
Spring例子JPetStore分析---------3jpetstore的各层之间的关系部分分析http://www.tkk7.com/cgogg/articles/124985.htmlchenguochenguoMon, 18 Jun 2007 10:05:00 GMThttp://www.tkk7.com/cgogg/articles/124985.htmlhttp://www.tkk7.com/cgogg/comments/124985.htmlhttp://www.tkk7.com/cgogg/articles/124985.html#Feedback0http://www.tkk7.com/cgogg/comments/commentRss/124985.htmlhttp://www.tkk7.com/cgogg/services/trackbacks/124985.html下面jpetstore的̎L(fng)理部分,来分析一下jpetstore的各层之间的关系Q?/p>

1。持久层分析

1.1账号理的iBatis的xml影射部分如下Q?/p>

账号理涉及(qing)到四张表Q?/p>

signon 存放用户名,密码

account, 存放用户的基本信?/p>

 profile,  存放用户选择的语aQ以?qing)喜q商品分类

 bannerdata 目前不清?/p>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "

<sqlMap namespace="Account">

《̎号信息结果集?/strong>

  <resultMap id="result" class="org.springframework.samples.jpetstore.domain.Account">
    <result property="username" column="userid" columnIndex="1"/>
    <result property="email" column="email" columnIndex="2"/>
    <result property="firstName" column="firstname" columnIndex="3"/>
    <result property="lastName" column="lastname" columnIndex="4"/>
    <result property="status" column="status" columnIndex="5"/>
    <result property="address1" column="addr1" columnIndex="6"/>
    <result property="address2" column="addr2" columnIndex="7"/>
    <result property="city" column="city" columnIndex="8"/>
    <result property="state" column="state" columnIndex="9"/>
    <result property="zip" column="zip" columnIndex="10"/>
    <result property="country" column="country" columnIndex="11"/>
    <result property="phone" column="phone" columnIndex="12"/>
    <result property="languagePreference" column="langpref" columnIndex="13"/>
    <result property="favouriteCategoryId" column="favcategory" columnIndex="14"/>
    <result property="listOption" column="mylistopt" columnIndex="15"/>
    <result property="bannerOption" column="banneropt" columnIndex="16"/>
    <result property="bannerName" column="bannername" columnIndex="17"/>
  </resultMap>

《根据用户名Q获得用户信息?/strong>

  <select id="getAccountByUsername" resultMap="result">
    select
          signon.username as userid,
          account.email,
          account.firstname,
          account.lastname,
          account.status,
          account.addr1,
          account.addr2,
          account.city,
          account.state,
          account.zip,
          account.country,
          account.phone,
          profile.langpref,
          profile.favcategory,
          profile.mylistopt,
          profile.banneropt,
          bannerdata.bannername
    from account, profile, signon, bannerdata
    where account.userid = #value#
      and signon.username = account.userid
      and profile.userid = account.userid
      and profile.favcategory = bannerdata.favcategory
  </select>

《根据̎P密码Q获取̎受?/strong>

  <select id="getAccountByUsernameAndPassword" resultMap="result">
    select
      signon.username as userid,
      account.email,
      account.firstname,
      account.lastname,
      account.status,
      account.addr1,
      account.addr2,
      account.city,
      account.state,
      account.zip,
      account.country,
      account.phone,
      profile.langpref,
      profile.favcategory,
      profile.mylistopt,
      profile.banneropt,
      bannerdata.bannername
    from account, profile, signon, bannerdata
    where account.userid = #username#
      and signon.password = #password#
      and signon.username = account.userid
      and profile.userid = account.userid
      and profile.favcategory = bannerdata.favcategory
  </select>

《获取系l用户名列表?/strong>

  <select id="getUsernameList" resultClass="java.lang.String">
    select username as value from signon
  </select>

《更新̎号信息?/strong>

  <update id="updateAccount">
    update account set email = #email#, firstname = #firstName#, lastname = #lastName#, status = #status#, addr1 = #address1#, addr2 = #address2:varchar#, city = #city#, state = #state#, zip = #zip#, country = #country#, phone = #phone# where userid = #username#
  </update>

《增加新账号?/strong>

  <insert id="insertAccount">
    insert into account (email, firstname, lastname, status, addr1, addr2, city, state, zip, country, phone, userid) values (#email#, #firstName#, #lastName#, #status#, #address1#, #address2:varchar#, #city#, #state#, #zip#, #country#, #phone#, #username#)
  </insert>

《更新用户profile表,其中包括用户语言选择Q以?qing)喜Ƣ的动物分?/strong>

  <update id="updateProfile">
    update profile set langpref = #languagePreference#, favcategory = #favouriteCategoryId#, mylistopt = #listOptionAsInt#, banneropt = #bannerOptionAsInt# where userid = #username#
  </update>

《增加用户profile信息?/strong>

  <insert id="insertProfile">
    insert into profile (langpref, favcategory, mylistopt, banneropt, userid) values (#languagePreference#, #favouriteCategoryId#, #listOptionAsInt#, #bannerOptionAsInt#, #username#)
  </insert>

〈更新用户密码?/strong>

  <update id="updateSignon">
    update signon set password = #password# where username = #username#
  </update>

?strong>增加用户名,密码到用L(fng)录表Signon?/strong>

  <insert id="insertSignon">
    insert into signon (password,username) values (#password#,#username#)
  </insert>

</sqlMap>
1.2  Account̎L(fng)理的POJOc,AccountDao ̎L(fng)理interfaceQ规定了(jin)一pdҎ(gu)Q?/strong>

public interface AccountDao {

  Account getAccount(String username) throws DataAccessException;

  Account getAccount(String username, String password) throws DataAccessException;

  void insertAccount(Account account) throws DataAccessException;

  void updateAccount(Account account) throws DataAccessException;

 List getUsernameList() throws DataAccessException;

}

1.3Account interface 实现Q?/strong>

public class SqlMapAccountDao extends SqlMapClientDaoSupport implements AccountDao {

  public Account getAccount(String username) throws DataAccessException {
    return (Account) getSqlMapClientTemplate().queryForObject("getAccountByUsername", username);
  }

Ҏ(gu)用户名,密码Q获得̎?/strong>

  public Account getAccount(String username, String password) throws DataAccessException {
    Account account = new Account();
    account.setUsername(username);
    account.setPassword(password);
    return (Account) getSqlMapClientTemplate().queryForObject("getAccountByUsernameAndPassword", account);
  }

创徏账号Q需要更新account,signon,profile三张?/strong>

  public void insertAccount(Account account) throws DataAccessException {
    getSqlMapClientTemplate().insert("insertAccount", account);
    getSqlMapClientTemplate().insert("insertProfile", account);
    getSqlMapClientTemplate().insert("insertSignon", account);
  }

更新账号Q需要更新account,signon,profile三张?/strong>

  public void updateAccount(Account account) throws DataAccessException {
    getSqlMapClientTemplate().update("updateAccount", account, 1);
    getSqlMapClientTemplate().update("updateProfile", account, 1);
    if (account.getPassword() != null && account.getPassword().length() > 0) {
      getSqlMapClientTemplate().update("updateSignon", account, 1);
    }
  }

《获取系l用户名列表?/strong>
 
 public List getUsernameList() throws DataAccessException {
  return getSqlMapClientTemplate().queryForList("getUsernameList", null);
 }

}

ȝQ?/strong>

iBatis持久层使用sql-map-config.xml配置所有ibatis .xml文g

<sqlMapConfig>

 <sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Account.xml"/>
 <sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Category.xml"/>
 <sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Product.xml"/>
 <sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Item.xml"/>
 <sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Order.xml"/>
 <sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/LineItem.xml"/>
 <sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Sequence.xml"/>

</sqlMapConfig>

使用dataAccessContext-config.xml配置所有DAO实现

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  <property name="configLocation" value="WEB-INF/sql-map-config.xml"/>
  <property name="dataSource" ref="dataSource"/>
 </bean>

 <bean id="accountDao" class="org.springframework.samples.jpetstore.dao.ibatis.SqlMapAccountDao">
  <property name="sqlMapClient" ref="sqlMapClient"/>
 </bean>

2Q持久层和业务逻辑层的耦合Q业务逻辑接口中包含了(jin)AccountDAO的接口操?/strong>

public interface PetStoreFacade {

 Account getAccount(String username);

 Account getAccount(String username, String password);

 void insertAccount(Account account);

 void updateAccount(Account account);

 List getUsernameList();

。。。。。。?/p>

}

业务逻辑对象PetStoreImpl 实现?jin)对accountDao的再ơ封?/strong>

public class PetStoreImpl implements PetStoreFacade, OrderService {

 private AccountDao accountDao;

public Account getAccount(String username) {
  return this.accountDao.getAccount(username);
 }

 public Account getAccount(String username, String password) {
  return this.accountDao.getAccount(username, password);
 }

 public void insertAccount(Account account) {
  this.accountDao.insertAccount(account);
 }

 public void updateAccount(Account account) {
  this.accountDao.updateAccount(account);
 }

 public List getUsernameList() {
  return this.accountDao.getUsernameList();
 }

。。。?/p>

}

ȝQ?/p>

持久层与业务逻辑层的耦合是在applicationContext.cml中:(x)

Z务逻辑层提供事务管?/strong>


<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
    abstract="true">
  <property name="transactionManager"><ref bean="transactionManager"/></property>
  <property name="transactionAttributes">
   <props>
    <prop key="insert*">PROPAGATION_REQUIRED</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
   </props>
  </property>
 </bean>

 
 <bean id="petStore" parent="baseTransactionProxy">
  <property name="target">
   <bean class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl">
    <property name="accountDao" ref="accountDao"/>
    <property name="categoryDao" ref="categoryDao"/>
    <property name="productDao" ref="productDao"/>
    <property name="itemDao" ref="itemDao"/>
    <property name="orderDao" ref="orderDao"/>
   </bean>
  </property>

4表示层和业务逻辑层的耦合Q?/strong>

表示层和业务逻辑层的耦合是通过BaseAction来实现的Qƈ通过接口来访问业务逻辑对象Q?/p>

public abstract class BaseAction extends Action {

  private PetStoreFacade petStore;

 public void setServlet(ActionServlet actionServlet) {
  super.setServlet(actionServlet);
  if (actionServlet != null) {
   ServletContext servletContext = actionServlet.getServletContext();
   WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
   this.petStore = (PetStoreFacade) wac.getBean("petStore");
  }
 }

 protected PetStoreFacade getPetStore() {
  return petStore;
 }

}

所有的pȝ里面的Action都是从BaseActionzq来的,而BaseAction的派生类中,提供?jin)对业务逻辑对象
 PetStoreFacade 的访问?/strong>



chenguo 2007-06-18 18:05 发表评论
]]>
分析和学?fn)Spring中的jpetstore用户理http://www.tkk7.com/cgogg/articles/124986.htmlchenguochenguoMon, 18 Jun 2007 10:05:00 GMThttp://www.tkk7.com/cgogg/articles/124986.htmlhttp://www.tkk7.com/cgogg/comments/124986.htmlhttp://www.tkk7.com/cgogg/articles/124986.html#Feedback0http://www.tkk7.com/cgogg/comments/commentRss/124986.htmlhttp://www.tkk7.com/cgogg/services/trackbacks/124986.html分析和学?fn)Spring中的jpetstore用户理

  存在用户的系l,必然需要用L(fng)d和认证,今天通过分析Spring中自带的jpetstore的例子来学习(fn)一下如何实现在Spring构架的系l中用户d?/font>

1、首先从注册用户开始,先看看jpetstore-servlet.xml中关于注册用L(fng)bean定义Q从定义命名中就可以看出下面q段是注册用户的:(x)
  <bean name="/shop/newAccount.do" class="org.springframework.samples.jpetstore.web.spring.AccountFormController">
    <property name="petStore"><ref bean="petStore"/></property>
    <property name="validator"><ref bean="accountValidator"/></property>
    <property name="successView"><value>index</value></property>
  </bean>
 1). formView呢?从AccountFormController的构造函C得到Q原来ؓ(f)EditAccountFormQ?nbsp;
 2). EditoAccountForm.jsp中显得非ؕQ其实没有多难理解的地方,最主要的是q个form既是d新用L(fng)Q又是编辑用户信息的Q所以显得有点ؕp糟的?/font>

2、添加好?jin)新用户Q接下来看看如何dQ在jpetstore-servlet中发现这两个相关bean定义Q如下:(x)
  <bean name="/shop/signon.do" class="org.springframework.samples.jpetstore.web.spring.SignonController">
    <property name="petStore"><ref bean="petStore"/></property>
  </bean>
  <bean name="/shop/signonForm.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
    <property name="viewName"><value>SignonForm</value></property>
  </bean>
 1). W二个bean是在q行时用戯入用户名和密码的formQ叫做SignonFormQ对于这? ParameterizableViewControllerQ用文里的话说q是最单的ControllerQ其作用是在运行中指向 Controller而不是直接指向jsp文gQ仅此而已?br> 2). SignonForm.jspQ里面就是一个简单的formQ其action是W一个beanQ即/shop/signon.doQ最需要注意的? signonForwardActionQ其主要作用是forward到需要输入用户名和密码的那个面上去Q这个变量哪里来的呢Q看看下面:(x)
  <bean id="secureHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="interceptors">
      <list>
        <ref bean="signonInterceptor"/>
      </list>
    </property>
    <property name="urlMap">
      <map>
        <entry key="/shop/editAccount.do"><ref local="secure_editAccount"/></entry>
        <entry key="/shop/listOrders.do"><ref local="secure_listOrders"/></entry>
        <entry key="/shop/newOrder.do"><ref local="secure_newOrder"/></entry>
        <entry key="/shop/viewOrder.do"><ref local="secure_viewOrder"/></entry>
      </map>
    </property>
  </bean>
  原来Q上面的signonInterceptor实现?jin)preHandleQ因此在h上面的map面Ӟ首先要经q这个InterceptorQ看? SignonInterceptor的源码,原来在其中ؓ(f)signon.jsp赋予一个signonForwardAction对象Q呵呵,ȝ明白?jin)?br> 3). 接下来去学习(fn)一下SignonControllerQ其M部分中可以看出,首先取出用户输入的username和passwordQ然后到数据库中验证 有没有这个用P如果没有q个用户Q返回各错误面Q如果成功,首先生成一个UserSession对象Q在request的session加入q个 userSessionQ注意这部分代码中给Z(jin)PagedListHolder分页的简单用方法,关于分页昄Q以后再学习(fn)吧?/font>

3、登录成功后Q就可以Ҏ(gu)不同的用戯施不同的行ؓ(f)?jin),取得用户信息Q无非就是从session取出userSession卛_?/font>



chenguo 2007-06-18 18:05 发表评论
]]>
Spring学习(fn)W记pdQ六Q?aophttp://www.tkk7.com/cgogg/articles/124984.htmlchenguochenguoMon, 18 Jun 2007 10:03:00 GMThttp://www.tkk7.com/cgogg/articles/124984.htmlhttp://www.tkk7.com/cgogg/comments/124984.htmlhttp://www.tkk7.com/cgogg/articles/124984.html#Feedback0http://www.tkk7.com/cgogg/comments/commentRss/124984.htmlhttp://www.tkk7.com/cgogg/services/trackbacks/124984.html实践?jin)《指南》中的例?65到169,最后补充一个ActionQ?br>public class AOPMethodCostTimeAction extends ActionSupport {

 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  WebApplicationContext wac = this.getWebApplicationContext();
  ITest dao =(ITest)wac.getBean("myAOPProxyFactory");
  dao.doTest();
  dao.executeTest();
  return mapping.findForward("success");
 }

}
具体代码已经攑ֈgmail邮箱?jin)?/p>

仅仅从这个例子ȝ一下:(x)

1Q配|文件中需?br><!-- aop test-->
 <bean id="myPointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
  <property name="advice">
   <ref local="MyInterceptor"/>
  </property>
  <property name="patterns">
   <list>
    <value>.*do.*</value>
    <value>.*execute.*</value>
   </list>
  </property>
 </bean>
 <!-- user by PointcutAdvisor -->
 <bean id="MyInterceptor" class="srx.test.interceptor.MethodTimeCostInterceptor"></bean>
 <!-- proxy factory user by Actoin -->
 <bean id="myAOPProxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="proxyInterfaces">
   <value>srx.test.interfaces.ITest</value>
  </property>
  <property name="target">
   <ref local="test"/>
  </property>
  <property name="interceptorNames">
   <value>myPointcutAdvisor</value>
  </property>
 </bean>
 <!-- the dao bean be proxyed-->
 <bean id="test" class="srx.test.impl.test"></bean>

 

 2Qstruts-config.xml

<!-- AOP test , this is a action call two function ,and pring every method proced cost time-->
  <action path="/methodcost" type="srx.test.struts.action.AOPMethodCostTimeAction">
    <forward name="success" path="/WEB-INF/jsp/srx/test/aop/success.jsp"/>
  </action>

使用动态代理,我本来有ITest接口Q及(qing)其实现类test。以?qing)用test的Action。现在,我想试test

U方法的调用旉Q我需要怎么做呢Q?/font>

我只需要多定义三个BeanQmyPointcutAdvisorQMyInterceptorQmyAOPProxyFactory?/font>

三者的依赖关系

myAOPProxyFactory [ myPointcutAdvisor MyInterceptor  ] ]

其中advice定义和具体的Spring advicecL关系?br>
待箋(hu)?/p>

chenguo 2007-06-18 18:03 发表评论
]]>
Spring学习(fn)W记pdQ五Q?与hibernate整合 bhttp://www.tkk7.com/cgogg/articles/124983.htmlchenguochenguoMon, 18 Jun 2007 10:02:00 GMThttp://www.tkk7.com/cgogg/articles/124983.htmlhttp://www.tkk7.com/cgogg/comments/124983.htmlhttp://www.tkk7.com/cgogg/articles/124983.html#Feedback0http://www.tkk7.com/cgogg/comments/commentRss/124983.htmlhttp://www.tkk7.com/cgogg/services/trackbacks/124983.html

现象1Q?br>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.support.DefaultPointcutAdvisor' defined in null: Can't resolve reference to bean 'txAdvice' while setting property 'advice'; nested exception is

原因Q缺Spring开头的各种包,到Spring2.0 src中编译新的dist目录出来Q拷贝全部的springxxx.jar到jpetstore/WEB-INF/lib下。OK?br>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

现象2Q?br>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in resource [/WEB-INF/dataAccessContext-hibernate.xml] of ServletContext: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/transaction/TransactionManager
java.lang.NoClassDefFoundError: javax/transaction/TransactionManager


原因Q缺jta.jarQOK

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

现象3Q?/p>

java.lang.NoClassDefFoundError: org/dom4j/Attribute
~dom4j.jar
java.lang.NoClassDefFoundError: net/sf/ehcache/CacheException
~ehcache.jar
java.lang.NoClassDefFoundError: net/sf/cglib/core/KeyFactory
~cglib-full.jar

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

现象4Q?br>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in resource [/WEB-INF/dataAccessContext-hibernate.xml] of ServletContext: Initialization of bean failed; nested exception is net.sf.hibernate.MappingException: could not instantiate id generator
net.sf.hibernate.MappingException: could not instantiate id generator

原因Q?br>hbm中id字段的定义ؓ(f)没有定义的sequesce,修改为inc
<id
   name="id"
   type="string"
   column="userid"
  >
   <generator class="net.sf.hibernate.id.IncrementGenerator"/> // 原来是sequence.
  </id>
q样可以了(jin)?br>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

现象6Q?br>org.springframework.beans.factory.BeanCreationException: Error creating bean with name '/shop/addItemToCart.do' defined in ServletContext resource [/WEB-INF/petstore-servlet.xml]: Can't resolve reference to bean 'petStore' while setting property 'petStore'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'petStore' is defined
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'petStore' is defined
原因Q?br>我用Struts作ؓ(f)action,当然׃需要用Spring WEB framework,因此也不需要与之配套的配置文g例如,petstore-servlet.xml,
q有remote-servlet.xml ,但是Spring仍旧加蝲此两个文Ӟ没办法,只好此两个文g挪动到别的地方,但是又出现找不到q两?br>文g的IO异常Q没办法Q只好又拯回来Q然后把文g内容晴空?br>l于好用?jin)?br>? 因就是,只要你在web.xml中定义了(jin)q个servletQ他pL此servlet名字对应的配|文Ӟservletname- servlet.xmlQ?找不到就出错。okQ现在注释掉web.xml中名字ؓ(f)petstore的servlet定义和媄(jing)Ԍ删除petstore- servlet.xml文gQ哈哈,q下不报告错误了(jin)?br>同理Q注释名字ؓ(f)remote的servletQ删除remote-servlet.xml后,重新启动tomcatQ这下不报告M错误?jin)。呵c(din)原来如此啊?/p>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
现象Q?br>java.lang.NullPointerException
 srx.test.testhibernate.UserDAO.getAll(UserDAO.java:9)
 srx.test.struts.action.UserAction.execute(UserAction.java:20)
原因Q?/p>

Action原来
UserDAO // q个cOK
public class UserDAO extends HibernateDaoSupport {
 public List getAll() {
       return this.getHibernateTemplate().find("select aa from Account aa");
 }
}

//q个c需要修?br>public class UserAction extends ActionSupport {
  UserDAO dao = new UserDAO();
  List accounts = dao.getAll();
。。?br>}
修改Q?br>//UserDAO dao = new UserDAO();
WebApplicationContext wac = this.getWebApplicationContext();
  UserDAO dao = (UserDAO) wac.getBean("userDAO");
OK


现象:
UserAction中修?
//UserDAO dao = (UserDAO) wac.getBean("userDAO");
UserDAO dao = (UserDAO) wac.getBean("userDAOProxy"); //@1
配置文g中增?
<bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager">
   <ref local="transactionManager"/>
  </property>
  <property name="target"><ref local="userDAO"/></property>
  <property name="transactionAttributes">
   <props>
    <prop key="insert*">PROPAGATION_REQUIRED</prop>
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
   </props>
  </property>
</bean>

q样q行时@1处抛出ClassCastException.
===================================================================================================
原因:
仔细看指?.8版本145|描述的事?UserDAO虽然只(h)承了(jin)HibernateDAOSupport,看来没有事先M接口,但是
HibernateDAOSupport实现?jin)InitiralBean接口Q所以UserDAO也相当于实现?jin)这个接口?br>因此本例按照实现?jin)某个接口的DAO来处理,处理q程如下Q?br> 因ؓ(f)他实C(jin)接口AQ所以getBean得到一个实C(jin)A的实例,ql承UserDAO。所以用UserDAO转型?x)失败?br> 如果UserDAO没有实现接口AQ那么getBean?x)得C个UserDAO的子cd例,q时可以用UserDAO来{型?br>lg所诉,UserDAO必须实现IUserDAO接口,q且用IUserDAO转型才行.
 因ؓ(f)UserDAO必须l承HibernateDAOSupport,所以没有办法不实现M接口.

本问题和AOP有关。因为对AOPq(sh)熟?zhn)Q所以需要看看?/p>



chenguo 2007-06-18 18:02 发表评论
]]>
Spring学习(fn)W记pdQ五Q?与hibernate整合 ahttp://www.tkk7.com/cgogg/articles/124982.htmlchenguochenguoMon, 18 Jun 2007 10:01:00 GMThttp://www.tkk7.com/cgogg/articles/124982.htmlhttp://www.tkk7.com/cgogg/comments/124982.htmlhttp://www.tkk7.com/cgogg/articles/124982.html#Feedback0http://www.tkk7.com/cgogg/comments/commentRss/124982.htmlhttp://www.tkk7.com/cgogg/services/trackbacks/124982.html在学?fn)这一部分的时候我作了(jin)一个用StrutsAction讉KUserDAO中方法,此方法用了(jin)hibernateTemplate。调试过E中问题多多Q好在一个一个解决了(jin)?/div>
JPetStore2.0 已经有ibatis做ؓ(f)OR层了(jin)Q我要换成hibernate需要修改Spring配置文g中的bean id="TransactionManager" 、增加bean id=“sessionFactory”。又因ؓ(f)配置文gid=TransactionManager的bean只能有一个,修改为hibernate? 原来使用ibatis的bean都不好用了(jin)Q所以我新创Z(jin)一个空的配|文件dataAccessContext-hibernate.xml。只有几 个字定义的beanQ如下:(x)

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

 <!-- ========================= RESOURCE DEFINITIONS ========================= -->

 <!-- Local Apache Commons DBCP DataSource that refers to a combined database -->
 <!-- (see dataAccessContext-jta.xml for an alternative) -->
 <!-- The placeholders are resolved from jdbc.properties through -->
 <!-- the PropertyPlaceholderConfigurer in applicationContext.xml -->
 <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/jpetstore</value></property>
  <property name="username" ><value>root</value></property>
  <property name="password" ><value>123456</value></property>
 </bean>
 
 
 <bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
  <property name="dataSource">
   <ref local="dataSource"/>
  </property>
  <property name="mappingResources">
   <list>
    <value>srx/test/hibernate/Account.hbm</value>
   </list>
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
     net.sf.hibernate.dialect.MySQLDialect
    </prop>
    <prop key="hibernate.showsql">
     true
    </prop>
   </props>
  </property>
 </bean>
 
    <!-- Transaction manager for a single JDBC DataSource -->
 <!-- (see dataAccessContext-jta.xml for an alternative) -->
 <bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
  <property name="sessionFactory">
   <ref local="sessionFactory"/>
  </property>
 </bean>
 
 
 
 <!-- this bellow is hibernate configuration for srx test-->
 
 
 <bean id="userDAO" class="srx.test.testhibernate.UserDAO">
  <property name="sessionFactory">
   <ref local="sessionFactory"/>
  </property>
 </bean>
</beans>

原来包含很多复杂内容的applicationContext.xml也拷贝一份applicationContext2.xmlQ删除和JPetStore相关的内容,留下通用的部分:(x)

 <?xml version="1.0" encoding="UTF-8"?>

<!--
  - Application context definition for JPetStore's business layer.
  - Contains bean references to the transaction manager and to the DAOs in
  - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").
  -->
<beans xmlns="
http://www.springframework.org/schema/beans"
    xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="
http://www.springframework.org/schema/aop"
    xmlns:tx="
http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
   <list>
    <value>WEB-INF/mail.properties</value>
    <value>WEB-INF/jdbc.properties</value>
   </list>
  </property>
 </bean>
 
 <aop:config>
  <aop:advisor pointcut="execution(* *..PetStoreImpl.*(..))" advice-ref="txAdvice"/>
 </aop:config>

 <!--
  Transaction advice definition, based on method name patterns.
  Defaults to PROPAGATION_REQUIRED for all methods whose name starts with
  "insert" or "update", and to PROPAGATION_REQUIRED with read-only hint
  for all other methods.
 -->
 <tx:advice id="txAdvice">
  <tx:attributes>
   <tx:method name="insert*"/>
   <tx:method name="update*"/>
   <tx:method name="*" read-only="true"/>
  </tx:attributes>
 </tx:advice>
</beans>

在Struts配置文g中增加自qAction如下Q?br>
 <action path="/showusers" type="srx.test.struts.action.UserAction">
    <forward name="success" path="/WEB-INF/jsp/srx/test/hibernate/showusers.jsp"/>
  </action>
  

web.xml中用action作ؓ(f)*。do处理的servlet而不是默认的petstore?br>q注释掉名字为petstore,remoting的servlet。如下:(x)

 <web-app 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" version="2.4">

 <display-name>Spring JPetStore</display-name>

 <description>Spring JPetStore sample application</description>
 
 <context-param>
  <param-name>webAppRootKey</param-name>
  <param-value>petstore.root</param-value>
 </context-param>

 <context-param>
  <param-name>log4jConfigLocation</param-name>
  <param-value>/WEB-INF/log4j.properties</param-value>
 </context-param>

 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
   /WEB-INF/dataAccessContext-hibernate.xml
  </param-value>
 </context-param>

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

 <servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
  <load-on-startup>3</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.do</url-pattern>
 </servlet-mapping>
 ...

</web-app>



chenguo 2007-06-18 18:01 发表评论
]]>
Spring学习(fn)W记pdQ三Q?异常处理http://www.tkk7.com/cgogg/articles/124980.htmlchenguochenguoMon, 18 Jun 2007 10:00:00 GMThttp://www.tkk7.com/cgogg/articles/124980.htmlhttp://www.tkk7.com/cgogg/comments/124980.htmlhttp://www.tkk7.com/cgogg/articles/124980.html#Feedback0http://www.tkk7.com/cgogg/comments/commentRss/124980.htmlhttp://www.tkk7.com/cgogg/services/trackbacks/124980.html配置Spring异常处理之需要增加一个bean的配|:(x)

增加?jin)一个异常处理的bean
 <!-- Exception Resolver-->
 <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  <property name="defaultErrorView">
   <value>/exception/failure</value>
  </property>

  <property name="exceptionMappings">
   <props>
    <prop key="java.sql.SQLException">/exception/showDBError</prop>
    <prop key="java.lang.RuntimeException">/exception/showError</prop>    
   </props> 
  </property>
 </bean>

q样可以统一分别处理不同Exception?jin)。注意jsp面在request中attribute{于“exception”,

而不?#8220;Exception”注意大小写。页面如下:(x)

错误昄面

 <c:set value="${exception}" var="ee"/>
  <jsp:useBean id="ee" type="java.lang.Exception" />
  <%=ee.getMessage()%><br>
<%ee.printStackTrace( new java.io.PrintWriter(out));%>


当然也可以做得更友好些,例如可以昄隐藏详细信息?/font>

<%@ taglib prefix="c" uri=">
<%@ taglib prefix="spring"  uri="
>
<%@ page contentType="text/html;charset=GBK" language="java" pageEncoding="GBK"%>
<%@ page import="java.util.Enumeration,java.util.Iterator"%>
<script>
 function showErr(){
  var isHidde = document.all.isHidde.value;
  //alert(isHidde);
  if( isHidde == "true" ){
   document.all.errdiv.style.display='block';
   document.all.isHidde.value= 'false';
   document.all.showbtn.value="隐藏错误信息";
  }else{
   document.all.errdiv.style.display='none';
   document.all.isHidde.value= 'true';
   document.all.showbtn.value="昄错误信息";
  }
 }
</script>
<html>
 <head>
  <title>this is failure</title>
 </head>
 <body onload="showErr()"> 

<c:set value="${exception}" var="ee"/>
  <jsp:useBean id="ee" type="java.lang.Exception" />
  <%=ee.getMessage()%>okQ?lt;br>
  
  
  <table id="errdiv" align="center" bgcolor="darkseagreen">
  <tr><td>
  <font color=red>
  <%ee.printStackTrace( new java.io.PrintWriter(out));%>
  </font>
  </td></tr></table>
  <input type="hidden" id="isHidde" value="true"/>
  <input type="button" id="showbtn" onclick="showErr();"/>

 </body>
</html>

增加?jin)一个异常处理的bean
 <!-- Exception Resolver-->
 <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  <property name="defaultErrorView">
   <value>/exception/failure</value>
  </property>

  <property name="exceptionMappings">
   <props>
    <prop key="java.sql.SQLException">/exception/showDBError</prop>
    <prop key="java.lang.RuntimeException">/exception/showError</prop>    
   </props> 
  </property>
 </bean>

q样可以统一分别处理不同Exception?jin)。注意jsp面在request中attribute{于“exception”,

而不?#8220;Exception”注意大小写。页面如下:(x)

错误昄面

 <c:set value="${exception}" var="ee"/>
  <jsp:useBean id="ee" type="java.lang.Exception" />
  <%=ee.getMessage()%><br>
<%ee.printStackTrace( new java.io.PrintWriter(out));%>


当然也可以做得更友好些,例如可以昄隐藏详细信息?/font>

<%@ taglib prefix="c" uri=">
<%@ taglib prefix="spring"  uri="
>
<%@ page contentType="text/html;charset=GBK" language="java" pageEncoding="GBK"%>
<%@ page import="java.util.Enumeration,java.util.Iterator"%>
<script>
 function showErr(){
  var isHidde = document.all.isHidde.value;
  //alert(isHidde);
  if( isHidde == "true" ){
   document.all.errdiv.style.display='block';
   document.all.isHidde.value= 'false';
   document.all.showbtn.value="隐藏错误信息";
  }else{
   document.all.errdiv.style.display='none';
   document.all.isHidde.value= 'true';
   document.all.showbtn.value="昄错误信息";
  }
 }
</script>
<html>
 <head>
  <title>this is failure</title>
 </head>
 <body onload="showErr()"> 

<c:set value="${exception}" var="ee"/>
  <jsp:useBean id="ee" type="java.lang.Exception" />
  <%=ee.getMessage()%>okQ?lt;br>
  
  
  <table id="errdiv" align="center" bgcolor="darkseagreen">
  <tr><td>
  <font color=red>
  <%ee.printStackTrace( new java.io.PrintWriter(out));%>
  </font>
  </td></tr></table>
  <input type="hidden" id="isHidde" value="true"/>
  <input type="button" id="showbtn" onclick="showErr();"/>

 </body>
</html>




chenguo 2007-06-18 18:00 发表评论
]]>
Spring学习(fn)W记pdQ四Q?与struts整合http://www.tkk7.com/cgogg/articles/124981.htmlchenguochenguoMon, 18 Jun 2007 10:00:00 GMThttp://www.tkk7.com/cgogg/articles/124981.htmlhttp://www.tkk7.com/cgogg/comments/124981.htmlhttp://www.tkk7.com/cgogg/articles/124981.html#Feedback0http://www.tkk7.com/cgogg/comments/commentRss/124981.htmlhttp://www.tkk7.com/cgogg/services/trackbacks/124981.html

To integrate your Struts application with Spring, you have two options:

  • Configure Spring to manage your Actions as beans, using the ContextLoaderPlugin, and set their dependencies in a Spring context file.

  • Subclass Spring's ActionSupport classes and grab your Spring-managed beans explicitly using a getWebApplicationContext() method.

16.3.2. ActionSupport Classes

As previously mentioned, you can retrieve the WebApplicationContext from the ServletContext using the WebApplicationContextUtils class. An easier way is to extend Spring's Action classes for Struts. For example, instead of subclassing Struts' Action class, you can subclass Spring's ActionSupport class.

The ActionSupport class provides additional convenience methods, like getWebApplicationContext(). Below is an example of how you might use this in an Action:

public class UserAction extends DispatchActionSupport {    public ActionForward execute(ActionMapping mapping,                                 ActionForm form,                                 HttpServletRequest request,                                 HttpServletResponse response)            throws Exception {        if (log.isDebugEnabled()) {            log.debug("entering 'delete' method...");        }        WebApplicationContext ctx = getWebApplicationContext();        UserManager mgr = (UserManager) ctx.getBean("userManager");        // talk to manager for business logic        return mapping.findForward("success");    }}

Spring includes subclasses for all of the standard Struts Actions - the Spring versions merely have Support appended to the name:

The recommended strategy is to use the approach that best suits your project. Subclassing makes your code more readable, and you know exactly how your dependencies are resolved. However, using the ContextLoaderPlugin allow you to easily add new dependencies in your context XML file. Either way, Spring provides some nice options for integrating the two frameworks.

可见W二U方法更加简ѝ?/p>

JPetstore例子中ƈ没有使用此方法,而用了(jin)W三U方法。同样只需要动Action。如下:(x)

public abstract class BaseAction extends Action {

  private PetStoreFacade petStore;

 public void setServlet(ActionServlet actionServlet) {
  super.setServlet(actionServlet);
  if (actionServlet != null) {
   ServletContext servletContext = actionServlet.getServletContext();
   WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
   this.petStore = (PetStoreFacade) wac.getBean("petStore");
  }
 }

 protected PetStoreFacade getPetStore() {
  return petStore;
 }

}
okQ这三种Ҏ(gu)都可以让Spring与Struts整合Q相比较W一U(因ؓ(f)配置很多q里没写Q见refernce 16.3.1Q,
W二W三U方法比较简z,侵入不多?/p>

chenguo 2007-06-18 18:00 发表评论
]]>
Spring学习(fn)W记pdQ一Q?/title><link>http://www.tkk7.com/cgogg/articles/124979.html</link><dc:creator>chenguo</dc:creator><author>chenguo</author><pubDate>Mon, 18 Jun 2007 09:58:00 GMT</pubDate><guid>http://www.tkk7.com/cgogg/articles/124979.html</guid><wfw:comment>http://www.tkk7.com/cgogg/comments/124979.html</wfw:comment><comments>http://www.tkk7.com/cgogg/articles/124979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/cgogg/comments/commentRss/124979.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/cgogg/services/trackbacks/124979.html</trackback:ping><description><![CDATA[<p>ApplicationContext ctx </p> <p>1Q定义资源文件获得资源文件的消息Q国际化信息<br><bean id="messageResource" class="org.springFramework.context.support.ResourceBoundleMessageSource"><br> <property name="basenames"><br>  xxxx<br> </property><br></bean><br>会(x)搜烦(ch)xxxx.properties,xxxx_zh.properties ,xxxx_ch.properties{?/p> <p>2Q?br>E序里用资源文?Qctx.getMessage('key',arg);<br>面上用资源文Ӟ(x)<spring:message code="keyxxx"/></p> <p><br>3Q用其他文件?br> Resource rs = ctx.getResource("classpath:config.properties");<br> File file = rs.getFile();<br> 目录规则Q?br> fileQcQ?test。txt<br> /config.properties<br> classpath:config.properties<br> 三种方式?/p> <p>4Q事件传?br>  不过没有扑ֈApplicationListenerq个cR?/p> <p>5, WebApp获取ApplicaionContext的方法,<br> 首先是在web。xml中进行配|,可以配置成一个listenerQ也可以配置成一个servlet?br> 然后E序里用WebApplicationContextUtils.getWebApplicationContext.获得饮用?/p> <p>6QSpring可以和很多框架进行集成?br> Struts+SpringQW(xu)ebwork+Spring?/p> <p>7QSpring可以有自q调度c,DispatherServlet?br> 使用的配|文件就是beans的配|,名字可以随便取?/p> <p>8QSping配置文gQ具体名字见web.xml中对ContextLoaderServlet的参敎ͼ(j)cM于Struts的配|文件?br> 定义viewer使用的是pȝc:(x)<br>  org.springframework.web.servlet.view.InternalResourceViewResolver<br> Request mapping 使用的系l类Q?br>  org.springframework.web.servlet.handler.SimpleUrlHandleMapping<br> 对Action的定义用自定义c,但这些类都是下面cȝ子类Q?br>  SimpleFormController<br> Actoin的属性包括:(x)<br>  1Q蟩转的面Q和view兌<br>  2Q封装f(xi)ormc,是一个普通的javabean?br>  <br>9QAcitioncȝ内容Q?br>  实现onsubmitQ?装的formQ异常对象)(j) q回一个ModelAndView?br>  ModelAndView用字W串初始化,字符串来自Action的两个蟩转view名称?br>  q可以把Map传入ModelAndView构造函敎ͼ用来q回消息?/p> <p><br>10QSpring自带的数据验证功能?br> 10.1Q验证类作ؓ(f)Aciotn的一个名?#8220;validator”的属性在配置文g中配|?br> 此类l承org.springframework.validation.Validator<br> 需要实C个接口,supportQ传入一个类Q,验证此类是否是Action对应的formcR?br> validatorQobject objQErrors err )首先把obj转ؓ(f)formcd象,如果有错误放到errors里,用法?br>  strutscM?br> <br> 10.2Q表现层面需要的昄错误<br>  全部错误Q?br>  <spring:bind path="command.*"><br>   //遍历status.errorMessages<br>  </spring:bind>  <br> <br>  单个错误Q?br>  <spring:bind path="command.username"><br>   <input type="text" value="${staus.value}" name="${status.expression}"><br>   <c:if test="${status.error}"><br>    //遍历status.errorMessages<br>   </c:if><br>  </spring:bind><br>  如果已经在Action中配|了(jin)commandNameQ那么就不用command?jin),而是使用配置的名?br>  <bean id=‘loginActoni’><br>   <property name="commandName"><br>    <value>RegisterInfo</value><br>   </property><br>  </bean></p> <p>11, 异常处理<br> 在Dispather的配|文件中配置<br> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><br> 定义两个属性:(x)<br> <property name="defaultErrorView"><br> <property name="exceptionMapping"><br>  <props><br>   <prop key="java.sql.SQLException">sss</prop><br>   <prop key="java.lang.RuntimeException">yyy</prop><br>  </props><br> </property> <br> 可以按不同异常映到不同的页面?br> 异常面从request.getAttribute("Exception")取得Exception对象。显CZ的message属性?/p> <p>12Q国际化<br> 看完1后,补充如下Q?br> Spring判断用户Locale的方式有三种Qrequest中取Qsession中取Qcookie中取客户端的locale?br> 分别用三个类Q配|到配置文g中?/p> <p>13Q数据持久层Q重要)(j)对事务的装<br> Spring是依赖容器的参数化事务管理不用写代码?br> 见p67?br> 1Q在配置文g中配|完数据源,<br> 2Q之后配|事务管理的beanQ数据源是它的属性?br> 3QDAOQ事务员是它的属性?br> 4Q事务beanDAOProxyQ事务策略,事务beanQDAO都是它的属性?/p> <p>14Q数据持久层Q对JDBC的封?br> org.springframework.jdbc.core.JdbcTemplate.<br> JdbcTemplate jdbctemplate = new JdbcTemptlate( datasource );<br> jdbctemplate.update("xxxxx");<br> jdbctemplate.update("xxxxx",new PreparedStatementSetter(){<br>  public void setValues( PreparedStatementSetter ps ){<br>   ps.setInt(1,15);<br>   ps.setString(2,"jjjjjjj");<br>  }<br> });<br> jdbctemplate.query("select ...",new RollbackHandler(){<br>  public void processRow( ResultSet rs ){<br>   User user = new User();<br>   user.setName= rs.getString("name");<br>   userList.add( user )Q?br>  }<br> });</p> <p> .call()可以调用存储q程?br> query,updateq有很多不同版本的实现?br> </p> <p>15, JDBC装q要引入事务理机制Q默认是没有事务的?br> 两种方式<br> 1Q代码控制的Q在DAO里TransactionTemplate使用它的Ҏ(gu)?br> 2Q参数化配置的事务。配|一个ProxyDAOQ不用写q个c,只需要在配置文g里增加他对DAO的事物设|?br>  使得DAO代码十分z?/p> <p> 试代码Q?br> InputStream is = new FileInputStream("xxx.xml");<br> XmlBeanFactory factory = new XmlBeanFactoy( is );<br> UserDAO dao = (UserDAO)factory.getBean("ProxyDAO");<br> dao.insert();//q样p?/p> 16QHibernate in Spring<br> 只需修改配置文g增加一个bean名字为sessionFactoryQ数据源作ؓ(f)他的属性?br> TrsactionManager的属性:(x)sessionFactory<br> IDAO接口Q定义数据库操作Ҏ(gu)?br> DAO的属性:(x)sessionFactory。(h)承HibernateDAOSupportQƈ实现IDAO接口?br>   里面使用getHibernateTemplate模版q行数据库操作?br> ProxyDAO的属性:(x)transactionManager,DAO.<br> <br> 试例子Q?br> IUserDAO dao=(IUserDAO)factory.getBean("ProxyUserDAO"); <br> User user = new User();<br> user.setxxx...<br> dao.insertOrUpdate(user);<br> <img src ="http://www.tkk7.com/cgogg/aggbug/124979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/cgogg/" target="_blank">chenguo</a> 2007-06-18 17:58 <a href="http://www.tkk7.com/cgogg/articles/124979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring学习(fn)W记pdQ二Q?/title><link>http://www.tkk7.com/cgogg/articles/124978.html</link><dc:creator>chenguo</dc:creator><author>chenguo</author><pubDate>Mon, 18 Jun 2007 09:53:00 GMT</pubDate><guid>http://www.tkk7.com/cgogg/articles/124978.html</guid><wfw:comment>http://www.tkk7.com/cgogg/comments/124978.html</wfw:comment><comments>http://www.tkk7.com/cgogg/articles/124978.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/cgogg/comments/commentRss/124978.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/cgogg/services/trackbacks/124978.html</trackback:ping><description><![CDATA[<p>Spring学习(fn)W记?2006.1.4)</p> <p>1,配置文g的配|头<br><?xml version="1.0" encoding="UTF-8"?></p> <p><!--<br>  - Application context definition for JPetStore's business layer.<br>  - Contains bean references to the transaction manager and to the DAOs in<br>  - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").<br>  --><br><beans xmlns="<a <br>    xmlns:xsi="<a <br>    xmlns:aop="<a <br>    xmlns:tx="<a <br>    xsi:schemaLocation="<a >http://www.springframework.org/schema/beans</a> <a >http://www.springframework.org/schema/beans/spring-beans.xsd</a><br>       <a >http://www.springframework.org/schema/aop</a> <a >http://www.springframework.org/schema/aop/spring-aop.xsd</a><br>       <a >http://www.springframework.org/schema/tx</a> <a ><br>q样写才?/p> <p>2Q配|文件可以用多个属性文?br><!-- Configurer that replaces ${...} placeholders with values from properties files --><br> <!-- (in this case, mail and JDBC related properties) --><br> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><br>  <property name="locations"><br>   <list><br>    <value>WEB-INF/mail.properties</value><br>    <value>WEB-INF/jdbc.properties</value><br>   </list><br>  </property><br> </bean><br>cL框架的?br>里面包含两个属性文Ӟ属性文仉都是“key=value”q种形式的。这样配|文仉可以用属性文仉的keyQ用方?br>${key},q样转移出属性设|,l护h比较方便?/p> <p>3,定义Validator供web层用,自定义类?br><bean id="accountValidator" class="org.springframework.samples.jpetstore.domain.logic.AccountValidator"/><br>c里面用了(jin)ValidatorUtilspȝcLq行处理?/p> <p>4Q服务层的定义?br> PetStoreImpl定义在配|文件中Q是自己的类?br> 所有的DAO都是它的属性,注意QDAO是interface,而不是class.<br> PetStoreImpl中定义了(jin)所有的DAO接口作ؓ(f)属性,定义?jin)他们的setҎ(gu)Q但是没有定义getҎ(gu)?br> q样所有的业务操作可以不用管DAO是如何实现的?jin),而只用这个PetStoreImpl好?jin)?/p> <p> DAO都是接口q种做法与^时开发不一P我以前用hibernate生成工具生成的dao都是默认好的实现cR?br> 而此处的DAO却都是接口。他们的实现Ҏ(gu)是这L(fng)Q?br> interface PetStoreFacade { } //定义所有的业务Ҏ(gu)?br> interface AccountDao{} //定义所有帐L(fng)业务Ҏ(gu)?br> interface CategoryDao{} //定义cd的业务方法?br> interface ProductDao{} //定义产品的业务方法?br> 。。。其他DAO接口Q定义自q业务Ҏ(gu)?br> class PetStoreImpl implements PetStoreFacade //q个cd是一个javabeanQ操作的都是接口?br> //定义所有DAO接口当作自己的属性?br> //实现setҎ(gu)<br> //实现PetStoreFacade 定义的业务接口,实现的时候调用DAO接口的方法?/p> <p> 如果是我自己Q那么就?x)定义IDAO当作接口Q因为hibernate插g自动生成daoc,Ҏ(gu)h?br> <br>5Q配|文件中定义dataSource<br> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><br>  <property name="driverClassName" value="${jdbc.driverClassName}"/><br>  <property name="url" value="${jdbc.url}"/><br>  <property name="username" value="${jdbc.username}"/><br>  <property name="password" value="${jdbc.password}"/><br> </bean><br> 可见Q可以直接用properties中的key。另外可以将数据库操作弄成另外一个配|文件。只要在web.xml中设|好可以了(jin)Q?br> <context-param><br>  <param-name>contextConfigLocation</param-name><br>  <param-value><br>   /WEB-INF/dataAccessContext-local.xml  /WEB-INF/applicationContext.xml<br>  </param-value><br> </context-param></p> <p>6Q配|文件中定义事务理<br><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><br>  <property name="dataSource" ref="dataSource"/><br> </bean><br> 使用?jin)数据源作?f)属性?/p> <p>7Qdao具体实现cR?br> JPetStore使用ibatis作ؓ(f)ORM层。所以daocȝ定义也都使用?jin)ibatis?br> PetStoreImpl五个接口接受五个实现?jin)对应接口的实现cR这里的实现c,<br><bean id="petStore" class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl"><br>  <property name="accountDao" ref="accountDao"/><br>  <property name="categoryDao" ref="categoryDao"/><br>  <property name="productDao" ref="productDao"/><br>  <property name="itemDao" ref="itemDao"/><br>  <property name="orderDao" ref="orderDao"/><br> </bean><br> <bean id="accountDao" class="org.springframework.samples.jpetstore.dao.ibatis.SqlMapAccountDao"><br>  <property name="sqlMapClient" ref="sqlMapClient"/><br> </bean><br> 实现c,使用ibatis。在配置文g中对英?br>public class SqlMapAccountDao extends SqlMapClientDaoSupport implements AccountDao{<br> //实现?jin)业务接口,l承?jin)ibatis基本cR?br> }</p> <p><br>8Qibatis基础cR?br>    <!-- SqlMap setup for iBATIS Database Layer --><br> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><br>  <property name="configLocation" value="WEB-INF/sql-map-config.xml"/><br>  <property name="dataSource" ref="dataSource"/><br> </bean><br> dao实现c都׃作属性?br>    <bean id="accountDao" class="org.springframework.samples.jpetstore.dao.ibatis.SqlMapAccountDao"><br>  <property name="sqlMapClient" ref="sqlMapClient"/><br> </bean></p> <p>9Q我竟然找不到action对应的mapping在什么地方定义的?br>后来扑ֈ?jin)是petstore-servlet.xml,by default defined in "{servlet-name}-servlet.xml"...<br><!--<br>   - Spring web MVC servlet that dispatches requests to registered handlers.<br>   - Has its own application context, by default defined in "{servlet-name}-servlet.xml",<br>   - i.e. "petstore-servlet.xml" in this case.<br>   -<br>   - A web app can contain any number of such servlets.<br>   - Note that this web app has a shared root application context, serving as parent<br>   - of all DispatcherServlet contexts.<br>   --><br> <servlet><br>  <servlet-name>petstore</servlet-name><br>  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><br>  <load-on-startup>2</load-on-startup><br> </servlet><br> 原来是根据servlet名字命名影射文g的?br> 影射文g和配|文件的l构完全一_(d)也是beans开头的。主要是web层的url影射Q?br> <beans><br> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><br>  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/><br>  <property name="prefix" value="/WEB-INF/jsp/spring/"/><br>  <property name="suffix" value=".jsp"/><br> </bean><br> ....<br> </beans><br> okQ现在把petstore-servlet.xml也放到SpringIDE里察看?/p> <p>10Q配|文件petstore-servlet.xml<br> viewResolver,定义?jin)一个表现层的基本配|,此bean名字固定?br> 属性viewClass使用?jin)jstl技术?br> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><br>  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/><br>  <property name="prefix" value="/WEB-INF/jsp/spring/"/><br>  <property name="suffix" value=".jsp"/><br> </bean></p> <p>11Q配|文件petstore-servlet.xml<br> defaultHandlerMapping使用默认的BeanNameUrl影射Q具体不太明白?br> <bean id="defaultHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/></p> <p>12Q配|文件petstore-servlet.xml<br> 定义*.do<br><bean name="/shop/addItemToCart.do" class="org.springframework.samples.jpetstore.web.spring.AddItemToCartController"><br>  <property name="petStore" ref="petStore"/><br> </bean><br> 属性petStore是在applicationContext.xml里定义的Q看来这里也可以使用其他<beans>定义的bean?/p> <p>13Q?.docȝI?br> 实现?jin)ControllerQ接口public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) <br> 有一个属性petstore,是一个接口PetStoreFacadeQ包括全部业务逻辑接口?br> <br>14Q首index<br> 在mapping文g里定义了(jin)pȝParameterizableViewControllerQ相当于forwardAction?br> <bean name="/shop/index.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController"><br>  <property name="viewName" value="index"/><br> </bean><br> 而首里大量使用?jin)jstl语言Q最重要的地Ҏ(gu)所?a href=, action=,处都使用?lt;c:url value="/xxxx"/><br> q样的定义,q样换域名或者设|虚拟目录名Q就?x)运行正怺(jin)。例如,<br><center><br><a href="<c:url value="/shop/viewCategory.do?categoryId=FISH"/>"><br><img border="0" src="../images/sm_fish.gif" /></a><br><img border="0" src="../images/separator.gif" /><br><a href="<c:url value="/shop/viewCategory.do?categoryId=DOGS"/>"><br><img border="0" src="../images/sm_dogs.gif" /></a><br><img border="0" src="../images/separator.gif" /><br><a href="<c:url value="/shop/viewCategory.do?categoryId=REPTILES"/>"><br><img border="0" src="../images/sm_reptiles.gif" /></a><br><img border="0" src="../images/separator.gif" /><br><a href="<c:url value="/shop/viewCategory.do?categoryId=CATS"/>"><br><img border="0" src="../images/sm_cats.gif" /></a><br><img border="0" src="../images/separator.gif" /><br><a href="<c:url value="/shop/viewCategory.do?categoryId=BIRDS"/>"><br><img border="0" src="../images/sm_birds.gif" /></a><br></center></p> <p>15Q?nbsp;q入首页后点左边的链接都指向同一个viewCategory.do,<br> <bean name="/shop/viewCategory.do" class="org.springframework.samples.jpetstore.web.spring.ViewCategoryController"><br>  <property name="petStore" ref="petStore"/><br> </bean><br> cȝIӞ(x)<br> ViewCategoryController implement Controller<br> 里面只用了(jin)PetStore实现cȝҎ(gu)Qƈ没有DAO对象。只有Domain对象?br> 很好Q把主要的和业务相关的东襉K在Controller中展现出来了(jin)Q其他辅助的东西都被隐藏?jin),使得Controller非常z?br> 另外Q在业务PetStoreImpcMQ用了(jin)DAOQ这样就使得后台E序也开始分层了(jin)?br> <br> |--层Controller?qing)用的daomain对象 /// W一?br>            |----层PetStoreFacade 接口?qing)他的实现类PetStoreImpl //W二?br>   |-------- 层DAO接口 QDAO接口实现c,//W三?br>    |------------实现cM使用的ORMc?nbsp; //W四?br> 层次非常的分明?br>    <br> daomainW合javabean规范Qƈ且有些javabeanq有自己的publicҎ(gu)。大多数javabean没有必要有publicҎ(gu)?/p> <p>16, 点击分类后,昄分类中的itemsQ点items可以q入viewProduct.doQproductId=xxxQ来观看产品?br> <bean name="/shop/viewProduct.do" class="org.springframework.samples.jpetstore.web.spring.ViewProductController"><br>  <property name="petStore" ref="petStore"/><br> </bean><br> q是一个翻功能的Controller?br> 没弄清楚成功后蟩转到什么地方? return new ModelAndView("Product", model);没有理解?br> <br>public class ModelAndViewextends ObjectHolder for both Model and View in the web MVC framework. Note that these are entirely distinct. This class merely holds both to make it possible for a controller to return both model and view in a single return value. </p> <p>Class to represent a model and view returned by a handler used by a DispatcherServlet. The view can take the form of a reference to a View object, or a String view name which will need to be resolved by a ViewResolver object. The model is a Map, allowing the use of multiple data objects keyed by name. </p> <p>public ModelAndView(String viewName,<br>                    Map model)Creates new ModelAndView given a view name and a model. </p> <p>Parameters:<br>viewName - name of the View to render, to be resolved by the DispatcherServlet<br>model - Map of model names (Strings) to model objects (Objects). Model entries may not be null, but the model Map may be null if there is no model data.</p> <p>q样viewNameq道了(jin)Q返回给DispatcherServerlet,再根据viewResolver中的定义Q就可以知道?jsp/spring/Product.jsp?jin)?br>也就是说QviewName也就是jsp文g的名字?/p> <p>17QModelAndView传递给面之后面如何使用其中的数?Q?br> Controller传递的model是一个mapQ一׃递了(jin)两个key-value寏V?br> model.put("itemList", itemList);<br> model.put("product", product);<br> okQ看jsp面?lt;c:out value="${product.name}"/><br><c:forEach var="item" items="${itemList.pageList}"><br>  <tr bgcolor="#FFFF88"><br>  <td><b><br>  <a href="<c:url value="/shop/viewItem.do"><c:param name="itemId" value="${item.itemId}"/></c:url>"><br>    <c:out value="${item.itemId}"/><br>  </a></b></td><br>  <td><c:out value="${item.productId}"/></td><br>  <td><br>    <c:out value="${item.attribute1}"/><br>    <c:out value="${item.attribute2}"/><br>    <c:out value="${item.attribute3}"/><br>    <c:out value="${item.attribute4}"/><br>    <c:out value="${item.attribute5}"/><br>    <c:out value="${product.name}"/><br>  </td><br>  <td><fmt:formatNumber value="${item.listPrice}" pattern="$#,##0.00"/></td><br>  <td><a href="<c:url value="/shop/addItemToCart.do"><c:param name="workingItemId" value="${item.itemId}"/></c:url>"><br>    <img border="0" src="../images/button_add_to_cart.gif"/><br>  </a></td><br>  </tr><br></c:forEach><br>原来是把key当作attributename攑ֈ?jin)request范围内了(jin)。这样就ok?jin),model的key实际上就是request的属性名字啊?br> model的value是request的属性倹{jstl真正发挥z的威力?jin)?/p> <p>18QviewProduct.do里还有一个翻늚逻辑Q没看明白怎么回事?/p> <p><br>19QviewProduct.do之后再点链接p入了(jin)viewItem.do,相对单。不用看?jin)?br>PagedListHolder itemList = new PagedListHolder(this.petStore.getItemListByProduct(productId));<br>java.lang.Object<br>  org.springframework.beans.support.PagedListHolder<br>PagedListHolder is a simple state holder for handling lists of objects, separating them into pages. Page numbering starts with 0. <br>Constructor Summary <br>PagedListHolder() <br>          Create a new holder instance. <br>PagedListHolder(List source) <br>          Create a new holder instance with the given source list, starting with a default sort definition (with "toggleAscendingOnProperty" activated). <br>PagedListHolder(List source, SortDefinition sort) <br>          Create a new holder instance with the given source list. <br> boolean isFirstPage() <br>          Return if the current page is the first one. <br> boolean isLastPage() <br>          Return if the current page is the last one. <br> void nextPage() <br>          Switch to next page. <br> void previousPage() <br>          Switch to previous page. <br> 可以排序。可以设|页数?br>q? 个类明显是把所有的l果一ơ性查询出来后Q设定每个敎ͼ之后再把当页数据发送给面。虽然不是把全部数据发送给面由页面来分页Q但是一ơ把全部数据? 查询出来的做法只适合量数据。如果多量数据几万条的话同时查出来,存放到sessionQ用不了(jin)多久服务器的内存p耗光?jin)?br>q(sh)太清楚放到session中的对象什么时候被晴空Q好像只有在退出的时候才晴空一ơ?/p> <p>20QaddItemToCart.do?workingItemId=EST-11Q代码很清楚。有两点LQ?br> 一QwebUtil org.springframework.web.util.webUtil提供?jin)有限的几个?gu)?br> 二,return new ModelAndView("Cart", "cart", cart); // Cart.jsp , key ,value<br> 因ؓ(f)不熟(zhn)ibatis所以ORM层的代码都没有阅读,也就是PetsoreImpl实现cȝ各个DAO实例都没有阅诅R?/p> <p>    removeItemFromCart.do?workingItemId=EST-11 也是同一面上的购物车操?Q过于简单。略<br> updateCartQuantities.do //更新的是内存?sh)的数据Q所以没有什么技术?/p> <p>21Qcheckout.do有一炚w要注意,别的Controller没有传入viewName。它传了(jin)Q?br> <bean name="/shop/checkout.do" class="org.springframework.samples.jpetstore.web.spring.ViewCartController"><br>  <property name="successView" value="Checkout"/><br> </bean><br> Controller中:(x)<br> private String successView;</p> <p> public void setSuccessView(String successView) {<br>  this.successView = successView;<br> }<br> 最后return new ModelAndView(this.successView, "cart", cart);</p> <br><br> <p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=571067</p> <br><img src ="http://www.tkk7.com/cgogg/aggbug/124978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/cgogg/" target="_blank">chenguo</a> 2007-06-18 17:53 <a href="http://www.tkk7.com/cgogg/articles/124978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Springweb 表现层集成技?/title><link>http://www.tkk7.com/cgogg/articles/springweb.html</link><dc:creator>chenguo</dc:creator><author>chenguo</author><pubDate>Wed, 13 Jun 2007 01:53:00 GMT</pubDate><guid>http://www.tkk7.com/cgogg/articles/springweb.html</guid><wfw:comment>http://www.tkk7.com/cgogg/comments/123781.html</wfw:comment><comments>http://www.tkk7.com/cgogg/articles/springweb.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/cgogg/comments/commentRss/123781.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/cgogg/services/trackbacks/123781.html</trackback:ping><description><![CDATA[     摘要: 13.1. 介Spring之所以出色的一个原因就是将表现层从MVC的框架中分离出来。例如,通过配置可以让Velocity或者XSLT来代替已l存在的JSP面。本章介l和Spring集成的一些主表现层技术,q简要描q如何集成新的表现层。这里假设你已经熟?zhn)W?12.5 ?“视图与视图解?#8221;Q那里介l了(jin)表现层集成到MVC框架中的基本知识?3.2. 和JSP &...  <a href='http://www.tkk7.com/cgogg/articles/springweb.html'>阅读全文</a><img src ="http://www.tkk7.com/cgogg/aggbug/123781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/cgogg/" target="_blank">chenguo</a> 2007-06-13 09:53 <a href="http://www.tkk7.com/cgogg/articles/springweb.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://lyaa17.com" target="_blank">߹ۿƵ</a>| <a href="http://yuduruizhi.com" target="_blank">avһ</a>| <a href="http://jhmydxx.com" target="_blank">һëƬaaaaaaѿ</a>| <a href="http://kaixininvestment.com" target="_blank">ŮҺƵ</a>| <a href="http://sitefmns.com" target="_blank">޾Ʒ1ҳ</a>| <a href="http://19b1.com" target="_blank">޳AV߲</a>| <a href="http://gdsanhai.com" target="_blank">av߹ۿҰ</a>| <a href="http://www-79983.com" target="_blank">AëƬڵ</a>| <a href="http://zdmaid.com" target="_blank">˵վ</a>| <a href="http://416164.com" target="_blank">Ʒҹѹۿվ</a>| <a href="http://www789789.com" target="_blank">Ʒһ</a>| <a href="http://szgreater.com" target="_blank">޹ۺϾƷ</a>| <a href="http://moushengguigz.com" target="_blank">޳AVƬ߹ۿ</a>| <a href="http://pgb168.com" target="_blank">ۺɫ</a>| <a href="http://55xxb.com" target="_blank">߹ۿĻ</a>| <a href="http://delvheng.com" target="_blank">ƷѵĻվ</a>| <a href="http://gisdn.com" target="_blank">ëƬƵ</a>| <a href="http://222mp3.com" target="_blank">þùƵ</a>| <a href="http://haiholr.com" target="_blank">ھƵƷ</a>| <a href="http://jx-dirui.com" target="_blank">ؼëƬƵ</a>| <a href="http://ahtxjk.com" target="_blank">˾Ʒһѿ</a>| <a href="http://cih60o.com" target="_blank">һƵѹۿ</a>| <a href="http://senimei9.com" target="_blank">ŷһëƬѿ</a>| <a href="http://1444000.com" target="_blank">պ˾Ʒձ</a>| <a href="http://avqvod.com" target="_blank">AVһӰ</a>| <a href="http://cdhxfj.com" target="_blank">ƷۺϾþ</a>| <a href="http://xjyzz.com" target="_blank">޸Ƶ</a>| <a href="http://www04ggg.com" target="_blank">һվ</a>| <a href="http://zwdyw.com" target="_blank">޾Ʒһ</a>| <a href="http://kssijia.com" target="_blank">޾Ʒ߹ۿ </a>| <a href="http://1444000.com" target="_blank">Ƶһ</a>| <a href="http://91ggan.com" target="_blank">޾Ʒ˳߲va</a>| <a href="http://sdsxyz.com" target="_blank">2020þƷ</a>| <a href="http://jufandev.com" target="_blank">޹պƷ</a>| <a href="http://by6215.com" target="_blank">޾Ʒþþþ</a>| <a href="http://3baimm.com" target="_blank">ɫۺ㽶</a>| <a href="http://68996500.com" target="_blank">Ʒһþ</a>| <a href="http://hwjyrck.com" target="_blank">У԰޴ɫС˵ϼ</a>| <a href="http://xyflash.com" target="_blank">һ**ƬƵ</a>| <a href="http://8dfk.com" target="_blank">ڵƵ</a>| <a href="http://527352.com" target="_blank">ƷѸ߹ۿ </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>