美文网首页
Spring MVC 体系结构解析

Spring MVC 体系结构解析

作者: zhong | 来源:发表于2018-01-09 19:00 被阅读0次
    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里进行引入:
      <!-- springMVC的核心控制器 -->
      <servlet>
        <servlet-name>zhong717</servlet-name>
        <servlet-class>
          org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>3</load-on-startup>
      </servlet>
    

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

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

    以上配置会把.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就是其中之一:
    <?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包,应用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>
    

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

    有个问题:

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

    相关文章

      网友评论

          本文标题:Spring MVC 体系结构解析

          本文链接:https://www.haomeiwen.com/subject/uiqrnxtx.html