2.SpringMVC入門


轉載:https://blog.kuangstudy.com/index.php/archives/311/

轉載:https://blog.kuangstudy.com/index.php/archives/318/

一.什么是SpringMVC

1.概述

1570166394812.png

Spring MVC是Spring Framework的一部分,是基於Java實現MVC的輕量級Web框架。

查看官方文檔:https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/web.html#spring-web

我們為什么要學習SpringMVC呢?

Spring MVC的特點:

  1. 輕量級,簡單易學

  2. 高效 , 基於請求響應的MVC框架

  3. 與Spring兼容性好,無縫結合

  4. 約定優於配置

  5. 功能強大:RESTful、數據驗證、格式化、本地化、主題等

  6. 簡潔靈活

Spring的web框架圍繞DispatcherServlet [ 調度Servlet ] 設計。

DispatcherServlet的作用是將請求分發到不同的處理器。從Spring 2.5開始,使用Java 5或者以上版本的用戶可以采用基於注解形式進行開發,十分簡潔;

正因為SpringMVC好 , 簡單 , 便捷 , 易學 , 天生和Spring無縫集成(使用SpringIoC和Aop) , 使用約定優於配置 . 能夠進行簡單的junit測試 . 支持Restful風格 .異常處理 , 本地化 , 國際化 , 數據驗證 , 類型轉換 , 攔截器 等等......所以我們要學習 .

最重要的一點還是用的人多 , 使用的公司多 .

二.SpringMVC入門程序

1.步驟

  1. 建立子項目spingmvc-02-hello,添加web框架

  2. 配置web.xml,注冊DispatcherServlet

  3. 在resources目錄中創建springmvc-servlet.xml,添加處理器映射器,處理器適配器,視圖解析器

  4. 在java目錄中創建ustc/wzh/controller/HelloController.java

  5. 注冊類到springmvc-servlet.xml

  6. 在WEB-INF下創建jsp/hello.jsp

  7. 查看是否導入lib包,配置Tomcat,執行程序

建立子項目spingmvc-02-hello,添加web框架

