java 基础
语言基础一
数据类型
1.基本类型
byte ->short-> int-> long-> float-> double-> char-> boolean
1->2->4->8 4->8->2->1
如果数据较大时,使用long ,需要在数值后面加“L”
2.引用类型
字符串 string
思考:
3.类型转换
自动类型转换:
1.两种类型相互转换
2.目标类型大于源类型
3.1基本类型的转换
自动转换类型:
1.两种类型要兼容
2.目标类型要大于源类型
byte的数据可以放到short类型当中的
3.2强制类型转化
1.两种类型要兼容
2.目标类型要小于源类型 (高转低)
类型转换(3)
4.运算符
4.1运算符1. +±-
4.2运算符2. +±-
5.原码,反码,补码
正数 原码反码补码都一样
负数 :
原码符号位为1
反码符号位不变,其它取反
补码 在反码的基础上加一
6.赋值运算符
运算符
物极必反
7.关系运算符
public class Demo02 {
public static void main(String[] args) {
int num1=10;
int num2=10;
//关系运算符,返回的是布尔值
System.out.println(num1>num2);
System.out.println(num1<num2);
System.out.println(num1==num2);
System.out.println(num1!=num2);
}
}
s
false
false
true
false
Process finished with exit code 0
8.逻辑运算符
package com.xing.a;
public class 逻辑运算符 {
public static void main(String[] args) {
//逻辑运算符:两个boolean类型的操作数或表达式进行逻辑比较
//&& 短路与
//||短路或
//!非
//&逻辑与
//|逻辑或
System.out.println("-----------&&-------------");
System.out.println(true&&true);
System.out.println(true&&false);
System.out.println("-----------||-------------");
System.out.println(true||false);
System.out.println(false||false);
System.out.println("-----------||-------------");
System.out.println(!true);
}
}
-----------&&-------------
true
false
-----------||-------------
true
false
-----------||-------------
false
Process finished with exit code 0
短路与&& 一旦前边为false ,后面便不再执行了(重点)
短路与(&&) 效率高于逻辑与(&)
9.三元运算符
package com.xing.a;
public class 三元运算符 {
public static void main(String[] args) {
//三目运算符:
// 布尔表达式?结果1:结果2
int score=90;
String level= score>=90 ? "优秀":"一般";
System.out.println(level);
}
}
优秀
Process finished with exit code 0
10.位运算符
使用的是二进制 ,最后结果是5
101
+111
111 =5
结果为:010 ===》2
10.右移 >>
右移效率高于除运算
右移32 相当于没移动 移动为32 的倍数,也相当于没移动
11.优先级和结合性
结合性 理解
三目运算符,有些特殊
赋值运算符也有点特殊
具体如下:
多年的精华和经验,全告诉你: 先16 之后再 6,两个再乘数,这是计算机的执行机制,计算机的执行机制和人不一样的
12.表达式
13.控制台输入
package com.xing.a;
import java.util.Scanner;
public class 控制台输入 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入您的大名");
String name = input.next();
System.out.println("请输入您的年龄");
int age = input.nextInt();
System.out.println("请输入您的身高");
double height = input.nextDouble();
System.out.println("请输入您的性别");
char gender = input.next().charAt(0);
System.out.println("姓名:"+name+" 年龄:"+age+" 身高:"+height+" 性别:"+gender);
}
}
请输入您的大名
邢福豪
请输入您的年龄
22
请输入您的身高
178.8
请输入您的性别
男
姓名:邢福豪 年龄:22 身高:178.8 性别:男
Process finished with exit code 0
inputmismatchexception:输入不匹配异常
小结
语言基础二
选择结构
程序的三种结构:
1.顺序结构
2.选择机构
3.循环结构
1.1基本if选择结构
1.2 if else选择结构
字符串不能用等号==
而是用equals
package com.xing.a;
import java.util.Scanner;
public class IfElse {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("是否中了500万?y/n");
String answer = input.next();
if(answer.equals("y")){
System.out.println("买车,买房,孝顺父母");
}
else {
System.out.println("努力学习,好好工作,挣大钱,买车,买房,孝顺父母");
}
}
}
是否中了500万?y/n
y
买车,买房,孝顺父母
Process finished with exit code 0
package com.xing.a;
import java.util.Scanner;
import static java.lang.Math.random;
public class 中奖预测 {
public static void main(String[] args) {
//输入四位数,取百位整数,产生随机数字即为会员,恭喜你中奖了,否则没中奖
Scanner input = new Scanner(System.in);
System.out.println("请输入您的会员号:");
int card = input.nextInt();
int bai=card/100%10;
int ran=(int)(Math.random()*10); //因为随机数为0到1的数,所以乘10来使用
if (bai==ran){
System.out.println("恭喜您中奖了....");
}else {
System.out.println("谢谢惠顾");
}
System.out.println("===========");
System.out.println(bai);
System.out.println(ran);
}
}
请输入您的会员号:
8848
恭喜您中奖了....
===========
8
8
请输入您的会员号:
0116
恭喜您中奖了....
===========
1
1
Process finished with exit code 0
1.3多重选择
package com.xing.demo;
import java.util.Scanner;
public class 多重选择 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入您的积分:");
int score = input.nextInt();
if(score>=10000){
System.out.println("钻石玩家");
}else if(score>=5000){
System.out.println("白金玩家");
}else if(score>=1000){
System.out.println("青铜玩家");
}else {
System.out.println("普通玩家");
}
}
}
请输入您的积分:
10
普通玩家
Process finished with exit code 0
2.嵌套if选择结构
package com.xing.demo;
import java.util.Scanner;
public class 嵌套if选择 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入您的性别:");
char gender = input.next().charAt(0);
if(gender=='女') {
System.out.println("请输入年龄:");
int age = input.nextInt();
if(age>18){
System.out.println("女士你好");
}else {
System.out.println("小姐姐你好");
}
}else {
System.out.println("帅哥你好");
}
}
}
请输入您的性别:
女
请输入年龄:
16
小姐姐你好
Process finished with exit code 0
请输入您的性别:
男
帅哥你好
Process finished with exit code 0
请输入您的性别:
女
请输入年龄:
22
女士你好
Process finished with exit code 0
3.switch语句(非常重要)前端框架高频使用
只能做等值判断
package com.xing.demo;
import java.util.Scanner;
public class switch多重选择 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入您的名次");
int num = input.nextInt();
switch (num){
case 1:
System.out.println("奖励一部iPhone13");
break;
case 2:
System.out.println("奖励一个机械键盘");
break;
case 3:
System.out.println("奖励一个优盘");
break;
default:
System.out.println("奖励一张彩票");
break;
}
}
}
请输入您的名次
6
奖励一张彩票
Process finished with exit code 0
请输入您的名次
1
奖励一部iPhone13
Process finished with exit code 0
3.1 switch实现一个计算器操作
package com.xing.demo;
import java.util.Scanner;
public class switch计算器 {
public static void main(String[] args) {
//使用switch实现计算器操作
Scanner input = new Scanner(System.in);
System.out.println("请输入第一个数字");
int num1 = input.nextInt();
System.out.println("请输入第二个数字");
int num2 = input.nextInt();
System.out.println("请输入一个运算符");
String ope = input.next();
int result=0;
switch (ope){
case "+":
result=num1+num2;
break;
case "-":
result=num1-num2;
break;
case "*":
result=num1*num2;
break;
case "/":
if(num2==0){
System.out.println("被除数不能为0");
}else {
result=num1/num2;
}
break;
}
System.out.println("结果是: "+result);
}
}
请输入第一个数字
6
请输入第二个数字
2
请输入一个运算符
-
结果是: 4
Process finished with exit code 0
请输入第一个数字
10
请输入第二个数字
0
请输入一个运算符
/
被除数不能为0
结果是: 0
Process finished with exit code 0
请输入第一个数字
10
请输入第二个数字
2
请输入一个运算符
*
结果是: 20
Process finished with exit code 0
case穿透
3.2switch 实现月份天数查看
package com.xing.demo;
import java.util.Scanner;
public class Switch月份天数 {
public static void main(String[] args) {
System.out.println("请输入一个月份");
Scanner input = new Scanner(System.in);
int month = input.nextInt();
switch (month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println(month+"月有31天");
break;
case 2:
System.out.println(month+"月有28天");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println(month+"月有30天");
break;
default:
System.out.println("输入有误,请重新输入");
break;
}
}
}
请输入一个月份
11
11月有30天
Process finished with exit code 0
请输入一个月份
2
2月有28天
Process finished with exit code 0
4.变量分类
局部变量:在方法内
成员变量:方法外(又叫静态(类)变量或实例变量)
循环结构
程序中的循环
while循环
package com.xing.demo;
public class while循环操作 {
public static void main(String[] args) {
//while循环操作的使用
int num=0; //1.循环初始化
while (num<100){ //2.循环条件
//3.循环操作
System.out.println("while循环"+num);
//4.迭代部分
num++;
}
}
}
while循环96
while循环97
while循环98
while循环99
Process finished with exit code 0
循环结构是编程中使用最高的。先判断,再执行。用于循环次数明确的情况
while的特点
do while
先执行 后判断
package com.xing.demo;
/*使用 do while 循环打印100 遍hello world*/
public class Demo22 {
public static void main(String[] args) {
//特点:先执行,再判断条件 ,无论条件成立与否,都会执行一次
int n=1; //循环初始化
do {
System.out.println("循环"+n); //循环操作
n++; //迭代部分
}while (n<100); //循环条件
}
}
...
循环91
循环95
循环96
循环97
循环98
循环99
Process finished with exit code 0
循环结构
1.根据学生作业完成情况,输入教学评语,决定学生是否需要抄写代码。
package com.xing.demo;
import java.util.Scanner;
public class 检查学生成绩 {
public static void main(String[] args) {
//根据学生作业完成情况,输入教学评语,决定学生是否需要抄写代码。
Scanner input = new Scanner(System.in);
String answer;
do{
System.out.println("开始抄写作业代码");
System.out.println("请输入评语?y/n");
answer = input.next();
}while (!answer.equals("y"));
System.out.println("恭喜通过了...");
}
}
开始抄写作业代码
请输入评语?y/n
sjj
开始抄写作业代码
请输入评语?y/n
y
恭喜通过了...
Process finished with exit code 0
2.do while 循环女朋友案例
package com.xing.demo;
import java.util.Scanner;
public class 女朋友dowehile循环 {
public static void main(String[] args) {
//女朋友dowehile循环
Scanner input = new Scanner(System.in);
String answer;
do{
System.out.println("做我女朋友好不好?");
System.out.println("什么事情不会让你百分之百满意,那几分不满意,让你知道不过如此,没什么可骄傲了");
System.out.println("回答?:y/n");
answer = input.next();
}while (!answer.equals("y"));
System.out.println("不如意,让你知道,天外有天,人外有人,要一辈子,保持谦卑,喜怒哀乐,平和以对,不可过度");
System.out.println("恭喜你脱单了!");
}
}
做我女朋友好不好?
什么事情不会让你百分之百满意,那几分不满意,让你知道不过如此,没什么可骄傲了
回答?:y/n
n
做我女朋友好不好?
什么事情不会让你百分之百满意,那几分不满意,让你知道不过如此,没什么可骄傲了
回答?:y/n
y
不如意,让你知道,天外有天,人外有人,要一辈子,保持谦卑,喜怒哀乐,平和以对,不可过度
恭喜你脱单了!
Process finished with exit code 0
for 循环
1.语法
for(初始条件;循环条件;迭代部分){
//循环操作
}
package com.xing.demo;
public class for循环的使用 {
//for循环的使用
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println("hello world");
System.out.println("不要再浪费时间在无意义的地方上");
}
}
}
不要再浪费时间在无意义的地方上
hello world
不要再浪费时间在无意义的地方上
hello world
不要再浪费时间在无意义的地方上
Process finished with exit code 0
2.for循环五名同学平均分
package com.xing.demo;
import java.util.Scanner;
public class for循环五名同学平均分 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int sum=0;
for (int i = 0; i < 5; i++) {
System.out.println("请输入第"+(i+1)+"个同学成绩");
int score = input.nextInt();
sum+=score;
}
double avg =(double) sum / 5;
System.out.println("平均分是:"+avg);
}
}
请输入第1个同学成绩
1
请输入第2个同学成绩
2
请输入第3个同学成绩
3
请输入第4个同学成绩
4
请输入第5个同学成绩
5
平均分是:3.0
Process finished with exit code 0
3.break语句的使用
作用:跳出,终止switch和循环
package com.xing.demo;
public class break语句 {
/*## 3.break语句的使用
作用:跳出,终止switch和循环
*/
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("i="+i);
if(i==5){
break; //跳出循环
}
}
System.out.println("程序结束了");
}
}
i=0
i=1
i=2
i=3
i=4
i=5
程序结束了
4.长跑中途退出例子
package com.xing.demo;
import java.util.Scanner;
public class 长跑中途退出例子 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String answer;
int count=0;
do {
count++;
System.out.println("小张开始跑:"+count+"圈");
System.out.println("=================");
System.out.println("小张跑完了:"+count+"圈");
System.out.println("还能坚持吗?y/n");
answer = input.next();
if(!answer.equals("y")){
break;//跳出循环
}
}while (count<10);
System.out.println("比赛结束了,小张共跑了:"+count+"圈");
}
}
小张开始跑:1圈
=================
小张跑完了:1圈
还能坚持吗?y/n
y
小张开始跑:2圈
=================
小张跑完了:2圈
还能坚持吗?y/n
y
小张开始跑:3圈
=================
小张跑完了:3圈
还能坚持吗?y/n
y
小张开始跑:4圈
=================
小张跑完了:4圈
还能坚持吗?y/n
y
小张开始跑:5圈
=================
小张跑完了:5圈
还能坚持吗?y/n
y
小张开始跑:6圈
=================
小张跑完了:6圈
还能坚持吗?y/n
y
小张开始跑:7圈
=================
小张跑完了:7圈
还能坚持吗?y/n
y
小张开始跑:8圈
=================
小张跑完了:8圈
还能坚持吗?y/n
n
比赛结束了,小张共跑了:8圈
Process finished with exit code
5.continue:结束本次循环,继续执行下一次循环
continue:结束本次循环,继续执行下一次循环
package com.xing.demo;
public class continue结束本次循环继续执行下一次循环 {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
if(i==5){
continue;
}
System.out.println("i:"+i);
}
System.out.println("程序结束了");
}
}
i:0
i:1
i:2
i:3
i:4
i:6
i:7
i:8
i:9
程序结束了
package com.xing.demo;
import java.util.Scanner;
public class 口渴喝水继续跑 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String answer;
int count=0;
do {
count++;
System.out.println("开始跑:"+count+"圈");
System.out.println("=================");
System.out.println("跑完了:"+count+"圈");
System.out.println("口渴吗?y/n");
answer = input.next();
if(!answer.equals("y")){
continue;//跳出本次循环
}
System.out.println("喝水----------->");
}while (count<10);
}
}
跑完了:2圈
口渴吗?y/n
y
喝水----------->
开始跑:3圈
=================
跑完了:3圈
口渴吗?y/n
6.喝酒令
遇到7,7的倍数跳过去,一行显示6个
package com.xing.demo;
public class 喝酒令 {
//遇到7,7的倍数跳过去,一行显示6个
public static void main(String[] args) {
int count=0; //计数器
for (int i = 1; i < 100; i++) {
if(i%7==0||1%10==7||i/10==7){
continue;
}
System.out.print(i+"\t");
count++;
if(count%6==0){
System.out.println();
}
}
}
}
1 2 3 4 5 6
8 9 10 11 12 13
15 16 17 18 19 20
22 23 24 25 26 27
29 30 31 32 33 34
36 37 38 39 40 41
43 44 45 46 47 48
50 51 52 53 54 55
57 58 59 60 61 62
64 65 66 67 68 69
80 81 82 83 85 86
87 88 89 90 92 93
94 95 96 97 99
Process finished with exit code 0
嵌套循环
二重循环
1.三行5星
package com.xing.work;
//打印三行5星
public class 嵌套循环 {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
System.out.println("*****");
}
}
}
*****
*****
*****
Process finished with exit code 0
control+shift+R 为运行当前项目快捷键,省去更多的功夫
package com.xing.work;
//打印三行5星
public class 嵌套循环 {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) { //外层控制循环次数
for (int i1 = 0; i1 < 5; i1++) { //内存循环控制单次循环操作
System.out.print("***111");
}
System.out.println();
}
}
}
***111***111***111***111***111
***111***111***111***111***111
***111***111***111***111***111
Process finished with exit code 0
2.三班5名学生成绩个数
package com.xing.work;
import java.util.Scanner;
public class 三班5名同学平均成绩 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
for (int i = 1; i <= 3; i++) {
int sum=0;
for (int i1 = 1; i1 <= 5; i1++) {
System.out.println("请输出第"+i+"个班级,第"+i1+"个同学成绩");
int score = input.nextInt();
sum+=score;
}
double avg=(double) sum/5;
System.out.println("第"+i+"个班级的平均分:"+avg);
}
}
}
请输出第1个班级,第1个同学成绩
88
请输出第1个班级,第2个同学成绩
99
请输出第1个班级,第3个同学成绩
98
请输出第1个班级,第4个同学成绩
89
请输出第1个班级,第5个同学成绩
99
第1个班级的平均分:94.6
3.打印直角三角形
package com.xing.work;
import java.util.Scanner;
public class 打印直角三角形 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入行数:");
int n = input.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
请输入行数:
6
*
**
***
****
*****
******
Process finished with exit code 0
package com.xing.work;
import java.util.Scanner;
public class 打印等腰三角形 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入行数:");
int n = input.nextInt();
for (int i = 1; i <= n; i++) {
//空格
for (int k = 1; k <= n-i; k++) {
System.out.print(" ");
}
//星号
for (int j = 1; j <= i*2-1; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
请输入行数:
6
*
***
*****
*******
*********
***********
4.ATM自助银行服务
package com.xing.work;
import java.util.Scanner;
public class ATM自助银行服务 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
boolean flag=true;
do{
System.out.println("=========欢迎光临ATM自助银行服务=================");
System.out.println("====1.开户 2.存钱 3.取钱 4.转账 5.查询余额 6.修改密码 0.退出================");
System.out.println("请输入");
int choice = input.nextInt();
switch (choice){
case 1:
System.out.println("--执行开户功能--");
break;
case 2:
System.out.println("--执行存钱功能--");
break;
case 3:
System.out.println("--执行取钱功能--");
break;
case 4:
System.out.println("--执行转账功能--");
break;
case 5:
System.out.println("--执行查询余额功能--");
break;
case 6:
System.out.println("--执行修改密码功能--");
break;
case 0:
flag=false;
System.out.println("--执行退出功能--");
break;
default:
System.out.println("输入有误,请重新输入");
break;
}
}while (flag);
System.out.println("欢迎下次光临!");
}
}
=========欢迎光临ATM自助银行服务=================
====1.开户 2.存钱 3.取钱 4.转账 5.查询余额 6.修改密码 0.退出================
请输入
1
--执行开户功能--
=========欢迎光临ATM自助银行服务=================
====1.开户 2.存钱 3.取钱 4.转账 5.查询余额 6.修改密码 0.退出================
请输入
6
--执行修改密码功能--
=========欢迎光临ATM自助银行服务=================
====1.开户 2.存钱 3.取钱 4.转账 5.查询余额 6.修改密码 0.退出================
请输入
8
输入有误,请重新输入
=========欢迎光临ATM自助银行服务=================
====1.开户 2.存钱 3.取钱 4.转账 5.查询余额 6.修改密码 0.退出================
请输入
0
--执行退出功能--
欢迎下次光临!
Process finished with exit code 0
5.打印100以内的素数
package com.xing.work;
public class 打印100以内的素数 {
public static void main(String[] args) {
int count=0;
for (int i = 2; i <= 100; i++) {
boolean flag=true; //假如所有的数都是素数
for (int j = 2; j <i ; j++) {
if(i%j==0){ //说明不是素数
flag=false;
break;
}
}
if(flag){
System.out.print(i+"\t");
count++;
if(count%5==0){
System.out.println();
}
}
}
}
}
2 3 5 7 11
13 17 19 23 29
31 37 41 43 47
53 59 61 67 71
73 79 83 89 97
1.方法
实现特定功能的一段代码,可反复使用
语法定义:
权限修饰符 返回值类型 方法名(){
//方法主体功能代码
return value; //返回值
}
经验:将需要在多个位置重复使用的一组代码,定义在方法内部
1.方法调用
在需要执行方法代码的位置,通过方法名进行调用。
注意:调用方法时,会优先执行方法内部代码,结束后,返回到方法调用处,继续向下执行
2.返回值类型
规定的返回值类型 :
基本(byte short int long float double char boolean)
引用类型
void :无返回值类型
3.return :返回结果,结束方法
3.1一个方法只能返回一个结果
3.2如果有分支,必须都要有返回值
3.3应用在没有返回值类型(void)的方法中
结束方法的作用
4.方法小结
一个类可以定义多个方法,方法之间属于并列关系,不可以嵌套
经验:一个方法只做一件事
好处:
减少代码冗余
提高复用性
提高可读性
提高可维护性
package com.xing.work;
public class 方法的返回值 {
public static void main(String[] args) {
//return :返回结果,结束方法
int a=add(1,2);
System.out.println(a);
}
public static int add(int x,int y){
int result=x+y;
return result;//1返回结果,2结束方法 一个方法只能返回一个结果
}
}
3
package com.xing.work;
public class 方法的返回值 {
public static void main(String[] args) {
//return :返回结果,结束方法
int a=add(1,2);
System.out.println(a);
int b=compare(2,3);
System.out.println("b=============:"+b);
}
public static int add(int x,int y){
int result=x+y;
return result;//1返回结果,2结束方法 一个方法只能返回一个结果
}
//定义方法有两个,返回值最大值,如果值一样就返回0
public static int compare(int x,int y){
if(x>y){
return x;
}else if(x<y){
return y;
}else {
return 0;
}
}
}
5.打印古诗词
package com.xing.work;
public class 打印古诗词 {
public static void main(String[] args) {
System.out.println("日照香炉生紫烟1");
//调用方法
printSep();
System.out.println("遥看瀑布挂前川");
//调用方法
printSep();
System.out.println("飞流直下三千尺");
//调用方法
printSep();
System.out.println("疑是银行落九天");
}
//定义方法,打印分割符
public static void printSep(){
for (int i = 0; i < 15; i++) {
System.out.print("-");
}
System.out.println();
}
}
package com.xing.work;
public class 打印古诗词 {
public static void main(String[] args) {
System.out.println("日照香炉生紫烟");
//调用方法
printSep('-'); //实际参数,给形式参数赋值的数据
System.out.println("遥看瀑布挂前川");
//调用方法
printSep('*');
System.out.println("飞流直下三千尺");
//调用方法
printSep('¥');
System.out.println("疑是银行落九天");
printSep('静');
}
//定义方法,打印分割符
//char sign: 形式参数,局部变量,用来接收数据
public static void printSep(char sign){
for (int i = 0; i < 15; i++) {
System.out.print(sign);
}
System.out.println();
}
}
日照香炉生紫烟
---------------
遥看瀑布挂前川
***************
飞流直下三千尺
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
疑是银行落九天
静静静静静静静静静静静静静静静
package com.xing.work;
public class 打印古诗词 {
public static void main(String[] args) {
System.out.println("日照香炉生紫烟");
//调用方法
printSep('-',10); //实际参数,给形式参数赋值的数据
System.out.println("遥看瀑布挂前川");
//调用方法
printSep('*',15);
System.out.println("飞流直下三千尺");
//调用方法
printSep('¥',20);
System.out.println("疑是银行落九天");
printSep('静',25);
}
//定义方法,打印分割符
//char sign: 形式参数,局部变量,用来接收数据
public static void printSep(char sign,int count){
for (int i = 0; i < count; i++) {
System.out.print(sign);
}
System.out.println();
}
}
日照香炉生紫烟
----------
遥看瀑布挂前川
***************
飞流直下三千尺
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
疑是银行落九天
静静静静静静静静静静静静静静静静静静静静静静静静静
6.方法的多级调用
package com.xing.work;
public class 方法的多级调用 {
public static void main(String[] args) {
System.out.println("开始执行 main");
method1();
System.out.println("结束执行 main");
}
public static void method1(){
System.out.println("开始执行 method1");
method2();
System.out.println("结束执行 method1");
}
public static void method2(){
System.out.println("开始执行 method2");
System.out.println("结束执行 method2");
}
}
开始执行 main
开始执行 method1
开始执行 method2
结束执行 method2
结束执行 method1
结束执行 main
6.1栈(客栈)
1.先进先出
2.空间比较小(1M)存取速度比较快,使用完毕会被回收
3.存储局部变量(基本类型数据和引用类型地址)
6.2栈的实际例子
1.main() 最先执行,在最底部
2.method1() 被main调用,在main上面
3.method2() 被method1调用,在method1上面,也就是最上面,也会最先出去
方法运行时要进栈
7.堆
1.空间比较大,存取较慢 默认内存的1/64
2.存储对象的实际数据
8.递归
自己调用自己,有穷递归
大问题拆成小问题,设置递归出口问题,可以让调用链上的每个方法都正确返回,避免无穷递归1
stackOverflowError 栈空间溢出错误
package com.xing.work;
public class 递归8 {
public static void main(String[] args) {
int f=factorial(10);
System.out.println(f);
}
//阶乘
public static int factorial(int n){
if(n==1){
return 1;
}
return factorial(n-1)*n;
}
}
3628800
Process finished with exit code 0
注意:所有以递归解决的方法,循环都可以解决,当解决复杂问题时,递归的实现方式更为简单,递归有些缺点
###递归实现1-100的和
package com.xing.work;
public class 递归9 {
public static void main(String[] args) {
int f=factorial(100);
System.out.println(f);
}
//阶乘
public static int factorial(int n){
if(n==1){
return 1;
}
return factorial(n-1)+n;
}
}
5050
面试题
8.1递归实现斐波那契数
斐波那契数实现30个数
package com.xing.work;
public class 递归实现斐波那契数 {
public static void main(String[] args) {
int feibona = feibo(30);
System.out.println(feibona);
}
public static int feibo(int n){
if(n==1||n==2){
return 1;
}
return feibo(n-1)+feibo(n-2);
}
}
832040
斐波那契数 1 1 2 3 5 8 13 21 34 55...
8.2 递归小结
使用场景:
使用递归可以大量简化代码,比如:汉诺塔问题,三个柱子,放盘子大小
使用递归可以提高执行效率,比如:快速排序、归并排序
递归特点:
递归即使有出口,也可能会出现栈空间溢出。
递归一次的效率低于循环一次的效率
9.快捷键
ifn : if语句
if (args == null) {
}
inn : if语句
if (args != null) {
}
Command +/单行注释
Command +shift+/多行注释
Command +d复制行
Command +x删除行
Alt +/代码补全
Alt +enter快速修正
Alt +⬆️ 选中单词
数组
概念:一组连续的存储空间,存储多个相同数据类型的值
1.类型相同
2.长度固定
数组属于引用类型,实际数据都在堆中,栈里面存放的是地址
栈存放局部变量和引用类型(new)
栈里面存放的是地址
基本类型的局部变量(int short byte long )数据都在栈里
引用类型的局部变量在栈里面存储的都是地址,实际数据都在堆里面
基本类型的局部变量的数据直接存储在栈里面
int [] a=new int[5];
int [] a :声明int 数组类型为变量,定义变量名为a
new int[5] 分配长度为5的连续空间
内存
a []]]]]]]]]]]]]]]]]
可以连续存储5个int类型的值
数组的组成
内存
a [][][]]]]]]]]] 数组元素
0 1 2 3 4 :下标从0开始,依此+1,自动生成
访问的语法:数组名 [下标];
//例如 存:a[0]=10; 取:a[0];
数组的遍历
for(数组元素类型 n:数组){
//n 代表数组的每个元素
}
缺点:不能使用下标
package com.xing;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的
* array
* 2021/4/23
*/
public class 数组 {
public static void main(String[] args) {
//创建数组
//int[] int数组类型
//arr 数组名,变量名
//new int[5] 在内存中开辟长度为5的连续空间
int[] arr=new int[5]; //推荐这种写法
int arr2[]=new int[3];
double[] money=new double[10];
char[] chars=new char[6];
boolean[] booleans=new boolean[3];
String[] name=new String[3];
}
}
package com.xing;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的
* array
* 2021/4/23
*/
public class 数组2 {
public static void main(String[] args) {
//创建数组
int[] num5=new int[5];
int n1=100;
//通过下标访问元素
//赋值
num5[0]=12;
num5[1]=13;
num5[2]=14;
num5[3]=15;
num5[4]=16;
// num5[5]=16;
//数组的下标不能越界
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
System.out.println(num5);//[I@29453f44
System.out.println("运行快捷键");
//
}
}
package com.xing;
import java.util.Scanner;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的
* array
* 2021/4/23
*/
public class 数组3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
//创建数组
int[] nums=new int[3];
//元素赋值
for (int i = 0; i < nums.length; i++) {
System.out.println("请输入第"+i+"个元素");
int n = input.nextInt();
nums[i]=n;
}
//元素取值
System.out.println("---------------");
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
}
//请输入第0个元素
//12
//请输入第1个元素
//23
//请输入第2个元素
//16
//---------------
//12
//23
//16
//
//Process finished with exit code 0
}
}
package com.xing;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的
* array
* 2021/4/23
*/
public class 数组5 {
public static void main(String[] args) {
int[] arr;
arr=new int[3];
//创建数组,并指定元素的初适值,不要写数组长度,长度由元素个数决定
int[] nums=new int[]{10,30,50};
System.out.println(nums);
for (int num : nums) {
System.out.println(num);
}
String[] names=new String[]{"张三","李四","王五"};
double[] money=new double[]{3.5,2.8,8.8};
for (String name : names) {
System.out.println(name);
}
for (double v : money) {
System.out.println(v);
}
//简化写法,要求:必须一条语句完成,声明和赋值不能分割开
int[] nums2={10,30,56};
}
}
package com.xing;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的
* array
* 2021/4/23
*/
public class 数组55 {
public static void main(String[] args) {
int[] scores={99,87,89,98};
int sum=0;
for (int i = 0; i < scores.length; i++) {
sum+=scores[i];
}
double avg=(double) sum/scores.length;
//%.1f 保留1位小数
// System.out.println("平均分是:"+avg);
System.out.printf("%.1f",avg);//93.3
}
}
package com.xing;
import java.util.Scanner;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的
* array
* 2021/4/23
*/
public class 数组6 {
public static void main(String[] args) {
//给定一个整数数组,读入一个整数n,如果n在数组中存在,输出下标,不存在则输出-1
int[] num={99,87,89,98,98};
Scanner input = new Scanner(System.in);
System.out.println("请输入一个数字");
int n = input.nextInt();
boolean flag=false;
for (int i = 0; i < num.length; i++) {
if (n==num[i]) {
flag = true;
System.out.println("下标是:" + i);
}
}
if(!flag){
System.out.println(-1);
}
}
}
1.课堂实例
package com.xing;
import java.util.Scanner;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的
* array
* 2021/4/24
*/
public class 数组7 {
public static void main(String[] args) {
//控制台输入5个城市的名称,使用数组保存,并遍历输出
Scanner input = new Scanner(System.in);
String[] cities = new String[5];
for (int i = 0; i < cities.length; i++) {
cities[i] = input.next();
}
System.out.println("------遍历-------");
for (String city : cities) {
System.out.println(city);
}
}
}
北京
上海
杭州
南京
广州
------遍历-------
北京
上海
杭州
南京
广州
Process finished with exit code 0
2.栈和堆(存储空间)
程序运行中有两块重要存储空间
栈:
存储基本类型数据以及引用类型的地址(局部变量)
空间比较小,存储速度比较快,1M
先进先出
堆:
存储引用类型的实际数据
空间比较大,存储速度比较慢
数组属于引用类型,实际数据存储在堆中,栈中存储堆中数组的引用(地址)
3.数组的扩容
创建数组时,必须显示指定长度,并在创建之后不可更改长度
扩容的思路:
创建大于原数组长度的新数组
将原数组中的元素依此赋值到新数组中
内存
old [[]]]]]]]
new[]]]]]]]]]]]]]]]]]]]]]
package com.xing;
import java.util.Scanner;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的
* array
* 2021/4/24
*/
public class 数组8 {
public static void main(String[] args) {
//数组的扩容
//旧的数组
int[] nums={10,20,30,40,50};
//新的数组
int[] nums2=new int[nums.length];
//赋值旧数组的元素
for (int i = 0; i < nums.length; i++) {
nums2[i]=nums[i];
}
//把新数组的地址赋值给旧数组
nums=nums2;
//遍历数组
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
}
}
}
10
20
30
40
50
Process finished with exit code 0
4.数组的插入、删除
插入元素:
首先确定插入元素的位置
如果在数组尾部,未超过最大下标则直接加入;否则需要后移元素,加入
删除元素:
如果是末尾元素,则直接删除,否则删除后需要前移元素
package com.xing;
import java.util.Scanner;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的
* array
* 2021/4/24
*/
public class 数组9 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int[] nums=new int[10];
int size=0; //实际保存的允许个数
nums[0]=10;
nums[1]=12;
nums[2]=13;
nums[3]=12;
nums[4]=18;
nums[5]=18;
size=6;
System.out.println("请输入一个数据");
int n = input.nextInt();
System.out.println("请输入插入元素的位置");
int pos = input.nextInt();
if(pos>=6&&pos<nums.length){
//放在最后
nums[6]=n;
size++;
}else {
//移动元素
for (int j = size-1; j >pos ; j--) {
nums[j+1]=nums[j];
}
nums[pos]=n;
size++;
}
System.out.println("----插入完成----");
for (int i = 0; i < size; i++) {
System.out.println(nums[i]);
}
}
}
请输入一个数据
26
请输入插入元素的位置
3
----插入完成----
10
12
13
26
18
18
18
Process finished with exit code 0
package com.xing;
import java.util.Scanner;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的
* array
* 2021/4/24
*/
public class 数组10 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int[] nums=new int[10];
int size=0; //实际保存的允许个数
nums[0]=10;
nums[1]=12;
nums[2]=13;
nums[3]=12;
nums[4]=18;
nums[5]=18;
size=6;
System.out.println("请输入要删除元素的位置");
int pos = input.nextInt();
if(pos<size){
if(pos==size-1){//最后一个元素
nums[pos]=0;
size--;
}else {//中间元素
for (int i = pos; i < size; i++) {
nums[i]=nums[i+1];
}
nums[size-1]=0;
size--;
}
}else {
System.out.println("元素不存在");
}
System.out.println("-------删除完成-------");
for (int i = 0; i < size; i++) {
System.out.println(nums[i]);
}
}
}
请输入要删除元素的位置
2
-------删除完成-------
10
12
12
18
18
Process finished with exit code 0
5.数组的复制
package com.xing;
import java.util.Scanner;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的
* array
* 2021/4/24
*/
public class 数组11 {
public static void main(String[] args) {
System.out.println("数组复制");
//1.循环复制
//2.使用System.arraycopy
int[] nums={10,15,20};
// src 源数组
//srcPos 源数组的位置
//dest 目标数组
//destPos 目标数组的位置
//length 长度
int[] nums2=new int[nums.length*2];
System.arraycopy(nums,0,nums2,0,nums.length);
for (int i = 0; i < nums2.length; i++) {
System.out.println(nums2[i]);
}
}
}
数组复制
10
15
20
0
0
0
Process finished with exit code 0
package com.xing;
import java.util.Arrays;
import java.util.Scanner;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的
* array
* 2021/4/24
*/
public class 数组11 {
public static void main(String[] args) {
System.out.println("数组复制");
//1.循环复制
//2.使用System.arraycopy
int[] nums={10,15,20};
// src 源数组
//srcPos 源数组的位置
//dest 目标数组
//destPos 目标数组的位置
//length 长度
/*
int[] nums2=new int[nums.length*2];
System.arraycopy(nums,0,nums2,0,nums.length);
for (int i = 0; i < nums2.length; i++) {
System.out.println(nums2[i]);
}*/
//3.Arrays工具类 Arrays.copyOf();
int[] nums2= Arrays.copyOf(nums, nums.length*2);
for (int i = 0; i < nums.length; i++) {
System.out.println(nums2);
}
}
}
数组复制
10
15
20
Process finished with exit code 0
web
1.HTML
1.第一个网页
最重要的表单标签
超文本标记语言(标签),制作网页
页面内可以包含图片,链接,音乐,程序 所以超越文本,叫超文本标签语言
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4DBJduGa-1619053108832)(…/…/Library/Application%20Support/typora-user-images/image-20210419224845272.png)]
2.容器标签
div+css 是现下最流行的一种布局方式
div 分区:块级标签 ,独占一行,换行,有高度和宽度
span : 行级标签,所有内容都在同一行,没有高度和宽度
Html 所有标签分为两类:
块级标签:独占一行,有高度和宽度,比如:div、p、h1-h6
行级标签:所有内容都在同一行显示,没有高度和宽度。span
hr 水平线
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wMTKrDz1-1619053108833)(…/…/Library/Application%20Support/typora-user-images/image-20210420080811360.png)]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>容器标签的使用</title>
</head>
<body>
<!-- 1 div : 分区标签,属于块级标签 -->
<!-- 2 span :范围标签,属于行级标签-->
<div>第一块内容</div>
<div>第二块内容</div>
<div>第三块内容</div>
html是用来制作网页的一门标签语言。现在使用的是<span style="color:blue;">html5</span>
</body>
</html>
3.列表标签
(比较重要)
三种标签
有序: ol
无序: ul
定义: dl
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-faUt1DKd-1619053108834)(…/…/Library/Application%20Support/typora-user-images/image-20210420083530835.png)]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>列表标签</title>
</head>
<body>
<!-- 列表标签的使用 -->
<!-- 1 无序列表 ul (unorder list)
li:表示列表项
type属性:表示列表的项目符合 circle空心圆 disc实心圆(默认) square 方块
-->
<ul type="square">
<li>华为</li>
<li>苹果</li>
<li>小米</li>
<li>OPPO</li>
<li>ViVo</li>
<li>三星</li>
</ul>
<!-- 有序列表 ol (order list)
li:表示列表项
type属性:列表的项目符合 1 表示数字 a A(字母) i I(罗马数字)
-->
<ol type="1">
<li>橘子</li>
<li>西瓜</li>
<li>香蕉</li>
</ol>
<!-- 定义列表 dl (defination list)
dt:定义标题
dd:定义描述
-->
<dl>
<dt>苹果</dt>
<dd>苹果是一种非常好吃的水果,富含维生素...</dd>
<dt>西瓜</dt>
<dd>西瓜是一种非常好吃的水果,富含维生素...</dd>
</dl>
</body>
</html>
4.图片标签
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WzZlqgj6-1619053108836)(…/…/Library/Application%20Support/typora-user-images/image-20210420094527951.png)]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>图片标签</title>
</head>
<body>
<!-- 图片标签:在页面的指定位置处引用一副图片,标签为<img>
属性:
1 src:图片的路径(地址),相对地址或绝对地址
相对地址:以当前文件位置作为参考,所关联文件的相对位置,同网站内部使用相对地址
绝对地址:带协议的完整地址,不用网站之间使用绝对地址
根地址:特殊的相对地址
2 width:图片的宽度
3 height:图片的高度
4 alt:图片不显示,替换信息(没有加载出来,或者图片路径不对)
5 align:对齐方式
6 title:鼠标悬停,显示内容
7 hspace:水平间距
8 vspan:垂直间距
-->
<img src="img/古代意境画.jpeg" width="200px" alt="替换内容" title="鼠标悬停" align="bottom"/>
这个一张图片
<img align="middle" width="200px" height="100px" src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fb.zol-img.com.cn%2Fdesk%2Fbizhi%2Fimage%2F1%2F1680x1050%2F1349289433496.jpg&refer=http%3A%2F%2Fb.zol-img.com.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1621471134&t=3110f433a602cd6750b2fd3529e0d597"/>
</body>
</html>
5.超链接标签
网站的灵魂(非常非常重要)
超链接标签文本或图片
作用1:在页面使用超链接标签跳转到另外一个页面
href: 跳转页面的地址
target:
_target新窗口
_self自身窗口
_parent在父窗口
_top顶级窗口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WEIloDsL-1619053108837)(…/…/Library/Application%20Support/typora-user-images/image-20210420113641399.png)]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>超链接标签</title>
</head>
<body>
<a name="name"></a>
<h2>超链接标签作用1: 实现页面间跳转</h2>
<a href="图片标签.html">打开图片标签</a>
<a href="http://www.baidu.com" target="_blank">打开百度</a>
<a href="http://www.163.com" target="my123">打开网易</a>
<h2>超链接标签的作用2:实现锚链接(页面位置的跳转)</h2>
<p>段落内容</p>
<p>段落内容</p>
<p>段落内容</p>
<p id="mid">中间</p>
<a href="#name">跳转到top</a>
<a href="#mid">跳转到中间</a>
</body>
</html>
6.表格标签
border:设置表格边框
width、height: 设置表格的宽度和高度
align、valign: 设置单元格的水平或者对齐方式
bgcolor: 设置单元格的背景颜色
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>表格标签</title>
</head>
<body>
<!--
border:设置表格边框
width、height: 设置表格的宽度和高度
align、valign: 设置单元格的水平或者对齐方式
bgcolor: 设置单元格的背景颜色
table :
定义表格
width:表格宽度
height:表格的宽度
align:表格的对齐方式
tr:定义一行
align: 内容水平对齐方式
valign:内容垂直对齐方式
td:定义一列
align: 内容水平对齐方式
valign:内容垂直对齐方式
th:定义一列 垂直居中加粗显示
-->
<table border="2" width="500" height="200" align="center" bgcolor="aqua">
<tr>
<th>姓名</th>
<th>语文</th>
<th>数学</th>
</tr>
<tr align="center">
<td>张三</td>
<td>90</td>
<td>99</td>
</tr>
<tr align="center">
<td>李四</td>
<td>66</td>
<td>88</td>
</tr>
<tr align="center">
<td>王武</td>
<td>89</td>
<td>99</td>
</tr>
</table>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9OakOb6L-1619053108840)(…/…/Library/Application%20Support/typora-user-images/image-20210420120553298.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MsBwJW3h-1619053108841)(…/…/Library/Application%20Support/typora-user-images/image-20210420135251774.png)]
7.综合案例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>综合案例</title>
</head>
<body>
<!-- 顶部 -->
<table width="90%" align="center">
<tr>
<td>
千峰百嶂,路途婉转,坚持到底,必达终点
</td>
<td></td>
<td align="right">
<a>好程序员</a>
<a>课堂</a>
<a>联系我们</a>
<a>加入收藏</a>
</td>
</tr>
<tr>
<td>
<img src="img/picture/new_logo.png" width="200" />
</td>
<td></td>
<td align="right">
<img src="img/picture/nav_r_ico.png" width="280" />
</td>
</tr>
<tr>
<td colspan="3" align="center">
<hr />
<a href="#">
首页
</a>
<a href="#">
课程培训
</a>
<a href="#">
教学保障
</a>
<a href="#">
免费视频
</a>
<a href="#">
公开课
</a>
<a href="#">
企业合作
</a>
<a href="#">
学员天地
</a>
<a href="#">
就业喜报
</a>
<hr />
</td>
</tr>
<tr>
<td></td>
<td></td>
<td align="right">
首页--->课程培训--->JavaEE
</td>
</tr>
</table>
<table width="90%" align="center" >
<tr>
<td>
<h2>课程培训</h2>
<h4>共用xxx课程</h4>
</td>
</tr>
<tr>
<td>
<hr />
<img src="img/picture/001.png" width="100%" />
</td>
</tr>
<tr>
<td align="center">
<table width="100%">
<tr align="center">
<td>
<img src="img/picture/002.png" width="150" height="220" />
<p>
书名:xxx<br/>
售价:xxx
</p>
</td>
<td>
<img src="img/picture/003.png" width="150" height="220"/>
<p>
书名:xxx<br/>
售价:xxx
</p>
</td>
<td>
<img src="img/picture/004.png" width="150" height="220" />
<p>
书名:xxx<br/>
售价:xxx
</p>
</td>
<td>
<img src="img/picture/005.png" width="150" height="220" />
<p>
书名:xxx<br/>
售价:xxx
</p>
</td>
<td>
<img src="img/picture/006.png" width="150" height="220" />
<p>
书名:xxx<br/>
售价:xxx
</p>
</td>
</tr>
<tr align="center">
<td>
<img src="img/picture/007.png" width="150" height="220" />
<p>
书名:xxx<br/>
售价:xxx
</p>
</td>
<td>
<img src="img/picture/008.png" width="150" height="220"/>
<p>
书名:xxx<br/>
售价:xxx
</p>
</td>
<td>
<img src="img/picture/009.png" width="150" height="220" />
<p>
书名:xxx<br/>
售价:xxx
</p>
</td>
<td>
<img src="img/picture/010.png" width="150" height="220" />
<p>
书名:xxx<br/>
售价:xxx
</p>
</td>
<td>
<img src="img/picture/011.png" width="150" height="220" />
<p>
书名:xxx<br/>
售价:xxx
</p>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<img src="img/picture/012.png" width="100%" />
</td>
</tr>
</table>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gvDYpaoV-1619053108842)(…/…/Library/Application%20Support/typora-user-images/image-20210420145933716.png)]
8.表单标签(最重要之一)
Radio
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>表单标签</title>
</head>
<body>
<h2>用户注册</h2>
<form action="" method="">
<table>
<tr>
<td>用户名</td>
<td>
<input type="text" name="username" />
</td>
</tr>
<tr>
<td>密码</td>
<td>
<input type="password" name="password" />
</td>
</tr>
<tr>
<td>性别</td>
<td>
<input type="radio" name="sex" value="male" />男
<input type="radio" name="sex" value="female" />女
</td>
</tr>
<tr>
<td>爱好</td>
<td>
<input type="checkbox" name="hobby" value="code"/>写代码
<input type="checkbox" name="hobby" value="music"/>听歌
<input type="checkbox" name="hobby" value="Basketball"/>篮球
</td>
</tr>
<tr>
<td>头像</td>
<td>
<input type="file" name="photo" />
</td>
</tr>
<tr>
<td colspan="2">
<input type="hidden" name="id" value="1782827282888" />
<input type="submit" value="提交" />
<input type="reset" value="重置" />
<input type="button" value="普通按钮" />
<input type="image" src="" />
<button type="submit">提交</button>
<button type="reset">重填</button>
<button type="button">普通按钮</button>
<button>提交</button>
</td>
</tr>
</table>
</form>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VZr0b9JZ-1619053108844)(…/…/Library/Application%20Support/typora-user-images/image-20210420221539059.png)]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>其它表单元素</title>
</head>
<body>
<h2>注册</h2>
<form action="" method="post" enctype="application/x-www-form-urlencoded">
邮箱:<input type="email" name="myemail" /><br/>
年龄:<input type="number" name="age" min="1" max="10" /><br/>
等级:<input type="range" name="level" min="1" max="10" /><br/>
颜色:<input type="color" name="mycolor" /><br />
出生日期:<input type="date" name="bornDate" />
开始时间:<input type="time" name="start" />
<button>提交</button>
</form>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qx0sh2TD-1619053108845)(…/…/Library/Application%20Support/typora-user-images/image-20210420224538346.png)]
注意事项:name属性是必须的,否则不能提交给服务器,value是提交的数据
要想把数据提交给服务器,必须要有name,value指的是自己的数据
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>其它表单元素</title>
</head>
<body>
<h2>注册</h2>
<form action="" method="post" enctype="application/x-www-form-urlencoded">
邮箱:<input type="email" name="myemail" /><br/>
年龄:<input type="number" name="age" min="1" max="10" /><br/>
等级:<input type="range" name="level" min="1" max="10" /><br/>
颜色:<input type="color" name="mycolor" /><br />
出生日期:<input type="date" name="bornDate" />
开始时间:<input type="time" name="start" />
城市:
<select name="city">
<option value="beijing">北京</option>
<option value="shanghai" selected="selected">上海</option>
<option value="hangzhou">杭州</option>
</select><br />
<button>提交</button>
</form>
</body>
</html>
9.框架标签
_parent : 在父页面打开,父亲级别
_top : 顶级也是指整个窗口,最高的那个,爷爷级别
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>框架标签</title>
</head>
<!-- framset
属性:
-->
<frameset rows="100,*" frameborder="1" border="2" bordercolor="blue">
<frame src="top.html" name="topFrame" noresize="noresize"/>
<frameset cols="20%,*">
<frame src="left.html" name="leftFrame" noresize="noresize" />
<frame src="right.html" name="rightFrame" />
</frameset>
</frameset>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HcuU1QkZ-1619053108847)(…/…/Library/Application%20Support/typora-user-images/image-20210421091920764.png)]
10.内嵌框架
优点,比较灵活 :iframe
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>内嵌框架</title>
</head>
<body>
<table width="100%">
<tr height="120">
<td colspan="2">
<iframe name="topFrame" src="top.html" width="100%"></iframe>
</td>
</tr>
<tr>
<td width="20%" height="500px">
<iframe name="leftFrame" src="left.html" width="100%" height="100%"></iframe>
</td>
<td width="80%" height="500px">
<iframe name="rightFrame" src="right.html" width="100%" height="100%"></iframe>
</td>
</tr>
</table>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JpB315hn-1619053108848)(…/…/Library/Application%20Support/typora-user-images/image-20210421183147454.png)]
11.其它标签和特殊字符
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!-- meta 元数据标签,用来定义网页信息,编码信息,关键字 -->
<meta charset="utf-8" />
<!-- SEO 网站优化 -->
<meta name="ketwords" content="IT培训,Java开发,网页制作" />
<!-- 定时刷新 -->
<!-- meta h -->
<title></title>
</head>
<body>
特殊字符 描述<br />
空格 : 空格<br />
大于号:><br />
小于号:<<br />
注册:®<br />
双引号:"<br />
人民币:¥<br />
版权:©<br />
未注册:™
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K0Dd97ud-1619053108849)(…/…/Library/Application%20Support/typora-user-images/image-20210421190804297.png)]
2.CSS
1.css基本语法
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>css基本语法</title>
<style type="text/css">
/* css规则:两部分 :选择器和声明 */
/*
两种写法:
(1)选择器和声明写在一行,优点可以节省空间,缺点可读性差
(2)选择器和声明单独写在一行,优点可读性好,缺点浪费空间
*/
h1 {
color: red;
background-color: skyblue;
}
p {
color: orange;
background-color: bisque;
font-size: 25px;
}
</style>
</head>
<body>
<h1>赠汪伦</h1>
<hr width="800" align="left" />
<p>李白乘船将于行</p>
<p>忽闻岸上踏歌声</p>
<p>桃花潭水深千尺</p>
<p>不及汪伦送我情</p>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B5imIOiS-1619053108850)(…/…/Library/Application%20Support/typora-user-images/image-20210421210306710.png)]
2.css使用方式
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>css的三种使用方式</title>
<!-- link:链接css文件
href:链接css文件的路径
ref:连接的文件是样式表文件,必须写不能省略
type:文件类型
-->
<link href="css/Mycss.css" rel="stylesheet" />
<style type="text/css">
/* 内部样式:可以设置网页所有元素样式 */
li{
color: green;
font-size: 28px;
}
p{
color: blue;
}
</style>
</head>
<body>
<h1>css使用方式</h1>
<ul>
<li style="color: red; background-color: gainsboro;">内联样式:写在标签内部的样式</li>
<li>内部样式:写在head标签中添加style标签,样式规则写在style标签中</li>
<li>外部样式:写在独立的css文件中,所有的网页都可以引用样式表文件</li>
<li>优先级:内联样式>内部样式和外部样式,内部和外部样式遵循就近原则</li>
</ul>
<h2>清平调</h2>
<p>云想衣裳花想容</p>
<p>春风拂槛露华浓</p>
<p>若非群玉山头见</p>
<p>会向瑶台月下逢</p>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KjNWr71I-1619053108851)(…/…/Library/Application%20Support/typora-user-images/image-20210421215200582.png)]
3.css选择器
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>css选择器</title>
<style type="text/css">
/* 标签选择器 */
p{
color: green;
}
h2{
background-color: pink;
}
/* Id选择器 */
#p1{
background-color: #f0e68c;
}
/* Class选择器 */
.class1{
background-color: lightblue;
}
/* 属性选择器 */
input[type='text']{
background-color: powderblue;
font-size: 20px;
}
a {
font-size: 20px;
color: black;
text-decoration: none;
}
a:hover{
text-decoration: underline;
}
/* 层级选择器
子代选择器
后代选择器
*/
div span{
color: red;
}
/* 全局选择器 */
*{
font-size: 16px;
}
/* 群组选择器 */
p,div,li {
border: 1px solid red;
}
</style>
</head>
<body>
<h1>基本选择器</h1>
<ul>
<li>标签选择器:选择网页中某种标签实现样式设置</li>
<li>id选择器:选择网页中指定id的样式</li>
<li>Class选择器:选择网页中指定Class元素的样式</li>
<li>优先级:Id>Class>标签</li>
</ul>
<h1>高级选择器</h1>
<ul>
<li>属性选择器:使用属性选择元素</li>
<li>伪类选择器:用来设置元素的状态样式</li>
<li>层级选择器:用来设置有层级关系的元素样式</li>
</ul>
<h2>清平调</h2>
<p id="p1">云想衣裳花想容</p>
<p class="class1">春风拂槛露华浓</p>
<p class="class2">若非群玉山头见</p>
<p>会向瑶台月下逢</p>
<form>
<input type="text" name="username" placeholder="请输入用户" /><br />
<input type="password" name="pwd" placeholder="请输入密码" /><br />
</form>
<a href="http://www.baidu.com">百度</a><br />
<a href="http://www.163.com">网易</a><br />
<a href="http://www.taobao.com">淘宝</a><br />
<div>
<span>不可以急躁的完成一件事</span><br />
<span>用心记住每个知识点</span>
</div>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C6EMQZUT-1619053108854)(…/…/Library/Application%20Support/typora-user-images/image-20210422085409639.png)]
4.文字属性
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>文字属性</title>
<style type="text/css">
li{
/* font-size: 18px;
font-family: "宋体";
font-style: italic;
font-weight: bolder; */
font: italic bolder 20px "宋体";
}
</style>
</head>
<body>
<h1>文字属性</h1>
<ul>
<li>font-size:设置字体的大小</li>
<li>font-family:设置字体的类型</li>
<li>font-style:设置字体的样式</li>
<li>font-weight:设置字体的粗细</li>
</ul>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MlYQphwX-1619621261812)(…/…/Library/Application%20Support/typora-user-images/image-20210422105351344.png)]
5.文本属性
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>文本属性</title>
<style type="text/css">
/* html{
font-size: 30px;
} */
li{
color: green;
text-align: left;
line-height: 50px;
}
p{
font-size: 30px;
text-indent: 2em;
text-decoration: underline;
text-shadow: 5px 5px 10px blue;
}
</style>
</head>
<body>
<h1>文本属性</h1>
<ul>
<li>color:文字颜色</li>
<li>text-indent(缩进):首行缩进</li>
<li>text-decoration:文本修饰</li>
<li>text-align(排列):文本对齐方式</li>
<li>text-height:行高</li>
<li>text-shadow:文本阴影</li>
</ul>
<h2>清平调</h2>
<p>云想衣裳花想容</p>
<p>春风拂槛露华浓</p>
<p>若非群玉山头见</p>
<p>会向瑶台月下逢</p>
<div style="background-color: green;">
<img src="img/001.jpg" width="200" style="vertical-align: bottom;" />这是一张图片
</div>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sok1fNk4-1619621261818)(…/…/Library/Application%20Support/typora-user-images/image-20210422152658812.png)]
6.背景属性
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>背景属性</title>
<style>
div{
height: 300px;
/* 背景颜色 */
background-color: skyblue;
background-image: url(img/002.jpg);
/* 背景平铺方式 */
background-repeat: no-repeat;
/* 背景的位置 */
/* background-position: right top; */
/* background-position: center; */
background-position: 100px 100px;
}
/* 实现图片的裁剪 */
#div1{
width: 50px;
height: 50px;
background-image: url(img/timg.jpg);
background-position: 0px 0px;
}
#div2{
width: 50px;
height: 50px;
background-image: url(img/timg.jpg);
background-position: -35px 0px;
}
#div3{
width: 50px;
height: 50px;
background-image: url(img/timg.jpg);
background-position: -70px 0px;
}
</style>
</head>
<body>
<h1>背景属性</h1>
<ul>
<li>background-color:背景颜色</li>
<li>background-image:背景图片</li>
<li>background-repeat:背景平铺方式</li>
<li>background-position:背景位置</li>
<li>background-size:背景大小</li>
</ul>
<div>
</div>
<div id="div1"></div>
<div id="div2"></div>
<div id="div3"></div>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mOdeZKJx-1619621261821)(…/…/Library/Application%20Support/typora-user-images/image-20210422152757605.png)]
7.列表样式
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>列表样式</title>
<style type="text/css">
ul{
/* 列表的样式 */
/* list-style-type: square; */
/* list-style-type: circle; */
/* list-style-type: decimal;(十进制) */
/* list-style-type: lower-roman; */
list-style-image: url(img/icon.png);
list-style-position: inside;
/* 边框 */
border: 1px solid red;
/* 内边距 */
padding: 0px;
}
li{
border: 1px solid green;
}
</style>
</head>
<body>
<h1>列表样式</h1>
<ul>
<li>list-style-type:列表的样式</li>
<li>list-style-image:列表图片</li>
<li>list-style-position:列表样式的位置</li>
</ul>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U3LRIg9L-1619621261823)(…/…/Library/Application%20Support/typora-user-images/image-20210422152929679.png)]
8.尺寸、显示、轮廓
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>尺寸、显示、轮廓</title>
<style type="text/css">
#div1{
height: 100px;
width: 100px;
background-color: skyblue;
}
#span1{
height: 100px;
width: 100px;
background-color: #F0E68C;
/* display: block; */
/* display: inline; */
/* display: none; 不显示,位置也没有了*/
/* visibility: hidden; 不显示,位置还存在*/
}
#img1{
/* outline-style: solid;
outline-color: red;
outline-width: 10px; */
/* 简写 轮廓不占位置 */
/* outline: 5px dashed red; */
/* outline: 5px dotted red; */
outline: 5px solid red;
}
#username{
/* outline: 0px; */
/* border: 0px; */
border: 1px solid gray;
}
</style>
</head>
<body>
<form>
<input id="username" type="text" name="username" placeholder="请输入用户名" /><br />
<input id="password" type="text" name="password" placeholder="请输入用户名" /><br />
<input type="submit" value="提交" />
</form>
<h1>尺寸:只有块级别元素</h1>
<ul>
<li>width:宽度</li>
<li>height:高度</li>
</ul>
<h1>显示:display,实现块级元素和行级元素切换,还可以控制是否显示</h1>
<h1>轮廓</h1>
<ul>
<li>outline-style:轮廓的样式:solid dash</li>
<li>outline-color:轮廓的颜色</li>
<li>outline-width:轮廓的宽度</li>
</ul>
<div id="div1">
</div>
<span id="span1">
span标签
</div>
<img src="img/001.jpg" width="200" id="img1" />
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5pJVw40c-1619621261825)(…/…/Library/Application%20Support/typora-user-images/image-20210422153021748.png)]
9.浮动样式
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>浮动样式</title>
<style type="text/css">
#div1{
width: 100px;
height: 100px;
background-color: bisque;
/* float浮动 */
float: left;
}
#div2{
width: 120px;
height: 140px;
background-color: skyblue;
/* float浮动 */
float: left;
}
#div3{
width: 140px;
height: 140px;
background-color: brown;
/* float浮动 */
float: left;
}
#main{
height: 200px;
background-color: aquamarine;
/* clear 清楚浮动对当前元素的影响 */
clear: both;
}
</style>
</head>
<body>
<div id="div1"></div>
<div id="div2"></div>
<div id="div3"></div>
<div id="main">
主题内容
</div>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TFdP1kcc-1619621261826)(…/…/Library/Application%20Support/typora-user-images/image-20210422170206603.png)]
10.父元素塌陷
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>父元素塌陷</title>
<style type="text/css">
#child1{
width: 20%;
height: 100px;
background-color: #87CEEB;
float: left;
}
#child2{
width: 30%;
height: 100px;
background-color: bisque;
float: left;
}
#child3{
width: 50%;
height: 100px;
background-color: cadetblue;
float: left;
}
#parent{
border: 5px solid red;
/* 第一种方式:父元素添加高度 */
/* height: 100px; */
/* 第二种方式:使用overflow属性 */
/* overflow: hidden; */
/* 第三种方式:添加空div,设置空div的clear */
/* 第四种方式:使用伪元素实现 */
}
/* #clear{
height: 0px;
clear: both;
} */
#parent:after{
content: "";
display: block;
clear: both;
}
</style>
</head>
<body>
<div id="parent">
<div id="child1"></div>
<div id="child2"></div>
<div id="child3"></div>
<div id="clear"></div>
</div>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kq0pMx2I-1619621261828)(…/…/Library/Application%20Support/typora-user-images/image-20210422171457647.png)]
11.overflow
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>overflow</title>
<style type="text/css">
#box{
width: 100px;
height: 100px;
background-color: #87CEEB;
/* overflow: auto; */
/* overflow: hidden; */
/* overflow: scroll; */
overflow: visible;
}
</style>
</head>
<body>
<div id="box">
内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
</div>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cab0goiA-1619621261829)(…/…/Library/Application%20Support/typora-user-images/image-20210422172135451.png)]
### 12.元素定位
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>元素定位</title>
<style type="text/css">
body{
}
#div1{
width: 100px;
height: 100px;
background-color: #87CEEB;
}
#div2{
width: 100px;
height: 100px;
background-color: #A52A2A;
/* position:定位 */
/* 相对定位:相对与原来的位置偏移*/
/* relative: 相对的*/
position: relative;
left: -10px;
top: -10px;
/* 层叠属性 */
z-index: -1;
}
</style>
</head>
<body>
<div id="div1">
</div>
<div id="div2">
</div>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y8VUxj83-1619621261831)(…/…/Library/Application%20Support/typora-user-images/image-20210423105233057.png)]
13.广告
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>广告</title>
<style type="text/css">
#left{
width: 20px;
height: 150px;
background-color: #A52A2A;
/* 绝对定位:以离自己最近的不是静态定位的父元素为基准,如果没有就以html基准 */
/* 绝对的 */
/* position: absolute; */
/* 固定定位:以浏览器为基准 */
position: fixed;
left: 10px;
top: 40%;
}
#right{
width: 20px;
height: 150px;
background-color: #A52A2A;
/* position: absolute; */
position: fixed;
right: 10px;
top: 40%;
}
}
</style>
</head>
<body>
<div id="left"></div>
<div id="right"></div>
<p>内容</p>
<p>内容</p>
<p>内容</p>
<p>内容</p>
<p>内容</p>
<p>内容</p>
<p>内容</p>
<p>内容</p>
<p>内容</p>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jn7iEZYW-1619621261832)(…/…/Library/Application%20Support/typora-user-images/image-20210423105338091.png)]
14.盒子模型
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>盒子模型</title>
<style type="text/css">
#box1{
width: 100px;
height: 100px;
background-color: #A52A2A;
/* border:边框 */
/* border-style:边框的样式,实线、虚线、点虚线 */
/* border-width:边框的宽度 */
/* border-color:边框的颜色 */
/* border-style: solid;
border-width: 10px;
border-color: blue; */
/* 简写 */
/* border: 2px solid red; */
/* 四个边分别设置 */
/* border-top: 2px solid red; */
/* 内边距 */
/* padding: 200px; */
/* 四个边距分别设置 */
margin-bottom: 10px;
float: left;
margin-right: 10px;
}
#box2{
width: 100px;
height: 100px;
background-color: cornflowerblue;
/* margin-top:10px; */
margin-top: 10px;
float: left;
margin-left: 10px;
}
</style>
</head>
<body>
<div id="box1">
内容
</div>
<div id="box2">
内容
</div>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-utze1zos-1619621261833)(…/…/Library/Application%20Support/typora-user-images/image-20210423105425228.png)]
15.外边距问题
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>外边距问题</title>
<style type="text/css">
body{
overflow: hidden;
}
#box1{
height: 100px;
width: 100px;
background-color: #87CEEB;
float: left;
}
#box2{
height: 100px;
width: 100px;
background-color: #A52A2A;
clear: both;
margin-top: 120px;
}
</style>
</head>
<body>
<div>
<div id="box1"></div>
</div>
<div id="box2"></div>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DL8u2Gj6-1619621261835)(…/…/Library/Application%20Support/typora-user-images/image-20210423105543582.png)]
16.margin实现水平居中
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style type="text/css">
#box1{
width: 100px;
height: 100px;
background-color: #87CEEB;
/* 使用margin实现 */
margin: 10px 10px;
}
</style>
</head>
<body>
<div id="box1">
内容
</div>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-INVwTNS0-1619621261836)(…/…/Library/Application%20Support/typora-user-images/image-20210423105644086.png)]
17.圆角和阴影
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>圆角和阴影</title>
<style type="text/css">
#box{
width: 100px;
height: 30px;
background-color: blueviolet;
/* 圆角 */
border-radius: 20px;
/* 四个角分别设置 */
/* border-radius: 5px 10px 15px 20px; */
}
#box2{
width: 100px;
height: 100px;
background-color: blueviolet;
border-radius: 50px;
}
#box3{
width: 100px;
height: 50px;
background-color: blueviolet;
border-radius: 50px 50px 0 0;
}
#box4{
width: 100px;
height: 50px;
background-color: cadetblue;
box-shadow: 5px 5px 10px red;
}
</style>
</head>
<body>
<div id="box"></div>
<div id="box2"></div>
<div id="box3"></div>
<div id="box4"></div>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vkf4IHz6-1619621261838)(…/…/Library/Application%20Support/typora-user-images/image-20210423105758307.png)]
Servlet
1.C/S和B/S架构
在软件发展过程中,有两种软件架构方式
1.C/S架构
Client/Server:客户端/服务器
必须在客户端安装特定软件
优点
图形效果显示好(如:3D游戏)。
充分利用客户端电脑的性能
缺点:
服务器的软件和功能进行升级,客户端也必须升级,不利于维护
2.B/S架构
B/S架构
Browser/Server:浏览器/服务器
无需安装客户端,任何浏览器都可直接访问
优点
涉及到功能的升级,只需要升级服务器端
缺点
图形显示效果不如c/s架构
安全性成本比较高
需要通过HTTP协议访问
3.web
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DgZdb4TV-1619621261840)(…/…/Library/Application%20Support/typora-user-images/image-20210423175911161.png)]
4.Tomcat服务器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-muVQV0JH-1619621261842)(…/…/Library/Application%20Support/typora-user-images/image-20210423183344028.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fPJK8iMj-1619621261844)(…/…/Library/Application%20Support/typora-user-images/image-20210423183820513.png)]
1.项目部署到tomcat
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-62uI7PAN-1619621261845)(…/…/Library/Application%20Support/typora-user-images/image-20210423185449211.png)]
自定义tomcat服务器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TUojsOuw-1619621261846)(…/…/Library/Application%20Support/typora-user-images/image-20210423185542317.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MCsvUhHe-1619621261848)(…/…/Library/Application%20Support/typora-user-images/image-20210423185608752.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UEnUN7bh-1619621261902)(…/…/Library/Application%20Support/typora-user-images/image-20210423185633191.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1OupAjNw-1619621261907)(…/…/Library/Application%20Support/typora-user-images/image-20210423185705180.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vnblNLT1-1619621261912)(…/…/Library/Application%20Support/typora-user-images/image-20210423185734313.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SnXyfGCD-1619621261917)(…/…/Library/Application%20Support/typora-user-images/image-20210423192253387.png)]
虚拟目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JzldScEO-1619621261921)(…/…/Library/Application%20Support/typora-user-images/image-20210423194216294.png)]
5.Servlet
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OO53e9Nq-1619621261926)(…/…/Library/Application%20Support/typora-user-images/image-20210424170434471.png)]
访问路径 url-pattern
工具创建Servlet
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2rZUy7Kf-1619621261931)(…/…/Library/Application%20Support/typora-user-images/image-20210424221201372.png)]
5.1配置网站首页
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.xing.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
<!--配置网页的首页,如果没有配置就使用tomcat中的配置,如果有就使用当前项目的-->
<welcome-file-list>
<welcome-file>001.html</welcome-file>
</welcome-file-list>
</web-app>
5.2配置网站错误首页
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.xing.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
<!--配置网页的首页,如果没有配置就使用tomcat中的配置,如果有就使用当前项目的-->
<welcome-file-list>
<welcome-file>001.html</welcome-file>
</welcome-file-list>
<!--配置错误页面-->
<!--404-->
<error-page>
<error-code>404</error-code>
<location>/error/404.html</location>
</error-page>
<!--500-->
<error-page>
<error-code>500</error-code>
<location>/error/500.html</location>
</error-page>
<!--未知错误-->
<error-page>
<location>/error/error.html</location>
</error-page>
</web-app>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>服务器异常</title>
</head>
<body>
<div style="width: 90%; margin: 0 auto">
<img src="error/500.jpg" width="100%" height="100%">
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>资源没找到</title>
</head>
<body>
<div style="width: 90%; margin: 0 auto" >
<img src="error/404.jpeg" width="100%" height="100%">
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>未知错误</title>
</head>
<body>
<h1>服务器发生未知错误!请稍后重试</h1>
</body>
</html>
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
Date date = new Date();
System.out.println("现在的时间是"+date);
System.out.println("myServlet");
int i=10/0;
}
5.3打包部署
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-STAaOjZa-1619621261936)(…/…/Library/Application%20Support/typora-user-images/image-20210425123015009.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FM2KqEcx-1619621261943)(…/…/Library/Application%20Support/typora-user-images/image-20210425123120205.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xoDkMcD9-1619621261945)(…/…/Library/Application%20Support/typora-user-images/image-20210425123158836.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6av6EVOG-1619621261948)(…/…/Library/Application%20Support/typora-user-images/image-20210425123236996.png)]
第三个实例:
package com.xing.servlet;
import javax.servlet.*;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Date;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的、先苦后甜
* day38_web
* 2021/4/25 21:17
*/
public class MyServlet3 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
Date date = new Date();
try {
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306?useSSl=false&characterEncoding=utf-8";
Connection connection = DriverManager.getConnection(url, "root", "root");
if(connection!=null){
System.out.println("链接成功");
connection.close();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
<servlet>
<servlet-name>myServlet3</servlet-name>
<servlet-class>com.xing.servlet.MyServlet3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet3</servlet-name>
<url-pattern>/myservlet3</url-pattern>
</servlet-mapping>
6.HTTP协议
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b8lpsxoQ-1619621261950)(…/…/Library/Application%20Support/typora-user-images/image-20210425213641136.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-elCA31Rf-1619621261956)(…/…/Library/Application%20Support/typora-user-images/image-20210425215034807.png)]
面试题:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8c7JNyk6-1619621261961)(…/…/Library/Application%20Support/typora-user-images/image-20210425215058833.png)]
http协议
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g7cUwHcp-1619621261964)(…/…/Library/Application%20Support/typora-user-images/image-20210425221700618.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8OKmT9ph-1619621261966)(…/…/Library/Application%20Support/typora-user-images/image-20210425222414544.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vpAcSm0h-1619621261968)(…/…/Library/Application%20Support/typora-user-images/image-20210425223154379.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZdA8Wec3-1619621261970)(…/…/Library/Application%20Support/typora-user-images/image-20210425223314976.png)]
请求行
请求报文
响应报文
响应体:响应正文
浏览器上只能看到响应体的内容,响应头看不到
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sIIFxQXj-1619621261972)(…/…/Library/Application%20Support/typora-user-images/image-20210426093253824.png)]
7.Servlet核心内容
打印流
生命周期方法:init servlet destroy
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OkPuivQ2-1619621261974)(…/…/Library/Application%20Support/typora-user-images/image-20210426094032135.png)]
package com.xing.servlet;
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的、先苦后甜
* day38_web
* 2021/4/26 11:34
*/
public class FirstServlet implements Servlet {
//init:初始化Servlet,只执行一次
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("firstServlet初始化了。。。。。init"+this.hashCode());
}
//getServletConfig :获取Servlet配置
@Override
public ServletConfig getServletConfig() {
System.out.println("获取Servlet配置。。。");
return null;
}
//service:服务方法:提供响应的方法,每次请求都会响应一次
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("服务方法执行了。。。service"+this.hashCode());
PrintWriter writer = servletResponse.getWriter();
writer.println("hello welcome use servlet");
}
//getServletInfo:获取servlet基本信息的方法
@Override
public String getServletInfo() {
System.out.println("获取基本信息。。。getServletInfo"+this.hashCode());
return null;
}
//destory:销毁方法,只执行一次
@Override
public void destroy() {
System.out.println("销毁了"+this.hashCode());
}
}
<servlet>
<servlet-name>fServlet</servlet-name>
<servlet-class>com.xing.servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fServlet</servlet-name>
<url-pattern>/fservlet</url-pattern>
</servlet-mapping>
[2021-04-26 11:45:17,302] Artifact day38_web:war: Deploy took 1,028 milliseconds
firstServlet初始化了。。。。。init682979920
服务方法执行了。。。service682979920
26-Apr-2021 11:45:26.049 信息 [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/Users/Shared/Previously Relocated Items/Security/develop/tomcat9/apache-tomcat-9.0.38/webapps/manager]
26-Apr-2021 11:45:26.187 信息 [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[/Users/Shared/Previously Relocated Items/Security/develop/tomcat9/apache-tomcat-9.0.38/webapps/manager]的部署已在[136]毫秒内完成
服务方法执行了。。。service682979920
服务方法执行了。。。service682979920
服务方法执行了。。。service682979920
服务方法执行了。。。service682979920
服务方法执行了。。。service682979920
服务方法执行了。。。service682979920
服务方法执行了。。。service682979920
服务方法执行了。。。service682979920
服务方法执行了。。。service682979920
"/Users/Shared/Previously Relocated Items/Security/develop/tomcat9/apache-tomcat-9.0.38/bin/catalina.sh" stop
26-Apr-2021 11:46:22.186 信息 [main] org.apache.catalina.core.StandardServer.await 通过关闭端口接收到有效的关闭命令。正在停止服务器实例。
26-Apr-2021 11:46:22.187 信息 [main] org.apache.coyote.AbstractProtocol.pause 暂停ProtocolHandler["http-nio-8080"]
26-Apr-2021 11:46:22.202 信息 [main] org.apache.catalina.core.StandardService.stopInternal 正在停止服务[Catalina]
销毁了682979920
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TAaZ1u3Z-1619621261983)(…/…/Library/Application%20Support/typora-user-images/image-20210426115517220.png)]
7.1继承HttpServlet
package com.xing.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的、先苦后甜
* day38_web
* 2021/4/26 12:12
*/
public class SecondServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("请求接收了。。。"+this.hashCode());
PrintWriter writer = resp.getWriter();
writer.println("welcome use HttpServlet!");
}
}
<servlet>
<servlet-name>SencondServlet</servlet-name>
<servlet-class>com.xing.servlet.SecondServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SencondServlet</servlet-name>
<url-pattern>/sencondservlet</url-pattern>
</servlet-mapping>
请求接收了。。。637799496
请求接收了。。。637799496
请求接收了。。。637799496
7.2 Servlet配置方式
配置web.xml
Servlet名称
全限定名字
映射
访问路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J7KvP9I5-1619621261996)(…/…/Library/Application%20Support/typora-user-images/image-20210426122017310.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rdPFd3Tx-1619621261999)(…/…/Library/Application%20Support/typora-user-images/image-20210426122918140.png)]
先苦后甜
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-McU1cttW-1619621262000)(…/…/Library/Application%20Support/typora-user-images/image-20210426193309150.png)]
7.3 Servlet配置方法注解配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Up6fJddL-1619621262001)(…/…/Library/Application%20Support/typora-user-images/image-20210426200141668.png)]
@Servlet3.0 后支持,推荐使用
@WebServlet
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ruZdaunH-1619621262008)(…/…/Library/Application%20Support/typora-user-images/image-20210426203731947.png)]
7.4Servlet声明周期
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RO6YTwph-1619621262009)(…/…/Library/Application%20Support/typora-user-images/image-20210426204031109.png)]
7.5Servlet特性
成员变量在堆立面
局部变量在栈里面,使用完就销毁了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kqnuiO9P-1619621262014)(…/…/Library/Application%20Support/typora-user-images/image-20210426204624942.png)]
package com.xing.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的、先苦后甜
* day38_web
* 2021/4/26 22:39
*/
@WebServlet(name = "RegistServlet",value = "/registservlet")
public class RegistServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//request:封装了浏览器发送给服务器的数据
//getParameter:获取请求的参数,只能获取一个参数
//getParameterValues:获取请求的参数,只能获取一个数组
req.setCharacterEncoding("utf-8");
System.out.println("设置后"+ req.getCharacterEncoding());
String username = req.getParameter("username");
String pwd = req.getParameter("pwd");
String repwd = req.getParameter("repwd");
String gender = req.getParameter("gender");
String[] hobbies = req.getParameterValues("hobby");
String city = req.getParameter("city");
String introduce = req.getParameter("introduce");
//打印
System.out.println(username+"..."+pwd+"..."+repwd+"..."+gender+"..."+ Arrays.toString(hobbies)+"..."+city+"...");
System.out.println("个人介绍"+introduce+"...");
System.out.println("-----------------------------------------");
//获取HTTP请求报文的其它数据
//1.请求行
//1.2.请求方式
String method = req.getMethod();
System.out.println("请求方式===="+method);
StringBuffer requestURL = req.getRequestURL();
System.out.println("请求地址资源统一资源定位符url===="+requestURL.toString());
String requestURI = req.getRequestURI();
System.out.println("请求资源表标识符===="+requestURI);
//1.3协议 protocol:协议
String protocol = req.getProtocol();
System.out.println("协议"+protocol);
//2.请求头
String accept = req.getHeader("Accept");
System.out.println("请求头"+accept);
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()){
System.out.println(headerNames.nextElement());
}
//获取tcp协议的信息
//获取客户端的ip地址和端口号
String remoteAddr = req.getRemoteAddr();
int remotePort = req.getRemotePort();
System.out.println("客户端的ip地址:"+remoteAddr+"端口号:"+remotePort);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
设置后UTF-8
admin...11111111...1...male...[code]...beijing...
个人介绍1...
-----------------------------------------
请求方式====POST
请求地址资源统一资源定位符url====http://localhost:8080/day38/registservlet
请求资源表标识符====/day38/registservlet
协议HTTP/1.1
请求头text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*;q=0.8,application/signed-exchange;v=b3;q=0.9
host
connection
content-length
cache-control
sec-ch-ua
sec-ch-ua-mobile
upgrade-insecure-requests
origin
content-type
user-agent
accept
sec-fetch-site
sec-fetch-mode
sec-fetch-user
sec-fetch-dest
referer
accept-encoding
accept-language
cookie
客户端的ip地址:0:0:0:0:0:0:0:1端口号:49612
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<h1>用户注册</h1>
<form action="registservlet" method="post" enctype="application/x-www-form-urlencoded">
<table>
<tr>
<td>用户名</td>
<td>
<input type="text" name="username">
</td>
</tr>
<tr>
<td>密码</td>
<td>
<input type="password" name="pwd">
</td>
</tr>
<tr>
<td>确认密码</td>
<td>
<input type="password" name="repwd">
</td>
</tr>
<tr>
<td>性别</td>
<td>
<input type="radio" name="gender" value="male">男
<input type="radio" name="gender" value="famale">女
</td>
</tr>
<tr>
<td>爱好</td>
<td>
<input type="checkbox" name="hobby" value="code">写代码
<input type="checkbox" name="hobby" value="music">听音乐
<input type="checkbox" name="hobby" value="basketball">篮球
</td>
</tr>
<tr>
<td>城市</td>
<td>
<select name="city">
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="hangzhou">杭州</option>
<option value="guangzhou">广州</option>
</select>
</td>
</tr>
<tr>
<td>个人介绍</td>
<td>
<textarea name="introduce"></textarea>
</td>
</tr>
<tr>
<td>
<input type="submit" name="提交">
<input type="reset" name="重置">
</td>
</tr>
</table>
</form>
</body>
</html>
浏览器 :
请求报文
1请求行(get)
2请求头
3空行
4请求体(post)
post请求,才有请求体
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dleGDGcQ-1619621262015)(…/…/Library/Application%20Support/typora-user-images/image-20210427084717830.png)]
Response 响应
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LFYU0cC1-1619621262018)(…/…/Library/Application%20Support/typora-user-images/image-20210427085416527.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G9cL1lAp-1619621262021)(…/…/Library/Application%20Support/typora-user-images/image-20210427085609481.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tkbzfjhJ-1619621262023)(…/…/Library/Application%20Support/typora-user-images/image-20210427091512186.png)]
package com.xing.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Enumeration;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的、先苦后甜
* day38_web
* 2021/4/26 22:39
*/
@WebServlet(name = "RegistServlet",value = "/registservlet")
public class RegistServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//request:封装了浏览器发送给服务器的数据
//getParameter:获取请求的参数,只能获取一个参数
//getParameterValues:获取请求的参数,只能获取一个数组
req.setCharacterEncoding("utf-8");
System.out.println("设置后"+ req.getCharacterEncoding());
String username = req.getParameter("username");
String pwd = req.getParameter("pwd");
String repwd = req.getParameter("repwd");
String gender = req.getParameter("gender");
String[] hobbies = req.getParameterValues("hobby");
String city = req.getParameter("city");
String introduce = req.getParameter("introduce");
//打印
System.out.println(username+"..."+pwd+"..."+repwd+"..."+gender+"..."+ Arrays.toString(hobbies)+"..."+city+"...");
System.out.println("个人介绍"+introduce+"...");
System.out.println("-----------------------------------------");
//获取HTTP请求报文的其它数据
//1.请求行
//1.2.请求方式
String method = req.getMethod();
System.out.println("请求方式===="+method);
StringBuffer requestURL = req.getRequestURL();
System.out.println("请求地址资源统一资源定位符url===="+requestURL.toString());
String queryString = req.getQueryString();
System.out.println("查询出来?后面的url参数:"+queryString);
String requestURI = req.getRequestURI();
System.out.println("请求资源表标识符===="+requestURI);
//1.3协议 protocol:协议
String protocol = req.getProtocol();
System.out.println("协议"+protocol);
//2.请求头
String accept = req.getHeader("Accept");
System.out.println("请求头"+accept);
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()){
System.out.println(headerNames.nextElement());
}
//获取tcp协议的信息
//获取客户端的ip地址和端口号
String remoteAddr = req.getRemoteAddr();
int remotePort = req.getRemotePort();
System.out.println("客户端的ip地址:"+remoteAddr+"端口号:"+remotePort);
//response 对象响应的内容
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.println("<!DOCTYPE html>");
writer.println("<html>");
writer.println("<head>");
writer.println("<meta charset=utf-8>");
writer.println("<title>提示</title>");
writer.println("</head>");
writer.println("<body>");
writer.println("<h1>注册成功</h1>");
writer.println("</body");
writer.println("</html>");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
请求地址资源统一资源定位符url====http://localhost:8080/day38/registservlet
查询出来?后面的url参数:username=admin&pwd=11111111&repwd=11&gender=male&hobby=code&city=shanghai&introduce=11&%E6%8F%90%E4%BA%A4=%E6%8F%90%E4%BA%A4
7.6转发和重定向
- 转发
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7tO6f0pL-1619621262025)(…/…/Library/Application%20Support/typora-user-images/image-20210427094721176.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q1LfZqFa-1619621262025)(…/…/Library/Application%20Support/typora-user-images/image-20210427100105578.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FomyPwEg-1619621262030)(…/…/Library/Application%20Support/typora-user-images/image-20210427100437073.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vmdzoRo9-1619621262032)(…/…/Library/Application%20Support/typora-user-images/image-20210427100820376.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ssX5eLSB-1619621262033)(…/…/Library/Application%20Support/typora-user-images/image-20210427101628123.png)]
Javase—>b/s阶段
协议和转发学通后,之后框架会好点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yDO3sOEQ-1619621262036)(…/…/Library/Application%20Support/typora-user-images/image-20210427103743945.png)]
7.7转发的特点
转发面试题:回答如下
背会
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q73dvEwE-1619621262041)(…/…/Library/Application%20Support/typora-user-images/image-20210427104131859.png)]
7.8重定向
302 :
临时重定向
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fufU795g-1619621262041)(…/…/Library/Application%20Support/typora-user-images/image-20210427104651496.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zsRtTlQK-1619621262042)(…/…/Library/Application%20Support/typora-user-images/image-20210427110419123.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Dch4V8f-1619621262043)(…/…/Library/Application%20Support/typora-user-images/image-20210427110814004.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZFpGxIrl-1619621262045)(…/…/Library/Application%20Support/typora-user-images/image-20210427111012219.png)]
7.9重定向特点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VbSzTuTt-1619621262046)(…/…/Library/Application%20Support/typora-user-images/image-20210427111138958.png)]
单一职能原则,各司其职的思想
8.转发:
转发的作用在服务端
将请求发送给服务器上的其它资源,以共同完成一次请求的处理
实现:
Request.getRequestDispatcher(调度员)("/目标URL- patten").forword(request,response);
注意:
使用 forword跳转时,是在服务器内部跳转,地址栏不发生变化,属于同一次请求。
注册成功后,跳转到成功提示页面。
数据传递:
forword表示一次请求。
是在服务器内部进行跳转,可以共享同一次request作用域中的数据
request作为域(容器)对象
拥有存储数据的空间,作用时一次请求有限
存储数据
request.setAttribute(属性)(key,value);
获取数据
request.getAttribute(key);
删除数据
request.removeAttribute(去除)(key);
9转发的特点(面试题)
转发:
转发是服务器行为
转发是浏览器只做了一次访问请求
转发浏览器地址不变
转发两次跳转之间传输的信息不会丢失,所以可以通过request进行数据的传递
转发只能将请求转发给同一个web应用中的其它组件(百度和京东两个软件不能使用一个请求里面的数据)
10重定向
概念:
重定向作用在客户端
客户端请求服务器,服务器响应给客户端一个新的请求地址,客户端重新发送请求。
实现:
response.sendRedirect(重定向)(“目标Url”);
URI:
用来表示服务器定位的一个资源,资源在web项目中的路径(/project/source)
注意:
使用redirect跳转时,是在客户端跳转,地址栏多次发生变化,属于多次请求
登录成功后,重定向到网站首页
数据传输问题:
sendRedirect跳转时,地址栏改变,代表客户端重新发送的请求,属于两次强求
两次request请求中的数据无法共享的
实现数据的传递:
可以通过URL的拼接进行数据传递(“webProject/b?username=tom”);
获得数据:request.getParameter(“username”)
11重定向特点
特点:
重定向是客户端行为
浏览器至少做了两次访问请求
浏览器地址改变
两次跳转之间传输的信息会丢失(request范围)
可以指向任意的资源
包括当前应用程序中其它资源,同一个站点上其它应用程序中的资源,其它站点的资源
传数据建议用 forward
12保存sessionId的cookie能不能改
13session综合案例
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>day38web2</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>day38web2 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.24</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>4.0.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
<build>
<finalName>day38web2</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
domain
package com.xing.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的、先苦后甜
* day38web2
* 2021/4/28 14:34
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String username;
private String password;
private String email;
private String gender;
private Integer flag;
private Integer role;
private String code;
}
utils
package com.xing.utils;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.alibaba.druid.pool.DruidPooledConnection;
import com.sun.xml.internal.bind.v2.model.core.ID;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的、先苦后甜
* day38web2
* 2021/4/28 14:49
*/
public class DataSourceUtils {
private static DruidDataSource dataSource=null;
private static ThreadLocal<Connection> threadLocal=new ThreadLocal<>();
static {
try {
Properties properties = new Properties();
InputStream is = DataSourceUtils.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(is);
is.close();
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
System.out.println("初始化连接池失败...");
}
}
public static DataSource getDataSource(){
return dataSource;
}
//如果处理事务
public static Connection getConnection(){
Connection connection=threadLocal.get();
try {
if(connection==null){
connection = dataSource.getConnection();
threadLocal.set(connection);
}
return connection;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
public static void begin() throws SQLException {
Connection connection=getConnection();
if(connection!=null){
connection.setAutoCommit(false);
}
}
public static void commit() throws SQLException {
Connection connection=getConnection();
if(connection!=null){
connection.commit();
}
}
public static void rollback() throws SQLException {
Connection connection=getConnection();
if(connection!=null){
connection.rollback();
}
}
public static void close() throws SQLException {
Connection connection=getConnection();
if(connection!=null){
connection.close();
threadLocal.remove();
}
}
public static void closeAll(ResultSet rs, Statement stat,Connection conn){
try {
if(rs!=null){
rs.close();
}
if(stat!=null){
stat.close();
}
if(conn!=null){
if(conn.getAutoCommit()){
conn.close();
}
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
userDao和userDaoImpl
package com.xing.dao;
import com.xing.domain.User;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的、先苦后甜
* day38web2
* 2021/4/28 15:10
*/
public interface UserDao {
void insert(User user);
User selectByUserAndPassword(String username,String password);
boolean selectByUserName(String username);
}
package com.xing.dao.impl;
import com.xing.dao.UserDao;
import com.xing.domain.User;
import com.xing.utils.DataSourceUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import java.sql.Connection;
import java.sql.SQLException;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的、先苦后甜
* day38web2
* 2021/4/28 15:13
*/
public class UserDaoImpl implements UserDao {
//查询运行程序 QreryRunner类(org.apache.commons.dbutils.QueryRunner)
// 是Dbutils的核心类之一,它显著的简化了SQL查询,
// 并与ResultSetHandler协同工作将使编码量大为减少
private QueryRunner qr=new QueryRunner();
@Override
public void insert(User user) {
Connection connection = DataSourceUtils.getConnection();
Object[] params={user.getUsername(),user.getPassword(),user.getEmail(),user.getGender(),user.getFlag(),user.getRole(),user.getCode()};
try {
qr.update(connection,"insert into tb_user(id,username,password,email,gender,flag,role,code) values (null ,?,?,?,?,?,?,?)",params);
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
DataSourceUtils.closeAll(null, null, connection);
}
}
@Override
public User selectByUserAndPassword(String username, String password) {
Connection connection = DataSourceUtils.getConnection();
try {
return qr.query(connection,"select * from tb_user where username=? and password=?",new BeanHandler<>(User.class),username,password);
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
DataSourceUtils.closeAll(null, null, connection);
}
}
@Override
public boolean selectByUserName(String username) {
Connection connection = DataSourceUtils.getConnection();
try {
User user = qr.query(connection, "select * from tb_user where username=? ", new BeanHandler<>(User.class), username);
if(user==null){
return false;
}
return true;
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
DataSourceUtils.closeAll(null, null, connection);
}
}
}
userService和userServiceImpl
package com.xing.service;
import com.xing.domain.User;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的、先苦后甜
* day38web2
* 2021/4/28 15:37
*/
public interface UserService {
void regist(User user);
User login(String username,String password);
}
package com.xing.service.impl;
import com.xing.dao.UserDao;
import com.xing.dao.impl.UserDaoImpl;
import com.xing.domain.User;
import com.xing.service.UserService;
import com.xing.utils.DataSourceUtils;
import java.sql.SQLException;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的、先苦后甜
* day38web2
* 2021/4/28 15:39
*/
public class UserServiceImpl implements UserService {
private UserDao userDao=new UserDaoImpl();
@Override
public void regist(User user) {
try {
DataSourceUtils.begin();
//验证用户是否存在
boolean b = userDao.selectByUserName(user.getUsername());
if(b){
throw new RuntimeException("用户名已存在");
}
userDao.insert(user);
DataSourceUtils.commit();
} catch (Exception e) {
try {
DataSourceUtils.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
throw new RuntimeException(e);
} finally {
try {
DataSourceUtils.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
@Override
public User login(String username, String password) {
User user = userDao.selectByUserAndPassword(username, password);
if(user==null){
throw new RuntimeException("用户名或者密码错误");
}
if(user.getFlag()!=1){
throw new RuntimeException("账户未激活或已失效");
}
return user;
}
}
servlet
package com.xing.servlet;
import com.xing.domain.User;
import com.xing.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的、先苦后甜
* day38web2
* 2021/4/28 16:24
*/
@WebServlet(value = "/loginservlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
String username = req.getParameter("username");
String pwd = req.getParameter("pwd");
//校验
//trim() 方法用于删除字符串的头尾空白符。修剪
if(username==null||username.trim().length()==0){
resp.getWriter().write("用户名不能为空");
return;
}
if(pwd==null||pwd.trim().length()==0){
resp.getWriter().write("密码不能为空");
return;
}
UserServiceImpl userService = new UserServiceImpl();
try {
User login = userService.login(username, pwd);
resp.sendRedirect("index.jsp");
} catch (Exception e) {
e.printStackTrace();
resp.sendRedirect("message.html");
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
package com.xing.servlet;
import com.xing.domain.User;
import com.xing.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
* 静,谦虚谨慎,心胸宽广容纳所有好的坏的、先苦后甜
* day38web2
* 2021/4/28 15:51
*/
@WebServlet(value = "/registservlet")
public class RegistServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1乱码问题
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//2接收数据
String username = req.getParameter("username");
String pwd = req.getParameter("pwd");
String repwd = req.getParameter("repwd");
String email = req.getParameter("email");
String gender = req.getParameter("gender");
//3检验
//3.1非空校验
//trim() 方法用于删除字符串的头尾空白符。
if(username==null||username.trim().length()==0){
resp.getWriter().write("用户名不能为空");
return;
}
if(pwd==null||pwd.trim().length()==0){
resp.getWriter().write("密码不能为空");
return;
}
if(!pwd.equals(repwd)){
resp.getWriter().write("两次密码不一致");
return;
}
if(email==null||email.trim().length()==0){
resp.getWriter().write("邮箱不能为空");
return;
}
//4.访问数据库层
UserServiceImpl userService = new UserServiceImpl();
User user = new User(null,username,pwd,email,gender,0,1,"");
try {
userService.regist(user);
//重定向登录页面
resp.sendRedirect("login.html");
} catch (Exception e) {
e.printStackTrace();
req.getRequestDispatcher("/message.html").forward(req, resp);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
Login.html和resist.html和message.html和index.jsp
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<h1>用户登录</h1>
<form action="loginservlet" method="post" enctype="application/x-www-form-urlencoded">
<table>
<tr>
<td>用户名</td>
<td>
<input type="text" name="username">
</td>
</tr>
<tr>
<td>密码</td>
<td>
<input type="password" name="pwd">
</td>
</tr>
<tr>
<td colspan="2">
<button type="submit">登录</button>
</td>
</tr>
</table>
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<h1>用户注册</h1>
<form action="registservlet" method="post" enctype="application/x-www-form-urlencoded">
<table>
<tr>
<td>用户名</td>
<td>
<input type="text" name="username">
</td>
</tr>
<tr>
<td>密码</td>
<td>
<input type="password" name="pwd">
</td>
</tr>
<tr>
<td>确认密码</td>
<td>
<input type="password" name="repwd">
</td>
</tr>
<tr>
<td>邮箱</td>
<td>
<input type="email" name="email">
</td>
</tr>
<tr>
<td>性别</td>
<td>
<input type="radio" name="gender" value="male">男
<input type="radio" name="gender" value="famale">女
</td>
</tr>
<tr>
<td>
<input type="submit" name="提交">
<input type="reset" name="重置">
</td>
</tr>
</table>
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>错误信息</title>
</head>
<body>
<h1>失败</h1>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: xingfuhao
Date: 2021/4/28
Time: 16:35
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>网站首页。。。。</h2>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8h40XUZj-1619621262049)(…/…/Library/Application%20Support/typora-user-images/image-20210428211551340.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oK6wOPpF-1619621262051)(…/…/Library/Application%20Support/typora-user-images/image-20210428221826072.png)]