Java中Servlet的三大作用域以及监听器
一 .Servlet的三大作用域
1.servlet的三大作用域:
1)request: 表示一次请求,只要发出一个请求就会创建一个request,它的作用域:仅在当前请求中有效。
用处:常用于服务器间同一请求不同页面之间的参数传递,常应用于表单的控件值传递
request对象常用的方法有:request.setAttribute(), request.getAttribute(), request.getParameter(),request.getParameterValues(), request.setCharEncoding(""), request.getRealPath( )
2)session:session是一次会话,服务器会为每一个会话创建一个session对象,session中的数据可以被本次会话中的所有servlet访问,会话是从浏览器打开开始,到关闭浏览器结束。
用处: session常用于登录验证,登录成功后浏览器会为其分配一个session键值对,之后的访问权限判断键值对就可以了。
session对象常用的方法有:session.setAttribute(); session.getAttribute(); session.removeAttribute();
session对象的创建:在servlet中使用HttpSession session = request.getSession();的方式来创建,在页面中可以直接获取
session对象的销毁:可以在web.xml中配置失效时间,也可以session.invalidate();
3)application(ServletContext):application是应用程序作用域,是从程序开始运行到运行停止。
用处:保存在application作用域中的值,只要程序没有停止运行,都可以获取。
实现的办法:ServletContext ctx = session.getServletContext( ),所以可以也经常叫做ServletContext
2.小结使用场景:
1)请求参数级别的则是方法request中,比如条件查询
2)会话级别的数据要是用session作用域,比如说登录信息,银行账号,
3)如果数据是系统级别的,那么使用application作用域,例如在线人数
二 .监听器
1.监听器(Listener):是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程 序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行.
简而言之:所谓的监听器就是一个能够监听程序内容或者状态是否发生改变的一个Java类
有点类似现实世界中大厦里的火灾警报器
2.补充:
与监听器相关的术语
- 事件源:指的是被监听对象(汽车)
- 监听器:指的是监听的对象(报警器)
- 事件源和监听器绑定:在汽车上安装报警器
- 事件:指的是事件源对象的改变(踹了汽车一脚)----主要功能获得事件源对象。
3.监听器的应用举例--实现统计在线人数
3.1 监听器使用步骤:
1)创建实现类实现需要的接口(创建监听器接口的实现类)
2)在web.xml中配置<listener></listener>节点进行声明
3)实现接口中的方法
3.2 示例代码:
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import com.sun.org.apache.bcel.internal.generic.NEW;
/**
*
*@desc session监听器其目的是为了实现统计在线人数
*@author 晚风
*@time 2020
*
**/
public class SessionListener implements HttpSessionListener {
/**
* @desc 1.session创建的时候触发
*/
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session 开始创建了:: ID="+se.getSession().getId());
ServletContext ctx = se.getSession( ).getServletContext( );
Integer numSessions = (Integer) ctx.getAttribute("numSessions");
if (numSessions == null) {
numSessions = new Integer(1);
}
else {
int count = numSessions.intValue( );
numSessions = new Integer(count + 1);
}
ctx.setAttribute("numSessions", numSessions);
}
/**
* @desc 2.session销毁的时候触发
*/
@Override
public void sessionDestroyed(HttpSessionEvent se)
{
System.out.println("Session 销毁了:: ID="+se.getSession().getId());
ServletContext ctx=se.getSession().getServletContext();
Integer numSessions = (Integer)ctx.getAttribute("numSessions");
if(numSessions == null) {
numSessions = new Integer(0);
}
else {
int count = numSessions.intValue( );
numSessions = new Integer(count - 2);
}
ctx.setAttribute("numSessions", numSessions);
}
}
3.2.1 创建SessionListener 并实现HttpSessionListener接口
3.2.2 在manager模块的查询展示页面给予阐释:
当前在线人数为: <font color="red"><%=application.getAttribute("numSessions") %>个人</font>
4. 监听器,过滤器,servlet的级别
【Listener】->【Filter】->【Servlet】
5.监听器的应用举例之--预加载初始化一些数据信息
package com.rj.bd.manage.listeners;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
*
*@desc 上下文内容监听器其目的
*@author 晚风
*@time 2020
*
**/
public class MyLiceneListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("===============servlet服务初始化(也就是tomcat正式启动成功)==================");
System.out.println("***************1.可以开始预加载一些信息了****************");
ServletContext context = sce.getServletContext();
/**
* 1.可以预先加载连库4要素
*/
Map<String, Object> map=new HashMap<String, Object>();
map.put("username", "root");
map.put("password", "root");
map.put("drivername", "com.mysql.jdbc.Driver");
map.put("url", "jdbc://..........");
context.setAttribute("map", map);
/**
* 2.也可以在这里实现注入....其实也就是Spring框架核心的注入的原理所在。。。。。(后续讲)
*/
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("===============servlet服务销毁(也就是tomcat重新部署)==================");
}
}
5.1 甚至可以在页面上manage/manager/list.jsp上取出数据:
取出通过ServletContextListener预先加载的password:<%=((Map)application.getAttribute("mapListener")).get("password") %>
6.监听器的应用举例之--Request请求监听器记录ip
package com.rj.bd.manage.listeners;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
/**
*
*@desc Request请求监听器其目的是为了记录请求初始化和销毁时记录ServletRequest IP地址
*@author 晚风
*@time 2020
*
**/
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
ServletRequest servletRequest = sre.getServletRequest();
System.out.println("ServletRequest destroyed. Remote IP="+servletRequest.getRemoteAddr());
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
ServletRequest servletRequest = sre.getServletRequest();
System.out.println("ServletRequest initialized. Remote IP="+servletRequest.getRemoteAddr());
}
}
6.1 使用场景:可以通过分析获取到的ip地址进而获取到请求的ip分布情况,然后就可以实现请求ip的黑名单和白名单(感兴趣自己研究)