Java学习,Spring与Web环境集成

Java 投稿 59900 0 评论

Java学习,Spring与Web环境集成

1. ApplicationContext应用上下文获取方式

应用上下文对象是通过 new ClassPathXmlApplicationContext(Spring配置文件) 方式获取的,但是每次从容器中获取Bean时都要编写 new ClassPathXmlApplicationContext(Spring配置文件),这样的弊端是配置文件加载多次,应用上下文对象创建多次。 在Web项目中,可以使用ServletContextLIstener监听Web应用的启动,我们可以在Web应用启动时,就加载Spring的配置文件,创建应用上下文对象ApplicationContext,再将其存储到最大的域servletContext域中,这样就可以在任意位置获取应用上下文ApplicationContext对象。 

2. 创建案例

1、创建监听器

 package com.ntect.listener; 

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.servlet.ServletContext;

import javax.servlet.ServletContextEvent;

import javax.servlet.ServletContextListener;

public class ContextLoaderListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {         ServletContext servletContext

        ServletContext servletContext = sce.getServletContext();

        //读取web.xml中的全局参数

       String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");         ApplicationContext app

        ApplicationContext app = new ClassPathXmlApplicationContext(contextConfigLocation);         //将Spring的应用上下文对象存储到ServletContext域中         servletContext.setAttribute("app",app);         System.out.println("spring容器创建完毕....");     }     public void contextDestroyed(ServletContextEvent sce) {     } } 

 2、创建获取applicationContext对象的工具类

package com.ntect.listener; 
 import org.springframework.context.ApplicationContext; 
 import javax.servlet.ServletContext; 
 public class WebApplicationContextUtils { 
     public static ApplicationContext getWebApplicationContext(ServletContext servletContext) {         return (ApplicationContext)servletContext.getAttribute("app");
     }
 } 

 3、创建servlet的测试类

 package com.ntect.web; 

import com.ntect.listener.WebApplicationContextUtils;

import com.ntect.service.UserService;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

public class UserServlet extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");

    ServletContext servletContext = this.getServletContext();

        //ApplicationContext app = (ApplicationContext) servletContext.getAttribute("app");

     ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(servletContext);         UserService userService

        UserService userService = app.getBean(UserService.class);         userService.save();     } }

4、配置web.xml文件

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"  version="4.0">
 

<!--    全局初始化参数-->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>applicationContext.xml</param-value>

</context-param>

<!--    配置监听器-->

<listener>

<listener-class>com.ntect.listener.ContextLoaderListener</listener-class>

</listener>

<!--    配置测试用的servlet-->

<servlet>

<servlet-name>UserServlet</servlet-name>

<servlet-class>com.ntect.web.UserServlet</servlet-class>

</servlet>

    <servlet-mapping>

<servlet-name>UserServlet</servlet-name>

<url-pattern>/userServlet</url-pattern>

</servlet-mapping>

</web-app>

5、测试浏览器访问

 http://localhost:8080/userServlet

控制台输出

3. Spring提供获取应用上下文的工具

上面地分析只是为了方便理解,不用手动实现,Spring提供了一个监听器ContextLoaderListener就是对上述功能的封装,该监听器内部加载Spring配置文件,创建应用上下文对象,并存储到ServletContext域中,提供了一个客户端工具WebApplicationContextUtils获取应用上下文对象。 需要做两件事:1、在web.xml中配置ContextLoaderListener监听器(导入spring-web坐标)2、使用WebApplicationContextUtils获得应用上下文对象ApplicationContext 

3.1 导入Spring集成web的坐标

 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.16</version></dependency>

3.2 配置ContextLoaderListener监听器

<!--    全局初始化参数--> <context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:applicationContext.xml</param-value>

</context-param>

<!--    配置监听器-->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

3.3 使用WebApplicationContextUtils获得应用上下文对象ApplicationContext

ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(servletContext);
UserService userService = app.getBean(UserService.class);

编程笔记 » Java学习,Spring与Web环境集成

赞同 (86) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