SpringMVC核心

请求转发

forward : 请求
redirect: 重定向
在框架中都是关键字,有一个共同的特点,不和视图解析器一起工作。
语法: setViewName("forward:视图完整路径")。
setViewName("redirect:视图完整路径") // 框架会把简单类型数据转化为string放到url中。此时用取数据要${request.getParameter("")}取数据。
并且重定向不能访问WEB-INF下的资源
mv.addObject("msg", "data");

   @RequestMapping(value = "/forward.do", method = RequestMethod.POST)
    public ModelAndView doForward(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg", "hhhhhhhhhh");
        modelAndView.setViewName("forward:/WEB-INF/view/show.jsp");
        return modelAndView;
    }

异常处理

  • 集中异常处理(aop设计思想,代理处理)
    springmvc采用统一,全局异常处理。
    把controller中的所有异常都集中到一个地方。采用的是aop的思想,把业务逻辑和异常处理代码分开,解耦合。
  1. @ExceptionHandler
  2. @ControlerAdvice
  • 处理异常步骤:
  1. 新建maven 项目
  2. 加入依赖
  3. 自定义异常类
  4. 在controller抛出NameException,AgeException
  5. 创建一个普通类, 作用全局异常处理类
    在类上面载入@ControllerAdvice
    在类中定义方法,方法上面加入@ExceptionHandler
  6. 创建处理异常的视图页面
  7. springmvc配置文件
    组件扫描器,扫描@Controller注解
    组件扫描器,扫描@ControllerAdvice所在包名
    声明注解驱动
//必须让springmvc知道你在哪
// 声明组件扫描器

@ControllerAdvice
public class GlobalExceptionHandler {
    // 定义方法, 处理发生的异常
//    处理异常的方法和控制器方法定义地点一样
//    @ExceptionHandler(异常的class)标识发生此异常时用此方法处理
    @ExceptionHandler(value = NameException.class)
    public ModelAndView doNameException(Exception ex){
        // 通过形参获取异常信息
        // 异常发生时的处理逻辑
        // 1. 需要把异常记录下来, 记录到数据库, 日志文件
//        记录日志发生的时间,哪个方法发生的,异常错误内容
//        2. 发送通知,把一场信息通过邮件等等
//        3. 给用户提示
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","姓名必须是zs");
        mv.addObject("ex", ex);
        mv.setViewName("nameError");
        return mv;
    }

    @ExceptionHandler(value = AgeException.class)
    public ModelAndView doAgeException(Exception ex){
        // 通过形参获取异常信息
        // 异常发生时的处理逻辑
        // 1. 需要把异常记录下来, 记录到数据库, 日志文件
//        记录日志发生的时间,哪个方法发生的,异常错误内容
//        2. 发送通知,把一场信息通过邮件等等
//        3. 给用户提示
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","年龄不能大于80");
        mv.addObject("ex", ex);
        mv.setViewName("ageError");
        return mv;
    }

    // 处理其他异常  NameException ,age  以外的异常
    // 不加value时, 不是以上两种时 , 由此方法执行
    @ExceptionHandler
    public ModelAndView doOtherException(Exception ex){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","其他异常");
        mv.addObject("ex", ex);
        mv.setViewName("defaultError");
        return mv;
    }
}

拦截器

  • 拦截器是springmvc中的一种,需要实现HandlerInterceptor接口。
  • 拦截器和过滤器类似,功能方向侧重点不同,过滤器是用来过滤请求参数,设置编码集等工作。
    拦截器是拦截用户请求, 做请求做判断处理的
  • 拦截器是全局的,可以对多个Controller做拦截
    一个项目中可以有0个或者多个拦截器,他们一起拦截用户的请求。拦截器常用在:用户登录处理,权限检查,记录日志。
  • 拦截器的使用步骤:
  1. 定义类实现HandlerInterceptor接口
    实现接口中的三个方法
  2. 在springmvc配置文件中,声明拦截器,让框架知道拦截器的存在。
    组件扫描器扫描@Controller注解,声明拦截器并指定拦截的请求uri地址
  • 拦截器执行时间
    在请求处理之前,也就是controller类中的方法执行之前先被拦截。
    在控制器方法执行之后也会执行拦截器
    在请求处理完成后也会执行拦截器


  • 拦截器类

// 拦截器类 , 拦截用户请求。

