Springmvc 简明教程

Spring - MVC Framework Overview

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

  1. Model 封装了应用程序数据,而且一般来讲,它们将由 POJO 组成。

  2. View 负责渲染模型数据,而且一般来讲,它生成 HTML 输出,客户端的浏览器可以解释这些输出。

  3. Controller 负责处理 User RequestsBuilding Appropriate Model 将其传递给视图进行渲染。

The DispatcherServlet

Spring Web模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet设计的,它处理所有的HTTP请求和响应。Spring Web MVC DispatcherServlet的请求处理工作流显示在下图中。

spring dispatcherservlet

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

  1. 收到HTTP请求后,DispatcherServlet咨询 HandlerMapping 来调用适当的控制器。

  2. 控制器接收请求并基于所使用的 GETPOST method 调用适当的服务方法。服务方法将基于已定义的业务逻辑设置模型数据,并将视图名称返回给DispatcherServlet。

  3. DispatcherServlet将借助 ViewResolver 来为该请求挑选已定义的视图。

  4. 一经最终确定视图,DispatcherServlet将模型数据传递给视图,该视图最终会在浏览器上渲染。

所有以上提到的组件,比如HandlerMapping、Controller和ViewResolver都是 WebApplicationContext 的一部分,它扩展了平实的 ApplicationContext ,其中有一些web应用程序所必需的额外功能。

Required Configuration

我们需要映射DispatcherServlet需要处理的请求,通过在 web.xml 文件中使用URL映射来实现。以下示例显示了 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 目录中。初始化DispatcherServlet时,框架将尝试从一个名为 [servlet-name]-servlet.xml 的文件中加载应用程序上下文,该文件位于应用程序的WebContent/WEB-INF目录中。在本例中,我们的文件将是 HelloWeb-servlet.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. &lt;context:component-scan&#8230;&#8203;&gt; 标记将用于激活 Spring MVC 注解扫描功能,该功能允许使用诸如 @Controller@RequestMapping 等注解。

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

现在让我们了解如何创建实际组件,即控制器、模型和视图。

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 控制器。在此,第一个 @RequestMapping 用法表示该控制器上的所有处理方法都与 /hello 路径相关。

下一个注解 @RequestMapping (method = RequestMethod.GET) 用于将 printHello() 方法声明为控制器的默认服务方法来处理 HTTP GET 请求。我们可以在同一 URL 上定义另一个方法来处理任何 POST 请求。

我们还可以用另一种形式编写上述控制器,其中我们可以按照如下方式在 @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 属性指示处理程序方法映射到的 URL, method 属性定义了处理 HTTP GET 请求的服务方法。

以下是有关上述控制器定义的部分重点:

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

  2. 基于定义的业务逻辑,您将在该方法内创建一个模型。您可以设置不同的模型属性,视图将访问这些属性以显示结果。此示例创建了一个属性为 "message" 的模型。

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

Creating JSP Views

Spring MVC 支持许多不同展现技术的视图类型。这些包括 JSPs, HTML, PDF, Excel Worksheets, XML, Velocity Templates, XSLT, JSON, AtomRSS 数据源、 JasperReports 等等。然而,最常见的是使用 JSTL 编写的 JSP 模板。所以,让我们在 /WEB-INF/hello/hello.jsp 中编写一个简单的问候视图:

<html>
   <head>
      <title>Hello Spring MVC</title>
   </head>
   <body>
      <h2>${message}</h2>
   </body>
</html>

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