写在前面:
接着记录自己的Spring学习之旅,若看不懂则建议先看前几篇博文,详细代码可在我的Gitee仓库ssm-learning克隆下载学习使用!
根据SSM框架之Spring介绍开发流程/IDEA如何建立Spring项目搭建一个简单的项目并配置好所缺目录,如图
1.8.1.2 添加web层所需依赖在pom文件中添加web所需资源依赖并更新,如图
1.8.1.3 添加Web层在dao层同级目录下创建Web目录,并于其中新建UserServlet类,并继承HttpServlet类重写doGet方法,如图
1.8.1.4 添加Servlet配置在webapp下的WEB-INF目录下找到web.xml文件于其中进行配置,如图
代码如下:
1.8.1. 5 Tomcat下载与安装UserServlet com.demo.web.UserServlet UserServlet /UserServlet
由于maven所带Tomcat插件功能单一且不符合我们的实际需求,所以必须借助于外部的Tomcat服务器
1.8.1.5.1 找到Tomcat官网点击https://tomcat.apache.org/进入到官网,并点击Tomcat9跳转下载,如图![[Pasted image 20211115161347.png]]
1.8.1.5.2 下载选择64-bit Windows zip此文件,点击下载,如图
1.8.1.5.3 安装此版本为绿色免安装版,解压后即可,如图
1.8.6 部署到Tomcat服务器上 1.8.1.6.1 寻找Tomcat- 如图点击它,
- 在Templates中找到Tomcat,如图
- 找到tomcat后点击creaate configuration,如图
- 按图操作添加刚配置好的项目,如图
- 选择带有exploded的,如图
- 配置本地Tomcat,如图,将之前解压好的目录填写进去
- 配置完成后如图
- 运行Tomcat服务器,如图
- 会在浏览器中看到hello World!提示语,然后在地址栏输入UserServlt,如图
- 回车后啥也没有,别慌,因为确实没写,控制台出现如图即为成功
应用上下文对象是通过new ClasspathXmlApplicationContext(Spring配置文件)方式获取,而且每次调用都要获取,从而造成配置文件加载多次,应用上下文创建多次,从而就诞生了ContextLoadListener监听器来解决这个问题。
1.8.2.2 解决方案在Web项目中,可以使用ServletContextListener监听器监听Web应用启动,使用方式:
这样就能从任意位置获得应用上下文对象ApplicationContext。
1.8.2.3 自定义监听器 1.8.2.3.1 创建监听器在本节中创建的项目中dao同级目录下创建listener包,并于其中新建名为ContextLoadListener的类,代码如下:
public class ContextLoadListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 将spring的应用上下文对象存储到ServletContext域中
ServletContext servletContext = sce.getServletContext();
servletContext.setAttribute("app",applicationContext);
System.out.println("Spring监听器启动,容器启动完成!");
}
}
1.8.2.3.2 配置监听器
在web.xml中加入如下代码进行配置
1.8.2.3.3 测试com.demo.listener.ContextLoadListener
更改测试代码,如图
从ServletContext中拿取上下文对象applicationContext
运行后可在控制台看到输出了如图信息,
当在浏览器中继续如图操作时,
控制台仍然会出现想要的信息,如图
在ContextLoadListener中是直接用ClassPathXmlApplicationContext读取配置文件,若改了配置文件的命名,则需要改代码,较为复杂,耦合性高,需要解耦。同时获取ApplicationContext对象时必须记住存储到ServletContext域中的名称,不便于开发管理。
1.8.2.4.2 解决方案- 在web.xml中用Context-param标签进行全局初始化,代码如下:
ContextConfigurationLocation applicationContext.xml
- 在ContextLoadListener中用ServletContext来直接获取核心配置文件名,代码如下:
public class ContextLoadListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
String contextConfigurationLocation = servletContext.getInitParameter("ContextConfigurationLocation");
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(contextConfigurationLocation);
// 将spring的应用上下文对象存储到ServletContext域中
servletContext.setAttribute("app",applicationContext);
System.out.println("Spring监听器启动,容器启动完成!");
}
}
- 设置工具类单独来获取存储到ServletContext域中的ApplicationContext对象,如图
- 同时UserServlet中也要做出相应的更改,如图
原理和自定义的差不多,步骤主要如下:
- 于Web.xml文件中配置ContextLoadListener监听器(导入坐标)
- 使用WebApplicatoinContextUtils来获取ApplicationContext对象
- 在pom文件中导入坐标,如图
- 在web.xml文件中配置,如图
- 在UserServlet中更改代码,如图
注:结果都没得问题,便不予展示!



