1.HTML&css

1)html介绍

  • html文件
<!DOCTYPE html><!--声明 约束-->
<html lang="zh_CN"><!--html的开始, lang="zh_CN"表示中文-->
<head><!-- 包含title,css,js三部分-->
    <meta charset="UTF-8"><!--字符集-->
    <title>标题</title><!--标题-->
</head>
<body><!--html主体-->
    hello
</body>
</html>
  • 标签
<!DOCTYPE html>
<html lang="zh_CN">
<head>
    <meta charset="UTF-8">
    <title>标题</title>
</head>
<body bgcolor="#ffe4c4"><!--bgcolor背景色-->
    hello<br/>
    <hr/>
<button onclick="alert('你好!')" >按钮</button><!-- 单击提醒-->
</body>
</html>
  • 常用标签
<body>
    <!-- font字体标签
    需求 1:在网页上显示 我是字体标签 ,并修改字体为 宋体,颜色为红色。
    font 标签是字体标签,它可以用来修改文本的字体,颜色,大小(尺寸)
    color 属性修改颜色
    face 属性修改字体
    size 属性修改文本大小
    -->
	<font color="#a52a2a" face="宋体" size="7">字体标签</font>
</body>
<body>
    <!-- 特殊字符
    需求 1:把 <br> 换行标签 变成文本 转换成字符显示在页面上
    常用的特殊字符:
    < ===>>>> <
    > ===>>>> >
    空格 ===>>>>  -->
    我是<br">>标签<br>
    你       好
</body>
<body>	
    <!-- 标题标签
    需求 1:演示标题 1 到 标题 6 的
    h1 - h6 都是标题标签
    h1 最大
    h6 最小
    align 属性是对齐属性
    left 左对齐(默认)
    center 剧中
    right 右对齐-->
    <h1 align="left">标题1</h1>
    <h2 align="right">标题2</h2>
    <h3 align="center">标题3</h3>
    <h4>标题4</h4>
    <h5>标题5</h5>
    <h6>标题6</h6>
</body>
<body>
	<!-- 超链接
	href 属性设置连接的地址
	target 属性设置哪个目标进行跳转
	_self 表示当前页面(默认值)
	_blank 表示打开新页面来进行跳转-->
	<a href="3.标题标签.html">跳转1</a><br>
	<a href="3.标题标签.html" target="_self">跳转2</a><br>
	<a href="3.标题标签.html" target="_blank">跳转3</a><br>
</body>
<body>
    <!--需求 1:使用无序,列表方式,把东北 F4,赵四,刘能,小沈阳,宋小宝,展示出来
    ul 是无序列表
    type 属性可以修改列表项前面的符号
    li 是列表项
    -->
    <ul>
        <li>111</li>
        <li>111</li>
        <li>111</li>
        <li>111</li>
    </ul>
    <ol>
        <li>111</li>
        <li>111</li>
        <li>111</li>
        <li>111</li>
    </ol>
    <ul type="none">
        <li>111</li>
        <li>111</li>
        <li>111</li>
        <li>111</li>
    </ul>
</body>
<body>
    <!--需求 1:使用 img 标签显示一张美女的照片。并修改宽高,和边框属性
    img 标签是图片标签,用来显示图片
    src 属性可以设置图片的路径
    width 属性设置图片的宽度
    height 属性设置图片的高度
    border 属性设置图片边框大小
    alt 属性设置当指定路径找不到图片时,用来代替显示的文本内容
    在 JavaSE 中路径也分为相对路径和绝对路径.
    相对路径:从工程名开始算
    绝对路径:盘符:/目录/文件名
    在 web 中路径分为相对路径和绝对路径两种
    相对路径:
    . 表示当前文件所在的目录
    .. 表示当前文件所在的上一级目录
    文件名 表示当前文件所在目录的文件,相当于 ./文件名 ./ 可以省略
    绝对路径:
    正确格式是: http://ip:port/工程名/资源路径
    错误格式是: 盘符:/目录/文件名
    -->
    <img src="../imgs/0.jpg" width="200" height="200" alt="图片找不到">
    <img src="../imgs/2.jpg" width="200" height="200" alt="图片找不到">
    <img src="../imgs/3.jpg" width="200" height="200" alt="图片找不到">
    <img src="../imgs/4.jpg" width="200" height="200" alt="图片找不到">
    <img src="../imgs/6.jpg" width="200" height="200" alt="图片找不到">
    <img src="6.jpg" width="200" height="200" alt="图片找不到">
</body>
<body>
	<!--
	需求 1:做一个 带表头的 ,三行,三列的表格,并显示边框
	需求 2:修改表格的宽度,高度,表格的对齐方式,单元格间距。
	table 标签是表格标签
	border 设置表格标签
	width 设置表格宽度
	height 设置表格高度
	align 设置表格相对于页面的对齐方式
	cellspacing 设置单元格间距
	tr 是行标签
	th 是表头标签
	td 是单元格标签
	align 设置单元格文本对齐方式
	b 是加粗标签
	-->
	<table align="center" width="600" height="900" border="1" cellspacing="0">
		<tr>
			<th>1</th>
			<th>2</th>
			<th>3</th>
		</tr>
		<tr>
			<td><img src="6.jpg" width="200" height="300"></td>
			<td><img src="6.jpg" width="200" height="300"></td>
			<td><img src="6.jpg" width="200" height="300"></td>
		</tr>
		<tr>
			<td><img src="6.jpg" width="200" height="300"></td>
			<td><img src="6.jpg" width="200" height="300"></td>
			<td><img src="6.jpg" width="200" height="300"></td>
		</tr>
	</table>
</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">1.1</td>
			<td>1.1</td>
			<td>1.3</td>
			<td>1.4</td>
			<td>1.5</td>
		</tr>
		<tr>
			<td>1.3</td>
			<td>1.3</td>
			<td>1.4</td>
			<td>1.5</td>
		</tr>
		<tr>
			<td colspan="2" rowspan="2">1.3</td>
			<td>1.3</td>
			<td>1.4</td>
			<td>1.5</td>
		</tr>
		<tr>
			<td>1.3</td>
			<td>1.4</td>
			<td>1.5</td>
		</tr>
	</table>
<body>
我是一个单独的完整的页面<br/><br/>
<!--ifarme 标签可以在页面上开辟一个小区域显示一个单独的页面
ifarme 和 a 标签组合使用的步骤:
1 在 iframe 标签中使用 name 属性定义一个名称
2 在 a 标签的 target 属性上设置 iframe 的 name 的属性值
-->
<iframe src="1.font标签.html" height="500" width="500" name="aaaaa"></iframe>
<br>
<ul>
    <li><a href="2.特殊字符.html" target="aaaaa">1111</a></li>
    <li><a href="3.标题标签.html" target="aaaaa">1111</a></li>
    <li><a href="4.超链接.html" target="aaaaa">1111</a></li>
</ul>
</body>

2)css

  • 使用
div{
    border: 1px solid red;
}
span{
    border: red solid 3px;
    background: aqua;
}
<head>
	<meta charset="UTF-8">
	<title>CSS基本语法</title>
	<link href="01.css" rel="stylesheet" type="text/css">
</head>
<body>
	<p>落霞与孤鹜齐飞,秋水共长天一色</p>
	<div>你好</div>
	<div>你好</div>
	<span>1111</span>
	<span>222</span>
</body>
  • 1.标签选择器
<head>
	<meta charset="UTF-8">
	<title>CSS选择器</title>
	<style type="text/css">
		div{
			border: 3px solid blue;
			font-size: 30px;
		}
		span{
			border: 2px dashed yellow;
		}
	</style>
</head>
<body>		
	<!-- 
	需求1:在所有div标签上修改字体颜色为蓝色,字体大小30个像素。边框为1像素黄色实线。
	并且修改所有span 标签的字体颜色为黄色,字体大小20个像素。边框为5像素蓝色虚线。
	 -->
	<div>div标签1</div>
	<div>div标签2</div>
	<span>span标签1</span>
	<span>span标签2</span>
</body>
  • 2.id选择器
<head>
	<meta charset="UTF-8">
	<title>ID选择器</title>
	<style type="text/css">
		#id01{
			font-size: 30px;
			color: blue;
			border: 1px yellow solid;
		}
		#id02{
			font-size: 20px;
			color: red;
			border: 5px blue dotted;
		}
	</style>
</head>
<body>		
	<!-- 
	需求1:分别定义两个 div 标签,
	第一个div 标签定义 id 为 id001 ,然后根据id 属性定义css样式修改字体颜色为蓝色,
	字体大小30个像素。边框为1像素黄色实线。
	
	第二个div 标签定义 id 为 id002 ,然后根据id 属性定义css样式 修改的字体颜色为红色,字体大小20个像素。边框为5像素蓝色点线。
	 -->
	<div id="id01">div标签1</div>
	<div id="id02">div标签2</div>
</body>
  • 3.class选择器
<head>
    <meta charset="UTF-8">
    <title>class类型选择器</title>
	<style type="text/css">
		.class01{
			color: blue;
			font-size: 30px;
			border: 1px solid yellow;
		}
		.class02{
			color: gray;
			font-size: 30px;
			border: 1px red solid;
		}
	</style>
</head>
<body>

	<!-- 
		需求1:修改 class 属性值为 class01的 span 或 div 标签,字体颜色为蓝色,字体大小30个像素。边框为1像素黄色实线。
		需求2:修改 class 属性值为 class02的 div 标签,字体颜色为灰色,字体大小26个像素。边框为1像素红色实线。
	 -->

	<div class="class01">div标签class01</div>
	<div class="class02">div标签</div>
	<span class="class01">span标签class01</span>
	<span>span标签2</span>
</body>
  • 4.组合选择器
<head>
<meta charset="UTF-8">
<title>class类型选择器</title>
    <style type="text/css">
        #id01,.class01{
            font-size: 20px;
            color: blue;
            border: 1px yellow solid;
        }
    </style>
</head>
<body>
	<!-- 
	需求1:修改 class="class01" 的div 标签 和 id="id01" 所有的span标签,
	字体颜色为蓝色,字体大小20个像素。边框为1像素黄色实线。
	 -->
   <div class="class01">div标签class01</div> <br />
   <span id="id01">span 标签</span>  <br /> 
   <div>div标签</div> <br />
   <div>div标签id01</div> <br />
</body>
  • 常用样式
<head>
<meta charset="UTF-8">
<title>06-css常用样式.html</title>
    <style type="text/css">
        div{
            color: red;
            border: aqua 1px solid;
            width: 300px;
            height: 300px;
            background-color: blueviolet;
            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;
        }
        ul{
            list-style: none;
        }
    </style>
</head>
<body>
    <div>
        常用样式
    </div>
    <table>
        <tr>
            <td>1111</td>
            <td>1111</td>
        </tr>
    </table>
    <ul>
        <li>111</li>
        <li>111</li>
        <li>111</li>
        <li>111</li>
    </ul>
</body>

2.js

1)简介

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

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

2)JavaScript 和 html 代码的结合方式

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--
    现在需要使用 script 引入外部的 js 文件来执行
    src 属性专门用来引入 js 文件路径(可以是相对路径,也可以是绝对路径)
    script 标签可以用来定义 js 代码,也可以用来引入 js 文件
    但是,两个功能二选一使用。不能同时使用两个功能
    -->
    <script type="text/javascript" src="01.js使用.js"></script>
    <script type="text/javascript">
        alert("意义")
    </script>
</head>
alert("你好")

3)变量

什么是变量?变量是可以存放某些值的内存的命名。
	JavaScript 的变量类型:
		数值类型: number
		字符串类型: string
		对象类型: object
		布尔类型: boolean
		函数类型: function
	JavaScript 里特殊的值:
		undefined 未定义,所有 js 变量未赋于初始值的时候,默认值都是 undefined.
		null 空值
		NaN 全称是:Not a Number。非数字。非数值。
	JS 中的定义变量格式:
		var 变量名;
		var 变量名 = 值;
  • 实例
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        var i;
        // alert(i); // undefined
        i = 12;
        // typeof()是 JavaScript 语言提供的一个函数。
        // alert( typeof(i) ); // number
        i = "abc";
        // 它可以取变量的数据类型返回
        // alert( typeof(i) ); // String
        var a = 12;
        var b = "abc";
        alert( a * b ); // NaN 是非数字,非数值。
    </script>
</head>
  • 关系运算
等于: == 等于是简单的做字面值的比较
全等于: === 除了做字面值的比较之外,还会比较两个变量的数据类型
  • 逻辑运算
1.在 JavaScript 语言中,所有的变量,都可以做为一个 boolean 类型的变量去使用。
	0 、null、 undefined、””(空串) 都认为是 false;
2.&& 且运算。
	有两种情况:
		第一种:当表达式全为真的时候。返回最后一个表达式的值。
		第二种:当表达式中,有一个为假的时候。返回第一个为假的表达式的值
3.|| 或运算
	第一种情况:当表达式全为假时,返回最后一个表达式的值
	第二种情况:只要有一个表达式为真。就会把回第一个为真的表达式的值
4.并且 && 与运算 和 ||或运算 有短路。
	短路就是说,当这个&&或||运算有结果了之后 。后面的表达式不再执行
<script type="text/javascript">
    /* 在 JavaScript 语言中,所有的变量,都可以做为一个 boolean 类型的变量去使用。
    0 、null、 undefined、””(空串) 都认为是 false;*/
    // var a = 0;
    // if (a) {
    // alert("零为真");
    // } else {
    // alert("零为假");
    // }
    // var b = null;
    // if (b) {
    // alert("null 为真");
    // } else {
    // alert("null 为假");
    // }
    // var c = undefined;
    // if (c) {
    // alert("undefined 为真");
    // } else {
    // alert("undefined 为假");
    // }
    // var d = "";
    // if (d) {
    // alert("空串为真");
    // } else {
    // alert("空串为假");
    // }
    /* && 且运算。
    有两种情况:
    第一种:当表达式全为真的时候。返回最后一个表达式的值。
    第二种:当表达式中,有一个为假的时候。返回第一个为假的表达式的值*/
    var a = "abc";
    var b = true;
    var d = false;
    var c = null;
    // alert( a && b );//true
    // alert( b && a );//true
    // alert( a && d ); // false
    // alert( a && c ); // null
    /* || 或运算
    第一种情况:当表达式全为假时,返回最后一个表达式的值
    第二种情况:只要有一个表达式为真。就会把回第一个为真的表达式的值*/
    // alert( d || c ); // null
    // alert( c|| d ); //false
    // alert( a || c ); //abc
    // alert( b || c ); //true
</script>

4)数组(重)

  • 定义
JS 中 数组的定义:
格式:
	var 数组名 = []; // 空数组
	var 数组名 = [1 , ’abc’ , true]; // 定义数组同时赋值元素
<script type="text/javascript">
    var arr = [true,1]; // 定义一个空数组
    // alert( arr.length ); // 0
    arr[0] = 12;
    // alert( arr[0] );//12
    // alert( arr.length ); // 0
    // javaScript 语言中的数组,只要我们通过数组下标赋值,那么最大的下标值,就会自动的给数组做扩容操作。
    arr[2] = "abc";
    alert(arr.length); //3
    // alert(arr[1]);// undefined
    // 数组的遍历
    for (var i = 0; i < arr.length; i++){
    	alert(arr[i]);
    }
</script>

5)函数(重)

1.函数不容许重载
  • 方式1
<script type="text/javascript">
    // 定义一个无参函数
    function fun(){
    	alert("无参函数 fun()被调用了");
    }
    // 函数调用===才会执行
    // fun();
    function fun2(a ,b) {
    	alert("有参函数 fun2()被调用了 a=>" + a + ",b=>"+b);
    }
    // fun2(12,"abc");
    // 定义带有返回值的函数
    function sum(num1,num2) {
    	var result = num1 + num2;
    	return result;
    }
    alert( sum(100,50) );
</script>
  • 方式2
<script type="text/javascript">
    var fun = function () {
    	alert("无参函数");
    }
    // fun();
    var fun2 = function (a,b) {
    	alert("有参函数 a=" + a + ",b=" + b);
    }
    // fun2(1,2);
    var fun3 = function (num1,num2) {
    	return num1 + num2;
    }
    alert( fun3(100,200) );
</script>
  • 隐形参数arguments
就是在 function 函数中不需要定义,但却可以直接用来获取所有参数的变量。我们管它叫隐形参数。
	隐形参数特别像 java 基础的可变长参数一样。
	public void fun( Object ... args );
	可变长参数其他是一个数组。
	那么 js 中的隐形参数也跟 java 的可变长参数一样。操作类似数组
<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()");
    }
    // fun(1,"ad",true);
    // 需求:要求 编写 一个函数。用于计算所有参数相加的和并返回
    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>
  • JS 中的自定义对象(扩展内容)
<script type="text/javascript">
    // 对象的定义:
    // var 变量名 = new Object(); // 对象实例(空对象)
    // 变量名.属性名 = 值; // 定义一个属性
    // 变量名.函数名 = function(){} // 定义一个函数
    var obj = new Object();
    obj.name = "华仔";
    obj.age = 18;
    obj.fun = function () {
    	alert("姓名:" + this.name + " , 年龄:" + this.age);
    }
    // 对象的访问:
    // 变量名.属性 / 函数名();
    // alert( obj.age );
    obj.fun();
</script>
  • {}花括号形式的自定义对象
<script type="text/javascript">
    // 对象的定义:
    // var 变量名 = { // 空对象
    // 属性名:值, // 定义一个属性
    // 属性名:值, // 定义一个属性
    // 函数名:function(){} // 定义一个函数
    // };
    var obj = {
    name:"国哥",
    age:18,
    fun : function () {
    	alert("姓名:" + this.name + " , 年龄:" + this.age);
    }
    };
    // 对象的访问:
    // 变量名.属性 / 函数名();
    alert(obj.name);
    obj.fun();
</script>

6)事件

  • 介绍
1.常用的事件:
    onload 加载完成事件: 页面加载完成之后,常用于做页面 js 代码初始化操作
    onclick 单击事件: 常用于按钮的点击响应操作。
    onblur 失去焦点事件: 常用用于输入框失去焦点后验证其输入内容是否合法。
    onchange 内容发生改变事件: 常用于下拉列表和输入框内容发生改变后操作
    onsubmit 表单提交事件: 常用于表单提交前,验证所有表单项是否合法。
2.事件的注册又分为静态注册和动态注册两种:
	什么是事件的注册(绑定)?
		其实就是告诉浏览器,当事件响应后要执行哪些操作代码,叫事件注册或事件绑定。
	静态注册事件:通过 html 标签的事件属性直接赋于事件响应后的代码,这种方式我们叫静态注册。
	动态注册事件:是指先通过 js 代码得到标签的 dom 对象,然后再通过 dom 对象.事件名 = function(){} 这种形式赋于事件
响应后的代码,叫动态注册。
	动态注册基本步骤:
	1、获取标签对象
	2、标签对象.事件名 = fucntion(){}
  • 1.onload事件
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        // onload 事件的方法
        function onloadFun() {
            alert('静态注册 onload 事件,所有代码');
        }
        // onload 事件动态注册。是固定写法
        window.onload = function () {
            alert("动态注册的 onload 事件");
        }
    </script>
</head>
<!--静态注册 onload 事件
onload 事件是浏览器解析完页面之后就会自动触发的事件
<body οnlοad="onloadFun();">
-->
<body>
</body>
  • 2.onclick单击事件
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
    function onclickFun() {
    	alert("静态注册 onclick 事件");
    }
    // 动态注册 onclick 事件
    window.onload = function () {
    // 1 获取标签对象
    /*
    * document 是 JavaScript 语言提供的一个对象(文档)<br/>
    * get 获取
    * Element 元素(就是标签)
    * By 通过。。 由。。经。。。
    * Id id 属性
    *
    * getElementById 通过 id 属性获取标签对象
    **/
    var btnObj = document.getElementById("btn01");
        // alert( btnObj );
        // 2 通过标签对象.事件名 = function(){}
        btnObj.onclick = function () {
            alert("动态注册的 onclick 事件");
        }
    }
    </script>
</head>
<body>
    <!--静态注册 onClick 事件-->
    <button onclick="onclickFun();">按钮 1</button>
    <button id="btn01">按钮 2</button>
</body>
  • 3.onblur 失去焦点事件
<head>
<meta charset="UTF-8">
<title>Title</title>
    <script type="text/javascript">
    // 静态注册失去焦点事件
    function onblurFun() {
        // console 是控制台对象,是由 JavaScript 语言提供,专门用来向浏览器的控制器打印输出, 用于测试使用
        // log() 是打印的方法
    	console.log("静态注册失去焦点事件");
    }
    // 动态注册 onblur 事件
    window.onload = function () {
        //1 获取标签对象
        var passwordObj = document.getElementById("password");
        // alert(passwordObj);
        //2 通过标签对象.事件名 = function(){};
        passwordObj.onblur = function () {
        	console.log("动态注册失去焦点事件");
        }
    }
    </script>
</head>
<body>
    用户名:<input type="text" onblur="onblurFun();"><br/>
    密码:<input id="password" type="text" ><br/>
</body>
  • 4.onchange 内容发生改变事件
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        function fun(){
            alert("女神已经改变")
        }
        window.onload = function (){
            var elementById = document.getElementById("id");
            elementById.onchange = function (){
                alert("男神已经改变")
            }
        }
    </script>
</head>
<body>
    选择女神:
    <select onchange="fun()">
        <option>--女神--</option>
        <option>芳芳</option>
        <option>佳佳</option>
        <option>娘娘</option>
    </select>
    选择男神:
    <select id="id">
        <option>--男神--</option>
        <option>国哥</option>
        <option>华仔</option>
        <option>富城</option>
    </select>
</body>
  • 5.onsubmit 表单提交事件
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" >
        // 静态注册表单提交事务
        function onsubmitFun(){
            // 要验证所有表单项是否合法,如果,有一个不合法就阻止表单提交
            alert("静态注册表单提交事件----发现不合法");
            return flase;
        }
        window.onload = function () {
            //1 获取标签对象
            var formObj = document.getElementById("form01");
            //2 通过标签对象.事件名 = function(){}
            formObj.onsubmit = function () {
                // 要验证所有表单项是否合法,如果,有一个不合法就阻止表单提交
                alert("动态注册表单提交事件----发现不合法");
                return false;
            }
        }
    </script>
</head>
<body>
    <!--return false 可以阻止 表单提交 -->
    <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>

7)DOM模型

  • 介绍
DOM 全称是 Document Object Model 文档对象模型
	大白话,就是把文档中的标签,属性,文本,转换成为对象来管理。
	那么 它们是如何实现把标签,属性,文本转换成为对象来管理呢。这就是我们马上要学习的重点
  • Document 方法(重)
document.getElementById(elementId)
	通过标签的 id 属性查找标签 dom 对象,elementId 是标签的 id 属性值
document.getElementsByName(elementName)
	通过标签的 name 属性查找标签 dom 对象,elementName 标签的 name 属性值
document.getElementsByTagName(tagname)
	通过标签名查找标签 dom 对象。tagname 是标签名
document.createElement( tagName)
	方法,通过给定的标签名,创建一个标签对象。tagName 是要创建的标签名

注:
    document 对象的三个查询方法,如果有 id 属性,优先使用 getElementById 方法来进行查询
    如果没有 id 属性,则优先使用 getElementsByName 方法来进行查询
    如果 id 属性和 name 属性都没有最后再按标签名查 getElementsByTagName
    以上三个方法,一定要在页面加载完成之后执行,才能查询到标签对象
  • 1.getElementById
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" >
    /*
    * 需求:当用户点击了较验按钮,要获取输出框中的内容。然后验证其是否合法。<br/>
    * 验证的规则是:必须由字母,数字。下划线组成。并且长度是 5 到 12 位。
    * */
    function onclickFun() {
        // 1 当我们要操作一个标签的时候,一定要先获取这个标签对象。
        var usernameObj = document.getElementById("username");
        // [object HTMLInputElement] 它就是 dom 对象
        var usernameText = usernameObj.value;
        // 如何 验证 字符串,符合某个规则 ,需要使用正则表达式技术
        var patt = /^\w{5,12}$/;
        /*
        * test()方法用于测试某个字符串,是不是匹配我的规则 ,
        * 匹配就返回 true。不匹配就返回 false.
        * */
        var usernameSpanObj = document.getElementById("usernameSpan");
        // innerHTML 表示起始标签和结束标签中的内容
        // innerHTML 这个属性可读,可写
        usernameSpanObj.innerHTML = "国哥真可爱!";
        if (patt.test(usernameText)) {
        // alert("用户名合法!");
        // usernameSpanObj.innerHTML = "用户名合法!";
        usernameSpanObj.innerHTML = "<img src=\"right.png\" width=\"18\" height=\"18\">";
        } else {
        // alert("用户名不合法!");
        // usernameSpanObj.innerHTML = "用户名不合法!";
        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>
  • 正则表达式
整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$
只能输入数字:”^[0-9]*$”
只能输入n位的数字:”^\d{n}$”
只能输入至少n位的数字:”^\d{n,}$”
只能输入m~n位的数字:”^\d{m,n}$”
只能输入零和非零开头的数字:”^(0|[1-9][0-9]*)$”。
只能输入有两位小数的正实数:”^[0-9]+(.[0-9]{2})?$”。
只能输入有1~3位小数的正实数:”^[0-9]+(.[0-9]{1,3})?$”。
只能输入非零的正整数:”^\+?[1-9][0-9]*$”。
只能输入非零的负整数:”^\-[1-9][]0-9″*$。
只能输入长度为3的字符:”^.{3}$”。
只能输入由26个英文字母组成的字符串:”^[A-Za-z]+$”。
只能输入由26个大写英文字母组成的字符串:”^[A-Z]+$”。
只能输入由26个小写英文字母组成的字符串:”^[a-z]+$”。
只能输入由数字和26个英文字母组成的字符串:”^[A-Za-z0-9]+$”。
只能输入由数字、26个英文字母或者下划线组成的字符串:”^\w+$”。
验证用户密码:”^[a-zA-Z]\w{5,17}$”
正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。验证是否含有^%&’,;=?$\”等字符:”[^%&',;=?$\x22]+”。
只能输入汉字:”^[\u4e00-\u9fa5]{0,}$”
验证Email地址:”^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$”。
验证InternetURL:”^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$”。
验证电话号码:”^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$”
正确格式为:”XXX-XXXXXXX”、”XXXX-XXXXXXXX”、”XXX-XXXXXXX”、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX”。
验证身份证号(15位或18位数字):”^\d{15}|\d{18}$”。
验证一年的12个月:”^(0?[1-9]|1[0-2])$”
正确格式为:”01″~”09″和”1″~”12″。
验证一个月的31天:”^((0?[1-9])|((1|2)[0-9])|30|31)$”
正确格式为;”01″~”09″和”1″~”31″。
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)String.prototype.len=function(){return this.replace(/[^\x00-\xff]/g,”aa”).length;}
匹配空行的正则表达式:\n[\s| ]*\r
匹配html标签的正则表达式:<(.*)>(.*)<\/(.*)>|<(.*)\/>
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:String.prototype.trim = function(){return this.replace(/(^\s*)|(\s*$)/g, “”);}
利用正则表达式分解和转换IP地址:
下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:
function IP2V(ip){re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式
if(re.test(ip)){return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1}else{throw new Error(“Not a valid IP address!”)}}

不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:
var ip=”10.100.20.168″ip=ip.split(“.”)alert(“IP值是:”+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
利用正则表达式限制网页表单里的文本框输入内容:
用正则表达式限制只能输入中文:οnkeyup=”value=value.replace(/[^\u4E00-\u9FA5]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\u4E00-\u9FA5]/g,”))”
用正则表达式限制只能输入全角字符: οnkeyup=”value=value.replace(/[^\uFF00-\uFFFF]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\uFF00-\uFFFF]/g,”))”
用正则表达式限制只能输入数字:οnkeyup=”value=value.replace(/[^\d]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\d]/g,”))”
用正则表达式限制只能输入数字和英文:οnkeyup=”value=value.replace(/[\W]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\d]/g,”))”
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}评注:匹配形式如 0511-4405222 或 021-87888822匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用匹配特定数字:^[1-9]\d*$
//匹配正整数^-[1-9]\d*$
//匹配负整数^-?[1-9]\d*$
//匹配整数^[1-9]\d*|0$
//匹配非负整数(正整数 + 0)^-[1-9]\d*|0$
//匹配非正整数(负整数 + 0)^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$
//匹配正浮点数^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$
//匹配负浮点数^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
//匹配浮点数^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
//匹配非负浮点数(正浮点数 + 0)^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)评注:处理大量数据时有用,具体应用时注意修正匹配特定字符串:^[A-Za-z]+$
//匹配由26个英文字母组成的字符串^[A-Z]+$
//匹配由26个英文字母的大写组成的字符串^[a-z]+$
//匹配由26个英文字母的小写组成的字符串^[A-Za-z0-9]+$
//匹配由数字和26个英文字母组成的字符串^\w+$
//匹配由数字、26个英文字母或者下划线组成的字符串评注:最基本也是最常用的一些表达式整理出来的一些常用的正则表达式 所属分类: JScript
(三)
Email : /^\w+([-+.]\w+)*@\w+([-.]\\w+)*\.\w+([-.]\w+)*$/
isEmail1 : /^\w+([\.\-]\w+)*\@\w+([\.\-]\w+)*\.\w+$/;
isEmail2 : /^.*@[^_]*$/;
Phone : /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/
Mobile : /^((\(\d{3}\))|(\d{3}\-))?13\d{9}$/
Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\’:+!]*([^<>\"\"])*$/
IdCard : /^\d{15}(\d{2}[A-Za-z0-9])?$/
Currency : /^\d+(\.\d+)?$/
Number : /^\d+$/
Code : /^[1-9]\d{5}$/
QQ : /^[1-9]\d{4,8}$/
Integer : /^[-\+]?\d+$/
Double : /^[-\+]?\d+(\.\d+)?$/
English : /^[A-Za-z]+$/
Chinese : /^[\u0391-\uFFE5]+$/
UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\’\”]*)|.{0,5})$|\s/
PassWord :^[\\w]{6,12}$
ZipCode : ^[\\d]{6}/^(\+\d+ )?(\(\d+\) )?[\d ]+$/;

