springMVC

Spring與Web環(huán)境集成

ApplicationContext獲取方式

應(yīng)用上下文對(duì)象是通過(guò)new ClasspathXmlApplicationContext(spring配置文件) 方式獲取的,但是每次從容器中獲得Bean時(shí)都要編寫(xiě)new ClasspathXmlApplicationContext(spring配置文件) ,這樣的弊端是配置文件加載多次,應(yīng)用上下文對(duì)象創(chuàng)建多次。

在Web項(xiàng)目中,可以使用ServletContextListener監(jiān)聽(tīng)Web應(yīng)用的啟動(dòng),我們可以在Web應(yīng)用啟動(dòng)時(shí),就加載Spring的配置文件,創(chuàng)建應(yīng)用上下文對(duì)象ApplicationContext,在將其存儲(chǔ)到最大的域servletContext域中,這樣就可以在任意位置從域中獲得應(yīng)用上下文ApplicationContext對(duì)象了。

WebApplicationContextUtils

上面的分析不用手動(dòng)實(shí)現(xiàn),Spring提供了一個(gè)監(jiān)聽(tīng)器ContextLoaderListener就是對(duì)上述功能的封裝,該監(jiān)聽(tīng)器內(nèi)部加載Spring配置文件,創(chuàng)建應(yīng)用上下文對(duì)象,并存儲(chǔ)到ServletContext域中,提供了一個(gè)客戶端工具WebApplicationContextUtils供使用者獲得應(yīng)用上下文對(duì)象。

所以我們需要做的只有兩件事:

  1. 在web.xml中配置ContextLoaderListener監(jiān)聽(tīng)器(導(dǎo)入spring-web坐標(biāo))

  2. 使用WebApplicationContextUtils獲得應(yīng)用上下文對(duì)象ApplicationContext

導(dǎo)入Spring集成web的坐標(biāo)

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

配置ContextLoaderListener

<!--全局參數(shù)-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--Spring的監(jiān)聽(tīng)器-->
<listener>
    <listener-class>
       org.springframework.web.context.ContextLoaderListener
   </listener-class>
 </listener>

獲取應(yīng)用上下文對(duì)象

ApplicationContext applicationContext =    
    WebApplicationContextUtils.getWebApplicationContext(servletContext);
    Object obj = applicationContext.getBean("id");

知識(shí)要點(diǎn)

Spring集成web環(huán)境步驟

  1. 配置ContextLoaderListener監(jiān)聽(tīng)器

  2. 使用WebApplicationContextUtils獲得應(yīng)用上下文

SpringMVC基本概念

三層架構(gòu)和MVC

三層架構(gòu)

我們的開(kāi)發(fā)架構(gòu)一般都是基于兩種形式,一種是C/S架構(gòu),也就是客戶端/服務(wù)器,另一種是B/S架構(gòu),也就是瀏覽器服務(wù)器.

在JavaEE開(kāi)發(fā)中,幾乎全都是基于B/S架構(gòu)的開(kāi)發(fā).那么在B/S架構(gòu)中,系統(tǒng)標(biāo)準(zhǔn)的三層架構(gòu)包括:表現(xiàn)層. 業(yè)務(wù)層. 持久層.

三層架構(gòu)在我們的實(shí)際開(kāi)發(fā)中使用的非常多,所以我們課程中的案例也都是基于三層架構(gòu)設(shè)計(jì)的.

三層架構(gòu)中,每一層各司其職,接下來(lái)我們就說(shuō)說(shuō)每層都負(fù)責(zé)哪些方面:

表現(xiàn)層:也就是我們常說(shuō)的web層.它負(fù)責(zé)接收客戶端請(qǐng)求,向客戶端響應(yīng)結(jié)果,通常客戶端使用http協(xié)議請(qǐng)求web層,web需要接收http請(qǐng)求,完成http響應(yīng).
       表現(xiàn)層包括展示層和控制層:控制層負(fù)責(zé)接收請(qǐng)求,展示層負(fù)責(zé)結(jié)果的展示.
       表現(xiàn)層依賴業(yè)務(wù)層,接收到客戶端請(qǐng)求一般會(huì)調(diào)用業(yè)務(wù)層進(jìn)行業(yè)務(wù)處理,并將處理結(jié)果響應(yīng)給客戶端.
       表現(xiàn)層的設(shè)計(jì)一般都使用MVC模型.(MVC是表現(xiàn)層的設(shè)計(jì)模型,和其他層沒(méi)有關(guān)系)

