Spring-mvc
什麼是SpringMvc
SpringMvc是一種基於java的實現Mvc設計模式的請求驅動型別的輕量級web框架,屬於SpringFrameWork的後續產品,已經融合在Spring Web Flow中
SpringMvc已經成為目前最主流的MVC框架之一,並且隨著Spring3.0的釋出,全面超越Struts2,成為最優秀的mvc框架,他通過一套註解,讓一個簡單的java類成為處理請求的控制器,他無需實現任何介面,同時他還支援RESTful程式設計風格的請求
Mvc設計模式介紹
MVC:Model(模組) View(檢視) Controller(控制器) 是一種設計模式,是一種業務邏輯,資料與介面顯示分離開來的方法來組織程式碼,將眾多業務邏輯整合到一個部件裡,在需要改進和個性化定製介面及使用者互動的同時,不需要重新編寫業務邏輯,達到減少編碼的時間,提高程式碼複用性。
模組層(Model)
封裝了資料與進行資料進行處理的程式碼,是實際經行資料處理的地方,也是與資料庫互動的地方
檢視層(View)
負責將應用顯示給使用者和顯示模型的狀態
控制層(controller)
f負責檢視和模型之間的互動,控制對使用者輸入的響應,響應方式和流程,他主要負責兩個方面,
一:把使用者的請求傳送到對應的模型上
二:把模型的改變及時反應到檢視上
V即View檢視:
是指使用者看到並與之互動的介面。比如由html元素組成的網頁介面,或者軟體的客戶端介面。MVC的好處之一在於它能為應用程式處理很多不同的檢視。在檢視中其實沒有真正的處理髮生,它只是作為一種輸出資料並允許使用者操縱的方式。
M即model模型:
是指模型表示業務規則。在MVC的三個部件中,模型擁有最多的處理任務。被模型返回的資料是中立的,模型與資料格式無關,這樣一個模型能為多個檢視提供資料,由於應用於模型的程式碼只需寫一次就可以被多個檢視重用,所以減少了程式碼的重複性。
C即controller控制器:
是指控制器接受使用者的輸入並呼叫模型和檢視去完成使用者的需求,控制器本身不輸出任何東西和做任何處理。它只是接收請求並決定呼叫哪個模型構件去處理請求,然後再確定用哪個檢視來顯示返回的資料。
圖片解析
最典型的MVC就是jsp+servlet+javabean模式。
JavaBean作為模型,既可以作為資料模型來封裝業務資料,又可以作為業務邏輯模型來包含應用的業務操作。其中,資料模型用來儲存或傳遞業務資料,而業務邏輯模型接收到控制器傳過來的模型更新請求後,執行特定的業務邏輯處理,然後返回相應的執行結果。
JSP作為檢視層,負責提供頁面為使用者展示資料,提供相應的表單(Form)來用於使用者的請求,並在適當的時候(點選按鈕)向控制器發出請求來請求模型進行更新。
Serlvet作為控制器,用來接收使用者提交的請求,然後獲取請求中的資料,將之轉換為業務模型需要的資料模型,然後呼叫業務模型相應的業務方法進行更新,同時根據業務執行結果來選擇要返回的檢視。
基本流程圖
下面我們用一個案例來演示jsp+servlet+javabean
步驟
1.匯入SpringMVC相關座標
2.配置SpringMVC核心控制器DispathcerServlet
3.建立Controller類和檢視頁面
4.使用註解配置Controller類中業務方法的對映地址
5.配置SpringMVC核心檔案 spring-mvc.xml
6.客戶端發起請求測試
1.匯入SpringMVC相關座標
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
2.配置SpringMVC核心控制器DispathcerServlet
<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:spring-mvc.xml</param-value>
</init-param>
<!--在伺服器啟動的時候就載入servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!--在訪問任何資源的時候都要走servlet-->
<url-pattern>/</url-pattern>
</servlet-mapping>
3.建立Controller類和檢視頁面
這裡編寫一個簡單的controller類,用於跳轉到一個success.jsp頁面
並使用註解配置Controller類中業務方法的對映地址
package com.pjh.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class controller {
@RequestMapping("/quick")
public String save(){
System.out.println("Controller save running!!");
return "success.jsp";
}
}
index.jsp頁面程式碼
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<H1>Success</H1>
</body>
</html>
4.配置SpringMVC核心檔案 spring-mvc.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"
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
">
<!--配置掃描器,這是controller層專用的配置檔案,實現了放分離-->
<context:component-scan base-package="com.pjh.controller"/>
</beans>
結果
流程圖解析
SpringMVC的執行流程圖
1.使用者傳送請求至前端控制器DispatcherServlet。
2.DispatcherServlet收到請求呼叫HandlerMapping處理器對映器。
3.處理器對映器找到具體的處理器(可以根據xml配置、註解進行查詢),生成處理器物件及處理器攔截器(如果有則生成)一併返回給4.DispatcherServlet。
5.DispatcherServlet呼叫HandlerAdapter處理器介面卡。
6.HandlerAdapter經過適配呼叫具體的處理器(Controller,也叫後端控制器)。
7.Controller執行完成返回ModelAndView。
8.HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。
9.DispatcherServlet將ModelAndView傳給ViewReslover(檢視解析器)。
10.ViewReslover解析後返回具體View。
11.DispatcherServlet根據View進行渲染檢視(即將模型資料填充至檢視中)。DispatcherServlet響應使用者。
圖解
SpringMVC元件解析
1.前端控制器:DispatcherServlet
使用者請求到達前端控制器,這就是MVC設計模式中的C(Controller),是整個流程的控制中心,由他呼叫元件來處理使用者的請求, Dispatcher的存在大大降低了元件之間的耦合性
2. 處理器對映器:HandlerMapping
HandlerMapping 負責根據使用者請求找到 Handler 即處理器,SpringMVC 提供了不同的對映器實現不同的
對映方式,例如:配置檔案方式,實現介面方式,註解方式等。
3. 處理器介面卡:HandlerAdapter
通過 HandlerAdapter 對處理器進行執行,這是介面卡模式的應用,通過擴充套件介面卡可以對更多型別的處理
器進行執行
4. 處理器:Handler
它就是我們開發中要編寫的具體業務控制器。由 DispatcherServlet 把使用者請求轉發到 Handler。由
Handler 對具體的使用者請求進行處理。
5. 檢視解析器:View Resolver
View Resolver 負責將處理結果生成 View 檢視,View Resolver 首先根據邏輯檢視名解析成物理檢視名,即具體的頁面地址,再生成 View 檢視物件,最後對 View 進行渲染將處理結果通過頁面展示給使用者。
6. 檢視:View
SpringMVC 框架提供了很多的 View 檢視型別的支援,包括:jstlView、freemarkerView、pdfView等。最常用的檢視就是 jsp。一般情況下需要通過頁面標籤或頁面模版技術將模型資料通過頁面展示給使用者,需要由程式設計師根據業務需求開發具體的頁面
SpringMVC註解解析
@RequestMapping
作用:用於建立請求 URL 和處理請求方法之間的對應關係
位置:
類上,請求URL 的第一級訪問目錄。此處不寫的話,就相當於應用的根目錄
方法上,請求 URL 的第二級訪問目錄,與類上的使用@ReqquestMapping標註的一級目錄一起組成訪問虛擬路徑
屬性:
value:用於指定請求的URL。它和path屬性的作用是一樣的
method:用於指定請求的方式
params:用於指定限制請求引數的條件。它支援簡單的表示式。要求請求引數的key和value必須和配置的一模一樣
例如:
params = {"accountName"},表示請求引數必須有accountName
params = {"moeny!100"},表示請求引數中money不能是100
示例
@Controller
@RequestMapping("/user")
public class Usercontroller {
/*跳轉到指定的頁面,用來代替web.xml配置*/
@RequestMapping(value = "/quick",method= RequestMethod.POST,params = {"username"})
public String save(){
System.out.println("Controller save running!!");
return "success.jsp";
}
}
訪問路徑:http://lcalhost:埠號/user/quick?username=xxx
請求方法必須為:Post
必須帶請求引數:username
spring名稱空間引入
名稱空間:
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
1.約束地址:
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
2. 元件掃描
SpringMVC基於Spring容器,所以在進行SpringMVC操作時,需要將Controller儲存到Spring容器中,如果使用@Controller註解標註的話,就需要使用<context:component-scan base-package=“com.itheima.controller"/>進行元件掃描。
檢視解析器的配置
SpringMVC有預設元件配置,預設元件都是DispatcherServlet.properties配置檔案中配置的,該配置檔案地址org/springframework/web/servlet/DispatcherServlet.properties,該檔案中配置了預設的檢視解析器,如下:
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
翻看該解析器原始碼,可以看到該解析器的預設設定,如下:
REDIRECT_URL_PREFIX = "redirect:" --重定向字首
FORWARD_URL_PREFIX = "forward:" --轉發字首(預設值)
prefix = ""; --檢視名稱字首
suffix = ""; --檢視名稱字尾
檢視解析器
我們可以通過屬性注入的方式修改檢視的的前字尾
<!--配置內部資源檢視解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property></bean>