1、前面已经学习了:自己写Servlet,自己写Filter。
现在学习:自己写Listener。套路其实都一样的(继承接口、重写方法;在web.xml中配置一下)。
web.xml中加入:
<listener>
<listener-class>com.mydev.MyListener</listener-class>
</listener>
(新建的几个文件,稍后会一一解释)
配置文件 web.xml
中的<listener-class>
对应其中的MyListener
类文件。
2、关于Listener不着急,下面看看如何手工整合Spring框架到我们自己写的Servlet。
使用maven下载Spring:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.0.RELEASE</version>
</dependency>
在resourece
项目资源目录下创建Spring框架的配置文件,比如我这里的mySpring.xml
,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myBean" class="com.mydev.MyBean">
<constructor-arg index="0" value="0"/>
<constructor-arg index="1" value="jack"/>
</bean>
</beans>
我们配置了一个<bean>
。
这个<bean
对应的是MyBean
这个类,代码如下:
public class MyBean {
private int id;
private String name;
public MyBean(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3、完成MyListener
这个监听器类
import org.springframework.context.support.ClassPathXmlApplicationContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent servletContextEvent) {
// 使用配置文件的方式
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("mySpring.xml");
// 设置一个属性
servletContextEvent.getServletContext().setAttribute("spring",classPathXmlApplicationContext);
}
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
读取我们的Spring框架配置文件,然后设置了一个名为spring
的属性。
4、然后在自己写的Servlet里,获取监听器里设置的属性,然后获取 Bean。
MyServlet.java代码如下:
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取监听器里设置的属性
ClassPathXmlApplicationContext classPathXmlApplicationContext = (ClassPathXmlApplicationContext)req.getServletContext().getAttribute("spring");
// 获取Bean
MyBean myBean = classPathXmlApplicationContext.getBean("myBean",com.mydev.MyBean.class);
// 把从Bean获取的值输出
resp.getWriter().write(myBean.getName());
}
}
从代码可以看出,请求之后,会输出MyBean
类里的name属性的值。
这个name属性值,是在配置文件mySpring
里配置好的。
4、到了这一步,以为编译一下,然后把编译之后的target
目录下的classes
文件夹复制到我们的tomcat站点里就可以了。其实还没有完,因为我们还要外部依赖(我们使用了Spring这个框架),我们需要使用maven把依赖打包一下。
使用maven打包依赖,需要一个插件,还是在pom.xml
写上,先下载这个插件:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
然后进入项目根目录,执行:
mvn package
我们把需要的依赖都打包到了lib
这个文件夹里。
5、把target目录下的classes
和lib
复制到 站点下:
(这一切搞定之后,我们开始测试,记得重启tomcat)
访问http://localhost:8080/myjavaweb/1.abc
经过Filter,然后到达Servlet。
会触发doGet()
方法,在这个方法中,最后向页面输出Bean组件的属性(name
属性)的值。
<bean id="myBean" class="com.mydev.MyBean">
<constructor-arg index="0" value="0"/>
<constructor-arg index="1" value="jack"/>
</bean>
这是Spring配置文件里,给MyBean
属性配置的值。
我们用浏览器查看: