监听器,常用注解,JSON解析

1.监听器(掌握)

一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变事件,当被监听的对象发生上述事件后,监听器某个方法将立即被执行。
监听器监听的对象:
Servlet的三大域对象:ServletContext, HttpSession,ServletRequest.分别代表当前web应用,当前会话,当前的请求
监听器监听的事件类型:域对象的创建,销毁事件以及属性改变 (增加属性数据:setAttribute() 移除属性数据 :removeAttribute() )事件

1.1如何监听
如果监听ServletContext,那么实现ServletContextListener(监听ServletContext的创建和销毁事件)或ServletContextAttributeListener(监听属性改变事件)接口
如果监听HttpSession,那么实现HttpSessionListener(监听创建和销毁事件)或HttpSessionAttributeListener(监听属性改变事件)接口
规律:

监听三个域对象的创建和销毁事件,监听器需要实现的接口是XxxListener , Xxx就是域对象的类名,比如HttpSessionListener,如果是监听域对象的属性改变事件,需要实现的接口是XxxAttributeListener
监听器要监听的三种对象,及需要实现的接口
监听器,常用注解,JSON解析
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类库
监听器,常用注解,JSON解析
运行测试方法:双击选中方法名,Run as–>Junit Test
监听器,常用注解,JSON解析

注意:junit测试方法上面必须有@Test注解,不能有返回类型,只能是void,方法不能有参数