首頁 > 軟體

Spring整合Web環境與SpringMVC元件的擴充套件使用詳解

2022-08-23 14:02:36

一、Spring整合Web環境(解耦)

實際開發中,我們通常需要編寫多個Web相關的Servlet的時候,如下

package com.kang.service;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ApplicationContext app = new ClassPathXmlApplicationContext("applicatonContext.xml");
        UserService userService = (UserService) app.getBean("userService");
        userService.save();
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

這裡就會出現一個問題,spring的xml檔案只需要載入一次即可,並不需要每啟動一個Servlet就載入一個xml檔案,應用上下文的物件也被建立多次,這明顯是一個不太好的弊端

這時候spring以及給我們封裝好一個工具類用於返回載入這個xml組態檔的ApplicationContext物件

引入:ServletContext

ServletContext官方叫servlet上下文。伺服器會為每一個工程建立一個物件,這個物件就是ServletContext物件。這個物件全域性唯一,而且工程內部的所有servlet都共用這個物件。所以叫全域性應用程式共用物件。

作用:

  • 是一個域物件
  • 可以讀取全域性設定引數
  • 可以搜尋當前工程目錄下面的資原始檔
  • 可以獲取當前工程名字(瞭解)

首先在web.xml設定全域性引數(spring組態檔名稱)和spring監聽器(用於服務開始的時候載入springxml檔案)

通過這個方法來減少spring組態檔的載入次數,從而提高程式的載入速度

使用步驟:

在web.xml設定ContextLoaderListener監聽器(匯入spring-web座標)

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.0.5.RELEASE</version>
    </dependency>

使用WebApplicationContextUtils獲得應用上下文物件ApplicationContext

   <!--web.xml-->
   <!--全域性引數:設定spring的xml組態檔名字-->
  <display-name>Archetype Created Web Application</display-name>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicatonContext.xml</param-value>
  </context-param>
  <!--Spring監聽器-->
  <listener>
    <listener-class>org.springframework.web.context.ContextCleanupListener</listener-class>
  </listener>
package com.kang.service;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//獲取ServletContext物件,用於讀取全域性引數
        ServletContext servletContext = request.getServletContext();
		//獲取監聽器返回的WebApplicationContext物件
        WebApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        UserService userService = app.getBean(UserService.class);
        userService.save();
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

二、SpringMVC快速入門

SpringMVC 是一種基於 Java 的實現 MVC 設計模型的請求驅動型別的輕量級 Web 框架,屬於 SpringFrameWork 的後續產品,已經融合在 Spring Web Flow 中。

它通過一套註解,讓一個簡單的 Java 類成為處理請求的控制器,而無須實現任何介面。同時 它還支援 RESTful 程式設計風格的請求。

  • 開發步驟

匯入SpringMVC相關座標

    <!--springMVC-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.0.5.RELEASE</version>
    </dependency>

設定SpringMVC核心控制器DispathcerServlet

  <!--springMVC的前端控制器-->
  <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--匯入springmcv核心組態檔-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.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>

建立Controller類和檢視頁面

建立一個Controller包,編寫QuickController類

使用註解設定Controller類中業務方法的對映地址

@Controller //使用在web層類上用於範例化Bean(放到容器當中)
public class QuickController {
    @RequestMapping("/quick")   //請求對映
    public String quickMethod(){
        System.out.println("quickMethod running.......");
        //return:要跳轉的檢視
        return "quick.jsp";
    }
}

設定SpringMVC核心檔案 spring-mvc.xml

將下面程式碼放在web.xml的前端控制器的servlet標籤中

<!--匯入springmcv核心組態檔-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
<!--spring-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"
       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">
	<!--包掃描-->
    <context:component-scan base-package="com.kang.controller"/>
</beans>

存取

http://localhost:8080/SpringMVC/quick

就可以看見控制檯輸出

quickMethod running.......

存取流程如下

  • 在瀏覽器存取地址
  • 然後tomcat尋找前端控制器,這裡前端控制器設定預設
  • 然後前端控制器根據輸入的url找到對應的Controller對映的“/quick”,從而返回檢視

三、SpringMVC的執行流程

瀏覽器請求存取某一個資源到檢視的展示,並不是靠一個前端控制器來實現的

  1. 使用者傳送請求到前端控制器DispatcherServlet
  2. DispatcherServlet收到請求呼叫HandlerMapping處理器對映器。
  3. HandlerMapping處理器對映器對請求進行解析,找到具體的處理器(可以根據xml設定、註解進行查詢),生成處理器物件及處理器攔截器(如果 有則生成)一併返回(一串資源的地址)給DispatcherServlet
  4. DispatcherServlet呼叫HandlerAdapter處理器介面卡
  5. HandlerAdapter經過適配呼叫具體的處理器(Controller,也叫後端控制器)。
  6. Controller執行完成返回ModelAndView。
  7. HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。
  8. DispatcherServlet將ModelAndView傳給ViewReslover檢視解析器。
  9. ViewReslover解析後返回具體View。
  10. DispatcherServlet根據View進行渲染檢視(即將模型資料填充至檢視中)。DispatcherServlet響應使用者。

