'개발/스프링'에 해당되는 글 10건

  1. 2012.04.05 실행오류
  2. 2009.01.15 스프링 MVC
  3. 2008.07.28 스프링 tutorial (8)
  4. 2008.07.27 스프링 tutorial (7)
  5. 2008.07.26 스프링 tutorial (6)
  6. 2008.07.25 스프링 tutorial (5)
  7. 2008.07.17 스프링 tutorial (4)
  8. 2008.07.17 스프링 tutorial (3)
  9. 2008.07.16 스프링 tutorial (2)
  10. 2008.07.16 스프링 tutorial (1)

실행오류

개발/스프링 2012. 4. 5. 17:00

이클립스에서 톰캣연동하여 실행하다보면 가끔 어제까지 잘 되던 상황에서 오늘 아침에 켜니

개발하던 프로그램이 실행안되는 경우가 있다.

이 경우 가장 잦은 증상이 (이클립스 또는 톰캣 플러그인의 버그라고 생각되는데..)

console에 스프링 관련 내용이 display되지 않는다.

가장 빠른 해결책은 직접 파일을 넣는것..

\org.eclipse.wst.server.core\tmp0 아래에 프로젝트 폴더밑에 web.xml이 있는지 확인하고 없으면 넣는다.

WEB-INF/lib밑에 스프링 관련 library가 있는지 확인하고 없으면 넣는다.

그런후에 실행하면 정상동작....

'개발 > 스프링' 카테고리의 다른 글

스프링 MVC  (0) 2009.01.15
스프링 tutorial (8)  (0) 2008.07.28
스프링 tutorial (7)  (0) 2008.07.27
스프링 tutorial (6)  (0) 2008.07.26
스프링 tutorial (5)  (0) 2008.07.25
Posted by 무혹
,

스프링 MVC

개발/스프링 2009. 1. 15. 09:39
책도 몇권 읽었고 혼자 공부도 했지만 역시 난 절실하지 않으면 집중도 못하고 제대로 하지 못한다. 다시 플로우에 대해 차근차근 정리해보자. 기준은 spring 소스에 있는 petstore

1. 기본적으로 web 프로젝트는 WEB-INF에 있는 web.xml 설정파일을 읽어온다.
   (.net쪽은 틀린가? 나중에 확인해보자...)
스프링의 servlet 호출을 위해 web.xml에 아래 부분이 존재해야 한다.

<servlet>
   <servlet-name>petstore</servlet-name>
      <servlet-class>
       org.springframework.web.servlet.DispatcherServlet
       </servlet-class>
   <load-on-startup>2</load-on-startup>
</servlet>

또 DispatcherServlet과 Mapping하기 위한 확장자를 아래와 같이 정해준다.
이런 경우 do 로 끝나는 확장자는 DispatcherServlet이 처리하므로
서블릿 매핑파일( petstore-servlet.xml ) 에서 해당 controller를 찾게 된다.

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

2. DispatcherServlet이 진입점이므로 servlet-name으로 정해진 petstore와 연관된
petstore-servlet.xml이 있어야 한다.






'개발 > 스프링' 카테고리의 다른 글

실행오류  (0) 2012.04.05
스프링 tutorial (8)  (0) 2008.07.28
스프링 tutorial (7)  (0) 2008.07.27
스프링 tutorial (6)  (0) 2008.07.26
스프링 tutorial (5)  (0) 2008.07.25
Posted by 무혹
,

웹 어플리케이션의 persistence Layer의 통합

 

1.      Service layer의 수정

 

src/springapp/service/SimpleProductManager.java

 

package springapp.service;
 
import java.util.List;
 
import springapp.domain.Product;
 
public class SimpleProductManager implements ProductManager {
 
    privapackage springapp.service;
 
import java.util.List;
 
import springapp.domain.Product;
import springapp.repository.ProductDao;
 
public class SimpleProductManager implements ProductManager {
 
    // private List<Product> products;
    private ProductDao productDao;
 
    public List<Product> getProducts() {
        // return products;
        return productDao.getProductList();
    }
 
    public void increasePrice(int percentage) {
        List<Product> products = productDao.getProductList();
        if (products != null) {
            for (Product product : products) {
                double newPrice = product.getPrice().doubleValue() * 
                                    (100 + percentage)/100;
                product.setPrice(newPrice);
                productDao.saveProduct(product);
            }
        }
    }
 
    public void setProductDao(ProductDao productDao) {
        this.productDao = productDao;
    }
 
//    public void setProducts(List<Product> products) {
//        this.products = products;
//    }
 
}
 

  

2.     Failing tests의 확정

 

test/springapp/repository/InMemoryProductDao.java

 

package springapp.repository;
 
import java.util.List;
 
import springapp.domain.Product;
 
public class InMemoryProductDao implements ProductDao {
 
    private List<Product> productList;
 
    public InMemoryProductDao(List<Product> productList) {
        this.productList = productList;
    }
 
    public List<Product> getProductList() {
        return productList;
    }
 
    public void saveProduct(Product prod) {
    }
 
}
 

test/springapp/service/SimpleProductManagerTests.java

 

package springapp.service;
 
import java.util.ArrayList;
import java.util.List;
 
import springapp.domain.Product;
import springapp.repository.InMemoryProductDao;
import springapp.repository.ProductDao;
 
import junit.framework.TestCase;
 
public class SimpleProductManagerTests extends TestCase {
 
    private SimpleProductManager productManager;
 
    private List<Product> products;
    
    private static int PRODUCT_COUNT = 2;
    
    private static Double CHAIR_PRICE = new Double(20.50);
    private static String CHAIR_DESCRIPTION = "Chair";
    
    private static String TABLE_DESCRIPTION = "Table";
    private static Double TABLE_PRICE = new Double(150.10);         
    
    private static int POSITIVE_PRICE_INCREASE = 10;
    
    protected void setUp() throws Exception {
        productManager = new SimpleProductManager();
        products = new ArrayList<Product>();
        
        // stub up a list of products
        Product product = new Product();
        product.setDescription("Chair");
        product.setPrice(CHAIR_PRICE);
        products.add(product);
        
        product = new Product();
        product.setDescription("Table");
        product.setPrice(TABLE_PRICE);
        products.add(product);
        
        ProductDao productDao = new InMemoryProductDao(products);
        productManager.setProductDao(productDao);
        //productManager.setProducts(products);
    }
 
    public void testGetProductsWithNoProducts() {
        productManager = new SimpleProductManager();
        productManager.setProductDao(new InMemoryProductDao(null));
        assertNull(productManager.getProducts());
    }
    
    public void testGetProducts() {
        List<Product> products = productManager.getProducts();
        assertNotNull(products);        
        assertEquals(PRODUCT_COUNT, productManager.getProducts().size());
    
        Product product = products.get(0);
        assertEquals(CHAIR_DESCRIPTION, product.getDescription());
        assertEquals(CHAIR_PRICE, product.getPrice());
        
        product = products.get(1);
        assertEquals(TABLE_DESCRIPTION, product.getDescription());
        assertEquals(TABLE_PRICE, product.getPrice());      
    }   
    
    public void testIncreasePriceWithNullListOfProducts() {
        try {
            productManager = new SimpleProductManager();
            productManager.setProductDao(new InMemoryProductDao(null));
            productManager.increasePrice(POSITIVE_PRICE_INCREASE);
        }
        catch(NullPointerException ex) {
            fail("Products list is null.");
        }
    }
    
    public void testIncreasePriceWithEmptyListOfProducts() {
        try {
            productManager = new SimpleProductManager();
            productManager.setProductDao(new InMemoryProductDao(new ArrayList<Product>()));
            //productManager.setProducts(new ArrayList<Product>());
            productManager.increasePrice(POSITIVE_PRICE_INCREASE);
        }
        catch(Exception ex) {
            fail("Products list is empty.");
        }           
    }
    
