html 1、B/S 软件的结构 JavaSE C/S Client Server B/S Browser Server
2、前端的开发流程
3、网页的组成部分 页面由三部分内容组成! 分别是内容(结构)、表现、行为 。
内容(结构),是我们在页面中可以看到的数据。我们称之为内容。一般内容 我们使用 html 技术来展示。
表现,指的是这些内容在页面上的展示形式。比如说。布局,颜色,大小等等。一般使用 CSS 技术实现。
行为,指的是页面中元素与输入设备交互的响应。一般使用 javascript 技术实现。
4、HTML 简介 Hyper Text Markup Language (超文本标记语言) 简写:HTML HTML 通过标签来标记要显示的网页中的各个部分。网页文件本身是一种文本文件, 通过在文本文件中添加标记符,可以告诉浏览器如何显示其中的内容(如:文字如何处理,画 面如何安排,图片如何显示等)
5、创建 HTML 文件 1、创建一个 web 工程(静态的 web 工程) 2、在工程下创建 html 页面 选择浏览器执行页面 第一个 html 示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <!DOCTYPE html><!-- 约束,声明 --> <!-- html标签表示html的开始 lang="zh_CN" 表示中文 html标签中一般分为两部分,分别是:head和body --> <html lang ="zh_CN" > <head > <meta charset ="UTF-8" > <title > 某东</title > </head > <body > hello <button onclick ="alert('hello,html')" > 按钮</button > hello,<br /> html <hr /> ! </body > </html >
注:Java 文件是需要先编译,再由 java 虚拟机跑起来。但 HTML 文件它不需要编译,直接由浏览器进行解析执行。
6、HTML 文件的书写规范
1 Html 的代码注释 <!-- 这是 html 注释,可以在页面右键查看源代码中看到 -->
7、HTML 标签介绍 1 2 3 4 5 6 7 8 1. 标签的格式: <标签名>封装的数据</标签名> 2. 标签名大小写不敏感。 3. 标签拥有自己的属性。 i. 分为基本属性:bgcolor="red" 可以修改简单的样式效果 ii. 事件属性: onclick="alert('你好!');" 可以直接设置事件响应后的代码。 4. 标签又分为,单标签和双标签。 i. 单标签格式: <标签名 /> br 换行 hr 水平线 ii. 双标签格式: <标签名> ...封装的数据...</标签名>
标签的语法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <!-- ①标签不能交叉嵌套 --> 正确:<div><span > 早啊,html</span > </div> 错误:<div><span > 早啊,html</div > </span> <hr /> <!-- ②标签必须正确关闭(闭合) --> <!-- i.有文本内容的标签: --> 正确:<div>早啊,html</div> 错误:<div>早啊,html <hr /> <!-- ii.没有文本内容的标签: --> 正确:<br />1 错误:<br >2 <hr /> <!-- ③属性必须有值,属性值必须加引号 --> 正确:<font color="blue" >早啊,html</font> 错误:<font color=blue>早啊,html</font> 错误:<font color>早啊,html</font> <hr /> <!-- ④注释不能嵌套 --> 正确:<!-- 注释内容 --> <br /> 错误:<!-- 注释内容 <!-- 注释内容 -->--> <hr />
注意事项: 1.html 代码不是很严谨。有时候标签不闭合,也不会报错。
8、常用标签介绍 font 字体标签
需求 1:在网页上显示 我是字体标签 ,并修改字体为 宋体,颜色为红色。
1 2 3 4 5 6 7 8 9 10 11 <body> <!-- 字体标签 需求1 :在网页上显示 我是字体标签 ,并修改字体为 宋体,颜色为红色。 font标签是字体标签,它可以用来修改文本的字体,颜色,大小(尺寸) color属性修改颜色 face属性修改字体 size属性修改文本大小 --> <font color ="red" face ="宋体" size ="7" > 我是字体标签</font > </body>
特殊字符
需求 1:把 换行标签 变成文本 转换成字符显示在页面上
1 2 3 4 5 6 7 8 9 10 11 12 13 <body> <!-- 特殊字符 需求1 :把 <br> 换行标签 变成文本 转换成字符显示在页面上 常用的特殊字符: < ===>>>> < > ===>>>> > 空格 ===>>>> --> 我是<br>标签<br/> 早啊 html! </body>
标题标签
标题标签是 h1 到 h6
需求 1:演示标题 1 到 标题 6 的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <body> <!-- 标题标签 需求1 :演示标题1 到 标题6 的 h1 - h6 都是标题标签 h1 最大 h6 最小 align 属性是对齐属性 left 左对齐(默认) center 剧中 right 右对齐 --> <h1 align ="left" > 标题1</h1 > <h2 align ="center" > 标题2</h2 > <h3 align ="right" > 标题3</h3 > <h4 > 标题4</h4 > <h5 > 标题5</h5 > <h6 > 标题6</h6 > <h7 > 标题7</h7 > </body>
超链接 ( ** 重 点 ,必 须 掌 握 * )
在网页中所有点击之后可以跳转的内容都是超连接
需求 1:普通的 超连接。
1 2 3 4 5 6 7 8 9 10 11 <body> <!-- a标签是 超链接 href属性设置连接的地址 target属性设置哪个目标进行跳转 _self 表示当前页面(默认值) _blank 表示打开新页面来进行跳转 --> <a href ="http://localhost:8080" > 百度</a > <br /> <a href ="http://localhost:8080" target ="_self" > 百度_self</a > <br /> <a href ="http://localhost:8080" target ="_blank" > 百度_blank</a > <br /> </body>
列表标签
无序列表 、 有序列表
需求 1:使用无序,列表方式,把东北 F4,赵四,刘能,小沈阳,宋小宝,展示出来
1 2 3 4 5 6 7 8 9 10 11 12 13 <body> <!--需求1 :使用无序,列表方式,把东北F4 ,赵四,刘能,小沈阳,宋小宝,展示出来 ul 是无序列表 type属性可以修改列表项前面的符号 li 是列表项 --> <ul type ="none" > <li > 赵四</li > <li > 刘能</li > <li > 小沈阳</li > <li > 宋小宝</li > </ul > </body>
img标签
img 标签可以在 html 页面上显示图片。
需求 1:使用 img 标签显示一张美女的照片。并修改宽高,和边框属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <body> <!--需求1 :使用img标签显示一张美女的照片。并修改宽高,和边框属性 img标签是图片标签,用来显示图片 src属性可以设置图片的路径 width属性设置图片的宽度 height属性设置图片的高度 border属性设置图片边框大小 alt属性设置当指定路径找不到图片时,用来代替显示的文本内容 在JavaSE 中路径也分为相对路径和绝对路径. 相对路径:从工程名开始算 绝对路径:盘符:/目录/ 文件名 在web中路径分为相对路径和绝对路径两种 相对路径: . 表示当前文件所在的目录 .. 表示当前文件所在的上一级目录 文件名 表示当前文件所在目录的文件,相当于 ./文件名 ./ 可以省略 绝对路径: 正确格式是: http : 错误格式是: 盘符:/目录/ 文件名 --> <img src ="1.jpg" width ="200" height ="260" border ="1" alt ="美女找不到" /> <img src ="../../2.jpg" width ="200" height ="260" /> <img src ="../imgs/3.jpg" width ="200" height ="260" /> <img src ="../imgs/4.jpg" width ="200" height ="260" /> <img src ="../imgs/5.jpg" width ="200" height ="260" /> <img src ="../imgs/6.jpg" width ="200" height ="260" /> </body>
表格标签( ** 重点,必须掌握 * )
需求 1:做一个 带表头的 ,三行,三列的表格,并显示边框 需求 2:修改表格的宽度,高度,表格的对齐方式,单元格间距。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 <body> <!-- 需求1 :做一个 带表头的 ,三行,三列的表格,并显示边框 需求2 :修改表格的宽度,高度,表格的对齐方式,单元格间距。 table 标签是表格标签 border 设置表格标签 width 设置表格宽度 height 设置表格高度 align 设置表格相对于页面的对齐方式 cellspacing 设置单元格间距 tr 是行标签 th 是表头标签 td 是单元格标签 align 设置单元格文本对齐方式 b 是加粗标签 --> <table align ="center" border ="1" width ="300" height ="300" cellspacing ="0" > <tr > <th > 1.1</th > <th > 1.2</th > <th > 1.3</th > </tr > <tr > <td > 2.1</td > <td > 2.2</td > <td > 2.3</td > </tr > <tr > <td > 3.1</td > <td > 3.2</td > <td > 3.3</td > </tr > </table > </body>
跨行跨列表格 (* 次重点,必须掌握 *)
需求 1:新建一个五行,五列的表格,第一行,第一列的单元格要跨两列,第二行第一列的单元格跨两行,第四行第四 列的单元格跨两行两列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 <body> <!-- 需求1 : 新建一个五行,五列的表格, 第一行,第一列的单元格要跨两列, 第二行第一列的单元格跨两行, 第四行第四列的单元格跨两行两列。 colspan 属性设置跨列 rowspan 属性设置跨行 --> <table width ="500" height ="500" cellspacing ="0" border ="1" > <tr > <td colspan ="2" > 1.1</td > <td > 1.3</td > <td > 1.4</td > <td > 1.5</td > </tr > <tr > <td rowspan ="2" > 2.1</td > <td > 2.2</td > <td > 2.3</td > <td > 2.4</td > <td > 2.5</td > </tr > <tr > <td > 3.2</td > <td > 3.3</td > <td > 3.4</td > <td > 3.5</td > </tr > <tr > <td > 4.1</td > <td > 4.2</td > <td > 4.3</td > <td colspan ="2" rowspan ="2" > 4.4</td > </tr > <tr > <td > 5.1</td > <td > 5.2</td > <td > 5.3</td > </tr > </table > </body>
了解 iframe 框架标签 (内嵌窗口)
ifarme 标签它可以在一个 html 页面上,打开一个小窗口,去加载一个单独的页面.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <body> 我是一个单独的完整的页面<br/><br /> <!--ifarme标签可以在页面上开辟一个小区域显示一个单独的页面 ifarme和a标签组合使用的步骤: 1 在iframe标签中使用name属性定义一个名称 2 在a标签的target属性上设置iframe的name的属性值 --> <iframe src ="3.标题标签.html" width ="500" height ="400" name ="abc" > </iframe > <br /> <ul > <li > <a href ="0-标签语法.html" target ="abc" > 0-标签语法.html</a > </li > <li > <a href ="1.font标签.html" target ="abc" > 1.font标签.html</a > </li > <li > <a href ="2.特殊字符.html" target ="abc" > 2.特殊字符.html</a > </li > </ul > </body>
表单标签 ( ** * 重点 ,必须掌握 * )
什么是表单? 表单就是 html 页面中,用来收集用户信息的所有元素集合.然后把这些信息发送给服务器 需求 1:创建一个个人信息注册的表单界面。包含用户名,密码,确认密码。性别(单选),兴趣爱好(多选),国籍(下 拉列表)。隐藏域,自我评价(多行文本域)。重置,提交。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 <body> <!--需求1 :创建一个个人信息注册的表单界面。包含用户名,密码,确认密码。性别(单选),兴趣爱好(多选),国籍(下拉列表)。 隐藏域,自我评价(多行文本域)。重置,提交。--> <!-- form标签就是表单 input type=text 是文件输入框 value设置默认显示内容 input type=password 是密码输入框 value设置默认显示内容 input type=radio 是单选框 name属性可以对其进行分组 checked="checked" 表示默认选中 input type=checkbox 是复选框 checked="checked" 表示默认选中 input type=reset 是重置按钮 value属性修改按钮上的文本 input type=submit 是提交按钮 value属性修改按钮上的文本 input type=button 是按钮 value属性修改按钮上的文本 input type=file 是文件上传域 input type=hidden 是隐藏域 当我们要发送某些信息,而这些信息,不需要用户参与,就可以使用隐藏域(提交的时候同时发送给服务器) select 标签是下拉列表框 option 标签是下拉列表框中的选项 selected="selected" 设置默认选中 textarea 表示多行文本输入框 (起始标签和结束标签中的内容是默认值) rows 属性设置可以显示几行的高度 cols 属性设置每行可以显示几个字符宽度 --> <form > <h1 align ="center" > 用户注册</h1 > <table align ="center" > <tr > <td > 用户名称:</td > <td > <input type ="text" value ="默认值" /> </td > </tr > <tr > <td > 用户密码:</td > <td > <input type ="password" value ="abc" /> </td > </tr > <tr > <td > 确认密码:</td > <td > <input type ="password" value ="abc" /> </td > </tr > <tr > <td > 性别:</td > <td > <input type ="radio" name ="sex" /> 男 <input type ="radio" name ="sex" checked ="checked" /> 女 </td > </tr > <tr > <td > 兴趣爱好:</td > <td > <input type ="checkbox" checked ="checked" /> Java <input type ="checkbox" /> JavaScript <input type ="checkbox" /> C++ </td > </tr > <tr > <td > 国籍:</td > <td > <select > <option > --请选择国籍--</option > <option selected ="selected" > 中国</option > <option > 美国</option > <option > 小日本</option > </select > </td > </tr > <tr > <td > 自我评价:</td > <td > <textarea rows ="10" cols ="20" > 我才是默认值</textarea > </td > </tr > <tr > <td > <input type ="reset" /> </td > <td align ="center" > <input type ="submit" /> </td > </tr > </table > </form > </body>
表单提交细节:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 <body> <!-- form标签是表单标签 action属性设置提交的服务器地址 method属性设置提交的方式GET (默认值)或POST 表单提交的时候,数据没有发送给服务器的三种情况: 1 、表单项没有name属性值 2 、单选、复选(下拉列表中的option标签)都需要添加value属性,以便发送给服务器 3 、表单项不在提交的form标签中 GET 请求的特点是: 1 、浏览器地址栏中的地址是:action属性[+?+请求参数] 请求参数的格式是:name=value&name=value 2 、不安全 3 、它有数据长度的限制 POST 请求的特点是: 1 、浏览器地址栏中只有action属性值 2 、相对于GET 请求要安全 3 、理论上没有数据长度的限制 --> <form action ="http://localhost:8080" method ="post" > <input type ="hidden" name ="action" value ="login" /> <h1 align ="center" > 用户注册</h1 > <table align ="center" > <tr > <td > 用户名称:</td > <td > <input type ="text" name ="username" value ="默认值" /> </td > </tr > <tr > <td > 用户密码:</td > <td > <input type ="password" name ="password" value ="abc" /> </td > </tr > <tr > <td > 性别:</td > <td > <input type ="radio" name ="sex" value ="boy" /> 男 <input type ="radio" name ="sex" checked ="checked" value ="girl" /> 女 </td > </tr > <tr > <td > 兴趣爱好:</td > <td > <input name ="hobby" type ="checkbox" checked ="checked" value ="java" /> Java <input name ="hobby" type ="checkbox" value ="js" /> JavaScript <input name ="hobby" type ="checkbox" value ="cpp" /> C++ </td > </tr > <tr > <td > 国籍:</td > <td > <select name ="country" > <option value ="none" > --请选择国籍--</option > <option value ="cn" selected ="selected" > 中国</option > <option value ="usa" > 美国</option > <option value ="jp" > 小日本</option > </select > </td > </tr > <tr > <td > 自我评价:</td > <td > <textarea name ="desc" rows ="10" cols ="20" > 我才是默认值</textarea > </td > </tr > <tr > <td > <input type ="reset" /> </td > <td align ="center" > <input type ="submit" /> </td > </tr > </table > </form > </body>
其他标签
需求 1:div、span、p 标签的演示
1 2 3 4 5 6 7 8 9 10 11 12 13 <body> <!--需求1 :div、span、p标签的演示 div标签 默认独占一行 span标签 它的长度是封装数据的长度 p段落标签 默认会在段落的上方或下方各空出一行来(如果已有就不再空) --> <div > div标签1</div > <div > div标签2</div > <span > span标签1</span > <span > span标签2</span > <p > p段落标签1</p > <p > p段落标签2</p > </body>
css 1、CSS技术介绍 CSS 是「层叠样式表单」。是用于(增强)控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。
2、CSS语法规则
选择器 :浏览器根据“选择器 ”决定受 CSS 样式影响的 HTML 元素(标签)。属性 (property) 是你要改变的样式名,并且每个属性都有一个值。属性和值被冒号分开,并 由花括号包围,这样就组成了一个完整的样式声明(declaration),例如:p {color: blue}多个声明 :如果要定义不止一个声明,则需要用分号将每个声明分开。虽然最后一条声明的 最后可以不加分号(但尽量在每条声明的末尾都加上分号) 例如:p{ color:red; font-size:30px; }注:一般每行只描述一个属性 CSS 注释:/*注释内容*/
3、CSS和HTML的结合方式 第一种: 在标签的 style 属性上设置”key:value value;”,修改标签样式。 需求 1:分别定义两个 div、span 标签,分别修改每个 div 标签的样式为:边框 1 个像素,实线,红色。
1 2 3 4 5 6 7 <body> <!--需求1 :分别定义两个 div、span标签,分别修改每个 div 标签的样式为:边框1 个像素,实线,红色。--> <div style ="border: 1px solid red;" > div标签1</div > <div style ="border: 1px solid red;" > div标签2</div > <span style ="border: 1px solid red;" > span标签1</span > <span style ="border: 1px solid red;" > span标签2</span > </body>
问题:这种方式的缺点? 1.如果标签多了。样式多了。代码量非常庞大。 2.可读性非常差。 3.Css 代码没什么复用性可言。
第二种:在 head 标签中,使用 style 标签来定义各种自己需要的 css 样式 格式如下: xxx {Key : value value; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <head> <meta charset ="UTF-8" > <title > Title</title > <style type ="text/css" > div { border : 1px solid red; } span { border : 1px solid red; } </style > </head > <body > <div > div标签1</div > <div > div标签2</div > <span > span标签1</span > <span > span标签2</span > </body >
问题:这种方式的缺点? 1.只能在同一页面内复用代码,不能在多个页面中复用 css 代码。 2.维护起来不方便,实际的项目中会有成千上万的页面,要到每个页面中去修改。工作量太大了。
第三种: 把 css 样式写成一个单独的 css 文件,再通过 link 标签引入即可复用。 使用 html 的 标签 导入 css 样 式文件。 1、css 文件内容:
1 2 3 4 5 6 div{ border : 1px solid yellow; } span{ border : 1px solid red; }
2、html 文件代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <head> <meta charset ="UTF-8" > <title > Title</title > <link rel ="stylesheet" type ="text/css" href ="1.css" /> </head > <body > <div > div标签1</div > <div > div标签2</div > <span > span标签1</span > <span > span标签2</span > </body >
4、CSS选择器 标签名选择器
标签名选择器的格式是: 标签名{ 属性:值; } 标签名选择器,可以决定哪些标签被动的使用这个样式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <head> <meta charset ="UTF-8" > <title > CSS选择器</title > <style type ="text/css" > div { border : 1px solid yellow; color : blue; font-size : 30px ; } span { border : 5px dashed blue; color : yellow; font-size : 20px ; } </style > </head > <body > <div > div标签1</div > <div > div标签2</div > <span > span标签1</span > <span > span标签2</span > </body >
id 选择器
id 选择器的格式是: #id 属性值{ 属性:值; } id 选择器,可以让我们通过 id 属性选择性的去使用这个样式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <head> <meta charset ="UTF-8" > <title > ID选择器</title > <style type ="text/css" > #id001 { color : blue; font-size : 30px ; border : 1px yellow solid; } #id002 { color : red; font-size : 20px ; border : 5px blue dotted ; } </style > </head > <body > <div id ="id002" > div标签1</div > <div id ="id001" > div标签2</div > </body >
class 选择器(类选择器)
class 类型选择器的格式是: .class 属性值{ 属性:值; } class 类型选择器,可以通过 class 属性有效的选择性地去使用这个样式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <head> <meta charset ="UTF-8" > <title > class类型选择器</title > <style type ="text/css" > .class01 { color : blue; font-size : 30px ; border : 1px solid yellow; } .class02 { color : grey; font-size : 26px ; border : 1px solid red; } </style > </head > <body > <div class ="class02" > div标签class01</div > <div class ="class02" > div标签</div > <span class ="class02" > span标签class01</span > <span > span标签2</span > </body >
组合选择器
组合选择器的格式是: 选择器 1,选择器 2,选择器 n{ 属性:值; } 组合选择器可以让多个选择器共用同一个 css 样式代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <head> <meta charset ="UTF-8" > <title > class类型选择器</title > <style type ="text/css" > .class01 , #id01 { color : blue; font-size : 20px ; border : yellow 1px solid; } </style > </head > <body > <div id ="id01" > div标签class01</div > <br /> <span class ="class01" > span 标签</span > <br /> <div > div标签</div > <br /> <div > div标签id01</div > <br /> </body >
5、常用样式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 1 、字体颜色 color:red; 颜色可以写颜色名如:black, blue, red, green 等 颜色也可以写 rgb 值和十六进制表示值:如 rgb (255 ,0 ,0 ),#00F6DE,如果写十六进制值必 须加#2 、宽度width :19px; 宽度可以写像素值:19px; 也可以写百分比值:20 %; 3 、高度height :20px; 高度可以写像素值:19px; 也可以写百分比值:20 %; 4 、背景颜色 background-color :#0F2D4C 5 、字体样式: color:#FF0000 ;字体颜色红色 font-size:20px; 字体大小 6 、红色 1 像素实线边框 border:1px solid red; 7 、DIV 居中 margin-left : auto; margin-right : auto; 8 、文本居中: text-align : center;9 、超连接去下划线 text-decoration : none; 10 、表格细线 table { border : 1px solid black; border-collapse : collapse; }td,th {border : 1px solid black; } 11 、列表去除修饰 ul { list-style : none; }1234567891011 <head> <meta charset ="UTF-8" > <title > 06-css常用样式.html</title > <style type ="text/css" > div { color : red; border : 1px yellow solid; width : 300px ; height : 300px ; background-color : green; font-size : 30px ; margin-left : auto; margin-right : auto; text-align : center; } table { border : 1px red solid; border-collapse : collapse; } td { border : 1px red solid; } a { text-decoration : none; } ul { list-style : none; } </style > </head > <body > <ul > <li > 11111111111</li > <li > 11111111111</li > <li > 11111111111</li > <li > 11111111111</li > <li > 11111111111</li > </ul > <table > <tr > <td > 1.1</td > <td > 1.2</td > </tr > </table > <a href ="http://www.baidu.com" > 百度</a > <div > 我是div标签</div > </body >
javascript 1、JavaScript 介绍
Javascript 语言诞生主要是完成页面的数据验证。因此它运行在客户端,需要运行浏览器来解析执行 JavaScript 代码。
JS 是 Netscape 网景公司的产品,最早取名为 LiveScript;为了吸引更多 java 程序员。更名为 JavaScript。
JS 是弱类型,Java 是强类型。
特点:
交互性(它可以做的就是信息的动态交互)
安全性(不允许直接访问本地硬盘)
跨平台性(只要是可以解释 JS 的浏览器都可以执行,和平台无关)
2、JavaScript 和 html 代码的结合方式 第一种方式:
只需要在 head 标签中,或者在 body 标签中, 使用 script 标签 来书写 JavaScript 代码
1 2 3 4 5 6 7 8 9 10 11 12 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > alert ("hello javaScript!" ); </script > </head > <body > </body >
第二种方式
使用 script 标签引入 单独的 JavaScript 代码文件
文件目录: html 代码内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" src ="1.js" > </script > <script type ="text/javascript" > alert ("hello javaScript!" ); </script > </head > <body > </body >
3、变量
什么是变量? 变量是可以存放某些值的内存的命名。
JavaScript 的变量类型: 数值类型: number 字符串类型: string 对象类型: object 布尔类型: boolean 函数类型: function
JavaScript 里特殊的值: undefined 未定义,所有 js 变量未赋于初始值的时候,默认值都是 undefined. null 空值 NaN 全称是:Not a Number。非数字。非数值。
JS 中的定义变量格式: var 变量名; var 变量名 = 值;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > var i; i = 12 ; i = "abc" ; var a = 12 ; var b = "abc" ; alert ( a * b ); </script > </head > <body > </body >
4、关系(比较)运算 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 等于: == 等于是简单的做字面值的比较 全等于: === 除了做字面值的比较之外,还会比较两个变量的数据类型 12 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > var a = "12" ; var b = 12 ; alert ( a == b ); alert ( a === b ); </script > </head > <body > </body >
5、逻辑运算 1 2 3 且运算: && 或运算: || 取反运算: !
在 JavaScript 语言中,所有的变量,都可以做为一个 boolean 类型的变量去使用。
0 、null、 undefined、””(空串) 都认为是 false;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > var a = "abc" ; var b = true ; var d = false ; var c = null ; </script > </head > <body > </body >
6、数组 (重点) 数组定义方式
JS 中 数组的定义: 格式: var 数组名 = []; // 空数组 var 数组名 = [1 , ’abc’ , true]; // 定义数组同时赋值元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > var arr = [true ,1 ]; arr[0 ] = 12 ; arr[2 ] = "abc" ; alert (arr.length ); for (var i = 0 ; i < arr.length ; i++){ alert (arr[i]); } </script > </head > <body > </body >
7、函数(重点) 函数的二种定义方式
第一种,可以使用 function 关键字来定义函数。
使用的格式如下: function 函数名(形参列表){ 函数体 }
在JavaScript 语言中,如何定义带有返回值的函数? 只需要在函数体内直接使用 return 语句返回值即可!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function fun ( ){ alert ("无参函数fun()被调用了" ); } function fun2 (a ,b ) { alert ("有参函数fun2()被调用了 a=>" + a + ",b=>" +b); } function sum (num1,num2 ) { var result = num1 + num2; return result; } alert ( sum (100 ,50 ) ); </script > </head > <body > </body >
函数的第二种定义方式 ,格式如下: 使用格式如下: var 函数名 = function(形参列表) { 函数体 }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > var fun = function ( ) { alert ("无参函数" ); } var fun2 = function (a,b ) { alert ("有参函数a=" + a + ",b=" + b); } var fun3 = function (num1,num2 ) { return num1 + num2; } alert ( fun3 (100 ,200 ) ); </script > </head > <body > </body >
注:在 Java 中函数允许重载。但是在 JS 中函数的重载会直接覆盖掉上一次的定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function fun (a,b ) { alert ("有参函数fun(a,b)" ); } function fun ( ) { alert ("无参函数fun()" ); } fun (1 ,"ad" ); </script > </head > <body > </body >
8、函数的 arguments 隐形参数(只在 function 函数内) 就是在 function 函数中不需要定义,但却可以直接用来获取所有参数的变量。我们管它叫隐形参数。 隐形参数特别像 java 基础的可变长参数一样。 public void fun( Object … args ); 可变长参数其他是一个数组。 那么 js 中的隐形参数也跟 java 的可变长参数一样。操作类似数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function fun (a ) { alert ( arguments .length ); alert ( arguments [0 ] ); alert ( arguments [1 ] ); alert ( arguments [2 ] ); alert ("a = " + a); for (var i = 0 ; i < arguments .length ; i++){ alert ( arguments [i] ); } alert ("无参函数fun()" ); } function sum (num1,num2 ) { var result = 0 ; for (var i = 0 ; i < arguments .length ; i++) { if (typeof (arguments [i]) == "number" ) { result += arguments [i]; } } return result; } alert ( sum (1 ,2 ,3 ,4 ,"abc" ,5 ,6 ,7 ,8 ,9 ) ); </script > </head > <body > </body >
9、JS 中的自定义对象 Object 形式的自定义对象
对象的定义: var 变量名 = new Object(); // 对象实例(空对象) 变量名.属性名 = 值; // 定义一个属性 变量名.函数名 = function(){} // 定义一个函数
对象的访问: 变量名.属性 / 函数名();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > var obj = new Object (); obj.name = "华仔" ; obj.age = 18 ; obj.fun = function ( ) { alert ("姓名:" + this .name + " , 年龄:" + this .age ); } obj.fun (); </script > </head > <body > </body >
{}花括号形式的自定义对象
1 2 3 4 5 var 变量名 = { 属性名:值, 属性名:值, 函数名:function ( ){} };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > var obj = { name :"javascript" , age :18 , fun : function ( ) { alert ("姓名:" + this .name + " , 年龄:" + this .age ); } }; alert (obj.name ); obj.fun (); </script > </head > <body > </body >
10、js中的事件
什么是事件? 事件是电脑输入设备与页面进行交互的响应。我们称之为事件。
常用的事件: onload 加载完成事件: 页面加载完成之后,常用于做页面 js 代码初始化操作 onclick 单击事件: 常用于按钮的点击响应操作。 onblur 失去焦点事件: 常用用于输入框失去焦点后验证其输入内容是否合法。 onchange 内容发生改变事件: 常用于下拉列表和输入框内容发生改变后操作 onsubmit 表单提交事件: 常用于表单提交前,验证所有表单项是否合法。
事件的注册又分为静态注册和动态注册两种:
什么是事件的注册(绑定)? 其实就是告诉浏览器,当事件响应后要执行哪些操作代码,叫事件注册或事件绑定。
静态注册事件 :通过 html 标签的事件属性直接赋于事件响应后的代码,这种方式我们叫静态注册。动态注册事件 :是指先通过 js 代码得到标签的 dom 对象,然后再通过 dom 对象.事件名 = function(){} 这种形式赋于事件 响应后的代码,叫动态注册。
动态注册基本步骤: 1、获取标签对象 2、标签对象.事件名 = fucntion(){}
onload 加载完成事件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function onloadFun ( ) { alert ('静态注册onload事件,所有代码' ); } window .onload = function ( ) { alert ("动态注册的onload事件" ); } </script > </head > <!--静态注册onload事件 onload事件是浏览器解析完页面之后就会自动触发的事件 <body onload="onloadFun();" > --> <body > </body >
onclick 单击事件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function onclickFun ( ) { alert ("静态注册onclick事件" ); } window .onload = function ( ) { var btnObj = document .getElementById ("btn01" ); btnObj.onclick = function ( ) { alert ("动态注册的onclick事件" ); } } </script > </head > <body > <button onclick ="onclickFun();" > 按钮1</button > <button id ="btn01" > 按钮2</button > </body >
onblur 失去焦点事件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function onblurFun ( ) { console .log ("静态注册失去焦点事件" ); } window .onload = function ( ) { var passwordObj = document .getElementById ("password" ); passwordObj.onblur = function ( ) { console .log ("动态注册失去焦点事件" ); } } </script > </head > <body> 用户名:<input type="text" onblur="onblurFun();"><br/> 密码:<input id="password" type="text" ><br/> </body>
onchange 内容发生改变事件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function onchangeFun ( ) { alert ("女神已经改变了" ); } window .onload = function ( ) { var selObj = document .getElementById ("sel01" ); selObj.onchange = function ( ) { alert ("男神已经改变了" ); } } </script > </head > <body > 请选择你心中的女神: <select onchange ="onchangeFun();" > <option > --女神--</option > <option > 芳芳</option > <option > 佳佳</option > <option > 娘娘</option > </select > 请选择你心中的男神: <select id ="sel01" > <option > --男神--</option > <option > 国哥</option > <option > 华仔</option > <option > 富城</option > </select > </body >
onsubmit 表单 提交事件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <head> <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function onsubmitFun ( ){ alert ("静态注册表单提交事件----发现不合法" ); return flase; } window .onload = function ( ) { var formObj = document .getElementById ("form01" ); formObj.onsubmit = function ( ) { alert ("动态注册表单提交事件----发现不合法" ); return false ; } } </script > </head > <body > <form action ="http://localhost:8080" method ="get" onsubmit ="return onsubmitFun();" > <input type ="submit" value ="静态注册" /> </form > <form action ="http://localhost:8080" id ="form01" > <input type ="submit" value ="动态注册" /> </form > </body >
11、DOM 模型 DOM 全称是 Document Object Model 文档对象模型 大白话,就是把文档中的标签,属性,文本,转换成为对象来管理。 那么 它们是如何实现把标签,属性,文本转换成为对象来管理呢。这就是我们马上要学习的重点。
Document 对象(重点)
Document 对象的理解: 第一点:Document 它管理了所有的 HTML 文档内容。 第二点:document 它是一种树结构的文档。有层级关系。 第三点:它让我们把所有的标签 都 对象化 第四点:我们可以通过 document 访问所有的标签对象。
什么是对象化?? JAVA中的面向对象 。举例: 有一个人有年龄:18 岁,性别:女,名字:张某某 我们要把这个人的信息对象化怎么办!
1 2 3 4 5 Class Person { private int age; private String sex; private String name; }
那么 html 标签 要 对象化 怎么办?
1 2 3 <body> <div id ="div01" > div01</div > </body>
模拟对象化,相当于:
1 2 3 4 5 6 7 class Dom { private String id; private String tagName; private Dom parentNode; private List<Dom> children; private String innerHTML; }
Document 对象中的方法介绍(重点) 1 2 3 4 5 document.getElementById(elementId) 通过标签的 id 属性查找标签 dom 对象,elementId 是标签的 id 属性值 document.getElementsByName(elementName) 通过标签的 name 属性查找标签 dom 对象,elementName 标签的 name 属性值 document.getElementsByTagName(tagname) 通过标签名查找标签 dom 对象。tagname 是标签名 document.createElement( tagName) 方法,通过给定的标签名,创建一个标签对象。tagName 是要创建的标签名 1234
注:document 对象的三个查询方法,如果有 id 属性,优先使用 getElementById 方法来进行查询 如果没有 id 属性,则优先使用 getElementsByName 方法来进行查询 如果 id 属性和 name 属性都没有最后再按标签名查 getElementsByTagName 以上三个方法,一定要在页面加载完成之后执行,才能查询到标签对象。
getElementById 方法示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 <head> <meta charset="UTF-8" > <title>Title</title> <script type="text/javascript" > function onclickFun () { var usernameObj = document.getElementById("username" ); var usernameText = usernameObj.value; var patt = /^\w{5 ,12 }$/; var usernameSpanObj = document.getElementById("usernameSpan" ); usernameSpanObj.innerHTML = "getElementById!" ; if (patt.test(usernameText)) { usernameSpanObj.innerHTML = "<img src=\"right.png\" width=\"18\" height=\"18\">" ; } else { usernameSpanObj.innerHTML = "<img src=\"wrong.png\" width=\"18\" height=\"18\">" ; } } </script> </head> <body> 用户名:<input type="text" id="username" value="wzg" /> <span id="usernameSpan" style="color:red;" > </span> <button onclick="onclickFun()" >较验</button> </body>
正则表达式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 <head> <meta charset="UTF-8" > <title>Title</title> <script type="text/javascript" > var patt = /^\w{5 ,12 }$/; var str = "wzg168[[[" ; alert( patt.test(str) ); </script> </head> <body> </body>
getElementsByName 方法示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 <head> <meta charset="UTF-8" > <title>Title</title> <script type="text/javascript" > function checkAll () { var hobbies = document.getElementsByName("hobby" ); for (var i = 0 ; i < hobbies.length; i++){ hobbies[i].checked = true ; } } function checkNo () { var hobbies = document.getElementsByName("hobby" ); for (var i = 0 ; i < hobbies.length; i++){ hobbies[i].checked = false ; } } function checkReverse () { var hobbies = document.getElementsByName("hobby" ); for (var i = 0 ; i < hobbies.length; i++) { hobbies[i].checked = !hobbies[i].checked; } } </script> </head> <body> 兴趣爱好: <input type="checkbox" name="hobby" value="cpp" checked="checked" >C++ <input type="checkbox" name="hobby" value="java" >Java <input type="checkbox" name="hobby" value="js" >JavaScript <br/> <button onclick="checkAll()" >全选</button> <button onclick="checkNo()" >全不选</button> <button onclick="checkReverse()" >反选</button> </body>
getElementsByTagName 方法示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <head> <meta charset="UTF-8" > <title>Title</title> <script type="text/javascript" > window.onload = function(){ } function checkAll () { alert( document.getElementById("btn01" ) ); var inputs = document.getElementsByTagName("input" ); for (var i = 0 ; i < inputs.length; i++){ inputs[i].checked = true ; } } </script> </head> <body> <!--as --> 兴趣爱好: <input type="checkbox" value="cpp" checked="checked" >C++ <input type="checkbox" value="java" >Java <input type="checkbox" value="js" >JavaScript <br/> <button id="btn01" onclick="checkAll()" >全选</button> </body>
createElement 方法示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <head> <meta charset="UTF-8" > <title>Title</title> <script type="text/javascript" > window.onload = function () { var divObj = document.createElement("div" ); var textNodeObj = document.createTextNode("createTextNode" ); divObj.appendChild(textNodeObj); document.body.appendChild(divObj); } </script> </head> <body> </body>
节点的常用属性和方法
节点就是标签对象
方法: 通过具体的元素节点调用getElementsByTagName() 方法,获取当前节点的指定标签名孩子节点 appendChild( oChildNode ) 方法,可以添加一个子节点,oChildNode 是要添加的孩子节点
属性:
1 2 3 4 5 6 7 8 9 childNodes 属性,获取当前节点的所有子节点 firstChild 属性,获取当前节点的第一个子节点 lastChild 属性,获取当前节点的最后一个子节点 parentNode 属性,获取当前节点的父节点 nextSibling 属性,获取当前节点的下一个节点 previousSibling 属性,获取当前节点的上一个节点 className 用于获取或设置标签的 class 属性值 innerHTML 属性,表示获取设置起始标签和结束标签中的内容 innerText 属性,表示获取设置起始标签和结束标签中的文本
练习:DOM 查询练习
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 <head> <meta charset ="UTF-8" > <title > dom查询</title > <link rel ="stylesheet" type ="text/css" href ="style/css.css" /> <script type ="text/javascript" > window .onload = function ( ){ document .getElementById ("btn01" ).onclick = function ( ) { var bjObj = document .getElementById ("bj" ); alert (bjObj.innerHTML ); } var btn02Ele = document .getElementById ("btn02" ); btn02Ele.onclick = function ( ){ var lis = document .getElementsByTagName ("li" ); alert (lis.length ) }; var btn03Ele = document .getElementById ("btn03" ); btn03Ele.onclick = function ( ){ var genders = document .getElementsByName ("gender" ); alert (genders.length ) }; var btn04Ele = document .getElementById ("btn04" ); btn04Ele.onclick = function ( ){ var lis = document .getElementById ("city" ).getElementsByTagName ("li" ); alert (lis.length ) }; var btn05Ele = document .getElementById ("btn05" ); btn05Ele.onclick = function ( ){ alert (document .getElementById ("city" ).childNodes .length ); }; var btn06Ele = document .getElementById ("btn06" ); btn06Ele.onclick = function ( ){ alert ( document .getElementById ("phone" ).firstChild .innerHTML ); }; var btn07Ele = document .getElementById ("btn07" ); btn07Ele.onclick = function ( ){ var bjObj = document .getElementById ("bj" ); alert ( bjObj.parentNode .innerHTML ); }; var btn08Ele = document .getElementById ("btn08" ); btn08Ele.onclick = function ( ){ alert ( document .getElementById ("android" ).previousSibling .innerHTML ); }; var btn09Ele = document .getElementById ("btn09" ); btn09Ele.onclick = function ( ){ alert (document .getElementById ("username" ).value ); }; var btn10Ele = document .getElementById ("btn10" ); btn10Ele.onclick = function ( ){ document .getElementById ("username" ).value = "国哥你真牛逼" ; }; var btn11Ele = document .getElementById ("btn11" ); btn11Ele.onclick = function ( ){ alert (document .getElementById ("city" ).innerHTML ); }; }; </script > </head > <body> <div id="total"> <div class="inner"> <p> 你喜欢哪个城市? </p> <ul id="city"> <li id="bj">北京</li> <li>上海</li> <li>东京</li> <li>首尔</li> </ul> <br> <br> <p> 你喜欢哪款单机游戏? </p> <ul id="game"> <li id="rl">红警</li> <li>实况</li> <li>极品飞车</li> <li>魔兽</li> </ul> <br /> <br /> <p> 你手机的操作系统是? </p> <ul id="phone"><li>IOS</li><li id="android">Android</li><li>Windows Phone</li></ul> </div> <div class="inner"> gender: <input type="radio" name="gender" value="male"/> Male <input type="radio" name="gender" value="female"/> Female <br> <br> name: <input type="text" name="name" id="username" value="abcde"/> </div> </div> <div id="btnList"> <div><button id="btn01">查找#bj节点</button></div> <div><button id="btn02">查找所有li节点</button></div> <div><button id="btn03">查找name=gender的所有节点</button></div> <div><button id="btn04">查找#city下所有li节点</button></div> <div><button id="btn05">返回#city的所有子节点</button></div> <div><button id="btn06">返回#phone的第一个子节点</button></div> <div><button id="btn07">返回#bj的父节点</button></div> <div><button id="btn08">返回#android的前一个兄弟节点</button></div> <div><button id="btn09">返回#username的value属性值</button></div> <div><button id="btn10">设置#username的value属性值</button></div> <div><button id="btn11">返回#bj的文本值</button></div> </div> </body>
jquery 1、jQuery介绍
什么是 jQuery ? jQuery,顾名思义,也就是 JavaScript 和查询(Query),它就是辅助 JavaScript 开发的 js 类库。
jQuery 核心思想!!! 它的核心思想是 write less,do more(写得更少,做得更多),所以它实现了很多浏览器的兼容问题。
jQuery 流行程度 jQuery 现在已经成为最流行的 JavaScript 库,在世界前 10000 个访问最多的网站中,有超过 55%在使用 jQuery。
jQuery 好处!!! jQuery 是免费、开源的,jQuery 的语法设计可以使开发更加便捷,例如操作文档对象、选择 DOM 元素、 制作动画效果、事件处理、使用 Ajax 以及其他功能
2、jQuery的初体验 需求:使用 jQuery 给一个按钮绑定单击事件?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <head> <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > Insert title here</title > <script type ="text/javascript" src ="../script/jquery-1.7.2.js" > </script > <script type ="text/javascript" > $(function ( ) { var $btnObj = $("#btnId" ); $btnObj.click (function ( ) { alert ("jQuery 的单击事件" ); }); }); </script > </head > <body > <button id ="btnId" > SayHello</button > </body > 12345678910111213141516171819202122232425
常见问题? 1、使用 jQuery 一定要引入 jQuery 库吗? 答案: 是,必须 2、jQuery 中的$到底是什么? 答案: 它是一个函数 3、怎么为按钮添加点击响应函数的? 答案: ①使用 jQuery 查询到标签对象 ②使用标签对象.click( function(){} );
3、jQuery核心函数 $ 是 jQuery 的核心函数,能完成 jQuery 的很多功能。$()就是调用$这个函数
1、传入参数为 [ 函数 ] 时: 表示页面加载完成之后。相当于 window.onload = function(){} 2、传入参数为 [ HTML 字符串 ] 时: 会对我们创建这个 html 标签对象 3、传入参数为 [ 选择器 字符串 ] 时: $(“#id 属性值”); id 选择器,根据 id 查询标签对象 $(“标签名”); 标签名选择器,根据指定的标签名查询标签对象 $(“.class 属性值”); 类型选择器,可以根据 class 属性查询标签对象 4、传入参数为 [ DOM 对象 ] 时: 会把这个 dom 对象转换为 jQuery 对象
4、jQuery 对象和 dom 对象区分 什么是 jQuery 对象,什么是 dom 对象
Dom 对象 1.通过 getElementById()查询出来的标签对象是 Dom 对象 2.通过 getElementsByName()查询出来的标签对象是 Dom 对象 3.通过 getElementsByTagName()查询出来的标签对象是 Dom 对象 4.通过 createElement() 方法创建的对象,是 Dom 对象 DOM 对象 Alert 出来的效果是:[object HTML 标签名 Element]
jQuery 对象 1.通过 JQuery 提供的 API 创建的对象,是 JQuery 对象 2.通过 JQuery 包装的 Dom 对象,也是 JQuery 对象 3.通过 JQuery 提供的 API 查询到的对象,是 JQuery 对象 jQuery 对象 Alert 出来的效果是:[object Object]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <head> <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > Insert title here</title > <script type ="text/javascript" src ="../script/jquery-1.7.2.js" > </script > <script type ="text/javascript" > $(function ( ) { $(" <div>" + " <span>div-span1</span>" + " <span>div-span2</span>" + " </div>" ).appendTo ("body" ); var btnObj = document .getElementById ("btn01" ); alert ($("button" )); }); </script > </head > <body > <button id ="btn01" > 按钮1</button > <button > 按钮2</button > <button > 按钮3</button > </body > 1234567891011121314151617181920212223242526272829303132
问题:jQuery 对象的本质是什么?
jQuery 对象是 dom 对象的数组 + jQuery 提供的一系列功能函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <head> <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > Insert title here</title > <script type ="text/javascript" src ="../script/jquery-1.7.2.js" > </script > <script type ="text/javascript" > $(function ( ){ alert ($); }); </script > </head > <body > <button id ="btn" > Button</button > </body > 12345678910111213
jQuery 对象和 Dom 对象使用区别
jQuery 对象不能使用 DOM 对象的属性和方法 DOM 对象也不能使用 jQuery 对象的属性和方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 <head> <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > Insert title here</title > <script type ="text/javascript" src ="../script/jquery-1.7.2.js" > </script > <script type ="text/javascript" > $(function ( ){ alert ( $("button:first" ) ); }); </script > </head > <body > <div id ="testDiv" > Atguigu is Very Good!</div > <button id ="dom2dom" > 使用DOM对象调用DOM方法</button > <button id ="dom2jQuery" > 使用DOM对象调用jQuery方法</button > <button id ="jQuery2jQuery" > 使用jQuery对象调用jQuery方法</button > <button id ="jQuery2dom" > 使用jQuery对象调用DOM方法</button > </body > 123456789101112131415161718192021222324252627282930313233343536373839404142
Dom 对象和 jQuery 对象互转
dom 对象转化为 jQuery 对象(重点) 1、先有 DOM 对象 2、$( DOM 对象 ) 就可以转换成为 jQuery 对象
jQuery 对象转为 dom 对象(重点) 1、先有 jQuery 对象 2、jQuery 对象[下标]取出相应的 DOM 对象
5、jQuery选择器(重点) 基本选择器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 #ID 选择器:根据 id 查找标签对象 .class 选择器:根据 class 查找标签对象 element 选择器:根据标签名查找标签对象 * 选择器:表示任意的,所有的元素 selector1,selector2 组合选择器:合并选择器 1 ,选择器 2 的结果并返回 p.myClass 表示标签名必须是 p 标签,而且 class 类型还要是 myClass 123456 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Untitled Document</title> <style type="text/css"> div, span, p { width: 140px; height: 140px; margin: 5px; background: #aaa; border: #000 1px solid; float: left; font-size: 17px; font-family: Verdana; } div.mini { width: 55px; height: 55px; background-color: #aaa; font-size: 12px; } div.hide { display: none; } </style> <script type="text/javascript" src="../script/jquery-1.7.2.js"></script> <script type="text/javascript"> $(function () { //1.选择 id 为 one 的元素 "background-color","#bbffaa" $("#btn1").click(function () { // css() 方法 可以设置和获取样式 $("#one").css("background-color","#bbffaa"); }); //2.选择 class 为 mini 的所有元素 $("#btn2").click(function () { $(".mini").css("background-color","#bbffaa"); }); //3.选择 元素名是 div 的所有元素 $("#btn3").click(function () { $("div").css("background-color","#bbffaa"); }); //4.选择所有的元素 $("#btn4").click(function () { $("*").css("background-color","#bbffaa"); }); //5.选择所有的 span 元素和id为two的元素 $("#btn5").click(function () { $("span,#two").css("background-color","#bbffaa"); }); }); </script> </head> <body> <!-- <div> <h1>基本选择器</h1> </div> --> <input type="button" value="选择 id 为 one 的元素" id="btn1" /> <input type="button" value="选择 class 为 mini 的所有元素" id="btn2" /> <input type="button" value="选择 元素名是 div 的所有元素" id="btn3" /> <input type="button" value="选择 所有的元素" id="btn4" /> <input type="button" value="选择 所有的 span 元素和id为two的元素" id="btn5" /> <br> <div class="one" id="one"> id 为 one,class 为 one 的div <div class="mini">class为mini</div> </div> <div class="one" id="two" title="test"> id为two,class为one,title为test的div <div class="mini" title="other">class为mini,title为other</div> <div class="mini" title="test">class为mini,title为test</div> </div> <div class="one"> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini"></div> </div> <div class="one"> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini" title="tesst">class为mini,title为tesst</div> </div> <div style="display:none;" class="none">style的display为"none"的div</div> <div class="hide">class为"hide"的div</div> <div> 包含input的type为"hidden"的div<input type="hidden" size="8"> </div> <span class="one" id="span">^^span元素^^</span> </body> </html> 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
层级选择器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 ancestor descendant 后代选择器 :在给定的祖先元素下匹配所有的后代元素 parent > child 子元素选择器:在给定的父元素下匹配所有的子元素 prev + next 相邻元素选择器:匹配所有紧接在 prev 元素后的 next 元素 prev ~ sibings 之后的兄弟元素选择器:匹配 prev 元素之后的所有 siblings 元素 1234 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Untitled Document</title> <style type="text/css"> div, span, p { width: 140px; height: 140px; margin: 5px; background: #aaa; border: #000 1px solid; float: left; font-size: 17px; font-family: Verdana; } div.mini { width: 55px; height: 55px; background-color: #aaa; font-size: 12px; } div.hide { display: none; } </style> <script type="text/javascript" src="../script/jquery-1.7.2.js"></script> <script type="text/javascript"> $(document).ready(function(){ //1.选择 body 内的所有 div 元素 $("#btn1").click(function(){ $("body div").css("background", "#bbffaa"); }); //2.在 body 内, 选择div子元素 $("#btn2").click(function(){ $("body > div").css("background", "#bbffaa"); }); //3.选择 id 为 one 的下一个 div 元素 $("#btn3").click(function(){ $("#one+div").css("background", "#bbffaa"); }); //4.选择 id 为 two 的元素后面的所有 div 兄弟元素 $("#btn4").click(function(){ $("#two~div").css("background", "#bbffaa"); }); }); </script> </head> <body> <!-- <div> <h1>层级选择器:根据元素的层级关系选择元素</h1> ancestor descendant : parent > child : prev + next : prev ~ siblings : </div> --> <input type="button" value="选择 body 内的所有 div 元素" id="btn1" /> <input type="button" value="在 body 内, 选择div子元素" id="btn2" /> <input type="button" value="选择 id 为 one 的下一个 div 元素" id="btn3" /> <input type="button" value="选择 id 为 two 的元素后面的所有 div 兄弟元素" id="btn4" /> <br><br> <div class="one" id="one"> id 为 one,class 为 one 的div <div class="mini">class为mini</div> </div> <div class="one" id="two" title="test"> id为two,class为one,title为test的div <div class="mini" title="other">class为mini,title为other</div> <div class="mini" title="test">class为mini,title为test</div> </div> <div class="one"> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini"></div> </div> <div class="one"> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini" title="tesst">class为mini,title为tesst</div> </div> <div style="display:none;" class="none">style的display为"none"的div</div> <div class="hide">class为"hide"的div</div> <div> 包含input的type为"hidden"的div<input type="hidden" size="8"> </div> <span id="span">^^span元素^^</span> </body> </html> 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
过滤选择器 基本过滤器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 :first 获取第一个元素 :last 获取最后个元素 :not (selector) 去除所有与给定选择器匹配的元素 :even 匹配所有索引值为偶数的元素,从 0 开始计数 :odd 匹配所有索引值为奇数的元素,从 0 开始计数 :eq (index) 匹配一个给定索引值的元素 :gt (index) 匹配所有大于给定索引值的元素 :lt (index) 匹配所有小于给定索引值的元素 :header 匹配如 h1, h2, h3 之类的标题元素 :animated 匹配所有正在执行动画效果的元素 12345678910 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Untitled Document</title> <style type="text/css"> div, span, p { width: 140px; height: 140px; margin: 5px; background: #aaa; border: #000 1px solid; float: left; font-size: 17px; font-family: Verdana; } div.mini { width: 55px; height: 55px; background-color: #aaa; font-size: 12px; } div.hide { display: none; } </style> <script type="text/javascript" src="../script/jquery-1.7.2.js"></script> <script type="text/javascript"> $(document).ready(function(){ function anmateIt(){ $("#mover").slideToggle("slow", anmateIt); } anmateIt(); }); $(document).ready(function(){ //1.选择第一个 div 元素 $("#btn1").click(function(){ $("div:first").css("background", "#bbffaa"); }); //2.选择最后一个 div 元素 $("#btn2").click(function(){ $("div:last").css("background", "#bbffaa"); }); //3.选择class不为 one 的所有 div 元素 $("#btn3").click(function(){ $("div:not(.one)").css("background", "#bbffaa"); }); //4.选择索引值为偶数的 div 元素 $("#btn4").click(function(){ $("div:even").css("background", "#bbffaa"); }); //5.选择索引值为奇数的 div 元素 $("#btn5").click(function(){ $("div:odd").css("background", "#bbffaa"); }); //6.选择索引值为大于 3 的 div 元素 $("#btn6").click(function(){ $("div:gt(3)").css("background", "#bbffaa"); }); //7.选择索引值为等于 3 的 div 元素 $("#btn7").click(function(){ $("div:eq(3)").css("background", "#bbffaa"); }); //8.选择索引值为小于 3 的 div 元素 $("#btn8").click(function(){ $("div:lt(3)").css("background", "#bbffaa"); }); //9.选择所有的标题元素 $("#btn9").click(function(){ $(":header").css("background", "#bbffaa"); }); //10.选择当前正在执行动画的所有元素 $("#btn10").click(function(){ $(":animated").css("background", "#bbffaa"); }); //11.选择没有执行动画的最后一个div $("#btn11").click(function(){ $("div:not(:animated):last").css("background", "#bbffaa"); }); }); </script> </head> <body> <input type="button" value="选择第一个 div 元素" id="btn1" /> <input type="button" value="选择最后一个 div 元素" id="btn2" /> <input type="button" value="选择class不为 one 的所有 div 元素" id="btn3" /> <input type="button" value="选择索引值为偶数的 div 元素" id="btn4" /> <input type="button" value="选择索引值为奇数的 div 元素" id="btn5" /> <input type="button" value="选择索引值为大于 3 的 div 元素" id="btn6" /> <input type="button" value="选择索引值为等于 3 的 div 元素" id="btn7" /> <input type="button" value="选择索引值为小于 3 的 div 元素" id="btn8" /> <input type="button" value="选择所有的标题元素" id="btn9" /> <input type="button" value="选择当前正在执行动画的所有元素" id="btn10" /> <input type="button" value="选择没有执行动画的最后一个div" id="btn11" /> <h3>基本选择器.</h3> <br><br> <div class="one" id="one"> id 为 one,class 为 one 的div <div class="mini">class为mini</div> </div> <div class="one" id="two" title="test"> id为two,class为one,title为test的div <div class="mini" title="other">class为mini,title为other</div> <div class="mini" title="test">class为mini,title为test</div> </div> <div class="one"> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini"></div> </div> <div class="one"> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini" title="tesst">class为mini,title为tesst</div> </div> <div style="display:none;" class="none">style的display为"none"的div</div> <div class="hide">class为"hide"的div</div> <div> 包含input的type为"hidden"的div<input type="hidden" size="8"> </div> <div id="mover">正在执行动画的div元素.</div> </body> </html> 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
内容过滤器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 :contains (text) 匹配包含给定文本的元素 :empty 匹配所有不包含子元素或者文本的空元素 :parent 匹配含有子元素或者文本的元素 :has (selector) 匹配含有选择器所匹配的元素的元素 1234 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Untitled Document</title> <style type="text/css"> div, span, p { width: 140px; height: 140px; margin: 5px; background: #aaa; border: #000 1px solid; float: left; font-size: 17px; font-family: Verdana; } div.mini { width: 55px; height: 55px; background-color: #aaa; font-size: 12px; } div.hide { display: none; } </style> <script type="text/javascript" src="../script/jquery-1.7.2.js"></script> <script type="text/javascript"> $(document).ready(function(){ function anmateIt(){ $("#mover").slideToggle("slow", anmateIt); } anmateIt(); }); /** :contains(text) :empty :has(selector) :parent */ $(document).ready(function(){ //1.选择 含有文本 'di' 的 div 元素 $("#btn1").click(function(){ $("div:contains('di')").css("background", "#bbffaa"); }); //2.选择不包含子元素(或者文本元素) 的 div 空元素 $("#btn2").click(function(){ $("div:empty").css("background", "#bbffaa"); }); //3.选择含有 class 为 mini 元素的 div 元素 $("#btn3").click(function(){ $("div:has(.mini)").css("background", "#bbffaa"); }); //4.选择含有子元素(或者文本元素)的div元素 $("#btn4").click(function(){ $("div:parent").css("background", "#bbffaa"); }); }); </script> </head> <body> <input type="button" value="选择 含有文本 'di' 的 div 元素" id="btn1" /> <input type="button" value="选择不包含子元素(或者文本元素) 的 div 空元素" id="btn2" /> <input type="button" value="选择含有 class 为 mini 元素的 div 元素" id="btn3" /> <input type="button" value="选择含有子元素(或者文本元素)的div元素" id="btn4" /> <br><br> <div class="one" id="one"> id 为 one,class 为 one 的div <div class="mini">class为mini</div> </div> <div class="one" id="two" title="test"> id为two,class为one,title为test的div <div class="mini" title="other">class为mini,title为other</div> <div class="mini" title="test">class为mini,title为test</div> </div> <div class="one"> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini"></div> </div> <div class="one"> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini" title="tesst">class为mini,title为tesst</div> </div> <div style="display:none;" class="none">style的display为"none"的div</div> <div class="hide">class为"hide"的div</div> <div> 包含input的type为"hidden"的div<input type="hidden" size="8"> </div> <div id="mover">正在执行动画的div元素.</div> </body> </html> 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
属性过滤器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 [attribute] 匹配包含给定属性的元素。 [attribute=value] 匹配给定的属性是某个特定值的元素 [attribute!=value] 匹配所有不含有指定的属性,或者属性不等于特定值的元素。 [attribute^=value] 匹配给定的属性是以某些值开始的元素 [attribute$=value] 匹配给定的属性是以某些值结尾的元素 [attribute*=value] 匹配给定的属性是以包含某些值的元素 [attrSel1][attrSel2][attrSelN] 复合属性选择器,需要同时满足多个条件时使用。 1234567 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Untitled Document</title> <style type="text/css"> div,span,p { width: 140px; height: 140px; margin: 5px; background: #aaa; border: #000 1px solid; float: left; font-size: 17px; font-family: Verdana; } div.mini { width: 55px; height: 55px; background-color: #aaa; font-size: 12px; } div.hide { display: none; } </style> <script type="text/javascript" src="../script/jquery-1.7.2.js"></script> <script type="text/javascript"> /** [attribute] [attribute=value] [attribute!=value] [attribute^=value] [attribute$=value] [attribute*=value] [attrSel1][attrSel2][attrSelN] */ $(function() { //1.选取含有 属性title 的div元素 $("#btn1").click(function() { $("div[title]").css("background", "#bbffaa"); }); //2.选取 属性title值等于'test'的div元素 $("#btn2").click(function() { $("div[title='test']").css("background", "#bbffaa"); }); //3.选取 属性title值不等于'test'的div元素(*没有属性title的也将被选中) $("#btn3").click(function() { $("div[title!='test']").css("background", "#bbffaa"); }); //4.选取 属性title值 以'te'开始 的div元素 $("#btn4").click(function() { $("div[title^='te']").css("background", "#bbffaa"); }); //5.选取 属性title值 以'est'结束 的div元素 $("#btn5").click(function() { $("div[title$='est']").css("background", "#bbffaa"); }); //6.选取 属性title值 含有'es'的div元素 $("#btn6").click(function() { $("div[title*='es']").css("background", "#bbffaa"); }); //7.首先选取有属性id的div元素,然后在结果中 选取属性title值 含有'es'的 div 元素 $("#btn7").click(function() { $("div[id][title*='es']").css("background", "#bbffaa"); }); //8.选取 含有 title 属性值, 且title 属性值不等于 test 的 div 元素 $("#btn8").click(function() { $("div[title][title!='test']").css("background", "#bbffaa"); }); }); </script> </head> <body> <input type="button" value="选取含有 属性title 的div元素." id="btn1" style="display: none;"/> <input type="button" value="选取 属性title值等于'test'的div元素." id="btn2" /> <input type="button" value="选取 属性title值不等于'test'的div元素(没有属性title的也将被选中)." id="btn3" /> <input type="button" value="选取 属性title值 以'te'开始 的div元素." id="btn4" /> <input type="button" value="选取 属性title值 以'est'结束 的div元素." id="btn5" /> <input type="button" value="选取 属性title值 含有'es'的div元素." id="btn6" /> <input type="button" value="组合属性选择器,首先选取有属性id的div元素,然后在结果中 选取属性title值 含有'es'的 div 元素." id="btn7" /> <input type="button" value="选取 含有 title 属性值, 且title 属性值不等于 test 的 div 元素." id="btn8" /> <br> <br> <div class="one" id="one"> id 为 one,class 为 one 的div <div class="mini">class为mini</div> </div> <div class="one" id="two" title="test"> id为two,class为one,title为test的div <div class="mini" title="other">class为mini,title为other</div> <div class="mini" title="test">class为mini,title为test</div> </div> <div class="one"> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini"></div> </div> <div class="one"> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini" title="tesst">class为mini,title为tesst</div> </div> <div style="display: none;" class="none">style的display为"none"的div</div> <div class="hide">class为"hide"的div</div> <div> 包含input的type为"hidden"的div<input type="hidden" value="123456789" size="8"> </div> <div id="mover">正在执行动画的div元素.</div> </body> </html> 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
1 2 3 4 5 6 7 8 9 10 11 12 :input 匹配所有 input, textarea, select 和 button 元素 :text 匹配所有 文本输入框 :password 匹配所有的密码输入框 :radio 匹配所有的单选框 :checkbox 匹配所有的复选框 :submit 匹配所有提交按钮 :image 匹配所有 img 标签 :reset 匹配所有重置按钮 :button 匹配所有 input type=button <button>按钮 :file 匹配所有 input type=file 文件上传 :hidden 匹配所有不可见元素 display :none 或 input type=hidden 1234567891011
表单对象属性过滤器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 :enabled 匹配所有可用元素 :disabled 匹配所有不可用元素 :checked 匹配所有选中的单选,复选,和下拉列表中选中的 option 标签对象 :selected 匹配所有选中的 option 1234 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Untitled Document</title> <script type="text/javascript" src="../script/jquery-1.7.2.js"></script> <script type="text/javascript"> $(function(){ /** :input :text :password :radio :checkbox :submit :image :reset :button :file :hidden 表单对象的属性 :enabled :disabled :checked :selected */ //1.对表单内 可用input 赋值操作 $("#btn1").click(function(){ // val()可以操作表单项的value属性值 // 它可以设置和获取 $(":text:enabled").val("我是万能的程序员"); }); //2.对表单内 不可用input 赋值操作 $("#btn2").click(function(){ $(":text:disabled").val("管你可用不可用,反正我是万能的程序员"); }); //3.获取多选框选中的个数 使用size()方法获取选取到的元素集合的元素个数 $("#btn3").click(function(){ alert( $(":checkbox:checked").length ); }); //4.获取多选框,每个选中的value值 $("#btn4").click(function(){ // 获取全部选中的复选框标签对象 var $checkboies = $(":checkbox:checked"); // 老式遍历 // for (var i = 0; i < $checkboies.length; i++){ // alert( $checkboies[i].value ); // } // each方法是jQuery对象提供用来遍历元素的方法 // 在遍历的function函数中,有一个this对象,这个this对象,就是当前遍历到的dom对象 $checkboies.each(function () { alert( this.value ); }); }); //5.获取下拉框选中的内容 $("#btn5").click(function(){ // 获取选中的option标签对象 var $options = $("select option:selected"); // 遍历,获取option标签中的文本内容 $options.each(function () { // 在each遍历的function函数中,有一个this对象。这个this对象是当前正在遍历到的dom对象 alert(this.innerHTML); }); }); }) </script> </head> <body> <h3>表单对象属性过滤选择器</h3> <button id="btn1">对表单内 可用input 赋值操作.</button> <button id="btn2">对表单内 不可用input 赋值操作.</button><br /><br /> <button id="btn3">获取多选框选中的个数.</button> <button id="btn4">获取多选框选中的内容.</button><br /><br /> <button id="btn5">获取下拉框选中的内容.</button><br /><br /> <form id="form1" action="#"> 可用元素: <input name="add" value="可用文本框1"/><br> 不可用元素: <input name="email" disabled="disabled" value="不可用文本框"/><br> 可用元素: <input name="che" value="可用文本框2"/><br> 不可用元素: <input name="name" disabled="disabled" value="不可用文本框"/><br> <br> 多选框: <br> <input type="checkbox" name="newsletter" checked="checked" value="test1" />test1 <input type="checkbox" name="newsletter" value="test2" />test2 <input type="checkbox" name="newsletter" value="test3" />test3 <input type="checkbox" name="newsletter" checked="checked" value="test4" />test4 <input type="checkbox" name="newsletter" value="test5" />test5 <br><br> 下拉列表1: <br> <select name="test" multiple="multiple" style="height: 100px" id="sele1"> <option>浙江</option> <option selected="selected">辽宁</option> <option>北京</option> <option selected="selected">天津</option> <option>广州</option> <option>湖北</option> </select> <br><br> 下拉列表2: <br> <select name="test2"> <option>浙江</option> <option>辽宁</option> <option selected="selected">北京</option> <option>天津</option> <option>广州</option> <option>湖北</option> </select> </form> </body> </html> 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
6、jQuery元素筛选
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 eq () 获取给定索引的元素 功能跟 :eq () 一样 first () 获取第一个元素 功能跟 :first 一样 last () 获取最后一个元素 功能跟 :last 一样 filter (exp) 留下匹配的元素 is (exp) 判断是否匹配给定的选择器,只要有一个匹配就返回,true has (exp) 返回包含有匹配选择器的元素的元素 功能跟 :has 一样 not (exp) 删除匹配选择器的元素 功能跟 :not 一样 children (exp) 返回匹配给定选择器的子元素 功能跟 parent>child 一样 find (exp) 返回匹配给定选择器的后代元素 功能跟 ancestor descendant 一样next () 返回当前元素的下一个兄弟元素 功能跟 prev + next 功能一样nextAll () 返回当前元素后面所有的兄弟元素 功能跟 prev ~ siblings 功能一样 nextUntil () 返回当前元素到指定匹配的元素为止的后面元素 parent () 返回父元素 prev (exp) 返回当前元素的上一个兄弟元素 prevAll () 返回当前元素前面所有的兄弟元素 prevUnit (exp) 返回当前元素到指定匹配的元素为止的前面元素 siblings (exp) 返回所有兄弟元素 add () 把add匹配的选择器的元素添加到当前 jquery 对象中123456789101112131415161718 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>DOM查询</title> <style type="text/css"> div, span, p { width: 140px; height: 140px; margin: 5px; background: #aaa; border: #000 1px solid; float: left; font-size: 17px; font-family: Verdana; } div.mini { width: 55px; height: 55px; background-color: #aaa; font-size: 12px; } div.hide { display: none; } </style> <script type="text/javascript" src="../script/jquery-1.7.2.js"></script> <script type="text/javascript"> $(document).ready(function(){ function anmateIt(){ $("#mover").slideToggle("slow", anmateIt); } anmateIt(); /** 过滤 eq(index|-index) first() last() hasClass(class) filter(expr|obj|ele|fn) is(expr|obj|ele|fn)1.6* has(expr|ele) not(expr|ele|fn) slice(start,[end]) 查找 children([expr]) closest(expr,[con]|obj|ele)1.6* find(expr|obj|ele) next([expr]) nextall([expr]) nextUntil([exp|ele][,fil])1.6* parent([expr]) parents([expr]) parentsUntil([exp|ele][,fil])1.6* prev([expr]) prevall([expr]) prevUntil([exp|ele][,fil])1.6* siblings([expr]) 串联 add(expr|ele|html|obj[,con]) */ //(1)eq() 选择索引值为等于 3 的 div 元素 $("#btn1").click(function(){ $("div").eq(3).css("background-color","#bfa"); }); //(2)first()选择第一个 div 元素 $("#btn2").click(function(){ //first() 选取第一个元素 $("div").first().css("background-color","#bfa"); }); //(3)last()选择最后一个 div 元素 $("#btn3").click(function(){ //last() 选取最后一个元素 $("div").last().css("background-color","#bfa"); }); //(4)filter()在div中选择索引为偶数的 $("#btn4").click(function(){ //filter() 过滤 传入的是选择器字符串 $("div").filter(":even").css("background-color","#bfa"); }); //(5)is()判断#one是否为:empty或:parent //is用来检测jq对象是否符合指定的选择器 $("#btn5").click(function(){ alert( $("#one").is(":empty") ); }); //(6)has()选择div中包含.mini的 $("#btn6").click(function(){ //has(selector) 选择器字符串 是否包含selector $("div").has(".mini").css("background-color","#bfa"); }); //(7)not()选择div中class不为one的 $("#btn7").click(function(){ //not(selector) 选择不是selector的元素 $("div").not('.one').css("background-color","#bfa"); }); //(8)children()在body中选择所有class为one的div子元素 $("#btn8").click(function(){ //children() 选出所有的子元素 $("body").children("div.one").css("background-color","#bfa"); }); //(9)find()在body中选择所有class为mini的div元素 $("#btn9").click(function(){ //find() 选出所有的后代元素 $("body").find("div.mini").css("background-color","#bfa"); }); //(10)next() #one的下一个div $("#btn10").click(function(){ //next() 选择下一个兄弟元素 $("#one").next("div").css("background-color","#bfa"); }); //(11)nextAll() #one后面所有的span元素 $("#btn11").click(function(){ //nextAll() 选出后面所有的元素 $("#one").nextAll("span").css("background-color","#bfa"); }); //(12)nextUntil() #one和span之间的元素 $("#btn12").click(function(){ // $("#one").nextUntil("span").css("background-color","#bfa") }); //(13)parent() .mini的父元素 $("#btn13").click(function(){ $(".mini").parent().css("background-color","#bfa"); }); //(14)prev() #two的上一个div $("#btn14").click(function(){ //prev() $("#two").prev("div").css("background-color","#bfa") }); //(15)prevAll() span前面所有的div $("#btn15").click(function(){ //prevAll() 选出前面所有的元素 $("span").prevAll("div").css("background-color","#bfa") }); //(16)prevUntil() span向前直到#one的元素 $("#btn16").click(function(){ //prevUntil(exp) 找到之前所有的兄弟元素直到找到exp停止 $("span").prevUntil("#one").css("background-color","#bfa") }); //(17)siblings() #two的所有兄弟元素 $("#btn17").click(function(){ //siblings() 找到所有的兄弟元素,包括前面的和后面的 $("#two").siblings().css("background-color","#bfa") }); //(18)add()选择所有的 span 元素和id为two的元素 $("#btn18").click(function(){ // $("span,#two,.mini,#one") $("span").add("#two").add("#one").css("background-color","#bfa"); }); }); </script> </head> <body> <input type="button" value="eq()选择索引值为等于 3 的 div 元素" id="btn1" /> <input type="button" value="first()选择第一个 div 元素" id="btn2" /> <input type="button" value="last()选择最后一个 div 元素" id="btn3" /> <input type="button" value="filter()在div中选择索引为偶数的" id="btn4" /> <input type="button" value="is()判断#one是否为:empty或:parent" id="btn5" /> <input type="button" value="has()选择div中包含.mini的" id="btn6" /> <input type="button" value="not()选择div中class不为one的" id="btn7" /> <input type="button" value="children()在body中选择所有class为one的div子元素" id="btn8" /> <input type="button" value="find()在body中选择所有class为mini的div后代元素" id="btn9" /> <input type="button" value="next()#one的下一个div" id="btn10" /> <input type="button" value="nextAll()#one后面所有的span元素" id="btn11" /> <input type="button" value="nextUntil()#one和span之间的元素" id="btn12" /> <input type="button" value="parent().mini的父元素" id="btn13" /> <input type="button" value="prev()#two的上一个div" id="btn14" /> <input type="button" value="prevAll()span前面所有的div" id="btn15" /> <input type="button" value="prevUntil()span向前直到#one的元素" id="btn16" /> <input type="button" value="siblings()#two的所有兄弟元素" id="btn17" /> <input type="button" value="add()选择所有的 span 元素和id为two的元素" id="btn18" /> <h3>基本选择器.</h3> <br /><br /> 文本框<input type="text" name="account" disabled="disabled" /> <br><br> <div class="one" id="one"> id 为 one,class 为 one 的div <div class="mini">class为mini</div> </div> <div class="one" id="two" title="test"> id为two,class为one,title为test的div <div class="mini" title="other"><b>class为mini,title为other</b></div> <div class="mini" title="test">class为mini,title为test</div> </div> <div class="one"> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini"></div> </div> <div class="one"> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini">class为mini</div> <div class="mini" title="tesst">class为mini,title为tesst</div> </div> <div style="display:none;" class="none">style的display为"none"的div</div> <div class="hide">class为"hide"的div</div> <span id="span1">^^span元素 111^^</span> <div> 包含input的type为"hidden"的div<input type="hidden" size="8"> </div> <span id="span2">^^span元素 222^^</span> <div id="mover">正在执行动画的div元素.</div> </body> </html>
1、jQuery的属性操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 html () 它可以设置和获取起始标签和结束标签中的内容。 跟 dom 属性 innerHTML 一样。 text () 它可以设置和获取起始标签和结束标签中的文本。 跟 dom 属性 innerText 一样。 val () 它可以设置和获取表单项的 value 属性值。 跟 dom 属性 value 一样123 <!DOCTYPE html> <html lang ="zh_CN" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" src ="script/jquery-1.7.2.js" > </script > <script type ="text/javascript" > $(function ( ) { $("#multiple,#single,:radio,:checkbox" ).val (["radio2" , "checkbox1" , "checkbox3" , "mul1" , "mul4" , "sin3" ]); }); </script > </head > <body > 单选: <input name ="radio" type ="radio" value ="radio1" /> radio1<input name ="radio" type ="radio" value ="radio2" /> radio2<br /> 多选: <input name ="checkbox" type ="checkbox" value ="checkbox1" /> checkbox1<input name ="checkbox" type ="checkbox" value ="checkbox2" /> checkbox2<input name ="checkbox" type ="checkbox" value ="checkbox3" /> checkbox3<br /> 下拉多选 : <select id ="multiple" > multiple="multiple" size="4"> <option value ="mul1" > mul1</option > <option value ="mul2" > mul2</option > <option value ="mul3" > mul3</option > <option value ="mul4" > mul4</option > </select > <br /> 下拉单选 : <select id ="single" > <option value ="sin1" > sin1</option > <option value ="sin2" > sin2</option > <option value ="sin3" > sin3</option > </select > </body > </html > 123456789101112131415161718192021222324252627282930313233343536373839404142434445
1 2 3 4 attr () 可以设置和获取属性的值,不推荐操作 checked、readOnly、selected、disabled 等等 attr 方法还可以操作非标准的属性。比如自定义属性:abc,bbj prop () 可以设置和获取属性的值,只推荐操作 checked、readOnly、selected、disabled 等等123
2、jQuery练习 全选,全不选,反选 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html > <head > <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > Insert title here</title > <script type ="text/javascript" src ="../../script/jquery-1.7.2.js" > </script > <script type ="text/javascript" > $(function ( ){ var $items = $(":checkbox[name=items]" ); var items = $("[name='items']" ); $("#checkedAllBtn" ).click (function ( ){ items.attr ("checked" ,true ); $("#checkedAllBox" ).attr ("checked" ,true ); }); $("#checkedNoBtn" ).click (function ( ){ items.attr ("checked" ,false ); $("#checkedAllBox" ).attr ("checked" ,false ); }); $("#checkedRevBtn" ).click (function ( ){ items.each (function ( ){ this .checked = !this .checked ; }); var flag = $("[name='items']:checked" ).length ==4 ; $("#checkedAllBox" ).attr ("checked" ,flag); }); $("#sendBtn" ).click (function ( ){ $(":checkbox[name='items']:checked" ).each (function ( ){ alert (this .value ); }); }); $("#checkedAllBox" ).click (function ( ){ items.attr ("checked" ,this .checked ); }); $("[name='items']" ).click (function ( ){ var flag = $("[name='items']:checked" ).length ==4 ; $("#checkedAllBox" ).attr ("checked" ,flag); }); }); </script > </head > <body > <form method ="post" action ="" > 你爱好的运动是?<input type ="checkbox" id ="checkedAllBox" /> 全选/全不选 <br /> <input type ="checkbox" name ="items" value ="足球" /> 足球 <input type ="checkbox" name ="items" value ="篮球" /> 篮球 <input type ="checkbox" name ="items" value ="羽毛球" /> 羽毛球 <input type ="checkbox" name ="items" value ="乒乓球" /> 乒乓球 <br /> <input type ="button" id ="checkedAllBtn" value ="全 选" /> <input type ="button" id ="checkedNoBtn" value ="全不选" /> <input type ="button" id ="checkedRevBtn" value ="反 选" /> <input type ="button" id ="sendBtn" value ="提 交" /> </form > </body > </html > 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
4、DOM的增删改
1 2 3 4 5 6 7 8 9 10 11 12 13 内部插入: appendTo () a.appendTo (b) 把 a 插入到 b 子元素末尾,成为最后一个子元素prependTo () a.prependTo (b) 把 a 插到 b 所有子元素前面,成为第一个子元素 外部插入: insertAfter () a.insertAfter (b) 得到 ba insertBefore () a.insertBefore (b) 得到 ab 替换: replaceWith () a.replaceWith (b) 用 b 替换掉 a replaceAll () a.replaceAll (b) 用 a 替换掉所有 b 删除: remove () a.remove (); 删除 a 标签 empty () a.empty (); 清空 a 标签里的内容123456789101112
5、jQuery练习二 从左到右,从右到左练习 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html > <head > <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > Insert title here</title > <style type ="text/css" > select { width : 100px ; height : 140px ; } div { width : 130px ; float : left; text-align : center; } </style > <script type ="text/javascript" src ="script/jquery-1.7.2.js" > </script > <script type ="text/javascript" > $(function ( ){ $("button:eq(0)" ).click (function ( ){ $("select[name=sel01] :selected" ).each (function ( ){ $(this ).appendTo ("select[name=sel02]" ); }); }); $("button:eq(1)" ).click (function ( ){ $("select[name=sel01] option" ).each (function ( ){ $(this ).appendTo ("select[name=sel02]" ); }); }); $("button:eq(2)" ).click (function ( ){ $("select[name=sel02] :selected" ).each (function ( ){ $(this ).appendTo ("select[name=sel01]" ); }); }); $("button:eq(3)" ).click (function ( ){ $("select[name=sel02] option" ).each (function ( ){ $(this ).appendTo ("select[name=sel01]" ); }); }); }); </script > </head > <body > <div id ="left" > <select multiple ="multiple" name ="sel01" > <option value ="opt01" > 选项1</option > <option value ="opt02" > 选项2</option > <option value ="opt03" > 选项3</option > <option value ="opt04" > 选项4</option > <option value ="opt05" > 选项5</option > <option value ="opt06" > 选项6</option > <option value ="opt07" > 选项7</option > <option value ="opt08" > 选项8</option > </select > <button > 选中添加到右边</button > <button > 全部添加到右边</button > </div > <div id ="rigth" > <select multiple ="multiple" name ="sel02" > </select > <button > 选中删除到左边</button > <button > 全部删除到左边</button > </div > </body > </html > 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
动态添加、删除表格记录 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html > <head > <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > Untitled Document</title > <link rel ="stylesheet" type ="text/css" href ="styleB/css.css" /> <script type ="text/javascript" src ="../../script/jquery-1.7.2.js" > </script > <script type ="text/javascript" > $(function ( ){ function delA ( ){ var name = $(this ).parents ("tr" ).find ("td:eq(0)" ).text (); var flag = confirm ("确认删除" +name+"吗?" ); if (flag){ $(this ).parents ("tr" ).remove (); } return false ; } $("a" ).live ("click" , delA); $("#addEmpButton" ).click (function ( ){ var name = $("#empName" ).val (); var email = $("#email" ).val (); var salary = $("#salary" ).val (); $("<tr></tr>" ).append ("<td>" +name+"</td>" ) .append ("<td>" +email+"</td>" ) .append ("<td>" +salary+"</td>" ) .append ("<td><a href='#'>Delete</a></td>" ) .appendTo ("#employeeTable" ); }); }); </script > </head > <body > <table id ="employeeTable" > <tr > <th > Name</th > <th > Email</th > <th > Salary</th > <th > </th > </tr > <tr > <td > Tom</td > <td > tom@tom.com</td > <td > 5000</td > <td > <a href ="#" > Delete</a > </td > </tr > <tr > <td > Jerry</td > <td > jerry@sohu.com</td > <td > 8000</td > <td > <a href ="#" > Delete</a > </td > </tr > <tr > <td > Bob</td > <td > bob@tom.com</td > <td > 10000</td > <td > <a href ="#" > Delete</a > </td > </tr > </table > <div id ="formDiv" > <h4 > 添加新员工</h4 > <table > <tr > <td class ="word" > name: </td > <td class ="inp" > <input type ="text" name ="empName" id ="empName" /> </td > </tr > <tr > <td class ="word" > email: </td > <td class ="inp" > <input type ="text" name ="email" id ="email" /> </td > </tr > <tr > <td class ="word" > salary: </td > <td class ="inp" > <input type ="text" name ="salary" id ="salary" /> </td > </tr > <tr > <td colspan ="2" align ="center" > <button id ="addEmpButton" value ="abc" > Submit </button > </td > </tr > </table > </div > </body > </html > 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
6、CSS 样式操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 addClass () 添加样式 removeClass () 删除样式 toggleClass () 有就删除,没有就添加样式。 offset () 获取和设置元素的坐标。1234 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <style type="text/css"> div{ width:100px; height:260px; } div.border{ border: 2px white solid; } div.redDiv{ background-color: red; } div.blackDiv{ border: 5px blue solid; } </style> <script type="text/javascript" src="script/jquery-1.7.2.js"></script> <script type="text/javascript"> $(function(){ /* CSS css(name|pro|[,val|fn]) 读写匹配元素的样式属性。 a.css('color')取出a元素的color a.css('color',"red")设置a元素的color为red CSS 类 addClass(class|fn) 为元素添加一个class值;<div class="mini big"> removeClass([class|fn]) 删除元素的class值;传递一个具体的class值,就会删除具体的某个class a.removeClass():移除所有的class值 **/ var $divEle = $('div:first'); $('#btn01').click(function(){ //addClass() - 向被选元素添加一个或多个类 $divEle.addClass("redDiv blackDiv"); }); $('#btn02').click(function(){ //removeClass() - 从被选元素删除一个或多个类 $divEle.removeClass() }); $('#btn03').click(function(){ //toggleClass() - 对被选元素进行添加/删除类的切换操作 //切换就是如果具有该类那么删除,如果没有那么添加上 $divEle.toggleClass("redDiv"); }); $('#btn04').click(function(){ //offset() - 返回第一个匹配元素相对于文档的位置。 var os = $divEle.offset(); //注意通过offset获取到的是一个对象,这个对象有两个属性top表示顶边距,left表示左边距 alert("顶边距:"+os.top+" 左边距:"+os.left); //调用offset设置元素位置时,也需要传递一个js对象,对象有两个属性top和left //offset({ top: 10, left: 30 }); $divEle.offset({ top:50, left:60 }); }); }) </script> </head> <body> <table align="center"> <tr> <td> <div class="border"> </div> </td> <td> <div class="btn"> <input type="button" value="addClass()" id="btn01"/> <input type="button" value="removeClass()" id="btn02"/> <input type="button" value="toggleClass()" id="btn03"/> <input type="button" value="offset()" id="btn04"/> </div> </td> </tr> </table> <br /> <br /> <br /> <br /> </body> </html> 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
7、jQuery 动画 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 基本动画 show () 将隐藏的元素显示 hide () 将可见的元素隐藏。 toggle () 可见就隐藏,不可见就显示。 以上动画方法都可以添加参数。 1 、第一个参数是动画 执行的时长,以毫秒为单位 2 、第二个参数是动画的回调函数 (动画完成后自动调用的函数) 淡入淡出动画 fadeIn () 淡入(慢慢可见) fadeOut () 淡出(慢慢消失) fadeTo () 在指定时长内慢慢的将透明度修改到指定的值。0 透明,1 完成可见,0.5 半透明 fadeToggle () 淡入/淡出 切换123456789101112 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html > <head > <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > Untitled Document</title > <link href ="css/style.css" type ="text/css" rel ="stylesheet" /> <script type ="text/javascript" src ="script/jquery-1.7.2.js" > </script > <script type ="text/javascript" > $(function ( ){ $("#btn1" ).click (function ( ){ $("#div1" ).show (1000 ); }); $("#btn2" ).click (function ( ){ $("#div1" ).hide (1000 ); }); $("#btn3" ).click (function ( ){ $("#div1" ).toggle (1000 ); }); $("#btn4" ).click (function ( ){ $("#div1" ).fadeIn (500 ); }); $("#btn5" ).click (function ( ){ $("#div1" ).fadeOut (500 ); }); $("#btn6" ).click (function ( ){ $("#div1" ).fadeTo ("slow" ,Math .random ()); }); $("#btn7" ).click (function ( ){ $("#div1" ).fadeToggle ("slow" ,"linear" ); }); }) </script > </head > <body > <table style ="float: left;" > <tr > <td > <button id ="btn1" > 显示show()</button > </td > </tr > <tr > <td > <button id ="btn2" > 隐藏hide()</button > </td > </tr > <tr > <td > <button id ="btn3" > 显示/隐藏切换 toggle()</button > </td > </tr > <tr > <td > <button id ="btn4" > 淡入fadeIn()</button > </td > </tr > <tr > <td > <button id ="btn5" > 淡出fadeOut()</button > </td > </tr > <tr > <td > <button id ="btn6" > 淡化到fadeTo()</button > </td > </tr > <tr > <td > <button id ="btn7" > 淡化切换fadeToggle()</button > </td > </tr > </table > <div id ="div1" style ="float:left;border: 1px solid;background-color: blue;width: 300px;height: 200px;" > jquery动画定义了很多种动画效果,可以很方便的使用这些动画效果 </div > </body > </html > 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
练习 CSS_动画 品牌展示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > <html xmlns ="http://www.w3.org/1999/xhtml" > <head > <meta http-equiv ="Content-Type" content ="text/html; charset=utf-8" /> <title > 品牌展示练习</title > <style type ="text/css" > *{ margin :0 ; padding :0 ;} body {font-size :12px ;text-align :center;} a { color :#04D ; text-decoration :none;} a :hover { color :#F50 ; text-decoration :underline;} .SubCategoryBox {width :600px ; margin :0 auto; text-align :center;margin-top :40px ;} .SubCategoryBox ul { list-style :none;} .SubCategoryBox ul li { display :block; float :left ; width :200px ; line-height :20px ;} .showmore { clear :both; text-align :center;padding-top :10px ;} .showmore a { display :block; width :120px ; margin :0 auto; line-height :24px ; border :1px solid #AAA ;} .showmore a span { padding-left :15px ; background :url (img/down.gif ) no-repeat 0 0 ;} .promoted a { color :#F50 ;} </style > <script type ="text/javascript" src ="script/jquery-1.7.2.js" > </script > <script type ="text/javascript" > $(function ( ){ var category = $("ul:first li:gt(5):not(:last)" ); category.hide (); var $promoptedCategory = $("ul:first li" ).filter (":contains('佳能'), :contains('尼康'), :contains('奥林巴斯')" ); $(".showmore a" ).click (function ( ){ if (category.is (":hidden" )){ category.show (); $promoptedCategory.addClass ("promoted" ); $(".showmore a span" ).text ("显示精简品牌" ) .css ("background" , "url(img/up.gif) no-repeat 0 0" ); }else { category.hide (); $promoptedCategory.removeClass ("promoted" ); $(".showmore a span" ).text ("显示全部品牌" ) .css ("background" , "url(img/down.gif) no-repeat 0 0" ); } return false ; }); }); </script > </head > <body > <div class ="SubCategoryBox" > <ul > <li > <a href ="#" > 佳能</a > <i > (30440) </i > </li > <li > <a href ="#" > 索尼</a > <i > (27220) </i > </li > <li > <a href ="#" > 三星</a > <i > (20808) </i > </li > <li > <a href ="#" > 尼康</a > <i > (17821) </i > </li > <li > <a href ="#" > 松下</a > <i > (12289) </i > </li > <li > <a href ="#" > 卡西欧</a > <i > (8242) </i > </li > <li > <a href ="#" > 富士</a > <i > (14894) </i > </li > <li > <a href ="#" > 柯达</a > <i > (9520) </i > </li > <li > <a href ="#" > 宾得</a > <i > (2195) </i > </li > <li > <a href ="#" > 理光</a > <i > (4114) </i > </li > <li > <a href ="#" > 奥林巴斯</a > <i > (12205) </i > </li > <li > <a href ="#" > 明基</a > <i > (1466) </i > </li > <li > <a href ="#" > 爱国者</a > <i > (3091) </i > </li > <li > <a href ="#" > 其它品牌相机</a > <i > (7275) </i > </li > </ul > <div class ="showmore" > <a href ="more.html" > <span > 显示全部品牌</span > </a > </div > </div > </body > </html > 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
8、jQuery 事件操作 $( function(){} ); 和window.onload = function(){} 的区别?
他们分别是在什么时候触发? 1、jQuery 的页面加载完成之后是浏览器的内核解析完页面的标签创建好 DOM 对象之后就会马上执行。 2、原生 js 的页面加载完成之后,除了要等浏览器内核解析完标签创建好 DOM 对象,还要等标签显示时需要的内容加载 完成。
他们触发的顺序? 1、jQuery 页面加载完成之后先执行 2、原生 js 的页面加载完成之后
他们执行的次数? 1、原生 js 的页面加载完成之后,只会执行最后一次的赋值函数。 2、jQuery 的页面加载完成之后是全部把注册的 function 函数,依次顺序全部执行。
jQuery 中其他的事件处理方法:
1 2 3 4 5 6 7 8 click () 它可以绑定单击事件,以及触发单击事件 mouseover () 鼠标移入事件 mouseout () 鼠标移出事件 bind () 可以给元素一次性绑定一个或多个事件。 one () 使用上跟 bind 一样。但是 one 方法绑定的事件只会响应一次。 unbind () 跟 bind 方法相反的操作,解除事件的绑定 live () 也是用来绑定事件。它可以用来绑定选择器匹配的所有元素的事件。哪怕这个元素是后面动态创建出 来的也有效1234567
文档加载 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html > <head > <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > Insert title here</title > <script type ="text/javascript" > </script > <script type ="text/javascript" src ="../../script/jquery-1.7.2.js" > </script > <script type ="text/javascript" > window .onload = function ( ){ alert ("abc" ) } $(function ( ){ alert ("edf" ) }) </script > </head > <body > <button > 我是按钮</button > </body > </html > 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
事件绑定 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html > <head > <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > Untitled Document</title > <link href ="css/style.css" type ="text/css" rel ="stylesheet" /> <script type ="text/javascript" src ="../../script/jquery-1.7.2.js" > </script > <script type ="text/javascript" > $(function ( ){ $(".head" ).click (function ( ){ $(".content" ).toggle (); }).mouseover (function ( ){ $(".content" ).toggle (); }); }); </script > </head > <body > <div id ="panel" > <h5 class ="head" > 什么是jQuery?</h5 > <div class ="content" > jQuery是继Prototype之后又一个优秀的JavaScript库,它是一个由 John Resig 创建于2006年1月的开源项目。jQuery凭借简洁的语法和跨平台的兼容性,极大地简化了JavaScript开发人员遍历HTML文档、操作DOM、处理事件、执行动画和开发Ajax。它独特而又优雅的代码风格改变了JavaScript程序员的设计思路和编写程序的方式。 </div > </div > </body > </html > 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
事件移除 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Untitled Document</title> <link rel="stylesheet" type="text/css" href="style/css.css" /> <script type="text/javascript" src="jquery-1.7.2.js"></script> <script type="text/javascript"> $(function(){ //给li绑定两种事件:单击和鼠标移入 $("li").bind("click mouseenter" , function(){ alert(this.innerHTML); }); //点击第一个button,将#bj上的mouseenter事件移除 //unbind()可以移除指定的事件,只需要传一个事件名作为参数 //unbind(type,[data|fn]]) //type事件类型 当传入type的时候会解除type事件 //如果没有传入type值,会移除所有事件 $("button:eq(0)").click(function(){ $("li").unbind("click mouseenter"); }); //点击第二个button,将#rl上的所有事件移除 $("button:eq(1)").click(function(){ }); }); </script> </head> <body> <div id="total"> <div class="inner"> <p> 你喜欢哪个城市? </p> <ul id="city"> <li id="bj">北京</li> <li>上海</li> <li>东京</li> <li>首尔</li> </ul> <br> <br> <p> 你喜欢哪款单机游戏? </p> <ul id="game"> <li id="rl">红警</li> <li>实况</li> <li>极品飞车</li> <li>魔兽</li> </ul> </div> <button>移除#bj的mouseenter事件</button> <button>移除#rl所有事件</button> </div> </body> </html> 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
事件的冒泡
什么是事件的冒泡? 事件的冒泡是指,父子元素同时监听同一个事件。当触发子元素的事件的时候,同一个事件也被传递到了父元素的事件里去 响应。
那么如何阻止事件冒泡呢? 在子元素事件函数体内,return false; 可以阻止事件的冒泡传递。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Untitled Document</title> <style type="text/css"> *{ margin: 0; padding: 0; } body{ font-size: 13px; line-height: 130%; padding: 60px; } #content{ width: 220px; border: 1px solid #0050D0; background: #96E555; } span{ width: 200px; margin: 10px; background: #666666; cursor: pointer; color: white; display: block; } p{ width: 200px; background: #888; color: white; height: 16px; } </style> <script type="text/javascript" src="jquery-1.7.2.js"></script> <script type="text/javascript"> $(function(){ //冒泡就是事件的向上传导,子元素的事件被触发,父元素的响应事件也会触发 //解决冒泡问题:return false; //给span绑定一个单击响应函数 $("span").click(function(){ alert("我是span的单击响应函数"); return false; }); //给id为content的div绑定一个单击响应函数 $("#content").click(function(){ alert("我是div的单击响应函数"); return false; }); //给body绑定一个单击响应函数 $("body").click(function(){ //alert("我是body的单击响应函数"); }); //取消默认行为 /* $("a").click(function(){ return false; }) */ }) </script> </head> <body> <div id="content"> 外层div元素 <span>内层span元素</span> 外层div元素 </div> <div id="msg"></div> <br><br> <a href="http://www.hao123.com" onclick="return false;">WWW.HAO123.COM</a> </body> </html> 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
javaScript 事件对象 事件对象,是封装有触发的事件信息的一个 javascript 对象。 我们重点关心的是怎么拿到这个 javascript 的事件对象。以及使用。
如何获取呢 javascript 事件对象呢? 在给元素绑定事件的时候,在事件的 function( event ) 参数列表中添加一个参数,这个参数名,我们习惯取名为 event。 这个 event 就是 javascript 传递参事件处理函数的事件对象。
1.原生 javascript 获取 事件对象
1 2 3 4 5 6 window .onload = function ( ) { document .getElementById ("areaDiv" ).onclick = function (event ) { console .log (event); } } 12345
2.jQuery 代码获取 事件对象
1 2 3 4 5 6 $(function ( ) { $("#areaDiv" ).click (function (event ) { console .log (event); }); }); 12345
3.使用 bind 同时对多个事件绑定同一个函数。怎么获取当前操作是什么事件。
1 2 3 4 5 6 7 8 $("#areaDiv" ).bind ("mouseover mouseout" ,function (event ) { if (event.type == "mouseover" ) { console .log ("鼠标移入" ); } else if (event.type == "mouseout" ) { console .log ("鼠标移出" ); } }); 1234567
练习 图片跟随 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <style type="text/css"> body { text-align: center; } #small { margin-top: 150px; } #showBig { position: absolute; display: none; } </style> <script type="text/javascript" src="script/jquery-1.7.2.js"></script> <script type="text/javascript"> $(function(){ $("#small") .mouseover(function(event){ $("#showBig") .show() .css("left",event.pageX+10) .css("top",event.pageY+10); }) .mousemove(function(event){ $("#showBig") .css("left",event.pageX+10) .css("top",event.pageY+10); }) .mouseout(function(){ $("#showBig").hide(); }); }); </script> </head> <body> <img id="small" src="img/small.jpg" /> <div id="showBig"> <img src="img/big.jpg"> </div> </body> </html>
xml 1、XML 简介 xml 是可扩展的标记性语言。
xml 的作用?
xml 的主要作用有: 1、用来保存数据,而且这些数据具有自我描述性 2、它还可以做为项目或者模块的配置文件 3、还可以做为网络传输数据的格式(现在 JSON 为主)。
2、xml 语法
文档声明。
元素(标签)
xml 属性
xml 注释
文本区域(CDATA 区)
1、文档声明 先创建一个简单 XML 文件,用来描述图书信息。
1)创建一个 xml 文件
xml 声明。
而且这个1 2 3 4 5 属性 version 是版本号 encoding 是xml的文件编码 standalone="yes/no" 表示这个 xml 文件是否是独立的 xml 文件 1234
2)图书有 id 属性 表示唯一 标识,书名,有作者,价格的信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?xml version="1.0" encoding="utf-8" ?> <!-- xml声明 version是版本的意思 encoding是编码 --> <books > <book id ="SN123123413241" > <name > java编程思想</name > <author > 华仔</author > <price > 9.9</price > </book > <book id ="SN12341235123" > <name > 葵花宝典</name > <author > 班长</author > <price > 5.5</price > </book > </books > 1234567891011121314
在浏览器中可以查看到文档
2、xml 注释 html 和 XML 注释 一样 :
3、元素(标签) 1 2 3 4 5 6 7 8 html 标签: 格式:<标签名>封装的数据</标签名> 单标签: <标签名 /> <br /> 换行 <hr />水平线 双标签 <标签名>封装的数据</标签名> 标签名大小写不敏感 标签有属性,有基本属性和事件属性 标签要闭合(不闭合 ,html 中不报错。但我们要养成良好的书写习惯。闭合) 1234567
1)什么是 xml 元素
1 2 3 4 元素是指从开始标签到结束标签的内容。 例如:<title>java 编程思想</title> 元素 我们可以简单的理解为是 标签。 Element 翻译 元素 123
2)XML 命名规则
XML 元素必须遵循以下命名规则: ①名称可以含字母、数字以及其他的字符
1 2 3 4 5 6 <book id="SN12341235123" > <!-- book标签描述一本图书 id属性描述 的是图书 的编号 --> <name > 葵花宝典</name > <!-- name标签描述 的是图书 的信息 --> <author > 班长</author > <!-- author单词是作者的意思 ,描述图书作者 --> <price > 5.5</price > <!-- price单词是价格,描述的是图书 的价格 --> </book> 12345
②名称不能以数字或者标点符号开始 ③名称不能以字符 “xml”(或者 XML、Xml)开始 (验证其实是可以的) ④名称不能包含空格
3)xml 中的元素(标签)也 分成单标签和双标签
1 2 3 单标签格式: <标签名 属性=”值” 属性=”值” ...... /> 双标签格式:< 标签名 属性=”值” 属性=”值” ......>文本数据或子标签</标签名> 12
4、xml属性 1 2 3 4 5 xml 的标签属性和 html 的标签属性是非常类似的,属性可以提供元素的额外信息 在标签上可以书写属性: 一个标签上可以书写多个属性。每个属性的值必须使用 引号 引起来。 书写的规则和标签的书写规则一致。 1234
1)属性必须使用引号引起来,不引会报错示例代码
5、语法规则 1)所有 XML 元素都须有关闭标签(也就是闭合) 2)XML 标签对大小写敏感 3)XML 必须正确地嵌套 4)XML 文档必须有根元素
1 2 3 4 根元素就是顶级元素, 没有父标签的元素,叫顶级元素。 根元素是没有父标签的顶级元素,而且是唯一一个才行。 123
5)XML 的属性值须加引号 6)XML 中的特殊字符 7)文本区域(CDATA 区)
1 2 3 CDATA 语法可以告诉 xml 解析器,CDATA 里的文本内容,只是纯文本,不需要 xml 语法解析 CDATA 格式: <![CDATA [ 这里可以把你输入的字符原样显示,不会解析 xml ]]>12
3、xml解析技术介绍 xml 可扩展的标记语言。 不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的 dom 技术来解析。注:document 对象表示的是整个文档(可以是 html 文档,也可以是 xml 文档)
早期 JDK 为我们提供了两种 xml 解析技术 DOM 和 Sax 简介(已经过时,但我们需要知道这两种技术)
dom 解析技术是 W3C 组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。Java 对 dom 技术解析标记也做了实现。
sun 公司在 JDK5 版本对 dom 解析技术进行升级:SAX( Simple API for XML ) SAX 解析,它跟 W3C 制定的解析不太一样。它是以类似事件机制通过回调告诉用户当前正在解析的内容。 它是一行一行的读取 xml 文件进行解析的。不会创建大量的 dom 对象。 所以它在解析 xml 的时候,在内存的使用上。和性能上。都优于 Dom 解析。
第三方的解析: jdom 在 dom 基础上进行了封装 dom4j 又对 jdom 进行了封装。 pull 主要用在 Android 手机开发,是在跟 sax 非常类似都是事件机制解析 xml 文件。
这个 Dom4j 它是第三方的解析技术。我们需要使用第三方给我们提供好的类库才可以解析 xml 文件。
4、dom4j 解析技术(重点) 由于 dom4j 它不是 sun 公司的技术,而属于第三方公司的技术,我们需要使用 dom4j 就需要到 dom4j 官网下载 dom4j 的 jar 包。
Dom4j 类库的使用 解压后目录:dom4j目录的介绍
① docs 是 文 档 目 录 2)如何查 Dom4j 的文档 3)Dom4j 快速入门 ② lib 目录 ③ src 目录是第三方类库的源码目录
5、dom4j编程 1 2 3 4 5 6 7 步骤: 第一步: 先加载 xml 文件创建 Document 对象 第二步:通过 Document 对象拿到根元素对象 第三步:通过根元素.elelemts (标签名); 可以返回一个集合,这个集合里放着。所有你指定的标签名的元素对象 第四步:找到你想要修改、删除的子元素,进行相应在的操作 第五步,保存到硬盘上 123456
需要解析的 books.xml 文件内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?xml version="1.0" encoding="utf-8" ?> <!-- xml声明 version是版本的意思 encoding是编码 --> <books > <book id ="SN123123413241" > <name > java编程思想</name > <author > 华仔</author > <price > 9.9</price > </book > <book id ="SN12341235123" > <name > 葵花宝典</name > <author > 班长</author > <price > 5.5</price > </book > </books > 1234567891011121314
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 @Test public void readXML () throws DocumentException { System.out.println("true = " + true ); SAXReader reader = new SAXReader (); Document document = reader.read("05_xml/src/books.xml" ); Element root = document.getRootElement(); System.out.println(root.asXML()); List<Element> books = root.elements("book" ); for (Element book : books) { System.out.println(book.asXML()); Element nameElement = book.element("name" ); Element priceElement = book.element("price" ); Element authorElement = book.element("author" ); System.out.println("书名" + nameElement.getText() + " , 价格:" + priceElement.getText() + ", 作者:" + authorElement.getText()); } }
tomcat 1、JavaWeb的概念
什么是JavaWeb JavaWeb 是指,所有通过 Java 语言编写可以通过浏览器访问的程序的总称,叫 JavaWeb。 JavaWeb 是基于请求和响应来开发的。
什么是请求 请求是指客户端给服务器发送数据,叫请求 Request。
什么是响应 响应是指服务器给客户端回传数据,叫响应 Response。
请求和响应的关系 请求和响应是成对出现的,有请求就有响应。
2、Web 资源的分类 web 资源按实现的技术和呈现的效果的不同,又分为静态资源和动态资源两种。静态资源 : html、css、js、txt、mp4 视频 , jpg 图片动态资源 : jsp 页面、Servlet 程序
3、常用的 Web 服务器 1 2 3 4 5 6 Tomcat: 由 Apache 组织提供的一种 Web 服务器,提供对 jsp 和 Servlet 的支持。它是一种轻量级的 javaWeb 容器(服务 器),也是当前应用最广的 JavaWeb 服务器(免费)。 Jboss: 是一个遵从 JavaEE 规范的、开放源代码的、纯 Java 的 EJB 服务器,它支持所有的 JavaEE 规范(免费)。 GlassFish: 由 Oracle 公司开发的一款 JavaWeb 服务器,是一款强健的商业服务器,达到产品级质量(应用很少)。 Resin: 是 CAUCHO 公司的产品,是一个非常流行的服务器,对 servlet 和 JSP 提供了良好的支持, 性能也比较优良,resin 自身采用 JAVA 语言开发(收费,应用比较多)。 WebLogic: 是 Oracle 公司的产品,是目前应用最广泛的 Web 服务器,支持 JavaEE 规范, 而且不断的完善以适应新的开发要求,适合大型项目(收费,用的不多,适合大公司)。 12345
4、Tomcat 服务器和 Servlet 版本的对应关系 Servlet 程序从 2.5 版本是现在世面使用最多的版本(xml 配置) 到了 Servlet3.0 之后。就是注解版本的 Servlet 使用。
5、Tomcat 的使用 ① 安装
找到你需要用的 Tomcat 版本对应的 zip 压缩包,解压到需要安装的目录即可。
② 目录介绍
1 2 3 4 5 6 7 8 bin 专门用来存放 Tomcat 服务器的可执行程序 conf 专门用来存放 Tocmat 服务器的配置文件 lib 专门用来存放 Tomcat 服务器的 jar 包 logs 专门用来存放 Tomcat 服务器运行时输出的日记信息 temp 专门用来存放 Tomcdat 运行时产生的临时数据 webapps 专门用来存放部署的 Web 工程。 work 是 Tomcat 工作时的目录,用来存放 Tomcat 运行时 jsp 翻译为 Servlet 的源码,和 Session 钝化的目录。 1234567
③ 如何启动 Tomcat 服务器 常见的启动失败的情况有,双击 startup.bat 文件,就会出现一个小黑窗口一闪而来。 这个时候,失败的原因基本上都是因为没有配置好 JAVA_HOME 环境变量。
配置 JAVA_HOME 环境变量:
1 2 3 4 5 常见的 JAVA_HOME 配置错误有以下几种情况: 一:JAVA_HOME 必须全大写。 二:JAVA_HOME 中间必须是下划线,不是减号- 三:JAVA_HOME 配置的路径只需要配置到 jdk 的安装目录即可。不需要带上 bin 目录。 1234
另一种启动 tomcat 服务器的方式
1 2 3 4 1 、打开命令行 2 、cd 到 你的 Tomcat 的 bin 目录下 3 、敲入启动命令: catalina run123
④ Tomcat 的停止
1 2 3 4 1 、点击 tomcat 服务器窗口的 x 关闭按钮 2 、把 Tomcat 服务器窗口置为当前窗口,然后按快捷键 Ctrl +C 3 、找到 Tomcat 的 bin 目录下的 shutdown.bat 双击,就可以停止 Tomcat 服务器123
⑤ 如何修改 Tomcat 的端口号
⑥ 如何部暑 web 工程到 Tomcat 中
第一种部署方法 :只需要把 web 工程的目录拷贝到 Tomcat 的 webapps 目录下 即可。2、把书城第一阶段的内容拷贝到里面
第二种部署方法:
找到 Tomcat 下的 conf 目录\Catalina\localhost\ 下,创建如下的配置文件:⑦ 手托 html 页面到浏览器和在浏览器中输入 http://ip:端 口号/工程名/访问的区别
⑧ ROOT 的工程的访问,以及默认index.html 页面的访问
6、IDEA整合Tomcat服务器 配置你的 Tomcat 安装目录:
7、IDEA 中动态 web 工程的操作 1、创建一个新模块 2、选择你要创建什么类型的模块 3、输入你的模块名,点击【Finish】完成创建。 4、创建成功如下图:
Web 工程的目录介绍
如何给动态 web 工程添加额外 jar 包
1、可以打开项目结构菜单操作界面,添加一个自己的类库: 2、添加你你类库需要的 jar 包文件。 3、选择你添加的类库,给哪个模块使用: 4、选择 Artifacts 选项,将类库,添加到打包部署中:
如何在 IDEA 中部署工程到 Tomcat 上运行
1、建议修改 web 工程对应的 Tomcat 运行实例名称: 2、确认你的 Tomcat 实例中有你要部署运行的 web 工程模块: 3、你还可以修改你的 Tomcat 实例启动后默认的访问地址:
修改工程访问路径 修改运行的端口号 修改运行使用的浏览器
配置资源热部署
servlet 1、Servlet 技术 a)什么是 Servlet
1、Servlet 是 JavaEE 规范之一。规范就是接口 2、Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器 。 3、Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
b)手动实现 Servlet 程序
1、编写一个类去实现 Servlet 接口 2、实现 service 方法,处理请求,并响应数据 3、到 web.xml 中去配置 servlet 程序的访问地址
Servlet 程序的示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class HelloServlet implements Servlet { @Override public void service (ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("3 service === Hello Servlet 被访问了" ); } } 12345678910111213
web.xml 中的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <?xml version="1.0" encoding="UTF-8" ?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" > <!-- servlet标签给Tomcat配置Servlet程序 --> <servlet> <!--servlet-name标签 Servlet程序起一个别名(一般是类名) --> <servlet-name>HelloServlet</servlet-name> <!--servlet-class是Servlet程序的全类名--> <servlet-class>com.atguigu.servlet.HelloServlet</servlet-class> </servlet> <!--servlet-mapping标签给servlet程序配置访问地址--> <servlet-mapping> <!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用--> <servlet-name>HelloServlet</servlet-name> <!-- url-pattern标签配置访问地址 <br/> / 斜杠在服务器解析的时候,表示地址为:http: /hello 表示地址为:http: --> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app> 123456789101112131415161718192021222324
常见的错误 1:url-pattern 中配置的路径没有以斜杠打头。 常见错误 2:servlet-name 配置的值不存在: 常见错误 3:servlet-class 标签的全类名配置错误:
c)url 地址到 Servlet 程序的访问
d)Servlet 的生命周期
e)GET 和 POST 请求的分发处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 public class HelloServlet implements Servlet { public HelloServlet () { System.out.println("1 构造器方法" ); } @Override public void init (ServletConfig servletConfig) throws ServletException { System.out.println("2 init初始化方法" ); System.out.println("HelloServlet程序的别名是:" + servletConfig.getServletName()); System.out.println("初始化参数username的值是;" + servletConfig.getInitParameter("username" )); System.out.println("初始化参数url的值是;" + servletConfig.getInitParameter("url" )); System.out.println(servletConfig.getServletContext()); } @Override public ServletConfig getServletConfig () { return null ; } @Override public void service (ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("3 service === Hello Servlet 被访问了" ); HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; String method = httpServletRequest.getMethod(); if ("GET" .equals(method)) { doGet(); } else if ("POST" .equals(method)) { doPost(); } } public void doGet () { System.out.println("get请求" ); System.out.println("get请求" ); } public void doPost () { System.out.println("post请求" ); System.out.println("post请求" ); } @Override public String getServletInfo () { return null ; } @Override public void destroy () { System.out.println("4 . destroy销毁方法" ); } } 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
f) 通过继承 HttpServlet 实现 Servlet 程序
Servlet 类的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public class HelloServlet2 extends HttpServlet { @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("HelloServlet2 的 doGet 方法" ); } @Override protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("HelloServlet2 的 doPost 方法" ); } } 1234567891011121314151617181920212223
web.xml 中的配置:
1 2 3 4 5 6 7 8 9 <servlet> <servlet-name>HelloServlet2</servlet-name> <servlet-class>com.atguigu.servlet.HelloServlet2</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet2</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping> 12345678
g)使用 IDEA 创建 Servlet 程序
菜单:new ->Servlet 程序
配置 Servlet 的信息:
h)Servlet 类的继承体系
2、ServletConfig 类 1 2 3 4 ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类。 Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。 Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对 象。 123
a)ServletConfig 类的三大作用
web.xml 中的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <!-- servlet 标签给 Tomcat 配置 Servlet 程序 --> <servlet> <!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) --> <servlet-name>HelloServlet</servlet-name> <!--servlet-class 是 Servlet 程序的全类名--> <servlet-class>com.atguigu.servlet.HelloServlet</servlet-class> <!--init-param 是初始化参数--> <init-param> <!--是参数名--> <param-name>username</param-name> <!--是参数值--> <param-value>root</param-value> </init-param> <!--init-param 是初始化参数--> <init-param> <!--是参数名--> <param-name>url</param-name> <!--是参数值--> <param-value>jdbc:mysql: </init-param> </servlet> <!--servlet-mapping 标签给 servlet 程序配置访问地址--> <servlet-mapping> <!--servlet-name 标签的作用是告诉服务器,我当前配置的地址给哪个 Servlet 程序使用--> <servlet-name>HelloServlet</servlet-name> <!--url-pattern 标签配置访问地址 <br/> / 斜杠在服务器解析的时候,表示地址为:http: <url-pattern>/hello</url-pattern> </servlet-mapping> 123456789101112131415161718
Servlet 中的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 @Override public void init (ServletConfig servletConfig) throws ServletException { System.out.println("2 init初始化方法" ); System.out.println("HelloServlet程序的别名是:" + servletConfig.getServletName()); System.out.println("初始化参数username的值是;" + servletConfig.getInitParameter("username" )); System.out.println("初始化参数url的值是;" + servletConfig.getInitParameter("url" )); System.out.println(servletConfig.getServletContext()); } 123456789101112
注意:
3、ServletContext 类 a)什么是 ServletContext?
1、ServletContext 是一个接口,它表示 Servlet 上下文对象 2、一个 web 工程,只有一个 ServletContext 对象实例。 3、ServletContext 对象是一个域对象。 4、ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁。 什么是域对象? 域对象,是可以像 Map 一样存取数据的对象,叫域对象。 这里的域指的是存取数据的操作范围,整个 web 工程。
1 2 3 4 存数据 取数据 删除数据 Map put () get() remove() 域对象 setAttribute() getAttribute() removeAttribute(); 123
ServletContext 演示代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = getServletConfig().getServletContext(); String username = context.getInitParameter("username" ); System.out.println("context-param 参数 username 的值是:" + username); System.out.println("context-param 参数 password 的值是:" + context.getInitParameter("password" )); System.out.println("当前工程路径:" + context.getContextPath()); System.out.println("工程部署的路径是:" + context.getRealPath("/" )); System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css" )); System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" + context.getRealPath("/imgs/1.jpg" )); } 1234567891011121314
web.xml 中的配置:
1 2 3 4 5 6 7 8 9 10 11 <!--context-param是上下文参数(它属于整个web工程)--> <context-param> <param-name>username</param-name> <param-value>context</param-value> </context-param> <!--context-param是上下文参数(它属于整个web工程)--> <context-param> <param-name>password</param-name> <param-value>root</param-value> </context-param> 12345678910
ServletContext 像 Map 一样存取数据:
ContextServlet1 代码:
1 2 3 4 5 6 7 8 9 protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = getServletContext(); System.out.println(context); System.out.println("保存之前: Context1 获取 key1 的值是:" + context.getAttribute("key1" )); context.setAttribute("key1" , "value1" ); System.out.println("Context1 中获取域数据 key1 的值是:" + context.getAttribute("key1" )); } 12345678
ContextServlet2 代码:
1 2 3 4 5 6 protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context = getServletContext(); System.out.println(context); System.out.println("Context2 中获取域数据 key1 的值是:" + context.getAttribute("key1" )); } 12345
4、HTTP协议 a)什么是 HTTP 协议
HTTP 协议中的数据又叫报文。
b)请求的 HTTP 协议格式
i. GET 请求
1 2 3 4 5 6 7 1 、请求行 (1 ) 请求的方式 GET (2 ) 请求的资源路径[+?+请求参数] (3 ) 请求的协议的版本号 HTTP/1.1 2 、请求头 key : value 组成 不同的键值对,表示不同的含义。 123456
ii. POST 请求
1 2 3 4 5 6 7 8 9 1 、请求行 (1 ) 请求的方式 POST (2 ) 请求的资源路径[+?+请求参数] (3 ) 请求的协议的版本号 HTTP/1.1 2 、请求头 (1 ) key : value 不同的请求头,有不同的含义 空行 3 、请求体 ===>>> 就是发送给服务器的数据12345678
iii. 常用请求头的说明
1 2 3 4 5 Accept: 表示客户端可以接收的数据类型 Accpet-Languege: 表示客户端可以接收的语言类型 User-Agent: 表示客户端浏览器的信息 Host: 表示请求时的服务器 ip 和端口号 1234
iv. 哪些是 GET 请求,哪些是 POST 请求 c)响应的 HTTP 协议格式
1 2 3 4 5 6 7 8 1 、响应行 (1 ) 响应的协议和版本号 (2 ) 响应状态码 (3 ) 响应状态描述符 2 、响应头 (1 ) key : value 不同的响应头,有其不同含义 空行 3 、响应体 ---->>> 就是回传给客户端的数据1234567
d)常用的响应码说明
1 2 3 4 5 200 表示请求成功 302 表示请求重定向 404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误) 500 表示服务器已经收到请求,但是服务器内部错误(代码错误)1234
e)MIME 类型说明
MIME 是 HTTP 协议中数据类型。 MIME 的英文全称是”Multipurpose Internet Mail Extensions” 多功能 Internet 邮件扩充服务。MIME 类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应。 常见的 MIME 类型: 谷歌浏览器如何查看 HTTP 协议: 火狐浏览器如何查看 HTTP 协议:
1、HttpServletRequest类 HttpServletRequest 类有什么作用 每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。 然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过ttpServletRequest 对象,获取到所有请求的 信息。
HttpServletRequest 类的常用方法 1 2 3 4 5 6 7 8 9 10 11 getRequestURI() 获取请求的资源路径 getRequestURL() 获取请求的统一资源定位符(绝对路径) getRemoteHost() 获取客户端的 ip 地址 getHeader() 获取请求头 getParameter() 获取请求的参数 getParameterValues() 获取请求的参数(多个值的时候使用) getMethod() 获取请求的方式 GET 或 POST setAttribute (key, value) ; 设置域数据 getAttribute(key); 获取域数据 getRequestDispatcher() 获取请求转发对象 12345678910
常用 API 示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class RequestAPIServlet extends HttpServlet { @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("URI => " + req.getRequestURI()); System.out.println("URL => " + req.getRequestURL()); System.out.println("客户端 ip地址 => " + req.getRemoteHost()); System.out.println("请求头User-Agent ==>> " + req.getHeader("User-Agent" )); System.out.println( "请求的方式 ==>> " + req.getMethod() ); } } 123456789101112131415161718192021
如何获取请求参数 表单:
1 2 3 4 5 6 7 8 9 10 11 <body > <form action="http://localhost:8080 /07 _servlet/parameterServlet" method=" post"> 用户名:<input type=" text" name=" username"><br/> 密码:<input type=" password" name=" password"><br/> 兴趣爱好:<input type=" checkbox" name=" hobby" value=" cpp">C++ <input type=" checkbox" name=" hobby" value=" java">Java <input type=" checkbox" name=" hobby" value=" js">JavaScript<br/> <input type=" submit"> </form> </body> 12345678910
Java 代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @Override protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8" ); System.out.println("-------------doPost------------" ); String username = req.getParameter("username" ); String password = req.getParameter("password" ); String[] hobby = req.getParameterValues("hobby" ); System.out.println("用户名:" + username); System.out.println("密码:" + password); System.out.println("兴趣爱好:" + Arrays.asList(hobby)); } 12345678910111213141516
doGet 请求的中文乱码解决:
1 2 3 4 5 6 7 String username = req.getParameter("username" ); username = new String (username.getBytes("iso-8859-1" ), "UTF-8" ); 123456
POST 请求的中文乱码解决
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @Override protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8" ); System.out.println("-------------doPost------------" ); String username = req.getParameter("username" ); String password = req.getParameter("password" ); String[] hobby = req.getParameterValues("hobby" ); System.out.println("用户名:" + username); System.out.println("密码:" + password); System.out.println("兴趣爱好:" + Arrays.asList(hobby)); } 12345678910111213141516
请求的转发 什么是请求的转发? 请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。 Servlet1 代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class Servlet1 extends HttpServlet { @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username" ); System.out.println("在Servlet1(柜台1)中查看参数(材料):" + username); req.setAttribute("key1" ,"柜台1的章" ); RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2" ); requestDispatcher.forward(req,resp); } } 123456789101112131415161718192021222324
Servlet2 代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class Servlet2 extends HttpServlet { @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username" ); System.out.println("在Servlet2(柜台2)中查看参数(材料):" + username); Object key1 = req.getAttribute("key1" ); System.out.println("柜台1是否有章:" + key1); System.out.println("Servlet2 处理自己的业务 " ); } } 12345678910111213141516
base 标签的作用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <title>Title</title> <!--base标签设置页面相对路径工作时参照的地址 href 属性就是参数的地址值 --> <base href="http://localhost:8080/07_servlet/a/b/"> </head> <body> 这是a下的b下的c.html页面<br/> <a href="../../index.html">跳回首页</a><br/> </body> </html> 123456789101112131415
g)Web 中的相对路径和绝对路径
h)web 中 / 斜杠的不同意义
1 2 3 4 5 6 7 8 9 10 在 web 中 / 斜杠 是一种绝对路径。 / 斜杠 如果被浏览器解析,得到的地址是:http : <a href ="/" > 斜杠</a > / 斜杠 如果被服务器解析,得到的地址是:http:/ /ip:port/ 工程路径 1 、<url-pattern>/servlet1</u rl-pattern> 2 、servletContext.getRealPath (“/”); 3 、request.getRequestDispatcher (“/”); 特殊情况: response.sendRediect (“/”); 把斜杠发送给浏览器解析。得到 http : 123456789
2、HttpServletResponse 类 HttpServletResponse 类的作用 HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传 递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息。 我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
b)两个输出流的说明。 c)如何往客户端回传数据
要求 : 往客户端回传 字符串 数据。
1 2 3 4 5 6 7 @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); writer.write("response's content!!!" ); } } } 123456
d)响应的乱码解决
解决响应中文乱码方案一(不推荐使用):
1 2 3 4 5 resp.setCharacterEncoding("UTF-8" ); resp.setHeader("Content-Type" , "text/html; charset=UTF-8" ); 1234
解决响应中文乱码方案二(推荐):
1 2 3 4 resp.setContentType("text/html; charset=UTF-8" ); 123
请求重定向 请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求 重定向(因为之前的地址可能已经被废弃)。
jsp 1、什么是 jsp,它有什么用? 1 2 3 4 jsp 的全换是 java server pages。Java 的服务器页面。 jsp 的主要作用是代替 Servlet 程序回传 html 页面的数据。 因为 Servlet 程序回传 html 页面数据是一件非常繁锁的事情。开发成本和维护成本都极高。 123
Servlet 回传 html 页面数据的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class PringHtml extends HttpServlet { @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html; charset=UTF-8" ); PrintWriter writer = resp.getWriter(); writer.write("<!DOCTYPE html>\r\n" ); writer.write(" <html lang=\"en\">\r\n" ); writer.write(" <head>\r\n" ); writer.write(" <meta charset=\"UTF-8\">\r\n" ); writer.write(" <title>Title</title>\r\n" ); writer.write(" </head>\r\n" ); writer.write(" <body>\r\n" ); writer.write(" 这是html页面数据 \r\n" ); writer.write(" </body>\r\n" ); writer.write("</html>\r\n" ); writer.write("\r\n" ); } } 12345678910111213141516171819202122
jsp 回传一个简单 html 页面的代码:
1 2 3 4 5 6 7 8 9 10 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>jsp</title> </head> <body> 这是jsp页面 </body> </html> 123456789
2、jsp 的本质是什么 我们跟踪原代码发现,HttpJspBase 类。它直接地继承了 HttpServlet 类。也就是说。jsp 翻译出来的 java 类,它间接了继 承了 HttpServlet 类。也就是说,翻译出来的是一个 Servlet 程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 package org.apache.jsp;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;public final class index_jsp extends org .apache.jasper.runtime.HttpJspBase implements org .apache.jasper.runtime.JspSourceDependent, org.apache.jasper.runtime.JspSourceImports { private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private static final java.util.Set<java.lang.String> _jspx_imports_packages; private static final java.util.Set<java.lang.String> _jspx_imports_classes; static { _jspx_imports_packages = new java .util.HashSet<>(); _jspx_imports_packages.add("javax.servlet" ); _jspx_imports_packages.add("javax.servlet.http" ); _jspx_imports_packages.add("javax.servlet.jsp" ); _jspx_imports_classes = null ; } private volatile javax.el.ExpressionFactory _el_expressionfactory; private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; } public java.util.Set<java.lang.String> getPackageImports() { return _jspx_imports_packages; } public java.util.Set<java.lang.String> getClassImports() { return _jspx_imports_classes; } public javax.el.ExpressionFactory _jsp_getExpressionFactory () { if (_el_expressionfactory == null ) { synchronized (this ) { if (_el_expressionfactory == null ) { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); } } } return _el_expressionfactory; } public org.apache.tomcat.InstanceManager _jsp_getInstanceManager () { if (_jsp_instancemanager == null ) { synchronized (this ) { if (_jsp_instancemanager == null ) { _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } } } return _jsp_instancemanager; } public void _jspInit () { } public void _jspDestroy () { } public void _jspService (final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { final java.lang.String _jspx_method = request.getMethod(); if (!"GET" .equals(_jspx_method) && !"POST" .equals(_jspx_method) && !"HEAD" .equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD" ); return ; } final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null ; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null ; final java.lang.Object page = this ; javax.servlet.jsp.JspWriter _jspx_out = null ; javax.servlet.jsp.PageContext _jspx_page_context = null ; try { response.setContentType("text/html;charset=UTF-8" ); pageContext = _jspxFactory.getPageContext(this , request, response, null , true , 8192 , true ); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; out.write("\n" ); out.write("\n" ); out.write("<html>\n" ); out.write(" <head>\n" ); out.write(" <title>jsp</title>\n" ); out.write(" </head>\n" ); out.write(" <body>\n" ); out.write(" 这是jsp页面\n" ); out.write(" </body>\n" ); out.write("</html>\n" ); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0 ) try { if (response.isCommitted()) { out.flush(); } else { out.clearBuffer(); } } catch (java.io.IOException e) {} if (_jspx_page_context != null ) _jspx_page_context.handlePageException(t); else throw new ServletException (t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } } } 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
3、jsp 的三种语法 a)jsp 头部的 page 指令 jsp 的 page 指令可以修改 jsp 页面中一些重要的属性,或者行为。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 1 i. language 属性 表示 jsp 翻译后是什么语言文件。暂时只支持 java。 ii. contentType 属性 表示 jsp 返回的数据类型是什么。也是源码中 response.setContentType()参数值 iii. pageEncoding 属性 表示当前 jsp 页面文件本身的字符集。 iv. import 属性 跟 java 源代码中一样。用于导包,导类。 ========================两个属性是给 out 输出流使用============================= v. autoFlush 属性 设置当 out 输出流缓冲区满了之后,是否自动刷新冲级区。默认值是 true 。 vi. buffer 属性 设置 out 缓冲区的大小。默认是 8kb vii. errorPage 属性 设置当 jsp 页面运行时出错,自动跳转去的错误页面路径。 <!-- errorPage 表示错误后自动跳转去的路径 <br/> 这个路径一般都是以斜杠打头,它表示请求地址为 http: 映射到代码的 Web 目录 --> viii. isErrorPage 属性 设置当前 jsp 页面是否是错误信息页面。默认是 false 。如果是 true 可以 获取异常信息。 ix. session 属性 设置访问当前 jsp 页面,是否会创建 HttpSession 对象。默认是 true 。 x. extends 属性 设置 jsp 翻译出来的 java 类默认继承谁。 123456789101112
缓冲区溢出错误:
b)jsp 中的常用脚本 i. 声明脚本(极少使用)
声明脚本的格式是: <%! 声明 java 代码 %> 作用:可以给 jsp 翻译出来的 java 类定义属性和方法甚至是静态代码块。内部类等。
练习
1、声明类属性 2、声明 static 静态代码块 3、声明类方法 4、声明内部类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <%--1 、声明类属性--%> <%! private Integer id; private String name; private static Map<String,Object> map; %> <%--2 、声明static 静态代码块--%> <%! static { map = new HashMap <String,Object>(); map.put("key1" , "value1" ); map.put("key2" , "value2" ); map.put("key3" , "value3" ); } %> <%--3 、声明类方法--%> <%! public int abc () { return 12 ; } %> <%--4 、声明内部类--%> <%! public static class A { private Integer id = 12 ; private String abc = "abc" ; } %> 12345678910111213141516171819202122232425262728
声明脚本代码翻译对照:ii. 表达式脚本(常用)
1 2 3 4 5 6 7 8 9 10 <%=12 %> <br> <%=12.12 %> <br> <%="我是字符串" %> <br> <%=map%> <br> <%=request.getParameter("username" )%> 123456789
翻译对照:iii. 代码脚本
1 2 3 代码脚本的格式是: <% java 语句 %> 代码脚本的作用是:可以在 jsp 页面中,编写我们自己需要的功能(写的是 java 语句)。 12
代码脚本的特点是: 1、代码脚本翻译之后都在_jspService 方法中 2、代码脚本由于翻译到_jspService()方法中,所以在_jspService()方法中的现有对象都可以直接使用。 3、还可以由多个代码脚本块组合完成一个完整的 java 语句。 4、代码脚本还可以和表达式脚本一起组合使用,在 jsp 页面上输出数据
练习:
代码脚本—-if 语句
代码脚本—-for 循环语句
翻译后 java 文件中_jspService 方法内的代码都可以写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <%--1. 代码脚本----if 语句--%> <% int i = 13 ; if (i == 12 ) { %> <h1>人无远虑</h1> <% } else { %> <h1>必有近忧</h1> <% } %> <br> <%--2. 代码脚本----for 循环语句--%> <table border="1" cellspacing="0" > <% for (int j = 0 ; j < 10 ; j++) { %> <tr> <td>第 <%=j + 1 %>行</td> </tr> <% } %> </table> <%--3. 翻译后java文件中_jspService方法内的代码都可以写--%> <% String username = request.getParameter("username" ); System.out.println("用户名的请求参数值是:" + username); %> 12345678910111213141516171819202122232425262728293031
c)jsp 中的三种注释 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 i. html 注释 <!-- 这是 html 注释 --> html 注释会被翻译到 java 源代码中。在_jspService 方法里,以 out.writer 输出到客户端。 ii. java 注释 <% %> java 注释会被翻译到 java 源代码中。 iii. jsp 注释 <%-- 这是 jsp 注释 --%> jsp 注释可以注掉,jsp 页面中所有代码。 1234567891011121314
4、jsp 九大内置对象 jsp 中的内置对象,是指 Tomcat 在翻译 jsp 页面成为 Servlet 源代码后,内部提供的九大对象,叫内置对象。
5、jsp 四大域对象 pageContext ====>>> request ====>>> session ====>>> application
scope.jsp 页面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <body> <h1>scope.jsp页面</h1> <% pageContext.setAttribute("key" , "pageContext" ); request.setAttribute("key" , "request" ); session.setAttribute("key" , "session" ); application.setAttribute("key" , "application" ); %> pageContext域是否有值:<%=pageContext.getAttribute("key" )%> <br> request域是否有值:<%=request.getAttribute("key" )%> <br> session域是否有值:<%=session.getAttribute("key" )%> <br> application域是否有值:<%=application.getAttribute("key" )%> <br> <% %> <%-- <jsp:forward page="" ></jsp:forward> 是请求转发标签,它的功能就是请求转发 page 属性设置请求转发的路径 --%> <jsp:forward page="/scope2.jsp" ></jsp:forward> </body> 12345678910111213141516171819202122
scope2.jsp 页面
1 2 3 4 5 6 7 8 <body> <h1>scope2.jsp页面</h1> pageContext域是否有值:<%=pageContext.getAttribute("key" )%> <br> request域是否有值:<%=request.getAttribute("key" )%> <br> session域是否有值:<%=session.getAttribute("key" )%> <br> application域是否有值:<%=application.getAttribute("key" )%> <br> </body> 1234567
6、jsp 中的 out 输出和 response.getWriter 输出的区 别 由于 jsp 翻译之后,底层源代码都是使用 out 来进行输出,所以一般情况下。我们在 jsp 页面中统一使用 out 来进行输出。避 免打乱页面输出内容的顺序。 out.write() 输出字符串没有问题 out.print() 输出任意数据都没有问题(都转换成为字符串后调用的 write 输出)
深入源码,浅出结论:在 jsp 页面中,可以统一使用 out.print()来进行输出
7、jsp 的常用标签
1 2 <%@ include file="/include/footer.jsp" %> 1
1 2 3 4 5 <jsp:include page="/include/footer.jsp" > <jsp:param name="username" value="bbj" /> <jsp:param name="password" value="root" /> </jsp:include> 1234
动态包含的底层原理:
8、jsp 的练习题 练习一:在 jsp 页面中输出九九乘法口诀表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <style type="text/css" > table{ width: 650px; } </style> </head> <body> <%-- 练习一:在jsp页面中输出九九乘法口诀表 --%> <h1 align="center" >九九乘法口诀表</h1> <table align="center" > <% for (int i = 1 ; i <= 9 ; i++) { %> <tr> <% for (int j = 1 ; j <= i ; j++) { %> <td><%=j + "x" + i + "=" + (i*j)%></td> <% } %> </tr> <% } %> </table> </body> </html> 123456789101112131415161718192021222324252627
练习二:jsp 输出一个表格,里面有 10 个学生信息。 Student 类:
1 2 3 4 5 6 public class Student { private Integer id; private String name; private Integer age; private String phone; 12345
SearchStudentServlet 程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class SearchStudentServlet extends HttpServlet { @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List<Student> studentList = new ArrayList <Student>(); for (int i = 0 ; i < 10 ; i++) { int t = i + 1 ; studentList.add(new Student (t,"name" +t, 18 +t,"phone" +t)); } req.setAttribute("stuList" , studentList); req.getRequestDispatcher("/test/showStudent.jsp" ).forward(req,resp); } } 123456789101112131415161718
showStudent.jsp 页面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 <%@ page import ="com.atiguigu.pojo.Student" %> <%@ page import ="java.util.List" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <style> table{ border: 1px blue solid; width: 600px; border-collapse: collapse; } td,th{ border: 1px blue solid; } </style> </head> <body> <%--练习二:jsp输出一个表格,里面有10 个学生信息。--%> <% List<Student> studentList = (List<Student>) request.getAttribute("stuList" ); %> <table> <tr> <td>编号</td> <td>姓名</td> <td>年龄</td> <td>电话</td> <td>操作</td> </tr> <% for (Student student : studentList) { %> <tr> <td><%=student.getId()%></td> <td><%=student.getName()%></td> <td><%=student.getAge()%></td> <td><%=student.getPhone()%></td> <td>删除、修改</td> </tr> <% } %> </table> </body> </html> 123456789101112131415161718192021222324252627282930313233343536373839404142434445
9、什么是 Listener 监听 器? ServletContextListener 监听器
ServletContextListener 它可以监听 ServletContext 对象的创建和销毁。 ServletContext 对象在 web 工程启动的时候创建,在 web 工程停止的时候销毁。 监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈。
两个方法分别是: 监听器实现类:
1 2 3 4 5 6 7 8 9 10 11 12 13 public class MyServletContextListenerImpl implements ServletContextListener { @Override public void contextInitialized (ServletContextEvent sce) { System.out.println("ServletContext对象被创建了" ); } @Override public void contextDestroyed (ServletContextEvent sce) { System.out.println("ServletContext对象被销毁了" ); } } 123456789101112
web.xml 中的配置:
el&&jstl 1、EL表达式 a)什么是 EL 表达式,EL 表达式的作用? EL 表达式的全称是:Expression Language。是表达式语言。 EL 表达式的什么作用:EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出。 因为 EL 表达式在输出数据的时候,要比 jsp 的表达式脚本要简洁很多。
1 2 3 4 5 6 <body> <% request.setAttribute("key" ,"value" );%><br/> <%=request.getAttribute("key" )%>><br/> ${key} </body> 12345
EL 表达式的格式是:${表达式} EL 表达式在输出 null 值的时候,输出的是空串。jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串。
b)EL 表达式搜索域数据的顺序 EL 表达式主要是在 jsp 页面中输出数据。 主要是输出域对象中的数据。
当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。
1 2 3 4 5 6 7 8 9 10 11 12 <body> <% request.setAttribute("key" , "request" ); session.setAttribute("key" , "session" ); application.setAttribute("key" , "application" ); pageContext.setAttribute("key" , "pageContext" ); %> ${ key } </body> 1234567891011
c)EL表达式输出Bean的普通属性,数组属性。List 集合属性,map集合属性 i. 需求——输出 Person 类中普通属性,数组属性。list 集合属性和 map 集合属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 public class Person { private String name; private String[] phones; private List<String> cities; private Map<String,Object> map; } 123456 <body> <% Person person = new Person (); person.setName("李四!" ); person.setPhones(new String []{"18610541354" ,"18688886666" ,"18699998888" }); List<String> cities = new ArrayList <String>(); cities.add("北京" ); cities.add("上海" ); cities.add("深圳" ); person.setCities(cities); Map<String,Object>map = new HashMap <>(); map.put("key1" ,"value1" ); map.put("key2" ,"value2" ); map.put("key3" ,"value3" ); person.setMap(map); pageContext.setAttribute("p" , person); %> 输出Person:${ p }<br/> 输出Person的name属性:${p.name} <br> 输出Person的pnones数组属性值:${p.phones[2 ]} <br> 输出Person的cities集合中的元素值:${p.cities} <br> 输出Person的List集合中个别元素值:${p.cities[2 ]} <br> 输出Person的Map集合: ${p.map} <br> 输出Person的Map集合中某个key的值: ${p.map.key3} <br> 输出Person的age属性:${p.age} <br> </body> 1234567891011121314151617181920212223242526272829
d)EL 表达式——运算 语法:${ 运算表达式 } , EL 表达式支持如下运算符:
1)关系运算
2)逻辑运算
3)算数运算
i. empty 运算
empty 运算可以判断一个数据是否为空,如果为空,则输出 true,不为空输出 false。
以下几种情况为空: 1、值为 null 值的时候,为空 2、值为空串的时候,为空 3、值是 Object 类型数组,长度为零的时候 4、list 集合,元素个数为零 5、map 集合,元素个数为零
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <body> <% request.setAttribute("emptyNull" , null ); request.setAttribute("emptyStr" , "" ); request.setAttribute("emptyArr" , new Object []{}); List<String> list = new ArrayList <>(); request.setAttribute("emptyList" , list); Map<String,Object> map = new HashMap <String, Object>(); request.setAttribute("emptyMap" , map); %> ${ empty emptyNull } <br/> ${ empty emptyStr } <br/> ${ empty emptyArr } <br/> ${ empty emptyList } <br/> ${ empty emptyMap } <br/> <hr> </body> 12345678910111213141516171819202122232425
ii. 三元运算
表达式 1?表达式 2:表达式 3 如果表达式 1 的值为真,返回表达式 2 的值,如果表达式 1 的值为假,返回表达式 3 的值。
1 2 ${ 12 != 12 ? "今天出去玩" :"还是宅在家里吧!" } 1
iii. “.”点运算 和 [] 中括号运算符
.点运算,可以输出 Bean 对象中某个属性的值。 []中括号运算,可以输出有序集合中某个元素的值。 并且[]中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <body> <% Map<String,Object> map = new HashMap <String, Object>(); map.put("a.a.a" , "aaaValue" ); map.put("b+b+b" , "bbbValue" ); map.put("c-c-c" , "cccValue" ); request.setAttribute("map" , map); %> ${ map['a.a.a' ] } <br> ${ map["b+b+b" ] } <br> ${ map['c-c-c' ] } <br> </body> 123456789101112131415
e)EL 表达式的11个隐含对象 EL 个达式中 11 个隐含对象,是 EL 表达式中自己定义的,可以直接使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 变量 类型 作用 pageContext PageContextImpl 它可以获取jsp中的九大内置对象 pageScope Map<String,Object> 它可以获取 pageContext 域中的数据 requestScope Map<String,Object> 它可以获取 Request 域中的数据 sessionScope Map<String,Object> 它可以获取 Session 域中的数据 applicationScope Map<String,Object> 它可以获取 ServletContext 域中的数据 param Map<String,String> 它可以获取请求参数的值 paramValues Map<String,String[]> 它也可以获取请求参数的值,获取多个值的时候使用。 header Map<String,String> 它可以获取请求头的信息 headerValues Map<String,String[]> 它可以获取请求头的信息,它可以获取多个值的情况 cookie Map<String,Cookie> 它可以获取当前请求的 Cookie 信息 initParam Map<String,String> 它可以获取在 web.xml 中配置的<context-param>上下文参数 123456789101112
i. EL 获取四个特定域中的属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 pageScope ====== pageContext 域 requestScope ====== Request 域 sessionScope ====== Session 域 applicationScope ====== ServletContext 域 1234 <body> <% pageContext.setAttribute("key1" , "pageContext1" ); pageContext.setAttribute("key2" , "pageContext2" ); request.setAttribute("key2" , "request" ); session.setAttribute("key2" , "session" ); application.setAttribute("key2" , "application" ); %> ${ applicationScope.key2 } </body> 12345678910
ii. pageContext 对象的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 1. 协议: 2. 服务器 ip: 3. 服务器端口: 4. 获取工程路径: 5. 获取请求方法: 6. 获取客户端 ip 地址: 7. 获取会话的 id 编号:1234567 <body> <%-- request.getScheme() 它可以获取请求的协议 request.getServerName() 获取请求的服务器ip或域名 request.getServerPort() 获取请求的服务器端口号 getContextPath() 获取当前工程路径 request.getMethod() 获取请求的方式(GET或POST) request.getRemoteHost() 获取客户端的ip 地址 session.getId() 获取会话的唯一标识 --%> <% pageContext.setAttribute("req" , request); %> <%=request.getScheme() %> <br> 1. 协议: ${ req.scheme }<br> 2. 服务器ip:${ pageContext.request.serverName }<br> 3. 服务器端口:${ pageContext.request.serverPort }<br> 4. 获取工程路径:${ pageContext.request.contextPath }<br> 5. 获取请求方法:${ pageContext.request.method }<br> 6. 获取客户端ip地址:${ pageContext.request.remoteHost }<br> 7. 获取会话的id编号:${ pageContext.session.id }<br> </body> 1234567891011121314151617181920212223
iii. EL 表达式其他隐含对象的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <body> 输出请求参数username的值:${ param.username } <br> 输出请求参数password的值:${ param.password } <br> 输出请求参数username的值:${ paramValues.username[0 ] } <br> 输出请求参数hobby的值:${ paramValues.hobby[0 ] } <br> 输出请求参数hobby的值:${ paramValues.hobby[1 ] } <br> <hr> 输出请求头【User-Agent】的值:${ header['User-Agent' ] } <br> 输出请求头【Connection】的值:${ header.Connection } <br> 输出请求头【User-Agent】的值:${ headerValues['User-Agent' ][0 ] } <br> <hr> 获取Cookie的名称:${ cookie.JSESSIONID.name } <br> 获取Cookie的值:${ cookie.JSESSIONID.value } <br> <hr> 输出<Context-param>username的值:${ initParam.username } <br> 输出<Context-param>url的值:${ initParam.url } <br> </body> 1234567891011121314151617181920 <context-param> <param-name>username</param-name> <param-value>root</param-value> </context-param> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql: 1
2、JSTL标签库 JSTL 标签库 全称是指 JSP Standard Tag Library JSP 标准标签库。是一个不断完善的开放源代码的 JSP 标 签库。 EL 表达式主要是为了替换 jsp 中的表达式脚本,而标签库则是为了替换代码脚本。这样使得整个 jsp 页面 变得更佳简洁。 在 jsp 标签库中使用 taglib 指令引入标签库
1 2 3 4 5 6 CORE 标签库 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> XML 标签库<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> FMT 标签库 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> SQL 标签库 <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> FUNCTIONS 标签库 <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 12345
f) JSTL 标签库的使用步骤
1、先导入 jstl 标签库的 jar 包。 taglibs-standard-impl-1.2.1.jar taglibs-standard-spec-1.2.1.jar 2、第二步,使用 taglib 指令引入标签库。 <%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
g)core 核心库使用
i. <c:set />(使用很少) 作用:set 标签可以往域中保存数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <%-- i.<c:set /> 作用:set标签可以往域中保存数据 域对象.setAttribute(key,value); scope 属性设置保存到哪个域 page表示PageContext域(默认值) request表示Request域 session表示Session域 application表示ServletContext域 var 属性设置key是多少 value属性设置值 --%> 保存之前:${ sessionScope.abc } <br> <c:set scope="session" var ="abc" value="abcValue" /> 保存之后:${ sessionScope.abc } <br> <hr> 1234567891011121314151617
ii. <c:if />
if 标签用来做 if 判断。
1 2 3 4 5 6 7 8 9 10 11 12 13 <%-- ii.<c:if /> if 标签用来做if 判断。 test属性表示判断的条件(使用EL表达式输出) --%> <c:if test="${ 12 == 12 }" > <h1>12 等于12 </h1> </c:if > <c:if test="${ 12 != 12 }" > <h1>12 不等于12 </h1> </c:if > <hr> 123456789101112
iii. <c:choose> <c:when> <c:otherwise>标签
作用:多路判断。跟 switch … case … default 非常接近
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 <%-- iii.<c:choose> <c:when> <c:otherwise>标签 作用:多路判断。跟switch ... case .... default 非常接近 choose标签开始选择判断 when标签表示每一种判断情况 test属性表示当前这种判断情况的值 otherwise标签表示剩下的情况 <c:choose> <c:when> <c:otherwise>标签使用时需要注意的点: 1 、标签里不能使用html注释,要使用jsp注释 2 、when标签的父标签一定要是choose标签 --%> <% request.setAttribute("height" , 180 ); %> <c:choose> <%-- 这是html注释 --%> <c:when test="${ requestScope.height > 190 }" > <h2>小巨人</h2> </c:when> <c:when test="${ requestScope.height > 180 }" > <h2>很高</h2> </c:when> <c:when test="${ requestScope.height > 170 }" > <h2>还可以</h2> </c:when> <c:otherwise> <c:choose> <c:when test="${requestScope.height > 160}" > <h3>大于160 </h3> </c:when> <c:when test="${requestScope.height > 150}" > <h3>大于150 </h3> </c:when> <c:when test="${requestScope.height > 140}" > <h3>大于140 </h3> </c:when> <c:otherwise> 其他小于140 </c:otherwise> </c:choose> </c:otherwise> </c:choose> 1234567891011121314151617181920212223242526272829303132333435363738394041424344
iv. <c:forEach />
作用:遍历输出使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 <%--1. 遍历1 到10 ,输出 begin属性设置开始的索引 end 属性设置结束的索引 var 属性表示循环的变量(也是当前正在遍历到的数据) for (int i = 1 ; i < 10 ; i++) --%> <table border="1" > <c:forEach begin="1" end="10" var ="i" > <tr> <td>第${i}行</td> </tr> </c:forEach> </table> <hr> 1234567891011121314 <%-- 2. 遍历Object数组 for (Object item: arr) items 表示遍历的数据源(遍历的集合) var 表示当前遍历到的数据 --%> <% request.setAttribute("arr" , new String []{"18610541354" ,"18688886666" ,"18699998888" }); %> <c:forEach items="${ requestScope.arr }" var ="item" > ${ item } <br> </c:forEach> <hr> 123456789101112 <% Map<String, Object> map = new HashMap <String, Object>(); map.put("key1" , "value1" ); map.put("key2" , "value2" ); map.put("key3" , "value3" ); request.setAttribute("map" , map); %> <c:forEach items="${ requestScope.map }" var ="entry" > <h1>${entry.key} = ${entry.value}</h1> </c:forEach> <hr> 12345678910111213 <%--4. 遍历List集合---list中存放 Student类,有属性:编号,用户名,密码,年龄,电话信息--%> <% List<Student> studentList = new ArrayList <Student>(); for (int i = 1 ; i <= 10 ; i++) { studentList.add(new Student (i, "username" + i, "pass" + i, 18 + i, "phone" + i)); } request.setAttribute("stus" , studentList); %> <form action="" enctype="" ></form> <table> <tr> <th>编号</th> <th>用户名</th> <th>密码</th> <th>年龄</th> <th>电话</th> <th>操作</th> </tr> <%-- items 表示遍历的集合 var 表示遍历到的数据 begin表示遍历的开始索引值 end 表示结束的索引值 step 属性表示遍历的步长值 varStatus 属性表示当前遍历到的数据的状态 for (int i = 1 ; i < 10 ; i+=2 ) --%> <c:forEach begin="2" end="7" step="2" varStatus="status" items="${requestScope.stus}" var ="stu" > <tr> <td>${stu.id}</td> <td>${stu.username}</td> <td>${stu.password}</td> <td>${stu.age}</td> <td>${stu.phone}</td> <td>${status.step}</td> </tr> </c:forEach> </table>
文件上传和下载 1、文件的上传 文件的上传和下载,是非常常见的功能。很多的系统中,或者软件中都经常使用文件的上传和下载。 比如:QQ 头像,就使用了上传。 邮箱中也有附件的上传和下载功能。 OA 系统中审批有附件材料的上传。
文件上传注意点:
1 2 3 4 5 6 7 1 、要有一个 form 标签,method=post 请求 2 、form 标签的 encType 属性值必须为 multipart/form-data 值 3 、在 form 标签中使用 input type=file 添加上传的文件 4 、编写服务器代码(Servlet 程序)接收,处理上传的数据。encType=multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的 形式进行拼 接,然后以二进制流的形式发送给服务器 123456
1.1、 文件上传,HTTP协议的说明
1.2、commons-fileupload.jar 常用 API 介绍 commons-fileupload.jar 需要依赖 commons-io.jar 这个包,所以两个包我们都要引入。 第一步,就是需要导入两个 jar 包: commons-fileupload-1.2.1.jar commons-io-1.4.jar
commons-fileupload.jar 和 commons-io.jar 包中,我们常用的类有哪些?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ServletFileUpload类,用于解析上传的数据。 FileItem 类,表示每一个表单项。 boolean ServletFileUpload.isMultipartContent(HttpServletRequest request); 判断当前上传的数据格式是否是多段的格式。 public List<FileItem> parseRequest (HttpServletRequest request) 解析上传的数据 boolean FileItem.isFormField() 判断当前这个表单项,是否是普通的表单项。还是上传的文件类型。 true 表示普通类型的表单项 false 表示上传的文件类型 String FileItem.getFieldName() 获取表单项的 name 属性值 String FileItem.getString() 获取当前表单项的值。 String FileItem.getName(); 获取上传的文件名 void FileItem.write( file ); 将上传的文件写到 参数 file 所指向抽硬盘位置 。1234567891011121314151617
1.3、fileupload 类库的使用 上传文件的表单:
1 2 3 4 5 6 7 8 <body> <form action="http://192.168.31.74:8080/09_EL_JSTL/uploadServlet" method="post" enctype="multipart/form-data" > 用户名:<input type="text" name="username" /> <br> 头像:<input type="file" name="photo" > <br> <input type="submit" value="上传" > </form> </body> 1234567
解析上传的数据的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 @Override protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { if (ServletFileUpload.isMultipartContent(req)) { FileItemFactory fileItemFactory = new DiskFileItemFactory (); ServletFileUpload servletFileUpload = new ServletFileUpload (fileItemFactory); try { List<FileItem> list = servletFileUpload.parseRequest(req); for (FileItem fileItem : list) { if (fileItem.isFormField()) { System.out.println("表单项的name属性值:" + fileItem.getFieldName()); System.out.println("表单项的value属性值:" + fileItem.getString("UTF-8" )); } else { System.out.println("表单项的name属性值:" + fileItem.getFieldName()); System.out.println("上传的文件名:" + fileItem.getName()); fileItem.write(new File ("e:\\" + fileItem.getName())); } } } catch (Exception e) { e.printStackTrace(); } } } 12345678910111213141516171819202122232425262728293031323334353637
2、文件下载 response.setHeader(“Content-Disposition”, “attachment; fileName=1.jpg”); 这个响应头告诉浏览器。这是需要下载的。而 attachment 表示附件,也就是下载的一个文件。fileName=后面, 表示下载的文件名。 完成上面的两个步骤,下载文件是没问题了。但是如果我们要下载的文件是中文名的话。你会发现,下载无法正确显示出正确的中文名。 原因是在响应头中,不能包含有中文字符,只能包含 ASCII 码。
附件中文名乱码 问题解决方案: 方案一:URLEncoder 解决 IE 和谷歌浏览器的 附件中 文名问题。
如果客户端浏览器是 IE 浏览器 或者 是谷歌浏览器。我们需要使用 URLEncoder 类先对中文名进行 UTF-8 的编码 操作。
因为 IE 浏览器和谷歌浏览器收到含有编码后的字符串后会以 UTF-8 字符集进行解码显示。
1 2 3 4 resp.setHeader("Content-Disposition" , "attachment; filename=" + URLEncoder.encode("中国.jpg" , "UTF-8" )); 123
方案二:BASE64 编解码 解决 火狐浏览器的附件中文名问题
文件下载完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String downloadFileName = "2.jpg" ; ServletContext servletContext = getServletContext(); String mimeType = servletContext.getMimeType("/file/" + downloadFileName); System.out.println("下载的文件类型:" + mimeType); resp.setContentType(mimeType); if (req.getHeader("User-Agent" ).contains("Firefox" )) { resp.setHeader("Content-Disposition" , "attachment; filename==?UTF-8?B?" + new BASE64Encoder ().encode("中国.jpg" .getBytes("UTF-8" )) + "?=" ); } else { resp.setHeader("Content-Disposition" , "attachment; filename=" + URLEncoder.encode("中国.jpg" , "UTF-8" )); } InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFileName); OutputStream outputStream = resp.getOutputStream(); IOUtils.copy(resourceAsStream, outputStream); }
cookie&&session 1、Cookie a)什么是 Cookie? 1、Cookie 翻译过来是饼干的意思。 2、Cookie 是服务器通知客户端保存键值对的一种技术。 3、客户端有了 Cookie 后,每次请求都发送给服务器。 4、每个 Cookie 的大小不能超过 4kb
b)如何创建 Cookie Servlet 程序中的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 protected void createCookie (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie ("key4" , "value4" ); resp.addCookie(cookie); Cookie cookie1 = new Cookie ("key5" , "value5" ); resp.addCookie(cookie1); resp.getWriter().write("Cookie创建成功" ); } 123456789101112
c)服务器如何获取 Cookie 服务器获取客户端的 Cookie 只需要一行代码:req.getCookies():Cookie[] Cookie 的工具类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class CookieUtils { public static Cookie findCookie (String name , Cookie[] cookies) { if (name == null || cookies == null || cookies.length == 0 ) { return null ; } for (Cookie cookie : cookies) { if (name.equals(cookie.getName())) { return cookie; } } return null ; } } 12345678910111213141516171819202122
Servlet 程序中的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 protected void getCookie (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie[] cookies = req.getCookies(); for (Cookie cookie : cookies) { resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br/>" ); } Cookie iWantCookie = CookieUtils.findCookie("key1" , cookies); if (iWantCookie != null ) { resp.getWriter().write("找到了需要的Cookie" ); } } 12345678910111213141516171819202122232425262728
d)Cookie 值的修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 protected void updateCookie (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = CookieUtils.findCookie("key2" , req.getCookies()); if (cookie != null ) { cookie.setValue("newValue2" ); resp.addCookie(cookie); } resp.getWriter().write("key1的Cookie已经修改好" ); } 12345678910111213141516171819202122
e)浏览器查看 Cookie: 谷歌浏览器如何查看 Cookie:
火狐浏览器如何查看 Cookie:
f) Cookie 生命控制 Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)
setMaxAge() 正数,表示在指定的秒数后过期 负数,表示浏览器一关,Cookie 就会被删除(默认值是-1) 零,表示马上删除 Cookie
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 protected void life3600 (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie ("life3600" , "life3600" ); cookie.setMaxAge(60 * 60 ); resp.addCookie(cookie); resp.getWriter().write("已经创建了一个存活一小时的Cookie" ); } protected void deleteNow (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = CookieUtils.findCookie("key4" , req.getCookies()); if (cookie != null ) { cookie.setMaxAge(0 ); resp.addCookie(cookie); resp.getWriter().write("key4的Cookie已经被删除" ); } } protected void defaultLife (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie ("defalutLife" ,"defaultLife" ); cookie.setMaxAge(-1 ); resp.addCookie(cookie); } 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
g)Cookie 有效路径 Path 的设置 Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。 path 属性是通过请求的地址来进行有效的过滤。
1 2 3 4 5 6 7 8 protected void testPath (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie ("path1" , "path1" ); cookie.setPath( req.getContextPath() + "/abc" ); resp.addCookie(cookie); resp.getWriter().write("创建了一个带有Path路径的Cookie" ); } 1234567
h) Cookie 练习—免输入用户名登录 login.jsp 页面
1 2 3 4 5 6 7 8 <body> <form action="http://localhost:8080/13_cookie_session/loginServlet" method="get" > 用户名:<input type="text" name="username" value="${cookie.username.value}" > <br> 密码:<input type="password" name="password" > <br> <input type="submit" value="登录" > </form> </body> 1234567
LoginServlet 程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username" ); String password = req.getParameter("password" ); if ("wzg168" .equals(username) && "123456" .equals(password)) { Cookie cookie = new Cookie ("username" , username); cookie.setMaxAge(60 * 60 * 24 * 7 ); resp.addCookie(cookie); System.out.println("登录 成功" ); } else { System.out.println("登录 失败" ); } } 12345678910111213141516
2、Session 会话 i) 什么是 Session 会话? 1、Session 就一个接口(HttpSession)。 2、Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。 3、每个客户端都有自己的一个 Session 会话。 4、Session 会话中,我们经常用来保存用户登录之后的信息。
j) 如何创建 Session 和获取(id 号,是否为新) 如何创建和获取 Session。它们的 API 是一样的。
request.getSession() 第一次调用是:创建 Session 会话 之后调用都是:获取前面创建好的 Session 会话对象。
isNew(); 判断到底是不是刚创建出来的(新的) true 表示刚创建 false 表示获取之前创建 的 每个会话都有一个身份证号。也就是 ID 值。而且这个 ID 是唯一的。
getId() 得到 Session 的会话 id 值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 protected void createOrGetSession (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); boolean isNew = session.isNew(); String id = session.getId(); resp.getWriter().write("得到的Session,它的id是:" + id + " <br /> " ); resp.getWriter().write("这个Session是否是新创建的:" + isNew + " <br /> " ); } 12345678910111213
k)Session 域数据的存取 1 2 3 4 5 6 7 8 9 10 protected void setAttribute (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.getSession().setAttribute("key1" , "value1" ); resp.getWriter().write("已经往Session中保存了数据" ); } protected void getAttribute (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Object attribute = req.getSession().getAttribute("key1" ); resp.getWriter().write("从Session中获取出key1的数据是:" + attribute); } 123456789
l) Session 生命周期 控制 public void setMaxInactiveInterval(int interval) 设置 Session 的超时时间(以秒为单位),超过指定的时长,Session 就会被销毁。
值为正数的时候,设定 Session 的超时时长。 负数表示永不超时(极少使用)
public int getMaxInactiveInterval()获取 Session 的超时时间
public void invalidate() 让当前 Session 会话马上超时无效。
Session 默认的超时时长是多少! Session 默认的超时时间长为 30 分钟。
因为在 Tomcat 服务器的配置文件 web.xml中默认有以下的配置,它就表示配置了当前 Tomcat 服务器下所有的 Session 超时配置默认时长为:30 分钟。
1 2 3 4 <session-config> <session-timeout>30 </session-timeout> </session-config> 123
如果希望你的 web 工程,默认的 Session 的超时时长为其他时长。你可以在你自己的 web.xml 配置文件中做 以上相同的配置。就可以修改你的 web 工程所有 Seession 的默认超时时长。
1 2 3 4 5 <!--表示当前web工程。创建出来 的所有Session默认是20 分钟 超时时长--> <session-config> <session-timeout>20 </session-timeout> </session-config> 1234
如果你想只修改个别 Session 的超时时长。就可以使用上面的 API。
setMaxInactiveInterval(int interval)来进行单独的设 置。
session.setMaxInactiveInterval(int interval)单独设置超时时长。
Session 超时的概念介绍: 示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 protected void defaultLife (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int maxInactiveInterval = req.getSession().getMaxInactiveInterval(); resp.getWriter().write("Session的默认超时时长为:" + maxInactiveInterval + " 秒 " ); } protected void life3 (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); session.setMaxInactiveInterval(3 ); resp.getWriter().write("当前Session已经设置为3秒后超时" ); } protected void deleteNow (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); session.invalidate(); resp.getWriter().write("Session已经设置为超时(无效)" ); } 12345678910111213141516171819202122232425
m) 浏览器和 Session 之间关联的技术内幕 Session 技术,底层其实是基于 Cookie 技术来实现的
filter 1、Filter 什么是过滤器 1、Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器 2、Filter 过滤器它是 JavaEE 的规范。也就是接口 3、Filter 过滤器它的作用是:拦截请求,过滤响应。
拦截请求常见的应用场景有: 1、权限检查 2、日记操作 3、事务管理 ……等等
2、Filter的初体验 要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有资源(html 页面、jpg 图片、jsp 文件、等等)都必 须是用户登录之后才允许访问。 思考:根据之前我们学过内容。我们知道,用户登录之后都会把用户登录的信息保存到 Session 域中。所以要检查用户是否 登录,可以判断 Session 中否包含有用户登录的信息即可!!!
1 2 3 4 5 6 7 8 9 <% Object user = session.getAttribute("user" );if (user == null ) { request.getRequestDispatcher("/login.jsp" ).forward(request,response); return ;} %> 12345678
Filter的工作流程图: Filter 的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class AdminFilter implements Filter { @Override public void doFilter (ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; HttpSession session = httpServletRequest.getSession(); Object user = session.getAttribute("user" ); if (user == null ) { servletRequest.getRequestDispatcher("/login.jsp" ).forward(servletRequest,servletResponse); return ; } else { filterChain.doFilter(servletRequest,servletResponse); } } } 1234567891011121314151617181920
web.xml 中的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <filter > <filter-name > AdminFilter</filter-name > <filter-class > com.atguigu.filter.AdminFilter</filter-class > </filter > <filter-mapping > <filter-name > AdminFilter</filter-name > <url-pattern > /admin/*</url-pattern > </filter-mapping > 1234567891011121314151617
Filter 过滤器的使用步骤: 1、编写一个类去实现 Filter 接口 2、实现过滤方法 doFilter() 3、到 web.xml 中去配置 Filter 的拦截路径
完整的用户登录
login.jsp 页面 == 登录表单
1 2 3 4 5 6 7 这是登录页面。login.jsp 页面 <br > <form action ="http://localhost:8080/15_filter/loginServlet" method ="get" > 用户名:<input type ="text" name ="username" /> <br > 密 码:<input type ="password" name ="password" /> <br > <input type ="submit" /> </form > 123456
LoginServlet 程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class LoginServlet extends HttpServlet { @Override protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html; charset=UTF-8" ); String username = req.getParameter("username" ); String password = req.getParameter("password" ); if ("wzg168" .equals(username) && "123456" .equals(password)) { req.getSession().setAttribute("user" ,username); resp.getWriter().write("登录 成功!!!" ); } else { req.getRequestDispatcher("/login.jsp" ).forward(req,resp); } } } 123456789101112131415
3、Filter 的生命周期 Filter 的生命周期包含几个方法 1、构造器方法 2、init 初始化方法 第 1,2 步,在 web 工程启动的时候执行(Filter 已经创建) 3、doFilter 过滤方法 第 3 步,每次拦截到请求,就会执行 4、destroy 销毁 第 4 步,停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter 过滤器)
4、FilterConfig 类 java 代码:
1 2 3 4 5 6 7 8 9 10 11 12 @Override public void init (FilterConfig filterConfig) throws ServletException { System.out.println("2.Filter 的 init(FilterConfig filterConfig)初始化" ); System.out.println("filter-name 的值是:" + filterConfig.getFilterName()); System.out.println("初始化参数 username 的值是:" + filterConfig.getInitParameter("username" )); System.out.println("初始化参数 url 的值是:" + filterConfig.getInitParameter("url" )); System.out.println(filterConfig.getServletContext()); } 1234567891011
web.xml 配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <filter > <filter-name > AdminFilter</filter-name > <filter-class > com.atguigu.filter.AdminFilter</filter-class > <init-param > <param-name > username</param-name > <param-value > root</param-value > </init-param > <init-param > <param-name > url</param-name > <param-value > jdbc:mysql://localhost3306/test</param-value > </init-param > </filter > 123456789101112131415
5、FilterChain 过滤器链 Filter 过滤器 Chain 链,链条 FilterChain 就是过滤器链(多个过滤器如何一起工作)
6、Filter 的拦截路径 精确匹配 /target.jsp 以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp
目录匹配 /admin/ 以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/
后缀名匹配 .html 以上配置的路径,表示请求地址必须以.html 结尾才会拦截到.do 以上配置的路径,表示请求地址必须以.do 结尾才会拦截到*.action 以上配置的路径,表示请求地址必须以.action 结尾才会拦截到
Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!
json&ajax&i18n 1、什么是 JSON? JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,而且很多语言都提供了对 json 的支持(包括 C, C++, C#, Java, JavaScript, Perl, Python等)。 这样就使得 JSON 成为理想的数据交换格式。
json 是一种轻量级的数据交换格式。
轻量级指的是跟 xml 做比较。
数据交换指的是客户端和服务器之间业务数据的传递格式。
1.1、JSON 在 JavaScript 中的使用 json 的定义 json 是由键值对组成,并且由花括号(大括号)包围。每个键由引号引起来,键和值之间使用冒号进行分隔, 多组键值对之间进行逗号进行分隔。
json 定义示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 var jsonObj = { "key1" :12 , "key2" :"abc" , "key3" :true , "key4" :[11 ,"arr" ,false ], "key5" :{ "key5_1" : 551 , "key5_2" : "key5_2_value" }, "key6" :[{ "key6_1_1" :6611 , "key6_1_2" :"key6_1_2_value" },{ "key6_2_1" :6621 , "key6_2_2" :"key6_2_2_value" }] }; 1234567891011121314151617
json 的访问 json 本身是一个对象。 json 中的 key 我们可以理解为是对象中的一个属性。 json 中的 key 访问就跟访问对象的属性一样: json 对象.key
json 访问示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 alert (typeof (jsonObj));alert (jsonObj.key1 ); alert (jsonObj.key2 ); alert (jsonObj.key3 ); alert (jsonObj.key4 );for (var i = 0 ; i < jsonObj.key4 .length ; i++) { alert (jsonObj.key4 [i]); } alert (jsonObj.key5 .key5_1 );alert (jsonObj.key5 .key5_2 );alert ( jsonObj.key6 );var jsonItem = jsonObj.key6 [0 ];alert ( jsonItem.key6_1_2 ); 12345678910111213141516
json 的两个常用方法 json 的存在有两种形式。 一种是:对象的形式存在,我们叫它 json 对象。 一种是:字符串的形式存在,我们叫它 json 字符串。 一般我们要操作 json 中的数据的时候,需要 json 对象的格式。 一般我们要在客户端和服务器之间进行数据交换的时候,使用 json 字符串。
JSON.stringify() 把 json 对象转换成为 json 字符串
JSON.parse() 把 json 字符串转换成为 json 对象
示例代码:
1 2 3 4 5 6 7 8 var jsonObjString = JSON .stringify (jsonObj); alert (jsonObjString)var jsonObj2 = JSON .parse (jsonObjString);alert (jsonObj2.key1 );alert (jsonObj2.key2 );1234567
1.2、JSON 在 java 中的使用 javaBean 和 json 的互转 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @Test public void test1 () { Person person = new Person (1 ,"jsonToString" ); Gson gson = new Gson (); String personJsonString = gson.toJson(person); System.out.println(personJsonString); Person person1 = gson.fromJson(personJsonString, Person.class); System.out.println(person1); } 1234567891011121314
List 和 json 的互转 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class PersonListType extends TypeToken <ArrayList<Person>> {} 12 @Test public void test2 () { List<Person> personList = new ArrayList <>(); personList.add(new Person (1 , "张三" )); personList.add(new Person (2 , "李四" )); Gson gson = new Gson (); String personListJsonString = gson.toJson(personList); System.out.println(personListJsonString); List<Person> list = gson.fromJson(personListJsonString, new PersonListType ().getType()); System.out.println(list); Person person = list.get(0 ); System.out.println(person); } 123456789101112131415
map 和 json 的互转 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Test public void test3 () { Map<Integer,Person> personMap = new HashMap <>(); personMap.put(1 , new Person (1 , "张三" )); personMap.put(2 , new Person (2 , "李四" )); Gson gson = new Gson (); String personMapJsonString = gson.toJson(personMap); System.out.println(personMapJsonString); PersonMapType().getType()); Map<Integer,Person> personMap2 = gson.fromJson(personMapJsonString, new TypeToken <HashMap<Integer,Person>>(){}.getType()); System.out.println(personMap2); Person p = personMap2.get(1 ); System.out.println(p); } 123456789101112131415161718
2、AJAX 请求 2.1、什么是 AJAX 请求 AJAX 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。
ajax 是一种浏览器通过 js 异步发起请求,局部更新页面的技术。
Ajax 请求的局部更新,浏览器地址栏不会发生变化
局部更新不会舍弃原来页面的内容
2.2、原生 AJAX 请求的示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html > <head > <meta http-equiv ="pragma" content ="no-cache" /> <meta http-equiv ="cache-control" content ="no-cache" /> <meta http-equiv ="Expires" content ="0" /> <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > Insert title here</title > <script type ="text/javascript" > function ajaxRequest ( ) { var xmlhttprequest = new XMLHttpRequest (); xmlhttprequest.open ("GET" ,"http://localhost:8080/16_json_ajax_i18n/ajaxServlet?action=javaScriptAjax" ,true ); xmlhttprequest.onreadystatechange = function ( ){ if (xmlhttprequest.readyState == 4 && xmlhttprequest.status == 200 ) { alert ("收到服务器返回的数据:" + xmlhttprequest.responseText ); var jsonObj = JSON .parse (xmlhttprequest.responseText ); document .getElementById ("div01" ).innerHTML = "编号:" + jsonObj.id + " , 姓名:" + jsonObj.name ; } } xmlhttprequest.send (); alert ("我是最后一行的代码" ); } </script > </head > <body > <button onclick ="ajaxRequest()" > ajax request</button > <button onclick ="ajaxRequest()" > ajax request</button > <button onclick ="ajaxRequest()" > ajax request</button > <button onclick ="ajaxRequest()" > ajax request</button > <button onclick ="ajaxRequest()" > ajax request</button > <div id ="div01" > </div > <table border ="1" > <tr > <td > 1.1</td > <td > 1.2</td > </tr > <tr > <td > 2.1</td > <td > 2.2</td > </tr > </table > </body > </html > 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
2.3、jQuery 中的 AJAX 请求 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 $.ajax 方法 url 表示请求的地址 type 表示请求的类型 GET 或 POST 请求 data 表示发送给服务器的数据 格式有两种: 一:name=value&name=value 二:{key :value} success 请求成功,响应的回调函数 dataType 响应的数据类型 常用的数据类型有: text 表示纯文本 xml 表示 xml 数据 json 表示 json 对象 12345678910111213 $("#ajaxBtn" ).click (function ( ){ $.ajax ({ url :"http://localhost:8080/16_json_ajax_i18n/ajaxServlet" , data :{action :"jQueryAjax" }, type :"GET" , success :function (data ) { $("#msg" ).html (" ajax 编号:" + data.id + " , 姓名:" + data.name ); }, dataType : "json" }); }); 123456789101112131415 $.get 方法和$.post 方法 url 请求的 url 地址 data 发送的数据 callback 成功的回调函数 type 返回的数据类型 12345 $("#getBtn" ).click (function ( ){ $.get ("http://localhost:8080/16_json_ajax_i18n/ajaxServlet" ,"action=jQueryGet" ,function (data ) { $("#msg" ).html (" get 编号:" + data.id + " , 姓名:" + data.name ); },"json" ); }); $("#postBtn" ).click (function ( ){ $.post ("http://localhost:8080/16_json_ajax_i18n/ajaxServlet" ,"action=jQueryPost" ,function (data ) { $("#msg" ).html (" post 编号:" + data.id + " , 姓名:" + data.name ); },"json" ); }); 1234567891011121314151617 $.getJSON 方法 url 请求的url地址 data 发送给服务器的数据 callback 成功的回调函数 1234 $("#getJSONBtn" ).click (function ( ){ $.getJSON ("http://localhost:8080/16_json_ajax_i18n/ajaxServlet" ,"action=jQueryGetJSON" ,function (data ) { $("#msg" ).html (" getJSON 编号:" + data.id + " , 姓名:" + data.name ); }); }); 123456
表单序列化 serialize()
serialize()可以把表单中所有表单项的内容都获取到,并以 name=value&name=value 的形式进行拼接。
1 2 3 4 5 6 7 $("#submit" ).click (function ( ){ $.getJSON ("http://localhost:8080/16_json_ajax_i18n/ajaxServlet" ,"action=jQuerySerialize&" + $("#form01" ).serialize (),function (data ) { $("#msg" ).html (" Serialize 编号:" + data.id + " , 姓名:" + data.name ); }); }); 123456
3、i18n国际化 3.1、什么是 i18n 国际化?
国际化(Internationalization)指的是同一个网站可以支持多种不同的语言,以方便不同国家,不同语种的用户访问。
关于国际化我们想到的最简单的方案就是为不同的国家创建不同的网站,比如苹果公司,他的英文官网是:http://www.apple.com 而中国官网是 http://www.apple.com/cn
苹果公司这种方案并不适合全部公司,而我们希望相同的一个网站,而不同人访问的时候可以根据用户所在的区域显示不同的语言文字,而网站的布局样式等不发生改变。
于是就有了我们说的国际化,国际化总的来说就是同一个网站不同国家的人来访问可以显示出不同的语言。但实际上这种需求并不强烈,一般真的有国际化需求的公司,主流采用的依然是苹果公司的那种方案,为不同的国家创建不同的页面。
国际化的英文 Internationalization,但是由于拼写过长,老外想了一个简单的写法叫做 I18N,代表的是 Internationalization这个单词,以 I 开头,以 N 结尾,而中间是 18 个字母,所以简写为 I18N。以后我们说 I18N 和国际化是一个意思。
3.2、国际化相关要素介绍
3.3、国际化资源 properties 测试 配置两个语言的配置文件:
i18n_en_US.properties 英文
1 2 3 4 5 6 7 8 9 10 11 username=username password=password sex=sex age=age regist=regist boy=boy email=email girl=girl reset=reset submit=submit 12345678910
i18n_zh_CN.properties 中文
1 2 3 4 5 6 7 8 9 10 11 username=用户名 password=密码 sex=性别 age=年龄 regist=注册 boy=男 girl=女 email=邮箱 reset=重置 submit=提交 12345678910
国际化测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public class I18nTest { @Test public void testLocale () { System.out.println(Locale.CHINA); System.out.println(Locale.US); } @Test public void testI18n () { Locale locale = Locale.CHINA; ResourceBundle bundle = ResourceBundle.getBundle("i18n" , locale); System.out.println("username:" + bundle.getString("username" )); System.out.println("password:" + bundle.getString("password" )); System.out.println("Sex:" + bundle.getString("sex" )); System.out.println("age:" + bundle.getString("age" )); } } 123456789101112131415161718192021222324252627282930313233
3.4、通过请求头国际化页面 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 <%@ page import ="java.util.Locale" %> <%@ page import ="java.util.ResourceBundle" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html > <head > <meta http-equiv ="pragma" content ="no-cache" /> <meta http-equiv ="cache-control" content ="no-cache" /> <meta http-equiv ="Expires" content ="0" /> <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > Insert title here</title > </head > <body > <% // 从请求头中获取Locale信息(语言) Locale locale = null; String country = request.getParameter("country"); if ("cn".equals(country)) { locale = Locale.CHINA; } else if ("usa".equals(country)) { locale = Locale.US; } else { locale = request.getLocale(); } System.out.println(locale); // 获取读取包(根据 指定的baseName和Locale读取 语言信息) ResourceBundle i18n = ResourceBundle.getBundle("i18n", locale); %> <a href ="i18n.jsp?country=cn" > 中文</a > | <a href ="i18n.jsp?country=usa" > english</a > <center > <h1 > <%=i18n.getString("regist")%></h1 > <table > <form > <tr > <td > <%=i18n.getString("username")%></td > <td > <input name ="username" type ="text" /> </td > </tr > <tr > <td > <%=i18n.getString("password")%></td > <td > <input type ="password" /> </td > </tr > <tr > <td > <%=i18n.getString("sex")%></td > <td > <input type ="radio" /> <%=i18n.getString("boy")%> <input type ="radio" /> <%=i18n.getString("girl")%> </td > </tr > <tr > <td > <%=i18n.getString("email")%></td > <td > <input type ="text" /> </td > </tr > <tr > <td colspan ="2" align ="center" > <input type ="reset" value ="<%=i18n.getString(" reset ")%> " /> <input type ="submit" value ="<%=i18n.getString(" submit ")%> " /></td > </tr > </form > </table > <br /> <br /> <br /> <br /> </center > 国际化测试: <br /> 1、访问页面,通过浏览器设置,请求头信息确定国际化语言。 <br /> 2、通过左上角,手动切换语言 </body > </html > 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
3.5、JSTL 标签库实现国际化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html > <head > <meta http-equiv ="pragma" content ="no-cache" /> <meta http-equiv ="cache-control" content ="no-cache" /> <meta http-equiv ="Expires" content ="0" /> <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > Insert title here</title > </head > <body > <%--1 使用标签设置Locale信息--%> <fmt:setLocale value ="${param.locale}" /> <%--2 使用标签设置baseName--%> <fmt:setBundle basename ="i18n" /> <a href ="i18n_fmt.jsp?locale=zh_CN" > 中文</a > | <a href ="i18n_fmt.jsp?locale=en_US" > english</a > <center > <h1 > <fmt:message key ="regist" /> </h1 > <table > <form > <tr > <td > <fmt:message key ="username" /> </td > <td > <input name ="username" type ="text" /> </td > </tr > <tr > <td > <fmt:message key ="password" /> </td > <td > <input type ="password" /> </td > </tr > <tr > <td > <fmt:message key ="sex" /> </td > <td > <input type ="radio" /> <fmt:message key ="boy" /> <input type ="radio" /> <fmt:message key ="girl" /> </td > </tr > <tr > <td > <fmt:message key ="email" /> </td > <td > <input type ="text" /> </td > </tr > <tr > <td colspan ="2" align ="center" > <input type ="reset" value ="<fmt:message key=" reset " /> " /> <input type ="submit" value ="<fmt:message key=" submit " /> " /></td > </tr > </form > </table > <br /> <br /> <br /> <br /> </center > </body > </html >