1. 程式人生 > >Spring mvc的基礎

Spring mvc的基礎

  1. 什麼是springMVC?
    Spring Web MVC是一種基於Java的實現了MVC設計模式的、請求驅動型別的、輕量級Web框架。

    回顧:
    中央控制器、子控制器
    mvc具體處理業務的是:子控制器(抽象類、介面)
    中央控制器:接受請求,尋找子控制器去完成業務。

  2. SpringMVC處理請求的流程
    2.1 首先使用者傳送請求–>DispatherServlet
    2.2 DispatcherServlet–>HandlerMapping
    2.3 DispatcherServlet–>HandlerAdapter
    2.4 HandlerAdapter–>處理器功能處理方法的呼叫
    2.5 ModelAndView的邏輯檢視名–>ViewRecolver
    2.6 View–>渲染
    2.7 返回控制權給DispatcherServlet,由DispatcherServlet返回呼應給使用者,流程結束

  3. SpringMVC核心開發步驟
    3.1 DispatcherServlet在web.xml中的部署描述,從而攔截請求到springMVC
    3.2 HandlerMapping的配置,從而將請求對映到處理器
    3.3 HandlerAdapter的配置,從而支援多種型別的處理器
    3.4 處理器(頁面控制器)的配置,從而刊行功能處理
    3.5 ViewResolver的配置,從而將邏輯檢視名解析為具體的檢視技術

  4. SpringMVC的元件
    4.1 前端控制器(DispatcherServlet)
    4.2 請求到處理器對映(HandlerMapping)
    4.3 處理器介面卡(HandlerAdapter)
    4.4 檢視解析器(ViewResolver)
    4.5 處理器或頁面控制器(Controller)
    4.6 驗證器(Validator)
    4.7. 資料轉換元件(DataBinder)
    4.8. 訊息轉換器元件(HttpMessageConverter)
    4.9 命令物件(Command 請求引數繫結到的物件就叫命令物件)
    4.10 表單物件(Form Object提供給表單展示和提交到的物件就叫表單物件)

ps:

一.SpringMVC中的元件及各個元件的作用?

1.DispatherServlet:前置控制器,負責接收並處理所有的web請求,根據handlerMapping找到具體的Controller,由controller完成具體的處理邏輯。

2.HandlerMapping:負責處理web請求和具體的Controller之間的對映關係匹配。

3.Controller:DispatherServlet的次級控制器,web請求的具體處理者。DispatherServlet獲得handlerMapping的返回結果後,呼叫controller的處理方法處理當前的業務請求,處理完成後返回ModelAndView物件。

4.ViewResolver:用來處理檢視名與具體的view例項之間的對映對應關係。根據ModelAndView中的檢視名查詢相應的View實現類,然後將查詢的結果返回給DispatcherServlet,DispatcherServlet最終會將ModelAndView中的模型資料交給返回的View處理最終的檢視渲染工作。

5.View:為支援多種檢視技術而存在,統一抽象檢視的生成策略,根據模型資料輸出具體的檢視。
在這裡插入圖片描述
原文:https://blog.csdn.net/sunhuiliang85/article/details/9531779

  1. 如何在專案中新增springmvc
    1、匯入springmvc的依賴(注意:用自定義標籤庫,需要三個jstl、standard、tomcat-jsp-api)
    2、匯入springmvc框架的配置檔案(掃描controller包、檢視解析器)
    3、配置web.xml 配置中央控制器(dispatchservlet)

5.1 新增相關依賴
注意裡面的tomcat-jsp-api必須要與你的tomcat的執行版本一樣,要不然會報 一些莫名其妙的錯

         <!-- ********************** JSTL依賴 ********************** -->
    <!-- 缺少下面的這兩個jar包會報java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config-->
    <!-- 原因:org.springframework.web.servlet.view.JstlView在檢視解析時需要這二個jar包-->
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>

    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>tomcat-jsp-api</artifactId>
      <version>8.0.47</version>
    </dependency>

5.2 在WEB-INF下新增springmvc-servlet.xml(spring-mvc.xml)
程式碼分享:

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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--開啟事務管理器,如果沒有開啟事務管理器,那麼在前面的分頁就無法使用-->
    <aop:aspectj-autoproxy/>
    <!-- 通過context:component-scan元素掃描指定包下的控制器-->
    <!--1) 掃描com.zking.zf及子子孫孫包下的控制器(掃描範圍過大,耗時)-->
    <context:component-scan base-package="com.zking.ssm"/>

    <!--1) use-dafault-filters="false"的情況下,根據表示式包含(include-filter)或排除(exclude-filter)指定包-->
    <!--<context:component-scan base-package="com.zking.zf" use-default-filters="false">-->
        <!--<context:include-filter type="regex" expression=".+\.controller\..*"/>-->
        <!--<context:exclude-filter type="regex" expression=".+\.controller2\..*"/>-->
    <!--</context:component-scan>-->

    <!--2) 此標籤預設註冊DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
	<!--兩個bean,這兩個bean是spring MVC為@Controllers分發請求所必須的。並提供了資料繫結支援,-->
    <[email protected]支援,@DateTimeFormat支援,@Valid支援,讀寫XML的支援(JAXB),讀寫JSON的支援(Jackson)-->
    <mvc:annotation-driven></mvc:annotation-driven>

    <!--3) ViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- viewClass需要在pom中引入兩個包:standard.jar and jstl.jar -->
        <property name="viewClass"
                  value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
           <resources location="/static/" mapping="/static/**" cache-period="86400" />
    </bean>

    <!--4) 單獨處理圖片、樣式、js等資源 -->
    <!--<mvc:resources location="/css/" mapping="/css/**"/>-->
    <mvc:resources location="/images/" mapping="/images/**"/>
    <!--<mvc:resources location="/js/" mapping="/js/**"/>-->
