1.        下载spring包,网址如下 
http://www.springframework.org/download.html 
解压后的目录中包含了dist、lib等子目录 
  
2.        在JBuilder2005中增加spring库,选择菜单Tools-Configure-Libraries,在弹出的对话框中点击New按钮,输入spring库的名称:spring,点击Add按钮,将dist目录中的所有jar文件增加到spring库中 
  
3.        新建工程文件,选菜单File-New Project,给工程文件取名为myProject 
设置工程文件的属性,选菜单Project-Project Properties,选择Tomcat作为服务器,将spring库加入Path/Required Libraries。因为例子中用到了log4j,将包含了log4j的库加入Path/Required Libraries,注意到lib目录下有两个子目录log4j和jakarta-commons,它们的用法是不同的,如下面的代码片断所示: 
log4j   import org.apache.log4j.Level; 
import org.apache.log4j.Logger; 
public class SpringappController implements Controller { 
  
    /** Logger for this class and subclasses */ 
    static Logger logger = Logger.getLogger(SpringappController.class); 
    
  
jakarta-commons   import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
  
public class SpringappController implements Controller { 
  
    /** Logger for this class and subclasses */ 
    protected final Log logger = LogFactory.getLog(getClass()); 
    
  
  
  
  
4.        新建Web模块,选菜单File-New,给Web模块取名为springapp 
5.        新建hello.jsp文件如下: 
<%@ page contentType="text/html; charset=Big5" %> 
<html> 
<head><title>Example :: Spring Application</title></head> 
<body> 
<h1>Hello - Spring Application</h1> 
<p>Greetings.</p> 
</body> 
</html>   
  
6.        新建类文件SpringappController.java如下: 
package spring; 
  
import org.springframework.web.servlet.mvc.Controller; 
import org.springframework.web.servlet.ModelAndView; 
  
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
  
import java.io.IOException; 
  
//import org.apache.commons.logging.Log; 
//import org.apache.commons.logging.LogFactory; 
import org.apache.log4j.Level; 
import org.apache.log4j.Logger; 
  
public class SpringappController implements Controller { 
  
    /** Logger for this class and subclasses */ 
//    protected final Log logger = LogFactory.getLog(getClass()); 
    static Logger logger = Logger.getLogger(SpringappController.class); 
  
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
  
        logger.info("SpringappController - returning hello view"); 
  
