首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JBuilder 2005 開發 Spring 應用完整實戰:從 HelloWorld 到數據庫持久層

     編輯:Java 相關知識

環境準備

  • 下載 Spring 包,解壓 dist/ (核心 JAR) 、lib/ (依賴)
  • JBuilder: Tools → Configure Libraries → New "spring" → Add dist/*.jar
  • 項目屬性:Server=Tomcat,Required Libraries 添加 spring、log4j (或 jakarta-commons-logging)

Spring MVC 核心三件套搭建

1. Controller (SpringappController.java)

package spring;
public class SpringappController implements Controller {
    static Logger logger = Logger.getLogger(SpringappController.class);
    public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) {
        logger.info("returning hello view");
        return new ModelAndView("hello.jsp");
    }
}

2. 視圖 (hello.jsp)

<%@ page contentType="text/html; charset=Big5" %>
<html><body><h1>Hello - Spring Application</h1></body></html>

3. 配置文件


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


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


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

進階重構:解耦 Controller 與 View、引入 JSTL、業務層分離

InternalResourceViewResolver 統一視圖解析

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

Controller 僅返回邏輯視圖名:return new ModelAndView("hello", "now", now);

業務領域模型

// bus/Product.java
public class Product implements Serializable {
    private String description; private Double price;
    // getter/setter
}

// bus/ProductManager.java
public class ProductManager implements Serializable {
    private List products;
    public List getProducts() { return products; }
    public void setProducts(List p) { products = p; }
}

Controller 注入 ProductManager

public class SpringappController implements Controller {
    private ProductManager prodMan;
    public ModelAndView handleRequest(...) {
        Map model = new HashMap();
        model.put("now", new Date().toString());
        model.put("products", getProductManager().getProducts());
        return new ModelAndView("hello", "model", model);
    }
    // setter/getter
}

Spring 配置裝配業務數據

<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="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basename"><value>messages</value></property></bean>

JSP 使用 JSTL 顯示國際化消息與集合迭代

<fmt:message key="heading"/>
<c:out value="${model.now}"/>
<c:forEach items="${model.products}" var="prod">
  <c:out value="${prod.description}"/> <i>$<c:out value="${prod.price}"/></i>
</c:forEach>

數據庫持久層實戰 (HSQLDB + Spring JDBC)

1. HSQLDB 設置

  • Library 添加 hsqldb.jar
  • Database Pilot 創建連接: jdbc:hsqldb:db/test, SA/空密碼
  • 建表插數:
    CREATE TABLE products (id INTEGER PRIMARY KEY, description VARCHAR(255), price DECIMAL(15,2));
    INSERT INTO products VALUES (1, 'Lamp', 5.78), (2, 'Table', 75.29), (3, 'Chair', 22.81);
    

2. DAO 接口與 JDBC 實現

// db/ProductManagerDao.java
public interface ProductManagerDao {
    List getProductList();
    void increasePrice(Product prod, int pct);
}

// db/ProductManagerDaoJdbc.java
public class ProductManagerDaoJdbc implements ProductManagerDao {
    private DataSource ds;
    public List getProductList() {
        return new ProductQuery(ds).execute(); // MappingSqlQuery
    }
    public void increasePrice(Product prod, int 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();
        su.update(new Object[]{pct, prod.getId()});
    }
    class ProductQuery extends MappingSqlQuery {
        ProductQuery(DataSource ds) { super(ds, "SELECT id, description, price FROM products"); compile(); }
        protected Object mapRow(ResultSet rs, int rowNum) {
            Product p = new Product();
            p.setId(rs.getInt("id"));
            p.setDescription(rs.getString("description"));
            p.setPrice(new Double(rs.getDouble("price")));
            return p;
        }
    }
}

3. 業務層委託 DAO

public class ProductManager {
    private ProductManagerDao pmd;
    public List getProducts() { return pmd.getProductList(); }
    public void increasePrice(int pct) {
        for (Product p : getProducts()) pmd.increasePrice(p, pct);
    }
}

4. Spring 配置數據源與 DAO 注入

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName"><value>org.hsqldb.jdbcDriver</value></property>
  <property name="url"><value>jdbc:hsqldb: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>
</bean>

測試策略:Mock DAO 隔離單元測試

// tests/MockProductManagerDaoImpl.java
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) {
        prod.setPrice(new Double(prod.getPrice().doubleValue() * (100 + pct) / 100));
    }
}

// tests/TestProductManager.java
public class TestProductManager extends TestCase {
    public void setUp() {
        ProductManager pm = new ProductManager();
        MockProductManagerDaoImpl dao = new MockProductManagerDaoImpl();
        dao.setProducts(Arrays.asList(
            new Product("Chair", 20.50), new Product("Table", 150.10)
        ));
        pm.setProductManagerDao(dao);
    }
    public void testIncreasePrice() { /* 驗證價格上漲 10% */ }
}

總結

本教程展示了在 JBuilder 2005 中從零構建 Spring Web 應用的全過程:環境配置、MVC 核心搭建、視圖解耦、JSTL 國際化、業務領域建模、Spring JDBC 封裝 (MappingSqlQuery/SqlUpdate)、聲明式事務準備、Mock 對象單元測試。掌握這套流程,可快速構建生產級 Spring 應用原型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved