SpringMVC(一)SpringMVC之HelloWorld

在這裏插入圖片描述

SpringMVC

一、三層架構和MVC

1. 三層架構

我們的開發架構一般都是基於兩種形式,一種是 C/S 架構,也就是客戶端/服務器,另一種是 B/S 架構,也就 是瀏覽器服務器。在 JavaEE 開發中,幾乎全都是基於 B/S架構的開發。那麼在 B/S架構中,系統標準的三層架構 包括:表現層、業務層、持久層。三層架構在我們的實際開發中使用的非常多。

三層架構中,每一層各司其職,接下來我們就說說每層都負責哪些方面:

表現層:
也就是我們常說的web層。它負責接收客戶端請求,向客戶端響應結果,通常客戶端使用http協議請求 web 層,web 需要接收 http 請求,完成 http 響應。
表現層包括展示層和控制層:控制層負責接收請求,展示層負責結果的展示。
表現層依賴業務層,接收到客戶端請求一般會調用業務層進行業務處理,並將處理結果響應給客戶端。
表現層的設計一般都使用 MVC 模型。(MVC 是表現層的設計模型,和其他層沒有關係)

業務層:
也就是我們常說的 service 層。它負責業務邏輯處理,和我們開發項目的需求息息相關。web 層依賴業 務層,但是業務層不依賴 web 層。
業務層在業務處理時可能會依賴持久層,如果要對數據持久化需要保證事務一致性。(也就是我們說的, 事務應該放到業務層來控制)

持久層:
也就是我們是常說的 dao 層。負責數據持久化,包括數據層即數據庫和數據訪問層,數據庫是對數據進 行持久化的載體,數據訪問層是業務層和持久層交互的接口,業務層需要通過數據訪問層將數據持久化到數據庫中。通俗的講,持久層就是和數據庫交互,對數據庫表進行曾刪改查的。

2. MVC模型

MVC 全名是 Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫, 是一種用於設計創建 Web 應用程序表現層的模式。MVC 中每個部分各司其職:

Model(模型):
通常指的就是我們的數據模型。作用一般情況下用於封裝數據。

View(視圖):
通常指的就是我們的 jsp 或者 html。作用一般就是展示數據的。 通常視圖是依據模型數據創建的。

Controller(控制器):
是應用程序中處理用戶交互的部分。作用一般就是處理程序邏輯的。
它相對於前兩個不是很好理解,這裏舉個例子:
例如:
我們要保存一個用戶的信息,該用戶信息中包含了姓名,性別,年齡等等。
這時候表單輸入要求年齡必須是 1~100 之間的整數。姓名和性別不能爲空。並且把數據填充 到模型之中。
此時除了 js 的校驗之外,服務器端也應該有數據準確性的校驗,那麼校驗就是控制器的該做的。
當校驗失敗後,由控制器負責把錯誤頁面展示給使用者。
如果校驗成功,也是控制器負責把數據填充到模型,並且調用業務層實現完整的業務需求。

在這裏插入圖片描述

二、SpringMVC概述

1. SpringMVC是什麼?

SpringMVC 是一種基於 Java 的實現 MVC 設計模型的請求驅動類型的輕量級 Web 框架,屬於 Spring FrameWork 的後續產品,已經融合在 Spring Web Flow 裏面。Spring 框架提供了構建 Web 應用程序的全功 能 MVC 模塊。使用 Spring 可插入的 MVC 架構,從而在使用 Spring 進行 WEB 開發時,可以選擇使用 Spring 的 Spring MVC 框架或集成其他 MVC 開發框架,如 Struts1(現在一般不用),Struts2 等。

SpringMVC 已經成爲目前最主流的 MVC 框架之一,並且隨着 Spring3.0 的發佈,全面超越 Struts2,成 爲最優秀的 MVC 框架。

它通過一套註解,讓一個簡單的 Java 類成爲處理請求的控制器,而無須實現任何接口。同時它還支持 RESTful 編程風格的請求。

2. SpringMVC在三層架構的位置

在這裏插入圖片描述

3. Spring 的優勢

1、清晰的角色劃分:
前端控制器(DispatcherServlet)
請求到處理器映射(HandlerMapping)
處理器適配器(HandlerAdapter)
視圖解析器(ViewResolver)
處理器或頁面控制器(Controller)
驗證器( Validator)
命令對象(Command 請求參數綁定到的對象就叫命令對象)
表單對象(Form Object 提供給表單展示和提交到的對象就叫表單對象)。
2、分工明確,而且擴展點相當靈活, 可以很容易擴展,雖然幾乎不需要。
3、由於命令對象就是一個 POJO,無需繼承框架特定 API, 可以使用命令對象直接作爲業務對象。
4、和 Spring 其他框架無縫集成, 是其它 Web 框架所不具備的。
5、可適配, 通過 HandlerAdapter 可以支持任意的類作爲處理器。
6、可定製性, HandlerMapping、ViewResolver 等能夠非常簡單的定製。
7、功能強大的數據驗證、格式化、綁定機制。
8、利用 Spring 提供的 Mock 對象能夠非常簡單的進行 Web 層單元測試。
9、本地化、主題的解析的支持,使我們更容易進行國際化和主題的切換。
10、強大的 JSP 標籤庫,使 JSP 編寫更容易。
………………
還有比如RESTful風格的支持、簡單的文件上傳、約定大於配置的契約式編程支持、基於註解的零配 置支持等等。

4. SpringMVC 和 Struts2 的優劣分析

