JavaWeb学习笔记

课程链接:尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版

参考博客:W3school

HTML和CSS-BS软件的结构

JavaSE:C/S——Client / Server

JavaEE:B/S——Browser / Server

Java项目开发流程

graph LR
A(("美术实现"))==>B(("前端工程师"))==>C(("Java程序员"));
A-->A1("网页设计师根据需求设计网页");
B-->B1("前端工程师将设计做成静态网页");
C-->C1("后端工程师将静态网页修改为动态网页");

前端学习内容结构

graph LR
A["HTML"]
B["CSS"]--美化-->A
C["JavaScript"]--交互-->A
D["JQuery"]--开发框架-->C

网页的组成部分

页面由三部分组成:内容(结构)、表现、行为

内容:是我们在网页中可以看到了的数据。一般使用html技术来呈现。

表现:指内容在页面上的展示形式,比如说布局、颜色、大小等等。一般使用css技术实现。

行为:指的是页面中元素与输入设备交互的响应。一般使用javascript技术实现。

HTML简介

Hyper Text Markup Language(超文本标记语言)
HTML通过标签来标记要显示的网页中的各个部分。网页文件本身是一种文本文件,通过在文本文件中添加标记,可以告诉浏览器如何显示其中的内容(如:文字如何处理,画面如何安排,图片如何显示等)

创建HTML页面

IDEA->File->New->Project…->New Project->Language: JavaScript

或者IDEA->File->New->Project…->New Project->Language: Java->删掉src文件夹

项目文件夹鼠标右键New->HTML File

HTML书写规范

  • 简单示例
1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>               <!--约束,声明-->
<html lang="zh_CN"> <!--html标签表示html的开始--><!--lang="zh_CN"表示中文-->
<head> <!-- 表示头部信息,一般包含三部分内容,title标签,css样式,js代码 -->
<meta charset="UTF-8"> <!--表示当前页面UTF-8字符集-->
<title>Title</title> <!--表示标题,标签页上显示的文字-->
</head>
<body> <!--body标签是整个html页面显示的主题内容-->
Hello,HTML
</body>
</html>
  • 书写规范
1
2
3
4
5
6
7
8
9
10
11
12
13
<html>                 <!--表示整个html页面的开始-->

<head>
<title>
标题
</title>
</head>

<body>
内容
</body>

</html> <!--表示整个html页面的结束-->

HTML标签

  • 标签格式

    1
    <标签名>...</标签名>
  • 标签对大小写不敏感

    1
    <body>...</Body>
  • 标签拥有自己的属性

    • 基本属性——设置简单的样式效果
    1
    2
    <!--背景颜色-->
    <body bgcolor="green">...</body>
    • 事件属性——设置事件响应后的代码
    1
    2
    3
    <!--弹窗提醒-->
    <body onclick="alert('你好')">...</body>
    <!--需要点击...附近才会弹窗-->
  • 标签分为单标签和双标签

    • 双标签
    1
    2
    <!--段落标签-->
    <p>...</p>
    • 单标签
    1
    2
    3
    4
    5
    6
    <!--换行标签-->
    <br/>
    <!--水平线标签-->
    <hr/>
    <!--图片标签-->
    <img src=".jpg"/>

HTML语法

  • 标签可以嵌套,但不能交叉嵌套
1
2
3
<!--标签可以嵌套,不能交叉嵌套-->
正确:<div><span>Hello!</span></div>
错误:<div><span>Hello!</div></span>
  • 标签必须正确地关闭
1
2
3
4
5
6
7
<!--双标签-->
正确:<div>Hello!</div>
错误:<div>Hello!

<!--单标签-->
正确:<br />
错误:<br >
  • 属性必修有值,属性值必须加引号
1
2
3
正确:<font color="blue">...</font>
错误:<font color>...</font> <!--属性值为空-->
错误:<font color=blue>...</font> <!--属性值未加引号-->
  • 注释不能嵌套
1
2
正确:<!--注释内容-->
错误:<!--注释内容 <!--注释内容--> -->

常用标签

HTML 标签参考手册

font标签

font 标签是字体标签,它可以用来修改文本的字体,颜色,大小(字号)
color 属性修改颜色
face 属性修改字体
size 属性修改字号

1
<font color="pink" face="宋体" size="6">一枚小屁孩</font>

一枚小屁孩

特殊字符

1
2
3
<    &lt;    (less than)
> &gt; (great than)
空格 &nbsp; (non-breaking space)

标题标签

h1-h6都是标题标签,没有h7

h1最大,h6最小

1
2
3
4
5
6
<h1>标题1</h1>
<h2>标题2</h2>
<h3>标题3</h3>
<h4>标题4</h4>
<h5>标题5</h5>
<h6>标题6</h6>

标题1

标题2

标题3

标题4

标题5
标题6

超链接标签

1
2
3
4
5
6
7
8
9
<!-- a标签
href属性设置链接的地址(Hypertext Reference)
target属性设置跳转方式
_self 表示当前页面跳转(默认值)
_blank 表示新标签页跳转
-->
<a href="https://baidu.com">百度一下</a>
<a href="https://baidu.com" target="_self">百度一下 (当前页面跳转)</a>
<a href="https://baidu.com" target="_blank">百度一下 (新标签页跳转)</a>

百度一下
百度一下 (当前页面跳转)
百度一下 (新标签页跳转)

无序列表

1
2
3
4
5
6
7
8
<!--无序列表 unordered list-->
<!--ul 无序列表-->
<!--li 是列表项-->
<ul>
<li>第一点</li>
<li>第二点</li>
<li>第三点</li>
</ul>
  • 第一点
  • 第二点
  • 第三点
1
2
3
4
5
6
7
8
<!--type属性可以设置列表项前无符号
none 表示无符号
-->
<ul type="none">
<li>第一点</li>
<li>第二点</li>
<li>第三点</li>
</ul>
  • 第一点
  • 第二点
  • 第三点
1
2
3
4
5
6
7
8
9
10
11
12
13
<!--style属性可以设置列表项前符号的样式-->

<ul style="list-style-type:circle">
<li>Circle</li>
</ul>

<ul style="list-style-type:disc">
<li>Disc</li>
</ul>

<ul style="list-style-type:square">
<li>Square</li>
</ul>
  • Circle
  • Disc
  • Square

有序列表

1
2
3
4
5
6
<!--有序列表 ordered list-->
<ol>
<li>第一点</li>
<li>第二点</li>
<li>第三点</li>
</ol>
  1. 第一点
  2. 第二点
  3. 第三点

img标签

1
2
3
4
5
6
7
8
<!--
img标签是图片标签,用来显示图片
src属性可以设置图片的路径
width属性设置图片的宽度
height属性设置图片的高度
border属性设置图片的边框大小
alt属性设置指定路径图片找不到时,用来代替显示的文字
-->

Note: 在JavaSE中路径也分为相对路径和绝对路径

  • 相对路径:从工程目录开始算,相对工程目录的路径

    • . 表示当前目录
    • .. 表示上一级目录
    • ./文件名 当前路径下的文件, 其中 ./ 可以省略
  • 绝对路径:从根目录开始算的路径

    • 正确格式是:http://ip:port/工程名/资源文件路径
    • 错误格式是:盘符:/目录/文件名

演示插入图片

1
<img src=".../img/picture.jpg" width="200" height="300" border="1" alt="alt文本">

表格

  • 基本元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!--
table是表格标签
tr是行标签 table row
th是表头标签 table headline
td是单元格标签 table datacell
-->
<table>
<tr>
<th>表头是加粗文本</th>
<th>表头是加粗文本</th>
</tr>
<tr>
<td>数据单元</td>
<td>数据单元</td>
</tr>
</table>
表头是加粗文本 表头是加粗文本
数据单元 数据单元
  • 设置边框、宽度和高度
1
2
3
4
5
6
7
8
9
10
11
<!--
table是表格标签
border属性 设置边框
width属性 设置表格的宽度
height属性 设置表格的高度
align属性 设置表格相对页面的左中右对齐
cellspacing属性 设置单元格间距
-->
<table border="2" width="250" height="250" align="center" cellspacing="0">
...省略...
</table>
A B
C D
  • 设置对齐方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!--
th是表头标签
td是单元格标签
align属性可以设置数据在单元格中的对齐方式
-->
<table>
<tr>
<td>默认</td>
<td align="center">居中对齐</td>
</tr>
<tr>
<td align="left">左对齐</td>
<td align="right">右对齐</td>
</tr>
</table>
默认 居中对齐
左对齐 右对齐
  • 加粗和斜体
1
2
3
4
5
6
<!--
加粗标签<b>...</b>
斜体标签<i>...</i>
-->
<td><b>加粗文本</b></td>
<td><i>斜体文本</i></td>
加粗文本 斜体文本

表格跨行跨列

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
<!--
th是表头标签
td是单元格标签
colspan属性设置单元格的跨列
rowspan属性设置单元格的跨行
-->
<table width="250" height="250">
<!--第一行-->
<tr>
<td colspan="4">跨四列</td>
</tr>
<!--第二行-->
<tr>
<td rowspan="3">跨三行</td>
<td rowspan="2" colspan="2">跨两行两列</td>
<td>C4</td>
</tr>
<!--第三行-->
<tr>
<td>C4</td>
</tr>
<!--第四行-->
<tr>
<td>A2</td>
<td>B3</td>
<td>C4</td>
</tr>
</table>
跨四列
跨三行 跨两行两列 C4
C4
A2 B3 C4

内嵌窗口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!--
iframe标签可以在页面上开辟一个小区域显示一个单独的页面
src属性 设置url链接
width属性 设置iframe宽度
height属性 设置iframe高度
name属性 设置iframe的名称
framborder属性 设置是否显示iframe周围的边框
scrolling属性 设置是否在iframe中显示滚动条。
framespacing属性 设置
-->

<!--哔哩哔哩本节课的嵌入代码-->
<iframe
src="//player.bilibili.com/player.html?aid=91909529&bvid=BV1Y7411K7zz&cid=156795571&page=18"
scrolling="no"
border="0"
frameborder="no"
framespacing="0"
allowfullscreen="true">
</iframe>

超链接和内嵌窗口组合使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--为iframe添加name属性用于标识-->
<iframe width="300" height="300" name="Search"></iframe>
<br/>
<ul>
<li>
<a href="https://onexiaophai.gitee.io/"
target="Search"> <!--target属性设置跳转目标-->
Xiaophai
</a>
</li>
<li>
<a href="https://butterfly.js.org/"
target="Search"> <!--target属性设置跳转目标-->
Butterfly
</a>
</li>
</ul>
  • 演示

iframe_hyperlink

表单标签

  • form 标签就是表单

    • type 属性可以设置输入框的类型
      • text 文本输入框
      • password 密码输入框
      • radio 单选框
      • checkbox 复选框
  • name 属性可以对选项框进行分组, name 属性值相同的归为一组

    • 单选框同一组内只能选中一项, 多选框可以选择多个
  • checked=“checked” 表示默认为 “checked” (选中)

    • 注意单选框只能设置一个 checked=“checked”,复选框可以设置多个
  • value 属性可以设置默认值, 默认用户名和默认密码之类

Note: Radio Button 单选按钮, CheckBox 多选框

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
<form>
<!--text 文本输入框-->
<!--value属性可以设置默认值-->
用户名称: <input type="text" value="用户名"/><br/>

<!--password 密码输入框-->
<!--value属性可以设置默认值-->
用户密码: <input type="password" value="123456"/><br/>
确认密码: <input type="password" value="123456"/><br/>

<!--radio 单选框-->
<!--checked="checked"表示默认选中-->
<!--单选框只能设置一个默认选中-->
性别:
<input type="radio" name="sex" checked="checked"/>
<input type="radio" name="sex"/>
<br/>

<!--checkbox 复选框-->
<!--checked="checked"表示默认选中-->
<!--复选框可以设置多个默认选中-->
兴趣爱好:
<input type="checkbox" checked="checked"/>Java
<input type="checkbox" checked="checked">Python
<input type="checkbox"/>C++
<br/>

<!--select 下拉列表框-->
<!--selected="selected"设置默认选项-->
国籍:
<select>
<option>--请选择国籍--</option>
<option selected="selected">中国</option>
<option>美国</option>
<option>俄国</option>
<option>英国</option>
<option>法国</option>
</select>
<br/>

<!--textarea 多行输入框-->
<!-- rows属性设置显示几行-->
<!-- cols属性设置显示几列-->
自我评价: <br/>
<textarea rows="10" cols="20">默认值写在这里</textarea>
<br/>

<!--reset 重置按钮-->
<!--全部内容重置回默认值-->
<!--value属性修改按钮上的文本-->
<input type="reset" value="重置默认"/>

<!--submit 提交按钮-->
<!--value属性修改按钮上的文本-->
<input type="submit" value="提交信息"/>

<!--button 按钮-->
<!--value属性修改按钮上的文本-->
<input type="button" value="按钮">
<br/>

<!--file 文件上传域-->
<input type="file"/>

<!--hidden 隐藏域-->
<!--隐藏域是给程序使用的,不是面向用户的-->
<!--当需要向服务器发送某些信息,而这些信息不需要用户参与,就可以使用隐藏域(隐藏的信息提交的时候会发送给服务器)-->
<!--例如提交注册用户的id号,id号由程序生成,不需要用户填写-->
<input type="hidden" name="id_num" value="0001">
</form>

演示

用户名称:
用户密码:
确认密码:
性别:
兴趣爱好: Java Python C++
国籍:
自我评价:


表单格式化

表单一般会放在表格中,这样会方便统一格式

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
<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="123456"/></td>
</tr>
<tr>
<td>确认密码:</td>
<td><input type="password" value="123456"/></td>
</tr>
<tr>
<td>性别: </td>
<td>
<input type="radio" name="sex" checked="checked"/>
<input type="radio" name="sex"/>
</td>
</tr>
<tr>
<td>兴趣爱好:</td>
<td>
<input type="checkbox" checked="checked"/>Java
<input type="checkbox" checked="checked">Python
<input type="checkbox"/>C++
</td>
</tr>
<tr>
<td>国籍:</td>
<td>
<select>
<option>--请选择国籍--</option>
<option selected="selected">中国</option>
<option>美国</option>
<option>俄国</option>
<option>英国</option>
<option>法国</option>
</select>
</td>
</tr>
<tr>
<td>自我评价:</td>
<td><textarea rows="3" cols="20">默认值写在这里</textarea></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="提交信息"/></td>
</tr>
</table>
</form>

账号注册

用户名称:
用户密码:
确认密码:
性别:
兴趣爱好: Java Python C++
国籍:
自我评价:

表单的提交

  • form 标签是表单标签
    • action 属性用于设置提交的服务器地址
    • method 属性用于设置提交的方式为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
<form action="http://localhost:8080/" method="get">
<!--标题-->
<h1 align="center">账号注册</h1>
<!--表格-->
<table align="center">
<tr>
<!--文本输入框-->
<td>用户名称:</td>
<td><input type="text"/></td>
</tr>
<tr>
<!--密码输入框-->
<td>用户密码:</td>
<td><input type="password"/></td>
</tr>
<tr>
<!--单选框-->
<td>性别: </td>
<td>
<input type="radio" name="sex"/>
<input type="radio" name="sex"/>
</td>
</tr>
<tr>
<!--隐藏域-->
<td>
<input type="hidden" name="id_num" value="0001">
</td>
</tr>
<tr>
<!--提交框-->
<td colspan="2" align="center">
<input type="submit" value="提交"/>
</td>
</tr>
</table>
</form>

账号注册

