vlambda博客
学习文章列表

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

Chapter 8. Using Spring MVC 4.1

Spring 框架基于 Inversion of ControlIoC) 原则,其中对象定义自己的依赖关系。 依赖注入是IoC的一种形式。容器在创建 bean 时注入依赖项。依赖注入是使用 BeanFactoryApplicationContext 接口实现的。 BeanFactory 接口用于管理 bean,ApplicationContext (WebApplicationContext 用于Web 应用程序)用于配置应用程序。 BeanFactory 应用 IoC 模式来分离配置和依赖规范。 ApplicationContext 接口为 BeanFactory 提供扩展(扩展)功能。

Spring MVC 框架基于 Model-View-Controller 设计模式 并使用 DispatcherServlet 实现。 DispatcherServlet 字段请求并使用 @RequestMapping 注释提供的 Web 请求 URI 映射将它们委托给请求处理程序。请求处理程序或控制器使用 ModelAndView 持有者返回 ModelView。在本章中,我们将在 Eclipse 中创建一个 Spring MVC 应用程序,使用 Maven 构建工具编译和打包该应用程序,并将该应用程序部署到 WildFly 8.1。随后,我们将在浏览器中运行 Spring 应用程序。在本章中,我们将介绍以下主题:

  • 设置环境

  • 创建一个 Spring MVC 项目

  • 创建 MySQL 数据源

  • 创建 JPA 配置文件

  • 创建模型

  • 创建数据访问对象设计模式

  • 创建 Web 描述符

  • 创建请求处理程序

  • 创建视图

  • 创建 Spring MVC 上下文

  • 使用 Maven 部署 Spring 项目

  • 创建部署结构和基础设施部署描述符

  • 安装 Spring MVC Maven 项目

  • 运行 Spring 应用程序

Setting up the environment


我们需要安装以下软件:

设置JAVA_HOMEJBOSS_HOMEMAVEN_HOME MYSQL_HOME 环境变量。添加 %JAVA_HOME%/bin, %MAVEN_HOME%/bin, %JBOSS_HOME%/bin %MYSQL_HOME/binPATH 环境变量。

创建一个 WildFly 8.1.0 运行时,如 第 1 章 EJB 3.x 入门。如 java:jboss/datasources/MySQLDS 创建 MySQL 数据源/book/application-development/9781783288908/1" linkend="ch01">第 1 章EJB 3.x 入门 .

Creating a Spring MVC project


首先,创建一个 Spring MVC 项目。选择文件 | | 其他。在 New 中,选择 JBoss Central | Spring MVC 项目,如下图所示。然后,点击下一步

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

Spring MVC Project 向导中,选择 Target Runtime 作为 < code class="literal">WildFly8.x Runtime,如下图所示。现在,点击下一步

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

指定 项目名称 (jboss- springmvc) 和 Package (org.jboss.springmvc),如图以下屏幕截图。在此之后,单击下一步

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

指定 Group Id (org. jboss.springmvc), Artifact Id (springmvc), 版本1.0.0)和 (org.jboss.springmvc),如下图所示,点击Finish

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

jboss-springmvc web 项目被创建,如下图所示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

在后续的部分,我们将开发Spring MVC应用并详细讨论Spring MVC应用工件; Project Explorer 选项卡中显示的应用程序是默认应用程序,将替换为 我们将开发的应用程序。

Creating a JPA configuration file


