Spring 简明教程

Spring - MVC Framework

Spring Web MVC 框架提供了模型-视图-控制器 (MVC) 架构和可用作开发灵活且松散耦合的 Web 应用程序的现成组件。MVC 模式导致应用程序的不同方面(输入逻辑、业务逻辑和 UI 逻辑)分离,同时在这些元素中提供松散耦合。

  1. Model 封装了应用程序数据,并且通常将由 POJO 组成。

  2. View 负责呈现模型数据,并且通常生成客户端浏览器可以解释的 HTML 输出。

  3. Controller 负责处理用户请求、构建适当的模型并将其传递给视图进行呈现。

The DispatcherServlet

Spring Web 模型-视图-控制器(MVC)框架围绕着处理所有 HTTP 请求和响应的 DispatcherServlet 而设计。Spring Web MVC DispatcherServlet 的请求处理工作流在以下图表中说明:

spring dispatcherservlet

以下为响应发送到 DispatcherServlet 的入站 HTTP 请求的事件序列 -

  1. 收到 HTTP 请求后,DispatcherServlet 咨询 HandlerMapping 以调用合适的 Controller。

  2. Controller 接收该请求并基于使用的 GET 或 POST 方法调用合适的服务方法。服务方法会基于定义的业务逻辑来设置模型数据,并将视图名称返回给 DispatcherServlet。

  3. DispatcherServlet 将使用 ViewResolver 的帮助来为该请求挑选定义的视图。

  4. 一旦视图确定,DispatcherServlet 将把模型数据传递给该视图,该视图最终在浏览器中呈现。

所有上述组件(即 HandlerMapping、Controller 和 ViewResolver)都是 WebApplicationContext 的一部分,WebApplicationContext 是带有额外功能的 plainApplicationContext 的扩展(这些功能对于 Web 应用程序而言非常有必要)。

Required Configuration

您需要使用 web.xml 文件中的 URL 映射来映射您希望 DispatcherServlet 处理的请求。以下示例展示了 HelloWeb DispatcherServlet 的声明和映射 -

<web-app id = "WebApp_ID" version = "2.4"
   xmlns = "http://java.sun.com/xml/ns/j2ee"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

   <display-name>Spring MVC Application</display-name>

   <servlet>
      <servlet-name>HelloWeb</servlet-name>
      <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
   </servlet>

   <servlet-mapping>
      <servlet-name>HelloWeb</servlet-name>
      <url-pattern>*.jsp</url-pattern>
   </servlet-mapping>

</web-app>

web.xml 文件将保存在您的 Web 应用程序的 WebContent/WEB-INF 目录中。在初始化 HelloWeb DispatcherServlet 时,框架将尝试从位于该应用程序的 WebContent/WEB-INF 目录中的名为 [servlet-name]-servlet.xml 的文件中加载应用程序上下文。在本案例中,我们的文件将是 HelloWebservlet.xml

接下来,<servlet-mapping> 标记表明哪些 URL 将由哪个 DispatcherServlet 处理。这里,所有以 .jsp 结尾的 HTTP 请求都将由 HelloWeb DispatcherServlet 处理。

如果您不想使用 [servlet-name]-servlet.xml 作为默认文件名,也不想使用 WebContent/WEB-INF 作为默认位置,您可以通过在 web.xml 文件中添加 ContextLoaderListener servlet 监听器来自定义该文件名和位置,如下所示: -

<web-app...>

   <!-------- DispatcherServlet definition goes here----->
   ....
   <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/HelloWeb-servlet.xml</param-value>
   </context-param>

   <listener>
      <listener-class>
         org.springframework.web.context.ContextLoaderListener
      </listener-class>
   </listener>

</web-app>

现在,让我们检查位于您的 Web 应用程序的 WebContent/WEB-INF 目录中的 HelloWeb-servlet.xml 文件所需的配置: -

