웹 환경과 통합 1.Spring
1.1 사용자 정의 봄 리스너는 웹 환경에 통합됩니다
1_ 수요 : 웹 개발 환경에 통합 봄은, 서블릿뿐만 아니라, 서블릿은 해당 빈을 얻기 위해, 서블릿에서 얻을의 ApplicationContext 테스트 클래스로 이해 될 수있다, 봄에 콩 객체의 생성됩니다.
건설 환경이 달성하기 위해 스스로를 취할 단계에 의해 단계는, 사실, 봄이 작업을 완료하는 간단한 방법을 제공하고 있습니다 1.1
<!--在pom文件中引入所需的依赖-->
<!--Spring坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--SpringMVC坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--Servlet坐标-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!--Jsp坐标-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
//1.创建dao层接口和实现类
//dao接口 IUserDao
public interface IUserDao{
void save();
}
//UserDaoImpl实现类
public class UserDaoImpl implements IUserDao{
@Override
public void save(){
System.out.printLn("正在保存...");
}
}
//2.创建service业务层接口和实现类
public interface IUserService{
void save();
}
//UserServletImpl实现类
public class UserServiceImpl implements IUserService{
private IUserDao userDao;
//为依赖注入提供set方法
public void setUserDao(IUserDao userDao){this userDao=userDao;}
@Override
public void save(){
userDao.save();
}
}
<!--applicationContext.xml文件中配置Dao,service交给spring管理-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置Dao-->
<bean class="cn.ppvir.dao.impl.UserDaoImpl" id="userDao"></bean>
<!--配置service-->
<bean class="cn.ppvir.service.impl.UserServiceImpl" id="userService">
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
/*web包下创建UserServlet类 内部功能:调Spring容器,创建service对象,调sava()方法*/
public class UserServlet extends HttpServlet{
@Override//复写doGet方法
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
//通过配置文件获取上下文
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean,因为只有一个UserServiceImpl,可以使用字节码的方法获取
UserServiceImpl userService = context.getBean(UserServiceImpl.class);
//调用save方法
userService.save();
}
}
<!--在web.xml中配置 servlet-->
<servlet>
<servlet-name>userServlet</servlet-name>
<servlet-class>cn.ppvir.web.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>userServlet</servlet-name>
<url-pattern>/userServlet</url-pattern>
</servlet-mapping>
마지막으로, 바람둥이을 구성 테스트 시작
에 http : // localhost를 : 80 / userServlet을
문제의 2_ 설명 :
웹 개발 환경에서 봄, 각 서블릿은 필요 new ClassPathXmlApplicationContext("applicationContext.xml")
구성 파일이 여러 번로드되어 있기 때문에, 그것은 폐기물의 성능이 저하됩니다
3_을 향상 :
창조의 ApplicationContext 객체가 리스너를 만들려면 청취자는, ServletContext 내 객체에 저장된 좋은 도메인 개체를 만들 것 서블릿에서 직접 객체를 취득 할 수 있습니다.
- 청취자는 코드를 작성
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 {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//获取上下文
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//将spring获取到的应用上下文,保存到servletContext域中
ServletContext servletContext = servletContextEvent.getServletContext();
servletContext.setAttribute("context",context);
//之后去web.xml配置listener监听器和改写servlet代码
}
- 리스너 구성
web.xml
<!--配置servlet-->
<!--配置自己实现的监听器-->
<listener>
<listener-class>cn.ppvir.listener.ContextLoaderListener</listener-class>
</listener>
- 서블릿 코드를 재 작성
public class UserServlet extends HttpServlet {
/**
* 改进一:
* 将ApplicationContext对象的创建交给监听器创建,监听器将创建好的对象存入ServletContext域对象中,在servlet中直接取该对象即可
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取servletContext域对象
ServletContext servletContext = this.getServletContext();
//从ServletContext域对象中,获取监听器创建的应用上下文,强转为ApplicationContext
ApplicationContext context = (ApplicationContext) servletContext.getAttribute("context");
UserServiceImpl userService = context.getBean(UserServiceImpl.class);
userService.save();
}
}
Tomcat은 테스트를 완료하기 위해 다시 시작합니다.
4. 최적화 II :
- 1_은 web.xml의 applicationContext.xml 파일에 파일을로드하도록 구성
web.xml
<!--改进二: 之前的基础上添加配置-->
<!--全局初始化参数-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
- 2. 재 작성의 ContextLoaderListener 리스너 클래스는, 글로벌 초기화 매개 변수를 가져
public class ContextLoaderListener implements ServletContextListener {
/**
* 优化二: 获取全局初始化参数
*
* @param servletContextEvent
*/
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//获取域对象
ServletContext servletContext = servletContextEvent.getServletContext();
//从配置文件中获取applicationContext
/*
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
*/
String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
//获取应用上下文
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(contextConfigLocation);
//将Spring的应用上下文 存储到ServletContext域对象中
servletContext.setAttribute("context",context);
System.out.println("spring容器创建完毕...");
}
}
- 객체에서 도구를 사용하여 3. 최적화 강력한 회전 ApplicationContext를 직접 ApplicationContext를하는 ServletContext 도메인 개체를 얻을 수 있습니다.
//创建工具类
package cn.ppvir.listener;
import org.springframework.context.ApplicationContext;
import javax.servlet.ServletContext;
/**
* 工具类,强转context上下文为ApplicationContext
*/
public class WebApplicationContextUtils {
/**
* @param servletContext 参数是域对象
* @return 返回值是强转后的对象ApplicationContext
*/
public static ApplicationContext getWebapplicationContext(ServletContext servletContext){
return (ApplicationContext)servletContext.getAttribute("context");
}
}
- 4. 수정 UserServlet 클래스 컨텍스트 전송 강력한 최적화 WebApplicationContextUtils를 사용하여
public class ContextLoaderListener implements ServletContextListener {
/**
* 优化二: 使用WebApplicationContextUtils工具类,简化强转上下文对象的操作
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取域对象
ServletContext servletContext = this.getServletContext();
ApplicationContext context = WebApplicationContextUtils.getWebapplicationContext(servletContext);
UserServiceImpl userService = context.getBean(UserServiceImpl.class);
userService.save();
}
}
Tomcat은 테스트를 완료하기 위해 컴퓨터를 다시 시작
청취자에게 제공하기 위해 1.2 스프링은 웹 환경에 통합 다 Spring
UserDao UserService 층으로서 상술 한
- 수입 의존
pom.xml
<!--spring-web坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
- 청취자의 ContextLoaderListener 봄의 서비스를 구성
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!--全局参数-->
<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>
<!--配置servlet-->
<servlet>
<servlet-name>service</servlet-name>
<servlet-class>web.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>service</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- 스프링 주입 applicationContext.xml 관리 구성
applicationContext.xml
<bean class="dao.impl.UserDaoImpl" id="userDao"></bean>
<bean class="service.impl.UserServiceImpl" id="userService">
<property name="userDao" ref="userDao"></property>
</bean>
- 서블릿 애플리케이션 콘텍스트 객체는 툴에 의해 얻어진
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取servletContext域对象
ServletContext servletContext = this.getServletContext();
//使用spring框架自带的WebApplicationContextUtils工具,获取上下文对象
WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
UserServiceImpl userService = context.getBean(UserServiceImpl.class);
userService.save();
}
}
1.3 요약 :
1.web 환경 통합 봄에만 할 수있는 수신기를 구성 할 필요가
모든 컨트롤러에 추가하여 빈 객체 = 2.Spring에서 관리