我们将在 Spring 中使用 EJB 3.0 实体 bean 进行 对象/关系映射MVC 应用程序。 jboss-springmvc项目中的springmvc\src\main\resources\META-INF\persistence.xml配置文件已创建当我们创建 Spring MVC 项目时。 persistence.xml 文件指定了一个持久性提供程序,用于实体到数据库的对象/关系映射。使用 persistence-unit 元素指定持久性单元。将 transaction-type 设置为 JTA(默认)。将持久性提供程序指定为 Hibernate 持久性提供程序 org.hibernate.ejb.HibernatePersistence。将 jta-data-source 元素值设置为我们之前创建的 java:jboss/datasources/MySQLDS 数据源。使用 hibernate.hbm2ddl.auto 属性将 DDL 生成策略设置为 create-drop。使用 create-drop 策略,创建和删除所需的表。 hibernate.show_sql 属性设置为 false,表示输出所有 SQL 语句,这是调试的另一种方法。 hibernate.dialect 文件设置为 MySQL 数据库的 org.hibernate.dialect.MySQLDialectpersistence.xml 配置文件在以下代码中列出:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="         http://java.sun.com/xml/ns/persistence         http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="primary" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:jboss/datasources/MySQLDS</jta-data-source>
    <class>org.jboss.springmvc.model.Catalog</class>
    <exclude-unlisted-classes />
    <properties>
      <property name="jboss.entity.manager.factory.jndi.name" value="java:jboss/mysql/persistence" />
      <!-- Properties for Hibernate -->
      <property name="hibernate.hbm2ddl.auto" value="create-drop" />
      <property name="hibernate.show_sql" value="false" />
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
    </properties>
  </persistence-unit>
</persistence>

JPA 规范 不需要持久性提供程序来创建表,即使 hibernate.hbm2ddl.auto 属性也是如此 设置为 create-dropcreate。 Hibernate 持久性提供程序支持创建表。

Creating the Model


在此 部分中,我们将为域模型创建一个 EJB 3.0 实体 bean .创建 org.jboss.springmvc.model.Catalog 实体 bean 类,它只是一个 plain old Java object POJO)。要创建 Java 类,请选择 File | | Other,并在 New, 中选择 Java | Class,如下图所示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

新建 Java 类 向导中,选择 源文件夹 as jboss-springmvc/src/main/java ,指定 Packageorg.jboss.springmvc.model,并指定class Name as Catalog,如下图所示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

org.jboss.springmvc.model.Catalog.java 得到 添加到项目中,如下图Project Explorer所示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

删除 Member.java 和其他 Member* classes 从项目中获取目录结构,如下图所示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

使用 @Entity 注释和 @Table 注释 Catalog 实体类注解。在 @Table 注解中,将表名指定为 CATALOGuniqueConstraintsID 列使用 @UniqueConstraint 注释。指定实体类中需要的无参数构造函数。实体类实现了 Serializable 接口,以便在持久化到数据库时将启用缓存的实体 bean 序列化到缓存中。要通过序列化运行时将版本号与可序列化类关联,请指定 serialVersionUID 变量。声明 bean 属性的变量:idjournalpublisher、< code class="literal">edition、title作者。为 bean 属性添加 getter/setter 方法。 @Id 注释指定标识符属性。 @Column 注释指定与属性关联的列名。 nullable 元素设置为 false,因为主键不能为 null .

如果我们 使用 Oracle 数据库,我们将使用 @ 指定主键生成器的类型序列SequenceGenerator 注释。生成策略由 @GeneratedValue 注释指定。对于Oracle数据库,生成策略是strategy=GenerationType.SEQUENCE,但是因为MySQL数据库支持通过生成序列来自动增加主键列值,所以我们设置了GenerationType.AUTO 的生成策略。 Catalog.java 实体类在以下代码片段中列出:

package org.jboss.springmvc.model;

import java.io.Serializable;
import javax.persistence.*;

/**
* The persistent class for the CATALOG database table.
*
*/
@Entity
@Table(name = "CATALOG", uniqueConstraints = @UniqueConstraint(columnNames = "ID"))
public class Catalog implements Serializable {
  private static final long serialVersionUID = 1L;
  private int id;
  private String journal;
  private String publisher;
  private String edition;
  private String title;
  private String author;
  public Catalog() {
  }
  @Id
  @Column(name = "ID", nullable = false)
  @GeneratedValue(strategy = GenerationType.AUTO)
  public int getId() {
    return this.id;
  }
  