<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:context = "http://www.springframework.org/schema/context"
   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.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">

   <context:component-scan base-package = "com.tutorialspoint" />

   <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name = "prefix" value = "/WEB-INF/jsp/" />
      <property name = "suffix" value = ".jsp" />
   </bean>

</beans>

以下为 HelloWeb-servlet.xml 文件的重要之处 -

  1. [servlet-name]-servlet.xml 文件将用于创建已定义的 Bean,覆盖全局范围内使用相同名称定义的任何 Bean 的定义。

  2. <context:component-scan…​> 标记将用于激活 Spring MVC 注解扫描能力,该能力允许使用诸如 @Controller 和 @RequestMapping 等注解。

  3. InternalResourceViewResolver 将具有用于解析视图名称的规则。根据上述定义的规则,逻辑视图 hello 委托给了位于 /WEB-INF/jsp/hello.jsp 的某个视图实现。

以下部分将向您展示如何创建您的实际组件,即 Controller、Model 和 View。

Defining a Controller

DispatcherServlet 将请求委托给 controller 以执行特定于该请求的功能。 @Controller 注解表明特定的类扮演 controller 的角色。 @RequestMapping 注解用于将 URL 映射到整个类或特定的处理方法。

@Controller
@RequestMapping("/hello")
public class HelloController {
   @RequestMapping(method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }
}

@Controller 注解将类定义为 Spring MVC controller。这里,首次使用 @RequestMapping 表明此 controller 上的所有处理方法都相对于 /hello 路径。接下来,注解 @RequestMapping(method = RequestMethod.GET) 用于将 printHello() 方法声明为 controller 处理 HTTP GET 请求的默认服务方法。您可以在相同的 URL 定义另一个方法来处理任何 POST 请求。

您可以用另一种形式来编写上述 controller,其中可以在 @RequestMapping 中添加附加的属性,如下所示: -

@Controller
public class HelloController {
   @RequestMapping(value = "/hello", method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }
}

value 属性表示处理程序方法映射到的网址, method 属性定义了处理 HTTP GET 请求的服务方法。下面是关于上面定义的控制器的几个要点:

  1. 您将在一个服务方法中定义所需的业务逻辑。您可以在此方法中根据要求调用其他方法。

  2. 基于所定义的业务逻辑,您将在这个方法中创建一个模型。您可以使用 setter 来设置不同的模型属性,视图将访问这些属性以展示最终结果。此示例创建一个具有属性“message”的模型。

  3. 定义的服务方法可以返回一个 String,它包含用于渲染模型的 view 的名称。此示例返回“hello”作为逻辑视图名称。

Creating JSP Views

Spring MVC 支持许多类型的视图以用于不同的表示技术。其中包括有:JSP、HTML、PDF、Excel 工作表、XML、Velocity 模板、XSLT、JSON、Atom 和 RSS 源、JasperReports 等。但是,我们最常使用带有 JSTL 的 JSP 模板。

让我们在 /WEB-INF/hello/hello.jsp 中编写一个简单的 hello 视图:

<html>
   <head>
      <title>Hello Spring MVC</title>
   </head>

   <body>
      <h2>${message}</h2>
   </body>
</html>

此处 ${message} 是我们在控制器中设置的属性。您可以在您的视图中显示多个属性。

Spring Web MVC Framework Examples

基于上述概念,让我们查看几个重要的示例,它们将帮助您构建您的 Spring Web 应用程序:

Sr.No.

Example & Description

1

Spring MVC Hello World Example 此示例将阐述如何编写一个简单的 Spring Web Hello World 应用程序。

2

Spring MVC Form Handling Example 此示例将阐述如何使用 HTML 表单将数据提交到控制器,并显示处理过的结果来编写 Spring Web 应用程序。

3

Spring Page Redirection Example 了解如何在 Spring MVC Framework 中使用页面重定向功能。

4

Spring Static Pages Example 了解如何在 Spring MVC Framework 中访问静态页面以及动态页面。

5

Spring Exception Handling Example 了解如何在 Spring MVC Framework 中处理异常。