当前位置: 首页 > 后端技术 > Java

PowerNodeSpring框架学习笔记-王鹤(五)Spring与Web

时间:2023-04-01 13:44:29 Java

第五章Spring与Web官方下载地址http://www.bjpowernode.com/视频观看地址https://www.bilibili.com/vide...要想在Web项目中使用Spring框架,首先要解决的是web层获取Spring容器(这里指Servlet)的问题。只要在web层获取到Spring容器,就可以从容器中获取到Service对象。5.1使用Spring的Web项目(理解)示例:springWeb项目(在spring-mybatis基础上修改)Step1:新建一个MavenProject类型maven-archetype-webappStep2:将代码、配置文件、jar复制到spring-mybatis工程如下将内容复制到当前工程:(1)Service层和Dao层的所有代码(2)配置文件applicationContext.xml和jdbc.properties、mybatis.xml(3)pom.xml(4)添加servlet,jsp依赖,在一些pom.xml文件中添加如下内容:javax.servletjavax.servlet-api3.1.0providedjavax.servlet.jspjsp-api2.2.1-b03providedStep3:定义索引页Step4:定义RegisterServlet(关键代码)Step5:定义成功页面Step6:web.xml注册ServletStep7:运行结果分析提交表单时,跳转到success.jsp,多次刷新页面,查看后台输出,发现每次刷新页面时,都会新建一个Spring容器已创建。即每提交一个请求,都会创建一个新的Spring容器。对于一个应用程序,只需要一个Spring容器。因此,将Spring容器的创建语句放在Servlet的doGet()或doPost()方法中是有问题的。此时可以认为,Spring容器的创建是在Servlet初始化时,即执行init()方法时进行的。而且Servlet还是单实例多线程的,即一个业务只有一个Servlet实例,所有执行业务的用户都执行这个Servlet实例。这样,Spring容器就独树一帜了。但是Servlet是一个业务的Servlet实例,也就是只有一个LoginServlet,但是还会有StudentServlet,TeacherServlet等,每个业务都会有一个Servlet,会执行自己的init()方法,会创建一个弹簧容器。这样,Spring容器又不是唯一的了。5.2使用Spring的监听器ContextLoaderListener(master)示例:springweb-2项目(在spring-web项目的基础上修改)对于Web应用来说,ServletContext对象是唯一的。一个Web应用程序只有一个ServletContext对象,它在Web应用程序加载时被初始化。如果Spring容器的创建时机放在ServletContext初始化时,可以保证Spring容器的创建只会执行一次,也保证了Spring容器在整个应用中的唯一性。Spring容器创建后,应该在整个应用程序生命周期中随时可以访问。也就是说,Spring容器应该是全局的。放入ServletContext对象的属性对于应用程序是全局的。因此,将创建的Spring容器以属性的形式放入ServletContext空间,保证了Spring容器的全局性。以上工作已经封装在如下SpringJar包的相关API中:spring-web5.2.5.RELEASE第一步:maven依赖pom.xmlorg.springframeworkspring-web5.2.5.RELEASEStep2:注册监听ContextLoaderListener在ServletContext初始化时创建Spring容器,需要使用监听接口ServletContextListener对ServletContext进行监听.在web.xml中注册监听器。Spring为监听器接口定义了一个实现类ContextLoaderListener,完成了两个非常重要的任务:创建容器对象,将容器对象放入ServletContext的空间中。打开ContextLoaderListener的源码。看到一共四个方法,两个是构造方法,一个是初始化方法,一个是销毁方法。所以这四个方法中比较重要的应该是上下文初始化方法contextInitialized()。跟踪initWebApplicationContext()方法,可以看到其中创建了一个容器对象。并且,将创建的容器对象放到ServletContext的空间中,key是一个常量:WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE。Step3:指定Spring配置文件的位置ContextLoaderListener在创建Spring容器时需要加载Spring配置文件。其默认的Spring配置文件位置和名称为:WEB-INF/applicationContext.xml。但是配置文件一般是放在项目的classpath下,也就是src下,所以需要在web.xml中指定Spring配置文件的位置和名称。从监听器ContextLoaderListener的父类ContextLoader的源码可以看出要读取的配置文件的location参数名contextConfigLocation。Step4:获取Spring容器对象Servlet中常见的获取容器对象的方式有两种:(1)直接从ServletContext中获取从监听器ContextLoaderListener的源码分析可以看出,容器对象在ServletContext中存储的key是WebApplicationContext。ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTe.因此,可以直接通过ServletContext的getAttribute()方法根据指定的key获取容器对象。(2)通过WebApplicationContextUtils获取工具类WebApplicationContextUtils有一个方法专门用于从ServletContext获取Spring容器对象:getRequiredWebApplicationContext(ServletContextsc)调用Spring提供的获取容器对象的方法:查看其源码,查看其调用关系,可以看出是从Spring容器ServletContext中读取的属性值。以上两种方法,不管是哪一种都是用来获取容器对象的,刷新成功页面后,可以看到代码中使用的Spring容器是同一个对象。