Java程序员从笨鸟到菜鸟(十四)springmvc详解

MVC的原理图:

MVC流程:

 

  1. 用户发起请求给控制器Controller
  2. Controller将请求交给模型层处理
  3. 模型层返回一个对象,Controller根据返回结果跳转响应界面
  4. 将返回结果传给View层,渲染视图
  5. 响应用户

SpringMVC工作原理图:

SpringMVC流程

 

  1. 用户发送请求给前端控制器DispatcherServlet
  2. DispatcherServlet收到请求并调用HandlerMapping处理器映射器
  3. HandlerMapping根据XML等文件寻找具体的处理器,生成处理器对象和拦截器一并返回给DispatcherServlet
  4. DispatcherServlet调用HandlerAdapter处理器适配器
  5. HandlerMapper调用具体的Controller(后端控制器)
  6. Controller执行完成生成ModelAndView,并返回给DispatcherServlet
  7. DispatcherServlet将ModelAndView传给视图解析器ViewResolver
  8. ViewResolver解析得到view并返回给DispatcherServlet
  9. DispatcherServlet将收到的视图进行渲染(将模型数据填充到视图中)
  10. DispatcherServlet响应用户

DispatcherServlet:整个SpringMVC的核心,负责接收HTTP请求组织协调SpringMVCd的哥哥组成部分,主要工作有:

 

  1. 截获符合特定个事的URL请求
  2. 初始化DIspatcherServlet上下文对应的ApplicationContext,并将其与也无从,持久化层的WebApplicationContext建立关联
  3. 初始化SpringMVC的各个组件,并装配到DispatcherServlet

实现权限拦截:

1. 实现 HandlerInterceptor 接口

定义了 3 个方法: preHandle()、postHandle()、afterCompletion()

在 spring 中,还提供了另外一个接口和抽象类,实现了 HandlerInterceptor 接口的功能扩展,分别为:AsyncHandlerInterceptor 和 HandlerInterceptorAdapter

对于 AsyncHandlerInterceptor 接口,在其继承 HandlerIntercetor 接口的同时,又声明了一个 afterConcurrentHandlingStarted();而 HandlerInterceptorAdapter 抽象类,在继承 AsyncHandlerInterceptor 的同时,又复写了 preHandle 方法

  • preHandle(HttpServletRequest request, HttpServletResponse response, Object handle) 方法,在请求处理之前调用,在一个应用中或者说是在一个请求中可以同时存在多个 Interceptor,而且最先执行的都是 Interceptor 中的 preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求做一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值 Boolean 类型的,当它返回为 false 时,表示请求结束,后续的 Interceptor 和 Controller 都不会再执行;当返回值为 true 时,就会继续调用下一个 Interceptor 的 preHandle 方法,如果已经是最后一个 Interceptor 的时候,就会是调用当前请求的 Controller 中的方法
  • postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView)方法,只有在 preHandle() 方法返回 true 的时候,才能被调用;postHandle() 方法在请求方法之后执行,也就是在 Controller 中的方法调用之后执行,但是它会在 DispatcherServlet 进行视图返回渲染之前被调用,所以咱们可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作;postHandle 方法被调用的方向跟 preHandle 是相反的,也就是说,先声明的 Interceptor 的 postHandle 方法反而会后执行

源代码:

HandlerInterceptor 接口:

package org.springframework.web.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface HandlerInterceptor {

    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception;

    void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception;

    void afterCompletion(
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception;
}

AsyncHandlerInterceptor 接口

package org.springframework.web.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface AsyncHandlerInterceptor extends HandlerInterceptor {

    void afterConcurrentHandlingStarted(
            HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception;
}

HandlerInterceptorAdapter 抽象类

package org.springframework.web.servlet.handler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.AsyncHandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * Abstract adapter class for the HandlerInterceptor interface,
 * for simplified implementation of pre-only/post-only interceptors.
 *
 * @author Juergen Hoeller
 * @since 05.12.2003
 */
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {

    /**
     * This implementation always returns {@code true}.
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
        return true;
    }

    /**
     * This implementation is empty.
     */
    public void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception {
    }

    /**
     * This implementation is empty.
     */
    public void afterCompletion(
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
    }

    /**
     * This implementation is empty.
     */
    public void afterConcurrentHandlingStarted(
            HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
    }
}

以继承 HandlerInterceptorAdapter 抽象类进行演示

package com.hit.interceptor;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author 维C果糖
 * @create 2017-03-31
 */

public class WrongCodeInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("WrongCodeInterceptor, preHandle......");
        return true;
    }

    @Override
    public void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception {
        System.out.println("WrongCodeInterceptor, postHandle......");
    }

    @Override
    public void afterCompletion(
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("WrongCodeInterceptor, afterCompletion......");
    }

    @Override
    public void afterConcurrentHandlingStarted(
            HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("WrongCodeInterceptor, afterConcurrentHandlingStarted......");
    }
}

2. 实现 WebRequestInterceptor 接口

定义了 3 个方法: preHandle()、postHandle()、afterCompletion(),而且这 3 个方法都传递了同一个参数 WebRequest,WebRequest 是 Spring 中定义的一个接口,它里面的方法定义跟 HttpServletRequest 类似,在WebRequestInterceptor中对 WebRequest 进行的所有操作都将同步到 HttpServletRequest 中,然后在当前请求中依次传递,Spring 框架中也提供了一个抽象类 WebRequestInterceptorAdapter

接口三个函数:

  • preHandle(WebRequest request),方法返回类型是 void,主要用它来进行资源的准备工作

权限拦截内容传送门:https://blog.csdn.net/qq_35246620/article/details/68487904 非常感谢

 

事务几种实现方式:

1.编程式事务管理,需要 beginTransaction、commit、rollback 等操作

2.基于 TransactionFroxyFactoryBean 声明式事务管理

3.基于 @Transaction 的声明式事务管理

4.基于 AspectJ AoP 配置事务

 

版权声明:欢迎转载, 转载请保留原文链接。https://mp.csdn.net/postedit/80230522

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值