配置web.xml,注冊DispatcherServlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--1.注冊DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--關聯一個springmvc的配置文件:【servlet-name】-servlet.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--啟動級別-1-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!--/ 匹配所有的請求;(不包括.jsp)-->
    <!--/* 匹配所有的請求;(包括.jsp)-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

在resources目錄中創建springmvc-servlet.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">

    <!--處理器映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    <!--處理器適配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!--視圖解析器:DispatcherServlet給他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--前綴-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后綴-->
        <property name="suffix" value=".jsp"/>
    </bean>

    
</beans>

在java目錄中創建ustc/wzh/controller/HelloController.java

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//注意:這里我們先導入Controller接口
public class HelloController implements Controller {

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //ModelAndView 模型和視圖
        ModelAndView mv = new ModelAndView();

        //封裝對象,放在ModelAndView中。Model
        mv.addObject("msg","HelloSpringMVC!");
        //封裝要跳轉的視圖,放在ModelAndView中
        mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp
        return mv;
    }

}

注冊類到springmvc-servlet.xml

<!--Handler-->
<bean id="/hello" class="ustc.wzh.controller.HelloController"/>

在WEB-INF下創建jsp/hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>hello spring mvc</title>
</head>
<body>
${msg}
</body>
</html>

查看是否導入lib包,配置Tomcat,執行程序

  1. 點擊1在WEB-INF目錄下添加一個lib目錄
  2. 點擊2添加library Files 導入所有包
  3. 點擊Apply和OK即可

三.SpringMVC的執行原理

1570167751381.png

圖為SpringMVC的一個較完整的流程圖,實線表示SpringMVC框架提供的技術,不需要開發者實現,虛線表示需要開發者實現。

1.簡要分析執行流程

  1. DispatcherServlet表示前置控制器,是整個SpringMVC的控制中心。用戶發出請求,DispatcherServlet接收請求並攔截請求。

    • 我們假設請求的url為 : http://localhost:8080/SpringMVC/hello

    • 如上url拆分成三部分:

    • http://localhost:8080服務器域名

    • SpringMVC部署在服務器上的web站點

    • hello表示控制器

    • 通過分析,如上url表示為:請求位於服務器localhost:8080上的SpringMVC站點的hello控制器。

  2. HandlerMapping為處理器映射。DispatcherServlet調用HandlerMapping,HandlerMapping根據請求url查找Handler。

  3. HandlerExecution表示具體的Handler,其主要作用是根據url查找控制器,如上url被查找控制器為:hello。

  4. HandlerExecution將解析后的信息傳遞給DispatcherServlet,如解析控制器映射等。

  5. HandlerAdapter表示處理器適配器,其按照特定的規則去執行Handler。

  6. Handler讓具體的Controller執行。

  7. Controller將具體的執行信息返回給HandlerAdapter,如ModelAndView。

  8. HandlerAdapter將視圖邏輯名或模型傳遞給DispatcherServlet。

  9. DispatcherServlet調用視圖解析器(ViewResolver)來解析HandlerAdapter傳遞的邏輯視圖名。

  10. 視圖解析器將解析的邏輯視圖名傳給DispatcherServlet。

  11. DispatcherServlet根據視圖解析器解析的視圖結果,調用具體的視圖。

  12. 最終視圖呈現給用戶。

2.SpringMVC的原理如下圖所示:

  • ​ 當發起請求時被前置的控制器攔截到請求,根據請求參數生成代理請求,找到請求對應的實際控制器,控制器處理請求,創建數據模型,訪問數據庫,將模型響應給中心控制器,控制器使用模型與視圖渲染視圖結果,將結果返回給中心控制器,再將結果返回給請求者。

1570167624269.png

3.中心控制器

  • ​ Spring的web框架圍繞DispatcherServlet設計。 DispatcherServlet的作用是將請求分發到不同的處理器。從Spring 2.5開始,使用Java 5或者以上版本的用戶可以采用基於注解的controller聲明方式。

  • ​ Spring MVC框架像許多其他MVC框架一樣, 以請求為驅動 , 圍繞一個中心Servlet分派請求及提供其他功能DispatcherServlet是一個實際的Servlet (它繼承自HttpServlet 基類)

1570167567494.png

四.SpringMVC使用注解真實開發

1.步驟:

  1. 創建一個普通的maven子項目springmvc-03-annotation,在父和子項目中導入包以及解決資源過濾問題

  2. 添加web框架並且查看項目架構的打包是否有lib沒有就添加lib目錄並導包

  3. 配置web.xml

    1. 注冊Servlet

    2. 攔截所有請求

  4. 配置springmvc-servlet.xml

    1. 指定需要掃描注解的包

    2. 設置不處理靜態資源

    3. 開啟注解驅動

    4. 配置視圖解析器

  5. 編寫控制器controller

  6. 編寫視圖jsp

  7. 配置Tomcat並測試

創建一個普通的maven子項目springmvc-03-annotation,在父和子項目中導入包以及解決資源過濾問題

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

添加web框架並且查看項目架構的打包是否有lib沒有就添加lib目錄並導包

配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--1.注冊servlet-->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--通過初始化參數指定SpringMVC配置文件的位置,進行關聯-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!-- 啟動順序,數字越小,啟動越早 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!--所有請求都會被springmvc攔截 -->
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

配置springmvc-servlet.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"
       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
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 自動掃描包,讓指定包下的注解生效,由IOC容器統一管理 -->
    <context:component-scan base-package="ustc.wzh.controller"/>
    <!-- 讓Spring MVC不處理靜態資源 -->
    <mvc:default-servlet-handler />
    <!--
    支持mvc注解驅動
        在spring中一般采用@RequestMapping注解來完成映射關系
        要想使@RequestMapping注解生效
        必須向上下文中注冊DefaultAnnotationHandlerMapping
        和一個AnnotationMethodHandlerAdapter實例
        這兩個實例分別在類級別和方法級別處理。
        而annotation-driven配置幫助我們自動完成上述兩個實例的注入。
     -->
    <mvc:annotation-driven />

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

</beans>

編寫控制器controller

@Controller
@RequestMapping("/HelloController")
public class HelloController {

    //真實訪問地址 : 項目名/HelloController/hello
    @RequestMapping("/hello")
    public String sayHello(Model model){
        //向模型中添加屬性msg與值,可以在JSP頁面中取出並渲染
        model.addAttribute("msg","hello,SpringMVC");
        //web-inf/jsp/hello.jsp
        return "hello";
    }
}

編寫視圖jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>hello</title>
</head>
<body>
${msg}
</body>
</html>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM