返回介绍

3.4 第一个 Spring MVC 应用

发布于 2025-04-22 20:09:58 字数 7707 浏览 0 评论 0 收藏

本章的示例应用程序 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

图片 1

图 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

图 3.2 springmvc-intro1 的产品表单

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。