[Spring] Integración de contenedor y entorno web-escucha de dominio servletContext

Al aprender Spring antes, hemos estado simulando la capa web sin usar servlets reales. A continuación, iniciaremos el servidor tomcat, importaremos las coordenadas del servlet / jsp e ingresaremos al entorno web real con el que estamos familiarizados.
 
El entorno web trae el conocido dominio servletContext / Session / Request; piénselo, ¿ appen qué dominio debe colocarse el contenedor Spring ( )?

 
 

Comprensión: contenedor Spring y dominio servletContext

Cada vez que hay newuna aplicación tiene inconvenientes obvios: el archivo de configuración se carga varias veces y el contenedor (objeto de contexto) se crea varias veces.

Al entrar en el entorno web con el que estamos familiarizados, tenemos una nueva idea para solucionar este problema:

El dominio servletContext es el dominio más grande y solo se carga una vez cada vez que se inicia un proyecto web. Por lo tanto, usamos ServletContextListener para monitorear el proyecto web.Cuando el proyecto web se inicia, creamos una aplicación y la almacenamos en el dominio servletContext. Cada vez que necesite utilizar una aplicación, sáquela del dominio.

En otras palabras, el contenedor Spring se crea solo una vez cuando se inicia el proyecto web. newEl problema de usar varias veces para crear está resuelto.

 
 

Implementación: integre manualmente la aplicación en el dominio servletContext

① Oyente de ContextLoaderListener manuscrito

public class ContextLoaderListener implements ServletContextListener {
    
    
    public void contextInitialized(ServletContextEvent servletContextEvent) {
    
    
    
        // 1.在web项目启动时创建app上下文对象
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        // 2.将app上下文对象存储到最大的域(ServletContext域)中
        ServletContext servletContext = servletContextEvent.getServletContext();
        servletContext.setAttribute("app", app);
        
    }

    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    
    

    }
}

② Configure el oyente en web.xml

<!-- 配置监听器 -->
<listener>
	<listener-class>com.samarua.listener.ContextLoaderListener</listener-class>
</listener>

③ Usar (Eliminar la aplicación del dominio)

public class UserServlet extends HttpServlet {
    
    

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
    	// 获取servletContext域
        ServletContext servletContext = req.getServletContext();
        // 从域中取出Spring容器
        ApplicationContext app = (ApplicationContext) servletContext.getAttribute("app");
        // 用一下试试 >_<
        UserService userService = app.getBean(UserService.class);
        userService.sayHi();
    }
	
	@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        this.doGet(req, resp);
    }

}

 
 

Implementación: use las clases de escucha y herramientas proporcionadas por Spring

① Configurar en web.xml

<!-- 全局初始化参数(这是因为在Spring写好的监听器中,xml配置文件的名称不是写死的,而是在这里指定) -->
<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>

② Usar (sacar la aplicación de la clase de herramienta WebApplicationContextUtils)

public class UserServlet extends HttpServlet {
    
    

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
		// // 获取servletContext域
        ServletContext servletContext = req.getServletContext();
        // 从工具类中取出app
        ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        // 用一下试试 >_<
        UserService userService = app.getBean(UserService.class);
        userService.sayHi();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        this.doGet(req, resp);
    }
}

 
 
 
 

 
 
 
 

 
 
 
 

Más> _ <

Supongo que te gusta

Origin blog.csdn.net/m0_46202073/article/details/114239541
Recomendado
Clasificación