  public void setId(int id) {
    this.id = id;
  }
  
  public String getJournal() {
    return this.journal;
  }
  
  public void setJournal(String journal) {
    this.journal = journal;
  }
  public String getPublisher() {
    return this.publisher;
  }
  public void setPublisher(String publisher) {
    this.publisher = publisher;
  }
  public String getEdition() {
    return this.edition;
  }
  public void setEdition(String edition) {
    this.edition = edition;
  }
  public String getTitle() {
    return this.title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public String getAuthor() {
    return this.author;
  }
  public void setAuthor(String author) {
    this.author = author;
  }
}

Creating the Data Access Object design pattern


数据访问对象设计模式的优点,如可重用软件和解耦业务逻辑和数据库持久性逻辑,已经很成熟了。我们将在数据访问层使用 DAO 设计模式。 DAO 设计模式将为持久化 Catalog 实体实例和获取 Catalog 实体实例提供标准操作。创建一个org.jboss.springmvc.data.CatalogDao Java接口,如下图所示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

persist(Catalog) 方法添加方法定义以保持 Catalog 对象和 getAllCatalogs () 获取 Catalog 对象的 ListCatalogDao 接口在以下代码中列出:

package org.jboss.springmvc.data;
import java.util.List;
import javax.persistence.TypedQuery;
import org.jboss.springmvc.model.Catalog;

public interface CatalogDao
{
  public void persist(Catalog catalog);
  public List<Catalog> getAllCatalogs();
}

创建一个 org.jboss.springmvc.data.CatalogDaoImpl实现类来实现org.jboss.springmvc.data.CatalogDao 接口。使用 @Component 注释类,这使该类成为使用类路径扫描自动检测到的“组件” 当我们使用基于注解的配置时。在resources/META-INF/spring/applicationContext.xml应用上下文配置文件中,自动检测org.jboss.springmvc.data 包在 <beans/><context:component/> 元素进行配置> 元素:

<context:component-scan base-package="org.jboss.springmvc.data" />

Spring MVC 自动检测 CatalogDaoImpl 类并注入一个 CatalogDaoImpl 对象,catalogDaoImpl,到任何 @Autowired 字段、方法参数或 CatalogDaoImpl 类型的构造函数参数中。基于注释的事务使用 applicationContext.xml 中的以下声明进行配置:

<tx:annotation-driven />

\\jboss-springmvc\src\main\resources\META-INF\spring\applicationContext.xml 文件在以下代码中列出:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 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-3.2.xsd                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd                 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
  <context:component-scan base-package="org.jboss.springmvc.model" />
  <context:component-scan base-package="org.jboss.springmvc.data" />
  <tx:annotation-driven />
</beans>

使用 @Transactional 注释 persist(Catalog) 方法。使用 @PersistenceContext 注释将 EntityManager 注入 DAO 实现类。使用了EntityManagerpersist()方法持久化 Catalog 实例。要 检索所有 Catalog 实例,请创建一个 TypedQuery使用 EntityManager 对象的 createQuery 方法的对象。使用 getResultList() 方法获取 List<Catalog> 对象作为结果TypedQuery 对象。 org.jboss.springmvc.repo.CatalogDaoImpl DAO 实现类在以下代码中列出:

package org.jboss.springmvc.data;
import org.jboss.springmvc.model.*;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

@Component
public class CatalogDaoImpl implements CatalogDao
{
  // Injected database connection:
  @PersistenceContext private EntityManager em;
  // Stores a new catalog:
  @Transactional
  
