1.什么是监听器? web监听器是一种能监听某个对象状态变化的组件,重点在于监听域对象(比如ServletContext,HttpSession,ServletRequest)的变化。可以在某些动作前后增加处理 ,实现监控。 2.监听器的相关概念 事件源 :指被监听的对象 request session context 监听器: 监听事件源的对象 ,有8个 注册监听器: 监听器与事件源绑定 相应行为: 监听到事件源变化的时,去做什么事情 3.监听器的作用 统计在线人数,利用HttpSessionLisener 加载初始化信息:利用ServletContextListener 统计网站访问量 实现访问监控 4.监听器原理 使用代理设计模式,如下图                   图片来自高新强老师的网课 什么是代理设计模式? 简单来讲就是某一个对象发生某一个事件时,通知另一个对象,让另一个对象做某事。 5. 监听器的编写步骤 编写一个监听器类去实现监听器接口 继续阅读 >>


陈健源 18/11/25 16:48:57
  前两天学习了一下动态规划中的一种背包问题,发现网上绝大多数模板都叙述的含糊不清, 关键部分看不懂让人感觉很难受,今天我就详细叙述一下01背包。   首先的问题当然是什么叫做01背包。   01背包:先举个01背包的题     有编号分别为a,b,c,d,e的五件物品,它们的重量分别是1,2,5,6,7,它们的   价值分别是1,6,18,22,28,每件物品数量只有一个,现在给你个承重为11的背包,如何   让背包里装入的物品具有最大的价值总和?     怎么个意思,就是物品只有一个,不能重复放,将哪些物品装入背包可使这些   物品的重量总和不超过背包容量,且价值总和最大,这就是01背包问题。 一,模板 以上面的01背包的问题为例子 #include<stdio.h> int max[500][500]; int main(void) { int w=11; //背包容量 继续阅读 >>


陈健源 18/08/12 21:51:33
  今天将详解一下最长上升子序列和最大上升子序列这种题,实际上两种题考的是一种题,最大上升子序列只是 稍微改动的最长上升子序列。   还是一样我先给出做题样例和模板。 一.样例   《 超级跳跃》 是一款非常简单的小游戏,它的规则是这样的: a. 游戏赛道被分为了 N 块区域,每块区域具有一个价值 Ki; b. 玩家起始站在道路的起点处,当参与者到达终点处时游戏结束; c. 玩家每次可以选择使用超级跳跃到达前方的任意区域,但到达的区域 必须满足以下两个条件之一: ① 到达的区域是终点; ② 到达的区域 的价值大于当前所在的区域价值。 d. 玩家每到达一个区域,就获得这块区域的价值。 e. 不可以使用超级跳跃向身后跳。   请你编写一个程序,算出对于一条《 超级跳跃》 游戏的赛道,玩家最多可以 获得多少价值。 输入   输入的数据有多组, 每组数据首先是一个正整数 N (0 ≤ N ≤ 1000), 代表 赛道被分为 N 块区域,接下来是 N 个以空格为分隔符的数字 K1, 继续阅读 >>


陈健源 18/08/09 15:09:57
  在linux系统中,对于进程进行控制的主要系统调用以下所示 fork:用于创建一个新进程。 exit:用于终止进程 exec:用于执行一个应用程序 wait:将父进程挂起,等待子进程终止 getpid:获取当前进程的进程ID nice:改变进程的优先级 1.fork函数 函数声明 #include<sys/types.h> #include<unistd.h> pid_t fork(void);   根据书上所介绍的,fork函数有两个返回值,调用一次返回两次,一个是父进程调用fork后的返回值,一个是子进程中fork函数的返回值,该返回值为0。fork函数返回两次的前提是进程创建成功,如果进程创建失败,则只返回-1   以下是man手册里的部分相关描述:   fork() creates a new process by duplicating the calling process. The new 继续阅读 >>


陈健源 18/08/03 21:53:40
  这两天查了很多广度优先搜索算法,看到了很多文章,感觉里面对于这种模板的讲解不够细致。首先,广度优先算法的核心是它一定是把同一级的子节点都拉入队列,之后才会去遍历下一级节点。关于此算法的详细内容请自行查阅相关资料,本篇博客将集中在具体应用上。   使用限定条件:最典型的是走迷宫,但说白了其实是题目要求我们探寻最短路径,或者说题目可以被简化成坐标按几种种步长移动(不局限于二维,也可能是一维),也不局限于寻路,也可以用于对某一特定条件节点的搜索,或是对这种特定坐标进行标记。但都有一个核心点,就是要连续搜索,在找到一个合法节点后需要去探知其附近的合法节点,直到这一个区域内符合合法节点的节点都被找到。   注:以下所说的父子节点,从a坐标移动到b坐标,a节点就是父节点,b节点就是a的子节点 一.模板 本篇先以一道题的题解来说明问题 模板可以大体分成6部分 1.头文件段 2.坐标结构体段 3.障碍物预设段 4.已访问结点和移动坐标段 5.BFS算法函数段 6.主函数段 定义一个二维数组: i 继续阅读 >>


陈健源 18/08/03 09:37:22
队列和栈都是数据结构中非常常见的形式,下面我们就来剖析一下这两种结构。 一.栈 首先给出我非常喜欢的一种栈的写法,这是以前从别的地方看到的 #include<stdio.h> typedef struct tom { int num[5]; int top;  //栈顶指针,空栈时为-1;满栈时为n-1 n为数组容量 }stack; //压栈操作 int push(stack *ca,int n) { if (ca->top == 4)      //进行是否栈满的判断 return -1; ca->num[ca->top + 1] = n; ca->top++;          //移动栈顶指针 return 1; } //出栈操作 int pop(stack *ca, int *n) { if (ca->top == -1)     //进行是否空栈的判断 继续阅读 >>


陈健源 18/07/28 11:30:45
一.什么是系统调用,为什么要系统调用   要说这个问题,就得先说说我们开始学的那些标准库函数,比如fopen,fclose,fread等等,这些函数实际上是由open,close,read等系统调用完成的。   系统调用是内核提供给我们的接口,让程序能够与硬件交互,系统调用相当于提供了一个中间层,它更加的安全,基本操作命令是提供给用户使用的,而系统调用是提供给程序员使用的,系统调用可以用于系统空间,而标准函数无法用于内核空间,所以系统调用是相当必要的。标准库函数可以用来开发可移植性程序,而系统调用由于是内核提供的,故不能用于移植程序的开发。 二.几种常见的函数使用方法 1.chmod/fchmod函数 原型如下: #include<sys/types.h> #include<sys/stat.h> int chmod(const char *path,mode_t mode); int fchmod(int fildes,mode_t mode); mode 继续阅读 >>


陈健源 18/07/25 20:42:51
1