//这个是国际通用的电话号码判断/^(1[0-2]\d|\d{1,2})$/;
//这个是年龄的判断/^\d+\.\d{2}$/;
//这个是判断输入的是否为货币值
应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)String.prototype.len=function(){return this.replace([^\x00-\xff]/g,”aa”).length;}
应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:String.prototype.trim = function(){return this.replace(/(^\s*)|(\s*$)/g, “”);}
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?^\d+$  //
匹配非负整数(正整数 + 0)^[0-9]*[1-9][0-9]*$  //
匹配正整数^((-\d+)|(0+))$  //
匹配非正整数(负整数 + 0)^-[0-9]*[1-9][0-9]*$  //
匹配负整数^-?\d+$    //
匹配整数^\d+(\.\d+)?$  //
匹配非负浮点数(正浮点数 + 0)^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ //
匹配正浮点数^((-\d+(\.\d+)?)|(0+(\.0+)?))$  //
匹配非正浮点数(负浮点数 + 0)^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ //
匹配负浮点数^(-?\d+)(\.\d+)?$
  • 2.getElementsByName
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
    // 全选
    function checkAll() {
        // 让所有复选框都选中
        // document.getElementsByName();是根据 指定的 name 属性查询返回多个标签对象集合
        // 这个集合的操作跟数组 一样
        // 集合中每个元素都是 dom 对象
        // 这个集合中的元素顺序是他们在 html 页面中从上到下的顺序
        var hobbies = document.getElementsByName("hobby");
        // checked 表示复选框的选中状态。如果选中是 true,不选中是 false
        // checked 这个属性可读,可写
        for (var i = 0; i < hobbies.length; i++){
        hobbies[i].checked = true;
        }
    }
    //全不选
    function checkNo() {
        var hobbies = document.getElementsByName("hobby");
        // checked 表示复选框的选中状态。如果选中是 true,不选中是 false
        // checked 这个属性可读,可写
        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;
        // if (hobbies[i].checked) {
        // hobbies[i].checked = false;
        // }else {
        // hobbies[i].checked = true;
        // }
        }
}
</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>
  • 3.getElementsByTagName
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
    // 全选
    function checkAll() {
        // document.getElementsByTagName("input");
        // 是按照指定标签名来进行查询并返回集合
        // 这个集合的操作跟数组 一样
        // 集合中都是 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" checked="checked">C++
    <input type="checkbox" value="java">Java
    <input type="checkbox" value="js">JavaScript
    <br/>
    <button onclick="checkAll()">全选</button>
</body>
  • 节点常用的属性和方法(标签对象)
方法:
    通过具体的元素节点调用
    getElementsByTagName()
    方法,获取当前节点的指定标签名孩子节点
    appendChild( oChildNode )
    方法,可以添加一个子节点,oChildNode 是要添加的孩子节点
属性:
    childNodes
    属性,获取当前节点的所有子节点
    firstChild
    属性,获取当前节点的第一个子节点
    lastChild
    属性,获取当前节点的最后一个子节点
    parentNode
    属性,获取当前节点的父节点
    nextSibling
    属性,获取当前节点的下一个节点
    previousSibling
    属性,获取当前节点的上一个节点
    className
    用于获取或设置标签的 class 属性值
    innerHTML
    属性,表示获取/设置起始标签和结束标签中的内容
    innerText
    属性,表示获取/设置起始标签和结束标签中的文本
  • 4.createElement
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
    window.onload = function () {
        // 现在需要我们使用 js 代码来创建 html 标签,并显示在页面上
        // 标签的内容就是:<div>国哥,我爱你</div>
        var divObj = document.createElement("div"); // 在内存中 <div></div>
        var textNodeObj = document.createTextNode("国哥,我爱你"); // 有一个文本节点对象 #国哥,我
        爱你
        divObj.appendChild(textNodeObj); // <div>国哥,我爱你</div>
        // divObj.innerHTML = "国哥,我爱你"; // <div>国哥,我爱你</div>,但,还只是在内存中
        // 添加子元素
        document.body.appendChild(divObj);
    }
	</script>
</head>
<body>
</body>

3.Jquery

4.tomcat

1)简介

1.Tomcat:由 Apache 组织提供的一种 Web 服务器,提供对 jsp 和 Servlet 的支持。它是一种轻量级的 javaWeb 容器(服务
器),也是当前应用最广的 JavaWeb 服务器(免费)。
2.Jboss:是一个遵从 JavaEE 规范的、开放源代码的、纯 Java 的 EJB 服务器,它支持所有的 JavaEE 规范(免费)。
3.GlassFish: 由 Oracle 公司开发的一款 JavaWeb 服务器,是一款强健的商业服务器,达到产品级质量(应用很少)。
4.Resin:是 CAUCHO 公司的产品,是一个非常流行的服务器,对 servlet 和 JSP 提供了良好的支持,
性能也比较优良,resin 自身采用 JAVA 语言开发(收费,应用比较多)。
5.WebLogic:是 Oracle 公司的产品,是目前应用最广泛的 Web 服务器,支持 JavaEE 规范,
而且不断的完善以适应新的开发要求,适合大型项目(收费,用的不多,适合大公司)。

2)启动

1.找到 Tomcat 目录下的 bin 目录下的 startup.bat 文件,双击,就可以启动 Tomcat 服务器。
2.如何测试 Tomcat 服务器启动成功???
	打开浏览器,在浏览器地址栏中输入以下地址测试:
		1、http://localhost:8080
		2、http://127.0.0.1:8080
		3、http://真实 ip:8080
启动失败问题:
	常见的启动失败的情况有,双击 startup.bat 文件,就会出现一个小黑窗口一闪而来。
这个时候,失败的原因基本上都是因为没有配置好 JAVA_HOME 环境变量。
	常见的 JAVA_HOME 配置错误有以下几种情况:
		一:JAVA_HOME 必须全大写。
		二:JAVA_HOME 中间必须是下划线,不是减号-
		三:JAVA_HOME 配置的路径只需要配置到 jdk 的安装目录即可。不需要带上 bin 目录
方式2
	1、打开命令行
	2、cd 到 你的 Tomcat 的 bin 目录下
	3、敲入启动命令: catalina run

3)停止

1、点击 tomcat 服务器窗口的 x 关闭按钮
2、把 Tomcat 服务器窗口置为当前窗口,然后按快捷键 Ctrl+C
3、找到 Tomcat 的 bin 目录下的 shutdown.bat 双击,就可以停止 Tomcat 服务器(推荐)

4)修改端口号

1.找到 Tomcat 目录下的 conf 目录,找到 server.xml 配置文件。
2.标签Connector下,修改port值

5)部署

  • 方式1
1、在 webapps 目录下创建一个 book 工程:
2、把上午做的书城第一阶段的内容拷贝到里面:
2、把上午做的书城第一阶段的内容拷贝到里面:
3、如何访问 Tomcat 下的 web 工程。
	只需要在浏览器中输入访问地址格式如下:
	http://ip:port/工程名/目录下/文件名
  • 方式2
1.找到 Tomcat 下的 conf 目录\Catalina\localhost\ 下,创建如下的配置文件config.xml:
2.内容
	<!-- Context 表示一个工程上下文
		path 表示工程的访问路径:/abc
		docBase 表示你的工程目录在哪里
	-->
	<Context path="/config" docBase="E:\book" />
3.访问这个工程的路径如下:http://ip:port/config/ 就表示访问 E:\book 目录
注意事项:
	1.当我们在浏览器地址栏中输入访问地址如下:
		http://ip:port/ ====>>>> 没有工程名的时候,默认访问的是 ROOT 工程。
	2.当我们在浏览器地址栏中输入的访问地址如下:
		http://ip:port/工程名/ ====>>>> 没有资源名,默认访问 index.html 页面

6)IDEA 整合 Tomcat 服务器

  • 选择tomcat
1.操作的菜单如下:File | Settings | Build, Execution, Deployment | Application Servers
2.选择Tomcat Server 
3.选择本地tomcat文件
  • 创建动态javaWeb
1.创建一个新模块:module
2.选择jdk,tomcat,javaWeb包等信息
3.点击完成finsh即可
  • 添加jar包
方式1:
	1.创建一个Java enterprise
		1)如果没有Web Application,先创建
		2)右击工程名,选择Add freamwork support...
		3)添加web Application
	2.在web/WEB-INF下创建lib目录,存放jar包
	3.将jar复制进去,右击选择Add as library
	4.level选择Project library或者Module Library;然后选择Module
	5.在java代码中就可以使用jar包的类
方式2:
	点击file->Project Structure->Libraries->点+,选择java->选择项目中的jar包
  • 运行
1、建议修改 web 工程对应的 Tomcat 运行实例名称:
2、确认你的 Tomcat 实例中有你要部署运行的 web 工程模块:
3、你还可以修改你的 Tomcat 实例启动后默认的访问地址:
4、在 IDEA 中如何运行,和停止 Tomcat 实例。

5.servlet1

1)介绍

  • 什么是servlet
1、Servlet 是 JavaEE 规范之一。规范就是接口
2、Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
3、Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。

2)创建servlet

  • 手动实现 Servlet 程序