  public void persist(Catalog catalog) {
    em.persist(catalog);
  }
  
  
  // Retrieves all the catalogs:
  public List<Catalog> getAllCatalogs() {
    TypedQuery<Catalog> query = em.createQuery(
    "SELECT c FROM Catalog c ORDER BY c.id", Catalog.class);
    return query.getResultList();
    
  }
}

Creating a web descriptor


我们需要将应用上下文配置文件添加到jboss-springmvc Web 应用程序类路径。为 org.springframework.web.context.ContextLoaderListener 类添加一个 <listener/> 标签,它会启动 Spring 的WebApplicationContext 根目录。使用 contextConfigLocation 上下文参数指定根上下文的 config 位置。 org.springframework.web.servlet.DispatcherServlet servlet 将请求分派给处理程序。指定 init 参数,contextConfigLocation,为 中的 Spring MVC 应用程序配置另一个应用程序上下文/WEB-INF/jboss-as-spring-mvc-context.xml,这将在后面的部分中讨论。指定映射 DispatcherServlet servlet 的 URL 模式的 servlet。 web.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="..." version="3.1">
  <display-name>Java EE 7 Starter Application</display-name>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/META-INF/spring/applicationContext.xml,
                classpath:/META-INF/spring/infrastructure.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>jboss-spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/jboss-as-spring-mvc-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>jboss-spring</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

Creating a request handler


Spring MVC 中的 典型 请求处理程序基于 @Controller@RequestMapping 注释。创建一个 Java 类,org.jboss.springmvc.controller.CatalogController,用 @Controller 注解进行注解,这使得类可自动检测到 Spring 的注入。在 \springmvc\src\main\webapp\WEB-INF\jboss-as-spring-mvc-context.xml 上下文文件中,本章稍后会列出和讨论,配置org.jboss.springmvc.mvc基础包的组件扫描,如下:

<context:component-scan base-package="org.jboss.springmvc.controller" />

CatalogController 类需要处理一个要求。处理程序类使用数据创建模型 Map 并选择要呈现的视图名称。 createAndDisplayCatalog 方法接受 DispatcherServlet 发送的 servlet 请求并返回一个 org.springframework.web .servlet.ModelAndView 对象,它是 Spring MVC 框架中 ModelView 的持有者。使用 @RequestMapping 注释将 servlet 请求映射到 createAndDisplayCatalog 处理程序方法。将路径映射 URI 指定为 /catalog

使用 @AutoWire 注释将 org.jboss.springmvc.data.CatalogDao DAO 接口自动连接到 Spring 的依赖注入机制。 catalogDaoImpl bean 在启动时被注入,因为默认情况下,应用程序上下文会在启动时预先实例化所有单例(Spring 中的默认范围)bean。 createAndDisplayCatalog 方法获取请求参数值并创建一个 Catalog 对象。 Catalog 对象是使用自动装配的 DAO 对象的 persist 方法存储的。创建模型 Map 后,createAndDisplayCatalog 方法返回 org.springframework.web.servlet .ModelAndView 对象与 View 目录和 catalogDao 模型。 org.springframework.web.servlet.ModelAndView 对象返回到 DispatcherServlet 以供 servlet 呈现响应。视图 ID 使用 jboss-as-spring-mvc-context.xml 上下文文件中指定的视图解析器解析。 Map 模型可用于视图模板。控制器类在以下代码中列出:

package org.jboss.springmvc.controller;

import org.jboss.springmvc.data.*;
import org.jboss.springmvc.model.*;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class CatalogController {
  @Autowired
  private CatalogDao catalogDao;
  
  @RequestMapping(value = "/catalog")
  public ModelAndView createAndDisplayCatalog(HttpServletRequest request) {
    // Handle a new catalog (if any):
    String journal = request.getParameter("journal");
    String publisher = request.getParameter("publisher");
    String edition = request.getParameter("edition");
    String title = request.getParameter("title");
    String author = request.getParameter("author");
    if (journal != null && publisher != null && edition != null
    && title != null && author != null) {
      Catalog catalog = new Catalog();
      catalog.setJournal(journal);
      catalog.setPublisher(publisher);
      catalog.setEdition(edition);
      catalog.setTitle(title);
      catalog.setAuthor(author);
      catalogDao.persist(catalog);
    }
    // Prepare the result view (catalog):
    return new ModelAndView("catalog", "catalogDao", catalogDao);
  }
}

模型、DAO 和 控制器类显示在 Project Explorer 中以下屏幕截图:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

Creating the View


查看解析器,在WEB中配置-INF/jboss-as-spring-mvc-context.xml Web 应用程序上下文,从 ModelAndViewView > 对象,并使用 catalog.jsp 视图模板呈现响应。在WEB-INF/views目录下创建catalog.jsp。要创建 JSP,请选择 文件 | | Other,并在 New 中选择 网络 | JSP 文件 并点击下一步。在 New JSP File 向导中,选择 WEB-INF/views 文件夹,指定 文件名catalog.jsp,然后点击接下来,如下图所示。随后点击完成

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

catalog.jsp 和添加的其他类,其中 包括控制器类、DAO类和模型类,如下图Project Explorer所示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

请求catalog.jsp 发起 视图模板,并使用 catalog.jsp 呈现响应。要向 DispatcherServlet 发送请求,<form/> 元素具有 action 属性设置为 catalog,它被映射到使用 /catalog 路径 URI CatalogController 请求处理程序类中的literal">@RequestMapping 注释。 createAndDisplayCatalog 处理程序方法在表单发布时被调用。在 catalog.jsp 中,使用范围请求从 org.jboss.springmvc.data.CatalogDao 接口实例化一个 bean。为输入字段添加 <form/><input/> 元素以创建新的 目录 对象。要呈现来自 org.jboss.springmvc.data.CatalogDao bean 的响应,请调用 getAllCatalogs() 方法 获取Catalog 对象的List。在 List 上迭代 以输出 Catalog 实例属性。

catalog.jsp 列在以下代码中:

<%@page contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@page import="org.jboss.springmvc.model.Catalog,org.jboss.springmvc.data.CatalogDao,org.jboss.springmvc.controller.CatalogController"%>
<jsp:useBean id="catalogDao" type="org.jboss.springmvc.data.CatalogDao" scope="request" />
<!--scope should be request for the bean to be found  -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Spring MVC-JPA Catalog</title>
<head>
    <meta name="generator" content="HTML Tidy for Linux/x86 (vers 25 March 2009), see www.w3.org" />
    <title>
      Spring MVC-JPA Catalog
    </title>
  </head><!-- action should be same as the mapping in the controller -->
  <body>
    <h2>
      Catalog form
    </h2>
    <form method="post" action="catalog">
      Journal: <input type="text" name="journal" />Publisher: <input type="text" name="publisher" />Edition: <input type="text" name="edition" />Title: <input type="text" name="title" />Author: <input type="text" name="author" />
      <table>
        <tr>
          <td></td>
        </tr>
        <tr>
          <td></td>
        </tr>
        <tr>
          <td></td>
        </tr>
        <tr>
          <td></td>
        </tr>
        <tr>
          <td></td>
        </tr>
      </table>
      <p>
        <input type="submit" value="Add" />
      </p>
    </form>
    <table>
      <%
        for (Catalog catalog : catalogDao.getAllCatalogs()) {
      %>
      <tr>
        <td>
          <%=catalog.getId()%>
        </td>
        <td>
          <%=catalog.getJournal()%>
        </td>
        <td>
          <%=catalog.getPublisher()%>
        </td>
        <td>
          <%=catalog.getEdition()%>
        </td>
        <td>
          <%=catalog.getTitle()%>
        </td>
        <td>
          <%=catalog.getAuthor()%>
        </td>
      </tr><%
        }
      %>
    </table>
  </body>
</html>

Creating a Spring MVC context


Spring MVC web 应用上下文配置在 springmvc\src\main\webapp\WEB-INF\ jboss-as- spring-mvc-context.xml。除了添加 org.jboss.springmvc.controller 包进行自动检测外,还支持使用带有 @RequestMapping 注释的控制器方法处理请求 配置了 <mvc:annotation-driven /> 声明。添加对基于注解的事务管理器的支持; CatalogDao 接口的 persist 方法 用 <代码类="literal">@Transactional。为 org.springframework.web.servlet.view.InternalResourceViewResolver 类添加一个视图解析器 bean。最佳实践是在 WEB-INF 目录中添加视图模板,例如 catalog.jsp,这样只有控制器可以访问它们。添加一个带有 /WEB-INF/views 值的 bean 属性前缀来解析视图模板。 jboss-as-spring-mvc-context.xml 文件在以下代码中列出:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" 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-3.2.xsd                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd                            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd                             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
  <context:component-scan base-package="org.jboss.springmvc.controller" />
  <mvc:annotation-driven />
  <!-- Add JPA support -->
  <bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="loadTimeWeaver">
      <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
    </property>
  </bean>
  <!-- Add Transaction support -->
  <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emf" />
  </bean>
  <!-- Use @Transaction annotations for managing transactions -->
  <tx:annotation-driven transaction-manager="txManager" />
  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
  </bean>
  <mvc:resources mapping="/static/**" location="/" />
  <mvc:default-servlet-handler />
</beans>

Spring MVC 提供了两个级别的应用程序上下文,应用程序级服务的根应用程序上下文和 servlet 级 bean 和服务的 servlet 应用程序上下文。 /META-INF/spring/applicationContext.xml文件配置在web.xml为根级应用上下文, /WEB-INF/jboss-as-spring-mvc-context.xmlDispatcherServlet 的上下文。 servlet 上下文配置会覆盖同名 bean 的根上下文。

Deploying the Spring project with Maven


接下来,使用 Maven 构建工具编译、打包和部署 Spring MVC 应用程序。 Hibernate JPA API、Hibernate Validator API 和 Hibernate Entity manager API 由 WildFly 8.1 提供。在 MySQL JDBC 连接器上添加 依赖,如下:

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.22</version>
</dependency>

org.springframework 组 ID 中提供了 Spring 依赖项。 Spring版本在pom.xml中默认配置为Spring 4.1.2,如下:

<version.spring>4.1.2.RELEASE</version.spring>

Spring Web MVC 依赖也配置为 4.1.2 版本。所有必需的 Spring 框架依赖项——Spring AOP、Spring Beans、Spring Context、Spring Core、Spring JDBC、Spring ORM、Spring Tx、Log4j、AOP 联盟、Commons logging、Cglib、Spring Expression Language 和 Spring Web——都在 <代码类="literal">pom.xml。在<build/>中,配置Maven编译插件和Maven WAR插件。将 Maven War 插件的输出目录设置为 WildFly 8.1 独立安装的 C:\wildfly-8.1.0.Final\standalone\deployments 目录。

pom.xml 文件在以下代码中列出:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.jboss.springmvc</groupId>
  <artifactId>jboss-springmvc</artifactId>
  <packaging>war</packaging>
  <version>1.0.0</version>
  <name>Getting Started with Spring on JBoss</name>
  <properties>
    <!-- Spring version -->
    <version.spring>4.1.2.RELEASE</version.spring>
    <!-- Spring Third Party dependencies -->
    <version.aopalliance>1.0</version.aopalliance>
    <!-- Third Party dependencies -->
    <version.standard.taglibs>1.1.2</version.standard.taglibs>
    <version.commons.logging>1.1.1</version.commons.logging>
    <!-- JBoss AS plugin for deployment -->
    <version.jboss.as.maven.plugin>7.6.Final</version.jboss.as.maven.plugin>
  </properties>
  <repositories>
    <repository>
      <id>springsource-milestones</id>
      <name>SpringSource Milestones Proxy</name>
      <url>https://oss.sonatype.org/content/repositories/springsource-milestones</url>
    </repository>
    <repository>
      <id>Maven</id>
      <name>Maven</name>
      <url>http://repo1.maven.org/maven2</url>
    </repository>
  </repositories>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.jboss.spec</groupId>
        <artifactId>jboss-javaee-web-6.0</artifactId>
        <version>3.0.0.Final</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!-- Spring dependencies -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${version.spring}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${version.spring}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${version.spring}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${version.spring}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${version.spring}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-expression</artifactId>
        <version>${version.spring}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${version.spring}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${version.spring}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${version.spring}</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${version.spring}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${version.spring}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${version.spring}</version>
      </dependency>
      <!-- Third Party dependencies -->
      <dependency>
        <groupId>aopalliance</groupId>
        <artifactId>aopalliance</artifactId>
        <version>${version.aopalliance}</version>
      </dependency>
      <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>${version.standard.taglibs}</version>
      </dependency>
      <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>${version.commons.logging}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <!-- Import the JPA API using the provided scope It is included in JBoss AS 7 / EAP 6 -->
    <dependency>
      <groupId>org.hibernate.javax.persistence</groupId>
      <artifactId>hibernate-jpa-2.0-api</artifactId>
      <scope>provided</scope>
    </dependency>
    <!-- JSR-303 (Bean Validation) Implementation -->
    <!-- Provides portable constraints such as @Email -->
    <!-- Hibernate Validator is shipped in JBoss AS 7 -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>4.1.0.Final</version>
      <exclusions>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <!-- Annotation processor that raising compilation errors whenever constraint annotations are incorrectly used. -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator-annotation-processor</artifactId>
      <version>4.1.0.Final</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>4.1.0.Final</version>
    </dependency>
    <!-- Import Spring dependencies, these are either from community or versions 	certified in WFK2 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${version.spring}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${version.spring}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${version.spring}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>${version.spring}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${version.spring}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>${version.spring}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${version.spring}</version>
      <!-- <scope>provided</scope> -->
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>${version.spring}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${version.spring}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${version.spring}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${version.spring}</version>
    </dependency>
    <!-- Other community dependencies -->
    <dependency>
      <groupId>aopalliance</groupId>
      <artifactId>aopalliance</artifactId>
      <version>${version.aopalliance}</version>
    </dependency>
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>${version.standard.taglibs}</version>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>${version.commons.logging}</version>
    </dependency>
    <!-- Add cglib for the CatalogDaoTest -->
    <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib-nodep</artifactId>
      <version>2.2</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.22</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.0.1</version>
    </dependency>
    <!-- Add JSON dependency, specified in jboss-deployment-structure.xml -->
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.3</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-core-asl</artifactId>
      <version>1.9.3</version>
      <!-- <scope>provided</scope> -->
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.6.4</version>
      <!-- <scope>provided</scope> -->
    </dependency>
  </dependencies>
  <build>
    <finalName>jboss-springmvc</finalName>
    <plugins>
      <!-- Force Java 6 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>
      <!-- Deployent on AS from console -->
      <plugin>
        <groupId>org.jboss.as.plugins</groupId>
        <artifactId>jboss-as-maven-plugin</artifactId>
        <version>${version.jboss.as.maven.plugin}</version>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <outputDirectory>C:\wildfly-8.1.0.Final\standalone\deployments</outputDirectory>
          <failOnMissingWebXml>false</failOnMissingWebXml>
          <warName>${project.artifactId}</warName>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

列出的一些 依赖项没有在示例应用程序中使用,但可以在其他一些 Spring MVC 应用程序中使用。在我们运行 jboss-springmvc 应用程序之前,从项目中删除所有测试文件和类。此外,从 resources 目录中删除 import.sql

Creating deployment structure and infrastructure deployment descriptors


我们有 不是 但讨论了两个文件: webapp/WEB-INF/jboss-deployment-structure.xmlresources/META-INF/spring/infrastructure.xmljboss-deployment-structure.xml 文件 是 JBoss 特定的部署描述符,用于配置粒度类加载。如果不包含 jboss-deployment-structure.xml 文件,则使用默认的类加载,即 可能不是应用程序所需要的。 jboss-deployment-structure.xml 文件可用于以下目的:

  • 防止包含自动依赖项

  • 添加其他依赖项

  • 定义附加模块

  • 向模块添加额外的资源根

  • 修改 EAR 部署隔离类加载行为

我们使用 jboss-deployment-structure.xml 来包含对 org.codehaus.jackson.jackson-core-asl 的依赖、org.codehaus.jackson.jackson-mapper-aslorg.slf4j mysql 模块。

jboss-deployment-structure.xml 文件列出如下:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
  <deployment>
    <!-- <exclusions>
      <module name="org.hibernate" />
    </exclusions> -->
    <dependencies>
      <module name="mysql" />
      <module name="org.codehaus.jackson.jackson-core-asl" />
      <module name="org.codehaus.jackson.jackson-mapper-asl" />
      <module name="org.slf4j" />
    </dependencies>
  </deployment>
</jboss-deployment-structure>

infrastructure.xml 文件用于以下目的:

  • 在 JNDI 中注册实体管理器工厂

  • 在 JNDI 中注册数据源

  • 启用 JTA 事务管理

infrastructure.xml 文件列出如下:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
  <deployment>
    <!-- <exclusions>
      <module name="org.hibernate" />
    </exclusions> -->
    <dependencies>
      <module name="mysql" />
      <module name="org.codehaus.jackson.jackson-core-asl" />
      <module name="org.codehaus.jackson.jackson-mapper-asl" />
      <module name="org.slf4j" />
    </dependencies>
  </deployment>
</jboss-deployment-structure>

目录 结构 Spring Maven 应用程序的 jboss-springmvc\src\main\javajboss-springmvc\src\main\resources 目录显示在 Project Explorer 中,如下截图:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

目录 结构的Spring Maven应用的jboss-springmvc\src\main\webapp目录也是在以下屏幕截图中的 Project Explorer 中显示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

Installing the Spring MVC Maven project


要运行 Maven 构建工具,请右键单击 pom.xml 并选择 运行方式 | Maven 安装,如下图所示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

jboss-springmvc 应用程序 被编译并打包到 jboss- springmvc.war 存档,它将输出到 deployments 目录。 Maven 输出 BUILD SUCCESS 消息,如以下屏幕截图所示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

如果 WildFly 8.1 服务器尚未启动,请启动它。 jboss-springmvc.war 存档被部署到 WildFly 8.1。现在登录 WildFly Administration Console 并点击 Manage Deployments。部署后的 jboss-springmvc.war 文件如下图所示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

catalog 架构被导出到 MySQL 数据库。 hibernate_sequence 自动递增 ID 字段也被创建。 catalog 架构描述可以通过 MySQL 命令行客户端中的 desc catalog 命令输出,如下图所示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

Running the Spring MVC application


使用 URL http://localhost:8080/jboss-springmvc/catalog< 在浏览器中运行 Spring MVC 应用程序/代码>。输入视图模板 catalog.jsp 被显示,如以下屏幕截图中的浏览器所示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

在输入表单中指定目录条目的值,然后单击添加,如以下屏幕截图所示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

目录条目 被创建并持久化到 MySQL 数据库表 catalog 并显示在表中,如如以下屏幕截图所示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

同样,创建其他目录条目,如以下屏幕截图中的表所示:

读书笔记《advanced-java-ee-development-with-wildfly》使用Spring MVC 4.1

Summary


在本章中,我们在 Eclipse 中开发了一个 Spring 4.1 MVC 应用程序来创建一个目录。我们使用 Maven 编译和打包应用程序,并将应用程序部署到 WildFly 8.1。随后,我们测试了 Spring MVC 应用程序以创建目录。

在下一章中,我们将讨论 Java EE 7 和 JAX-RS 2.0 中的一个新特性。