资讯专栏INFORMATION COLUMN

SpringMVC之源码分析--Controller(二)

KevinYan / 2310人阅读

摘要:概述上篇文章主要分析了提供的及抽象类,本章继续分析其具体的几个实现类。源码由继承关系继承抽象类,并实现模板方法,完成将接收的请求进行转发,源码如下实现父类模板方法获取部署文件中定义的,传入参数。

概述

上篇文章主要分析了Spring提供的Controller及抽象类AbstractController,本章继续分析其具体的几个实现类。

本系列文章是基于Spring5.0.5RELEASE。

ServletForwardingController

作用

ServletForwardingController实现的功能是将接收的用户请求转发给你一个命名的servlet去处理,该命名servlet需在部署描述(web.xml)文件中定义。

源码

由继承关系ServletForwardingController继承AbstractController抽象类,并实现模板方法handleRequestInternal,完成将接收的请求进行转发,源码如下:

/**
 *实现父类模板方法
 */
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
        throws Exception {

    ServletContext servletContext = getServletContext();
    Assert.state(servletContext != null, "No ServletContext");
    // 获取部署文件中定义的servlet,传入servelet name参数。
    RequestDispatcher rd = servletContext.getNamedDispatcher(this.servletName);
    if (rd == null) {
        throw new ServletException("No servlet with name "" + this.servletName + "" defined in web.xml");
    }

    // 判断是否是include请求
    if (useInclude(request, response)) {
        // 是include请求,继续使用include
        rd.include(request, response);
        if (logger.isDebugEnabled()) {
            logger.debug("Included servlet [" + this.servletName +
                    "] in ServletForwardingController "" + this.beanName + """);
        }
    }
    else {
        // 非include请求,进行转发
        rd.forward(request, response);
        if (logger.isDebugEnabled()) {
            logger.debug("Forwarded to servlet [" + this.servletName +
                    "] in ServletForwardingController "" + this.beanName + """);
        }
    }

    return null;
}

实战

编写servlet,代码如下:

public class ForwardServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("hello ForwardServlet...");
    }
}

配置部署描述文件,代码如下:


    forwording
    com.github.dalianghe.controller.ForwardServlet
  

配置Spring配置文件,代码如下:


    

测试

编写完以上代码,启动系统并请求,地址:http://localhost:8086/forwardToServlet,请求将通过ServletForwardingController转发到Servlet进行处理,最终在界面如图:

ParameterizableViewController

作用

根据参数的逻辑视图名直接选择需要展示的视图,只支持GET、HEAD请求方法类型。

源码

核心处理方法源码如下:

/**
 *处理请求
 */
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
        throws Exception {
    //获取配置的viewName属性
    String viewName = getViewName();
    
    ... ...

    // 把视图逻辑名设置到ModelAndView中
    if (getViewName() != null) {
        modelAndView.setViewName(viewName);
    }
    else {
        modelAndView.setView(getView());
    }
    return (isStatusOnly() ? null : modelAndView);
}

实战

因为此部分使用jsp视图,故需引入jstl支持,在pom文件中添加依赖坐标,如下:


  javax.servlet
  jstl
  1.2

在Spring配置文件中,添加相关配置,如下:



    
    
    
    
    



    

在WEB-INF下新建jsp文件夹及test.jsp文件,文件内容如下:


    
        My Frist JSP
    
    
        

hello jsptest

测试

启动服务,进行测试,访问/helloJSP,结果如下:

测试结果表明,我们并未编写Controller,通过配置接口实现通过Spring转发到视图。

UrlFilenameViewController

作用

作用与ParameterizableViewController一样,但功能强大很多,支持模式匹配。

示例

以下提供两种示例,可做为参考,如下:





本类不做演示了,有兴趣的可以自行验证,有问题可以留言或加入qq群反馈。

总结

本章主要分析并演示了Spring提供Controller接口的实现类,目前来说用的很多,有些我也不是很明白,有讲解错误的地方,还望指定,真心的希望能与大家一起进步。

最后创建了qq群方便大家交流,可扫描加入,同时也可加我qq:276420284,共同学习、共同进步,谢谢!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69586.html

相关文章

  • SpringMVC源码分析--ViewResolver(

    摘要:概述上篇学习了视图解析器作用及处理流程,为我们提供了丰富的视图解析器见下图本系列文章是基于。该视图解析器是根据处理器返回的逻辑视图名称,在应用上下文中查找该名称的视图对象视图对象就是的对象。 概述 上篇学习了Spring MVC ViewResolver视图解析器作用及处理流程,Spring为我们提供了丰富的视图解析器(见下图):showImg(https://segmentfault...

    jas0n 评论0 收藏0
  • SpringMVC源码分析--ThemeResolver(

    摘要:类实现接口,使用用户会话中的主题。新增并更换一张不同的图片。通过关闭浏览器,然后再访问进行测试总结本章通过拦截器和结合实现了通过请求参数控制会话主题。 概述 本章继续分析ThemeResolver的另一个实现类SessionThemeResolver,需要了解Spring MVC Theme情况的,可参考上一篇文章https://segmentfault.com/a/119000001...

    antyiwei 评论0 收藏0
  • SpringMVC源码分析--LocaleResolver(

    摘要:概述上一篇就默认的进行了分析,详细请参考,本节我们继续分析学习,主要分析解析器类继承关系如下图由上面类图可知,继承并实现接口,主要是操作的工具类,继承接口,增加了信息操作。即通过实现的选择。 概述 上一篇就Spring MVC默认的LocaleResovler(AcceptHeaderLocaleResolver)进行了分析,详细请参考https://segmentfault.com/...

    RichardXG 评论0 收藏0
  • SpringMVC源码分析--Controller(一)

    摘要:总结本章主要分析了接口抽象类以及对自定义的几个重要属性进行了测试,希望对大家有帮助,谢谢。 概述 Controller是Spring MVC为我们提供的基础的控制器接口,和HttpServlet一样,接收request和response参数处理用户请求,并返回ModelAndView,从概念上可以类比Struts的Action。 Controller主要实现的如下功能: 接收并处理用...

    CKJOKER 评论0 收藏0
  • SpringMVC源码分析--HandlerMapping(四)

    摘要:默认支持该策略。以上是对的宏观分析,下面我们进行内部细节分析。整体流程一通过实现接口,完成拦截器相关组件的初始化调用类的方法。总结本文主要分析了的初始化过程,希望对大家有帮助。随着学习的深入,后面有时间在分析下期中涉及的关键,比如等等。 概述 本节我们继续分析HandlerMapping另一个实现类ReqeustMappingHandlerMapping,该类是我们日常开发中使用最多的...

    imccl 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<