        return new ModelAndView("hello.jsp"); 
    } 
} 
    
  
7.        修改web.xml文件 
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>   <web-app>     <servlet>     <servlet-name>springapp</servlet-name>     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>     <load-on-startup>1</load-on-startup>   </servlet>     <servlet-mapping>     <servlet-name>springapp</servlet-name>     <url-pattern>*.htm</url-pattern>   </servlet-mapping>     <welcome-file-list>     <welcome-file>       index.jsp     </welcome-file>   </welcome-file-list>   </web-app>     
  
8.        在web-inf目录中新建springapp-servlet.xml文件如下 
  
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 
  
<!-- 
  - Application context definition for "springapp" DispatcherServlet. 
  --> 
  
<beans> 
    <bean id="springappController" class="spring.SpringappController"/> 
  
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
        <property name="mappings"> 
            <props> 
                <prop key="/hello.htm">springappController</prop> 
            </props> 
        </property> 
    </bean> 
</beans>   
  
  
  
9.        在web-inf目录中新建log4j.properties文件如下: 
  
log4j.rootCategory=INFO, stdout, logfile 
  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n 
  
log4j.appender.logfile=org.apache.log4j.RollingFileAppender 
log4j.appender.logfile.File=springapp.log 
log4j.appender.logfile.MaxFileSize=512KB 
# Keep three backup files 
log4j.appender.logfile.MaxBackupIndex=3 
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout 
#Pattern to output : date priority [category] - <message>line_separator 
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - <%m>%n 
    
  
10.    设置web模块springapp的属性Content,加入文件log4j.properties,因为classes目录是自动产生的,这一步是为了把文件log4j.properties加到classes目录。 
11.    设置Run Configuration,选菜单Run-Configurations,新建一个Run Configuration,Type选Server,Launch URI设置为:/springapp/hello.htm,给它取名为hello 
12.    运行,你会在messages窗口中看到如下信息: 
資訊: Server startup in 9253 ms 
2004-11-05 15:05:00,585 INFO [spring.SpringappController] - <SpringappController - returning hello view> 
2004/11/5 下午 03:05:00 org.springframework.web.servlet.view.AbstractCachingViewResolver resolveViewName 
資訊: Cached view 'hello.jsp' 
  
  
在myProject/Tomcat/springapp.log文件中增加了一行如下所示: 
2004-11-05 15:11:32,348 INFO [spring.SpringappController] - <SpringappController - returning hello view> 
    
  
这说明你已成功建立了基本的spring应用。 
  
  
  
13.    增加对jstl的支持,设置工程文件的属性,选菜单Project-Project Properties,将jstl库加入Path/Required Libraries。 
14.    改进前面的例子,改进的文件如下: 
增加“header”文件include.jsp,这是一些jsp文件的公用部分,这样可以使得开发和维护更容易。所有jsp文件放在web-inf/jsp目录下,为的是只有Controller可以访问View。 
springapp/war/WEB-INF/jsp/include.jsp    <%@ page session="false"%>   <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>           
  
利用JSTL,<c:redirect>将页面重定向到Controller,这样就建立了index.jsp和应用架构的联系。 
springapp/war/index.jsp    <%@ include file="/WEB-INF/jsp/include.jsp" %>   <%-- Redirected because we can't set the welcome page to a virtual URL. --%> <c:redirect url="/hello.htm"/>   
  
利用JSTL的<c:out>标记,把从Model提取的,传递给View的当前日期和时间作为输出。 
springapp/war/WEB-INF/jsp/hello.jsp    <%@ include file="/WEB-INF/jsp/include.jsp" %>   <html> <head><title>Hello :: Spring Application</title></head> <body> <h1>Hello - Spring Application</h1> <p>Greetings, it is now <c:out value="${now}"/> </p> </body> </html>   
  
  
在SpringappController.java中增加包含了当前日期和时间的string作为Model 
  
springapp/src/SpringappController.java   import org.springframework.web.servlet.mvc.Controller; import org.springframework.web.servlet.ModelAndView;   import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;   import java.io.IOException;   import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;   public class SpringappController implements Controller {       /** Logger for this class and subclasses */     protected final Log logger = LogFactory.getLog(getClass());       public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)             throws ServletException, IOException {           String now = (new java.util.Date()).toString();          logger.info("returning hello view with " + now);           return new ModelAndView("WEB-INF/jsp/hello.jsp", "now", now);     } }   
  
  
15.    浏览改进后的结果http://localhost:8080/springapp,首先访问index.jsp,然后重定向到hello.htm,接著把控制交给Controller,Controller把日期和时间传送给View。 
只能在浏览器这样测试。在JBuilder2005中设置Run Configuration不能访问http://localhost:8080/springapp,但可以访问http://localhost:8080/springapp/index.jsp 
  
在上面的例子中,Controller指定了View的完全路径,使得Controller和View之间存在不必要的依赖。为了移出这种依赖,我们可以用类ResourceBundleViewResolver 和 a SimpleUrlHandlerMapping在属性文件中定义这种依赖,对于简单的情形,我们也可以利用InternalResourceViewResolver设置前缀和后缀,下面就用第二种方法。修改文件springapp-servlet.xml包含ViewResolver设置,我们还选择使用JstlView,这使得我们可以结合使用JSTL和message resource bundles,因此可以支持国际化。 
  
springapp/war/WEB-INF/springapp-servlet.xml    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">   <!--   - Application context definition for "springapp" DispatcherServlet.   -->   <beans>     <bean id="springappController" class="SpringappController"/>       <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">         <property name="mappings">             <props>                 <prop key="/hello.htm">springappController</prop>             </props>         </property>     </bean>       <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">         <property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>         <property name="prefix"><value>/WEB-INF/jsp/</value></property>         <property name="suffix"><value>.jsp</value></property>     </bean> </beans>      
  
