JavaWeb--JavaScript
JavaWeb--JavaScript
概念
- 一门客户端脚本语言
- 运行在客户端浏览器中的。每一个浏览器都有JavaScript的解析引擎
- 脚本语言:不需要编译,直接就可以被浏览器解析执行了
功能
- 可以来增强用户和html页面的交互过程,可以来控制html元素,让页面有一些动态的效果,增强用户的体验。
JavaScript发展史
-
1992年,Nombase公司,开发出第一门客户端脚本语言,专门用于表单的校验。命名为 : C-- ,后来更名为:ScriptEase
-
1995年,Netscape(网景)公司,开发了一门客户端脚本语言:LiveScript。后来,请来SUN公司的专家,修改LiveScript,命名为JavaScript
-
1996年,微软抄袭JavaScript开发出JScript语言
-
1997年,ECMA(欧洲计算机制造商协会),制定出客户端脚本语言的标准:ECMAScript,就是统一了所有客户端脚本语言的编码方式。
-
JavaScript = ECMAScript + JavaScript自己特有的东西(BOM+DOM)
JavaScript语法
ECMAScript
-
客户端脚本语言的标准
-
基本语法:
-
与html结合方式
-
内部JS:
- 定义
HTMLDOM
innerHTML
-
HTML DOM
-
标签体的设置和获取:innerHTML
-
使用html元素对象的属性
-
<div id="div1"> div </div> <script> var div = document.getElementById("div1"); //替换标签中的元素 div.innerHTML = "<input type = text>" //在标签中追加元素 div.innerHTML += "<input type = text>" </script>
-
控制元素样式
-
使用元素的style属性来设置
如:
//修改样式方式1
div1.style.border = "1px solid red";
div1.style.width = "200px";
//font-size--> fontSize
div1.style.fontSize = "20px"; -
提前定义好类选择器的样式,通过元素的className属性来设置其class属性值。
.d1{
border: 1px solid red;
width: 100px;
height: 200px;
}div2.className = "d1"
-
通过这种方式可以和用户形成样式更改动态的互动,相反css则是静态样式
-
-
XML
概念
-
Extensible Markup Language 可扩展标记语言
-
可扩展:标签都是自定义的。 < user> < student>
功能
-
存储数据
- 配置文件
- 在网络中传输
-
xml与html的区别
- xml标签都是自定义的,html标签是预定义。
- xml的语法严格,html语法松散
- xml是存储数据的,html是展示数据
-
w3c:万维网联盟
语法
-
基本语法:
-
xml文档的后缀名 .xml
-
xml第一行必须定义为文档声明
-
xml文档中有且仅有一个根标签
-
属性值必须使用引号(单双都可)引起来
-
标签必须正确关闭
-
xml标签名称区分大小写
-
-
例子:
<?xml version="1.0"?> <users> <user id='1'> <name>zhangsan</name> <age>18</age> <gender>man</gender> </user> <user id='2'> <name>lisi</name> <age>19</age> <gender>female</gender> </user> </users>
组成部分
-
文档声明
-
格式:< ?xml 属性列表 ?> (问号与<>不能有空格)
-
属性列表:
- version:版本号,必须的属性
- encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
- standalone:是否独立
- 取值:
- yes:不依赖其他文件
- no:依赖其他文件
- 取值:
-
指令(了解):结合css的
- < ?xml-stylesheet type="text/css" href="a.css" ?>
-
标签:标签名称自定义的
- 规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者 XML、Xml 等等)开始
- 名称不能包含空格
- 规则:
-
属性:
- id属性值唯一
-
文本:
- CDATA区:在该区域中的数据会被原样展示
- 格式: < ![CDATA[ 数据 ]]>
- CDATA区:在该区域中的数据会被原样展示
-
约束
-
约束:规定xml文档的书写规则
-
作为框架的使用者(程序员):
- 能够在xml中引入约束文档
- 能够简单的读懂约束文档
-
分类:
- DTD:一种简单的约束技术
- Schema:一种复杂的约束技术
-
DTD:
* 引入dtd文档到xml文档中 * 内部dtd:将约束规则定义在xml文档中 * 外部dtd:将约束的规则定义在外部的dtd文件中 * 本地:< !DOCTYPE 根标签名 SYSTEM "dtd文件的位置"> * 网络:< !DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
-
Schema:
-
引入:
-
在schema中, 每个约束模式文档都可以被赋予一个唯一的使用URI标识的名称空间, Xml文件引schema约束的时候, 便是通过这个名称空间来声明来自哪个shema约束文档的.在xsd文档中, 至少要包括shema根元素和xml模式命名空间的定义, 元素定义等
在schema中声明schema根元素:
-
根元素包括模式的约束, xml模式空间命名的定义, 其他命名空间的定义, 版本信息, 语言信息和其他的信息.
xmlns=URI: 使用默认的名称空间
targetNamespace=:URI: 指定schema文档中声明的元素属于哪个命名空间
xmlns:xsd=URI: 使用名称空间引入多个xml shema文档
elementFormaDefault= " ": 指定shema文档中声明的跟元素和所有子元素都属于targetnamespace锁指定的名称空间
-
填写xml文档的根元素
-
引入xsi前缀. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
引入xsd文件命名空间. xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
-
为每一个xsd约束声明一个前缀,作为标识 xmlns="http://www.itcast.cn/xml"
< students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itcast.cn/xml"
xsi:schemaLocation="http://www.itcast.cn/xml student.xsd">
-
-
解析
-
解析:操作xml文档,将文档中的数据读取到内存中
- 操作xml文档
- 解析(读取):将文档中的数据读取到内存中
- 写入:将内存中的数据保存到xml文档中。持久化的存储
- 解析xml的方式:
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
- 优点:操作方便,可以对文档进行CRUD的所有操作
- 缺点:占内存
- SAX:逐行读取,基于事件驱动的。
- 优点:不占内存。
- 缺点:只能读取,不能增删改
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
- 操作xml文档
常见的解析器
- JAXP:sun公司提供的解析器,支持dom和sax两种思想
- DOM4J:一款非常优秀的解析器
- Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据
- PULL:Android操作系统内置的解析器,sax方式的
Jsoup解析器
-
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
-
快速入门:
-
步骤:
- 导入jar包
- 获取Document对象
- 获取对应的标签Element对象
- 获取数据
-
代码:
-
public static void main(String[] args) throws IOException, URISyntaxException { //获取Document对象,根据xml文档获取 //获取student.xml的path,如果路径有中文或空格,改成.toURI().getPath() String path = JsoupDemo01.class.getClassLoader().getResource("student.xml").toURI().getPath(); //解析xml文档,加载文档进内存,获取dom树------>Document Document document = Jsoup.parse(new File(path),"utf-8"); //获取元素对象 Element Elements elements = document.getElementsByTag("name"); //返回name标签对象的个数 System.out.println(elements.size()); //获取第一个name标签的文本输出在控制台 Element element = elements.get(0); String text = element.text(); System.out.println(text); }
对象的使用
-
Jsoup:工具类,可以解析html或xml文档,返回Document
- parse:解析html或xml文档,返回Document
- parse(File in, String charsetName):解析xml或html文件的。
- parse(String html):解析xml或html字符串
- parse(URL url, int timeoutMillis):通过网络路径获取指定的html或xml的文档对象
- parse:解析html或xml文档,返回Document
-
Document:文档对象。代表内存中的dom树
- 获取Element对象
- getElementById(String id):根据id属性值获取唯一的element对象
- getElementsByTag(String tagName):根据标签名称获取元素对象集合
- getElementsByAttribute(String key):根据属性名称获取元素对象集合
- getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
- 获取Element对象
-
Elements:元素Element对象的集合。可以当做 ArrayList< Element>来使用
-
Element:元素对象
-
获取子元素对象
- getElementById(String id):根据id属性值获取唯一的element对象
- getElementsByTag(String tagName):根据标签名称获取元素对象集合
- getElementsByAttribute(String key):根据属性名称获取元素对象集合
- getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
-
获取属性值
- String attr(String key):根据属性名称获取属性值
-
获取文本内容
- String text():获取文本内容
- String html():获取标签体的所有内容(包括子标签的字符串内容
-
-
Node:节点对象
- 是Document和Element的父类
-
快捷查询方式:
-
selector:选择器
-
使用的方法:Elements select(String cssQuery)
-
语法:参考Selector类中定义的语法
-
Elements select1 = document.select("student[number=\"heima_0001\"]"); System.out.println(select1);
-
-
-
XPath:XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言
- 使用Jsoup的Xpath需要额外导入jar包。
- 查询w3cshool参考手册,使用xpath的语法完成查询
- 代码:
//1.获取student.xml的path
String path = JsoupDemo6.class.getClassLoader().getResource("student.xml").getPath();
//2.获取Document对象
Document document = Jsoup.parse(new File(path), "utf-8");
-
JavaScript--事件,监听机制
概念
- 某些组件被执行了某些操作后,触发某些代码的执行。
- 事件:某些操作。如: 单击,双击,键盘按下了,鼠标移动了
- 事件源:组件。如: 按钮 文本输入框...
- 监听器:代码。
- 注册监听:将事件,事件源,监听器结合在一起。 当事件源上发生了某个事件,则触发执行某个监听器代码
常见的事件
-
点击事件:
- onclick:单击事件
- ondblclick:双击事件
-
焦点事件
- onblur:失去焦点
- onfocus:元素获得焦点。
-
加载事件:
- onload:一张页面或一幅图像完成加载。
-
鼠标事件:
- onmousedown 鼠标按钮被按下。
- 定义方法时,定义一个形参接收event对象
- event对象的button属性可以获取鼠标按钮键被点击了
- 0,1,2依次为左键,中建,右键
- onmouseup 鼠标按键被松开。
- onmousemove 鼠标被移动。
- onmouseover 鼠标移到某元素之上。
- onmouseout 鼠标从某元素移开
- onmousedown 鼠标按钮被按下。
-
键盘事件:
- onkeydown 某个键盘按键被按下。
- onkeyup 某个键盘按键被松开。
- onkeypress 某个键盘按键被按下并松开
-
选择和改变
- onchange 域的内容被改变。
- onselect 文本被选中。
-
表单事件:
- onsubmit 确认按钮被点击。
- 方法返回true或者不返回,就会被提交表单,为false则阻止提交
- onreset 重置按钮被点击
- onsubmit 确认按钮被点击。
案例:表格全选
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>表格全选</title> <style> table{ border: 1px solid; width: 500px; margin-left: 30%; } td,th{ text-align: center; border: 1px solid; } div{ margin-top: 10px; margin-left: 30%; } .over{ background-color: pink; } .out{ background-color: white; } </style> <script> window.onload = function(){ document.getElementById("selectAll").onclick = function () { var cbs = document.getElementsByName("cb"); for (let i = 0; i < cbs.length; i++) { cbs[i].checked = true; } } document.getElementById("unSelectAll").onclick = function(){ var cbs = document.getElementsByName("cb"); for (var i = 0; i < cbs.length; i++) { cbs[i].checked = false; } } document.getElementById("selectRev").onclick = function(){ var cbs = document.getElementsByName("cb"); for (var i = 0; i < cbs.length; i++) { cbs[i].checked = !cbs[i].checked } } document.getElementById("firstcb").onclick = function(){ var cbs = document.getElementsByName("cb"); var firstcb = document.getElementById("firstcb"); for (var i = 0; i < cbs.length; i++) { cbs[i].checked = firstcb.checked; } } var trs = document.getElementsByTagName("tr"); for (var i = 0; i < trs.length; i++) { trs[i].onmouseover = function(){ this.className = "over" } trs[i].onmouseout = function(){ this.className = "out" } } } </script> </head> <body> <table> <caption>学生信息表</caption> <tr> <th><input type="checkbox" name="cb" id="firstcb"></th> <th>编号</th> <th>姓名</th> <th>性别</th> <th>操作</th> </tr> <tr> <td><input type="checkbox" name="cb"></td> <td>1</td> <td>令狐冲</td> <td>男</td> <td><a href="javascript:void(0);">删除</a></td> </tr> <tr> <td><input type="checkbox" name="cb"></td> <td>2</td> <td>任我行</td> <td>男</td> <td><a href="javascript:void(0);">删除</a></td> </tr> <tr> <td><input type="checkbox" name="cb"></td> <td>3</td> <td>岳不群</td> <td>?</td> <td><a href="javascript:void(0);">删除</a></td> </tr> </table> <div> <input type="button" id="selectAll" value="全选"> <input type="button" id="unSelectAll" value="全不选"> <input type="button" id="selectRev" value="反选"> </div> </body> </html>
案例:表单检验
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册页面</title> <style> *{ margin: 0px; padding: 0px; box-sizing: border-box; } body{ background: url("img/register_bg.png") no-repeat center; padding-top: 25px; } .rg_layout{ width: 900px; height: 500px; border: 8px solid #EEEEEE; background-color: white; /*让div水平居中*/ margin: auto; } .rg_left{ /*border: 1px solid red;*/ float: left; margin: 15px; } .rg_left > p:first-child{ color:#FFD026; font-size: 20px; } .rg_left > p:last-child{ color:#A6A6A6; font-size: 20px; } .rg_center{ float: left; /* border: 1px solid red;*/ } .rg_right{ /*border: 1px solid red;*/ float: right; margin: 15px; } .rg_right > p:first-child{ font-size: 15px; } .rg_right p a { color:pink; } .td_left{ width: 100px; text-align: right; height: 45px; } .td_right{ padding-left: 50px ; } #username,#password,#email,#name,#tel,#birthday,#checkcode{ width: 251px; height: 32px; border: 1px solid #A6A6A6 ; /*设置边框圆角*/ border-radius: 5px; padding-left: 10px; } #checkcode{ width: 110px; } #img_check{ height: 32px; vertical-align: middle; } #btn_sub{ width: 150px; height: 40px; background-color: #FFD026; border: 1px solid #FFD026 ; } .error{ color: red; } </style> <script> window.onload = function () { //表单绑定总onsubmit事件,同时内置监听器监听所有表单各项的返回值判断 document.getElementById("form").onsubmit = function () { //调用所有表单各项的判断校验方法 return checkUsername() && checkPassword(); } //给用户名和密码绑定离焦事件 //加括号就是代码执行到此处直接执行该方法,不带括号是赋值 document.getElementById("username").onblur = checkUsername; document.getElementById("password").onblur = checkPassword; function checkUsername() { var reg = /^\w{6,12}$/; var username = document.getElementById("username").value; var flag = reg.test(username); var s_username = document.getElementById("s_username"); if (flag){ //提示对勾 s_username.innerHTML = "<img src='img/gou.png' width='20px' height='20x'>"; }else{ //提示红色的用户名有误 s_username.innerHTML = "用户名不符合规格"; } return flag; } function checkPassword() { var reg = /^\w{6,12}$/; var password = document.getElementById("password").value; var flag = reg.test(password); var s_password = document.getElementById("s_password"); if (flag){ //提示对勾 s_password.innerHTML = "<img src='img/gou.png' width='20px' height='20x'>"; }else{ //提示红色的用户名有误 s_password.innerHTML = "密码不符合规格"; } return flag; } } </script> </head> <body> <div class="rg_layout"> <div class="rg_left"> <p>新用户注册</p> <p>USER REGISTER</p> </div> <div class="rg_center"> <div class="rg_form"> <!--定义表单 form--> <form action="#" method="get" id="form"> <table> <tr> <td class="td_left"><label for="username">用户名</label></td> <td class="td_right"> <input type="text" name="username" id="username" placeholder="请输入用户名"> <span id="s_username" class="error"></span> </td> </tr> <tr> <td class="td_left"><label for="password">密码</label></td> <td class="td_right"> <input type="password" name="password" id="password" placeholder="请输入密码"> <span id="s_password" class="error"></span> </td> </tr> <tr> <td class="td_left"><label for="email">Email</label></td> <td class="td_right"><input type="email" name="email" id="email" placeholder="请输入邮箱"></td> </tr> <tr> <td class="td_left"><label for="name">姓名</label></td> <td class="td_right"><input type="text" name="name" id="name" placeholder="请输入姓名"></td> </tr> <tr> <td class="td_left"><label for="tel">手机号</label></td> <td class="td_right"><input type="text" name="tel" id="tel" placeholder="请输入手机号"></td> </tr> <tr> <td class="td_left"><label>性别</label></td> <td class="td_right"> <input type="radio" name="gender" value="male"> 男 <input type="radio" name="gender" value="female"> 女 </td> </tr> <tr> <td class="td_left"><label for="birthday">出生日期</label></td> <td class="td_right"><input type="date" name="birthday" id="birthday" placeholder="请输入出生日期"></td> </tr> <tr> <td class="td_left"><label for="checkcode" >验证码</label></td> <td class="td_right"><input type="text" name="checkcode" id="checkcode" placeholder="请输入验证码"> <img id="img_check" src="img/verify_code.jpg"> </td> </tr> <tr> <td colspan="2" align="center" ><input type="submit" id="btn_sub" value="注册"></td> </tr> </table> </form> </div> </div> <div class="rg_right"> <p>已有账号?<a href="#">立即登录</a></p> </div> </div> </body> </html>
Bootstrap
概念
-
Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML、CSS、JavaScript 开发的简洁、直观、强悍的前端开发框架,使得 Web 开发更加快捷
-
一个前端开发的框架
- 框架:一个半成品软件,开发人员可以在框架基础上再进行开发,简化编码
- 好处:
- 定义了很多的css样式和js插件,我们开发人员可以直接使用这些样式和插件得到丰富的页面效果
- 响应式布局
- 同一套页面可以兼容不同分辨率的设备
快速入门
- 下载Bootstrap
- 在项目中将这三个文件夹复制
- 创建html页面,引入必要的资源文件
响应式布局
-
同一套页面可以兼容不同分辨率的设备。
-
实现:依赖于栅格系统:将一行平均分成12个格子,可以指定元素占几个格子
-
步骤:
- 定义容器。相当于之前的table、
- 容器分类:
- container:两边留白
- container-fluid:每一种设备都是100%宽度
- 容器分类:
- 定义行。相当于之前的tr 样式:row
- 定义元素。指定该元素在不同的设备上,所占的格子数目。样式:col-设备代号-格子数目
- 设备代号:
- xs:超小屏幕 手机 (<768px):col-xs-12
- sm:小屏幕 平板 (≥768px)
- md:中等屏幕 桌面显示器 (≥992px)
- lg:大屏幕 大桌面显示器 (≥1200px)
- 设备代号:
- 注意:
- 一行中如果格子数目超过12,则超出部分自动换行。
- 栅格类属性可以向上兼容。栅格类适用于与屏幕宽度大于或等于分界点大小的设备。
- 如果真实设备宽度小于了设置栅格类属性的设备代码的最小值,会一个元素沾满一整行。
- 定义容器。相当于之前的table、
CSS样式和JS插件
- 全局CSS样式:
- 按钮:class="btn btn-default"
- 图片:
- class="img-responsive":图片在任意尺寸都占100%
- 图片形状
- < img src="..." alt="..." class="img-rounded">:方形
- < img src="..." alt="..." class="img-circle"> : 圆形
- < img src="..." alt="..." class="img-thumbnail"> :相框
- 表格
- table
- table-bordered
- table-hover
- 表单
- 给表单项添加:class="form-control"
-
组件:
- 导航条
- 分页条
-
插件:
- 轮播图
-
data-toggle:触发事件的类型,如 modal,popover,tooltips 等
data-target :事件的作用对象 。
-
- 定义
-
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了