四、SpringMVC元件解析

前端控制器:DispatcherServlet

使用者請求到達前端控制器,它就相當於 MVC 模式中的 C,DispatcherServlet 是整個流程控制的中心,由 它呼叫其它元件處理使用者的請求,DispatcherServlet 的存在降低了元件之間的耦合性。

處理器對映器:HandlerMapping

HandlerMapping 負責根據使用者請求找到 Handler 即處理器,SpringMVC 提供了不同的對映器實現不同的 對映方式,例如:組態檔方式,實現介面方式,註解方式等。

處理器介面卡:HandlerAdapter

通過 HandlerAdapter 對處理器進行執行,這是介面卡模式的應用,通過擴充套件介面卡可以對更多型別的處理 器進行執行

處理器:Handler

它就是我們開發中要編寫的具體業務控制器。由 DispatcherServlet 把使用者請求轉發到 Handler。由 Handler 對具體的使用者請求進行處理。

檢視解析器:View Resolver

View Resolver 負責將處理結果生成 View 檢視,View Resolver 首先根據邏輯檢視名解析成物理檢視名,即 具體的頁面地址,再生成 View 檢視物件,最後對 View 進行渲染將處理結果通過頁面展示給使用者。

檢視:View

SpringMVC 框架提供了很多的 View 檢視型別的支援,包括:jstlView、freemarkerView、pdfView等。最 常用的檢視就是 jsp。一般情況下需要通過頁面標籤或頁面模版技術將模型資料通過頁面展示給使用者,需要由程 序員根據業務需求開發具體的頁面

五、SpringMVC註解解析

@RequestMapping 作用:用於建立請求 URL 和處理請求方法之間的對應關係(加的位置不同,意義也不同)

類上,請求URL 的第一級存取目錄。此處不寫的話,就相當於應用的根目錄

@Controller //使用在web層類上用於範例化Bean(放到容器當中)
@RequestMapping("/user")
public class QuickController {
    @RequestMapping("/quick")   //請求對映
    public String quickMethod(){
        System.out.println("quickMethod running.......");
        //return:要跳轉的檢視
        //要加一個/表示當前web目錄下
        return "/quick.jsp";
    }
}
//存取地址變為:http://localhost:8080/SpringMVC/user/quick

方法上,請求 URL 的第二級存取目錄,與類上的使用@ReqquestMapping標註的一級目錄一起組成存取虛擬路徑

其中@RequestMapping 註解還有很多屬性,可以用來規定請求方式等等

相關屬性:

  • value:用於指定請求的URL。它和path屬性的作用是一樣的
  • method:用於指定請求的方式
  • params:用於指定限制請求引數的條件。它支援簡單的表示式。要求請求引數的key和value必須和設定的一模一樣 例如:
  • params = {“accountName”},表示請求引數必須有accountName
  • params = {“moeny!100”},表示請求引數中money不能是100
@Controller //使用在web層類上用於範例化Bean(放到容器當中)
@RequestMapping("/user")
public class QuickController {
    @RequestMapping(value = "/quick", method = RequestMethod.GET, params = {"username"})   //請求對映
    public String quickMethod(){
        System.out.println("quickMethod running.......");
        //return:要跳轉的檢視
        //要加一個/表示當前web目錄下
        return "/quick.jsp";
    }
}
//存取地址:http://localhost:8080/SpringMVC/user/quick?username=xxx

六、SpringMVC元件掃描的擴充套件

在使用@Controller等註解解析之後,都要進行元件掃描

<context:component-scan base-package="com.kang.controller"/>

這裡是規定了掃描的包名,除此之外,還可以規定掃描哪些註解

    <context:component-scan base-package="com.kang.controller">
        <!--掃描com.kang.controller包下的Controller註解-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

七、SpringMVC的XML設定解析之檢視解析器

在前面的Controller返回了"quick.jsp"檢視,若是不想編寫

jsp字尾,我們可以通過檢視解析器來修改檢視前字尾

    <!--設定內部資源檢視解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--設定字首-->
        <property name="prefix" value="/jsp/"></property>
        <!--設定字尾-->
        <property name="suffix" value=".jsp"></property>
    </bean>

除此之外,還可以規定檢視的顯示形式,是請求轉發還是重定向都可以

只需要在返回的字串加:

  • forward:轉發
  • redirect:重定向

到此這篇關於Spring整合Web環境與SpringMVC元件的擴充套件使用詳解的文章就介紹到這了,更多相關Spring SpringMVC元件內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com