测试的环境就不说了,前面几篇都有,直接上test类
package spring.factory; import org.springframework.context.support.ClassPathXmlApplicationContext; import spring.IUserDao; public class test { public static void main(String[] args) { //加载并解析ApplicationContext.xml ClassPathXmlApplicationContext factory= new ClassPathXmlApplicationContext("applicationContext.xml"); //获取工厂中的IUseDao对象 IUserDao userDao= (IUserDao)factory.getBean("userDao"); IUserDao userDao2= (IUserDao)factory.getBean("userDao"); System.out.println(userDao==userDao2); System.out.println(userDao.equals(userDao2)); //掉用方法 userDao.selectUser(); userDao2.selectUser(); //销毁对象 factory.close(); } }如果不是单例模式,它使用对象时就要new一次,所以他们的是不会相等的,如果是单例模式则反之。
web中的作用域:applicatinContext.xml文件跟之前的一样,只是scope的值不一样
必备环境,一个jsp页面或者HTML页面里面一个a标签路径为servlet的路径、一个servlet里面调用我们的IOC容器(applicationContext.xml)
通过WebApplicationContextUtils.getRequiredWebApplicationContext (request.getServletContext());获取容器需要在web.xml里面配置监听,你可以尝试不配之前让它出bug,然后我们在里面找到报错信息,根据报错信息来解决问题:
UserServlet:
package com.dayo2_IOCWeb.Servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import org.springframework.web.context.support.XmlWebApplicationContext; import spring.IUserDao; import spring.UserService; @WebServlet("/UserServlet") public class UserServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取IOC容器 WebApplicationContext factory=WebApplicationContextUtils.getRequiredWebApplicationContext (request.getServletContext()); //调用UserDao IUserDao userDao= (IUserDao)factory.getBean("userDao"); IUserDao userDao2= (IUserDao)factory.getBean("userDao"); System.out.println(userDao==userDao2); System.out.println(userDao.equals(userDao2)); } }不配置监听器之前: java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered? 大概就是整个错误,说找不到WebApplicationContext 你使用的这个东西,原因是你没有注册ContextLoaderListener 。
这个时候我们就需要再web.xml中注册ContextLoaderListener ,
如何注册? 请看代码:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>day02_IOCWeb</display-name> <!-- Spring配置文件路径 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- Spring监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>这个里面的路径哪里来的?你可以把ContextLoaderListener 复制到servlet里面然后按住Ctrl点它就会进去到它的源码里面,当然,这里没有导入源码,不影响使用 然后配置它的路径:如代码,这里的 contextConfigLocation classpath:applicationContext.xml
name不能乱用,不然它找不到:这里用的的是它父类的位置参数名:那么怎么找? 找到web导的包,随后根据父类的路径找到父类。 vale是什么?就是你的ApplicationContext.xml文件了,主意路径的书写,看你自己放在哪了,我放的是类路径下方, 如果你放在了WEB_INF里面,那么就是WEB_INF/ApplicationContext.xml了。
配置完成之后,再次测试,你又发现又有bug了,这次我们来看看它说啥? In this case, use RequestContextListener or RequestContextFilter to expose the current request.
跟之前的一样,需要引入RequestContextListener 来解决。我就不说怎么找了,看上面。
随后就ok了,你可以在servlet中使用 request.getRequestDispatcher(“路径”).forward(request, response);(站内跳转) response.sendRedirect(“路径”);(站外跳转) 进行测试,然后换一下scope的值,进行测试。
ok今天就到这个,学了十分钟,写了一小时。