Spring MVC



  • MVC

    Spring Web MVC框架提供了模型-视图-控制器(MVC)架构和现成的组件,可用于开发灵活且松散耦合的Web应用程序。MVC模式导致分离应用程序的不同方面(输入逻辑,业务逻辑和UI逻辑),同时在这些元素之间提供松散的耦合。
    • 模型(M)封装了应用程序数据,通常它们将由POJO组成。
    • 视图(V)负责呈现模型数据,并在总体上产生HTML输出,客户端的浏览器可以解析。
    • 控制器(C)负责处理用户请求,并且建立一个合适的模型,并将其传递到用于渲染的图。
  • DispatcherServlet

    Spring Web模型视图控制器(MVC)框架是围绕处理所有HTTP请求和响应的DispatcherServlet设计的。下图说明了Spring Web MVC DispatcherServlet的请求处理工作流程
    DispatcherServlet
    以下是与对DispatcherServlet的传入HTTP请求相对应的事件序列
    • 收到HTTP请求后,DispatcherServlet询问HandlerMapping 来调用适当的Controller
    • 控制器(Controller)接受请求,并调用基于所使用GETPOST方法相应的服务的方法。服务方法将基于定义的业务逻辑设置模型数据,并将视图名称返回给DispatcherServlet
    • DispatcherServlet将帮助该请求从的ViewResolver拾取的已定义视图。
    • 视图完成后,DispatcherServlet将模型数据传递到视图,该视图最终在浏览器上呈现。
    上述所有组件,即HandlerMappingControllerViewResolver都是WebApplicationContext的一部分,它是纯ApplicationContext的扩展,具有Web应用程序必需的一些额外功能。
  • 所需配置

    您需要通过使用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>标记指示哪个DispatcherServlet将处理哪些URL。在这里,所有以.jsp结尾的HTTP请求都将由HelloWeb DispatcherServlet 处理。如果不想使用默认文件名[servlet-name]-servlet.xml和默认位置WebContent/ WEB-INF,则可以通过在web.xml文件中添加servlet侦听器ContextLoaderListener来自定义此文件名和位置。如下-
    <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.jc2182" />
    
       <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文件的要点
    • [servlet的名称]-servlet.xml后缀的文件将被用来创建定义的Bean类,覆盖全局作用域内名字相同的Bean的定义。
    • <context:component-scan>标签将使用以激活Spring MVC注解扫描功能,其允许使用像@Controller和@RequestMapping等注解
    • InternalResourceViewResolver 这个将定义解析视图名称规则。根据上述定义的规则,名为hello的逻辑视图被委托给位于/WEB-INF/jsp/hello.jsp的视图实现。
    下一节将向您展示如何创建实际的组件,即Controller,Model和View。
  • 定义控制器

    DispatcherServlet将请求委托给控制器以执行特定于其的功能。@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";
       }
    }
    
    所述值属性表示该处理程序方法被映射的URL和方法属性定义了服务的方法来处理HTTP GET请求。关于上面定义的控制器,需要注意以下要点
    • 您将在服务方法中定义所需的业务逻辑。您可以根据需要在此方法内调用另一个方法。
    • 根据定义的业务逻辑,您将在此方法中创建一个模型。您可以使用不同模型setter属性,视图将访问这些属性以显示最终结果。本示例创建一个属性为“message”的模型。
    • 定义的服务方法可以返回String,String包含用于呈现模型的视图的名称。本示例返回“hello”作为逻辑视图名称。
  • 创建JSP视图

    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框架示例

    基于上述概念,让我们检查一些重要的示例,这些示例将帮助您构建Spring Web应用程序
    1. Spring MVC Hello World示例 - 这个例子将解释如何编写一个简单的Spring Web Hello World应用程序。
    2. Spring MVC表单处理示例 - 该示例将说明如何使用HTML表单编写Spring Web应用程序,以将数据提交给控制器并显示处理后的结果。
    3. Spring页面重定向示例 - 了解如何在Spring MVC Framework中使用页面重定向功能。
    4. Spring静态页面示例 - 了解如何在Spring MVC Framework中访问静态页面和动态页面。
    5. Spring异常处理示例 - 了解如何在Spring MVC Framework中处理异常。