poll 函数的返回值是一个整数,得到了这个返回值以后,我们还是要逐个去检查,比如说,有一万个socket同时poll,返回值是3,我们还是只能去遍历这一万个socket,看看它们是否有IO动作。这就很低效了,于是,就有了epoll的改进,epoll可以直接通过“输出参数”(可以理解为C语言中的指针类型的参数),一个 epoll_event 数组,直接获得这三个socket,这就比较快了。
常用内置对象:
1、输出输入对象:request对象、response对象、out对象
2、通信控制对象:pageContext对象、session对象、application对象
3、Servlet对象:page对象、config对象
4、错误处理对象:exception对象
在正则表达式外是用 $1, $2 ... 来进行 后向引用,如果是在正则表达式中就需要用 \1, \2 ... 的形式来进 后向引用。
Java 实现 AES 解密失败,报错:Input length must be multiple of 16 when decrypting with padded cipher
解决方案:二进制转成16进制
group()
public String group(int group)
返回在以前匹配操作期间由给定组捕获的输入子序列。
对于匹配器 m、输入序列 s 和组索引 g,表达式 m.group(g) 和 s.substring(m.start(g), m.end(g)) 是等效的。
捕获组是从 1 开始从左到右的索引。组零表示整个模式,因此表达式 m.group(0) 等效于 m.group()。
如果该匹配成功了,但指定组未能匹配输入序列的任何部分,则返回 null
。注意,某些组(例如,(a*))匹配空字符串。当这些的组成功匹配输入中的空字符串时,此方法将返回 空字符串
。
final关键字是我们经常使用的关键字之一,它的用法有很多,但是并不是每一种用法都值得我们去广泛使用。它的主要用法有以下四种:
- 用来修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变。对于成员变量来讲,我们必须在声明时或者构造方法中对它赋值;
- 用来修饰方法参数,表示在变量的生存期中它的值不能被改变;
- 修饰方法,表示该方法无法被重写;
- 修饰类,表示该类无法被继承。
上面的4种方法中,第3种和第4种方法需要谨慎使用,因为在大多数情况下,如果是仅仅为了一点设计上的考虑,我们并不需要使用final来修饰方法和类。
一、request内置对象
request内置对象是最常用的对象之一,它代表的是java.servlet.HttpServletRequest类的对象。request内置对象中包含了有关浏览器请求的信息,并提供了多个用于获取cookie、header以及session内数据的方法。
request对象主要用于客户端请求处理,其中,该对象中所包含的方法有:
getRequest() | 返回当前页面中的request对象 |
getResponse() | 使用此方法将返回当前页面中的response对象 |
getPage() | 此方法返回当前页面中的page对象 |
getSession() | 返回当前页面中的session对象 |
getOut() | 返回当前页面中的out对象 |
getException() | 返回当前页面中的exception对象 |
getServletConfig() | 返回当前页的config对象 |
getServletContext() | 返回当前页中的application对象 |
setAttribute(String name) | 给指定的属性名设置属性值 |
getAttribute(String name) | 根据属性名称找到相应的属性值 |
setAttribute(String name, Object obj, int scope) | 在给定的范围内设置相应的属性值 |
Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。
简单来讲,Selector会不断地轮询注册在其上的Channel,如果某个Channel上面有新的TCP连接接入、读和写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作。