监听器,常用注解,JSON解析
1.监听器(掌握)
一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变事件,当被监听的对象发生上述事件后,监听器某个方法将立即被执行。
监听器监听的对象:
Servlet的三大域对象:ServletContext, HttpSession,ServletRequest.分别代表当前web应用,当前会话,当前的请求
监听器监听的事件类型:域对象的创建,销毁事件以及属性改变 (增加属性数据:setAttribute() 移除属性数据 :removeAttribute() )事件
1.1如何监听
如果监听ServletContext,那么实现ServletContextListener(监听ServletContext的创建和销毁事件)或ServletContextAttributeListener(监听属性改变事件)接口
如果监听HttpSession,那么实现HttpSessionListener(监听创建和销毁事件)或HttpSessionAttributeListener(监听属性改变事件)接口
规律:
监听三个域对象的创建和销毁事件,监听器需要实现的接口是XxxListener , Xxx就是域对象的类名,比如HttpSessionListener,如果是监听域对象的属性改变事件,需要实现的接口是XxxAttributeListener
监听器要监听的三种对象,及需要实现的接口
1.2 开发监听器
1)创建一个类,根据需要实现XxxListener接口或XxxAttributeListener接口,
实现改变事件是指向域对象中添加属性setAttribute或移除属性removeAttribute
public class MyServletContextListener implements ServletContextListener,
ServletContextAttributeListener {
// ServletContext销毁时,会自动contextDestroyed方法
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ServletContext对象被销毁了");
}
// ServletContext创建时,会自动contextInitialized方法
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("ServletContext对象被创建了");
}
//域对象中添加新属性后自动调用attributeAdded方法
@Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("添加了新属性");
}
//域对象中移除某个属性后自动调用attributeRemoved方法
@Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("移除了属性");
}
//域对象中某个属性的值被修改了,会自动调用attributeReplaced方法
@Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
System.out.println("修改了属性");
}
}
2)在web.xml中配置监听器
<!-- 配置监听器 -->
<listener>
<listener-class>com.sxt.listener.MyServletContextListener</listener-class>
</listener>
1.3 监听器作用
servletContext监听器的作用:初始化数据,加载配置文件,执行定时任务
案例:
public class MyContext_2Listener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
//初始化web应用的根路径
@Override
public void contextInitialized(ServletContextEvent se) {
// TODO Auto-generated method stub
ServletContext servletContext = se.getServletContext();
//获取web应用根路径,等价于request.getContextPath
String contextPath=servletContext.getContextPath();
//保存在servletContext域对象中
servletContext.setAttribute("ctx",contextPath);
}
}
2.常用注解(掌握)
2.1 @WebServlet注解
用在Servlet类上的注解,最简单写法@WebServlet(“访问路径”)
@WebServlet("/test.action")
public class TestServlet extends HttpServlet {
还可以在注解中使用属性,语法:@WebServlet(属性名=值),当需要给Servlet配置
除了路径以外的参数时,就需要写属性了,比如
@WebServlet(urlPatterns="/test.action",name="testServlet")
public class TestServlet extends HttpServlet {
以上注解代替了web.xml中的如下配置:
<servlet>
<servlet-name>testServlet</servlet-name>
<servlet-class>com.sxt.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test.action</url-pattern>
</servlet-mapping>
如果要给servlet配置多个访问路径,就给注解指定urlpatterns={路径1,路径2…}
@WebServlet(urlPatterns={"/test.action","/test2.action"})
public class TestServlet extends HttpServlet {
2.1 @WebListener注解
用在监听器上的注解
@WebListener
public class MyServletContextListener implements ServletContextListener{
2.3 @WebFilter注解
用在过滤器上的注解,如果要拦截多个不同路径的资源,那么要写在数组中
@WebFilter(urlPatterns={"/test.action","/view/*"})
public class MyFilter implements Filter {
2.4 @WebInitParam注解
该注解是指定Servlet或Filter的初始化参数,要作为initParms属性的值来使用
@WebFilter(urlPatterns={"/test.action","/view/*"}, initParams={@WebInitParam(name="city",value="武汉"),@WebInitParam(name="uname",value="张三")})
public class MyFilter implements Filter {
[email protected]注解
用在servlet上的注解,是servlet3.0提供的支持文件上传的注解,用来处理文件上传的请求
3.JSON解析
补充:在测试类里面可以写多个junit测试方法,每个测试方法上都必须有@Test注解,
需要加入junit4类库
运行测试方法:双击选中方法名,Run as–>Junit Test
注意:junit测试方法上面必须有@Test注解,不能有返回类型,只能是void,方法不能有参数