Spring Web MVC 和 Spring MVC 是同一个东西。

Spring MVC框架提供MVC(模型-视图-控制器)架构,能够是应用程序在输入逻辑、输出逻辑、UI逻辑上分离。

Model:封装了应用程序数据,由POJO类组成 View:负责渲染模型数据,生成客户端浏览器可以解释的HTML输出 Controller:负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染。

一、DispatcherServlet组件类

MVC框架是围绕DispatcherServlet设计,该组件可以处理所有的HTTP请求和响应。
image.png
对于传入的HTTP请求的事件处理顺序:

  1. 在接收到HTTP请求后,DispatcherServlet会查询HandlerMapping以调用相应的Controller。
  2. Controller接受请求并根据使用的GET或POST方法调用相应的服务方法。 服务方法将基于定义的业务逻辑设置模型数据,并将视图名称返回给DispatcherServlet。
  3. DispatcherServlet将从ViewResolver获取请求的定义视图。
  4. 当视图完成,DispatcherServlet将模型数据传递到最终的视图,并在浏览器上呈现。

所有上述组件,即: HandlerMapping、Controller和ViewResolver是WebApplicationContext的一部分,它是普通ApplicationContext的扩展,带有Web应用程序所需的一些额外功能。

二、必要的配置

1、web.xml

需要通过web.xml 文件中的URL映射 来映射需要DispatcherServlet 处理的请求:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  5. version="3.0">
  6. <display-name>SpringMvcV1</display-name>
  7. <!-- 部署 DispatcherServlet -->
  8. <!-- 部署 DispatcherServlet -->
  9. <servlet>
  10. <servlet-name>SpringMvcV1</servlet-name>
  11. <servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
  12. <!--
  13. <init-param>
  14. <param-name>contextConfigLocation</param-name>
  15. <param-value>classpath:SpringMvcV1-servlet.xml</param-value>
  16. </init-param>
  17. -->
  18. <!-- 表示容器再启动时立即加载servlet -->
  19. <load-on-startup>1</load-on-startup>
  20. </servlet>
  21. <servlet-mapping>
  22. <servlet-name>SpringMvcV1</servlet-name>
  23. <url-pattern>/</url-pattern>
  24. </servlet-mapping>
  25. </web-app>

在web.xml 中定义了DispatcherServlet 声明,初始化过程中会从 webapp/WEB-INF目录下读取[servlet-name]-servlet.xml的文件,用于加载应用程序上下文。

:表示哪些URL由DispatcherServlet处理
: 侦听器,用于定位servlet.xml文件的位置。

  1. <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>/WEB-INF/HelloWeb-servlet.xml</param-value>
  4. </context-param>
  5. <listener>
  6. <listener-class>
  7. org.springframework.web.context.ContextLoaderListener
  8. </listener-class>
  9. </listener>

2、servlet.xml

:用于激活注释扫描功能
InternalResourceViewResolver:定义解析视图名称的规则。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context-3.2.xsd
  10. http://www.springframework.org/schema/mvc
  11. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  12. <!--
  13. <context:component-scan base-package="com.cimon.controller" />
  14. <mvc:annotation-driven/>
  15. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  16. <property name="prefix" value="/WEB-INF/jsp/" />
  17. <property name="suffix" value=".jsp" />
  18. </bean>
  19. -->
  20. <!-- LoginController控制器类,映射到"/login"-->
  21. <bean id="login" name="/login"
  22. class="com.cimon.controller.LoginController"/>
  23. <bean id="register" name="/register"
  24. class="com.cimon.controller.RegisterController"/>
  25. </beans>

3、定义控制器

DispatcherServlet 将请求委派给控制器执行。
@Controller:指示特定类充当控制器的角色。
@RequestMapping:用于将URL映射到整个类或特定处理程序方法。

  1. @Controller
  2. @RequestMapping("/hello")
  3. public class HelloController{
  4. @RequestMapping(method = RequestMethod.GET)
  5. public String printHello(ModelMap model) {
  6. model.addAttribute("message", "Hello Spring MVC Framework!");
  7. return "hello";
  8. }
  9. }

上面例子中:
@Controller注释将类定义为Spring MVC控制器。
@RequestMapping的第一个用法表示此控制器上的所有处理方法都与 /hello 路径相关。 @RequestMapping(method = RequestMethod.GET) 用于声明 printHello() 方法作为控制器的默认服务方法,用来处理 HTTP GET请求。可以定义另一个方法来处理同一 URL 的任何POST请求。

另一种写法,

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

value 属性指示处理程序方法映射到的URL,method 属性定义处理HTTP GET请求的服务方法。关于以上定义的控制器,需要注意以下几点:

  • 在服务方法中定义所需的业务逻辑。可以根据需要在此方法内调用其他方法。
  • 基于定义的业务逻辑,将在此方法中创建一个模型。可以设置不同的模型属性,这些属性将被视图访问以呈现最终结果。此示例创建且有属性“message”的模型。
  • 定义的服务方法可以返回一个String,它包含要用于渲染模型的视图的名称。此示例将“hello”返回为逻辑视图名称。

4、创建JSP视图

Spring MVC 支持许多类型的视图用于不同的表示技术。包括 :JSP、HTML、PDF、Excel工作表、XML、Velocity模板、XSLT、JSON、Atom 和 RSS 源 等。

  1. <%@ page contentType="text/html; charset=UTF-8" %>
  2. <html>
  3. <head>
  4. <title>Hello World</title>
  5. </head>
  6. <body>
  7. <h2>Hello, ${message}</h2>
  8. </body>
  9. </html>


参考

1、Spring MVC概述