现在,我们就可以移出Controller中View名称的前缀和后缀了。 
springapp/src/SpringappController.java   import org.springframework.web.servlet.mvc.Controller; import org.springframework.web.servlet.ModelAndView;   import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;   import java.io.IOException;   import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;   public class SpringappController implements Controller {       /** Logger for this class and subclasses */     protected final Log logger = LogFactory.getLog(getClass());       public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)             throws ServletException, IOException {           String now = (new java.util.Date()).toString();         logger.info("returning hello view with " + now);           return new ModelAndView("hello", "now", now);     } }   
  
这样修改后的例子应该仍能运行。 
  
  
16.    增加商业逻辑类 
为了分开Web逻辑和商业逻辑,我们建立两个不同的包,web和bus 
springapp/src/bus/Product.java   package bus;   import java.io.Serializable;   public class Product implements Serializable {       private String description;     private Double price;       public void setDescription(String s) {         description = s;     }       public String getDescription() {         return description;     }       public void setPrice(Double d) {         price = d;     }       public Double getPrice() {         return price;     }   }   
  
springapp/src/bus/ProductManager.java   package bus;   import java.io.Serializable; import java.util.List;   public class ProductManager implements Serializable {       private List products;       public void setProducts(List p) {         products = p;     }       public List getProducts() {         return products;     }   }   
  
修改SpringappController.java 
springapp/src/web/SpringappController.java   package web;   import org.springframework.web.servlet.mvc.Controller; import org.springframework.web.servlet.ModelAndView;   import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;   import java.io.IOException; import java.util.Map; import java.util.HashMap;   import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;   import bus.Product; import bus.ProductManager;   public class SpringappController implements Controller {       /** Logger for this class and subclasses */     protected final Log logger = LogFactory.getLog(getClass());       private ProductManager prodMan;       public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)             throws ServletException, IOException {           String now = (new java.util.Date()).toString();         logger.info("returning hello view with " + now);           Map myModel = new HashMap();         myModel.put("now", now);         myModel.put("products", getProductManager().getProducts());           return new ModelAndView("hello", "model", myModel);     }       public void setProductManager(ProductManager pm) {         prodMan = pm;     }       public ProductManager getProductManager() {         return prodMan;     } }   
  
17.    修改View以便显示商业数据,增加对message bundle的支持 
springapp/war/WEB-INF/jsp/hello.jsp    <%@ include file="/WEB-INF/jsp/include.jsp" %>   <html> <head><title><fmt:message key="title"/></title></head> <body> <h1><fmt:message key="heading"/></h1> <p><fmt:message key="greeting"/> <c:out value="${model.now}"/> </p> <h3>Products</h3> <c:forEach items="${model.products}" var="prod">   <c:out value="${prod.description}"/> <i>$<c:out value="${prod.price}"/></i><br><br> </c:forEach> </body> </html>   
  
18.    增加一些测试数据 
我们现在还不打算增加代码,从数据库装载商业对象。我们只springapp-servlet.xml中增加bean和messageSource设置,提供一些测试数据和对messages resource bundle的支持。 
  
springapp/war/WEB-INF/springapp-servlet.xml    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">   <!--   - Application context definition for "springapp" DispatcherServlet.   -->     <beans>     <bean id="springappController" class="web.SpringappController">         <property name="productManager">             <ref bean="prodMan"/>         </property>     </bean>       <bean id="prodMan" class="bus.ProductManager">         <property name="products">             <list>                 <ref bean="product1"/>                 <ref bean="product2"/>                 <ref bean="product3"/>             </list>         </property>     </bean>       <bean id="product1" class="bus.Product">         <property name="description"><value>Lamp</value></property>         <property name="price"><value>5.75</value></property>     </bean>              <bean id="product2" class="bus.Product">         <property name="description"><value>Table</value></property>         <property name="price"><value>75.25</value></property>     </bean>       <bean id="product3" class="bus.Product">         <property name="description"><value>Chair</value></property>         <property name="price"><value>22.79</value></property>     </bean>       <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">         <property name="basename"><value>messages</value></property>     </bean>       <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">         <property name="mappings">             <props>                 <prop key="/hello.htm">springappController</prop>             </props>         </property>     </bean>       <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">         <property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>         <property name="prefix"><value>/WEB-INF/jsp/</value></property>         <property name="suffix"><value>.jsp</value></property>     </bean> </beans>           
  
19.    增加message bundle 
springapp/war/WEB-INF/classes/messages.properties   title=SpringApp heading=Hello :: SpringApp greeting=Greetings, it is now   
  
20.    浏览改进后的结果http://localhost:8080/springapp 
  
  
  
实现数据库持久层 
21.    设置HSQL数据库,在JBuilder2005中增加HSQL库,选择菜单Tools-Configure-Libraries,在弹出的对话框中点击New按钮,输入HSQL库的名称:HSQL,点击Add按钮,将lib/hsqldb目录下的文件hsqldb.jar增加到HSQL库中。 
选择菜单Enterprise-Enterprise Setup,在弹出的对话框中选择Database Drivers,按Add按钮增加HSQL库。 
选择菜单Tools-Database Pilot,然后选择菜单Files-New输入Driver:org.hsqldb.jdbcDriver,URL:jdbc:hsqldb:db/test, 双击hsqldb:db/test,输入UserName:sa,不必输入Passsword。输入如下的SQL语句并执行 
  
CREATE TABLE products ( 
          id INTEGER NOT NULL PRIMARY KEY, 
          description varchar(255), 
          price decimal(15,2) 
        ); 
CREATE INDEX products_description ON products(description); 
  
INSERT INTO products (id, description, price) values(1, 'Lamp', 5.78); 
INSERT INTO products (id, description, price) values(2, 'Table', 75.29); 
INSERT INTO products (id, description, price) values(3, 'Chair', 22.81);   
  
  
这样就会在JBuilder_Home/bin目录下创建一个目录db,存放了数据库test的数据 
  
22.    创建JDBC DAO (Data Access Object)实现 
springapp/src/db/ProductManagerDao.java    package db;   import bus.Product; import java.util.List;   public interface ProductManagerDao {       public List getProductList();       public void increasePrice(Product prod, int pct);   }   
  
  
springapp/src/db/ProductManagerDaoJdbc.java    package db;   import bus.Product; import java.util.List; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import javax.sql.DataSource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.jdbc.object.MappingSqlQuery; import org.springframework.jdbc.object.SqlUpdate; import org.springframework.jdbc.core.SqlParameter;   public class ProductManagerDaoJdbc implements ProductManagerDao {       /** Logger for this class and subclasses */     protected final Log logger = LogFactory.getLog(getClass());       private DataSource ds;       public List getProductList() {         logger.info("Getting products!");         ProductQuery pq = new ProductQuery(ds);         return pq.execute();     }       public void increasePrice(Product prod, int pct) {         logger.info("Increasing price by " + pct + "%");         SqlUpdate su =              new SqlUpdate(ds, "update products set price = price * (100 + ?) / 100 where id = ?");         su.declareParameter(new SqlParameter("increase", Types.INTEGER));         su.declareParameter(new SqlParameter("ID", Types.INTEGER));         su.compile();         Object[] oa = new Object[2];         oa[0] = new Integer(pct);         oa[1] = new Integer(prod.getId());         int count = su.update(oa);         logger.info("Rows affected: " + count);     }       public void setDataSource(DataSource ds) {         this.ds = ds;     }       class ProductQuery extends MappingSqlQuery {           ProductQuery(DataSource ds) {             super(ds, "SELECT id, description, price from products");             compile();         }           protected Object mapRow(ResultSet rs, int rowNum) throws SQLException {             Product prod = new Product();             prod.setId(rs.getInt("id"));             prod.setDescription(rs.getString("description"));             prod.setPrice(new Double(rs.getDouble("price")));             return prod;         }       }   }   
  
  
  
springapp/src/bus/Product.java    package bus;   import java.io.Serializable;   public class Product implements Serializable {       private int id;     private String description;     private Double price;       public void setId(int i) {         id = i;     }       public int getId() {         return id;     }       public void setDescription(String s) {         description = s;     }       public String getDescription() {         return description;     }       public void setPrice(Double d) {         price = d;     }       public Double getPrice() {         return price;     }   }   
  
  
springapp/src/test/TestProductManagerDaoJdbc.java    package tests;   import java.util.List; import java.util.ArrayList; import junit.framework.TestCase; import org.springframework.jdbc.datasource.DriverManagerDataSource; import db.ProductManagerDaoJdbc; import bus.Product;   public class TestProductManagerDaoJdbc extends TestCase {       private ProductManagerDaoJdbc pmdao;       public void setUp() {         pmdao = new ProductManagerDaoJdbc();         DriverManagerDataSource ds = new DriverManagerDataSource();         ds.setDriverClassName("org.hsqldb.jdbcDriver");         ds.setUrl("jdbc:hsqldb:db/test");         ds.setUsername("sa");         ds.setPassword("");         pmdao.setDataSource(ds);     }       public void testGetProductList() {         List l = pmdao.getProductList();         Product p1 = (Product) l.get(0);         assertEquals("Lamp", p1.getDescription());         Product p2 = (Product) l.get(1);         assertEquals("Table", p2.getDescription());     }       public void testIncreasePrice() {         List l1 = pmdao.getProductList();         Product p1 = (Product) l1.get(0);         assertEquals(new Double("5.78"), p1.getPrice());         pmdao.increasePrice(p1, 10);         List l2 = pmdao.getProductList();         Product p2 = (Product) l2.get(0);         assertEquals(new Double("6.36"), p2.getPrice());     }   }   
  
  
  
23.    修改Web应用使其使用数据库持久层 
springapp/src/bus/ProductManager.java   package bus;   import java.io.Serializable; import java.util.ListIterator; import java.util.List; import db.ProductManagerDao;   public class ProductManager implements Serializable {       private ProductManagerDao pmd;     private List products;       public void setProductManagerDao(ProductManagerDao pmd) {         this.pmd = pmd;     }   /*       public void setProducts(List p) {         products = p;     } */       public List getProducts() {         products = pmd.getProductList();         return products;     }       public void increasePrice(int pct) {         ListIterator li = products.listIterator();         while (li.hasNext()) {             Product p = (Product) li.next(); /*             double newPrice = p.getPrice().doubleValue() * (100 + pct)/100;             p.setPrice(new Double(newPrice)); */             pmd.increasePrice(p, pct);         }              }   }   
  
  
  
springapp/war/WEB-INF/springapp-servlet.xml    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  "http://www.springframework.org/dtd/spring-beans.dtd">   <!--   - Application context definition for "springapp" DispatcherServlet.   -->   <beans>       <!--  Controller for the initial "Hello" page -->     <bean id="springappController" class="web.SpringappController">         <property name="productManager">             <ref bean="prodMan"/>         </property>     </bean>       <!--  Validator and Form Controller for the "Price Increase" page -->     <bean id="priceIncreaseValidator" class="bus.PriceIncreaseValidator"/>     <bean id="priceIncreaseForm" class="web.PriceIncreaseFormController">         <property name="sessionForm"><value>true</value></property>         <property name="commandName"><value>priceIncrease</value></property>         <property name="commandClass"><value>bus.PriceIncrease</value></property>         <property name="validator"><ref bean="priceIncreaseValidator"/></property>         <property name="formView"><value>priceincrease</value></property>         <property name="successView"><value>hello.htm</value></property>         <property name="productManager">             <ref bean="prodMan"/>         </property>     </bean>       <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">       <property name="driverClassName"><value>org.hsqldb.jdbcDriver</value></property>       <property name="url">         <value>jdbc:hsqldb:/home/trisberg/workspace/springapp/db/test</value>       </property>       <property name="username"><value>sa</value></property>       <property name="password"><value></value></property>     </bean>       <bean id="prodManDao" class="db.ProductManagerDaoJdbc">         <property name="dataSource">             <ref bean="dataSource"/>         </property>     </bean>       <bean id="prodMan" class="bus.ProductManager">         <property name="productManagerDao">             <ref bean="prodManDao"/>         </property> <!--         <property name="products">             <list>                 <ref bean="product1"/>                 <ref bean="product2"/>                 <ref bean="product3"/>             </list>         </property> -->     </bean>      <!--     <bean id="product1" class="bus.Product">         <property name="description"><value>Lamp</value></property>         <property name="price"><value>5.75</value></property>     </bean>              <bean id="product2" class="bus.Product">         <property name="description"><value>Table</value></property>         <property name="price"><value>75.25</value></property>     </bean>       <bean id="product3" class="bus.Product">         <property name="description"><value>Chair</value></property>         <property name="price"><value>22.79</value></property>     </bean> -->       <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">         <property name="basename"><value>messages</value></property>     </bean>       <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">          <property name="mappings">             <props>                 <prop key="/hello.htm">springappController</prop>                 <prop key="/priceincrease.htm">priceIncreaseForm</prop>             </props>         </property>     </bean>       <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">         <property name="viewClass">            <value>org.springframework.web.servlet.view.JstlView</value>         </property>         <property name="prefix"><value>/WEB-INF/jsp/</value></property>         <property name="suffix"><value>.jsp</value></property>     </bean> </beans>   
  
  
  