    public void testIncreasePriceWithPositivePercentage() {
        productManager.increasePrice(POSITIVE_PRICE_INCREASE);
        double expectedChairPriceWithIncrease = 22.55;
        double expectedTablePriceWithIncrease = 165.11;
        
        List<Product> products = productManager.getProducts();      
        Product product = products.get(0);
        assertEquals(expectedChairPriceWithIncrease, product.getPrice());
        
        product = products.get(1);      
        assertEquals(expectedTablePriceWithIncrease, product.getPrice());       
    }
        
}
 

test/springapp/service/InventoryControllerTests.java

 

package springapp.web;
 
import java.util.Map;
 
import org.springframework.web.servlet.ModelAndView;
 
import springapp.domain.Product;
import springapp.repository.InMemoryProductDao;
import springapp.service.SimpleProductManager;
import springapp.web.InventoryController;
 
import junit.framework.TestCase;
 
public class InventoryControllerTests extends TestCase {
 
    public void testHandleRequestView() throws Exception{
        InventoryController controller = new InventoryController();
        SimpleProductManager spm = new SimpleProductManager();
        spm.setProductDao(new InMemoryProductDao(new ArrayList<Product>()));
        controller.setProductManager(spm);
        //controller.setProductManager(new SimpleProductManager());
        ModelAndView modelAndView = controller.handleRequest(null, null);
        assertEquals("hello", modelAndView.getViewName());
        assertNotNull(modelAndView.getModel());
        Map modelMap = (Map) modelAndView.getModel().get("model");
        String nowValue = (String) modelMap.get("now");
        assertNotNull(nowValue);
    }
}
 

war/WEB-INF/springapp-servlet.xml

 

<?xml version="1.0" encoding="UTF-8"?>
 
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 
    <!-- the application context definition for the springapp DispatcherServlet -->
 
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="messages"/>
    </bean>
    
    <bean name="/hello.htm" class="springapp.web.InventoryController">
        <property name="productManager" ref="productManager"/>
    </bean>
 
    <bean name="/priceincrease.htm" class="springapp.web.PriceIncreaseFormController">
        <property name="sessionForm" value="true"/>
        <property name="commandName" value="priceIncrease"/>
        <property name="commandClass" value="springapp.service.PriceIncrease"/>
        <property name="validator">
            <bean class="springapp.service.PriceIncreaseValidator"/>
        </property>
        <property name="formView" value="priceincrease"/>
        <property name="successView" value="hello.htm"/>
        <property name="productManager" ref="productManager"/>
    </bean>
 
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>        
    </bean>
 
</beans>
 

war/WEB-INF/web.xml

 

<?xml version="1.0" encoding="UTF-8"?>
 
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
 
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
 
  <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>
 
  <jsp-config>
    <taglib>
      <taglib-uri>/spring</taglib-uri>
      <taglib-location>/WEB-INF/tld/spring-form.tld</taglib-location>
    </taglib>
  </jsp-config>
 
</web-app>
 

war/WEB-INF/applicationContext.xml

 

<?xml version="1.0" encoding="UTF-8"?>
 
<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-2.0.xsd
           http://www.springframework.org/schema/aop 
           http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
 
    <!-- the parent application context definition for the springapp application -->
 
    <bean id="productManager" class="springapp.service.SimpleProductManager">
        <property name="productDao" ref="productDao"/>
    </bean>
 
    <bean id="productDao" class="springapp.repository.JdbcProductDao">
        <property name="dataSource" ref="dataSource"/>
    </bean>
 
</beans>
 

war/WEB-INF/applicationContext.xml

 

<bean id="transactionManager" 
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
 
    <aop:config>
        <aop:advisor pointcut="execution(* *..ProductManager.*(..))" advice-ref="txAdvice"/>
    </aop:config>
 
    <tx:advice id="txAdvice">
        <tx:attributes>
            <tx:method name="save*"/>
            <tx:method name="*" read-only="true"/>
        </tx:attributes>
    </tx:advice>
 

jdbc.properties 재사용

 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
 
    <bean id="propertyConfigurer" 
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:jdbc.properties</value>
            </list>
        </property>
    </bean>
 

 

 

spring-framework-2.5/lib/aspect/ aspectjweaver.jar

spring-framework-2.5/lib/jakarta-commons/commons-dbcp.jar

spring-framework-2.5/lib/jakarta-commons/commons-pool.jar

=> war/WEB-INF/lib

 

war/WEB-INF/applicationContext.xml

 

<?xml version="1.0" encoding="UTF-8"?>
 
<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-2.0.xsd
           http://www.springframework.org/schema/aop 
           http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
 
    <!-- the parent application context definition for the springapp application -->
 
    <bean id="productManager" class="springapp.service.SimpleProductManager">
        <property name="productDao" ref="productDao"/>
    </bean>
 
    <bean id="productDao" class="springapp.repository.JdbcProductDao">
        <property name="dataSource" ref="dataSource"/>
    </bean>
 
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
 
    <bean id="propertyConfigurer" 
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:jdbc.properties</value>
            </list>
        </property>
    </bean>
 
    <bean id="transactionManager" 
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
 
    <aop:config>
        <aop:advisor pointcut="execution(* *..ProductManager.*(..))" advice-ref="txAdvice"/>
    </aop:config>
 
    <tx:advice id="txAdvice">
        <tx:attributes>
            <tx:method name="save*"/>
            <tx:method name="*" read-only="true"/>
        </tx:attributes>
    </tx:advice>
 
</beans>
 

 

마지막 테스트 실행 및 완료함

'개발 > 스프링' 카테고리의 다른 글

실행오류  (0) 2012.04.05
스프링 MVC  (0) 2009.01.15
스프링 tutorial (7)  (0) 2008.07.27
스프링 tutorial (6)  (0) 2008.07.26
스프링 tutorial (5)  (0) 2008.07.25
Posted by 무혹
,

DB persistence의 구현

 

1.     DB startup script의 생성

DB jar파일을 복사하므로써 사용할 수 있는 오픈소스 DB HSQL을 사용한다.

hsqldb.jar를 아래와 같이 복사한다.

spring-framework-2.5/lib/hsqldb => war/WEB-INF/lib

 

DB start를 위한 batch 파일을 필요로 한다.

springapp 디렉토리 아래에 db 디렉토리를 생성한다.

 

운영체제에 따라 아래와 같이 생성한다.

 

Linux/Mac OS X 일 경우 :

/db/server.sh

java -classpath ../war/WEB-INF/lib/hsqldb.jar org.hsqldb.Server -database test

이 경우에는 권한을 잊지 말자 'chmod +x server.sh'.

Windows일 경우 :

db/server.bat

java -classpath ..\war\WEB-INF\lib\hsqldb.jar org.hsqldb.Server -database test

 

운영체제에 따른 스크립트를 실행하여 DB start한다.

 

2.     Table test data를 생성

 

DB디렉토리 아래에 create_products.sql 을 생성한다.

 

db/create_products.sql

CREATE TABLE products (
  id INTEGER NOT NULL PRIMARY KEY,
  description varchar(255),
  price decimal(15,2)
);
CREATE INDEX products_description ON products(description);
 

테스트 데이터는 DB 디렉토리 아래에 load_data.sql 로 생성한다.

 

db/load_data.sql

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);

 

3.     스크립트 실행과 테스트 데이터 로드를 위한 ant target를 추가

 

Ant sql task를 사용하여 추가하고 DB properties build.properties에 추가한다.

 

build.properties

# Ant properties for building the springapp
 
appserver.home=${user.home}/apache-tomcat-6.0.14
# for Tomcat 5 use $appserver.home}/server/lib
# for Tomcat 6 use $appserver.home}/lib
appserver.lib=${appserver.home}/lib
 
deploy.path=${appserver.home}/webapps
 
tomcat.manager.url=http://localhost:8080/manager
tomcat.manager.username=tomcat
tomcat.manager.password=s3cret
 
db.driver=org.hsqldb.jdbcDriver
db.url=jdbc:hsqldb:hsql://localhost
db.user=sa
db.pw=
 

build.xml

 

