Java Web(九)

1Listener & Filter 2Listener 3   监听器 41、能做什么事? 5  监听某一个事件的发生。 状态的改变。 62、监听器的内部机制 7  其实就是接口回调. 8 9 10接口回调 111、 需求: 12  A在执行循环,当循环到5的时候, 通知B13  事先先把一个对象传递给 A , 当A 执行到5的时候,通过这个对象,来调用B中的方法。 但是注意,不是直接传递B的实例,而是传递一个接口的实例过去。

1Web监听器 2  总共有8个 划分成三种类型 31、定义一个类,实现接口 42、注册 | 配置监听器 5 6监听三个作用域创建和销毁 7  request ---httpServletRequest 8  session ---httpSession 9  aapplication --- ServletContext 10  1、ServletContextListener 11    ① servletcontext创建: 12      启动服务器的时候 13    ② servletContext销毁: 14      关闭服务器. 从服务器移除项目 15  2、ServletRequestListener 16    ① request创建: 17      访问服务器上的任意资源都会有请求出现。 18        访问 html: 会 19        访问 jsp:20        访问 servlet :21    ② request销毁: 22      服务器已经对这次请求作出了响应。 23 24public class MyRequestListener implements ServletRequestListener { 25 @Override 26 public void requestDestroyed(ServletRequestEvent sre) { 27 System.out.println("servletrequest 销毁了"); 28 } 29 30 @Override 31 public void requestInitialized(ServletRequestEvent sre) { 32 System.out.println("servletrequest 初始化了"); 33 } 34 } 35 36 37 <listener> 38 <listener-class>com.itheima.listener.MyRequestListener</listener-class> 39 </listener> 40 413. HttpSessionListener 42 43 session的创建 44 只要调用getSession 45 46 html: 不会 47 jsp:getSession(); 48 servlet:49 50 session的销毁 51 超时 30分钟 52 53 非正常关闭 销毁 54 55 正常关闭服务器(序列化) 56 57 public class MySessionListener implements HttpSessionListener { 58 59 @Override 60 public void sessionCreated(HttpSessionEvent se) { 61 System.out.println("创建session了"); 62 } 63 64 @Override 65 public void sessionDestroyed(HttpSessionEvent se) { 66 System.out.println("销毁session了"); 67 } 68 } 69 70作用: 71 72 ServletContextListener 73 74 利用它来,在servletcontext创建的时候, 75 1. 完成自己想要的初始化工作 76 77 2. 执行自定义任务调度。 执行某一个任务。 Timer 78 79 HttpSessionListener 80 81 统计在线人数. 82 83监听三个作用域属性状态变更 84  可以监听在作用域中值 添加 | 替换 | 移除的动作。 85 86* servletContext --- ServletContextAttributeListener 87![icon](img/img03.png) 88 89* request --- ServletRequestAttributeListener 90![icon](img/img04.png) 91 92* session --- HttpSessionAttributeListener 93![icon](img/img02.png) 94 95 96监听httpSession里面存值的状态变更 97  这一类监听器不用注册。 98 99* HttpSessionBindingListener 100 101> 监听对象与session 绑定和解除绑定 的动作 102 103 1. 让javaBean 实现该接口即可 104 105 @Override 106 public void valueBound(HttpSessionBindingEvent event) { 107 System.out.println("对象被绑定进来了"); 108 } 109 110 @Override 111 public void valueUnbound(HttpSessionBindingEvent event) { 112 System.out.println("对象被解除绑定"); 113 } 114 115* HttpSessionActivationListener 116 117> 用于监听现在session的值 是 钝化 (序列化)还是活化 (反序列化)的动作 118 119* 钝化 (序列化) 120 121> 把内存中的数据 存储到硬盘上 122 123* 活化 (反序列化) 124 125> 把硬盘中的数据读取到内存中。 126 127 128* session的钝化活化的用意何在 129 130> session中的值可能会很多, 并且我们有很长一段时间不使用这个内存中的值, 那么可以考虑把session的值可以存储到硬盘上【钝化】,等下一次在使用的时候,在从硬盘上提取出来。 【活化】 131 132* 如何让session的在一定时间内钝化. 133 134> 做配置即可 135 136 1. 在tomcat里面 conf/context.xml 里面配置 137 138 对所有的运行在这个服务器的项目生效 139 140 2. 在conf/Catalina/localhost/context.xml 配置 141 142 对 localhost生效。 localhost:8080 143 144 3. 在自己的web工程项目中的 META-INF/context.xml 145 146 只对当前的工程生效。 147 148 maxIdleSwap : 1分钟不用就钝化 149 directory : 钝化后的那个文件存放的目录位置。 150 151 D:\tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\ListenerDemo\itheima 152 153 <Context> 154 <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"> 155 <Store className="org.apache.catalina.session.FileStore" directory="itheima"/> 156 </Manager> 157 </Context> 158 159 160##Filter 161 162> 过滤器 , 其实就是对客户端发出来的请求进行过滤。 浏览器发出, 然后服务器派servlet处理。 在中间就可以过滤, 其实过滤器起到的是拦截的作用。 163 164* 作用 165 166 1. 对一些敏感词汇进行过滤 167 2. 统一设置编码 168 3. 自动登录 169 170 ... 171 172###如何使用Filter 173 1741. 定义一个类, 实现Filter 175 176 public class FilterDemo implements Filter { 177 178 public void destroy() { 179 } 180 181 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 182 System.out.println("来到过虑器了。。。"); 183 chain.doFilter(request, response); 184 } 185 186 public void init(FilterConfig fConfig) throws ServletException { 187 } 188 189 } 190 1912. 注册过滤器 192 193> 在web.xml里面注册,注册的手法与servlet基本一样。 194 195 196 <filter> 197 <display-name>FilterDemo</display-name> 198 <filter-name>FilterDemo</filter-name> 199 <filter-class>com.itheima.filter.FilterDemo</filter-class> 200 </filter> 201 <filter-mapping> 202 <filter-name>FilterDemo</filter-name> 203 <url-pattern>/*</url-pattern> 204 </filter-mapping> 205 206 207###Filter的生命周期 208 209* 创建 210 211> 在服务器启动的时候就创建。 212 213* 销毁 214 215> 服务器停止的时候。 216 217 218###Filter执行顺序 219 2201. 客户端发出请求,先经过过滤器, 如果过滤器放行,那么才能到servlet 221 2222. 如果有多个过滤器, 那么他们会按照注册的映射顺序 来 排队。 只要有一个过滤器, 不放行,那么后面排队的过滤器以及咱们的servlet都不会收到请求。 223 224 225##Filter细节: 226 2271. init方法的参数 FilterConfig , 可以用于获取filter在注册的名字 以及初始化参数。 其实这里的设计的初衷与ServletConfig是一样的。 228 2292. 如果想放行,那么在doFilter 方法里面操作,使用参数 chain 230 231 232 chain.doFilter(request, response); 放行, 让请求到达下一个目标。 233 2343. <url-pattern>/*</url-pattern> 写法格式与servlet一样。 235 236 1. 全路径匹配 以 / 开始 237 238 /LoginServlet 239 240 2. 以目录匹配 以 / 开始 以 * 结束 241 242 /demo01/* 243 244 3. 以后缀名匹配 以 * 开始 以后缀名结束 245 246 *.jsp *.html *.do 247 2484. 针对 dispatcher 设置 249 250 REQUEST : 只要是请求过来,都拦截,默认就是REQUEST 251 FORWARD : 只要是转发都拦截。 252 ERROR : 页面出错发生跳转 253 INCLUDE : 包含页面的时候就拦截。 254 255 256 257###自动登录 258 259* 需求分析 260 261![icon](img/img05.png) 262 263 264####1. 搭建环境 265 2661. 搭建数据库 267 2682. 搭建页面 269 270 271###登录servlet代码 272 273 274 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 275 276 try { 277 String userName = request.getParameter("username"); 278 String password = request.getParameter("password"); 279 String autoLogin = request.getParameter("auto_login"); 280 UserBean user = new UserBean(); 281 user.setUsername(userName); 282 user.setPassword(password); 283 284 UserDao dao = new UserDaoImpl(); 285 UserBean userBean = dao.login(user); 286 287 if(userBean != null){ 288 //成功了,进入首页 289 request.getSession().setAttribute("userBean", userBean); 290 response.sendRedirect("index.jsp"); 291 }else{ 292 //不成功... 293 request.getRequestDispatcher("login.jsp").forward(request, response); 294 } 295 296 } catch (SQLException e) { 297 e.printStackTrace(); 298 } 299 } 300 301 302##过滤器代码 303 304> 过滤器的核心不是完成拦截不给 , 还是放行显示。 它的核心是在放行之前,帮用户完成登录的功能。 305 306* 实现思路 307 3081. 先判断session是否有效, 如果有效,就不用取cookie了,直接放行。 309 3102. 如果session失效了,那么就取 cookie。 311 312 1. 没有cookie 放行 313 314 2. 有cookie 315 316 1. 取出来cookie的值,然后完成登录 317 2. 把这个用户的值存储到session中 318 319 3. 放行。 320 321 /** 322 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) 323 */ 324 public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException { 325 326 try { 327 HttpServletRequest request = (HttpServletRequest) req; 328 329 //先判断,现在session中还有没有那个userBean. 330 UserBean userBean = (UserBean) request.getSession().getAttribute("userBean"); 331 //还有,有效。 332 if(userBean != null){ 333 chain.doFilter(request, response); 334 }else{ 335 //代表session失效了。 336 337 //2. 看cookie。 338 339 //1. 来请求的时候,先从请求里面取出cookie , 但是cookie有很多的key-value 340 Cookie[] cookies = request.getCookies(); 341 //2. 从一堆的cookie里面找出我们以前给浏览器发的那个cookie 342 Cookie cookie = CookieUtil.findCookie(cookies, "auto_login"); 343 344 //第一次来 345 if(cookie == null){ 346 chain.doFilter(request, response); 347 }else{ 348 349 //不是第一次。 350 351 String value = cookie.getValue(); 352 String username = value.split("#itheima#")[0]; 353 String password = value.split("#itheima#")[1]; 354 355 //完成登录 356 UserBean user = new UserBean(); 357 user.setUsername(username); 358 user.setPassword(password); 359 360 UserDao dao = new UserDaoImpl(); 361 userBean = dao.login(user); 362 363 //使用session存这个值到域中,方便下一次未过期前还可以用。 364 request.getSession().setAttribute("userBean", userBean); 365 366 chain.doFilter(request, response); 367 } 368 369 } 370 371 } catch (Exception e) { 372 e.printStackTrace(); 373 chain.doFilter(req, response); 374 } 375 } 376 377 378###BeanUtils的使用 379 380> BeanUtils.populate(bean, map); 381 382 //注册自己的日期转换器 383 ConvertUtils.register(new MyDateConverter(), Date.class); 384 385 386 //转化数据 387 Map map = request.getParameterMap(); 388 UserBean bean = new UserBean(); 389 390 转化map中的数据,放置到bean对象身上 391 BeanUtils.populate(bean, map); 392 393 394 395#总结 396 397##Listener 398 399 8400 401 三种类型 402 针对三个作用域的创建和销毁 403 针对三个作用域的值改变 【添加 | 替换 | 移除】 404 针对session中的值 【钝化 活化】 , 【绑定 解绑】 405 406 钝化 ( 序列化 ) 407 内存中的对象存储到硬盘 408 409 超时失效。 session销毁了。 410 411 非正常关闭服务器, 钝化 。 正常关闭服务器 销毁 412 413 设置了session,多久时间。 context.xml 414 415 416 活化 (反序列化) 417 从硬盘里面读取到内存 418 419 420ServletContextListner : 应用被部署的时候, 服务器加载这个项目的时候,做一些初始化工作, 任务调度。 421HttpSessionListener : 统计在线人数 422HttpSessionActivationListener : 钝化活化处理 423 424 425 426 427 428 429##Filter 430 431> 使用频率更高 432 433* 如果要写一个过滤器。 434 435> 1. 定义一个类,实现接口 Filter 436 437> 2. 注册 . web.xml . 与servlet相似。 438 439* 过滤器放行。 440 441> chain.doFilter(request, response); 442 443* 过滤器生命周期 444 445 创建: 服务器加载这个项目的时候创建实例 446 447 销毁: 关闭服务器或者从服务器中移除项目的时候。
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

thinkcmf+jsapi 实现微信支付

首先从小程序端接收订单号、金额等参数,然后后台进行统一下单,把微信支付的订单号返回,在把订单号发送给前台,前台拉起支付,返回参数后更改支付状态。。。回调publicfunctionnotify(){$wechatDb::name('wechat')where('status',1)find();

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

SpringBoot的事件监听

事件监听的流程分为三步:1、自定义事件,一般是继承ApplicationEvent抽象类。2、定义事件监听器,一般是实现ApplicationListener接口。3、a、启动的时候,需要将监听器加入到Spring容器中。b、或者将监听器加入到容器中。@Componentc、使用@EventLis