溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringMVC簡介與配置

發(fā)布時間:2020-07-22 02:52:22 來源:網絡 閱讀:752 作者:o鳳舞九天o 欄目:開發(fā)技術

1.Spring MVC簡介

Spring MVC框架是有一個MVC框架,通過實現(xiàn)Model-View-Controller模式來很好地將數(shù)據(jù)、業(yè)務與展現(xiàn)進行分離。從這樣一個角度來說,Spring MVC和Struts、Struts2非常類似。Spring MVC的設計是圍繞DispatcherServlet展開的,DispatcherServlet負責將請求派發(fā)到特定的handler。通過可配置的handler mappings、view resolution、locale以及theme resolution來處理請求并且轉到對應的視圖。Spring MVC請求處理的整體流程如圖:


SpringMVC簡介與配置

Spring3.x中定義一個控制器類,必須以@Controller注解標記。當控制器類接收到一個請求時,它會在自己內部尋找一個合適的處理方法來處理請求。使用@RequestMapping注解將方法映射到一些請求上,以便讓該方法處理那些請求。這種方法就像一般的類中的方法,方法名參數(shù)列表和返回值并不像Struts2之類的框架有很強的限制。方法參數(shù)列表具體以及返回值具體都有哪些,這里先不細說。這篇博客的目的在于簡單介紹如何快速上手使用Spring MVC框架。


控制器在選擇好適合處理請求的方法時,傳入收到的請求(根據(jù)方法參數(shù)類型,可能以不同的類型傳入),并且調用該方法中的邏輯來進行處理(也可以是調用Service來真正處理)。方法邏輯可能也會在參數(shù)中添加或者刪除數(shù)據(jù)。處理方法處理完之后,會委派給一個視圖,由該視圖來處理方法的返回值。處理程序的返回值并不代表視圖的具體實現(xiàn),可以只是String類型,代表視圖名,甚至是void(這時候Spring MVC可以根據(jù)方法名或者控制器名找默認視圖)。也不需要擔心返回值只是視圖名稱的話,視圖拿不到要顯示的數(shù)據(jù)。因為方法參數(shù)對于視圖來說也是可以拿到的。比如說,如果處理方法以Map為參數(shù),那么這個Map對于視圖也是可以拿到的。


返回的視圖名稱會返回給DispatcherServlet,它會根據(jù)一個視圖解析器將視圖名稱解析為一個具體的視圖實現(xiàn)。這里說到的視圖解析器是一個實現(xiàn)了ViewResolver借口的Bean,它的任務就是返回一個視圖的具體實現(xiàn)(HTML、JSP、PDF等等).


2.Spring MVC版本的helloworld


接下來我們用Spring MVC開發(fā)一個最最簡單的Web應用。首先創(chuàng)建一個Dynamic Web Project。為了方便起見,我們將Spring dist目錄下的所有jar包放到WEB-INF/lib目錄下。這里我是用的是Spring3.1.x版本。此外還需要添加commons-logging包。


接下來在web.xml文件中配置DispatcherServlet,在web.xml文件中添加如下片段:


<servlet>

    <servlet-name>hello</servlet-name>

    <servlet-class>

        org.springframework.web.servlet.DispatcherServlet

    </servlet-class>

    <load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

    <servlet-name>hello</servlet-name>

    <url-pattern>/</url-pattern>

</servlet-mapping>

這里我們將DispatcherServlet命名為hello,并且讓它在web項目一啟動就加載。接下來我們需要在WEB-INF目錄下創(chuàng)建一個hello-servlet.xml的Spring配置文件。Spring官方文檔上推薦的默認的文件名是[servlet-name]-servlet.xml文件,這里servlet-name叫hello,因此,這個文件也就是叫hello-servlet.xml。在這個文件中可以定義各種各樣的Spring MVC需要使用的Bean。需要說明的是,對于整個Web項目中的Spring配置文件中定義的Bean在這個配置文件中是可以繼承的,反過來不成立。上面我們將所有的請求都交給DispatcherServlet。


現(xiàn)在我們定義一個控制器類HelloController:


package springmvc.controller;

 

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

 

@Controller

public class HelloController {

     

    @RequestMapping(value="/hello",method=RequestMethod.GET)

    public String sayHello(Model model) {

        model.addAttribute("msg", "Hello, World!");

        return "hello";

    }

}

首先通過@Controller注解標示這個類是一個控制器,接下來通過@RequestMapping注解為制定方法sayHello處理哪些請求,在這個例子中,sayHello方法僅僅處理GET類型的/hello請求。


sayHello方法接收一個org.springframework.ui.Model類型的參數(shù)model,SpringMVC會自動將請求參數(shù)封裝進model中,我們可以簡單的把model理解為一個Map。我們在方法中從model中取出參數(shù)person的值并且打印出來,接下來往model中添加一個屬性msg,值為"Hello,World!",然后返回視圖名稱hello。


接下來我們需要在Spring MVC配置文件中配置一個視圖解析器,我們看看hello-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:p="http://www.springframework.org/schema/p"

    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-3.0.xsd

    http://www.springframework.org/schema/context

    http://www.springframework.org/schema/context/spring-context-3.0.xsd

    http://www.springframework.org/schema/mvc 

    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

 

    <!-- 默認的注解映射的支持 -->

    <mvc:annotation-driven />

    <!--啟用自動掃描  -->

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

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="prefix" value="/WEB-INF/jsp/" />

        <property name="suffix" value=".jsp" />

    </bean>

</beans>

前面沒什么好說的,但是注意添加了mvc名稱空間,接下來啟用了spring的自動掃描,并且設置了默認的注解映射支持。這里需要重點解釋的是配置文件中的那個bean。它的類型是是Spring MVC中最常用的一種視圖解析器,當然還有很多其他的類型,由于這篇博客的重點在于簡單的介紹Spring MVC,因此不重點介紹,后續(xù)博文會補充。prefix屬性是指視圖前綴,suffix是視圖后綴,這里配置的是.jsp,我們在控制器的方法sayHello中返回的是hello,再結合這里的配置,對應的完整的視圖是:/WEB-INF/jsp/hello.jsp。接下來我們完成這個視圖,我們只是簡單的取出我們放的信息msg:


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>hello.jsp</title>

</head>

<body>

    ${msg}

</body>

</html>

接下來部署應用,我們訪問http://localhost:8080/springmvc/hello ,會顯示視圖的內容,并且取出了msg的內容:


SpringMVC簡介與配置

就這樣一個簡單的Spring MVC的Web應用就ok了。


核心架構的具體流程步驟如下:

1、  首先用戶發(fā)送請求——>DispatcherServlet,前端控制器收到請求后自己不進行處理,而是委托給其他的解析器進行處理,作為統(tǒng)一訪問點,進行全局的流程控制;

2、  DispatcherServlet——>HandlerMapping, HandlerMapping將會把請求映射為HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象,通過這種策略模式,很容易添加新的映射策略;

3、  DispatcherServlet——>HandlerAdapter,HandlerAdapter將會把處理器包裝為適配器,從而支持多種類型的處理器,即適配器設計模式的應用,從而很容易支持很多類型的處理器;

4、  HandlerAdapter——>處理器功能處理方法的調用,HandlerAdapter將會根據(jù)適配的結果調用真正的處理器的功能處理方法,完成功能處理;并返回一個ModelAndView對象(包含模型數(shù)據(jù)、邏輯視圖名);

5、  ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver將把邏輯視圖名解析為具體的View,通過這種策略模式,很容易更換其他視圖技術;

6、  View——>渲染,View會根據(jù)傳進來的Model模型數(shù)據(jù)進行渲染,此處的Model實際是一個Map數(shù)據(jù)結構,因此很容易支持其他視圖技術;

7、返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結束。

 

此處我們只是講了核心流程,沒有考慮攔截器、本地解析、文件上傳解析等,后邊再細述。

 

到此,再來看我們前邊提出的問題:

 

 

1、  請求如何給前端控制器?這個應該在web.xml中進行部署描述,在HelloWorld中詳細講解。

2、  前端控制器如何根據(jù)請求信息選擇頁面控制器進行功能處理? 我們需要配置HandlerMapping進行映射

3、  如何支持多種頁面控制器呢?配置HandlerAdapter從而支持多種類型的頁面控制器

4、  如何頁面控制器如何使用業(yè)務對象?可以預料到,肯定利用Spring IoC容器的依賴注入功能

5、  頁面控制器如何返回模型數(shù)據(jù)?使用ModelAndView返回

6、  前端控制器如何根據(jù)頁面控制器返回的邏輯視圖名選擇具體的視圖進行渲染? 使用ViewResolver進行解析

7、  不同的視圖技術如何使用相應的模型數(shù)據(jù)? 因為Model是一個Map數(shù)據(jù)結構,很容易支持其他視圖技術

 

在此我們可以看出具體的核心開發(fā)步驟:

1、  DispatcherServlet在web.xml中的部署描述,從而攔截請求到Spring Web MVC

2、  HandlerMapping的配置,從而將請求映射到處理器

3、  HandlerAdapter的配置,從而支持多種類型的處理器

4、  ViewResolver的配置,從而將邏輯視圖名解析為具體視圖技術

5、處理器(頁面控制器)的配置,從而進行功能處理


附件:http://down.51cto.com/data/2367670
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI