Spring MVC 体系结构解析

Spring MVC 体系结构解析_第1张图片
Spring MVC框架模型

原理解释:

  1. http请求
    客户端发出一个http请求,web应用服务器接收到这个请求,如果请求匹配DispatcherServlet的请求映射路径,就将之转发给DispatcherServlet处理;
  2. 寻找控制器
    DispatcherServlet接收到请求后,将根据请求的信息(包括URL,HTTP方法,请求报文头,请求参数,cookie等)及HandlerMapping的配置找到处理请求的控制器。
  3. 调用控制器
    DispatcherServlet把请求提交到Controller
  4. 业务处理
    Controller调用服务层方法处理业务逻辑
  5. 返回业务处理结果ModelAndView
    Controller的返回结果为ModelAndView
  6. 处理视图映射
    DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。
  7. 把模型数据传给view显示
  8. http响应
    客户端展现

举个栗子:

  1. DispatcherServlet的引入和配置:
    DispatcherServlet是springMVC框架的核心控制器,是入口,在web.xml里进行引入:
  
  
    zhong717
    
      org.springframework.web.servlet.DispatcherServlet
    
    3
  

引入之后需要配置拦截条件,即:符合什么条件的请求会被转发到spring来处理,这里通过servlet-mapping来配置:

  
    zhong717
    *.do
  

以上配置会把.do结尾的请求分配到spring去处理。

  1. 控制器的声明(对应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(对应6-7)
    SpringMVC在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器。
    SpringMVC里提供了多个视图解析器,InternalResourceViewResolver就是其中之一:


  
  

  
  

当处理器返回“index”时,InternalResourceViewResolver解析器会自动添加前缀和后缀:/WEB-INF/jsp/index.jsp

有个问题:

看到的所有例子和书里,实际的页面视图都是jsp的,不理解这是否代表着ModelAndView返回的东西只和jsp关联?如果我不使用jsp而是用angular做前端的话,这样好像就行不通了…

你可能感兴趣的:(Spring MVC 体系结构解析)