springapp/src/tests/MockProductManagerDaoImpl.java   package tests;   import bus.Product; import java.util.List; import db.ProductManagerDao; import bus.Product;   public class MockProductManagerDaoImpl implements ProductManagerDao {       private List products;       public void setProducts(List p) {         products = p;     }       public List getProductList() {         return products;     }       public void increasePrice(Product prod, int pct) {         double newPrice = prod.getPrice().doubleValue() * (100 + pct)/100;         prod.setPrice(new Double(newPrice));     }   }   
  
  
  
springapp/src/tests/WEB-INF/springapp-servlet.xml    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">   <!--   - Application context definition for "springapp" DispatcherServlet.   -->     <beans>     <bean id="springappController" class="web.SpringappController">         <property name="productManager">             <ref bean="prodMan"/>         </property>     </bean>       <bean id="prodManDao" class="tests.MockProductManagerDaoImpl">         <property name="products">             <list>                 <ref bean="product1"/>                 <ref bean="product2"/>                 <ref bean="product3"/>             </list>         </property>     </bean>       <bean id="prodMan" class="bus.ProductManager">         <property name="productManagerDao">             <ref bean="prodManDao"/>         </property> <!--         <property name="products">             <list>                 <ref bean="product1"/>                 <ref bean="product2"/>                 <ref bean="product3"/>             </list>         </property> -->     </bean>       <bean id="product1" class="bus.Product">         <property name="description"><value>Lamp</value></property>         <property name="price"><value>5.75</value></property>     </bean>              <bean id="product2" class="bus.Product">         <property name="description"><value>Table</value></property>         <property name="price"><value>75.25</value></property>     </bean>       <bean id="product3" class="bus.Product">         <property name="description"><value>Chair</value></property>         <property name="price"><value>22.79</value></property>     </bean>   </beans>           
  
springapp/src/tests/TestProductManager .java    package tests;   import java.util.List; import java.util.ArrayList; import junit.framework.TestCase; import db.ProductManagerDao; import bus.ProductManager; import bus.Product;   public class TestProductManager extends TestCase {       private ProductManager pm;       public void setUp() {         pm = new ProductManager();         Product p = new Product();         p.setDescription("Chair");         p.setPrice(new Double("20.50"));         ArrayList al = new ArrayList();         al.add(p);         p = new Product();         p.setDescription("Table");         p.setPrice(new Double("150.10"));         al.add(p); /*         pm.setProducts(al); */         MockProductManagerDaoImpl pmdao = new MockProductManagerDaoImpl();         pmdao.setProducts(al);         pm.setProductManagerDao(pmdao);         pm.getProducts();     }       public void testGetProducs() {         List l = pm.getProducts();         Product p1 = (Product) l.get(0);         assertEquals("Chair", p1.getDescription());         Product p2 = (Product) l.get(1);         assertEquals("Table", p2.getDescription());     }       public void testIncreasePrice() {         pm.increasePrice(10);         List l = pm.getProducts();         Product p = (Product) l.get(0);         assertEquals(new Double("22.55"), p.getPrice());         p = (Product) l.get(1);         assertEquals(new Double("165.11"), p.getPrice());     }   }   
   
 
  |