### Spring MVC Step by Step知识点详解 #### 概览 本文档详细介绍了如何使用Spring Framework MVC框架逐步构建一个完整的Web应用程序。文档版本为2.5,由Thomas Risberg、Rick Evans和Portia Tung共同编著,版权归属2004-2008年。 #### 基本应用及环境搭建 ##### 1.1 创建项目目录结构 - **项目根目录**:用于存放整个项目的文件和目录。 - **src/main/java**:存放Java源代码。 - **src/main/webapp**:存放Web资源,如JSP页面、静态资源等。 - **src/main/resources**:存放配置文件和其他资源文件。 - **src/test/java**:存放单元测试代码。 - **src/test/resources**:存放测试相关的配置文件。 ##### 1.2 创建`index.jsp` - 在`src/main/webapp/WEB-INF`目录下创建`index.jsp`文件,作为初始页面。 - 示例代码: ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Spring MVC Demo</title> </head> <body> <h1>Welcome to Spring MVC!</h1> </body> </html> ``` ##### 1.3 部署应用到Tomcat - 将项目打包成WAR文件。 - 将WAR文件部署到Tomcat的`webapps`目录下。 - 启动Tomcat服务器。 ##### 1.4 检查应用是否正常工作 - 打开浏览器访问`http://localhost:8080/<your-app-name>`。 - 如果能看到“Welcome to Spring MVC!”页面,则表示部署成功。 ##### 1.5 下载Spring Framework - 访问Spring官方网站下载最新版本的Spring Framework。 - 将下载的文件解压,并将所需的库文件添加到项目中。 ##### 1.6 修改`web.xml`文件 - 在`src/main/webapp/WEB-INF`目录下的`web.xml`文件中配置Spring MVC的DispatcherServlet。 - 示例代码: ```xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-mvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> ``` ##### 1.7 复制库文件到`WEB-INF/lib` - 将Spring框架以及其他依赖库(例如:JSTL、Spring MVC等)复制到`WEB-INF/lib`目录下。 ##### 1.8 创建Controller - 在`src/main/java`目录下创建一个新的Java类作为Controller。 - 示例代码: ```java package com.example.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HomeController { @GetMapping("/") public String home(Model model) { model.addAttribute("message", "Hello, Spring MVC!"); return "index"; } } ``` ##### 1.9 编写Controller测试 - 在`src/test/java`目录下创建测试类来验证Controller的行为。 - 示例代码: ```java package com.example.controller; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; @WebMvcTest(HomeController.class) public class HomeControllerTest { @Autowired private MockMvc mockMvc; @Test public void shouldReturnDefaultMessage() throws Exception { this.mockMvc.perform(get("/")) .andExpect(status().isOk()) .andExpect(view().name("index")) .andExpect(content().string("Hello, Spring MVC!")); } } ``` ##### 1.10 创建视图 - 在`src/main/webapp`目录下创建视图文件(例如:JSP页面)。 - 示例代码: ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Home Page</title> </head> <body> <h1>${message}</h1> </body> </html> ``` ##### 1.11 编译并部署应用 - 使用Maven或Gradle工具进行项目构建。 - 将WAR文件部署到Tomcat或其他Web容器中。 ##### 1.12 尝试运行应用 - 打开浏览器访问`http://localhost:8080/<your-app-name>`。 - 如果能看到“Hello, Spring MVC!”页面,则表示配置正确。 ##### 1.13 总结 通过以上步骤,我们已经完成了Spring MVC应用的基本配置。接下来将进一步探讨如何开发视图和控制器、实现业务逻辑以及集成Web界面与持久层等内容。 #### 开发和配置视图及控制器 ##### 2.1 配置JSTL和添加JSP头文件 - 在`src/main/webapp/WEB-INF`目录下创建`taglib.tld`文件。 - 在JSP页面中使用JSTL标签。 - 示例代码: ```jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> ``` ##### 2.2 改进控制器 - 在控制器中添加更多处理逻辑,以便能够处理不同的请求。 - 示例代码: ```java @Controller public class HomeController { @GetMapping("/") public String home(Model model) { model.addAttribute("message", "Hello, Spring MVC!"); return "index"; } @GetMapping("/about") public String about(Model model) { model.addAttribute("message", "This is the About page."); return "about"; } } ``` ##### 2.3 解耦视图与控制器 - 使用ModelAndView对象返回视图名称和模型数据。 - 示例代码: ```java @Controller public class HomeController { @GetMapping("/") public ModelAndView home() { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("index"); modelAndView.addObject("message", "Hello, Spring MVC!"); return modelAndView; } } ``` ##### 2.4 总结 本章介绍了如何使用JSTL改进视图展示效果,以及如何进一步优化控制器的设计,使其更加灵活且易于维护。 #### 实现业务逻辑 ##### 3.1 回顾业务案例 - 分析业务需求,确定需要实现的功能模块。 ##### 3.2 添加业务逻辑类 - 创建新的Java类来封装具体的业务逻辑。 - 示例代码: ```java package com.example.service; public class InventoryService { public List<InventoryItem> getInventoryItems() { // 实现获取库存物品列表的逻辑 return Collections.emptyList(); } } ``` ##### 3.3 总结 本章重点在于理解和实现业务逻辑,为后续章节中的Web界面与持久层的集成打下基础。 #### 开发Web界面 ##### 4.1 在控制器中引用业务逻辑 - 在控制器中注入业务逻辑服务。 - 示例代码: ```java @Controller public class HomeController { private final InventoryService inventoryService; @Autowired public HomeController(InventoryService inventoryService) { this.inventoryService = inventoryService; } @GetMapping("/") public String home(Model model) { List<InventoryItem> inventoryItems = inventoryService.getInventoryItems(); model.addAttribute("inventoryItems", inventoryItems); return "index"; } } ``` ##### 4.2 修改视图以显示业务数据和支持消息绑定 - 在JSP页面中使用JSTL标签展示业务数据。 - 示例代码: ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Home Page</title> </head> <body> <h1>${message}</h1> <table> <thead> <tr> <th>Name</th> <th>Quantity</th> </tr> </thead> <tbody> <c:forEach var="item" items="${inventoryItems}"> <tr> <td>${item.name}</td> <td>${item.quantity}</td> </tr> </c:forEach> </tbody> </table> </body> </html> ``` ##### 4.3 添加测试数据自动填充业务对象 - 在测试方法中创建一些示例数据。 - 示例代码: ```java @Test public void shouldDisplayInventoryItems() throws Exception { InventoryItem item1 = new InventoryItem("Item 1", 10); InventoryItem item2 = new InventoryItem("Item 2", 20); List<InventoryItem> inventoryItems = Arrays.asList(item1, item2); when(inventoryService.getInventoryItems()).thenReturn(inventoryItems); mockMvc.perform(get("/")) .andExpect(status().isOk()) .andExpect(view().name("index")) .andExpect(model().attribute("inventoryItems", inventoryItems)); } ``` ##### 4.4 添加消息绑定文件和`build.xml`文件的`clean`目标 - 创建`messages.properties`文件以支持国际化。 - 更新`build.xml`文件以包含清理目标。 - 示例代码: ```xml <!-- build.xml --> <target name="clean"> <delete dir="${basedir}/target"/> </target> ``` ##### 4.5 添加表单 - 在JSP页面中添加表单元素。 - 示例代码: ```jsp <form action="/addItem" method="post"> <label for="itemName">Item Name:</label> <input type="text" id="itemName" name="itemName" required/> <br/> <label for="quantity">Quantity:</label> <input type="number" id="quantity" name="quantity" required/> <br/> <input type="submit" value="Add Item"/> </form> ``` ##### 4.6 添加表单控制器 - 创建新的控制器处理表单提交。 - 示例代码: ```java @Controller public class ItemController { @PostMapping("/addItem") public String addItem(@RequestParam String itemName, @RequestParam int quantity) { // 实现添加新库存物品的逻辑 return "redirect:/"; } } ``` ##### 4.7 总结 通过上述步骤,我们不仅实现了Web界面与业务逻辑的集成,还增加了用户交互功能,使应用更加实用。 #### 实现数据库持久化 ##### 5.1 创建数据库启动脚本 - 创建SQL脚本来初始化数据库。 - 示例代码: ```sql -- db-startup.sql CREATE DATABASE inventory; ``` ##### 5.2 创建表和测试数据脚本 - 创建SQL脚本来创建表和插入测试数据。 - 示例代码: ```sql -- db-test-data.sql INSERT INTO inventory_items (name, quantity) VALUES ('Item 1', 10); INSERT INTO inventory_items (name, quantity) VALUES ('Item 2', 20); ``` ##### 5.3 添加Ant任务来运行脚本和加载测试数据 - 更新`build.xml`文件以包含执行SQL脚本的任务。 - 示例代码: ```xml <!-- build.xml --> <target name="setup-db"> <java jar="path/to/sql-runner.jar" fork="true"> <jvmarg value="-Durl=jdbc:mysql://localhost:3306/inventory"/> <jvmarg value="-Duser=root"/> <jvmarg value="-Dpassword=secret"/> <arg line="-execute -inputFile db-startup.sql"/> </java> <java jar="path/to/sql-runner.jar" fork="true"> <jvmarg value="-Durl=jdbc:mysql://localhost:3306/inventory"/> <jvmarg value="-Duser=root"/> <jvmarg value="-Dpassword=secret"/> <arg line="-execute -inputFile db-test-data.sql"/> </java> </target> ``` ##### 5.4 创建JDBC DAO实现 - 创建新的Java类实现数据访问接口。 - 示例代码: ```java package com.example.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class InventoryDaoImpl implements InventoryDao { private final ConnectionFactory connectionFactory; @Autowired public InventoryDaoImpl(ConnectionFactory connectionFactory) { this.connectionFactory = connectionFactory; } @Override public List<InventoryItem> getInventoryItems() { try (Connection connection = connectionFactory.getConnection()) { PreparedStatement statement = connection.prepareStatement("SELECT * FROM inventory_items"); ResultSet resultSet = statement.executeQuery(); List<InventoryItem> inventoryItems = new ArrayList<>(); while (resultSet.next()) { InventoryItem item = new InventoryItem(); item.setName(resultSet.getString("name")); item.setQuantity(resultSet.getInt("quantity")); inventoryItems.add(item); } return inventoryItems; } catch (SQLException e) { throw new RuntimeException(e); } } } ``` ##### 5.5 实现JDBC DAO测试 - 创建测试类来验证DAO的行为。 - 示例代码: ```java package com.example.dao; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import javax.sql.DataSource; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest public class InventoryDaoImplTest { @Autowired private InventoryDao inventoryDao; @Autowired private DataSource dataSource; @Test public void shouldGetInventoryItems() { try (var conn = dataSource.getConnection()) { var stmt = conn.prepareStatement("INSERT INTO inventory_items (name, quantity) VALUES (?, ?)"); stmt.setString(1, "Item 1"); stmt.setInt(2, 10); stmt.executeUpdate(); stmt.setString(1, "Item 2"); stmt.setInt(2, 20); stmt.executeUpdate(); } catch (Exception e) { throw new RuntimeException(e); } List<InventoryItem> inventoryItems = inventoryDao.getInventoryItems(); assertThat(inventoryItems).hasSize(2); assertThat(inventoryItems.get(0).getName()).isEqualTo("Item 1"); assertThat(inventoryItems.get(0).getQuantity()).isEqualTo(10); assertThat(inventoryItems.get(1).getName()).isEqualTo("Item 2"); assertThat(inventoryItems.get(1).getQuantity()).isEqualTo(20); } } ``` ##### 5.6 总结 本章介绍了如何使用JDBC实现数据库访问层,并通过测试确保其正确性。 #### 集成Web应用与持久层 ##### 6.1 修改服务层 - 更新服务层逻辑以使用DAO来操作数据库。 - 示例代码: ```java package com.example.service; public class InventoryService { private final InventoryDao inventoryDao; @Autowired public InventoryService(InventoryDao inventoryDao) { this.inventoryDao = inventoryDao; } public List<InventoryItem> getInventoryItems() { return inventoryDao.getInventoryItems(); } } ``` ##### 6.2 修复失败的测试 - 调整测试用例以适应新的数据访问方式。 - 示例代码: ```java @Test public void shouldDisplayInventoryItems() throws Exception { InventoryItem item1 = new InventoryItem("Item 1", 10); InventoryItem item2 = new InventoryItem("Item 2", 20); List<InventoryItem> inventoryItems = Arrays.asList(item1, item2); when(inventoryService.getInventoryItems()).thenReturn(inventoryItems); mockMvc.perform(get("/")) .andExpect(status().isOk()) .andExpect(view().name("index")) .andExpect(model().attribute("inventoryItems", inventoryItems)); } ``` ##### 6.3 创建新的应用上下文文件 - 创建新的XML文件来配置服务层。 - 示例代码: ```xml <!-- spring-service-config.xml --> <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.xsd"> <bean id="inventoryDao" class="com.example.dao.InventoryDaoImpl"> <property name="connectionFactory" ref="dataSourceConnectionFactory"/> </bean> <bean id="inventoryService" class="com.example.service.InventoryService"> <property name="inventoryDao" ref="inventoryDao"/> </bean> </beans> ``` ##### 6.4 添加事务管理器 - 配置事务管理器以支持事务控制。 - 示例代码: ```xml <!-- spring-service-config.xml --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> </beans> ``` #### 结语 通过上述步骤,我们成功地构建了一个完整的Spring MVC应用,并集成了Web界面、业务逻辑和服务层。希望这些知识点能帮助读者更好地理解和掌握Spring MVC框架的使用方法。


























剩余69页未读,继续阅读

- JaneJLiu2013-01-27It is a entry level book for Spring MVC.

- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 批安全科技“个批”项目管理.doc
- 网络化视频监控在医疗行业案例-案例精选.docx
- 大数据时代数据报道的可视化研究.docx
- 对中职计算机网页设计教学的若干实践探索.docx
- 互联网背景下物流平台商业模式浅析.docx
- TD无线网络规划频谱资源分配策略测试卷.doc
- 融合信息技术-建构互联网+地理课堂.docx
- 禁毒网网站方案.doc
- 学籍管理系统-数据库课程设计.doc
- 浅议项目管理实施与评价.docx
- 大学设计方案MCGS组态软件交通灯控制系统方案.doc
- 基于区块链技术的图书馆网络用户知识分享策略探析.docx
- 大学设计:XML在电子商务中应用.doc
- 全国计算机水平考试系统分析员级试题及答案.doc
- 纺织行业信息化盘点和展望.doc
- 软件企业如何充分利用税收优惠政策?.docx