<target name="createTables">
        <echo message="CREATE TABLES USING: ${db.driver} ${db.url}"/>
        <sql driver="${db.driver}"
             url="${db.url}"
             userid="${db.user}"
             password="${db.pw}"
             onerror="continue"
             src="db/create_products.sql">  
            <classpath refid="master-classpath"/>
        </sql> 
    </target>
 
    <target name="dropTables">
        <echo message="DROP TABLES USING: ${db.driver} ${db.url}"/>
        <sql driver="${db.driver}"
             url="${db.url}"
             userid="${db.user}"
             password="${db.pw}"
             onerror="continue">  
            <classpath refid="master-classpath"/>
 
        DROP TABLE products;
 
        </sql> 
    </target>
 
    <target name="loadData">
        <echo message="LOAD DATA USING: ${db.driver} ${db.url}"/>
        <sql driver="${db.driver}"
             url="${db.url}"
             userid="${db.user}"
             password="${db.pw}"
             onerror="continue"
             src="db/load_data.sql">  
            <classpath refid="master-classpath"/>
        </sql> 
    </target>
 
    <target name="printData">
        <echo message="PRINT DATA USING: ${db.driver} ${db.url}"/>
        <sql driver="${db.driver}"
             url="${db.url}"
             userid="${db.user}"
             password="${db.pw}"
             onerror="continue"
             print="true">  
            <classpath refid="master-classpath"/>
 
        SELECT * FROM products;
 
        </sql> 
    </target>
 
    <target name="clearData">
        <echo message="CLEAR DATA USING: ${db.driver} ${db.url}"/>
        <sql driver="${db.driver}"
             url="${db.url}"
             userid="${db.user}"
             password="${db.pw}"
             onerror="continue">  
            <classpath refid="master-classpath"/>
 
        DELETE FROM products;
 
        </sql> 
    </target>
 
    <target name="shutdownDb">
        <echo message="SHUT DOWN DATABASE USING: ${db.driver} ${db.url}"/>
        <sql driver="${db.driver}"
             url="${db.url}"
             userid="${db.user}"
             password="${db.pw}"
             onerror="continue">  
            <classpath refid="master-classpath"/>
 
        SHUTDOWN;
 
        </sql> 
    </target>
 

 

ant createTables loadData printData를 실행함으로써 테이블과 데이터를 준비한다.

 

4.     JDBC 구현을 위한 Data Access Object (DAO) 생성

 

DB access를 위한 클래스들을 가지는 디렉토리를 생성한다.

src/repository

 

ProductDAO라는 이름을 가지는 interface를 생성한다.

 

src/springapp/repository/ProductDao.java

package springapp.repository;
 
import java.util.List;
 
import springapp.domain.Product;
 
public interface ProductDao {
 
    public List<Product> getProductList();
 
    public void saveProduct(Product prod);
 
}
 

인터페이스를 구현한 클래스를 생성한다.

 

src/springapp/repository/JdbcProductDao.java

 

package springapp.repository;
 
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
 
import springapp.domain.Product;
 
public class JdbcProductDao extends SimpleJdbcDaoSupport implements ProductDao {
 
    /** Logger for this class and subclasses */
    protected final Log logger = LogFactory.getLog(getClass());
 
 
    public List<Product> getProductList() {
        logger.info("Getting products!");
        List<Product> products = getSimpleJdbcTemplate().query(
                "select id, description, price from products", 
                new ProductMapper());
        return products;
    }
 
    public void saveProduct(Product prod) {
        logger.info("Saving product: " + prod.getDescription());
        int count = getSimpleJdbcTemplate().update(
            "update products set description = :description, price = :price where id = :id",
            new MapSqlParameterSource().addValue("description", prod.getDescription())
                .addValue("price", prod.getPrice())
                .addValue("id", prod.getId()));
        logger.info("Rows affected: " + count);
    }
    
    private static class ProductMapper implements ParameterizedRowMapper<Product> {
 
        public Product 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;
        }
 
    }
 
}
 

domain/Product.java

 

package springapp.domain;
 
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 String getDescription() {
        return description;
    }
    
    public void setDescription(String description) {
        this.description = description;
    }
    
    public Double getPrice() {
        return price;
    }
    
    public void setPrice(Double price) {
        this.price = price;
    }
    
    public String toString() {
        StringBuffer buffer = new StringBuffer();
        buffer.append("Description: " + description + ";");
        buffer.append("Price: " + price);
        return buffer.toString();
    }
}
 

5.     JDBC DAO 구현의 test

 

spring-framework-2.5/dist/modules/spring-test.jar => war/WEB-INF/lib

 

test/springapp/domain/JdbcProductDaoTests.java

 

package springapp.repository;
 
import java.util.List;
 
public class JdbcProductDaoTests extends AbstractTransactionalDataSourceSpringContextTests {
 
    private ProductDao productDao;
 
    
    public void setProductDao(ProductDao productDao) {
        this.productDao = productDao;
    }
 
    @Override
    protected String[] getConfigLocations() {
        return new String[] {"classpath:test-context.xml"};
    }
 
    @Override
    protected void onSetUpInTransaction() throws Exception {
        super.deleteFromTables(new String[] {"products"});
        super.executeSqlScript("file:db/load_data.sql", true);
    }
 
    public void testGetProductList() {
        
        List<Product> products = productDao.getProductList();
        
        assertEquals("wrong number of products?", 3, products.size());
        
    }
    
    public void testSaveProduct() {
        
        List<Product> products = productDao.getProductList();
        
        for (Product p : products) {
            p.setPrice(200.12);
            productDao.saveProduct(p);
        }
        
        List<Product> updatedProducts = productDao.getProductList();
        for (Product p : updatedProducts) {
            assertEquals("wrong price of product?", 200.12, p.getPrice());
        }
 
    }
 
}
 

test/test-context.xml

 

<?xml version="1.0" encoding="UTF-8"?>
 
<beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 
 
    <!-- the test application context definition for the jdbc based tests --> 
 
    <bean id="productDao" class="springapp.repository.JdbcProductDao">
        <property name="dataSource" ref="dataSource" />
    </bean>
 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="${jdbc.driverClassName}"/>
      <property name="url" value="${jdbc.url}"/>
      <property name="username"  value="${jdbc.username}"/>
      <property name="password" value="${jdbc.password}"/>
    </bean>
    <bean id="propertyConfigurer" 
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:jdbc.properties</value>
            </list>
        </property>
    </bean>
    
    <bean id="transactionManager" 
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
 
</beans>
 

war/WEB-INF/classes/jdbc.properties

 

jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://localhost
jdbc.username=sa
jdbc.password=
 

build.xml



<property name="test.dir" value="test"/>

 
 
    <path id="test-classpath">
        <fileset dir="${web.dir}/WEB-INF/lib">
            <include name="*.jar"/>
        </fileset>
        <pathelement path="${build.dir}"/>
        <pathelement path="${test.dir}"/>
        <pathelement path="${web.dir}/WEB-INF/classes"/>
    </path>

  

build.xml

  

    
<target name="tests" depends="build, buildtests" description="Run tests">
        <junit printsummary="on"
            fork="false"
            haltonfailure="false"
            failureproperty="tests.failed"
            showoutput="true">
            <classpath refid="test-classpath"/>
            <formatter type="brief" usefile="false"/>
            
            <batchtest>
                <fileset dir="${build.dir}">
                    <include name="**/*Tests.*"/>
                    <exclude name="**/Jdbc*Tests.*"/>
                </fileset>
            </batchtest>
            
        </junit>
        
        <fail if="tests.failed">
            tests.failed=${tests.failed}
            ***********************************************************
            ***********************************************************
            ****  One or more tests failed!  Check the output ...  ****
            ***********************************************************
            ***********************************************************
        </fail>
    </target>
 
    <target name="dbTests" depends="build, buildtests,dropTables,createTables,loadData" 
            description="Run db tests">
        <junit printsummary="on"
            fork="false"
            haltonfailure="false"
            failureproperty="tests.failed"
            showoutput="true">
            <classpath refid="test-classpath"/>
            <formatter type="brief" usefile="false"/>
            
            <batchtest>
                <fileset dir="${build.dir}">
                    <include name="**/Jdbc*Tests.*"/>
                </fileset>
            </batchtest>
            
        </junit>
        
        <fail if="tests.failed">
            tests.failed=${tests.failed}
            ***********************************************************
            ***********************************************************
            ****  One or more tests failed!  Check the output ...  ****
            ***********************************************************
            ***********************************************************
        </fail>
    </target>
  

ant dbTests를 실행하여 테스트 통과를 확인한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'개발 > 스프링' 카테고리의 다른 글

스프링 MVC  (0) 2009.01.15
스프링 tutorial (8)  (0) 2008.07.28
스프링 tutorial (6)  (0) 2008.07.26
스프링 tutorial (5)  (0) 2008.07.25
스프링 tutorial (4)  (0) 2008.07.17
Posted by 무혹
,

웹 인터페이스의 개발

 

1.     Controller에 비즈니스 로직 reference 추가

기존에 만든 HelloController를 좀 더 제대로 된 이름으로 변경하자.

그 이름은 InventoryController.

 

 

HelloController InventoryController, HelloControllerTests InventoryControllerTests

변경한다.

InventoryController를 날자와 Product List를 가진 Map을 리턴하도록 수정한다.

 

src/springapp/web/InventoryController.java

 

package springapp.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 springapp.service.ProductManager;
 
public class InventoryController implements Controller {
 
    protected final Log logger = LogFactory.getLog(getClass());
 
    private ProductManager productManager;
 
    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<String, Object> myModel = new HashMap<String, Object>();
        myModel.put("now", now);
        myModel.put("products", this.productManager.getProducts());
 
        return new ModelAndView("hello", "model", myModel);
    }
 
 
    public void setProductManager(ProductManager productManager) {
        this.productManager = productManager;
    }
 
}

test/springapp/web/InventoryControllerTests.java

 

package springapp.web;
 
import java.util.Map;
 
import org.springframework.web.servlet.ModelAndView;
 
import springapp.service.SimpleProductManager;
import springapp.web.InventoryController;
 
import junit.framework.TestCase;
 
public class InventoryControllerTests extends TestCase {
 
    public void testHandleRequestView() throws Exception{
        InventoryController controller = new InventoryController();
        controller.setProductManager(new SimpleProductManager());
        ModelAndView modelAndView = controller.handleRequest(null, null);
        assertEquals("hello", modelAndView.getViewName());
        assertNotNull(modelAndView.getModel());
        Map modelMap = (Map) modelAndView.getModel().get("model");
        String nowValue = (String) modelMap.get("now");
        assertNotNull(nowValue);
    }
}
 

2.     Message bundle 지원과 비즈니스 데이터의 display를 위해 view를 수정

 

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>
 

3.     비즈니스 객체와 테스트 데이터를 추가

 

war/WEB-INF/springapp-servlet.xml

 

<?xml version="1.0" encoding="UTF-8"?>
 
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 
    <!-- the application context definition for the springapp DispatcherServlet -->
 
    <bean id="productManager" class="springapp.service.SimpleProductManager">
        <property name="products">
            <list>
                <ref bean="product1"/>
                <ref bean="product2"/>
                <ref bean="product3"/>
            </list>
        </property>
    </bean>
 
    <bean id="product1" class="springapp.domain.Product">
        <property name="description" value="Lamp"/>
        <property name="price" value="5.75"/>
    </bean>
        
    <bean id="product2" class="springapp.domain.Product">
        <property name="description" value="Table"/>
        <property name="price" value="75.25"/>
    </bean>
 
    <bean id="product3" class="springapp.domain.Product">
        <property name="description" value="Chair"/>
        <property name="price" value="22.79"/>
    </bean>
 
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="messages"/>
    </bean>
 
    <bean name="/hello.htm" class="springapp.web.InventoryController">
        <property name="productManager" ref="productManager"/>
    </bean>
 
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
 
</beans>
 

4.     Message bundle clean 타켓 추가

war/WEB-INF/classes 아래에 messages.properties를 생성한다.

 

war/WEB-INF/classes/messages.properties

 

title=SpringApp
heading=Hello :: SpringApp
greeting=Greetings, it is now
 

소스 파일이름이 변경되었으므로, clean undeploy 타겟을 build에 추가한다.

 

build.xml

 

<target name="clean" description="Clean output directories">
        <delete>
            <fileset dir="${build.dir}">
                <include name="**/*.class"/>
            </fileset>
        </delete>
    </target>
 
    <target name="undeploy" description="Un-Deploy application">
        <delete>
            <fileset dir="${deploy.path}/${name}">
                <include name="**/*.*"/>
            </fileset>
        </delete>
    </target>
 

톰캣을 stop시키고, clean, undeploy, deploy를 차례로 실행하고, 톰캣을

start하면 된다. 


5.
    
form의 추가

form을 위해서 spring-framework-2.5/dist/resources/spring-form.tld

war/WEB-INF/tld   복사한다.

Web.xml <taglib/>를 추가한다.

 

war/WEB-INF/web.xml

 

<?xml version="1.0" encoding="UTF-8"?>
 
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
 
  <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>
 
  <jsp-config>
    <taglib>
      <taglib-uri>/spring</taglib-uri>
      <taglib-location>/WEB-INF/tld/spring-form.tld</taglib-location>
    </taglib>
  </jsp-config>
 
</web-app>
 

 

태그 라이브러리를 적용한 priceincrease.jspwar/WEB-INF/jsp디렉토리에

생성한다.

 

springapp/war/WEB-INF/jsp/priceincrease.jsp

 

<%@ include file="/WEB-INF/jsp/include.jsp" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
 
<html>
<head>
  <title><fmt:message key="title"/></title>
  <style>
    .error { color: red; }
  </style>  
</head>
<body>
<h1><fmt:message key="priceincrease.heading"/></h1>
<form:form method="post" commandName="priceIncrease">
  <table width="95%" bgcolor="f8f8ff" border="0" cellspacing="0" cellpadding="5">
    <tr>
      <td align="right" width="20%">Increase (%):</td>
        <td width="20%">
          <form:input path="percentage"/>
        </td>
        <td width="60%">
          <form:errors path="percentage" cssClass="error"/>
        </td>
    </tr>
  </table>
  <br>
  <input type="submit" align="center" value="Execute">
</form:form>
<a href="<c:url value="hello.htm"/>">Home</a>
</body>
</html>
 

간단한 javaBean class를 만든다.

 

springapp/src/springapp/service/PriceIncrease.java

 

package springapp.service;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
 
public class PriceIncrease {
 
    /** Logger for this class and subclasses */
    protected final Log logger = LogFactory.getLog(getClass());
 
    private int percentage;
 
    public void setPercentage(int i) {
        percentage = i;
        logger.info("Percentage set to " + i);
    }
 
    public int getPercentage() {
        return percentage;
    }
 
}
 

체크할 Validator 클래스를 만든다.

 

src/springapp/service/PriceIncreaseValidator.java

 

package springapp.service;
 
import org.springframework.validation.Validator;
import org.springframework.validation.Errors;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
 
public class PriceIncreaseValidator implements Validator {
    private int DEFAULT_MIN_PERCENTAGE = 0;
    private int DEFAULT_MAX_PERCENTAGE = 50;
    private int minPercentage = DEFAULT_MIN_PERCENTAGE;
    private int maxPercentage = DEFAULT_MAX_PERCENTAGE;
 
    /** Logger for this class and subclasses */
    protected final Log logger = LogFactory.getLog(getClass());
 
    public boolean supports(Class clazz) {
        return PriceIncrease.class.equals(clazz);
    }
 
