zoukankan      html  css  js  c++  java
  • Servlet3.0与springmvc那些事

     官方文档:https://docs.spring.io/spring/docs/5.0.2.RELEASE/spring-framework-reference/web.html#mvc-servlet-context-hierarchy

    以前开发web工程:servlet、filter、listener都需要在web.xml进行注册,包括springmvc的前端控制器DispatcherServlet也需要在web.xml进行注册,现在用【注解】方式快速搭建一个web应用:

    1、servlet3.0需要tomcat7.0以上版本进行支持

    2、创建动态web工程(Dynamic Web Project),领略以下原生版servlet:

    步骤如下:

    2.1)创建工程

      

    2.2)新建jsp页面

    2.3)新增一个请求地址

    2.4)新增一个原生servlet来处理order请求

    发布到tomcat,然后启动测试

    浏览器访问jsp或者直接访问:

    可以访问到工程,当然这些注解不是重点,原生的servlet开发很少人用。。

    阅读servlet 3.0 API文档

    4、Shared libraries(共享库)and runtimes pluggability(运行时插件)的原理,在后面的框架整合里。用的比较多

    ServletContainerInitializer初始化web容器:

    在web容器启动时为提供给第三方组件机会做一些初始化,例如注册servlet或者filter等,servlet规范(JSR356)中通过ServletContainerInitializer实现此功能。

    从上图可以知道,每个框架要使用ServletContainerInitializer就必须:

    在对应的jar包的META-INF/services目录下创建一个名为javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer实现类,那么,当web容器启动时就会运行这个初始化器做一些组件内的初始化工作。

    步骤如下:

    4.1)创建META-INF/services目录

     4.2)创建javax.servlet.ServletContainerInitializer文件

    如下

    4.3)新建HongServletContainerInitializer实现ServletContainerInitializer

    创建感兴趣的类型及其子类

    4.4)编辑javax.servlet.ServletContainerInitializer文件内容

     

     4.5)一般伴随着ServletContainerInitializer一起使用的还有HandlesTypes注解,通过HandlesTypes可以将感兴趣的一些类注入到ServletContainerInitializeronStartup方法作为参数传入

     4.6)启动tomcat测试,看打印日志,不难发现,都拿到了,可以根据需要来反射创建对象

     

    这其实就是基于运行时插件的机制,启动并运行这个ServletContainerInitializer,在整合springmvc的时候会用到

    4.7)接下来看下ServletContext arg1,使用ServletContext注册web组件(其实就是Servlet,Filter,Listener三大组件),

    对于我们自己前面写的HongServlet,我们可以使用@WebServlet注解来加入HOngServlet组件,

    但若是我们要导入第三方阿里的连接池或filter,以前的web.xml方式就可通过配置加载就可以了,但现在我们使用ServletContext注入进来;

    创建三个组件:

    1)新建OrderFilter过滤器

    2)新建OrderListener.java监听类

     

    3)新建OrderServlet类

    4)使用ServletContext来注册上面新建的三个组件

     

    注意:在运行的过程中,是不可以注册组件, IOC道理一样,出于安全考虑

     运行tomcat

     5)利用以上机制来整合springmvc;创建一个新的maven工程,springmvc注解版

           

    5.1)创建完工程后,pom.xml会报错,老铁们,怎么办???不要慌,哈哈看下面吧

    做个设置即可

    再右键工程名,update更新一下maven配置就不会有错

     

    5.2)加入依赖jar包

     5.3)导入依赖包后,查看maven的一个spring-web.jar

     

    打开ServletContainerInitializer这个文件

    5.4)打开SpringServletContainerInitializer源码类

     

     5.5)打开WebApplicationInitializer源码看看组件及实现(ctrl+t

     

    子类AbstractContextLoaderInitializer作用:

    子类AbstractDispatcherServletInitializer的作用:从名字来看可知是DispatcherServlet初始化

    子类AbstractAnnotationConfigDispatcherServletInitializer:注解方式配置的dispatcherServlet初始化器

    root根容器与servlet容器的区别在哪呢?父子容器

    很明显,servlet的容器用来处理@Controller,视图解析,和web相关组件

    root根容器主要针对服务层,和数据源DAO层及事务控制相关处理(图源自spring官网)

    https://docs.spring.io/spring/docs/5.0.2.RELEASE/spring-framework-reference/web.html#mvc-servlet-context-hierarchy

    接下来我们根据这些来配置操作一下

     6.与springmvc的整合流程。

    操作步骤

    新建HongWebInitializer继承AbstractAnnotationConfigDispatcherServletInitializer

    新建两个配置类HongRootConfigHongAppConfig,形成父子容器的效果

     

    新建控制类

    服务类

    注意:JamesWebAppInitializer还需要指定配置类(配置文件)位置,修改以下返回

     

    重启tomcat,进行测试

     

    这就使用注解的方式(配置类)来完成配置springmvc的整合

    作者:howtosay
             
    放牛娃的个人笔记整理,每天记录一点点,进步一点点
  • 相关阅读:
    Spring整合MyBatis (使用扫描包配置mapper代理)
    spring扫描配置文件
    文件上传解析器
    Jackson介绍(1)-jackson2.x与Jackson1.9的比较
    SpringMVC中使用RedirectAttributes重定向传参,防止暴露参数
    Spring中Model,ModelMap以及ModelAndView之间的区别
    浅谈@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别
    Vagrant 创建虚拟环境
    centos安装VirtualBox增强包VBoxGuestAdditions
    Vagrant 命令详解
  • 原文地址:https://www.cnblogs.com/hongzm/p/10663748.html
Copyright © 2011-2022 走看看