1、编写一个类去实现 Servlet 接口
2、实现 service 方法,处理请求,并响应数据
public class CreateServlet implements Servlet {
    /**
     * 方法是专门用来处理请求和响应的
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("创建servlet");
    }
3、到 web.xml 中去配置 servlet 程序的访问地址
    <!-- servlet 标签给 Tomcat 配置 Servlet 程序 -->
    <servlet>
        <!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) -->
        <servlet-name>CreateServlet</servlet-name>
        <!--servlet-class 是 Servlet 程序的全类名-->
        <servlet-class>day01_servletCreate.CreateServlet</servlet-class>
    </servlet>
    <!--servlet-mapping 标签给 servlet 程序配置访问地址-->
    <servlet-mapping>
        <!--servlet-name 标签的作用是告诉服务器,我当前配置的地址给哪个 Servlet 程序使用-->
        <servlet-name>CreateServlet</servlet-name>
        <!--url-pattern 标签配置访问地址 <br/>
            / 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径 <br/>
            /hello 表示地址为:http://ip:port/工程路径/hello <br/>
        -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
4.访问地址:http://localhost:8080/web1_war_exploded/hello
	控制台输出	"创建servlet"
  • 常见问题
1:url-pattern 中配置的路径没有以斜杠打头。
2:servlet-name 配置的值不存在
3:servlet-class 标签的全类名配置错误

3)Servlet生命周期

1、执行 Servlet 构造器方法
2、执行 init 初始化方法
	第一、二步,是在第一次访问,的时候创建 Servlet 程序会调用。
3、执行 service 方法
	第三步,每次访问都会调用。
4、执行 destroy 销毁方法
	第四步,在 web 工程停止的时候调用
  • GET 和 POST 请求的分发处理
//1.java代码
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String method = request.getMethod();
        if ("get".equalsIgnoreCase(method)){
            doGet();
        }else {
            doPost();
        }
    }
    private void doPost() {
        System.out.println("post请求");
    }

    private void doGet() {
        System.out.println("get请求");
    }
<!--2.创建servlet.xml-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="get" action="http://localhost:8080/web1_war_exploded/hello">
      <input type="submit" value="转换">
    </form>
</body>
</html>
3.启动tomcat
4.访问:http://localhost:8080/web1_war_exploded/servlet.html
5.点击按钮,跳转 http://localhost:8080/web1_war_exploded/hello
6.控制台打印 "get请求"

4)HttpServlet实现Servlet(常用)

//1.java代码
public class CreateHttpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get请求");
    }
    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post请求");
    }
}
2.web.xml
    <servlet>
        <servlet-name>httpServlet</servlet-name>
        <servlet-class>day01_servletCreate.CreateHttpServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>httpServlet</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>
3.servlet.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="get" action="http://localhost:8080/web1_war_exploded/hello2">
      <input type="submit" value="转换">
    </form>
</body>
</html>
4.启动tomcat
5.访问:http://localhost:8080/web1_war_exploded/servlet.html
6.点击按钮,跳转 http://localhost:8080/web1_war_exploded/hello
7.控制台打印 "get请求"
  • 使用 IDEA 创建 Servlet 程序(快捷)
包名右击,new -> servlet -> 填写name,全类名点击确定(注意最下面勾选,生成注解,不需要配置xml)

5)Servlet 类的继承体系

1.Servlet(接口)
    只负责定义servlet程序的规范
2.GenericServlet(类)
    实现了Servlet接口,做了很多空实现
    并持有一个ServletConfig类的引用,对其使用了一些方法
3.HttpServlet(类)
    实现service()方法,并实现get,post分发请求(会抛出错误异常)
4.自定义Servlet类
    根据需求重写doGet()方法或者doPost()方法

6)ServletConfig类

  • 三大作用
1、可以获取 Servlet 程序的别名 servlet-name 的值
2、获取初始化参数 init-param
3、获取 ServletContext 对象
1.java代码
public class CreateHttpServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        //servlet别名:httpServlet
        System.out.println("servlet别名:" + config.getServletName());
        //初始化username值:root
        System.out.println("初始化username值:" + config.getInitParameter("username"));
        //初始化url值:jdba:mysql://localhost:3306?test
        System.out.println("初始化url值:" + config.getInitParameter("url"));
        //servletd对象:org.apache.catalina.core.ApplicationContextFacade@e0262e
        System.out.println("servletd对象:" + config.getServletContext());
    }
}
2.web.xml
	<servlet>
        <servlet-name>httpServlet</servlet-name>
        <servlet-class>day01_servletCreate.CreateHttpServlet</servlet-class>
        <!--    初始化-->
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>url</param-name>
            <param-value>jdba:mysql://localhost:3306?test</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>httpServlet</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>
  • 注意事项
1.Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
	Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对
象。
2.重写了init方法,一定要调用父类的init(ServletConfig config)方法		//注意

7)ServletContext对象

  • 什么是ServletContext
1、ServletContext 是一个接口,它表示 Servlet 上下文对象
2、一个 web 工程,只有一个 ServletContext 对象实例。(启动时创建,停止时销毁)
3、ServletContext 对象是一个域对象。
4、ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁。

什么是域对象?
	域对象,是可以像 Map 一样存取数据的对象,叫域对象。
	这里的域指的是存取数据的操作范围,整个 web 工程。

存数据

取数据

删数据

map

put()

get()

remove()

域对象

setAttribute()

getAttribute()

removeAttribue();

  • ServletContext 类的四个作用
1、获取 web.xml 中配置的上下文参数 context-param
2、获取当前的工程路径,格式: /工程路径
3、获取工程部署后在服务器硬盘上的绝对路径
4、像 Map 一样存取数据
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        javax.servlet.ServletContext servletContext = getServletConfig().getServletContext();

        //上下文路径1:monkey
        System.out.println("上下文路径1:"+servletContext.getInitParameter("name"));
        //上下文路径2:1234
        System.out.println("上下文路径2:"+servletContext.getInitParameter("password"));
        //工程路径:/web1_war_exploded
        System.out.println("工程路径:"+servletContext.getContextPath());
        //lib文件路径:D:\ideaProject\javaWeb\out\artifacts\web1_war_exploded\lib
        System.out.println("lib文件路径:"+servletContext.getRealPath("/lib"));
        //部署路径:D:\ideaProject\javaWeb\out\artifacts\web1_war_exploded\
        System.out.println("部署路径:"+servletContext.getRealPath("/"));


    }
<!--context-param 是上下文参数(它属于整个 web 工程)-->
	<context-param>
        <param-name>name</param-name>
        <param-value>monkey</param-value>
    </context-param>
     <context-param>
        <param-name>password</param-name>
        <param-value>1234</param-value>
    </context-param>
//存取数据域
public class ServletContext1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        //(1)第一次执行,保存之前:获取域数据key值:null
        //(2)第二次刷新,保存之前:获取域数据key值:value
        System.out.println("保存之前:获取域数据key值:"+ servletContext.getAttribute("key"));

        servletContext.setAttribute("key", "value");
        //获取域数据key值:value
        System.out.println("获取域数据key值:"+ servletContext.getAttribute("key"));
    }

8)HTTP协议

  • 介绍
协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫协议。

所谓 HTTP 协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫 HTTP 协议。HTTP 协议中的数据又叫报文。
  • 请求格式
客户端给服务器发送数据叫请求。
服务器给客户端回传数据叫响应。

请求又分为 GET 请求,和 POST 请求两种
  • GET请求
1、请求行
	(1) 请求的方式 						GET
	(2) 请求的资源路径[+?+请求参数]
	(3) 请求的协议的版本号 				HTTP/1.1
2、请求头(key : value 组成 不同的键值对,表示不同的含义)
	(1) Accept:告诉服务器,客户端可以接受那些类型的数据
	(2) Accept-Language:告诉服务器,可以接收的语言类型
			zh_CH	中文
			en_US 	英文
	(3) User-Agent: 浏览器的信息
	(4) Accept—Encoding:客户端可以接受的数据编码(压缩)格式
	(5) Host:请求服务器的ip和端口号
	(6) Connection:告诉服务器请求连接如何处理
			Keep-Alive:服务器回传数据,不马上关闭,保持一段时间的连接
			Close:马上关闭
  • POST请求
1、请求行
	(1) 请求的方式 						POST
	(2) 请求的资源路径请求体
	(3) 请求的协议的版本号 				HTTP/1.1
2、请求头(key : value 组成 不同的键值对,表示不同的含义)
	(1) Accept:告诉服务器,客户端可以接受那些类型的数据
	(2) Accept-Language:告诉服务器,可以接收的语言类型
			zh_CH	中文
			en_US 	英文
	(3) Referer: 地址栏中的地址url
	(4) User-Agent: 浏览器的信息
	(4) Context-type:表示发送数据的类型
			application/x-www-form-ur|encoded
				格式:name=monkey&id=1,然后对url编码
			multipart/form-data
				以多段的形式提交给服务器(以流的形式,用于上传)
	(5) Context-length:表示发送数据的长度
	(6) Cache—Control:表示如何控制缓存 	no-cache表示无缓存
3、空行
4、请求体(就是发送给服务器的数据)
  • 常见GET请求
1、form 标签 method=get
2、a 标签
3、link 标签引入 css
4、Script 标签引入 js 文件
5、img 标签引入图片
6、iframe 引入 html 页面
7、在浏览器地址栏中输入地址后敲回车
  • 常见POST请求
8、form 标签 method=post
  • 响应请求
1、响应行
    (1) 响应的协议和版本号		HTTP/1.1
    (2) 响应状态码			  200
    (3) 响应状态描述符			 OK
2、响应头
(1) key : value 不同的响应头,有其不同含义
空行
3、响应体 ---->>> 就是回传给客户端的数据
  • 常用的响应码说明
200 表示请求成功
302 表示请求重定向(明天讲)
404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)
500 表示服务器已经收到请求,但是服务器内部错误(代码错误)
  • MIME 类型说明
MIME 是 HTTP 协议中数据类型。
MIME 的英文全称是"Multipurpose Internet Mail Extensions" 多功能 Internet 邮件扩充服务。MIME 类型的格式是“大类型/小
类型”,并与某一种文件的扩展名相对应。

6.Servlet2

1)HttpServletRequest 类

每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。
然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的
信息。
  • HttpServletRequest 类的常用方法
i. getRequestURI() 					获取请求的资源路径
ii. getRequestURL() 				获取请求的统一资源定位符(绝对路径)
iii. getRemoteHost()				获取客户端的 ip 地址
iv. getHeader() 					获取请求头
v. getParameter() 					获取请求的参数
vi. getParameterValues() 			获取请求的参数(多个值的时候使用)
vii. getMethod() 					获取请求的方式 GET 或 POST
viii. setAttribute(key, value); 	设置域数据
ix. getAttribute(key); 				获取域数据
x. getRequestDispatcher() 			获取请求转发对象
  • 一般方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.URI:/web1_war_exploded/servlet1
        System.out.println("URI:"+request.getRequestURI());
        //2.URL:http://localhost:8080/web1_war_exploded/servlet1
        System.out.println("URL:"+request.getRequestURL());
        //3.ip:127.0.0.1
        System.out.println("ip:"+request.getRemoteHost());
        //4.方法:GET
        System.out.println("方法:"+request.getMethod());
        //5.请求头:Mozilla/5.0 (Windows NT 10.0; Win64; x64)
        // AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
        System.out.println("请求头:"+request.getHeader("User-Agent"));
    }
  • 获取请求参数
<form action="http://localhost:8080/web1_war_exploded/servlet1" method="post">
        姓名:<input type="text" name="name"><br>
        密码:<input type="password" name="password"><BR>
        <input type="checkbox" name="hobby" >C++
        <input type="checkbox" name="hobby">Java
        <input type="checkbox" name="hobby">Python<br>
        <input type="submit">

    </form>
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        //1.获取name参数:李云龙
        System.out.println("获取name参数:"+request.getParameter("name"));
        //2.获取password参数:1234
        System.out.println("获取password参数:"+request.getParameter("password"));
        //3.获取多个参数:[on, on]
        System.out.println("获取多个参数:"+ Arrays.asList(request.getParameterValues("hobby")));
    }
  • 中文乱码问题
request.setCharacterEncoding("utf-8");
  • 请求的转发
1.什么是请求的转发?
	请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。
2.特点
	浏览器地址栏没有变化
	是一次请求
	他们共享Request域中的数据
	可以转发到WEB_INF目录下
	不可以访问工程以外的资源
1.servlet1:
	    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取请求的参数(办事的材料)查看
        String name = request.getParameter("name");
        System.out.println("servlet1:"+name);
        //给材料 盖一个章,并传递到 Servlet2(柜台 2)去查看
        request.setAttribute("key1", "柜台一的章");
        // 问路:Servlet2(柜台 2)怎么走
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet2");
        // 走向 Sevlet2(柜台 2)
        requestDispatcher.forward(request, response);
    }
2.servlet2:
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取请求的参数(办事的材料)查看
        String name = request.getParameter("name");
        System.out.println("servlet2:"+name);
        //给材料 盖一个章,并传递到 Servlet2(柜台 2)去查看
        Object key1 = request.getAttribute("key1");
        System.out.println("张:"+key1);
        //处理
        System.out.println("处理");
    }
输出:
	servlet1:monkey
	servlet2:monkey
	张:柜台一的章
	处理
  • base 标签的作用
base 标签设置页面相对路径工作时参照的地址
href 属性就是参数的地址值
  • Web 中的相对路径和绝对路径
1.相对路径是:
	. 表示当前目录
	.. 表示上一级目录
	资源名 表示当前目录/资源名
2.绝对路径:
	http://ip:port/工程路径/资源路径

3.在实际开发中,路径都使用绝对路径,而不简单的使用相对路径。
	1、绝对路径
	2、base+相对
  • web 中 / 斜杠的不同意义
1/在 web 中 / 斜杠 是一种绝对路径。
2./ 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/
	<a href="/">斜杠</a>
3./ 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径
	1、<url-pattern>/servlet1</url-pattern>
	2、servletContext.getRealPath(“/”);
	3、request.getRequestDispatcher(“/”);

特殊情况: response.sendRediect(“/”); 把斜杠发送给浏览器解析。得到 http://ip:port/

2)HttpServletResponse类

  • 说明
1.HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传
递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,
	我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
	2.两个输出流的说明
		字节流 getOutputStream(); 常用于下载(传递二进制数据)
		字符流 getWriter(); 常用于回传字符串(常用)
			两个流同时只能使用一个。
			使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。
  • 如何往客户端回传数据
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
    // 要求 : 往客户端回传 字符串 数据。
    PrintWriter writer = resp.getWriter();
	writer.write("response's content!!!");
}
  • 中文乱码问题
1.解决响应中文乱码方案一(不推荐使用)
	// 通过响应头,设置浏览器也使用 UTF-8 字符集
	resp.setHeader("Content-Type", "text/html; charset=UTF-8");
2.解决响应中文乱码方案二(推荐)
	// 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
	// 此方法一定要在获取流对象之前调用才有效
	resp.setContentType("text/html; charset=UTF-8");

3)请求重定向

1.请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求
重定向(因为之前的地址可能已经被废弃)。
2.特点
	浏览器地址栏会发生变化
	两次请求
	不共享Request域中的数据
	不能访问WEB-INF下的资源
	可以访问工程以外的资源
  • 请求重定向的第一种方案
// 设置响应状态码 302 ,表示重定向,(已搬迁)
resp.setStatus(302);
// 设置响应头,说明 新的地址在哪里
resp.setHeader("Location", "http://localhost:8080");
  • 请求重定向的第二种方案(推荐使用):
resp.sendRedirect("http://localhost:8080");

7.jsp

1)ServletContextListener 监听器

ervletContextListener 它可以监听 ServletContext 对象的创建和销毁。
ServletContext 对象在 web 工程启动的时候创建,在 web 工程停止的时候销毁。
监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈。
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 对象被销毁了");
    }
}
<!--配置监听器-->
<listener>
	<listener-class>com.atguigu.listener.MyServletContextListenerImpl</listener-class>
</listener>