    public void validate(Object obj, Errors errors) {
        PriceIncrease pi = (PriceIncrease) obj;
        if (pi == null) {
            errors.rejectValue("percentage", "error.not-specified", null, "Value required.");
        }
        else {
            logger.info("Validating with " + pi + ": " + pi.getPercentage());
            if (pi.getPercentage() > maxPercentage) {
                errors.rejectValue("percentage", "error.too-high",
                    new Object[] {new Integer(maxPercentage)}, "Value too high.");
            }
            if (pi.getPercentage() <= minPercentage) {
                errors.rejectValue("percentage", "error.too-low",
                    new Object[] {new Integer(minPercentage)}, "Value too low.");
            }
        }
    }
 
    public void setMinPercentage(int i) {
        minPercentage = i;
    }
 
    public int getMinPercentage() {
        return minPercentage;
    }
 
    public void setMaxPercentage(int i) {
        maxPercentage = i;
    }
 
    public int getMaxPercentage() {
        return maxPercentage;
    }
 
}
 

6.     form controller의 추가

 

war/WEB-INF/springapp-servlet.xml

 

<?xml version="1.0" encoding="UTF-8"?>
 
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 
<!-- the application context definition for the springapp DispatcherServlet -->
 
<beans>
 
    <bean id="productManager" class="springapp.service.SimpleProductManager">
        <property name="products">
            <list>
                <ref bean="product1"/>
                <ref bean="product2"/>
                <ref bean="product3"/>
            </list>
        </property>
    </bean>
 
    <bean id="product1" class="springapp.domain.Product">
        <property name="description" value="Lamp"/>
        <property name="price" value="5.75"/>
    </bean>
        
    <bean id="product2" class="springapp.domain.Product">
        <property name="description" value="Table"/>
        <property name="price" value="75.25"/>
    </bean>
 
    <bean id="product3" class="springapp.domain.Product">
        <property name="description" value="Chair"/>
        <property name="price" value="22.79"/>
    </bean>
 
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="messages"/>
    </bean>
 
    <bean name="/hello.htm" class="springapp.web.InventoryController">
        <property name="productManager" ref="productManager"/>
    </bean>
 
    <bean name="/priceincrease.htm" class="springapp.web.PriceIncreaseFormController">
        <property name="sessionForm" value="true"/>
        <property name="commandName" value="priceIncrease"/>
        <property name="commandClass" value="springapp.service.PriceIncrease"/>
        <property name="validator">
            <bean class="springapp.service.PriceIncreaseValidator"/>
        </property>
        <property name="formView" value="priceincrease"/>
        <property name="successView" value="hello.htm"/>
        <property name="productManager" ref="productManager"/>
    </bean>
 
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
 
</beans>
 

src/web/PriceIncreaseFormController.java

 

package springapp.web;
 
import org.springframework.web.servlet.mvc.SimpleFormController;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
 
import springapp.service.ProductManager;
import springapp.service.PriceIncrease;
 
public class PriceIncreaseFormController extends SimpleFormController {
 
    /** Logger for this class and subclasses */
    protected final Log logger = LogFactory.getLog(getClass());
 
    private ProductManager productManager;
 
    public ModelAndView onSubmit(Object command)
            throws ServletException {
 
        int increase = ((PriceIncrease) command).getPercentage();
        logger.info("Increasing prices by " + increase + "%.");
 
        productManager.increasePrice(increase);
 
        logger.info("returning from PriceIncreaseForm view to " + getSuccessView());
 
        return new ModelAndView(new RedirectView(getSuccessView()));
    }
 
    protected Object formBackingObject(HttpServletRequest request) throws ServletException {
        PriceIncrease priceIncrease = new PriceIncrease();
        priceIncrease.setPercentage(20);
        return priceIncrease;
    }
 
    public void setProductManager(ProductManager productManager) {
        this.productManager = productManager;
    }
 
    public ProductManager getProductManager() {
        return productManager;
    }
 
}
 

war/WEB-INF/classes/messages.properties

 

title=SpringApp
heading=Hello :: SpringApp
greeting=Greetings, it is now
priceincrease.heading=Price Increase :: SpringApp
error.not-specified=Percentage not specified!!!
error.too-low=You have to specify a percentage higher than {0}!
error.too-high=Don''t be greedy - you can''t raise prices by more than {0}%!
required=Entry required.
typeMismatch=Invalid data.
typeMismatch.percentage=That is not a number!!!
 

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>
    <br>
    <a href="<c:url value="priceincrease.htm"/>">Increase Prices</a>
    <br>
  </body>
</html>
 

 

 

 

 

'개발 > 스프링' 카테고리의 다른 글

스프링 tutorial (8)  (0) 2008.07.28
스프링 tutorial (7)  (0) 2008.07.27
스프링 tutorial (5)  (0) 2008.07.25
스프링 tutorial (4)  (0) 2008.07.17
스프링 tutorial (3)  (0) 2008.07.17
Posted by 무혹
,

2-4. ProductManager를 구현한 SimpleProductManager를 생성한다.

 

src/springapp/service/SimpleProductManager.java

 

package springapp.service;

 

import java.util.List;

 

import springapp.domain.Product;

 

public class SimpleProductManager implements ProductManager {

 

    public List<Product> getProducts() {

        throw new UnsupportedOperationException();

    }

 

    public void increasePrice(int percentage) {

        throw new UnsupportedOperationException();       

    }

 

    public void setProducts(List<Product> products) {

        throw new UnsupportedOperationException();       

    }

 

}


2-5. TDD는 좋은것이여. 따라서 SimpleProductManager를 테스트하기 위한

SimpleProductManagerTests를 생성한다.

 

test/springapp/service/SimpleProductManagerTests.java

 

package springapp.service;
 import junit.framework.TestCase;
 public class SimpleProductManagerTests extends TestCase {
   private SimpleProductManager productManager;
   protected void setUp() throws Exception {
        productManager = new SimpleProductManager();
    }
     public void testGetProductsWithNoProducts() {
        productManager = new SimpleProductManager();
        assertNull(productManager.getProducts());
    }

}






2-6. 테스트를 실행해보면 오류가 발생한다. 우선 SimpleProductManagerTestssetUp 메소드에
stub list를 선언하고 테스트 메소드를 추가한다.

 

test/springapp/service/SimpleProductManagerTests.java

 

package springapp.service;
 
import java.util.ArrayList;
import java.util.List;
 
import springapp.domain.Product;
 
import junit.framework.TestCase;
 
public class SimpleProductManagerTests extends TestCase {
 
    private SimpleProductManager productManager;
    private List<Product> products;
    
    private static int PRODUCT_COUNT = 2;
    
    private static Double CHAIR_PRICE = new Double(20.50);
    private static String CHAIR_DESCRIPTION = "Chair";
    
    private static String TABLE_DESCRIPTION = "Table";
    private static Double TABLE_PRICE = new Double(150.10);         
        
    protected void setUp() throws Exception {
        productManager = new SimpleProductManager();
        products = new ArrayList<Product>();
        
        // stub up a list of products
        Product product = new Product();
        product.setDescription("Chair");
        product.setPrice(CHAIR_PRICE);
        products.add(product);
        
        product = new Product();
        product.setDescription("Table");
        product.setPrice(TABLE_PRICE);
        products.add(product);
        
        productManager.setProducts(products);
    }
 
    public void testGetProductsWithNoProducts() {
        productManager = new SimpleProductManager();
        assertNull(productManager.getProducts());
    }
    
    public void testGetProducts() {
        List<Product> products = productManager.getProducts();
        assertNotNull(products);        
        assertEquals(PRODUCT_COUNT, productManager.getProducts().size());
    
        Product product = products.get(0);
        assertEquals(CHAIR_DESCRIPTION, product.getDescription());
        assertEquals(CHAIR_PRICE, product.getPrice());
        
        product = products.get(1);
        assertEquals(TABLE_DESCRIPTION, product.getDescription());
        assertEquals(TABLE_PRICE, product.getPrice());      
    }   
}
 

2-7. 다시 테스트를 실행하면 또 오류가 발생한다. ? SimpleProductManager가 무조건 Exception

리턴하므로. 따라서 SimpleProductManager의 메소드들을 구현한다.

 

src/springapp/service/SimpleProductManager.java

 

package springapp.service;
 
import java.util.ArrayList;
import java.util.List;
 
import springapp.domain.Product;
 
public class SimpleProductManager implements ProductManager {
 
    private List<Product> products;
    
    public List<Product> getProducts() {
        return products;
    }
 
    public void increasePrice(int percentage) {
        // TODO Auto-generated method stub      
    }
 
    public void setProducts(List<Product> products) {
        this.products = products;
    }
    
}
 

2-8. 테스트를 재실행하면 모두 통과한다.

    이후에 increasePrice()의 테스트를 위하여 아래 테스트를 구현한다.

product list null인 경우

product list empty인 경우

10% 증가시 모든 product list에 반영되는지 여부

 

springapp/test/springapp/service/SimpleProductManagerTests.java


package springapp.service;
 
import java.util.ArrayList;
import java.util.List;
 
import springapp.domain.Product;
 
import junit.framework.TestCase;
 
public class SimpleProductManagerTests extends TestCase {
 
    private SimpleProductManager productManager;
 
    private List<Product> products;
    
    private static int PRODUCT_COUNT = 2;
    
    private static Double CHAIR_PRICE = new Double(20.50);
    private static String CHAIR_DESCRIPTION = "Chair";
    
    private static String TABLE_DESCRIPTION = "Table";
    private static Double TABLE_PRICE = new Double(150.10);         
    
    private static int POSITIVE_PRICE_INCREASE = 10;
    
    protected void setUp() throws Exception {
        productManager = new SimpleProductManager();
        products = new ArrayList<Product>();
        
        // stub up a list of products
        Product product = new Product();
        product.setDescription("Chair");
        product.setPrice(CHAIR_PRICE);
        products.add(product);
        
        product = new Product();
        product.setDescription("Table");
        product.setPrice(TABLE_PRICE);
        products.add(product);
        
        productManager.setProducts(products);
    }
 
    public void testGetProductsWithNoProducts() {
        productManager = new SimpleProductManager();
        assertNull(productManager.getProducts());
    }
    
    public void testGetProducts() {
        List<Product> products = productManager.getProducts();
        assertNotNull(products);        
        assertEquals(PRODUCT_COUNT, productManager.getProducts().size());
    
        Product product = products.get(0);
        assertEquals(CHAIR_DESCRIPTION, product.getDescription());
        assertEquals(CHAIR_PRICE, product.getPrice());
        
        product = products.get(1);
        assertEquals(TABLE_DESCRIPTION, product.getDescription());
        assertEquals(TABLE_PRICE, product.getPrice());      
    }   
    
    public void testIncreasePriceWithNullListOfProducts() {
        try {
            productManager = new SimpleProductManager();
            productManager.increasePrice(POSITIVE_PRICE_INCREASE);
        }
        catch(NullPointerException ex) {
            fail("Products list is null.");
        }
    }
    
    public void testIncreasePriceWithEmptyListOfProducts() {
        try {
            productManager = new SimpleProductManager();
            productManager.setProducts(new ArrayList<Product>());
            productManager.increasePrice(POSITIVE_PRICE_INCREASE);
        }
        catch(Exception ex) {
            fail("Products list is empty.");
        }           
    }
    
    public void testIncreasePriceWithPositivePercentage() {
        productManager.increasePrice(POSITIVE_PRICE_INCREASE);
        double expectedChairPriceWithIncrease = 22.55;
        double expectedTablePriceWithIncrease = 165.11;
        
        List<Product> products = productManager.getProducts();      
        Product product = products.get(0);
        assertEquals(expectedChairPriceWithIncrease, product.getPrice());
        
        product = products.get(1);      
        assertEquals(expectedTablePriceWithIncrease, product.getPrice());       
    }
        
}
 

2-9. 테스트를 작성했으면, 해당 Manager를 수정해야 한다. 가자..

 

src/springapp/service/SimpleProductManager.java

 

package springapp.service;
 
import java.util.List;
 
import springapp.domain.Product;
 
public class SimpleProductManager implements ProductManager {
 
    private List<Product> products;
    
    public List<Product> getProducts() {
        return products;
    }
 
    public void increasePrice(int percentage) {
        if (products != null) {
            for (Product product : products) {
                double newPrice = product.getPrice().doubleValue() * 
                                    (100 + percentage)/100;
                product.setPrice(newPrice);
            }
        }
    }
    
    public void setProducts(List<Product> products) {
        this.products = products;
    }
    
}
 
2-10. 테스트가 통과된다.



















'개발 > 스프링' 카테고리의 다른 글

스프링 tutorial (7)  (0) 2008.07.27
스프링 tutorial (6)  (0) 2008.07.26
스프링 tutorial (4)  (0) 2008.07.17
스프링 tutorial (3)  (0) 2008.07.17
스프링 tutorial (2)  (0) 2008.07.16
Posted by 무혹
,

비지니스 로직의 개발

1. Inventory Management System의 business case review

validation rule :

The maximum increase is limited to 50%.

The minimum increase must be greater than 0%.

클래스 다이어그램

사용자 삽입 이미지

2. 비즈니스 로직에 몇 개의 클래스를 추가

2-1. 서비스 객체를 위해 service패키지를 도메인 객체를 위해 domain패키지를 생성한다.
src/springapp/domain
src/springapp/domain

2-1. 위의 클래스 다이어그램을 기준으로 product 클래스를 생성한다.

package springapp.domain;

import java.io.Serializable;

public class Product implements Serializable {

    private String description;
    private Double price;
    
    public String getDescription() {
        return description;
    }
    
    public void setDescription(String description) {
        this.description = description;
    }
    
    public Double getPrice() {
        return price;
    }
    
    public void setPrice(Double price) {
        this.price = price;
    }
    
    public String toString() {
        StringBuffer buffer = new StringBuffer();
        buffer.append("Description: " + description + ";");
        buffer.append("Price: " + price);
        return buffer.toString();
    }
}
2-2. 단위 테스트를 생성한다.

springapp/test/springapp/domain/ProductTests.java

package springapp.domain;

import junit.framework.TestCase;

public class ProductTests extends TestCase {

    private Product product;

    protected void setUp() throws Exception {
        product = new Product();
    }

    public void testSetAndGetDescription() {
        String testDescription = "aDescription";
        assertNull(product.getDescription());
        product.setDescription(testDescription);
        assertEquals(testDescription, product.getDescription());
    }

    public void testSetAndGetPrice() {
        double testPrice = 100.00;
        assertEquals(0, 0, 0);    
        product.setPrice(testPrice);
        assertEquals(testPrice, product.getPrice(), 0);
    }
  
}
2-3. Product 클래스를 취급하는 ProductManager를 생성한다.
      이 인터페이스는 가격을 증가시키는 increasePrice(), product를 getter하기 위한
      getProducts() 메소드를 가진다.

src/springapp/service/ProductManager.java

package springapp.service;

import java.io.Serializable;
import java.util.List;

import springapp.domain.Product;

public interface ProductManager extends Serializable{

    public void increasePrice(int percentage);
    
    public List<Product> getProducts();
    
}

다음으로 계속......



























'개발 > 스프링' 카테고리의 다른 글

스프링 tutorial (6)  (0) 2008.07.26
스프링 tutorial (5)  (0) 2008.07.25
스프링 tutorial (3)  (0) 2008.07.17
스프링 tutorial (2)  (0) 2008.07.16
스프링 tutorial (1)  (0) 2008.07.16
Posted by 무혹
,

View 와 controller의 개발과 설정

1. JSTL 설정과 JSP 헤더 파일 추가

1-1. war/WEB-INF/lib에 아래 파일을 추가한다.

spring-framework-2.5/lib/j2ee/jstl.jar
spring-framework-2.5/lib/jakarta-taglibs/standard.jar

1-2. jsp를 보관할 디렉토리를 war/WEB-INF/ 에 생성한다.

war/WEB-INF/jsp

1-3. header 파일이 될 include.jsp 파일을 생성한다.

war/WEB-INF/jsp/include.jsp

<%@ page session="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

1-4. index.jsp를 업데이트하여 모든 요청이 framework을 통하도록 한다.

<%@ include file="/WEB-INF/jsp/include.jsp" %>
<c:redirect url="/hello.htm"/>

1-5. hello.jsp를 war/WEB-INF/jsp/ 로 이동하고 수정한다.

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>

2. controller를 수정한다.

2-1. 모델의 key를 "now"로 테스트를 수정한다.

package springapp.web;

import org.springframework.web.servlet.ModelAndView;

import springapp.web.HelloController;

import junit.framework.TestCase;

public class HelloControllerTests extends TestCase {

    public void testHandleRequestView() throws Exception{
        HelloController controller = new HelloController();
        ModelAndView modelAndView = controller.handleRequest(null, null);
        assertEquals("WEB-INF/jsp/hello.jsp", modelAndView.getViewName());
        assertNotNull(modelAndView.getModel());
        String nowValue = (String) modelAndView.getModel().get("now");
        assertNotNull(nowValue);
    }
}

2-2. tests 태스크를 실행한다.

now라는 key가 없으므로 에러가 발생한다.

2-3. HelloController에 날자를 기준으로 now key를 설정한다.

package springapp.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 org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.IOException;
import java.util.Date;

public class HelloController implements Controller {

    protected final Log logger = LogFactory.getLog(getClass());

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String now = (new Date()).toString();
        logger.info("Returning hello view with " + now);

        return new ModelAndView("WEB-INF/jsp/hello.jsp", "now", now);
    }

}


2-4. tests 태스크를 재실행하여 성공한다.

2-5. http://localhost:8080/springapp/ 을 웹 브라우저에 입력하여 아래와 같은 정상적인 화면을 본다.

사용자 삽입 이미지

http://localhost:8080/springapp/을 입력하는 경우 위의 화면이 보여지는 원인은 다음과 같다.

web.xml에 welcome-file을 index.jsp로 설정했으므로 index.jsp를 호출한다.
index.jsp에서는 hello.htm으로 redirect하라고 했다.
web.xml에 설정한 바에 따르면 *.htm=> springapp => org.springframework.web.servlet.DispatcherServlet의 순서로 호출한다.
DispatcherServlet은 spring의 servlet이므로 springapp_servlet.xml을 읽는다.
springapp_servlet.xml의 설정에 hello.htm은 springapp.web.HelloController로 되어 있으므로 HelloController를 호출한다.
그 후에 HelloController에서 hello.jsp view를 호출하므로 화면이 보여진다.

3. controller와 view의 결합을 제거

3-1. view에 대한 설정을 한다.

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

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
   
    <!-- the application context definition for the springapp DispatcherServlet -->
   
    <bean name="/hello.htm" class="springapp.web.HelloController"/>
   
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>       
    </bean>
           
</beans>

3-2. controller 테스트에서 view name을 변경한 후에 테스트를 실행하여 실패를 확인한다.

package springapp.web;

import org.springframework.web.servlet.ModelAndView;

import springapp.web.HelloController;

import junit.framework.TestCase;

public class HelloControllerTests extends TestCase {

    public void testHandleRequestView() throws Exception{
        HelloController controller = new HelloController();
        ModelAndView modelAndView = controller.handleRequest(null, null);
        assertEquals("hello", modelAndView.getViewName());
        assertNotNull(modelAndView.getModel());
        String nowValue = (String) modelAndView.getModel().get("now");
        assertNotNull(nowValue);
    }
}

3-3. controller소스안의 view 이름을 logical명으로 변경한 후에 재테스트하면 성공한다.

package springapp.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 org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.IOException;
import java.util.Date;

public class HelloController implements Controller {

    protected final Log logger = LogFactory.getLog(getClass());

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String now = (new Date()).toString();
        logger.info("Returning hello view with " + now);

        return new ModelAndView("hello", "now", now);
    }

}

  • 현 시점의 디렉토리 구조

사용자 삽입 이미지


'개발 > 스프링' 카테고리의 다른 글

스프링 tutorial (6)  (0) 2008.07.26
스프링 tutorial (5)  (0) 2008.07.25
스프링 tutorial (4)  (0) 2008.07.17
스프링 tutorial (2)  (0) 2008.07.16
스프링 tutorial (1)  (0) 2008.07.16
Posted by 무혹
,

기본 application의 설정

1. 스프링 프레임워크를 다운받아서 임의의 위치에 압축해제한다.

2. web.xml을 수정한다.

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

<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >

  <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>

3. WEB-INF 하위에 springapp-servlet.xml을 생성한다.

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

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

  <!-- the application context definition for the springapp DispatcherServlet -->

  <bean name="/hello.htm" class="springapp.web.HelloController"/>

</beans>

4. WEB-INF 하위에 lib 디렉토리를 생성하고 아래의 파일들을 복사한다.

spring-framework-2.5/dist/spring.jar
spring-framework-2.5/dist/modules/spring-webmvc.jar
spring-framework-2.5/lib/jakarta-commons/commons-logging.jar

5. 테스트하기 위한 controller를 생성한다.

src/springapp/web/HelloController.java

package springapp.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 org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.IOException;

public class HelloController implements Controller {

    protected final Log logger = LogFactory.getLog(getClass());

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        logger.info("Returning hello view");

        return new ModelAndView("hello.jsp");
    }

}

6. controller 테스트를 위한 TestCase를 작성한다.

test/springapp/web/HelloControllerTests.java

package springapp.web;

import org.springframework.web.servlet.ModelAndView;

import springapp.web.HelloController;

import junit.framework.TestCase;

public class HelloControllerTests extends TestCase {

    public void testHandleRequestView() throws Exception{  
        HelloController controller = new HelloController();
        ModelAndView modelAndView = controller.handleRequest(null, null);  
        assertEquals("hello.jsp", modelAndView.getViewName());
    }
}

7. build.xml에 테스트에 관한 task를 추가한다.

<property name="test.dir" value="test"/>
       
    <target name="buildtests" description="Compile test tree java files">
        <mkdir dir="${build.dir}"/>
        <javac destdir="${build.dir}" source="1.5" target="1.5" debug="true"
            deprecation="false" optimize="false" failonerror="true">
            <src path="${test.dir}"/>
            <classpath refid="master-classpath"/>
        </javac>
    </target>
   
    <target name="tests" depends="build, buildtests" description="Run tests">
        <junit printsummary="on"
            fork="false"
            haltonfailure="false"
            failureproperty="tests.failed"
            showoutput="true">
            <classpath refid="master-classpath"/>
            <formatter type="brief" usefile="false"/>
           
            <batchtest>
                <fileset dir="${build.dir}">
                    <include name="**/*Tests.*"/>
                </fileset>
            </batchtest>
           
        </junit>
       
        <fail if="tests.failed">
            tests.failed=${tests.failed}
            ***********************************************************
            ***********************************************************
            ****  One or more tests failed!  Check the output ...  ****
            ***********************************************************
            ***********************************************************
        </fail>
    </target>

8. tests 태스크를 실행하여 통과여부를 확인한다.

9. war 디렉토리 하위에 hello.jsp를 생성한다.

<html>
  <head><title>Hello :: Spring Application</title></head>
  <body>
    <h1>Hello - Spring Application</h1>
    <p>Greetings.</p>
  </body>
</html>

10. build.xml의 deploy 태스크를 실행한다.

11. 아래 주소를 실행하여 화면이 정상적으로 나오는것을 확인한다.

http://localhost:8080/springapp/hello.htm




 

'개발 > 스프링' 카테고리의 다른 글

스프링 tutorial (6)  (0) 2008.07.26
스프링 tutorial (5)  (0) 2008.07.25
스프링 tutorial (4)  (0) 2008.07.17
스프링 tutorial (3)  (0) 2008.07.17
스프링 tutorial (1)  (0) 2008.07.16
Posted by 무혹
,