public class MyHandlerInterceptor implements HandlerInterceptor {
    Long bigtime ;
    Long etime ;
    /**
     * preHandle:预处理方法
     *      整个项目的入口
     *      true,false 表示是否通过
     * Object handler: 被拦截的控制器对象
     * 返回的boolean
     * 特点在: 方法在控制器MyController的dosome之前先执行的
     * 在这个方法中可以获取请求信息,验证请求是否符合要求。
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        bigtime = System.currentTimeMillis();
        System.out.println("先处理方法");
//        request.getRequestDispatcher("/tips.jsp").forward(request,response);
        return true;
    }

    /**
     * modelAndView : 处理器方法的返回值
     * 特点:
     *   1. 在处理器方法之后执行的。
     *   2. 能够获取处理器方法的返回值ModelAndView
     *   3. 主要是可以对原来的执行结果做二次修正
     *
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv) throws Exception {
        etime = System.currentTimeMillis();
        System.out.println("postHandler");
        System.out.println(etime - bigtime);
        // 对原来的结果进行调整
        if(mv != null){
            mv.addObject("mydate", new Date());
            mv.setViewName("other");
        }
    }

    /**
     *
     *  exL程序中发生的异常
     *
     *  特点:
     *  在请求处理完成后执行的,框架中规定当你的视图处理完成后,对视图执行了forward
     *  一般做资源回收工作的,程序请求过程中创建了一些对象, 在这里创建了一些对象,在理可以先删除,把占用的内存回收
     */

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("after");
    }
}
  • springmvc配置文件
    <mvc:interceptors>
        <mvc:interceptor>
<!--            请求拦截的uri地址
                ** : 标识任意字符,多级目录和目录中的文件
    -->
            <mvc:mapping path="/**"/>
<!--            声明拦截器对象-->
            <bean class="com.lz.handler.MyHandlerInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
  • 一个拦截器处理过程


  • 多个拦截器

配置文件中先声明先执行, 框架中保存多个拦截器是ArrayList, 按照声明顺序放入ArrayList中

 <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.lz.handler.MyHandlerInterceptor"/>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.lz.handler.MyHandlerInter2"/>
        </mvc:interceptor>
    </mvc:interceptors>

执行顺序 preHandler1 --> preHandler2 ---> controller犯法---> postHandler2 --- > postHandler1 ----> after2 ----> after1

  • 拦截器执行链



拦截器和过滤器的区别

  1. 过滤器是servlet中的对象, 拦截器是框架中的对象。
  2. 过滤器实现Filter接口的对象,拦截器是实现HandlerInterceptor
  3. 过滤器是用来设置request,response参数,属性的,侧重对数据过滤的。拦截器是用来验证请求的,能阶段请求。
  4. 过滤器是在拦截器之前先执行的。
  5. 过滤器是tomcat抚慰群殴创建的对象。
    拦截器是springmvc容器中创建的对象
  6. 过滤器是一个执行时间点, 拦截器三个
  7. 过滤器可以处理jsp,js,html
    过滤器是侧重拦截对Controller的对象,如果你的请求不能被DispathcherServlet接受。
  8. 拦截器拦截普通类方法执行,过滤器过滤servlet请求响应。

拦截器实现登录验证

步骤

  1. 创建maven
  2. 修改web.xml 注册中央调度器
  3. 创建jsp发起请求
  4. 创建controller处理请求
  5. 创建结果show.jsp
  6. 创建login.jsp,模拟登陆(把用户信息放到session)
    创建jsp,loginout.jsp模拟退出(从session中删除)
  7. 创建拦截器,从session中获取用户登录数据,验证能否访问系统。
  8. 创建一个验证的jsp,如果验证视图,给出提示
  9. 创建springmvc配置文件
    组件扫描器, 声明拦截器。

springmvc执行流程

  1. 用户发起请求
  2. DispatcherServlet 接收请求some.do, 把请求转交给处理器映射器。
  3. 框架把找到的处理器对象放到一个叫处理器对象的处理器执行链的类保存。
    HandlerExecutionChain: 保存着 处理器对象(controller), 项目中所有拦截器对象
  4. HandlerExecutionChain返回个中央调度器,中央调度器把HandlerExecutionChain交给处理器适配器(HandlerAdapter), 处理器适配器执行放法,然后返回视图给中央调度器
  5. 中央调度器在将视图交给视图解析器(InternalResourceViewResolver),
    实现了ViewResolver接口,
    视图解析器作用: 组成视图完整路径,使用前缀后缀,并创建view对象。返回给中央调度器
  6. DispatcherServlet把view对象获取到后,调用view方法,把model数据放大request作用域中,执行对象视图的forward,请求结束。

处理器映射器(应该用RequestMappingHandlerMapping)

作用:处理器映射器: springmvc框架中的一种对象, 框架把实现了HandlerMapping接口的类叫做映射器(多个)。
根据请求,从springmvc容器对象中获取处理器对象。

完结。。。。。。。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容