SpringMVC-設計模式

MVC 設計不只限於 Java Web 應用,還包括許多應用,好比前端、PHP、.NET 等語言。之因此那麼作的根本緣由在於解耦各個模塊。

MVC 是 Model、View 和 Controller 的縮寫,分別表明 Web 應用程序中的 3 種職責。
php

  • 模型:用於存儲數據以及處理用戶請求的業務邏輯。
  • 視圖:向控制器提交數據,顯示模型中的數據。
  • 控制器:根據視圖提出的請求判斷將請求和數據交給哪一個模型處理,將處理後的有關結果交給哪一個視圖更新顯示。


基於 Servlet 的 MVC 模式的具體實現以下。
html

    • 模型:一個或多個 JavaBean 對象,用於存儲數據(實體模型,由 JavaBean 類建立)和處理業務邏輯(業務模型,由通常的 Java 類建立)。
    • 視圖:一個或多個 JSP 頁面,向控制器提交數據和爲模型提供數據顯示,JSP 頁面主要使用 HTML 標記和 JavaBean 標記來顯示數據。
    • 控制器:一個或多個 Servlet 對象,根據視圖提交的請求進行控制,即將請求轉發給處理業務邏輯的 JavaBean,並將處理結果存放到實體模型 JavaBean 中,輸出給視圖顯示。

Spring MVC 工做流程

Spring MVC 框架主要由 DispatcherServlet、處理器映射、控制器、視圖解析器、視圖組成,其工做原理如圖 1 所示。

前端

Spring MVC工做原理圖
圖 1  Spring MVC 工做原理圖


從圖 1 可總結出 Spring MVC 的工做流程以下:
java

  1. 客戶端請求提交到 DispatcherServlet。
  2. 由 DispatcherServlet 控制器尋找一個或多個 HandlerMapping,找處處理請求的 Controller。
  3. DispatcherServlet 將請求提交到 Controller。
  4. Controller 調用業務邏輯處理後返回 ModelAndView。
  5. DispatcherServlet 尋找一個或多個 ViewResolver 視圖解析器,找到 ModelAndView 指定的視圖。
  6. 視圖負責將結果顯示到客戶端。

Spring MVC接口

在圖 1 中包含 4 個 Spring MVC 接口,即 DispatcherServlet、HandlerMapping、Controller 和 ViewResolver。

Spring MVC 全部的請求都通過 DispatcherServlet 來統一分發,在 DispatcherServlet 將請求分發給 Controller 以前須要藉助 Spring MVC 提供的 HandlerMapping 定位到具體的 Controller。

HandlerMapping 接口負責完成客戶請求到 Controller 映射。

Controller 接口將處理用戶請求,這和 Java Servlet 扮演的角色是一致的。一旦 Controller 處理完用戶請求,將返回 ModelAndView 對象給 DispatcherServlet 前端控制器,ModelAndView 中包含了模型(Model)和視圖(View)。

從宏觀角度考慮,DispatcherServlet 是整個 Web 應用的控制器;從微觀考慮,Controller 是單個 Http 請求處理過程當中的控制器,而 ModelAndView 是 Http 請求過程當中返回的模型(Model)和視圖(View)。

ViewResolver 接口(視圖解析器)在 Web 應用中負責查找 View 對象,從而將相應結果渲染給客戶。
web

 

5、Spring MVC使用spring

  1.導入依賴api

複製代碼
<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>javaee</groupId>
      <artifactId>javaee-api</artifactId>
      <version>5</version>
    </dependency>
複製代碼

  2.建立配置文件spring-mvc

    配置版:mvc

複製代碼
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <bean id="/first" class="com.mvc.controller.FirstController"></bean>

    <!--視圖解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>
複製代碼

    註解版:app

複製代碼
<!--視圖解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>


    <!--包掃描儀-->
    <context:component-scan base-package="com.mvc"></context:component-scan>
    <!--開啓mvc配置-->
    <mvc:annotation-driven></mvc:annotation-driven>
複製代碼

  3.配置web

複製代碼
<!--配置前端控制器-->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--初始化配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext-mvc.xml</param-value>
    </init-param>
    <!--初始化時機-->
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
複製代碼

  4.建立控制器

    配置版:

複製代碼
public class FirstController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv=new ModelAndView();
        mv.addObject("user","hehe");
        mv.setViewName("index");
        return mv;
    }
}
複製代碼

    註解版:

複製代碼
@Controller
@RequestMapping("/second")
public class SecondController {
    @RequestMapping("/method1")
    public ModelAndView method1(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("user","hehe");
        mv.setViewName("index");
        return mv;
    }

    @RequestMapping("/method2")
    public ModelAndView method2(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("user","haha");
        mv.setViewName("index");
        return mv;
    }
}
複製代碼

  5.測試

複製代碼
<%@page language="java" pageEncoding="UTF-8" contentType="text/html; UTF-8" isELIgnored="false" %>
<html>
<body>
<img src="/img/pro.jpg">
<h2>Hello World!</h2>
${user}
</body>
</html>
複製代碼
相關文章
相關標籤/搜索