業(yè)務(wù)層:也就是我們常說(shuō)的service層.它負(fù)責(zé)業(yè)務(wù)邏輯處理,和我們開(kāi)發(fā)項(xiàng)目的需求息息相關(guān).
       web層依賴業(yè)務(wù)層,但是業(yè)務(wù)層不依賴web層. 業(yè)務(wù)層在業(yè)務(wù)處理時(shí)可能會(huì)依賴持久層,如果要對(duì)數(shù)據(jù)持久化需要保證事務(wù)一致性.(也就是我們說(shuō)的,事務(wù)應(yīng)該放到業(yè)務(wù)層來(lái)控制)

持久層:也就是我們是常說(shuō)的dao層.負(fù)責(zé)數(shù)據(jù)持久化.包括數(shù)據(jù)層(數(shù)據(jù)庫(kù))和數(shù)據(jù)訪問(wèn)層.
      數(shù)據(jù)庫(kù)是對(duì)數(shù)據(jù)進(jìn)行持久化的載體,數(shù)據(jù)訪問(wèn)層是業(yè)務(wù)層和持久層交互的接口,業(yè)務(wù)層需要通過(guò)數(shù)據(jù)訪問(wèn)層將數(shù)據(jù)持久化到數(shù)據(jù)庫(kù)中.
      通俗的講,持久層就是和數(shù)據(jù)庫(kù)交互,對(duì)數(shù)據(jù)庫(kù)表進(jìn)行曾刪改查的.

MVC模型

MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫(xiě),是一種用于設(shè)計(jì)創(chuàng)建 Web 應(yīng)用程序表現(xiàn)層的模式.

MVC中每個(gè)部分各司其職:

Model(模型):通常指的就是我們的數(shù)據(jù)模型.作用一般情況下用于封裝數(shù)據(jù).

View(視圖): 通常指的就是我們的jsp或者h(yuǎn)tml.作用一般就是展示數(shù)據(jù)的. 通常視圖是依據(jù)模型數(shù)據(jù)創(chuàng)建的.

Controller(控制器): 是應(yīng)用程序中處理用戶交互的部分.作用一般就是處理程序邏輯的.它相對(duì)于前兩個(gè)不是很好理解
    這里舉個(gè)例子,例如:
        我們要保存一個(gè)用戶的信息,該用戶信息中包含了姓名,性別,年齡等等. 這時(shí)候表單輸入要求年齡必須是1~100之間的整數(shù).姓名和性別不能為空.并且把數(shù)據(jù)填充到模型之中. 此時(shí)除了js的校驗(yàn)之外,服務(wù)器端也應(yīng)該有數(shù)據(jù)準(zhǔn)確性的校驗(yàn),那么校驗(yàn)就是控制器的該做的. 當(dāng)校驗(yàn)失敗后,由控制器負(fù)責(zé)把錯(cuò)誤頁(yè)面展示給使用者. 如果校驗(yàn)成功,也是控制器負(fù)責(zé)把數(shù)據(jù)填充到模型,并且調(diào)用業(yè)務(wù)層實(shí)現(xiàn)完整的業(yè)務(wù)需求.

SpringMVC概述

SpringMVC是什么

SpringMVC是一種基于Java的實(shí)現(xiàn)MVC設(shè)計(jì)模型的請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,屬于 Spring FrameWork 的后續(xù)產(chǎn)品,已經(jīng)融合在Spring Web Flow里面.

Spring 框架提供了構(gòu)建 Web 應(yīng)用程序的全功能 MVC 模塊.使用 Spring 可插入的 MVC 架構(gòu),從而在使用Spring進(jìn)行WEB開(kāi)發(fā)時(shí),可以選擇使用 Spring 的 Spring MVC 框架或集成其他MVC開(kāi)發(fā)框架,如Struts1(現(xiàn)在一般不用),Struts2等.

