- 内容提要
- 作者简介
- 译者简介
- 前言
- HTTP
- Servlet 和 JSP
- 下载 Spring 或使用 STS 与 Maven/Gradle
- 手动下载 Spring
- 使用 STS 和 Maven/Gradle
- 下载 Spring 源码
- 本书内容简介
- 下载示例应用
- 第 1 章Spring 框架
- 第 2 章模型 2 和 MVC 模式
- 第 3 章Spring MVC 介绍
- 第 4 章基于注解的控制器
- 第 5 章数据绑定和表单标签库
- 第 6 章转换器和格式化
- 第 7 章验证器
- 第 8 章表达式语言
- 第 9 章JSTL
- 第 10 章国际化
- 第 11 章上传文件
- 第 12 章下载文件
- 第 13 章应用测试
- 附录 A Tomcat
- 附录 B Spring Tool Suite 和 Maven
- 附录 C Servlet
- 附录 D JavaServer Pages
- 附录 E 部署描述符
3.4 第一个 Spring MVC 应用
本章的示例应用程序 springmvc-intro1 展示了基本的 Spring MVC 应用。该应用程序同第 2 章学习的 appdesign1 应用非常相似,专用于展示 Spring MVC 是如何工作的。Sringmvc-intro1 应用也有两个控制器类似于 appdesign1 的控制器类。
3.4.1 目录结构
图 3.1 展示了 springmvc-intro1 的目录结构。注意,WEB-INF/lib 目录包含了 Spring MVC 所需要的所有的 jar 文件。特别需要注意的是 spring-webmvc-x.y.z.jar 文件,其中包含了 DispatcherServlet 的类。还要注意 Spring MVC 依赖于 Apache Commons Logging 组件,没有它,Spring MVC 应用程序将无法正常工作。可以从以下网址下载这个组件:
http://commons.apache.org/proper/commons-loggins/download_logging.cgi
图 3.1 springmvc-intro1 的目录结构
该示例应用的所有 JSP 页面都存放在/WEB-INF/jsp 目录下,确保无法被直接访问。
3.4.2 部署描述符文件和 Spring MVC 配置文件
清单 3.1 部署描述符(web.xml)文件
< ?xml version="1.0" encoding="UTF-8"?>
< web-app version="3.1"
xmlns=""
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">
< servlet>
< servlet-name>springmvc< /servlet-name>
< servlet-class>
org.springframework.web.servlet.DispatcherServlet
< /servlet-class>
< load-on-startup>1< /load-on-startup>
< /servlet>
< servlet-mapping>
< servlet-name>springmvc< /servlet-name>
< !-- map all requests to the DispatcherServlet -->
< url-pattern>/< /url-pattern>
< /servlet-mapping>
< /web-app>这里告诉了 Servlet/ JSP 容器,我们将使用 Spring MVC 的 Dispatcher Servlet,并通过 url-pattern 元素值配置为“/”,将所有的 URL 映射到该 servlet。由于 servlet 元素下没有 init-param 元素,所以 Spring MVC 的配置文件在/WEB-INF 文件夹下,并按照通常的命名约定。
清单 3.2 Spring MVC 配置文件
< ?xml version="1.0" encoding="UTF-8"?>
"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 name="/input-produrt"
class="controller.InputProductController"/>
< bean name="/save-product"
class="controller.SaveProductController"/>
< /beans>这里声明了 InputProductController 和 SaveProductController 两个控制器类,并分别映射到/product_input 和/product_save。两个控制器将在 3.4.3 节中讨论。
3.4.3 Controller 类
springmvc-intro1 应用程序有 InputProductController 和 SaveProductController 这两个“传统”风格的控制器,分别实现了 Controller 接口。代码分别见清单 3.3 和清单 3.4。
清单 3.3 InputProductController 类
package controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class InputProductController implements Controller {
private static final Log logger = LogFactory
.getLog(InputProductController.class);
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
logger.info("InputProductController called");
return new ModelAndView("/WEB-INF/jsp/ProductForm.jsp");
}
}InputProductController 类的 handleRequest 方法只是返回一个 ModelAndView,包含一个视图,且没有模型。因此,该请求将被转发到/WEB-INF/jsp/ProductForm.jsp 页面。
清单 3.4 SaveProductController 类
package controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import domain.Product;
import form.ProductForm;
public class SaveProductController implements Controller {
private static final Log logger = LogFactory
.getLog(SaveProductController.class);
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
logger.info("SaveProductController called");
ProductForm productForm = new ProductForm();
// populate action properties
productForm.setName(request.getParameter("name"));
productForm.setDescription(request.getParameter(
"description"));
productForm.setPrice(request.getParameter("price"));
// create model
Product product = new Product();
product.setName(productForm.getName());
product.setDescription(productForm.getDescription());
try {
product.setPrice(
Float.parseFloat(productForm.getPrice()));
} catch (NumberFormatException e) {
}
// insert code to save Product
return new ModelAndView("/WEB-INF/jsp/ProductDetails.jsp",
"product", product);
}
}SaveProductController 类的 handleRequest 方法中,首先用请求参数创建一个 ProductForm 对象;然后,它根据 ProductForm 对象创建 Product 对象。由于 ProductForm 的 price 属性是一个字符串,而其在 Product 类对应的是一个 float,此处类型转换是必要的。在第 4 章中,我们将学习在 Spring MVC 中如何省去 ProductForm 对象,使事情变得更省力。
SaveProductController 的 handleRequest 方法最后返回的 ModelAndView 模型包含了视图的路径、模型名称以及模型(product 对象)。该模型将提供给目标视图,用于界面显示。
3.4.4 View 类
springmvc-intro1 应用程序中包含两个 JSP 页面:ProductForm.jsp 页面(代码见清单 3.5)和 ProductDetails.jsp 页面(见清单 3.6)。
清单 3.5 ProductForm.jsp 页面
<!DOCTYPE HTML>
<html>
<head>
<title>Add Product Form</title>
<style type="text/css">@import url(css/main.css);</style>
</head>
<body>
<div id="global">
<form action="save- Product" method="post">
<fieldset>
<legend>Add a product</legend>
<label for="name">Product Name: </label>
<input type="text" id="name" name="name" value=""
>
<label for="description">Description: </label>
<input type="text" id="description" name="description"
>
<label for="price">Price: </label>
<input type="text" id="price" name="price">
<div id="buttons">
<label for="dummy"> </label>
<input id="reset" type="reset">
<input id="submit" type="submit"
value="Add Product">
</div>
</fieldset>
</form>
</div>
</body>
</html>此处不适合讨论 HTML 和 CSS,但需要强调的是清单 3.5 中的 HTML 是经过适当设计的,并且没有使用<table>来布局输入字段。
清单 3.6 ProductDetails.jsp 页面
<!DOCTYPE HTML>
<html>
<head>
<title>Save Product</title>
<style type="text/css">@import url(css/main.css);</style>
</head>
<body>
<div id="global">
<h4>The product has been saved.</h4>
<p>
<h5>Details:</h5>
Product Name: ${product.name}<br/>
Description: ${product.description}<br/>
Price: $${product.price}
</p>
</div>
</body>
</html>ProductDetails.jsp 页面通过模型属性名“product”来访问由 SaveProductController 传入的 Product 对象。这里用 JSP 表达式语言来显示 Product 对象的各种属性。我们将在第 8 章中学习 JSP EL。
3.4.5 测试应用
现在,在浏览器中输入如下 URL 来测试应用:
http://localhost:8080/springmvc-introl/input-product会看到类似图 3.2 的产品表单页面,在空字段中输入相应的值后单击“Add Product(添加产品)”按钮,会在下一页中看到产品属性。

图 3.2 springmvc-intro1 的产品表单
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论