zoukankan      html  css  js  c++  java
  • javaWeb笔记

    缺省适配器设计模式:父类不实现该方法,让子类去实现(抽象方法)

    模板方法设计模式:定义一个操作中的方法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个方法的结构即可重定义该算法的某些特定步骤。如:在父类中有参方法调用无参方法,子类可以重写无参方法而不会影响到有参方法

    (html)

    1.基本规则

    html书写规则:
    ​ 1.双标签 你好宋伟 开始标记 结束标记 中间可以包裹内容或其他标签
    ​ 2.单标签(自结束标签) charset="utf-8" 没有结束标记 通常要搭配属性使用

    乱码:文本本身编码格式 跟读取的程序编码格式不统一
    统一编码格式
    

    html解析文本格式
    ​ 1.回车换行 需要使用html中特殊的方式(使用br标签)
    ​ 2.空格需要使用html特殊的格式(转义符) &xxx;
    ​ 3.编写文本时 注意不要跟html标签格式产生冲突

    2.常用标签

    2.1.标题标签

    加粗 改字号 换行(自己占满一行) 上下边距

    		<h1>测试标题</h1>
    		<h2 id="myaim">测试标题</h2>
    		<h3>测试标题</h3>
    		<h4>测试标题</h4>
    		<h5>测试标题</h5>
    		<h6>测试标题</h6>
    		普通文本
    		<p>这是一个段落</p>
    

    2.2.转义标签

    源代码 显示结果 描述
    &lt; <
    &gt; >
    &amp; &
    &quot; "
    &reg; 注册商标
    &copy; 版权符号
    &trade; tm符号
    &ensp; 半个空白位
    &emsp; 一个空白位
    &nbsp; b不断行的空白

    2.3.列表标签

    	定义列表	
    		<dl>
    			<dt>标题1</dt>
    			<dd>列表项1</dd>
    			<dd>列表项2</dd>
    			<dt>标题2</dt>
    			<dd>列表项1</dd>
    			<dd>列表项2</dd>
    		</dl>
    	有序列表
    		<ol type="a">
    			<li>列表项1</li>
    			<li>列表项2</li>
    			<li>列表项3</li>
    			<li>列表项4</li>
    		</ol>
    
    	无序列表
    		<ul type="square">
    			<li>列表项1</li>
    			<li>列表项2</li>
    			<li>列表项3</li>
    			<li>列表项4</li>
    		</ul>
    

    2.4.文本标签

    <u>测试</u><strong>文</strong><em>本</em>
    

    2.5.超链接

    <a href="1html基本规则.html">这是超链接</a>
    
    图片超链接
    <a href="#">
    			<img src="https://www.baidu.com/img/bd_logo1.png" width="50px" height="50px" alt="美女图片" />
    		</a>
    

    2.5.1.锚点

    使用id与name声明锚点的区别

    在老版本浏览器中最初都是使用name作为锚点位置的声明方式。

    网页中name属性的取值不唯一,因此造成锚点定位不准,所以后期浏览器都支持使用id作为锚点声明位置。

    Html5规范中已经声明取消name的锚点声明方式,建议使用id。

    超链接中经常嵌套图片标签

    <a href="#jump">点我看看</a>
    ---<p id="jump">我是该区域的相应内容</p>
        ---<p name="jump">我是该区域的相应内容</p>
    
    

    2.6图片

    Src 图片路径

    Width 图片宽度

    Height 图片高度

    Alt 图片说明(当图片失效时显示)

    1.src与href的区别:实际效果类似 内部处理方式不同 主要区别如下

    2.src( source )的值是外部资源的访问路径,在请求src资源时会将其指向的资源下载并应用到当前文档中,此时外部资源作为当前文档的一部分(引入),一般用作非文本引入方式。

    3.href 表示超文本引用(hypertext reference),在使用href请求外部资源时,会下载外部资源,同时当前网页读取外部资源的内容(引用)。一般用作文本引入方式

    注意:Link、a标签使用href,其余使用src

    <img src="coder.jpg" width="100px" height="100px" alt="图片"/>
    

    2.7表格

    常见标签

    Table 表格

    Tr 行

    Td 单元格(列)

    Th 列头

    Thead 表区域(头)

    Tbody 表区域(体)

    Tfoot 表区域(脚)

    Caption 表名

    Rowspan 跨行

    Cellspan 跨列

    2.8.表单

    Input标签
    <input  type=”xxxx”/>  常用表单元素
    type的属性值:
    	Text  文本框
    	Password  密码框
    	Radio  单选按钮
    	Checkbox  多选按钮
    	File    文件框
    	Color   颜色框
    	Date   日期框
    	Button  空白按钮
    	Submit  提交按钮
    	Reset   重置按钮
    
    Select标签  下拉菜单
    <select>       
    <option>选项1</option>
    <option>选项1</option>
    </select>
    
    Textarea标签 多行文本框
    <textarea></textarea>  
    
    Form表单(用户填写的数据需要通过表单标签提交)
    <form action=“http://www.sohu.com” method=“post”>  </form>
    Action属性 代表提交的地址
    Method属性 代表提交的方式get post
    
    

    2.8.get和post

    GET POST
    后退按钮/刷新 无害 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
    书签 可收藏为书签 不可收藏为书签
    缓存 能被缓存 不能缓存
    编码类型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
    历史 参数保留在浏览器历史中。 参数不会保存在浏览器历史中。
    对数据长度的限制 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 无限制。
    对数据类型的限制 只允许 ASCII 字符。 没有限制。也允许二进制数据。
    安全性 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。 在发送密码或其他敏感信息时绝不要使用 GET ! POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
    可见性 数据在 URL 中对所有人都是可见的。 数据不会显示在 URL 中。

    2.9.Frameset frame

    通过frameset 可以把页面拆分成多份
    通过frame在每一份引入一个单独的页面

    <FRAMESET  rows="20%,*"   frameborder="0">  //设置成无边框
          <FRAME src="top.html" name="topframe" scrolling="no" noresize="noresize">  //scrolling="no" 不显示滚动条
          <FRAMESET cols="20%,*">
          <FRAME src="left.html"  noresize="noresize" scrolling="no" name="leftframe" > //noresize="noresize"禁止调整框架大小
          <FRAME src="right.html" name="rightframe">  // name="rightframe"框架名称,便于超文本链接锚标签
    </FRAMESET>
    
    

    可以通过超链接的target属性 指定到跳转哪个frame

    <frame src="xxxx" name="窗口名">   
    
    <a href="xxx" target="窗口名">
    

    (css)

    1.css引入方式

    1.通过style标签 编写css代码 调试代码时使用
    2.通过style属性 不推荐使用(调试较麻烦)(优先级高)
    3.通过link标签引入css文件 最终格式 使页面整洁

    2.css常用选择器

    .元素选择器         元素名(标签名)
    2.class选择器   .class值     使用较灵活
    	class属性允许多个值
    3.id选择器           #id值             尽量不用
    
    4.并集选择器         选择器,选择器
    5.交集选择器         (元素)选择器选择器    
    6.后代选择器          选择器 选择器          可以跨代
    7.子代选择器          选择器>选择器         不可以跨带
    8.属性选择器         [属性] [属性="属性值"] 一般要搭配交集选择器使用
    9.全局选择器         *
    

    2.1.伪类选择器

    :active 点击动作

    :hover 鼠标悬停

    			a:hover{
    				color: greenyellow;				
    			}
    			a:active{
    				color: lightblue;
    			}
    			div{
    				border: 1px solid black;
    				height: 100px;
    				 100px;
    				
    			}
    			div:hover{
    				background-color: lightseagreen;
    				cursor: pointer;
    			}
    			div:active{
    				background-color: lightpink;
    			}
    			<a href="###">超链接</a>
    

    3.常用属性

    html元素中 有几个通用属性使用

    id 在页面中尽量不要重复

    name 表单元素的提交

    class 跟样式配合使用 值部分允许多个值

    style 直接编辑样式属性 尽量不用

    color 文字颜色

    font-size 文字大小

    font-family 字体类型

    text-align 文本对齐方式

    line-hight 行高

    text-decoration 文本修饰(下划线等)

    Background 背景图片

    background-repeat 背景图片重复方式

    background-color 背景颜色

    Widht 宽

    Height 高

    List-style 列表标签的列表样式

    3.1.元素排布规则相关属性display

    默认文档流

    block 块状元素 从上到下

    inline行内元素从左到右 不可以设置宽高 大小由内容大小决定

    inline-block行内块状元素 从左到右 可以设置宽高

    none不显示

    3.2盒子相关属性

    border 边框

    margin 外边距

    padding 内部填充

    margin: 10px;上下左右
    margin: 10px 20px;上下 左右
    margin: 10px 20px 30px; 上 左右 下
    margin: 10px 20px 30px 40px; 上 右 下 左
    margin: 10px auto; 做块左右居中
    margin-left: 100px; 四边可以单独设置

    padding 填充 用法和margin相似

    3.2.1盒子嵌套的问题

    当盒子模型嵌套使用时 会遇到超过边界的问题(内容大小 大于父元素的大小)

    可以使用overflow属性处理 隐藏超过的内容

    改变在父元素中的排列属性 可以使用float浮动属性 让元素水平排列

    通过div加浮动 可以使用css制作类似frameset的页面布局

    overflow例:
    .mainD{
    				border: 1px solid black;
    				 700px;
    				height: 500px;
    				overflow: hidden;/*处理内部超过边界*/
    			}
    

    3.3.position定位

    relative 相对定位 元素本身位置保留(不脱离文档流) 根据元素本身的位置进行偏移

    absolute 绝对定位 元素本身位置不保留(脱离文档流) 根据页面位置进行偏移 不推荐使用

    fixed 固定定位 元素本身位置不保留(脱离文档流)根据浏览器主体部分进行偏移 并固定在主偏移位置上(小广告)

    z-index 层叠顺序 需要使用在有定位属性的元素上,值大的覆盖值小的

    (javascript)

    1.js引入方式

    Script标签中编写

    通过script标签引入(当前标签无法再编辑js代码)

    在页面中直接编写javascript

    例:onclick="javascript:alert(1)" 尽量不用

    2.变量

    变量声明规则与java基本一致

    var num = 10 ;

    Js中变量类型

    Number 数字类型

    String 字符串类型

    Boolean 布尔类型

    Undefined 未定义或未初始化类型

    Null 表示空对象 一般作为对象类型的初始值

    Object 复合类型 包含js中的各种对象

    类型装换函数

    parseInt():字符串转换为整数(parseInt(string, radix))

    parseFloat():字符串转换为浮点数

    toString():返回字符串

    注意parseInt parseFloat对字符串的转换

    运算符

    inFixed(取小数位数)

    3.函数

    parseInt 函数可解析一个字符串,并返回一个整数 parseInt(string, radix)

    parseFloat 函数可解析一个字符串,并返回一个浮点数。 parseFloat(string)

    IsNaN 函数用于检查其参数是否是非数字值。 isNaN(value)

    eval 函数可计算某个字符串,并执行其中的的 JavaScript 代码。 eval(string)

    4.js事件

    Js会自动对行为进行监听,当触发某些行为时,可以调用自定义函数来完成用户交互。

    事件通常与函数配合使用,当事件发生时去调用函数

    鼠标点击 onclick

    鼠标悬浮于页面的某个热点之上 onmouseover

    在表单中选取输入框 onfocus

    内容改变 onchange

    页面或图像载入 onload

    键盘按键 onkeyup

    表单提交 onsubmit

    5.history对象

    常用方法

    back():加载上一个浏览的文档 用法:history.back()

    forward():加载下一个浏览过的文档 同上

    go(n):n为整数,跳转第n个浏览过的文档 同上

    ​ n==0 则刷新当前页面

    ​ n>0 则向前跳转到第n个文档

    ​ n<0 则向后跳转到第n个文档

    6.Location对象

    常用属性与方法

    Href属性 与浏览器地址栏直接输入地址效果相同

    Reload()方法 与浏览器刷新按钮效果相同

    location.href="http://www.baidu.com/";
    location.reload();
    

    7.Document对象

    常用属性与方法

    Title 可以设置文档的title

    getElementById() 返回对拥有指定id的第一个对象的引用

    getElementsByTagName() 返回带有指定名称的对象集合

    getElementsByName() 返回带有指定名称的对象集合

    选取元素的方法也可以通过元素调getElementById(xxx).getElementsByTagName(xxx),当选取元素有不需要的元素时 可以通过属性再次进行筛选

    document.title  页面标题
    document.getElementById("id名")       //通过id获取元素
    document.getElementsByTagName("div")  //通过标签名获取元素集合
    document.getElementsByName("honby")   //通过name属性获取元素集合
    document.getElementById("aimdiv").getElementsByTagName("input") //在目标父元素内部获取元素
    

    8.Window对象常用方法

    8.1.Open()

    打开新窗口

    newWin= window.open("弹出窗口的url", "窗口名称", "窗口特征")
    
    属性名称 说明
    height/width 窗口文档显示的高度与宽度(px)
    left/top 窗口的X,Y坐标(px)
    toolbar=yes|no|1|0 显示浏览器的工具栏,默认yes
    scrollbars=yes|no|1|0 是否显示滚动条,默认yes
    location=yes|no|1|0 是否显示地址字段,默认yes
    status=yes|no|1|0 是否添加状态栏,默认yes
    menubar=yes|no|1|0 是否显示菜单栏,默认yes
    reszable=yes|no|1|0 窗口是否可调节尺寸,默认yes
    titlebar=yes|no|1|0 是否显示标题栏,默认yes
    fullscreen=yes|no|1|0 是否使用全屏模式显示浏览器,默认no

    8.2.close()

    关闭窗口

    newWin.close()  关闭打开的窗口
    

    8.3l.setInterval

    setInterval(fun,time) 开启定时循环函数反复执行
    

    8.4.clearInterval

    clearInterval  停止循环
    方式1:
    var task = setInterval(“myfun()”,1000)
    方式2:
    var task = setInterval(myfun,1000)
    方式3:
    var task = setInterval(function(){xxxxxx},1000)
    clearInterval(task) 停止定时函数
    

    8.5.setTimeout

    setTimeout(fun,time)开启定时函数  执行一次
    

    8.6.clearTimeout

    clearTimeout() 方法可取消由 setTimeout() 方法设置的 timeout。
    用法与setInterval相同
    

    9.文档对象模型(dom树结构)

    9.1.Dom动态操作相关方法

    //动态操作元素 
    document.createElement 创建元素
    	var newli = document.createElement("li");
    	var newinput = document.createElement("input");
    	或者 newinput.setAttribute("type","button");
    
    //appendChild(newli)     追加子元素
    	newli.appendChild(newinput);
    	把新input加在新li里
    
    //insertBefore(newli,目标元素) 追加子元素  在目标元素之前
        document.getElementById("aimul").insertBefore(newli,document.getElementById("aimli"));
    
    //cloneNode(bol)  复制节点 true 复制当前节点及子节点   false  只复制当前节点
    //removeChild(ele) 删除指定节点
    
    //parentNode:返回节点的父节点
    //childNodes:返回子节点集合,childNodes[i]
    //firstElementChild:返回节点的第一个子节点,最普遍的用法是访问该元素的文本节点
    //lastElementChild: 返回节点的最后一个子节点
    //nextElementSibling:下一个节点
    //previousElementSibling:上一个节点
    

    9.2Dom操作表格相关方法

    rows  行数组
    cells 单元格数组
    //查看数组原素console.log(document.getElementById("mytable").rows[1].cells[1].innerHTML);
    
    insertRow(idx)    添加行
    insertCell(idx)   新增单元格(列)
    deleteRow(idx)    删除行
    function addTBVal(){
    				var newrow = document.getElementById("mytable").insertRow(document.getElementById("mytable").rows.length);
    				var newtd1 = newrow.insertCell(0);
    				var newtd2 = newrow.insertCell(1);
    				var newtd3 = newrow.insertCell(2);
        			//从文本框中读取数据写入table
    				newtd1.innerHTML=document.getElementById("nametext").value;
    				newtd2.innerHTML=document.getElementById("agetext").value;
    				newtd3.innerHTML=document.getElementById("addrtext").value;
    				
    			}
    //删除
    function delTBVal(){
    	document.getElementById("mytable").deleteRow(document.getElementById("mytable").rows.length-1);
    			}
    //操作html
    function addTBVal2(){
    				document.getElementById("mytable").innerHTML+="<tr><td>"+123+"</td><td>452</td><td>水里2</td></tr>";
    			}
    

    10.String

    IndexOf 查找指定字符

    subString 截取字符串

    Substr 截取字符串

    Split 分割

    toUppercase 转大写

    console.log(mystr.indexOf("de"));//查找成功返回条件的第一次出现的位置,失败返回-1
    console.log(mystr.lastIndexOf("de"));
    //if(mystr>0)//表示有查找的字符		
    console.log(mystr.substring(2,5));//起止位置
    console.log(mystr.substr(2,5));//起始位置 截取几个
    

    11.Math

    Ceil        向上取整
    Floor       向下取整 
    Round       四舍五入
    Random      伪随机数 [0-1)
    			console.log(Math.floor(myunm));
    			console.log(Math.ceil(myunm));
    			console.log(Math.round(myunm));
    			//如果想要指定的随机数  扩倍数    加减
    			//比如获取 0-3 parseInt(Math.random()*4)
    			console.log(parseInt(Math.random()*4));//[0,10)
    

    12.Date

    用法与java用法一致

    <script>
    			var mydate = new Date();
    			console.log(mydate);
    			//不能拿这个时间作为服务器时间的标准
    			var mydate2 = new Date("2022-2-2 2:2:2");
    			console.log(mydate2);
    			var mydate3 = new Date("2022/2/2 22:22:22");
    			console.log(mydate3);
    			
    			var myyear = mydate.getFullYear();
    			var mymonth = mydate.getMonth()+1;
    			var mydayofMonth = mydate.getDate();
    			var myhour = mydate.getHours();
    			var mymin = mydate.getMinutes();
    			var mysec = mydate.getSeconds();
    			
    			console.log(myyear+"年 "+mymonth+"月 "+mydayofMonth+"日 "+myhour+"时 "+mymin+"分 "+mysec+"秒")
    			//mydate.getTime() 是标准格林威治时间 与东8区有8小时时差
    			console.log(mydate.getTime());
    			
    			
    			
    		</script>
    

    13.Array数组对象

    数组 不需要指定成员类型 数组大小可以随意扩充 使用上类似 ArrayList

    属性

    Lenght 数组长度

    方法

    Join() 通过特定字符拼成字符串

    Sort() 排序

    Push() 尾部添加元素

    Pop() 尾部删除元素

    Shift() 头部删除元素

    Unshift() 头部添加元素

    //数组 不需要指定成员类型  数组大小可以随意扩充   使用上类似 ArrayList<Object>
    var myarr = [1,true,"ok"];
    var myarr2 = new Array(5);
    //数组取值 用索引(下标) 
    //遍历时 常用length属性
    for(var i = 0; i<myarr.length;i++){
    	console.log(myarr[i]);
    }
    var myarr3 = [4,2,6,5,1];
    console.log(myarr3.join("_"));
    //调用sort后 数组顺序按照排序后的排列
    myarr3.sort(function(a,b){
    	return b-a;
    })
    

    14.常用属性

    写页面中的动态效果,对元素 或者元素的属性进行操作

    .value 元素的值 input
    .innerHTML 双标签的内容 经常配合js改变页面中的元素和元素的状态
    .style 操作元素的样式
    .disabled 常用来禁用按钮
    .checked 单选按钮或复选按钮选中状态=true|false
    .selected 控制下拉列表中 那个option被选中=true|false
    .className class属性 不建议直接使用
    .test (正则)方法用于检测一个字符串是否匹配某个模式. var result = patt1.test(str);

    (jquery)

    1.基本语法

    1.1转换

    ​ 原生对象---->jquery对象 $(原生对象) 通过工厂函数$()进行转换
    ​ jquery对象---->原生对象 jquery对象[0] 或者 jquery对象.get(0)

    $(选择器).jquery提供的方法

    .css()   元素style      一个参数   取值  两个参数 赋值   
    .html()  元素innerHTML  不传参数   取值  一个参数 赋值
    .val()   元素value      不传参数   取值  一个参数 赋值
    

    2.选择器

    隐式循环
    1.如果赋值时 元素需要赋的值不同 隐式循环不适用
    2.元素集合读取属性时 隐式循环不适用

    基本选择器
    id选择器 #id名
    class选择器 .class名
    元素选择器 元素名

    全局选择器 *

    并集选择器 选择器,选择器
    交集选择器 选择器选择器
    后代选择器 选择器 选择器
    子代选择器 选择器>选择器 更严格(精准)
    相邻选择器 选择器+选择器
    同辈选择器 选择器~选择器
    属性选择器 [属性][属 性=属性 值]


    按元素位置筛选

    $("#testdiv :visible")

    :first 第一个
    :last 最后一个
    :even 单数
    :odd 双数
    :eq(idx) 指定索引
    :lt(idx) 小于指定索引
    :gt(idx) 大于指定索引

    表单元素选择器
    :input 所有input
    :text 文本框
    :password 密码框
    :radio 单选按钮
    :checkbox 复选按钮
    :button 空白按钮
    :submit 提交按钮
    :image 图片
    :checked 被选中的选项
    :selected 被选中的option

    可见性选择器
    :visable 显示的元素
    :hidden 隐藏的元素

    3.常用查找元素的方法

    元素集合.each(function(i){ i 索引
    ​ $(this)遍历到的元素
    })

    .事件(function(){}) 给元素绑定事件
    .on("事件",function(){}) 给元素绑定事件
    $(this)发生动作的元素

    查找元素的方法 经常配合选择器一起使用
    .find(选择器) 查找子元素
    .eq(idx) 按照索引查找元素
    .not(选择器) 排除指定元素
    .next() 向后查找同级元素
    .prev() 向前查找同级元素

    $("#testh1").html("<a href='###'>这是一个标题</a>");
    $("#testh1").text("<a href='###'>这是一个标题</a>")
    $("#testdiv").css("border","1px solid black");
    json格式 多参数设置
    $("#testdiv").css({"border":"1px solid black","color":"red"});
    $("#testdiv").addClass("cls3");
    $("#testdiv").removeClass("cls2");
    

    4.节点操作

    jquery中dom操作
    1.创建新元素添加

    2.找到页面中的元素添加(移动)

    子节点
    A.append(B) A里添加节点B
    B.appendTo(A) 把B添加到A的内部
    A.prepend(B) A里添加节点B 头部插入
    B.prependTo(A) 把B添加到A的内部 头部插入

    同辈节点
    A.after(B) A后边添加同辈节点B
    B.insertAfter(A) 把同辈节点B添加到A后边
    A.before(B) A前边添加同辈节点B
    B.insertBefore(A) 把同辈节点B添加到A前边

    替换节点
    A.replaceWith(B) B替换A
    B.replaceAll(A) B替换A

    复制节点
    A.clone(true) 复制A节点
    参数决定是否复制元素上绑定的事件

    删除节点
    A.remove() 删除A节点及其子孙
    A.empty() 删除A的子孙节点

    根据层次获取
    获取子节点
    A.children() 获取A的子节点

    获取同辈节点
    A.next() 获取A的紧邻下个节点
    A.prev() 获取A的紧邻上个节点
    A.siblings() 获取A的所有同辈节点

    获取父节点
    A.parent() 获取父节点
    A.parents() 获取所有父节点

    $("#myul").append("<li>testli2</li>");
    $("#myul2").append($("#aimli"));
    $("<li><input type='password'/></li>").appendTo($("#myul"));
    $("#myul").prepend("<li>testli2</li>");
    $("<li><input type='password'/></li>").prependTo($("#myul"));
    

    5.属性节点操作

    attr() 可以获取自定义属性 对disabled checked等属性返回undefined或者字符串值
    prop() 不可以获取自定义属性 对disabled checked等属性直接返回bol值

    removeAttr()   删除属性
    removeProd()   删除属性
    
    

    6.事件绑定

    $(“.mybtn”).on("事件",function(){  //绑定事件
    //执行的代码
    //匿名函数中可以使用$(this)
    })
    $(“.mybtn”).off(“事件”)          //解绑事件
    
    //表单的onsubmit 通过return 控制表单是否可以提交
    $(“#myform”).on("submit",function(){
    		return bol;
     })
    
    //动态生成元素后 再进行绑定
    //事件绑定有可能重复
    //统一解绑
    $(".testBtn").off("click");
    //统一重新绑定
    $(".testBtn").on("click",function(){
    //$(".testBtn").off("click");
    	alert(1);
    })
    
    console.log(event.keyCode);
    * event.keyCode键盘码
    $("#mytext").on("keyup",function(event){
    	//console.log($(this).val());
    	console.log(event.keyCode);
    })
    

    7.显示效果方法

    显示效果相关方法
    .show() 显示
    .hide() 隐藏
    .toggle() 切换显示/隐藏
    .fadeIn() 淡入
    .fadeOut() 淡出
    可以传参数 表示执行的速度

    $(function(){
    				$("#testBtn").on("click",function(){
    					$(".testcls").fadeOut(3000);
    				})
    			})
    

    (servlet and tomcat)

    项目改名

    需要修改项目文件下的:右键-properties-web project Setting下的文件名

    1.servlet

    getServletInfo()的作用:用来写Servlet的版本,Servlet的作者,Servlet所在的应用等说明性文字

    ServletConfig是什么?

    一个由servlet容器来传递信息到一个serclet初始化时使用servlet配置对象。

    也就是web.xml文件下的注册Servlet代码

    1.1.乱码问题

    tomcat启动乱码:

    在conf文件下的logging配置文件中加入以下代码:

    java.util.logging.ConsoleHandler.encoding = GBK
    

    tomcat运行乱码

    请求乱码:
    如果数据在传递时是正常中文,但是在servlet中取出是乱码,需要在请求对象中设置编码格式,对请求数据进行重新编码。
    request.setCharacterEncoding("UTF-8");
    响应乱码:
    如果数据在servlet中是正常中文,到页面中显示乱码,则需要在响应对象中设置响应头,让页面指定以何种编码格式解析响应数据。
    	response.setContentType("text/html;charset=UTF-8");
    
    

    如果要重写servlet接口,则必须在web.xml里注册servlet并创建映射。

    <!-- 注册 -->
    	<servlet>
    		<servlet-name>servletTest</servlet-name>
    		<servlet-class>com.amier.servletTest.servletTest</servlet-class>
    	</servlet>
    	
    	<!-- 创建映射 -->
    	<servlet-mapping>
    		<servlet-name>servletTest</servlet-name>
    		<url-pattern>/test</url-pattern>
    	</servlet-mapping>
    

    1.2.web容器启动创建servlet

    提高用户体验,建议在有用户访问的servlet中加入,滥用会导致占用过多内存

    <!-- web.xml文件下,在注册中加入 -->
    <servlet>
    		<servlet-name>servletTest</servlet-name>
    		<servlet-class>com.amier.servletTest.servletTest</servlet-class>
        	<load-on-startup>大于等于零的整型数(数字越小优先度越高)</load-on-startup>
    	</servlet>
    

    1.3.web容器中的两个map(重点)

    当Servlet实例被创建好后被放在了哪里? web.xml中URI与Servlet的映射关系反映到内存中是以什么形式存在呢?

    当servlet实例被创建好后,会将该Servlet实例的引用存放到一个Map集合中。该Map集合的key为URI,而value则购Servlet实例的引用,即Map<String, Servlet>。当Web容器从用户请求中分离出URI后,会首先到这个Map中查找是否存在其所对应的value,若存在,则直接调用其service()方法。若不存在,则需要创建该Servlet 实例。

    若请求的Servlet实例不存任,Web容器又是根据什么创建这个Servlet实例的呢?在Web容器的内存中,还存在一个Map集合。该Map集合的key为URI,而value则是web.xml中配置的与之对应的Servlet的全限定性类名,即Map<String, String>.。

    当Web容器从用户请求中分离出URI后,到第一个Map中又没有找到其所对应的Servlet实例,则会马上查找这第二个Map,从中找到其所对应的类名,再根据反射机制,创建这个Servlet实例。然后再将这个创建好的Servlet的引用放入到第一个Map中。

    当应用中存在多个Filter时,其执行顺序与其注册顺序一致
    两个Map:
    Web容器中存在两个Map,这两个Map的key均为Servlet注册时的<ur1-pattern/>值,但其value是不同的。
    第一个Map的value是Servlet实例对象的引用,第二个Map的value为<servlet-class/>的值,即Servlet类的全限定性类名。
    执行原理:
    当对Servlet的请求到达Servlet容器时,会先对请求进行解析,使用解析出的URI,作为比较对象,从第一个Map中查找是 否有相同的key。
    若存在相同的key,那么读取其value,即Servlet对象的引用,执行该Servlet的service()方法。
    若不存在相同的key,那么再从第二个Map中查找是否有相同的key。若存在,则读取其value,即要访问的Servlet的全限定性类名。然后使用反射机制创建该Servlet实例,并将该实例写入到第一个Map中 ,然后再执行该Servlet的service()方法。
    如果两个map都没有找到同名的key,则调到系统错误页面404
    
    
    

    1.4.获取并使用ServletConfig

    一个servlet对应一个ServletConfig。

    获取:连接tomcat源码,直接获取

    使用:

     String	getInitParameter(String name)   返回包含命名初始化参数值的字符串,如果该参数不存在,则返回null。
     Enumeration	getInitParameterNames()  将servlet的初始化参数的名称作为字符串对象的枚举返回,如果servlet没有初始化参数,则返回空枚举。
     ServletContext	getServletContext()   返回对调用方正在其中执行的ServletContext的引用。
     String	getServletName()   返回此servlet实例的名称。
    

    1.5.ServletContext

    ServletContext = application =整个应用

    定义任何servlet都可以访问的初始化参数

    <context-param>
    	<param-name>name</param-name>
    	<param-value>XXX</param-value>
    </context-param>
    ......
    
    

    定义只有该servlet可以访问的参数

    在注册下添加
    <servlet>
      	<servlet-name>AddServlet</servlet-name>
      	<servlet-class>com.amier.***</servlet-class> 
        //可以有多个
        <init-param>
        	<param-name>company</param-name>
            <param-value>Ubi</param-value>
        </init-param>
    </servlet>
    
    String getIntitParameter(String name)  获取参数的value
    void setAttribute(String name, Object object) 设置域属性(全局),内容保存在session服务器中->物理内存
    void getAttribute(String name)  获取所需域属性的value
    void removeAttribute(String name) 删除该域属性
    String getContextPath()  获取应用名称
    String	getRealPath(String path) 获取file协议下的路径
    

    1.6.url-pattern

    精确路径模式

    //请求路径必须与url-pattern值完全相同才能被当前Servlet处理
    <servlet-mapping>
      	<servlet-name>AddServlet</servlet-name>
      	<url-pattern>ooo/xxx/jjj/add</url-pattern> 
        <url-pattern>/add</url-pattern>  //可以有多个
    </servlet-mapping>
    

    通配符路径模式

    该模式中的路径由两部分组成:精确路径部分与通配符部分,请求路径中只有携带了url-pattern中指定的精确路径部分才能被当前Servlet处理(路径中只要有/add就能访问)
    <servlet-mapping>
      	<servlet-name>someServlet</servlet-name>
      	<url-pattern>/add/*</url-pattern> 
    </servlet-mapping>
    

    全路径模式

    /*与/的区别:/*是真正的全路径模式,可以拦截全部请求(动态资源and静态资源),/只会拦截静态资源的请求,不会拦截动态资源的请求
    <servlet-mapping>
      	<servlet-name>someServlet</servlet-name>
      	<url-pattern>/*</url-pattern> 
        <url-pattern>/</url-pattern> 
    </servlet-mapping>
    

    后缀名模式

    拦截url-pattern中所标记的后缀文件
    注意:带斜杆的通配符路径模式与后缀名模式不能同时使用,如:/*.do 否则服务器将不能正常启动
    <servlet-mapping>
      	<servlet-name>someServlet</servlet-name>
      	<url-pattern>*.do</url-pattern> 
        <url-pattern>*.action</url-pattern> 
    </servlet-mapping>
    

    匹配原则

    1.路径优先后缀匹配

    2.精确路径优先匹配

    3.最厂路径优先匹配

    自定义GenericServlet

    可以由一个抽象Servlet类空实现4个方法并继承ServletConfig,由子类继承,就可以直接使用ServletConfig的方法

    1.7.httpservlet

    可以调用doPost和doGet验证标单提交,如果只重写doPost,那么通过get方法访问会直接报错,如果想两个一起用,则需要在doGet中调用doPost(req,resp);

    1.8.HttpServletRequest

    请求的生命周期:一此请求对应一个请求对象,请求对象是由服务器创建的,当服务器向客户端发送响应结束后HttpServletRequest的实例对象被服务器销毁

    String getParameter (String name) 获取页面提交指定名称的参数值
    getParameterValues(String name) 获取页面提交相同名称参数的数组值(checkbox)
    void setCharacterEncoding("UTF-8") 设置字符编码格式
    Map getParameterMap() 返回一个保存了请求的所有参数和值的Map对象
    void setAttribute (String name,Object obj)   向request范围内设置属性,参数name为属性名,obj为属性值
    Object getAttribute (String name) 返回一个请求中属性名为name的属性值
    String getContextPath()   返回当前Web项目的根路径
    
    request.getContextPath();     项目名/WebDemo
    request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";  
    结果如下:http://localhost:8080/WebDemo/  
    request.getRemoteAddr()      客户端ip地址
    request.getServletPath()       请求的servlet的地址/student
    request.getRealPath("/")       在tomcat中的路径
    request.getRequestURI();       获得请求路径 /web_demo/student
    

    1.9. HttpResponse

    Public PrintWriter getWriter() 	获取响应的打印输出流对象
    Public void setContentType ("text/html;charset=UTF-8")	设置响应内容的类型和字符编码格式
    

    1.10.HttpSession

    HttpSession session = request.getSession();从request对象中获取会话(session)对象每个浏览器都会产生单独的session对象

    session作为会话对象,经常用来保存用户的相关登录信息,方便服务器调用(用户本身信息,权限信息等)

    setAttribute (String key,Object value)	以key/value的形式保存对象值
    getAttribute (String key)	通过key获取对象值 
    getMaxInactiveInterval()	获取session的有效非活动时间,以秒为单位
    getId()	获取session对象的编号
    invalidate()	设置session对象失效
    

    (jsp)

    jsp本质就是servlet,所以jsp也是单例多线程的

    <!-- HTML注释 -->客户端可见
    <%-- jsp-->客户端不可见
    
    注意:因为servlet是单例多线程的,所以定义可修改的变量一定会出现线程安全问题
    <!% private int a=9; %>声明语句块可以添加方法或访问权限修饰符(直接定义在类中)
    
    <%= a %> 表达式块,可以将java语句显示到客户端
    

    使用request()的原则:

    若向Session域中存放数据,则使用getSession(true),即getSession()

    若从Session中读取数据,则使用getSession(false)

    1.四种作用域

    ServletContext application域

    HttpServletRequet request域

    HttpSession session域

    PageContext page域

    2.跳转方式

    2.1.响应重定向

    响应重定向通过response对象调用,让浏览器向重定向的地址重新发送一次请求 response.sendRedirect("error.jsp");

    2.2.请求转发

    请求转发通过request对象调用,把请求对象和响应对象与要跳转的地址共享 request.getRequestDispatcher("showIP.jsp").forward(request, response);

    转发(较常用 效率更高) 重定向
    浏览器URL不变 浏览器URL的地址栏改变
    服务器行为(服务器内部) 客户端行为(告诉客户端重新请求)
    浏览器只做了一次访问请求 浏览器做了至少两次的访问请求的
    2次跳转之间传输的信息不会丢失 2次跳转之间传输的信息会丢失 (request范围)

    3. 九种内置对象

    3.1、request对象

    request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。

    3.2、response对象

    response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。

    3.3、session对象

    session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。

    3.4、application对象

    application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。

    (cookie and Web storage)

    注意:cookie在使用时,相同domain,不同path下可以存储同名cookie,为了让cookie设置统一,和解决cookie读取权限问题,经常会把cookie的path直接设置到根/

    1.cookie

    1.1在js中操作cookie

    1.Cookie写
    document.cookie="jscook=jsval1;path=/;expires="+new Date("2021-11-11 11:11:11");
    2.Cookie读
     var cookie =  document.cookie //读到键值对格式的字符串 如果需要找到特定key的value需要手动解析
    var mycks = document.cookie.split(";");
    		$.each(mycks,function(i,d){
    			var kvarr = d.split("= ");
    			console.log("key是:"+ kvarr[0]+" value是:"+kvarr[1]);
    		})
    3.删除cookie
    document.cookie="g_"+$(this).attr("gid")+"="+num+";path=/;expires="+new Date("2021-11-11 11:11:11");
    

    1.2.在java中操作cookie

    1.写cookie
    //创建/修改cookie对象,键值对形式
    Cookie cookie = new Cookie("username", "admin");
    //设置过期时间 单位秒,删除Cookie只需要修改过期时间为负数
    cookie.setMaxAge(60*60);
    //cookie还可以设置path等信息
    //cookie对象存入response,响应给浏览器,浏览器接受到响应数据时才会把cookie存储在本地
    response.addCookie(cookie);
    2.读cookie
    //从request对象中取值
    Cookie[] cookies = request.getCookies();
    //循环输出值
    for(Cookie cookie : cookies){
    	//键:  cookie.getName()
    	//值: cookie.getValue()
    }
    

    2.Web storage

    前端使用

    localStorage - 没有时间限制的数据存储
    sessionStorage - 针对一个 session 的数据存储,数据在浏览器关闭后自动删除
    注意:sessionStorage用法同localStorage
          Web storage是前端的技术,跟服务端的session对象无直接关系
          Web storage没有默认随请求发送到服务器的机制
    
    
    localStorage.username = "admin";//设置值
    console.log(localStorage.username)//取值
    localStorage.setItem("user", "user_name");//设置值
    console.log(localStorage.getItem("user"));//取值
    //以上两种方式存值/取值都可以
    localStorage.removeItem("user");//移除指定的key
    localStorage.clear();//清空所有的数据
    
    

    (El表达式和jstl标签)

    1.EL表达式

    只能获取数据,不能设置数据

    在jsp页面的任何静态部分均可通过${expression}的形式获取到指定表达式的值

    1.1获取数据

    request域中
    request.setAttribute(“testuser”,myuser);
    使用el表达式取域中user对象的username属性,并输出到页面
    ${testuser.username}
    
    操作符“.”
    获取对象的属性,例如:${news.title}
    操作符“[]”
    获取集合中的对象,例如:${newsList[0]}
    
    运算符 说明
    () 改变执行的优先级:${3*(4+5)}
    +./.*.-. $(3+2*9)
    ==,!=,<,>,<= 关系运算:${a==b} ${a eq b}
    &&,||,! ${true&&false}
    ?: 条件运算:$
    empty 用于检测变量名是否为空,是否等于NULL:${empty name}

    EL只能从四大域中获取数据,EL表达式访问作用域对象时,遵循从小到大的原则:pageScope-->requestScope-->sessionScope-->applicationScope。

    2.jstl

    Jstl需要jar包支持

    http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

    下载jstl.jar和standard.jar包

    在使用jstl的页面中,需要加入taglib指令,导入核心标签库

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

    通用标签
    set:设置指定范围内的变量值
    out:计算表达式并将结果输出显示
    remove:删除指定范围内的变量
    <c:set var= "example" value="${100+1}" scope="session"  />	
    <c:out value="${example}"/>
    <c:remove var= "example" scope="session"/>
    
    if条件判断语句
    v	<c:if test="${empty loginUser }" var="islogin" scope="session">
    <!--test:判断条件     可以将结果保存在域中 var是key  scope是域 -->
    		<c:redirect url="testEL.jsp"></c:redirect><!--配合跳转标签使用 -->
    	</c:if>
    	<c:if test="${not islogin}">
    <!--对之前保存的判断结果取反 完成else结构 -->
    		已登录
    	</c:if> 
    
    foreach语句
    <c:forEach items="${listEitity }" var="myentity">
    <!--items是遍历的集合      var是每次遍历到的对象 每次会存在域中 -->			<tr><td>${myentity.ename }</td><td>${myentity.eage }</td><td>${myentity.eaddr }</td></tr>
    <!--遍历中取值直接使用遍历到并存在域中的key,通过el表达式取值 -->
    </c:forEach>
    
    

    (ajax)

    1.ajax调用过程

    var xhr
    function MyAjaxReq(){
        //1.创建ajax核心对象XMLHttpRequest(浏览器内置,可直接使用)
     	if(window.XMLHttpRepuest){
            xhr = new XMLHttpRepuest();
     	}else{
     		//ie5和6版本使用AcctiveXObject对象发送AJAX请求
            xhr = new AcctiveXObject(Microsoft.XMLHTTP);
     	}
        //2.注册回调函数
        //程序执行到这里的时候,后面的函数不会执行,只是将回调的函数注册给xhr对象
        //等xhr对象的readyState发生改变的时候,后面的回调函数才会执行
        xhr.onreadystatechange = function(){//xhr对象的readyState发生改变的时候,回调一次
    		if(xhr.readyState==4&&xhr.status==200){
    			document.getElementById("id").innerHTML
    				=xhr.responseText;
            }
        }
        //3.开启浏览器和服务器之间的通道
        /*
        	method:指定请求方式为get或post
        	url:请求路径
        	async:true/false (支持异步/支持同步)
        */
        xhr.open("GET","***","true");//只开启通道
        //4.发送请求
        xhr.send("uname="+document.getElementById("username").value);
    }
    

    2.jqueryAjax

    $.ajax({
    				url:"ajaxServlet",//地址
    				type:"post",//请求类型
    				data:{"uname":$("#username").val()}, //请求的参数 常用json格式
    				dataType:"text",//返回数据的类型
    				success:function(data){//响应成功时的回调函数 data表示返回的数据
    					console.log(data);
    				}
    });
    
    
    //Jquery中简化ajax,json格式改为固定参数
    //data.records:读取data里所有的key
    $.get("url",data,"xml/json/text/script");
    $.post("url",data,"xml/json/text/script");
    //进一步简化
    .getJSON("url",data,function(){})
    

    注意1:使用ajax时,需要自己拼接参数,可以使用$("#myform").serialize(),把form序列化成键值对字符串格式。

    注意2:后台可以借助fastJSON工具,给前台返回json格式字符串。

    (ajax分页)

    详见用户查询系统

    (文件上传于下载)

    fileElementId:需要上传的文件的id

    <form action= " " method= "POST" enctype= "multipart/form-data">
        姓名: <input type="text" name= "name"/> <br>
        年龄: <input type="text" name= "age"/> <br>
        照片: <input type= "file" name= "photo"/> <br年
        <input type="submit" value= "注册"/>
    </form>
    
    // 1.判断请求是否为multipart请求
    if( !ServletFileUpload. isMultipartContent(request) ) {
    	throw new RuntimeException("当前请求不支持文件上传");
    }
    try {
    	//创建一个FileItem工厂
    	DiskFileItemFactory factory = new DiskFileItemFactory();
        
        //设置使用临时文件的边界值,大于该值,上传文件会先保存在临时文件中,否则,上传文件将直接写入到内存。.
        //单位:字节。本例设置边界值为1M
        factory. setSizeThreshold(1024 * 1024 * 1);
    
        //创建临时文件
        String tempPath = this.getServletContext() . getRealPath("/temp");
        File temp = new File(tempPath);
        factory. setRepository(temp );
    
       
    	//创建文件上传核心组件
    	Serv1etFileUpload upload = new Serv1etFileUp1oad(factory);
    	//解析请求,获取到所有的item
    	List<FileIte]n> items = upload. parseRequest(request);
    	//遍历items
    	for (FileItem item : items) {
    		if(item. isFormField()) { // 若item为 普通表单项
    		String fieldName = item. getFieldName();
    		//获职表单项名称
    		String fieldValue = item. getString();
    		//获取表单项的值
    		System. out . println(fieldName + " =”+ fieldValue);
    	} else {
    		//若item为文件表单项
    		String fileName = item.getName();
    		//获职上传文件原始名称
    		//获取输入流,其中有上传文件的内容
    		InputStream is = item.getInputStream();
    		//获取文件保存在服务器的路径
    		String path = this.getServletContext().getRealPath(" /images");
            //创建目标文件,将来用于保存上传文件
            File descFile = new File(path, fileName );
            //创建文件输出流
            OutputStream os = new FileOutputStream(descFile);
            //将输入流中的数据写入到输出流中
            int len = -1;
            byte[] buf = new byte[ 1024] ;
            while((len = is.read(buf)) != -1) {
                os.write(buf, 0, 1en);
            }
                //关闭流
                os.close();
            	is. close();
            //删除临时文件
            item.delete();
    

    (Filter过滤器)

     Filter的执行原理
    一个数组与一个Map:
    一个Map: Map的key为<ur1-pattern/ >的值, value为Filter实例对象的引用
    一个数组:存放着与请求相匹配的所有Filter
    执行原理:
    当对某资源的请求到达Web容器时,会先对请求进行解析,使用解析出的URI作为比较对象,从Map中查找是否存在相匹配的key。
    若存在,那么读取其value,即Filter对象的引用,将该引用存入到数组中。然后继续向后查找,直到将该Map查找完毕。这样在数组中就会存在按照查找顺序排好序的Filter引用。
    数组初始化完毕后,开始按照数组元素顺序进行执行。所有数组中的Filter全部执行完毕后,再跳转到请求的目标资源。
    
    

    过滤器是向 Web 应用程序的请求和响应处理添加功能的Web 服务组件

    Filter是一个可以加在servlet前执行的组件,可以通过这个机制制作一些通用性的功能,跟生活中用的水的过滤器的机制很相似。

    1.过滤器生命周期

    实例化-->初始化-->过滤-->销毁

    Filter接口:init() , doFilter() , destory()

    与servlet生命周期神似,也是单例多线程,一般不为Filter定义可修改成员变量

    2.Filter配置

    <filter>
    	<filter-name>myFilter</filter-name>
    	<filter-class>com.***.***.MyFilter<filter-class>
    </filter>    
    <filter-mapping>
    <filter-name>Some- Filter</filter-name>
    <!--若Filter为全路径匹配方式,那么url-pattern只能写为/*,而不能写为/。-->
    <url-pattern>/*</url-pattern>
    <!-- filter-mapping中可以不使用ur1-pattern, 但需要指定servlet-name,即当前过滤器拦截的是指定Servlet-->
    <servlet-name>SomeServ1et</servlet-name>
    </fi1ter-mapping>
    
    

    注意:过滤器的url-pattern为了制作通用功能,通常会配置为/*

    如果设置为/*所有访问服务器的请求都会先进入此过滤器,包括请求静态资源(html、css、js、图片、等等)

    3.FilterChain

    void doFilter(ServletRequest request, ServletResponse response)`
    调用链中的下一个筛选器,或者如果调用筛选器是链中的最后一个筛选器,则调用链末端的资源

    4.dispatcher

    在mapping下
    <dispatcher>***<dispatcher>
    FORWARD:表示当前过滤器只会拦截由-个Servlet通过RequestDispatcher的forward( )完成的跳转
    INCLUDE:表示当前过滤器只会拦截由一个Servlet通过RequestDispatcher的include( )完成的跳转
    REQUEST:表示当前过滤器会拦截普通请求,但对于forward()与include的跳转不进行拦截。默认值
    ERROR:表示当跳转到指定的错误处理页面时,这个跳转请求会被当前过滤器拦截
    
    

    5.装饰者设计模式

    要求1:装饰者要实现与目标类相同的接口
    要求2:装饰者类中要有目标对象作为成员变量,且目标对象是由带参构造器传入的

    满足开闭原则,软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的

    说白了就是多创建子类去调用目标类,实现装饰者链。

    像是一个装修公司,本身图纸是不会改变的,装修公司的老板会调用各个功能的装修师傅来完善细节,每一个工人对应一个功能。

    (Listeners监听器)

    1.配置

    <listener>
    	<listener-class>com.***.listeners.MyRequestListener</listener-class>
    </listener>
    

    1.1实现ServletRequestListener接口

    void requestDestroyed(ServletRequestEvent sre)
    请求即将超出web应用程序的范围。(销毁请求对象)
    void requestInitialized(ServletRequestEvent sre)
    请求即将进入web应用程序的范围。(初始化请求对象)
    

    1.2实现ServletRequestAttributeListener接口

    void	attributeAdded(ServletRequestAttributeEvent srae)
    向servlet请求添加新属性的通知。(当向request域中添加属性时会触发该方法执行)
    void	attributeRemoved(ServletRequestAttributeEvent srae)
    已从servlet请求中删除现有属性的通知。(当向request域中删除属性时会触发该方法执行)
    void	attributeReplaced(ServletRequestAttributeEvent srae)
    在servlet请求上替换属性的通知。(当向request域中重置属性时会触发该方法执行)
    

    1.3.ServletRequestEvent

    String	getName()
    获取事件源的name
    Object	getValue()
    获取事件源的value
    Object	getSource()
    获取事件源
    

    1.4.实现HttpSessionListener接口

    void	sessionCreated(HttpSessionEvent se)
    session创建时触发
    void	sessionDestroyed(HttpSessionEvent se)
    session销毁时触发
    

    其余详见https://docs.oracle.com/javaee/5/api/

  • 相关阅读:
    CSS3 Animation
    css形状大全
    HTML5 表单属性
    HTML5 Input 类型
    HTML 5 服务器发送事件
    jq制作博客已存在多少天
    Java网络编程与NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector
    Java网络编程和NIO详解3:IO模型与Java网络编程模型
    Java网络编程与NIO详解2:JAVA NIO 一步步构建IO多路复用的请求模型
    Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制
  • 原文地址:https://www.cnblogs.com/AmierX/p/12966969.html
  • Copyright © 2011-2022 走看看