1. 필요 소프트웨어

Java SDK 1.5 : 자바 컴파일
Ant 1.7 : 빌드 스크립트
Apache Tomcat 6.0.14 : JSP container
Eclipse 3.3 : IDE Tool (있으면 좋지만 꼭 필요하지는 않다.)

2. Eclipse 프로젝트를 생성하고 src, war 디렉토리를 생성한다.
-- WTP에서 web project를 생성하는 경우는 설정만 변경하면 됨.
     디렉토리 생성 필요없슴

3. 3. war 디렉토리에 index.jsp파일을 생성한다.

  • index.jsp

<%@ page contentType="text/html; charset=euc-kr"%>
<html>
  <head><title>스프링 애플리케이션</title></head>
  <body>
    <h1>예제 - 스프링 애플리케이션</h1>
    <p>테스트.</p>
  </body>
</html>


4. war 디렉토리 하위에 WEB-INF 디렉토리를 생성하고 web.xml 파일을 위치시킨다.

  • web.xml

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

<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >

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

</web-app>

5. tomcat에 배치하기 위한 build.xml을 프로젝트 root에 생성한다.


 

<?xml version="1.0"?>

<project name="springapp" basedir="." default="usage">
    <property file="build.properties"/>

    <property name="src.dir" value="${project.home}/src"/>
    <property name="web.dir" value="${project.home}/war"/>
    <property name="build.dir" value="${web.dir}/WEB-INF/classes"/>
    <property name="name" value="springapp"/>

    <path id="master-classpath">
        <fileset dir="${web.dir}/WEB-INF/lib">
            <include name="*.jar"/>
        </fileset>
        <!-- We need the servlet API classes: -->
        <!--  * for Tomcat 5/6 use servlet-api.jar -->
        <!--  * for other app servers - check the docs -->
        <fileset dir="${appserver.lib}">
            <include name="servlet*.jar"/>
        </fileset>
        <pathelement path="${build.dir}"/>
    </path>

    <target name="usage">
        <echo message=""/>
        <echo message="${name} build file"/>
        <echo message="-----------------------------------"/>
        <echo message=""/>
        <echo message="Available targets are:"/>
        <echo message=""/>
        <echo message="build     --> Build the application"/>
        <echo message="deploy    --> Deploy application as directory"/>
        <echo message="deploywar --> Deploy application as a WAR file"/>
        <echo message="install   --> Install application in Tomcat"/>
        <echo message="reload    --> Reload application in Tomcat"/>
        <echo message="start     --> Start Tomcat application"/>
        <echo message="stop      --> Stop Tomcat application"/>
        <echo message="list      --> List Tomcat applications"/>
        <echo message=""/>
    </target>

    <target name="build" description="Compile main source tree java files">
        <mkdir dir="${build.dir}"/>
        <javac destdir="${build.dir}" source="1.5" target="1.5" debug="true"
               deprecation="false" optimize="false" failonerror="true">
            <src path="${src.dir}"/>
            <classpath refid="master-classpath"/>
        </javac>
    </target>

    <target name="deploy" depends="build" description="Deploy application">
        <copy todir="${deploy.path}/${name}" preservelastmodified="true">
            <fileset dir="${web.dir}">
                <include name="**/*.*"/>
            </fileset>
        </copy>
    </target>

    <target name="deploywar" depends="build" description="Deploy application as a WAR file">
        <war destfile="${name}.war"
             webxml="${web.dir}/WEB-INF/web.xml">
            <fileset dir="${web.dir}">
                <include name="**/*.*"/>
            </fileset>
        </war>
        <copy todir="${deploy.path}" preservelastmodified="true">
            <fileset dir=".">
                <include name="*.war"/>
            </fileset>
        </copy>
    </target>
   
<!-- ============================================================== -->
<!-- Tomcat tasks - remove these if you don't have Tomcat installed -->
<!-- ============================================================== -->

    <path id="catalina-ant-classpath">
        <!-- We need the Catalina jars for Tomcat -->
        <!--  * for other app servers - check the docs -->
        <fileset dir="${appserver.lib}">
            <include name="catalina-ant.jar"/>
        </fileset>
    </path>

    <taskdef name="install" classname="org.apache.catalina.ant.InstallTask">
        <classpath refid="catalina-ant-classpath"/>
    </taskdef>
    <taskdef name="reload" classname="org.apache.catalina.ant.ReloadTask">
        <classpath refid="catalina-ant-classpath"/>
    </taskdef>
    <taskdef name="list" classname="org.apache.catalina.ant.ListTask">
        <classpath refid="catalina-ant-classpath"/>
    </taskdef>
    <taskdef name="start" classname="org.apache.catalina.ant.StartTask">
        <classpath refid="catalina-ant-classpath"/>
    </taskdef>
    <taskdef name="stop" classname="org.apache.catalina.ant.StopTask">
        <classpath refid="catalina-ant-classpath"/>
    </taskdef>

    <target name="install" description="Install application in Tomcat">
        <install url="${tomcat.manager.url}"
                 username="${tomcat.manager.username}"
                 password="${tomcat.manager.password}"
                 path="/${name}"
                 war="${name}"/>
    </target>

    <target name="reload" description="Reload application in Tomcat">
        <reload url="${tomcat.manager.url}"
                 username="${tomcat.manager.username}"
                 password="${tomcat.manager.password}"
                 path="/${name}"/>
    </target>

    <target name="start" description="Start Tomcat application">
        <start url="${tomcat.manager.url}"
                 username="${tomcat.manager.username}"
                 password="${tomcat.manager.password}"
                 path="/${name}"/>
    </target>

    <target name="stop" description="Stop Tomcat application">
        <stop url="${tomcat.manager.url}"
                 username="${tomcat.manager.username}"
                 password="${tomcat.manager.password}"
                 path="/${name}"/>
    </target>

    <target name="list" description="List Tomcat applications">
        <list url="${tomcat.manager.url}"
                 username="${tomcat.manager.username}"
                 password="${tomcat.manager.password}"/>
    </target>

<!-- End Tomcat tasks -->

</project>

6. 아래의 build.properties를 본인의 환경에 맞게 수정하여 프로젝트의 root 디렉토리에
위치시킨다.

# Ant properties for building the springapp

appserver.home=${user.home}/apache-tomcat-6.0.14
# for Tomcat 5 use $appserver.home}/server/lib
# for Tomcat 6 use $appserver.home}/lib
appserver.lib=${appserver.home}/lib

deploy.path=${appserver.home}/webapps

project.home=K:/myPrj/springapp/

tomcat.manager.url=http://localhost:8080/manager
tomcat.manager.username=tomcat
tomcat.manager.password=s3cret

7. build.xml을 실행하여 에러여부를 확인한다.

$ ant
Buildfile: build.xml

usage:
     [echo]
     [echo] springapp build file
     [echo] -----------------------------------
     [echo]
     [echo] Available targets are:
     [echo]
     [echo] build     --> Build the application
     [echo] deploy    --> Deploy application as directory
     [echo] deploywar --> Deploy application as a WAR file
     [echo] install   --> Install application in Tomcat
     [echo] reload    --> Reload application in Tomcat
     [echo] start     --> Start Tomcat application
     [echo] stop      --> Stop Tomcat application
     [echo] list      --> List Tomcat applications
     [echo]

BUILD SUCCESSFUL
Total time: 2 seconds

8. deploy나 deploywar를 실행한다.

9. tomcat을 기동한후에 아래 페이지를 입력한다.
http://localhost:8080/springapp/index.jsp


여기까지 jsp실행을 위한 환경 완료됨




 

'개발 > 스프링' 카테고리의 다른 글

스프링 tutorial (6)  (0) 2008.07.26
스프링 tutorial (5)  (0) 2008.07.25
스프링 tutorial (4)  (0) 2008.07.17
스프링 tutorial (3)  (0) 2008.07.17
스프링 tutorial (2)  (0) 2008.07.16
Posted by 무혹
,