共同點:

  • 它們都是表現層框架,都是基於 MVC 模型編寫的。
  • 它們的底層都離不開原始 ServletAPI。
  • 它們處理請求的機制都是一個核心控制器。

區別:

  • Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
  • Spring MVC 是基於方法設計的,而Struts2是基於類,Struts2每次執行都會創建一個動作類。所以Spring MVC 會稍微比 Struts2 快些。
  • Spring MVC 使用更加簡潔,同時還支持 JSR303, 處理 ajax 的請求更方便
    (JSR303 是一套 JavaBean 參數校驗的標準,它定義了很多常用的校驗註解,我們可以直接將這些注 解加在我們 JavaBean 的屬性上面,就可以在需要校驗的時候進行校驗了。)
  • Struts2 的 OGNL 表達式使頁面的開發效率相比 Spring MVC 更高些,但執行效率並沒有比 JSTL 提 升,尤其是 struts2 的表單標籤,遠沒有 html 執行效率高。

在這裏插入圖片描述

三、SpringMVC入門程序

1. 搭建開發環境

① 創建一個maven工程:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

② 創建缺少的文件夾

在這裏插入圖片描述

③ 引入依賴

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.veeja</groupId>
    <artifactId>springmvc_day01_01_start</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>springmvc_day01_01_start Maven Webapp</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring.version>5.0.2.RELEASE</spring.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>springmvc_day01_01_start</finalName>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

④ 配置核心的控制器

  1. 在web.xml配置文件中核心控制器DispatcherServlet
    <!DOCTYPE web-app PUBLIC
            "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
            "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
        <display-name>Archetype Created Web Application</display-name>
    
        <servlet>
            <servlet-name>dispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>dispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>
    
    
  2. 在resources下面新建一個配置文件springmvc.xml:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           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.xsd">
    
    </beans>
    

⑥ 配置Tomcat

在這裏插入圖片描述
在這裏插入圖片描述

2. 編寫代碼

在這裏插入圖片描述

① web.xml

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <!--SpringNVC的核心控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

② springmvc.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">

    <!--開啓註解的掃描-->
    <context:component-scan base-package="com.veeja"></context:component-scan>


    <!--視圖的解析器-->
    <bean id="internalResourceViewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--開啓SpringMVC框架註解的支持-->
    <mvc:annotation-driven/>
</beans>

③ index.jsp

<%--
  Created by IntelliJ IDEA.
  User: veeja
  Date: 2020/5/16
  Time: 21:40
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>入門程序</h3>
<a href="hello">入門程序</a>
</body>
</html>

④ HelloController

package com.veeja.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 控制器類
 *
 * @Author veeja
 * 2020/5/16 21:42
 */
@Controller
public class HelloController {

    @RequestMapping(path = "/hello")
    public String sayHello() {
        System.out.println("Hello SpringMVC");
        return "success";
    }
}

⑤ success.jsp

<%--
  Created by IntelliJ IDEA.
  User: veeja
  Date: 2020/5/16
  Time: 21:52
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>成功了!!!</h3>
</body>
</html>

3. 分析一下入門案例的流程

在這裏插入圖片描述

4. 入門案例中使用的組件介紹

在這裏插入圖片描述

  • DispatcherServlet:前端控制器
    用戶請求到達前端控制器,它就相當於 mvc 模式中的 c,dispatcherServlet 是整個流程控制的中心,由它調用其它組件處理用戶的請求,dispatcherServlet 的存在降低了組件之間的耦合性。
  • HandlerMapping:處理器映射器
    HandlerMapping 負責根據用戶請求找到 Handler 即處理器,SpringMVC 提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,註解方式等。
  • Handler:處理器
    它就是我們開發中要編寫的具體業務控制器。由 DispatcherServlet 把用戶請求轉發到 Handler。由 Handler 對具體的用戶請求進行處理。
  • HandlAdapter:處理器適配器
    通過 HandlerAdapter 對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理 器進行執行。
  • View Resolver:視圖解析器
    View Resolver 負責將處理結果生成 View 視圖,View Resolver 首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成 View 視圖對象,最後對 View 進行渲染將處理結果通過頁面展示給用戶。
  • View:視圖
    SpringMVC 框架提供了很多的 View 視圖類型的支持,包括:jstlView、freemarkerView、pdfView 等。我們最常用的視圖就是 jsp。 一般情況下需要通過頁面標籤或頁面模版技術將模型數據通過頁面展示給用戶,需要由程序員根據業務需求開
    發具體的頁面。

附:<mvc:annotation-driven>說明
在 SpringMVC 的各個組件中,處理器映射器、處理器適配器、視圖解析器稱爲 SpringMVC 的三大組件。

使用<mvc:annotation-driven> 自動加載 RequestMappingHandlerMapping (處理映射器)和 RequestMappingHandlerAdapter ( 處 理 適 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用 <mvc:annotation-driven>替代註解處理器和適配器的配置。 它就相當於在 xml 中配置了:

<!-- 上面的標籤相當於 如下配置--> 
<!-- Begin --> 
<!-- HandlerMapping --> 
<bean 
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> 

<bean 
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> 

<!-- HandlerAdapter --> 
<bean 
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> 

<bean 
class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean> 

<bean 
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean> 

<!-- HadnlerExceptionResolvers --> 
<bean 
class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver"></bean> 

<bean 
class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver"></bean> 

<bean 
class="org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver"></bean> <!-- End --> 

注意: 一般開發中,我們都需要寫上此標籤。
明確: 我們只需要編寫處理具體業務的控制器以及視圖。

在這裏插入圖片描述
END。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章