用户名称:
用户密码:
性别:
  • 填写表单点击提交后自动跳转到指定的服务器地址,其中地址栏的信息如下

    1
    http://localhost:8080/?sex=on&id_num=0001

    这个地址栏的信息要分三个部分来看

    1
    2
    3
    http://localhost:8080/  <!--服务器地址-->
    ? <!--分隔符-->
    sex=on&id_num=0001 <!--请求参数(表单信息)-->
  • 但是其中请求参数中只显示了表单信息中的单选框和隐藏域的信息, 其它项的信息并没有被正确提交

    这是因为在表单中只有单选框和隐藏域设置了 name 属性值,即name=sexname=id_num; 而其它项没有设置 name 属性值, 所以没有被正确提交

    1
    2
    3
    sex=on        <!--单选框提交信息-->
    & <!--连接符-->
    id_num=0001 <!--隐藏域提交信息-->

    给表单其它项添加 name 属性值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!--
    给表单项设置name属性值
    -->
    <!--文本输入框-->
    <input type="text" name="username"/>
    <!--密码输入框-->
    <input type="password" name="password"/>
    <!--单选框-->
    <input type="radio" name="sex"/>
    <input type="radio" name="sex"/>
    <!--隐藏域-->
    <input type="hidden" name="id_num" value="0001">
    <!--提交框-->
    <input type="submit" value="提交"/>

    此时提交得到的地址栏信息中已经包含了表单中的全部提交信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    http://localhost:8080/
    ?
    username=xiaophai
    &
    password=123456
    &
    sex=on
    &
    id_num=0001
  • 但是但选项性别对应的值为sex=on,表示sex框被勾选上,但这并不能直观地分辨出性别

    通过给但选项添加 value 属性可以解决这个问题

    1
    2
    <input type="radio" name="sex" value="male"/>
    <input type="radio" name="sex" value="female"/>

    修改后提交显示

    1
    http://localhost:8080/?username=xiaophai&password=123456&sex=male&id_num=0001
  • 表单提交时,数据没有正确发送给服务器的三种情况

    • 表单项没有name属性值
    • 单选、复选项没有添加value属性值,参数中以on表示选中
    • 表单项不在调教的form标签中
  • get和post提交方式的区别

    • get请求的特点

      1. 浏览器地址栏中的地址是:action属性值[+?+请求参数]

        请求参数的格式是:…name=value&name=value…

      2. 不安全:提交的信息(包括密码)全部显示在了地址栏中

      3. 它有数据长度的限制:表单值(包含非ASCII码字符)的长度不能超过100个字符(不同的浏览器的限制长度不同)

    • post请求的特点

      1. 浏览器地址栏只有action属性值
      2. 相对get请求要安全
      3. 理论上没有数据长度的限制

文本标签

  • div标签、p标签、span标签
1
2
3
4
5
6
7
8
9
10
11
12
<!--div(division分隔)标签默认独占一行-->
<div>div第一行</div>
<div>div第二行</div>

<!--p(paragraph段落)是段落标签,默认会在段落的上方和下方各空出一行(段落间空一行)-->
<p>p第一段</p>
<p>p第二段</p>

<!--span(span范围)标签的长度是封装数据的长度,其本身并没有意义,需要和css组合使用-->
<!--在下一章CSS中可以见到它的一些使用-->
<span>span第一行</span>
<span>span第二行</span>

CSS

CSS教程 | w3school

层叠样式表(Cascading Style Sheets,CSS),用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言

CSS语法规则

1
2
3
4
5
6
7
8
9
10
11
12
p{
color:red;
font-size:30px;
}
/*
p 选择器
font-size 属性名
80px 属性值
; 分隔符
color 属性名
30px 属性值
*/
  • 选择器:浏览器根据选择器决定受 CSS 样式影响的 HTML 元素(标签)

  • 属性:你要改变的样式名,并且每个属性都有一个值。属性和值被冒号 : 分开,并且由花括号 {} 包围,这样就组成了一个完整的样式声明(declaration)
    例如:

    1
    p{color:blue}
  • 多个声明:如果要定义的声明不止一个,则需要用分号 ; 将每个声明分开。最后一个声明可以不加分号,但建议加上。
    例如:

    1
    2
    3
    4
    p{
    color:red;
    font-size:30px;
    }

自定义css样式的三种方式

示例目标

  • 分别定义两个div、span标签;
  • 分别修改每个div标签的样式为:边框1个像素,实线,红色.

1.直接在标签上通过style属性自定义css样式

直接在标签的style属性上设置, 格式为key:value value;, 修改标签样式

border属性详解:border | w3school

  • div 标签

    1
    2
    <div style="border: 1px solid red;">div标签1</div>
    <div style="border: 1px solid red;">div标签2</div>
    div标签1
    div标签2
  • span 标签

    1
    2
    <span style="border: 1px solid red;">span标签1</span>
    <span style="border: 1px solid red;">span标签2</span>

    span标签1
    span标签2span标签2

    Note: 这里可以看到 span 标签根据 <span>...</span> 中封装的内容改变长度

  • 这种方式的缺点

    1. 标签多了,样式多了,代码量非常庞大
    2. 可读性差
    3. 代码没有复用性

2.在head标签中使用style标签来自定义css样式

  • 使用语法
1
2
3
4
5
6
7
8
9
<head>
<!--此处是html语法-->
<style type="text/css">
/*此处是css语法*/
xxx{
key : value,value;
}
</style>
</head>
  • 示例
1
2
3
4
5
6
7
8
9
10
11
12
<head>
<meta charset="UTF-8">
<title>标题</title>
<!--style标签专门用来定义css样式-->
<style type="text/css">
/*style标签中的代码是css代码,语法是css语法*/
/*自定义了body中所有div标签的样式*/
div{
border : 1px solid red;
}
</style>
</head>
  • 缺陷
    1. 只能在同一页面内复用代码,不能在多个页面中复用css代码
    2. 维护起来不方便,实际的项目中会有成千上万个页面,要到每个页面中去修改,工作量太大

3.把css样式写成一个单独的文件

把css样式写成一个单独的文件,再通过link标签引入即可复用

1
2
3
4
5
6
7
/*cssfile.css*/
div{
border : 1px solid red;
}
span{
border : 1px solid red;
}
1
2
3
4
5
6
7
<!--htmlfile.html-->
...
<head>
...
<link rel="stylesheet" type="text/css" href="cssfile.css"/>
</head>
...

css选择器

标签选择器

标签选择器使用HTML标签名称作为选择器,按标签名对标签项进行分类,为页面中某一类标签指定统一的CSS样式。

比如为所有的div标签指定样式1,为所有的span标签指定样式2

  • 语法
1
2
3
标签名{
...
}
  • 示例
1
2
3
4
5
6
7
/*1.css*/
div{
border : 1px solid red;
}
span{
border : 1px solid red;
}

id选择器

id选择器使用标签的id属性值作为选择器,按标签id值对标签项进行分类,为页面中同一id的标签指定统一的css样式

注意标签的id是唯一的,不能重复,所以id选择器只能针对某一个标签,对其进行css样式修改。所以id选择器不是很常用。

  • 语法
1
2
3
#id名{
...
}
  • 示例
1
2
3
4
5
6
7
8
9
10
11
/*cssfile.css*/
#id001{
border : 1px solid red;
color: blue;
font-size: 30px;
}
#id002{
border : 1px dotted green;
color: red;
font-size: 30px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!--htmlfile.html-->
...
<head>
...
<link rel="stylesheet" type="text/css" href="cssfile.css"/>
</head>

<body>
<span id="id001">
一枚小P孩
</span>
<span id="id002">
两枚小P孩
</span>
</body>
...

class选择器

class选择器使用标签的class属性作为选择器,按标签class属性对标签项进行分类,为页面中指定class属性的标签设置统一的css样式

标签的class属性可以重复,不是唯一的,所以class选择器可以同时为多个标签进行css样式修改

  • 语法
1
2
3
.类名{
...
}
  • 示例
1
2
3
4
5
6
/*cssfile.css*/
.class001{
border : 1px solid red;
color: blue;
font-size: 30px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!--htmlfile.html-->
...
<head>
...
<link rel="stylesheet" type="text/css" href="cssfile.css"/>
</head>

<body>
<span class="class001">
一枚小P孩
</span>
<span class="class001">
两枚小P孩
</span>
</body>
...

组合选择器

组合选择器可以让多个选择器公用同一个CSS样式代码

  • 语法
1
2
3
选择器1, 选择器2, ..., 选择器n{
属性 : 值;
}
  • 示例
1
2
3
4
5
6
/*cssfile.css*/
div, #id001, .class001{
border : 1px solid red;
color: blue;
font-size: 30px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!--htmlfile.html-->
...
<head>
...
<link rel="stylesheet" type="text/css" href="cssfile.css"/>
</head>

<body>
<span class="class001">
一枚小P孩
</span>
<span id="id001">
两枚小P孩
</span>
<div>
三枚小P孩
</div>
</body>
...

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
div{
/*文本字体颜色*/
color : yellow;
/*文本框边框*/
border: 1px red solid;
/*文本框宽度和高度*/
width : 250px;
height: 250px;
/*文本框背景颜色*/
background-color:green;
/*文本框居中*/
margin-left : auto;
margin-right : auto;
}

a.{
/*超链接去下划线*/
text-decoration : none;
}

table{
/*表格加边框*/
border: 1px red solid;
/*将表格边框和单元格边框合并*/
border-collapse: collapse;
}

td{
/*单元格加边框*/
border: 1px red solid;
}

ul{
/*列表去修饰*/
list-style: none;
}

Javascript

Javascript语言主要是完成页面的数据验证。因此它运行在客户端,需要允许浏览器来解析执行Javascript代码。Js是Netscape网景公司的产品,最早取名为LiveScript;为了吸引更多的Java程序员,更名为Javascript。

Java和Js的关系

Js是弱类型语言,Java是强类型语言

强弱类型语言参考知乎-什么是强类型语言,什么是弱类型语言,为什么python也是强类型语言。

特点:

  1. 交互性(它可以做的就是信息的动态交互)
  2. 安全性(不允许直接访问本地硬盘)
  3. 跨平台性(只要是可以阶是JS的浏览器都可以执行,和平台无关)

Js和html代码的结合方式

第一种方式

在 head 标签中或者 body 标签中,使用 script 标签嵌套 Js 代码

1
2
3
4
5
6
7
8
9
10
11
<head>
...
<!--此处是html语法-->
<script type="text/javascript">
// 此处是JS语法
// alert是JavaScript语言提供的一个警告函数
// 它可以接受任意类型的参数,这个参数就是警告框的提示信息
// 警告框在运行页面时弹出
alert("Hello Javascript!");
</script>
</head>

第二种方式

编写单独的Javascript代码文件,再使用script标签引入

1
2
//jsfile.js
alert("Hello Javascript!");
1
2
3
4
5
6
7
8
<head>
...
<!--
使用script标签引入外部的js文件
src中填写js文件的路径(相对路径或者绝对路径)
-->
<script type="text/javascript" src="jsfile.js"></script>
</head>
  • 注意事项
1
2
3
4
5
6
7
8
9
10
11
12
<head>
...
<!--注意
script标签能用来嵌套js代码,或者引入js文件
但是对于一个script标签两者之能二选一,不能同时使用
-->
<!--同时使用嵌套的内容无效-->
<script type="text/javascript" src="jsfile.js">
//无效内容
alert("Hellow xiaophai!");
</script>
</head>
1
2
3
4
5
6
7
8
9
10
<!--当需要同时引入和嵌套时,应再添加一个script标签-->
<head>
...
<!--引入-->
<script type="text/javascript" src="jsfile.js"></script>
<!--嵌套-->
<script>
alert("Hellow xiaophai!");
</script>
</head>

Js的变量

  • Js的变量类型

    • 数值类型:number
    • 字符串类型:string
    • 对象类型:objc
    • 布尔类型:boolean
    • 函数类型:function
  • Js里特殊的值

    • undefined:未定义(所有js变量为赋于初始值时,默认都是undefined)
    • null:空值
    • NaN:Not a Number
  • Js中定义变量的格式

    1
    2
    var 变量名;
    var 变量名 = 值;
  • 变量示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <script type="text/javascript">
    //变量未初始化时,默认值为undefined
    var i;
    alert(i); //undefined

    //typeof()时js语言提供的一个函数,可以输出变量的类型
    i = 12;
    alert(typeof(i)); //number

    //Js是弱类型语言,变量类型可以自动转换
    i = "ab"
    alert(typeof(i)); //string

    //数字和字符串相乘不报错但是NaN
    alert(typeof(1*"a"));//NaN
    </script>

关系(比较)运算

  • < 小于号, > 大于号, <= 小于等于号, >= 大于等于号, == 等于号.

  • === 全等于:除了做变量值的比较之外,还会比较两个变量的数据类型

    1
    2
    3
    4
    5
    6
    7
    <script type="text/javascript">
    var a = "12"; //string
    var b = 12; //numver

    alert(a == b); //true
    alert(a === b);//false
    </script>

逻辑运算

  • && 与, || 或, ! 非

  • 在Js中 所有变量 都可以作为一个 boolean 类型的变量去使用
    0, null, undefined, ""(空串), NaN 都被认为是 false,其它的都被认为是 true

  • 因为所有变量都可以作为一个 boolean 类型的变量去进行逻辑运算,所以 Js 的逻辑运算与其它编程语言有所不同

    • &&且运算
      1. 当 表达式全为真时,返回最后一个表达式的值;
      2. 当表达式有一个为假时,返回第一个为假的表达式的值。
    • ||或运算
      1. 当表达式全为假时,返回最后一个表达式的值;
      2. 当表达式有一个为真时,返回第一个为真的表达式的值。
    • &&||有短路,即当&&遇到假,当||遇到真时,之后的表达式不再执行

Note: Js的 bool 运算返回的是表达式的值, 不像别的语言中返回 true 或 false

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script type="text/javascript">
var a = "12";
var b = true;
var c = false;
var d = null;

alert( a && b ); //全真返回最后一个真值 b-->true
alert( b && a ); //全真返回最后一个真值 a-->12
alert( a && d && b);//有假返回第一个假值 d-->null

alert( c || d ); //全假返回最后一个假值 d-->null
alert( a || b ); //有真返回第一个真值 a-->12
alert( c || b || a);//有真返回第一个真值 b-->true
</script>

数组

  • 语法
1
2
var 数组名 = []; //空数组
var 数组名 = [1, "abc", true]; //初始化定义数组
  • Js中数组可以自动扩容,Js中的数组不存在数组越界问题
1
2
3
4
5
6
7
var arr = [];
arr[0] = 1;
arr[3] = 4;
alert(arr.length); //4
alert(arr[2]); //undefined
alert(arr[4]); //undefined
alert(arr.length); //4
  • 遍历数组
1
2
3
for (var i = 0; i < arr.length; i++){
alert(arr[i]);
}

函数

函数的第一种定义方式

  • 使用 function 关键字来定义函数
1
2
3
4
5
6
// 定义函数
function fun1(){
alert("fun1被调用");
}
// 调用函数
fun1();
  • 含参函数
1
2
3
4
5
6
7
// 参数并不需要加var指定变量
function fun2(a, b){
alert("a=>" + a + ", b=>" + b);
}

// 调用函数
fun2(12, null);

Note: 函数声明中定义参数时并不需要加 var 声明参数变量

  • 当函数参数加 var, 运行时会报错
1
2
3
function fun2(var a, var b){
...
}

在浏览器中按 F12,在 Console 中查看报错

Uncaught SyntaxError: Unexpected token 'var'

  • 函数返回值
1
2
3
4
5
6
// 不用指定返回值类型,直接使用return进行返回
function sum(num1, num2){
return num1 + num2;
}
// 调用函数
alert(sum(1,2)); //3

函数的第二种定义方式

  • 语法
1
2
3
var 函数名 = function(形参列表){
函数体
}
  • 示例
1
2
3
4
5
6
// 定义函数
var fun3 = function(a, b){
return a * b;
}
// 调用函数
alert(fun3(1, 2)); //3

Note: Js不允许函数重载,当重名函数被定义时,先前的函数会被覆盖

隐形参数

在 function 中不需要在参数列表中定义,但却可以直接用来获取所有参数的变量, 我们称之为 隐形参数。(隐形参数类似Java的可变长参数)

1
2
3
4
5
6
7
8
9
// 定义函数, 参数列表中默认自带了一个隐形参数 argument,其用法类似数组
function fun(){
for(var i = 0; i < argument.length; i++){
alert(argument[i]);
}
}

// 调用函数
fun(1, "ab", true);

Js中定义对象

  • Object的使用语法
1
2
3
4
5
6
7
// 定义一个对象
var 对象名 = new Object(); //对象实例(空对象)
对象名.属性名 = 值; //定义一个属性
对象名.方法名 = function(){} //定义一个方法

// 访问一个对象
对象名.属性/方法()
  • 示例
1
2
3
4
5
6
7
8
9
10
// 定义一个对象
var obj = new Object();
obj.name = "xiaophai"
obj.age = 18;
obj.fun = function{
alert("My name is " + this.name);
}

// 访问一个对象
obj.fun();
  • 花括号形式定义对象
1
2
3
4
5
6
var 对象名 = {}; //空对象

var 对象名 = {
属性名: 值,
方法名: function(){}
}

Js中的事件

事件是电脑输入设备与页面进行交互的响应

事件的注册

事件的注册(绑定)就是告诉浏览器,当事件响应后应该要执行哪些操作代码,叫做 事件注册 或者 事件绑定

事件的注册又分为 静态注册动态注册

  • 静态注册

    通过html标签的事件属性直接赋予事件响应后的代码,这种方式叫做 静态注册

  • 动态注册

    先通过 Js 代码得到标签的 dom 对象,然后再通过 dom对象.事件名 = function(){} 这种形式赋予事件响应后的代码,叫做 动态注册

    动态注册的基本步骤

    1. 获取标签对象
    2. 标签对象.事件名 = function(){}

常用的事件

  • onload 加载完成事件:

    页面加载完成后,常用于做页面 Js代码初始化 操作

  • onclick 单击事件:

    常用于按钮的点击响应操作

  • onblur 失去焦点事件:

    常用于输入框失去焦点后验证其输入内容是否合法

  • onchange 内容发生改变事件:

    常用于下拉列表和输入框内容发生改变后操作

  • onsubmit 表单提交事件:

    常用于表单提交前,验证所有表单项是否合法

onload事件

  • 静态注册 onload 事件
    示例1

    1
    2
    3
    4
    <!--onload事件是浏览器解析完页面之后就会自动触发的事件-->
    <body onload="alert('静态注册onload事件')">
    ...
    </body>

    示例2
    绑定自定义 Js 函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <head>
    ...
    <script type="text/javascript">
    function onloadFun(){
    alert('静态注册onload事件');
    }
    </script>
    </head>
    <body onload = "onloadFun();">
    ...
    </body>
  • 动态注册 onload 事件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <head>
    ...
    <script type="text/javascript">
    window.onload = function(){
    alert('动态注册onload事件');
    }
    </script>
    </head>
    <body>
    ...
    </body>

onclick事件

  • 静态注册onclick事件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <head>
    ...
    <script type="text/javascript">
    function onclickFun(){
    alert('静态注册onclick事件');
    }
    </script>
    </head>
    <body>
    <button onclick="onclickFun();">按钮</button>
    </body>
  • 动态注册onload事件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <head>
    ...
    <script type="text/javascript">
    window.onload = function(){
    // document是Js语言提供的一个类(文档)
    // getElementById是document类的方法
    // getElementById可以通过id属性获取标签对象
    var buttonObj = document.getElementById("button01");
    // 通过标签对象.事件名 = function(){} 进行绑定事件
    buttonObj.onclick = function(){
    alert('动态注册onclick事件');
    }
    }
    </script>
    </head>
    <body>
    <button id="button01">按钮</button>
    </body>

onblur事件

  • 静态注册

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <head>
    ...
    <script type="text/javascript">
    function onblurFun(){
    // console是控制台对象,是由Js语言提供
    // 用来向浏览器的控制台打印输出,便于测试, 观察返回值
    // log() 是打印的方法
    // 在浏览器中按F12打开控制台,在console中查看输出
    console.log("静态注册失去焦点事件");
    }
    </script>
    </head>

    <body>
    用户名:<input type="text" onblur="onblurFun();"><br/>
    密码:<input type="password" onblur="onblurFun();"><br/>
    </body>
  • 动态注册

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <head>
    ...
    <script type="text/javascript">
    window.onload = function(){
    // 通过id属性获取标签对象
    var pswObj = document.getElementById("password");
    // 通过标签对象.事件名 = function(){}
    pswObj.onclick = function(){
    alert('动态注册失去焦点事件');
    }
    }
    </script>
    </head>
    <body>
    用户名:<input type="text" id="username"><br/>
    密码:<input type="password" id="password"><br/>
    </body>

onchange事件

  • 静态注册

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <head>
    ...
    <script type="text/javascript">
    function onchangeFun(){
    alert("静态注册onchange事件");
    }
    </script>
    </head>

    <body>
    <select onchange="onchangeFun();">
    <option>--水果--</option>
    <option>--苹果--</option>
    <option>--香蕉--</option>
    <option>--橘子--</option>
    </select>
    </body>
  • 动态注册

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <head>
    ...
    <script type="text/javascript">
    window.onload = function(){
    var selObj = document.getElementById("select01");
    selObj.onchange = function(){
    alert("动态注册onchange事件");
    }
    }
    </script>
    </head>

    <body>
    <select id="select01">
    <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
    <head>
    ...
    <script type="text/javascript">
    function onsubmitFun(){
    alert("静态注册onsubmit事件: 发现不合法");

    return false;
    }
    </script>
    </head>

    <body>
    <form action="http://localhost:8080" method="get" onsubmit="return onsubmitFun();">
    <input type="submit" value="静态注册提交">
    </form>
    </body>
  • 动态注册

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <head>
    ...
    <script type="text/javascript">
    window.onload = function(){
    var formObj = document.getElementById("form01");
    formObj.onsubmit = function(){
    alert("动态注册onsubmit事件: 发现不合法");

    return false;
    }
    }
    </script>
    </head>

    <body>
    <form action="http://localhost:8080" method="get" id="form01">
    <input type="submit" value="动态注册提交">
    </form>
    </body>

DOM模型

DOM(Document Object Model)文档对象模型,把文档中的标签、属性、文本,转换成对象来管理

Document对象

Document对象的理解

  1. Document它管理了所有的Html文档内容
  2. Document它是一种树结构的文档,有层级关系
  3. 它让我们把所有的标签都对象化
  4. 我们可以通过Document访问所有的标签对象

例如, 下面的简单的 html 代码可以对象化一个树状图

1
2
3
4
5
6
7
8
9
10
11
12
13
<html>
<head>
<title>
我的title
</title>
</head>

<body>
<a href="https://www.baidu.com">我的超链接</a>
<h1>我的标题</h1>
</body>

</html>
graph TD
A["文档"]---B["根元素
html"] B---C1["元素
head"] B---C2["元素
body"] C1---D1["元素
title"]---E1["文本
h1"] C2---D2["元素
超链接a"]---E2["文本
我的超链接"] D2---E3["属性
href"] C2---D3["元素
h1"]---E4["文本
我的标题"]

什么是对象化

  • 举例

有一个人有年龄、性别、姓名三个属性,如何将这些信息对象化?

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; //id属性
private String tagName; //标签名
private Dom parentNode; //父节点
private List<Dom>children;//子节点
private String innerHTML; //起始标签和结束标签中间的内容
}

验证有户名是否合法1.0

需求:当用户点击了校验按钮,要获取输出框中的内容,然后校验其是否合法
验证的规则是:必修有数字、字母、下划线组成,并且长度是5到12位

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>
...
<script type="text/javascript">
function onclickFun(){
// 首先获取需要操作的标签对象,这里通过id获取
var usernameObj = document.getElementById("username");
// [object HTMLInputElement] dom对象
var usernameText = usernameObj.value;
var reg_exp = /^\w{5,12}$/;
/*
test()方法用于判断输入字符串中是否存在被正则表达式匹配的内容
test()方法只需要输入字符串中存在正则匹配内容就返回ture
如果正则表达式没有匹配到任何内容则返回false
*/
if(reg_exp.test(usernameText)){
alert("用户名合法");
}else{
alert("用户名非法")
}
}
</script>
</head>

<body>
用户名:<input type="text" id="username"/>
<button onclick="onclickFun();">校验</button>
</body>

验证有户名是否合法2.0

用 alert 来显示用户名是否合法不是常见的方式, 通常都是直接在输入框后面进行提示, 下面的改进是对这一方式的实现.

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
<head>
...
<script type="text/javascript">
function onclickFun(){
// 首先获取需要操作的标签对象,这里通过id获取
// [object HTMLInputElement] dom对象
var usernameObj = document.getElementById("username");
// 通过对象的value属性获取输入类容
var usernameText = usernameObj.value;
// 通过id获取Span对象
var usernameSpanObj = document.getElementById("usernameSpan");
// 正则表达式
var reg_exp = /^\w{5,12}$/;
if(reg_exp.test(usernameText)){
//innerHTML是起始标签和结束标签中间的内容
//通过对象的innerHTML属性直接赋予标签中间的内容
usernameSpanObj.innerHTML = "用户名合法";
}else{
usernameSpanObj.innerHTML = "用户名非法";
}
}
</script>
</head>

<body>
用户名:<input type="text" id="username"/>
<span id="usernameSpan" style="color:red;"></span>
<button onclick="onclickFun();">校验</button>
</body>

Js中的正则表达式

JavaScript RegExp 参考手册

RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。

创建正则表达式对象

  • 使用new RegExp()创建
1
2
3
4
5
6
7
// 正则表达式,用于匹配小写字母e
var patt = new RegExp("e");
// test()方法只需要待测试字符串中包含了匹配的字符串就返回ture
alert(patt.test("abcd")); //false
alert(patt.test("abcde")); //true
// 输出patt对象,是由两个斜杠中间夹着正则表达式
alert(patt); // /e/
  • 使用双斜杠/reg_exp/创建
1
2
3
var patt = /e/;
alert(patt.test("abcd")); //false
alert(patt.test("abcde")); //true

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
<head>
...
<script type="text/javascript">
// 全选
function checkAll(){
// document.getElementsByName()是根据指定的Name属性
// 查询并返回多个标签对象集合
// 对这个集合的操作同数组一样
// xxx.length 返回集合中的元素个数
// xxx[0] 访问xxx的第一个元素
// 集合中每个元素都是dom对象
// 集合中元素的顺序是html页面中从上到下查询到元素的顺序
var hobbies = document.getElementsByName("hobby");
for(var i = 0; i < hobbies.length; i++){
// checked属性表示复选框的选中状态,如果选中为true,不选为false
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">C++
<input type="checkbox" name="hobby" value="python">python
<input type="checkbox" name="hobby" value="java">java
<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
<head>
...
<script type="text/javascript">
// 全选
function checkAll(){
//document.getElementsByName按照标签名进行查询并返回Dom对象集合
//集合中元素的顺序是html页面中从上到下查询到元素的顺序
//对集合的操作同数组一样
var inputs = document.getElementsByTagName("input");
for(var i = 0; i < inputs.length; i++){
inputs[i].checked = true;
}
}
</script>
</head>

<body>
编程语言:
<input type="checkbox" value="cpp">C++
<input type="checkbox" value="python">python
<input type="checkbox" value="java">java
<br/>
<button onclick="checkAll();">全选</button>
</body>

三个获取Dom对象的方法使用的注意事项

  • 如果有id属性,优先使用getElementsById方法来进行查询
  • 如果没有id属性,有name属性,优先使用getElementsByName
  • 如果没有id属性也没有name属性,最后考虑使用getElementsByTagName

节点的常用属性和方法

节点就是标签对象(dom对象)

常用方法

  • getElementsByTagName()

    获取当前节点的指定标签名的孩子节点

    1
    2
    // 例如获取document节点的标签名为"input"的孩子节点
    document.getElementsByTagName("input")
  • appendChild(oChildNode)

    可以添加一个子节点,oChildNode是要添加的孩子节点

常用属性

  • childNodes
    属性,获取当前节点的所有子节点

  • firstChild
    属性,获取当前节点的第一个子节点

  • lastChild
    属性,获取当前节点的最后一个子节点

  • parentNode
    属性,获取当前节点的父节点

  • nextSibling
    属性,获取当前节点的下一个节点

  • previousSibling
    属性,获取当前节点的上一个节点

  • className
    用于获取或设置标签的class属性值

  • innerHTML
    属性,表示获取/设置起始标签和结束标签中的内容

  • innerText
    属性,表示获取/设置起始标签和结束标签中的文本

JQuery