</beans>

5.3 修改web.xml
程式碼分享:

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_3_1.xsd"
         version="3.1">
    <display-name>Archetype Created Web Application</display-name>
    <!-- Spring和web專案整合start -->
    <!-- spring上下文配置檔案 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!-- 讀取Spring上下文的監聽器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- Spring和web專案整合end -->

    <!-- 防止Spring記憶體溢位監聽器 -->
    <listener>
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>

    <!-- 中文亂碼處理 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>com.zking.zf.util.EncodingFiter</filter-class>
        <!--web.xml 3.0的新特性,是否支援非同步-->
        <async-supported>true</async-supported>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- Spring MVC servlet -->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--此引數可以不配置,預設值為:/WEB-INF/springmvc-servlet.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <!--web.xml 3.0的新特性,是否支援非同步-->
        <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

  1. 第一個springMVC程式:HelloWorld
    程式碼分享:
    HelloWorld.java
package com.zking.ssm.controller;

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

import javax.servlet.http.HttpServletRequest;

/**
 * @author cjl
 * @site www.xiaomage.com
 * @company
 * @create  2018-12-22 14:19
 */

@Controller
public class HelloControlle {

    @RequestMapping("/hello")
    public String list(HttpServletRequest request){
        System.out.println("hello hsndks");
        request.setAttribute("me","我就是我,不一樣的煙火");
        return  "hello";
    }
    @RequestMapping("/hello2")
    public ModelAndView list2(){
        ModelAndView mav =new ModelAndView();
        System.out.println("hello spring mvc");
        mav.setViewName("hello");
        mav.addObject("me","藍色的多瑙河");
        return  mav;
    }
}

  1. 頁面跳轉
    7.1 轉發:"forward:path"
    7.2 重定向:"redirect:path"

注1:這兩種跳轉方式將會繞開檢視解析器的字首和字尾
注2:還有就是如果是在同一controller中則不用使用"/"從根目錄開始,而如果是在不同的controller則一定要從根目錄開始。

  1. 訪問其它的靜態資源(被springmvc攔截了)
   <mvc:resources location="/css/" mapping="/css/**"/>
   <mvc:resources location="/images/" mapping="/images/**"/>
   <mvc:resources location="/js/" mapping="/js/**"/>
   
   <mvc:resources location="/static/" mapping="/static/**" cache-period="86400" />

SpringMVC會自動給靜態資源Response新增快取頭Cache-Control和Expires值

  1. 常用註解
    9.1 @Controller:用於標識處理器類

9.2 @RequestMapping:請求到處理器功能方法的對映規則,可定義到類和方法
常用引數:value、method
可將@RequestMapping標籤定義到類名處窄化路徑

9.3 @RequestParam:請求引數到處理器功能處理方法的方法引數上的繫結
常用引數:value、required、defaultValue
注:required設定成false的引數型別必須是引用型別,因為基本資料型別是不能為null的

9.4 @ModelAttribute:請求引數到命令物件的繫結
常用引數:value
9.4.1 可用@ModelAttribute標註方法引數,方法引數會被新增到Model物件中(作用:向檢視層傳資料)
9.4.2 可用@ModelAttribute標註一個非請求處理方法,此方法會在每次呼叫請求處理方法前被呼叫(作用:資料初始化)
9.4.3 可用@ModelAttribute標註方法,方法返回值會被新增到Model物件中(作用:向檢視層傳資料)
但此方法檢視的邏輯圖就會根據請求路徑解析,例如:a/test42 --> /WEB-INF/a/test42.jsp
太麻煩幾乎不用,不用直接儲存到Model或ModelAndView中

9.5 @SessionAttributes:指定ModelMap中的哪些屬性需要轉存到session
常用引數:value、types
注1:必須放到class類名處

9.6 @InitBinder(本章暫不介紹):用於將請求引數轉換到命令物件屬性的對應型別

9.7 @RequestBody(重要~~~~~):用於目前比較流行的ajax開發的資料繫結(即提交資料的型別為json格式)
注1:使用@RequestBody註解的時候,前臺的Content-Type必須要改為application/json,
如果沒有更改,前臺會報錯415(Unsupported Media Type)。
後臺日誌就會報錯Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported。
這些錯誤Eclipse下Tomcat是不會顯示錯誤資訊的,只有使用了日誌才會顯示

 $.ajax({
            url : "jsontest",
            type : "POST",
            async : true,
            contentType : "application/json",
            data : JSON.stringify(json),
            dataType : 'json',
            success : function(data) {
                if (data.userstatus === "success") {
                    $("#errorMsg").remove();
                } else {
                    if ($("#errorMsg").length <= 0) {
                        $("form[name=loginForm]").append(errorMsg);
                    }
                }
            }
        });

10、crud
<aop:aspectj-autoproxy expose-proxy=“true”></aop:aspectj-autoproxy>

結果集配置
forward:對映
redirect:對映
forward:xxx.jsp
redirect:xxx.jsp