Spring MVC 體系結(jié)構(gòu)解析

Spring MVC框架模型

原理解釋:

  1. http請求
    客戶端發(fā)出一個http請求,web應(yīng)用服務(wù)器接收到這個請求,如果請求匹配DispatcherServlet的請求映射路徑,就將之轉(zhuǎn)發(fā)給DispatcherServlet處理;
  2. 尋找控制器
    DispatcherServlet接收到請求后,將根據(jù)請求的信息(包括URL,HTTP方法,請求報文頭,請求參數(shù),cookie等)及HandlerMapping的配置找到處理請求的控制器。
  3. 調(diào)用控制器
    DispatcherServlet把請求提交到Controller
  4. 業(yè)務(wù)處理
    Controller調(diào)用服務(wù)層方法處理業(yè)務(wù)邏輯
  5. 返回業(yè)務(wù)處理結(jié)果ModelAndView
    Controller的返回結(jié)果為ModelAndView
  6. 處理視圖映射
    DispatcherServlet查詢一個或多個ViewResoler視圖解析器,找到ModelAndView指定的視圖。
  7. 把模型數(shù)據(jù)傳給view顯示
  8. http響應(yīng)
    客戶端展現(xiàn)

舉個栗子:

  1. DispatcherServlet的引入和配置:
    DispatcherServlet是springMVC框架的核心控制器,是入口,在web.xml里進行引入:
  <!-- springMVC的核心控制器 -->
  <servlet>
    <servlet-name>zhong717</servlet-name>
    <servlet-class>
      org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>3</load-on-startup>
  </servlet>

引入之后需要配置攔截條件,即:符合什么條件的請求會被轉(zhuǎn)發(fā)到spring來處理,這里通過servlet-mapping來配置:

  <servlet-mapping>
    <servlet-name>zhong717</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

以上配置會把.do結(jié)尾的請求分配到spring去處理。

  1. 控制器的聲明(對應(yīng)2-5)
    控制器可以通過配置文件和注解的方式聲明,供DispatcherServlet查找。以下是注解的方式:
package com.zhong717.web;

import java.lang.Exception;
import java.util.Date;
import org.apache.log4j.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.zhong717.domain.User;
import com.zhong717.service.UserService;
import com.zhong717.common.util.Message;

@Controller
public class LoginController{
    private static Logger logger = Logger.getLogger(LoginController.class);

    @Autowired
    private UserService userService;

    @Autowired
    private Message msg;

    @RequestMapping(value = "/index.do")
    public String loginPage(){
      return "login";
    }

    @RequestMapping(value = "/loginCheck.do")
    public ModelAndView loginCheck(HttpServletRequest request,LoginCommand loginCommand){
        boolean isValidUser =
            userService.hasMatchUser(loginCommand.getUserName(),
                loginCommand.getPassword());
        if (!isValidUser) {
            return new ModelAndView("login", "error", "用戶名或密碼錯誤。");
        } else {
            User user = userService.findUserByUserName(loginCommand
                .getUserName());
            user.setLastIp(request.getLocalAddr());
            user.setLastVisit(new Date());
            userService.loginSuccess(user);
            request.getSession().setAttribute("user", user);
            logger.info(request.getParameter("password"));
            return new ModelAndView("main");
        }
    }
}

以上可以看出:
a. 引入了org.springframework.web.bind.annotation.RequestMapping來做控制器的映射
b. 使用@ Controller來聲明控制器
c. 使用@RequestMapping處理URI請求

  1. 配置視圖解析器InternalResourceViewResolver(對應(yīng)6-7)
    SpringMVC在處理器方法中通常返回的是邏輯視圖,如何定位到真正的頁面,就需要通過視圖解析器。
    SpringMVC里提供了多個視圖解析器,InternalResourceViewResolver就是其中之一:
<?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"
  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">
  <!-- 掃描web包,應(yīng)用Spring的注解 -->
  <context:component-scan base-package="com.zhong717.web"/>

  <!-- 配置視圖解析器,將ModelAndView及字符串解析為具體的頁面 -->
  <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    p:viewClass="org.springframework.web.servlet.view.JstlView"
    p:prefix="/WEB-INF/jsp/"
    p:suffix=".jsp" />
</beans>

當(dāng)處理器返回“index”時,InternalResourceViewResolver解析器會自動添加前綴和后綴:/WEB-INF/jsp/index.jsp

有個問題:

看到的所有例子和書里,實際的頁面視圖都是jsp的,不理解這是否代表著ModelAndView返回的東西只和jsp關(guān)聯(lián)?如果我不使用jsp而是用angular做前端的話,這樣好像就行不通了…

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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