SpringMVC已經(jīng)成為目前最主流的 MVC 框架之一,并且隨著Spring3.0的發(fā)布,全面超越 Struts2,成為最優(yōu)秀的 MVC 框架. 它通過(guò)一套注解,讓一個(gè)簡(jiǎn)單的Java類成為處理請(qǐng)求的控制器,而無(wú)須實(shí)現(xiàn)任何接口.同時(shí)它還支持RESTful編程風(fēng)格的請(qǐng)求.

SpringMVC在三層架構(gòu)的位置

SpringMVC的優(yōu)勢(shì)

1. 清晰的角色劃分:前端控制器(DispatcherServlet). 請(qǐng)求到處理器映射(HandlerMapping). 處理器適配器(HandlerAdapter). 視圖解析器(ViewResolver). 處理器或頁(yè)面控制器(Controller). 驗(yàn)證器( Validator). 命令對(duì)象(Command 請(qǐng)求參數(shù)綁定到的對(duì)象就叫命令對(duì)象). 表單對(duì)象(Form Object 提供給表單展示和提交到的對(duì)象就叫表單對(duì)象).

2. 分工明確,而且擴(kuò)展點(diǎn)相當(dāng)靈活,可以很容易擴(kuò)展,雖然幾乎不需要.

3. 由于命令對(duì)象就是一個(gè) POJO,無(wú)需繼承框架特定 API,可以使用命令對(duì)象直接作為業(yè)務(wù)對(duì)象.

4. 和 Spring 其他框架無(wú)縫集成,是其它 Web 框架所不具備的.

5. 可適配,通過(guò) HandlerAdapter 可以支持任意的類作為處理器.

6. 可定制性,`HandlerMapping`, `ViewResolver` 等能夠非常簡(jiǎn)單的定制.

7. 功能強(qiáng)大的數(shù)據(jù)驗(yàn)證. 格式化. 綁定機(jī)制.

8. 利用 Spring 提供的 Mock 對(duì)象能夠非常簡(jiǎn)單的進(jìn)行 Web 層單元測(cè)試.

9. 本地化主題的解析的支持,使我們更容易進(jìn)行國(guó)際化和主題的切換.

10. 強(qiáng)大的 JSP 標(biāo)簽庫(kù),使 JSP 編寫(xiě)更容易.

還有比如RESTful風(fēng)格的支持. 簡(jiǎn)單的文件上傳. 約定大于配置的契約式編程支持. 基于注解的零配置支持等等.

SpringMVC入門(mén)程序

發(fā)送一個(gè)請(qǐng)求給后臺(tái)程序,后臺(tái)能夠接收到該請(qǐng)求并且執(zhí)行對(duì)應(yīng)的業(yè)務(wù)方法,輸出一段話。并且返回一個(gè)成功的頁(yè)面。

SpringMVC開(kāi)發(fā)環(huán)境搭建

創(chuàng)建項(xiàng)目

創(chuàng)建Maven的WEB項(xiàng)目,補(bǔ)全目錄解構(gòu)

添加依賴

添加SpringMCV開(kāi)發(fā)的依賴jar包

<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版本鎖定-->
    <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>org.apache.tomcat</groupId>
      <artifactId>tomcat-api</artifactId>
      <version>9.0.10</version>
        <scope>provided</scope>
    </dependency>
  </dependencies>

SpringMVC入門(mén)程序

配置核心控制器

web.xml中配置SpringMVC的核心控制器

<!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>

  <!--配置SpringMVC核心控制器-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!-- 配置Servlet的初始化參數(shù),讀取springmvc的配置文件,創(chuàng)建spring容器 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>

    <!-- 配置servlet啟動(dòng)時(shí)加載對(duì)象,不配是使用時(shí)加載,這里一般是啟動(dòng)初始化 -->
    <load-on-startup>1</load-on-startup>
  </servlet>

  <!--配置springmvc過(guò)請(qǐng)求過(guò)濾器,/表示所有請(qǐng)求都經(jīng)過(guò)springmvc處理-->
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

創(chuàng)建SpringMCV配置文件

創(chuàng)建SpringMCV配置文件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">

    <!-- 配置創(chuàng)建spring容器要掃描的包 -->
    <context:component-scan base-package="com.itheima"></context:component-scan>

</beans>

創(chuàng)建index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello SpringMVC!</h2>

<!--編寫(xiě)超鏈接,點(diǎn)擊超鏈接訪問(wèn)springmvc_01項(xiàng)目下的hello資源-->
<a href="/springmvc_01/hello">
    訪問(wèn)HelloServlet
</a>

</body>
</html>

編寫(xiě)控制器并配置

編寫(xiě)控制器并使用注解配置HelloController

@Controller("helloController")
public class HelloController {

    //設(shè)置sysHello方法的請(qǐng)求路徑為"hello"
    @RequestMapping(path = "/hello")
    public String sysHello(){
        System.out.println("第一個(gè)SpringMVC程序");
        return "success";
    }
}

配置視圖解析器

修改SpringMCV配置文件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">

    <!-- 配置創(chuàng)建spring容器要掃描的包 -->
    <context:component-scan base-package="com.itheima"></context:component-scan>

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

</beans>

訪問(wèn)測(cè)試

打開(kāi)瀏覽器,輸入 : http://localhost:8080/springmvc_01/index.jsp

SpringMVC流程圖示

快速入門(mén)程序總結(jié)

SpringMVC的開(kāi)發(fā)步驟 :

  1. 導(dǎo)入SpringMVC相關(guān)坐標(biāo)
  2. 配置SpringMVC核心控制器DispathcerServlet
  3. 創(chuàng)建Controller類和視圖頁(yè)面
  4. 使用注解配置Controller類中業(yè)務(wù)方法的映射地址
  5. 配置SpringMVC核心文件 spring-mvc.xml
  6. 客戶端發(fā)起請(qǐng)求測(cè)試

SpringMVC的組件解析

SpringMVC的執(zhí)行流程

①用戶發(fā)送請(qǐng)求至前端控制器DispatcherServlet。
②DispatcherServlet收到請(qǐng)求調(diào)用HandlerMapping處理器映射器。
③處理器映射器找到具體的處理器(可以根據(jù)xml配置、注解進(jìn)行查找),生成處理器對(duì)象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet。
④DispatcherServlet調(diào)用HandlerAdapter處理器適配器。
⑤HandlerAdapter經(jīng)過(guò)適配調(diào)用具體的處理器(Controller,也叫后端控制器)。
⑥Controller執(zhí)行完成返回ModelAndView。
⑦HandlerAdapter將controller執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet。
⑧DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
⑨ViewReslover解析后返回具體View。
⑩DispatcherServlet根據(jù)View進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)。DispatcherServlet響應(yīng)用戶。

SpringMVC組件解析

  1. 前端控制器:DispatcherServlet

    用戶請(qǐng)求到達(dá)前端控制器,它就相當(dāng)于 MVC 模式中的 C,DispatcherServlet 是整個(gè)流程控制的中心,由

它調(diào)用其它組件處理用戶的請(qǐng)求,DispatcherServlet 的存在降低了組件之間的耦合性。

  1. 處理器映射器:HandlerMapping

    HandlerMapping 負(fù)責(zé)根據(jù)用戶請(qǐng)求找到 Handler 即處理器,SpringMVC 提供了不同的映射器實(shí)現(xiàn)不同的

映射方式,例如:配置文件方式,實(shí)現(xiàn)接口方式,注解方式等。

  1. 處理器適配器:HandlerAdapter

    通過(guò) HandlerAdapter 對(duì)處理器進(jìn)行執(zhí)行,這是適配器模式的應(yīng)用,通過(guò)擴(kuò)展適配器可以對(duì)更多類型的處理

器進(jìn)行執(zhí)行。

  1. 處理器:Handler

    它就是我們開(kāi)發(fā)中要編寫(xiě)的具體業(yè)務(wù)控制器。由 DispatcherServlet 把用戶請(qǐng)求轉(zhuǎn)發(fā)到 Handler。由

Handler 對(duì)具體的用戶請(qǐng)求進(jìn)行處理。

  1. 視圖解析器:View Resolver

    View Resolver 負(fù)責(zé)將處理結(jié)果生成 View 視圖,View Resolver 首先根據(jù)邏輯視圖名解析成物理視圖名,即具體的頁(yè)面地址,再生成 View 視圖對(duì)象,最后對(duì) View 進(jìn)行渲染將處理結(jié)果通過(guò)頁(yè)面展示給用戶。

  2. 視圖:View

    SpringMVC 框架提供了很多的 View 視圖類型的支持,包括:jstlView、freemarkerView、pdfView等。最常用的視圖就是 jsp。一般情況下需要通過(guò)頁(yè)面標(biāo)簽或頁(yè)面模版技術(shù)將模型數(shù)據(jù)通過(guò)頁(yè)面展示給用戶,需要由程序員根據(jù)業(yè)務(wù)需求開(kāi)發(fā)具體的頁(yè)面

SpringMVC注解解析

入門(mén)程序中, 我們?cè)诳刂品椒ㄉ咸砑恿?code>RequestMapping注解 , 那么這個(gè)注解在案例中起到什么樣的作用呢 ?

作用 :

  • RequestMapping注解的作用是建立請(qǐng)求URL和處理方法之間的對(duì)應(yīng)關(guān)系

位置 :

  • RequestMapping注解可以作用在方法和類上 , 作用在類上, 要訪問(wèn)類中的方法就必須添加類上的訪問(wèn)路徑 , 一般用于模塊化開(kāi)發(fā)

屬性 :

  • path 指定請(qǐng)求路徑的url
  • value 同path屬性 , 指定請(qǐng)求路徑的url
  • mthod 指定該方法的請(qǐng)求方式
  • params 指定限制請(qǐng)求參數(shù)的條件
  • headers 發(fā)送的請(qǐng)求中必須包含的請(qǐng)求頭
/**
 * 此控制器的訪問(wèn)路徑為 /user
 */
@RequestMapping("/user")
@Controller
public class UserController {

    /**
     *此方法的訪問(wèn)路徑為   /add  使用value屬性指定
     */
    @RequestMapping(value = "/add")
    public  void add(){
        System.out.println("添加用戶....");
    }

    /**
     *此方法的訪問(wèn)路徑為   /add  使用path屬性指定 同value
     * 此方法的請(qǐng)求方式為 get
     */
    @RequestMapping(path = "/update",method = RequestMethod.GET)
    public  void update(){
        System.out.println("更新用戶....");
    }

    /**
     *此方法的訪問(wèn)路徑為   /findAll  ,必須包含Accept請(qǐng)求頭
     *
     */
    @RequestMapping(path = "/findAll",headers = {"Accept"})
    public  void findAll(){
        System.out.println("查詢所有用戶....");
    }

    /**
     * 請(qǐng)求路徑為/findById
     * 請(qǐng)求方式為GET
     * 必須包含id參數(shù)
     */
    @RequestMapping(path = "/findById",method = RequestMethod.GET,params = {"id"})
    public  void findById(){
        System.out.println("查詢所有用戶....");
    }
}

SpringMVC的XML配置

SpringMVC有默認(rèn)組件配置,默認(rèn)組件都是DispatcherServlet.properties配置文件中配置的,該配置文件地址org/springframework/web/servlet/DispatcherServlet.properties,該文件中配置了默認(rèn)的視圖解析器,如下:

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

翻看該解析器源碼,可以看到該解析器的默認(rèn)設(shè)置,如下:

REDIRECT_URL_PREFIX = "redirect:"  --重定向前綴
FORWARD_URL_PREFIX = "forward:"    --轉(zhuǎn)發(fā)前綴(默認(rèn)值)
prefix = "";     --視圖名稱前綴
suffix = "";     --視圖名稱后綴

視圖解析器

我們可以通過(guò)屬性注入的方式修改視圖的的前后綴

<!--配置內(nèi)部資源視圖解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/views/"></property>
  <property name="suffix" value=".jsp"></property>
</bean>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容