JavaWeb
一、html
1、创建HTML文件
bgcolor:背景颜色
onclick:点击事件
alert():警告函数
</br>:换行
1.1 双标签:
<p></p>
1.2 单标签
</br>
1.3 标签不能交叉嵌套
1.4 font标签
<!--font标签
font标签是字体标签,可以修改文本的颜色,大小,字体
color:修改颜色
fase:修改字体
size:大小
-->
1.5 特殊字符
<!--
常用的特殊字符:
> ====> <
< ====> >
空格 ====>
-->
我是<br>标签</br>
警告 远一点
1.6 标题标签
<!--
标题标签只有1-6
<h1> -- <h6>
<h1>最大
<h6>最小
align属性:对齐属性
left:左对齐(默认)
right:右对齐
center:居中
-->
<body>
<!--标题标签-->
<h1 align="left">标题标签</h1>
<h2 align="right">标题标签</h2>
<h3 align="center">标题标签</h3>
<h4>标题标签</h4>
<h5>标题标签</h5>
<h6>标题标签</h6>
1.7 超链接
属性:
href:设置连接的地址
target:设置那个目标进行跳转
_self:表示当前页面
_blank:表示打开新的页面进行跳转
1.8 列表标签
无序列表、有序列表
<!--ul无序列表
ul:无序列表
li:列表项
type:可以修改列表项前的符号
-->
<ul>
<li>赵四</li>
<li>刘能</li>
<li>宋小宝</li>
<li>小沈阳</li>
</ul>
1.9 img标签
<!--img标签-->
<!--
img标签是图片标签,用来显示图片
src标签属性可以设置图片的路径
width:设置图片宽度
height:设置图片高度
border:设置图片边框
alt:找不到图片显示的信息
路径分为绝对路径和相对路径
相对路径:
. 当前文件所在的目录
.. 当前文件所在的上一级目录
当前文件所在目录的文件,相当于./文件名
相对路径:
http://ip:port/工程名/资源路径
border:边框
-->
<img src="./imgs/1.jpg" width="200px" height="200px" border="1" alt="找不到图片"/>
<img src="../imgs/2.jpg" width="200px" height="200px"/>
<img src="../imgs/3.jpg" width="200px" height="200px"/>
<img src="../imgs/4.jpg" width="200px" height="200px"/>
<img src="../imgs/5.jpg" width="200px" height="200px"/>
</body>
1.10 表格标签
<!--
table:表格标签
tr:行
th:表头标签
td:单元格标签
width:表格宽度
height:表格高度
b:加粗标签
align:表格相对于页面的对齐
-->
<body>
<table border="1" cellspacing="0" width="300" height="300" align="center">
<tr>
<th>11</th>
<th>22</th>
<th>33</th>
</tr>
<tr>
<td>44</td>
<td>55</td>
<td>66</td>
</tr>
<tr>
<td>77</td>h
<td>88</td>
<td>99</td>
</tr>
</table>
</body>
1.11 跨行跨列表格
<!--
colspan:合并行单元格
rowspan:合并列单元格
-->
<table border="1" width="500" height="500" cellspacing="0">
<tr>
<td colspan="2">1.1</td>
<td>1.3</td>
<td>1.4</td>
<td>1.5</td>
</tr>
<tr>
<td rowspan="2">2.1</td>
<td>2.2</td>
<td>2.3</td>
<td>2.4</td>
<td>2.5</td>
</tr>
<tr>
<td>3.2</td>
<td>3.3</td>
<td>3.4</td>
<td>3.5</td>
</tr>
<tr>
<td>4.1</td>
<td>4.2</td>
<td>4.3</td>
<td colspan="2" rowspan="2">4.4</td>
</tr>
<tr>
<td>5.1</td>
<td>5.2</td>
<td>5.3</td>
</tr>
</table>
1.12 iframe标签
</head>
<!--
iframe标签可以在页面上开辟一个小区域,显示一个单独的标签
-->
<body>
<iframe src="2-标题标签.html" width="500" height="600" name="zbc"></iframe>
<ul>
<li><a href="0-font标签.html" target="zbc">0-font标签.html</a></li>
<li><a href="1-特殊字符.html" target="zbc">1-特殊字符.html</a></li>
<li><a href="2-标题标签.html" target="zbc">2-标题标签.html</a></li>
</ul>
</body>
1.13 表单标签
<!--form就是表单标签
type="text":文件输入框
value="默认值":文本框显示的默认值(默认显示的内容)
input type=text 文本框
input type=password 密码框
input type=radio 单选框
input type=checkbox 复选框
input type=reset 重置按钮
input type=submit 提交按钮
input type=button 按钮
input type=file 文件上传域
input type=hidden 隐藏域
select 下拉列表框
用法:
<select>
<option>下拉内容</option>
</select>
textarea 多行文本输入框
rows 可以设置显示几行的高度
clos 设置每行可以显示几个字符宽度
-->
1.14 表单标签提交的细节
<!--form就是表单标签
https://www.baidu.com/ 服务器地址
? 分隔符
action=login&sex=on 请求参数(要有name属性的才会显示出来)
下面是给用户名称加了name属性后的效果:
https://www.baidu.com/
?
action=login&username=username&sex=on
表单提交的时候,数据没有发送给服务器的三种情况:
1、表单项没有name属性值
2、单选、复选(下拉列表中的option)都需要添加value,以便发送给服务器
3、表单项不在提交的form标签中
-->
1.15 GET请求和POST请求的特点
GET提交的特点:
1、浏览器地址栏中的地址是:action属性【+?+请求参数】
请求参数的格式是:name=value&name=value
2、不安全
3、有数据长度限制
POST请求的特点是:
1、浏览器地址只有action属性值
2、相对于get请求安全
3、理论上没有数据长度的限制
-->
1.16 其他标签
<!--
div、span、p
div 标签默认独占一行
span 标签长度是封装数据的长度
p 默认会在段落的上方或下方空出一行来(有的话就不空)
-->
二、css
1.1 link
link用于引入css样式代码
<link rel="stylesheet" type="text/css" href="1.css">
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rGf0ZvjA-1649144547334)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210502133631313.png)]
1.2 id选择器(纯数字不能作为id名)
<style type="text/css">
#a{
color:blue;
font-size: 30px;
border: 1px yellow solid;
}
#b{
color: red;
font-size: 20px;
border: 5px blue dotted;
}
</style>
</head>
<body>
<div id="a">div标签1</div>
<span id="b">span标签2</span>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VvpSNumS-1649144547335)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210502135839872.png)]
1.3 class类型选择器(纯数字不能作为class名)
<style type="text/css">
.class01{
color: blue;
font-size: 20px;
border: 1px solid yellow;
}
.class02{
color: green;
font-size: 26px;
border: 1px solid red;
}
</style>
</head>
<body>
<div class="class01">div标签1</div>
<span class="class02">span标签2</span>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eGmEyG2X-1649144547336)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210502135759775.png)]
1.4 组合选择器
<title>组合选择器</title>
<style type="text/css">
.class02,#id01{
color: blue;
font-size: 20px;
border: 1px yellow solid;
}
</style>
</head>
<body>
<div id="id01">div标签1</div>
<span class="class02">span标签2</span>
</body>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6LMSNkiR-1649144547336)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210502140255454.png)]
1.5 CSS常用样式
color:颜色
border:边框
width:宽度
height:高度
background:背景颜色
div居中:
margin-left:auto
margin-right:auto
文本居中:
text-align:center
超链接去下划线:
text-decoration:none
表格细线:
table{
border:1px solid black;/设置边框
border-collapse:collapse;/将边框合并
td,th{
border:1px solid black;/设置边框
}
}
列表去除修饰:
ul{
list-style:none;
}
三、JavaScript
1. JS 引用外部代码
<!--
需要使用script引入外部的js文件来执行
src属性是专门用来引入js文件路径(可以是相对,也可以是绝对)
script标签是用来定义js代码的,也可以用来引入js文件
但是两个功能二选一来使用,不能同时使用两个功能
-->
<script type="text/javascript" src="1.js"></script>
<script type="text/javascript">
alert('张三');
</script>
1.2 变量类型
JavaScript的变量类型:
数值类型: number
字符串类型 string
对象类型 object
布尔类型 Boolean
函数类型 function
JavaScript里的特殊的值:
undefined 未定义,所有JS变量未赋予初始值的时候,默认值都是undefined
null 空值
NAN 全称是:Not a Number:非数字,非数值
<script type="text/javascript">
var i;
// alert(i); // undefined
i = 1;
// alert(i);// 1
// alert(typeof (i)); // number
i = 2;
alert(i); //输出2,JavaScript弱类型定义后可变
var a = 1;
var b = "abc";
alert(a * b); // 输出NAN 非数字
</script>
1.3 关系运算
等于 == 等于是简单的数字面值的比较
全等于 === 全等于除了做字面值的比较之外,还会比较两个变量的数据类型
<script type="text/javascript">
var a = 123;
var b = "123";
alert(a == b); // true
alert(a === b); // false
</script>
1.4 逻辑运算
0,null,undefined,“”(空串),都认为是false
& 且运算(真最假一):
两种情况:
第一种:当表达式全为真的时候,返回最后一个表达式的值
var a = "abc";
var b = true;
var d = false;
var c = null;
alert(a || b) //true
第二种:当表达式中,有一个为假的时候,返回第一个为假的表达式
var a = "abc";
var b = true;
var d = false;
var c = null;
alert(a || d) //false
|| 或运算(假一真最):
第一种情况:当表达式全为假的时候,返回最后一个表达式的值
var a = "abc";
var b = true;
var d = false;
var c = null;
alert(d || c) //null
第二种情况:只要有一个表达式为真,就会返回第一个为真的表达式
var a = "abc";
var b = true;
var d = false;
var c = null;
alert(a || d) //abc
1.5 数组
<title>数组</title>
<script type="text/javascript">
var arr = []; //定义空数组
// alert(arr.length); // 0
arr[0] = 12;
// alert(arr[0]); // 12
// alert(arr.length) // 1
arr[2] = "abc";
// alert(arr.length); // 3
// 数组的遍历
for (var i = 0; i < arr.length; i++) {
alert(arr[i]);
}
</script>
1.6 函数(js函数不允许函数重载)
第一种定义方式:
<title>函数</title>
<script type="text/javascript">
// 无参函数
function fun() {
alert("函数被调用了");
}
// 函数调用
// fun();
// 有参函数
function fun1(a, b) {
alert("有参函数调用a==>" + a + ",b==>" + b);
}
// fun1(12,"abc");
function fun2(num1, num2) {
var result = num1 + num2;
return result;
}
alert(fun2(100,100));
</script>
第二种定义方式:
<title>函数的第二种定义方式</title>
<script type="text/javascript">
var fun = function () {
alert("无参函数的调用");
}
fun();
var fun1 = function (a, b) {
alert("有参函数的调用,a==>" + a + ",b==>" + b)
}
fun1(1, 2);
var fun2 = function (num1, num2) {
var result = num1 + num2;
return result;
}
alert(fun2(100, 100));
</script>
1.7 隐形函数
<title>隐形函数</title>
<script type="text/javascript">
function fun(num1, num2) {
//alert(arguments[0]);
//alert(arguments[1]);
//alert(arguments[2]);
//alert(arguments[3]);
// alert("无参函数")
var result = 0;
var re = "含有非数字值,结束循环";
for (var i = 0; i < arguments.length; i++) {
if (typeof (arguments[i]) == "number") {
result += arguments[i];
} else {
//alert("含有非数字值字符");
return re;
}
}
return result;
}
alert(fun(1, 2, "abc", 4, 5));
</script>
</head>
1.8 JS中的自定义对象
小括号定义:
<title>object自定义对象</title>
<script type="text/javascript">
var obj = new Object();
obj.name = "华仔";
obj.age = 18;
obj.fun = function () {
alert("姓名:" + this.name + ",年龄:" + this.age);
}
alert(obj.name); //华仔
alert(obj.age); //18
obj.fun();
</script>
</head>
花括号定义:
<script>
var obj = {
name: "张三",
age: 18,
fun: function () {
alert("姓名:" + this.name + ",年龄:" + this.age);
}
}
alert(obj.age);
alert(obj.name);
obj.fun();
</script>
1.9 JS 常用事件
onload 加载完成时间 页面加载完成之后,常用于做页面js代码初始化的操作
onclick 单击事件 常用于按钮的点击响应操作
onblur 失去焦点事件 常用于输入框失去焦点后验证其输入内容是否合法
onchange 内容发生改变事件 常用于下拉列表和输入框内容发生改变后操作
onsubmit 表单提交事件 常用于表单提交之前,验证所有表单项是否合法
(1)onload事件:
<title>onload事件</title>
<script type="text/javascript">
// onload事件静态注册方法
function fun() {
alert("静态注册事件");
}
// onload事件动态注册方法
window.onload = function () {
alert("动态注册事件");
}
</script>
</head>
<!--
静态注册的onload事件
<body onload="fun()">
-->
<body>
</body>
(2)onclick事件:
<title>$Title$</title>
<script type="text/javascript">
// 静态注册事件
function fun() {
alert("静态注册事件");
}
// 动态注册事件
window.onload = function () {
var onobj = document.getElementById("but");
onobj.onclick = function () {
alert("动态注册事件");
}
}
</script>
</head>
<body>
<!--静态注册事件-->
<button onclick="fun()">按钮1</button>
<!--动态注册事件-->
<button id="but">按钮2</button>
</body>
(3)onchange事件:
<title>onchange事件</title>
<script type="text/javascript">
// onchange静态注册事件
function onchangefun() {
alert("onchange静态注册事件");
}
window.onload = function () {
var onchangefun1 = document.getElementById("idonchange");
onchangefun1.onchange = function () {
alert("onchange动态注册事件");
}
}
</script>
</head>
<body>
<!--onchange静态注册事件-->
请选择你心中的女神:<br/>
<select onchange="onchangefun()">
<option>--女神--</option>
<option>芳芳</option>
<option>娘娘</option>
<option>环环</option>
<option>知了</option>
</select>
<br/>
<br/>
<!--onchange动态注册事件-->
请选择你心中的女神:<br/>
<select id="idonchange">
<option>--男神--</option>
<option>国哥</option>
<option>郭富城</option>
<option>华仔</option>
<option>发哥</option>
</select>
(4)onsubmit事件:
<title>onsubmit事件</title>
<script type="text/javascript">
function onsubmitfun() {
alert("静态注册表单提交---发现不合法");
return false; // return false可以阻止表单提交,不想阻止的话就是return true
}
window.onload = function () {
var slectobj = document.getElementById("sel01");
slectobj.onsubmit = function () {
alert("动态注册表单提交---发现不合法");
return false;// return false可以阻止表单提交,不想阻止的话就是return true
}
}
</script>
</head>
<body>
<form action="http://www.baidu.com" method="get" onsubmit="return onsubmitfun()"/>
<input type="submit" value="静态注册"/>
</form>
<form id="sel01" action="http://www.baidu.com" method="get"/>
<input type="submit" value="动态注册"/>
</form>
1.10 getElementById
<title>getElementById</title>
<script type="text/javascript">
function textfun() {
var text1 = document.getElementById("textid");// 通过id获取标签
var textvalue = text1.value;// 获取value值(文本框的内容)传给textvalue
// alert(textvalue);
var spanid = document.getElementById("usernamespan");
// alert(spanid.innerHTML);
// innerHTML:表示起始标签和结束标签的内容
// innerHTML:这个属性可读可写
var patt = /^\w{5,12}$/;
if (patt.test(textvalue)) {
// tets()方法用于作比较
spanid.innerHTML = "<img src='true.png' width='30' height='30'>"
} else {
spanid.innerHTML = "<img src='false.jpg' width='20' height='20'>"
}
}
</script>
</head>
<body>
用户名:<input type="text" id="textid"/>
<span id="usernamespan" style="color: red;">
</span>
<button onclick="textfun()">
验证
</button>
1.11 正则表达式
var partt = /e/; 表示字符串中是否含有字母e
var str = "abcde";
alert(partt.test(str));
/*var parrt1 = /[a-z]/; 表示字符串中是否含有任意小写字母
var str2 = "12345h"; true
var str2 = "12345"; false
alert(parrt1.test(str2));*/
/*var partt2 = /[A-Z]/; 表示字符串中是否含有任意大写字母
var str3 = "123A"; true
var str3 = "123"; false
alert(partt2.test(str3));*/
/*var partt3 = /[0-9]/; 表示字符串中是否含有数字
var str3 = 123;
alert(partt3.test(str3));*/
/*var partt4 = /\w/; 表示字符后是否包含字母、数字、下划线
var str4 = "]]]";
alert(partt4.test(str4));*/
/* var partt5 = /a+/; 表示字符串至少包含一个a字符
var str5 = "1233a";
alert(partt5.test(str5));*/
var partt6 = /^\w{5,12}$/;
var str6 = "87g129";
alert(partt6.test(str6));
</script>
1.12 getElementsByName
<title>getElementsByName</title>
<script>
// 全选
function checkwall() {
var hobies = document.getElementsByName("hobby");
// alert(hobies[0].checked);
for (var i = 0; i < hobies.length; i++) {
hobies[i].checked = true;
}
}
// 全不选
function checknowall() {
var hobies = document.getElementsByName("hobby");
for (var i = 0; i < hobies.length; i++) {
hobies[i].checked = false;
}
// alert(hobies[0].checked);
}
// 反选
function fanxuan() {
var hobies = document.getElementsByName("hobby");
for (var i = 0; i < hobies.length; i++) {
if (hobies[i].checked == true) {
hobies[i].checked = false;
} else {
hobies[i].checked = true;
}
}
}
</script>
</head>
<body>
<input type="checkbox" name="hobby" value="java">java
<input type="checkbox" name="hobby" value="js">javaScript
<input type="checkbox" name="hobby" value="php">php
<br/>
<br/>
<button onclick="checkwall()">全选</button>
<button onclick="checknowall()">全不选</button>
<button onclick="fanxuan()">反选</button>
1.13 getElementsByTaName
<title>getElementsByName</title>
<script>
// 全选
function checkwall() {
// hobies 集合,跟数组一样可以.length查看长度,也可以遍历
var hobies = document.getElementsByTagName("input");
// alert(hobies.length); // 返回一个集合
for (var i = 0; i < hobies.length; i++) {
hobies[i].checked = true;
}
}
// alert(hobies[0].checked);
</script>
</head>
<body>
<input type="checkbox" name="hobby" value="java">java
<input type="checkbox" name="hobby" value="js">javaScript
<input type="checkbox" name="hobby" value="php">php
<br/>
<br/>
<button onclick="checkwall()">全选</button>
</body>
1.14 document的三个查询方法整理:
1、如果有id,则优先使用getElementById方法进行查询
2、如果没有id,则优先使用getElementsByName,按name属性进行查询
3、如果没有id和name属性,再使用getElementsByTaName,按标签属性进行查询
4、注意:
浏览器执行代码从上到下执行,id属性写在外面的时候查询不到,要在页面加载完成之后才能执行!
四、jQuery
1.0 引入jQuery库和绑定点击事件
<script type="text/javascript" src="../jQuery-3.6.0/jQuery-3.6.0.js"></script>
<!-- window.onload = function () {
var btn = document.getElementById("btn01");
btn.onclick = function () {
alert("js原生事件");
}
}
-->
<script type="text/javascript">
$(function () {
var $1 = $("#btn01"); // 按id查询标签
$1.click(function () { // jQuery绑定点击事件
alert("jquery 的单击事件");
});
})
alert($);
</script>
1.1 核心函数
(1)传入的参数是【函数】的时候:
表示页面加载完成之后,window.onload = function(){}
// 1、传入参数为函数时
$(function () {
alert("传入参数为函数时");
})
(2)传入的参数为【HTML】字符串时:
会给我们创建这个HTML标签对象
// 1、传入参数为HTML字符串时
$(function () {
$("<div>" +
" <span>div-span01</span>" +
" <span>div-span02</span>" +
"</div>").appendTo("body")
})
(3)传入的参数为【选择器字符串】时:
$(“#id属性值”) id选择器,根据id查询选择对象
$(“标签名”) 标签选择器,根据指定的标签名查询标签对象
$(“.class属性值”); 类型选择器,可以根据class属性查询标签对象
(4)传入参数为【DOM对象】时:
会把dom对象转换为jQuery对象
五、xml
1.0 什么是xml?
xml是可扩展的标记性语言。
1.1 xml的作用:
(1)用来保存数据,而且这些数据具有自我描述性
(2)它可以作为项目或者模块的配置文件
(3)还可以作为网络传输数据的格式(现在以json为主)
1.2 xml语法
(1)注释和HTML一样
1.3 元素(标签)
1、什么是xml元素?
xml元素指的是从(且包括)开始标签直到(且包括结束标签)的部分
元素可包括其他元素、文本或者两者的混合物。元素也可以拥有属性。
1.4 元素可以包括
六、 Tomcat
1.0 什么是javaweb?
javaweb是指,所有通过Java语言编写可以通过浏览器访问的程序总称呢个,叫javaweb。
javaweb是基于请求和响应来开发的。
1.2 什么是请求?
请求是指客户端给服务器发送数据,叫请求request
1.3 什么是响应?
响应是指服务器给客户端回传数据,叫响应response
1.4 请求和响应的关系?
成对属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U7C16t2v-1649144547338)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210506222316536.png)]
1.5 web资源的分类
web资源按实现的技术和呈现的效果的不同,又分为静态和动态资源两种
静态资源:html、css、js、txt、mp4、jpg图片
动态资源:jsp页面、servlet程序
1.6 Tomcat的安装
a、找到需要的zip压缩包,然后解压到到安装的目录即可
1.7 tomcat目录介绍
bin目录:专门存放tomcat服务器的可执行程序
conf目录:专门用来存放tomcat服务器的配置文件
lib目录:专门用来存放tomcat服务器的jar包
logs目录:专门用来存放tomcat服务器运行时输出的日志信息
temp目录:专门用来存放tomcat服务器运行时临时产生的临时数据
web apps目录:专门用来存放部署的web工程(一个目录一个过程)
work目录:是tomcat工作时候目录,存放tomcat运行时jsp翻译为servle的源码,和session钝化(序列化)的目录。
1.8 如何启动tomcat服务器
找到tomcat目录下的bin目录下的startup.bat文件,双击,就可以启动tomcat服务器
1.9 如何测试tomcat服务器启动成功
打开浏览器,在浏览器地址栏中输入以下地址测试:
1、http://localhost:8080
2、http://127.0.0.1:8080
3、http://电脑IP:8080
当出现如下界面说明tomcat启动成功:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WuaDoHvs-1649144547338)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210506225912051.png)]
常见的启动失败的情况:
(1)双击startup.bat文件就会出现一个小黑窗口一闪而过。
这个时候,失败的原因多半是因为没有配置好JAVA_HOME环境变量
1.10 另一种启动tomcat的方式
命令行:
1、打开命令行,cd到tomcat的目录
2、输入catalina run
1.11 停止tomcat的方式:
第一种:点击tomcat服务器窗口的关闭按钮
第二种:把tomcat服务器窗口置为当前窗口,然后按ctrl+c
第三章:找到tomcat的bin目录下的shutdown.bat,双击,就可以停止服务器
1.12 如何修改tomcat的端口号
MySQL默认的端口号是3306
tomcat的端口号是8080
找到tomcat目录下的conf目录,找到server.xml配置文件,再找到connector标签,修改port="自己要修改的端口号"修改完端口号一定要重启tomcat才能生效
端口号范围:1-65535,1000以内是系统再用的端口号,建议选1000以外的端口号
http默认的端口号是80!看不到的端口就是80端口
1.13 如何部署web工程到tomcat中
第一种方法:只需要把web工程的目录拷贝到tomcat的webapps目录下即可:
1、在webapps目录下创建一个book工程:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eXAyZLhp-1649144547339)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507133123616.png)]
2、把书城项目第一阶段的内容拷贝到里面:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F7nexjD0-1649144547340)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507133227728.png)]
3、如何访问tomcat下的web工程.
在浏览器输入自己的ip地址加上要访问的工程目录,如:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q1UJGjq7-1649144547341)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507134458721.png)]
第二种部署方法:
找到tomcat下的conf目录/catalina/localhost/下创建如下配置文件:
<Context path=“/abc” docBase=“C:\book”>
配置完需要重启tomcat服务器!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tpgQXNYZ-1649144547342)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507181716223.png)]
1.14 手托HTML页面和在地址栏输入IP地址访问的背后的不同原因:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aKtpGrOr-1649144547342)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507182927130.png)]
1.15 ROOT的工程的访问,以及默认index.html页面的访问
当我们在浏览器地址栏中输入访问地址如下:
http://ip:port/ =====>>>> 没有工程名的时候,默认访问的是root工程
当我们在浏览器中输入的访问地址如下:
http://ip:port/工程名/ =====>>>> 没有资源名,默认访问index.html页面
1.16 IDEA整合tomcat服务器
路径:
File | Settings | Build, Execution, Deployment | Application Servers
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lPJYxcQS-1649144547343)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507184855191.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KDifQP5f-1649144547343)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507185019714.png)]
七、IDEA中动态web工程的操作
1.0 IDEA中如何创建动态web工程
1、创建一个新的模块
2、选择你要创建的工程的类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Og3BX4L-1649144547344)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507185519304.png)]
3、输入你的模块名点击finish
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qmdQ9EKp-1649144547344)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507185939967.png)]
4、创建成功如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lATcxu1B-1649144547345)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507190110757.png)]
关于web工程目录的简单介绍:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ypKpMMZS-1649144547345)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507190653374.png)]
1、src:存放自己编写的Java源代码
web:专门用来存放web工程的资源文件
比如:html页面、css文件、js文件
WEB-INF:是一个受服务器保护的目录,浏览器无法直接访问到此目录的内容
web.xml:他是整个动态web工程的配置部署描述文件,可以在这里配置很多web工程的组件,比如:
servlet程序、filter过滤器、listener监听器等等
lib(自己创建的):用来存放第三方的jar包。【IDEA还需要自己配置导入】
1.1 如何在IDEA中部署工程到tomcat上运行
1、建议修改web工程对应的tomcat运行实例名称
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nklUK2eD-1649144547346)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507193120539.png)]
点击蓝底区域进行编辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H6bnLswJ-1649144547346)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507193219444.png)]
2、确认你的tomcat示例中有你要部署运行的web工程模块
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aS4pKzrd-1649144547347)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507193508308.png)]
3、在IDEA中如何运行,和停止tomcat实例
3.1 启动tomcat实例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3tFLplVq-1649144547347)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507194326301.png)]
3.2 debug启动tomcat运行实例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Xa5qcfy-1649144547347)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507194527029.png)]
3.3 停止tomcat运行实例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2BaZtFfc-1649144547348)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507194658623.png)]
八、servlet技术
1.0 什么是servlet?
1、servlet是javaEE的规范之一。规范就是接口
2、servlet就javaweb三大组件之一。
三大组件分别是:servlet程序、filter过滤器、Listener监视器。
3、servlet是运行在服务器上的一个Java小程序,它可以接受客户端发送过来的请求,并响应数据给客户端。
2.0 第一个servlet程序
2.1 手动实现servlet程序
1、编写一个类去实现servlet接口
2、实现service方法,处理请求,并响应数据
3、到web.xml中去配置servlet程序的访问地址
!--Servlet标签给tomcat配置Servlet程序-->
<servlet>
<!--servlet-name标签 servlet程序起一个别名(一般是英文名)-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class是servlet程序的全类名-->
<servlet-class>com.atscitc.Servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet-mapping标签给servlet程序配置访问地址-->
<servlet-mapping>
<!--servlet-name标签的作用是告诉服务器,我当前配置的地址给那个servlet程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--url-pattern标签配置访问地址
/ 斜杠在服务器解析的时候,表示的地址为:http://ip:port/工程路径
/hello 表示地址为:http://ip:port/工程路径/hello
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hp5vTtMi-1649144547348)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507215224588.png)]
2.2 servlet的生命周期
1、执行servlet构造器的方法
2、执行init初始化方法
第一、二步,实在第一次访问,的时候创建servlet程序会调用
3、执行service方法
第三步,每次访问都会调用。
4、执行destory销毁方法
第四步,在web工程停止的时候会调用。
2.3 GET和POST请求的分发处理
public class HelloServlet implements Servlet {
public HelloServlet() {
System.out.println("1 构造器方法");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 init初始化方法");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/*
service方法是专门用来处理请求和响应的
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3 service Hello Servlet 被访问了");
// 类型转化(因为它有getmethod()方法)
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 获取请求的方式
String method = httpServletRequest.getMethod();
// System.out.println(method);
if ("GET".equals(method)) {
doget();
} else if ("POST".equals(method)) {
dopost();
}
}
public void doget() {
System.out.println("get请求");
}
public void dopost() {
System.out.println("post请求");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4 destory销毁方法");
}
2.4 通过继承httpservlet实现servlet程序
一般在实际项目开发中,都是使用继承HTTPServlet类的方式去实现servlet程序
1、编写一个类去继承 HttpServlet 类
2、根据业务需要重写doget和dopost方法
3、到web.xml中配置servlet程序的访问地址
2.4 使用IDEA创建servlet程序
1、
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nEKpV1nM-1649144547349)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507231708733.png)]
2、
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c8nizRZq-1649144547349)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210507231926708.png)]
3、配置web.xml文件
只需要配置
<servlet>
<servlet-name>HelloServlet3</servlet-name>
<servlet-class>com.atscitc.Servlet.HelloServlet3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet3</servlet-name>
<url-pattern>/hello3</url-pattern>
</servlet-mapping>
2.5 整个servlet类的继承体系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-laYQGFzN-1649144547350)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210508101754463.png)]
2.6 ServletConfig类----init中使用
是什么:
从名字上看是servlet的配置信息类
servlet程序和servletConfig对象都是由tomcat负责创建,我们负责使用
servlet程序默认是从第一次访问的时候就创建,servletconfig是每个servlet程序创建时,就创建一个对应的servletconfig对象
作用:
1、可以获取servlet程序的别名,servlet-name的值
public void init(ServletConfig servletConfig) throws ServletException {
// 1、可以获取servlet程序的别名,servlet-name的值
System.out.println("servlet程序的别名是" + servletConfig.getServletName());
}
2、获取初始化参数init-param
1、要现在web.xml中配置init-param,在servlet-class下配置
<servlet>
<!--servlet-name标签 servlet程序起一个别名(一般是英文名)-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class是servlet程序的全类名-->
<servlet-class>com.atscitc.Servlet.HelloServlet</servlet-class>
<!--<init-param>是初始化参数-->
<init-param>
<!--<param-name>标签是参数名-->
<param-name>username</param-name>
<!-- <param-value>参数值-->
<param-value>root</param-value>
</init-param>
<init-param>
<!--<param-name>标签是参数名-->
<param-name>url</param-name>
<!-- <param-value>参数值-->
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</servlet>
2、
public void init(ServletConfig servletConfig) throws ServletException {
// 2、获取初始化参数init-param
System.out.println("初始化参数username的值是" + servletConfig.getInitParameter("username"));
System.out.println("初始化参数url的值是" + servletConfig.getInitParameter("url"));
}
3、获取servletContext对象
public void init(ServletConfig servletConfig) throws ServletException {
// 3、获取servletContext对象
System.out.println(servletConfig.getServletContext());
}
2.7 servletConfig类的补充说明
1、每一个servletconfig是对应它自己的servlet程序的,不能再别人的servlet程序里得到别人的servlet信息!
|
|
v
v
------(只能得到servlet对应的web.xml配置文件的servlet信息!!)
2、当我们重写了init指针之后,一定要调用
super.init(config);方法
不然就会报如下错误:
java.lang.NullPointerException
com.atscitc.Servlet.HelloServlet2.doGet(HelloServlet2.java:26)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
原因:config之前被保存起来了(this config = config),子类和父类都有init,在调用init的时候就调用子类,父类当中的保存操作就会丢失,就不会在执行,而使用super.init(config);方法之后就又调用执行了!
2.8 servletContext类
是什么?
1、是一个接口,表示servlet上下文对象
2、一个web工程,只有一个servletContext对象实例
3、servleContext是一个域对象
什么是域对象?
是可以像map一样,可以存取数据的对象,叫域对象。
这里的域是指存储数据的操作范围。范围—整个web工程。
存数据 取数据 删除数据
Map put() get() remove()
域对象 setAttribute() getAttribute() removeAttribute()
四个作用:
1、获取web.xml中配置上下文的参数context-param
配置在头文件下面:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--Context-param是上下文参数(属于整个web工程)-->
<context-param>
<param-name>username</param-name>
<param-value>context</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>root</param-value>
</context-param>
2、获取当前的工程路径,格式:/工程路径
// 创建context对象
ServletContext Context = getServletConfig().getServletContext();
// 2、获取当前的工程路径,格式:/工程路径
// 当前工程路径:/02_Servlet_war_exploded
System.out.println("当前工程路径:" + Context.getContextPath());
3、获取工程部署后在服务器磁盘上的绝对路径
ServletContext Context = getServletConfig().getServletContext();
System.out.println("工程的绝对路径是:" + Context.getRealPath("/"));
4、像Map一样存取数据
public class ContextServlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取servletcontext对象
ServletContext Context = getServletContext();
// 保存之前: Context1中获取域数据key1的值是:null
System.out.println("保存之前: Context1中获取域数据key1的值是:" + Context.getAttribute("key1"));
// 往Context里面存数据---set方法--存数据
Context.setAttribute("key1", "value1");
System.out.println("Context1 中获取域数据key1的值是:" + Context.getAttribute("key1"));
// Context1 中获取域数据key1的值是:value1
// get--取数据
System.out.println("Context1 中获取域数据key1的值是:" + Context.getAttribute("key1"));
System.out.println("Context1 中获取域数据key1的值是:" + Context.getAttribute("key1"));
}
}
往Context里面存数据—set方法–存数据
Context.setAttribute(“key1”, “value1”);**
get–取数据
九、HTTP协议
1、什么是HTTP协议?
什么是协议?
协议是双方或者多方,相互约定好,大家需要遵守的规则,叫协议。
所谓HTTP协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫HTTP协议。
HTTP协议中的数据又叫报文。
2、请求的HTTP协议格式
客户端给服务器发送数据叫请求。
服务器给客户端回传数据叫响应。
请求又分为GET和POST两种
2.1 GET请求
1、请求行
(1)请求的方式 GET
(2)请求的资源路径[+?+请求参数]
(3)请求的协议的版本号 HTTP/1.1
2、请求头
key:valu 组成 不同的键值对表示不同的涵义
2.2 POST请求HTTP协议内容的介绍
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yq6M9VHW-1649144547350)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210508174253454.png)]
Accept:表示客户端可以接受的数据类型
Accept-Languege:表示客户端可以接受的语言类型
User-Agent:表示客户端浏览器的信息
Host:表示请求时的额服务器IP和端口号
POST请求
1、请求行
(1)请求的方式 POST
(2)请求的资源路径[+?+请求参数]
(3)请求的协议的版本号 HTTP/1.1
2、请求头
1)key:value 不同的请求头,有不同的的请求含义
3、请求体 =====:>>> 就是发送给服务器的数据
GET请求有哪些:
1、form标签 method=get
2、a标签
3、link标签引入css
4、script标签引入js文件
5、img标签引入图片
6、iframe引入html页面
7、在浏览器地址栏输入地址后敲回车
POST请求:
8、form标签 method=post
2.3 响应的HTTP协议格式
1、响应行
(1)响应的协议和版本号
(2)响应的状态码
(3)响应状态的描述符
2、响应头
(1)key:value 不同的响应头,有其不同的含义
空行
3、响应体 ----->>> 回传给客户端的数据
4、常用的响应码说明:
200 表示请求成功
302 表示请求重定向
404 表示请求服务器已经收到了,但你要的数据不存在(请求地址错误)
500 表示服务器已经收到了请求,但是服务器内部错误(代码错误)
5、MIME类型说明
MIME是HTTP协议中数据类型
MIME的英文全称是"Multipurpose Internet Mail Extentions-----多功能"Internet邮件扩充服务,MIME类型的格式是"大类型/小类型",并与某一种文件的扩展名相对应"。
谷歌浏览器如何查看HTTP协议:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ag6BZS1M-1649144547351)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210509205009161.png)]
十、HttpServletRequest类
1、HttpServletRequest类有什么作用?
每次只要有请求进入tomcat服务器,tomcat服务器就会把请求过来的HTTP协议信息解析好封装到request对象中,然后传递到service方法(goget和dopost)中给我们使用。我们可以通过httpservletrequest类有什么作用。
2、HttpServletRequest类的常用方法
(1)getRequestURI() 获取请求的资源路径
(2)getRequestURL() 获取请求的统一资源定位符(绝对路径)
(3)getRemoteHost() 获取客户端的IP地址
/*
* 在IDEA中使用localhost访问时,得到的客户端IP地址是:127.0.0.1<br/>
* 在IDEA中使用127.0.0.1访问时,得到的客户端IP地址是:127.0.0.1<br/>
* 在IDEA中,使用真实IP访问时,得到的客户端IP地址是======>>>>真实的客户端IP地址<br/>
*/
(4)getHeader() 获取请求头
(5)getParameter() 获取请求的参数
String username = req.getParameter("username");
System.out.println("用户名:" + username);
解决POST请求的中文乱码问题:
解决中文乱码的问题,需要在获取请求之前调用才有效
req.setCharacterEncoding("UTF-8");
(6)getParameterValues() 获取请求的参数(多个值的时候使用)
(7)getMethod() 获取请求的方式GET或者POST
(8)setAttribute(key,value) 设置域数据
(9)getAttribute(key,value) 获取域数据
(10)getRequestDispatcher() 获取请求转发对象
req.getRequestDispatcher("a/b/c.html"):括号里加上自己要跳转的工程路径
<!--base标签用法:加上的是主动跳转的工程在浏览器的路径-->
请求转发的特点:
(1)浏览器地址栏没有变化
(2)他们是一次性请求
(3)共享request域的中的数据
(4)可以转发到WEB-INF目录下
(5)不可以访问工程以外的资源
servlet1
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 看材料
String name = req.getParameter("username");
System.out.println("servlet的材料" + name);
// 盖章
req.setAttribute("key1","柜台1的章");
// Object key1 = req.getAttribute("key1");
// System.out.println("打印的servlet1中的setAttribute的内容" + key1);
// 问路
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet02");
// 前进到Servlet02
requestDispatcher.forward(req, resp);
}
}
servlet02
public class Servlet02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 查看servlet01的材料
String username = req.getParameter("username");
System.out.println("servlet1的材料" + username);
// 查看servlet02有没有盖章
Object key1 = req.getAttribute("key1");
System.out.println("servlet1的盖章" + key1);
// servlet02处理自己的业务
System.out.println("servlet02处理自己的业务");
}
}
Web中的相对路径和绝对路径
相对路径:
. 表示当前目录
… 表示上一级目录
资源名 表示当前目录/资源名
绝对路径:
http://ip:port/工程名/资源名
十一、HttpServletResponse类
1、HttpServletResponse类的作用
HttpServletResponse类和HttpservletRequest类一样、每次请求进来,tomcat服务器都会创建一个response对象传递给servlet去使用。httpservletrequest表示请求过来的信息,HttpServletResponse表示所有响应的信息,我们如果需要设置返回给客户的信息,都可以通过HttpServletResponse对象来进行设置。
2、字节流(getoutputStream) 常用于下载(传递二进制数据)
3、字符流(getWriter()) 常用于回传字符串(常用)
两个流同时只能使用一个!
4、如何往客户端回传数据
要求往客户端回传字符串数据:
PrintWriter writer = resp.getWriter();
writer.write("得到响应的内容!!!!");
5、解决response响应中文乱码的问题
方案一:
此方法----->>>>>在获取流对象之前必须先设置字符集
1、设置服务器字符集为UTF-8
resp.setCharacterEncoding("UTF-8");
2、通过响应头设置浏览器字符集也为UTF-8
resp.setHeader("Content-Type","text/html;charset=UTF-8");
方案二:
请求重定向---->>>客户端给服务器发送地址,服务器告诉客户端,我给你一个新的地址,你去新的地址访问,叫做请求重定向(因为之前的地址可能已经被废弃)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OeFz8W6A-1649144547351)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210512200209770.png)]
1、设置响应状态码(302):
resp.setStatus(302);
2、设置新的链接地址:
resp.setHeader("Location","http://localhost:8080/03_Servlet//response2");
请求重定向的特点:
1、浏览器地址栏会发生变化
2、两次请求
3、不共享request域数据
4、不能访问web-inf下面的资源
5、
请求重定向的另一种方法:
resp.sendRedirect("http://localhost:8080/03_Servlet/response2");
JavaEE的三层架构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tnv317ir-1649144547352)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210512212229318.png)]
书城项目第二阶段:
1、创建登录界面需要的数据库
2、编写数据库表对应的JavaBean对象
public class User {
private Integer id;
private String username;
private String password;
private String email;
// set和get参数
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
// tostring参数
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
'}';
}
// 无参构造
public User() {
}
// 有参构造
public User(Integer id, String username, String password, String email) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
}
}
3、编写dao持久层-----编写jdbcUtils—连接数据库
public abstract class BaseDao {
// 使用Dbutils操作数据库
QueryRunner queryRunner = new QueryRunner();
/*
* update语句用来执行:insert/update/delete语句
* return :如果返回-1说明执行失败,反正成功返回受影响的行数
* */
public int update(String sql, Object... args) {
Connection connection = JdbcUtils.getConnection();
try {
return queryRunner.update(connection, sql, args);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.close(connection);
}
return -1;
}
/*
* 查询返回一个javaBean的sql语句
* type 返回对象的类型
* sql 执行的sql语句
* args sql对应的参数值
* <T> 返回的类型泛型
* */
public <T> T queryForone(Class<T> type, String sql, Object... args) {
Connection connection = JdbcUtils.getConnection();
try {
return queryRunner.query(connection, sql, new BeanHandler<T>(type), args);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.close(connection);
}
return null;
}
/*
* 查询返回多个javaBean的sql语句
* type 返回对象的类型
* sql 执行的sql语句
* args sql对应的参数值
* <T> 返回的类型泛型
* */
public <T> List<T> queryForList(Class<T> type, String sql, Object... args) {
Connection connection = JdbcUtils.getConnection();
try {
return queryRunner.query(connection, sql, new BeanListHandler<T>(type), args);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtils.close(connection);
}
return null;
}
/*
* 执行返回一行一列的sql语句
* sql 执行的sql语句
* args sql对应的参数值
* */
public Object queryForSinglevalue(String sql, Object... args) {
Connection conn = JdbcUtils.getConnection();
try {
return queryRunner.query(conn, sql, new ScalarHandler(), args);
} catch (Exception e) {
e.printStackTrace();
}finally {
JdbcUtils.close(conn);
}
return null;
}
4、编写UserService和测试
5、编写RegistServlet程序
1、获取请求参数
2、检查 验证码是否正确
正确
3、检查 用户名是否可用
可用
调用service保存到数据库
跳到注册成功页面 regist_success.html
不可用
跳回注册页面
不正确
跳回注册页面
十二、JSP
1、什么是JSP?
jsp的全称是Java serverpages,Java的服务器页面。
作用:jsp的作用是代替servlet回传HTML页面的数据。
因为servlet程序回传HTML页面数据是一件非常繁琐的事情。开发成本和维护成本都极高。
2、jsp小结
1、创建jsp文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cyww3Uhf-1649144547353)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210519220812601.png)]
2、jsp如何访问?
jsp页面和HTML页面一样存放在web目录下。访问也跟访问HTML页面一样。
比如:
web下面有如下文件:
web目录:
a.html页面 访问地址是----->>>> http://ip:port/工程路径/a.html
b.jsp页面 访问地址是----->>>> http://ip:port/工程路径/b.jsp
3、jsp的本质
jsp本质上是一个servlet程序。
4、jsp头部的page指令
jsp头部的page指令可以修改jsp页面中一些重要的属性,或者行为!!
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
language属性:表示jsp翻译后是什么语言文件。暂时只支持Java语言。
contentType:表示jsp返回的数据类型是什么。
pageEncoding属性:表示当前jsp页面文件本身的字符集。
impor属性:跟Java源代码一样表示导包,导类。
===============以下两个属性是给out输出流使用=
autoFlush属性 设置当out输出流缓冲区满了之后,是否自动刷新缓冲区,默认值是true。
buffer属性 设置out缓冲区的大小。默认是8kb
注意:如果缓冲区比较小而且设置的autoFlush属性为false则会报以下错误(缓冲溢出):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pQJNYvTg-1649144547354)(C:\Users\HaSee\AppData\Roaming\Typora\typora-user-images\image-20210519225436559.png)]
将autoFlush属性改为true就可以解决!
===============以下两个属性是给out输出流使用=
errorPage属性 设置当jsp页面运行时出错,自动跳转回去的页面路径
<%--
errorPage="error500.jsp":表示页面发生错误之后自动跳转的页面路径<br/>
这个路径一般都是以斜杠打头,它表示请求地址为http://ip:port/工程路径/
映射到代码的web目录
--%>
isErrorPage属性 设置当前jsp页面是否是错误信息页面。默认是false。如果是true,可以获取异常信息。
session属性 设置访问当前jsp页面,是否会创建httpsession对象。默认是true。
extends属性 设置jsp翻译出来的Java类默认继承谁。
5、jsp中常用脚本
5.1、声明脚本
格式:
<%! 声明Java代码 %>
作用:可以给jsp翻译出来的Java类定义属性和方法,甚至是静态代码块。内部等。
5.2、表达式脚本
格式:
<%=表达式脚本%>
作用:在jsp页面上输出数据。
特点:
1、所有的表达式都会被翻译到_jspService方法中
2、表达式脚本都会被翻译为out.print()输出到页面上
5.3、代码脚本
格式:
<%
java代码脚本
%>
作用:可以在jsp页面中,编写我们自己需要的功能。
1、代码脚本----if 语句
2、代码脚本----for循环 语句
3、翻译后Java文件中-jspservice方法内的代码都可以写
特点:
1、代码脚本翻译之后都在_jsService()方法中
2、代码脚本由于翻译到_jspService()方法中,所以_jspService()方法中所有现有的对象都可以使用
3、还可以由多个代码脚本块组成一个完成的Java语句
<%
for (int j = 0; j < 10; j++) {
%>
<%
System.out.println(j);
}
%>
4、代码脚本还可以和表达式脚本组合使用,在jsp页面上输出数据
<table border="1" cellspacing="0">
<%
for (int j = 0; j < 10; j++) {
%>
<tr>
<td>第<%=j + 1%>行</td>
</tr>
<%
}
%>
</table>
5.4、jsp中的3种注释
1、HTML注释
HTML注释会被翻译到Java源代码中。在_jspService()方法中,以out.write输出到客户端。
<!--这是HTML注释-->
2、Java注释
Java注释会被翻译到Java源代码中。
//单行Java注释
/*多行注释*/
3、jsp注释
jsp注释可以注释掉jsp页面中所有的代码
<%--这是jsp注释--%>
5.5、jsp的九大内置对象
response | 响应对象 |
---|---|
pageContext | jsp的上下文 |
session | 会话对象 |
application | ServletContext对象 |
request | 请求对象 |
config | ServletConfig对象 |
out | jsp输出流对象 |
page | 指向当前jsp的对象 |
exception | 异常对象 |
jsp的四大域对象
pageContext (PageContextImpl类) 当前jsp页面范围内有效
request (HttpServletRequest类 ) 一次请求内有效
session (HttpSession类) 一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)
application (ServletContext类)整个web工程范围内有效(只要web工程不停止,数据都在)
5.5、jsp常用标签
5.5.1、静态包含
<%@include file=“/Include/footer.jsp” %>就是静态包含
file属性指定你要包含的jsp页面路径
地址中第一个斜杠 / 表示为:http://ip:port/工程路径 映射到代码的web目录
静态包含的特点:
1、静态包含不会翻译被包含的jsp页面
2、静态包含其实就是把包含的jsp页面的代码拷贝到包含的位置执行输出
5.5.2 动态包含
<jsp:include page="/Include/footer.jsp">
<jsp:param name="username" value="zsh"/>
<jsp:param name="password" value="root"/>
</jsp:include>
特点:
1、动态包含会把包含的jsp页面也翻译为Java代码
2、动态包含底层代码使用如下代码去调用被包含的jsp页面执行输出
JspRuntimelibrary.include(request,response,"include/footer.jsp",out,false)
3.动态包含还可以传递参数
<jsp:param name="username" value="zsh"/>
<jsp:param name="password" value="root">
5.5.3、请求转发
<%--
<jsp:forward page=""></jsp:forward>:请求转发
--%>
6、Listener监听器
1、Listener监听器它是Javaweb的三大组件之一。Javaweb的三大组件分别是:servlet程序,Filter过滤器、Listener监听器
2、Listener它是JavaEE的规范,就是接口
3、监听器的作用就是,监听某种事物的变化,然后通过回调函数,反馈给客户(程序)去做一些相应的处理
十三、EL表达式
作用:替代jsp页面中的表达式脚本在jsp页面中进行数据输出(el表达式在进行数据输出的时候比jsp表达式简洁很多)
<body>
<%
request.setAttribute("key","style");
%>
jsp表达式脚本输出为:
<%=request.getAttribute("keya")==null?"":request.getAttribute("keya")%><br/>
EL表达式脚本输出为:${keya};
</body>
EL表达式的格式是:${表达式};
El表达式输出null值的时候输出的是:空串;jsp表达式输出null值的时候,出的是null字符串。
13.1、EL表达式搜索域数据的顺序
EL表达式主要是在jsp页面中输出数据,主要输出域对象中的数据
当四个域当中有相同的key的数据的时候,EL表达式按照四个域的从小到大的顺序进行输出
(pageContext < request < session < application)
<body>
<%
request.setAttribute("key", "request");
// session的数据要关闭浏览器才能消失
session.setAttribute("key", "session");
pageContext.setAttribute("key", "pageContext");
// application的数据要重启才会消失
application.setAttribute("key", "application");
%>
${key};
</body>
13.2、EL表达式输出复杂的Bean对象
person类:
package com.atscitc.style;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Person {
private String name;
private String[] phones;
private List<String> cites;
private Map<String,Object> map;
public int getAge() {
return 19;
}
public Person() {
}
public Person(String name, String[] phones, List<String> cites, Map<String, Object> map) {
this.name = name;
this.phones = phones;
this.cites = cites;
this.map = map;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String[] getPhones() {
return phones;
}
public void setPhones(String[] phones) {
this.phones = phones;
}
public List<String> getCites() {
return cites;
}
public void setCites(List<String> cites) {
this.cites = cites;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", phones=" + Arrays.toString(phones) +
", cites=" + cites +
", map=" + map +
'}';
}
}
<%@ page import="com.atscitc.style.Person" %>
<%@ page import="java.util.*" %><%--
Created by IntelliJ IDEA.
User: HaSee
Date: 2021/6/7
Time: 20:40
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>
<%
Person person = new Person();
person.setName("张三");
person.setPhones(new String[]{"110", "120"});
List<String> list = new ArrayList<String>();
list.add("四川");
list.add("浙江");
list.add("湖南");
list.add("广东");
person.setCites(list);
Map<String, Object> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
map.put("key4", "value4");
map.put("key5", "value5");
person.setMap(map);
pageContext.setAttribute("key1",person);
%>
<%--
下面代码运行的时候找的不是前面Person类定义的属性,而是找的对应的get方法
--%>
输出person的属性值:${key1}<br/>
输出person的name属性值:${key1.name}<br/>
输出person的phones属性值:${key1.phones[1]}<br/>
输出person的Cites属性值:${key1.cites}<br/>
输出person的个别属性值:${key1.cites[1]}<br/>
输出person的map集合中某个key的值:${key1.map.key3}<br/>
输出person的age的值:${key1.age}<br/>
</body>
</html>
13.3、 EL表达式的—运算
empty运算
以下几种情况为空:
1、值为null的时候,为空
2、值为空串的时候,为空
3、值是Object类型数组,长度为0的时候,为空
4、list集合,元素个数为零
5、map集合,元素个数为零
//值为空输出true,不为空输出false
// 1、值为null的时候,为空
request.setAttribute("emptyNull",null);
// 2、值为空串的时候,为空
request.setAttribute("emptyStr","");
// 3、值是Object类型数组,长度为0的时候,为空
request.setAttribute("emptyObject", new Object[]{"ddd","ddd"});
// 4、list集合,元素个数为零
List list = new ArrayList();
// list.add("1"); 添加元素为false
request.setAttribute("emptyList",list);
// 5、map集合,元素个数为零
Map<String,Object> map = new HashMap<>();
// map.put("key1","value1");添加元素为false
request.setAttribute("emptyMap",map);
13\4
etCites() {
return cites;
}
public void setCites(List<String> cites) {
this.cites = cites;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", phones=" + Arrays.toString(phones) +
", cites=" + cites +
", map=" + map +
'}';
}
}
```java
<%@ page import="com.atscitc.style.Person" %>
<%@ page import="java.util.*" %><%--
Created by IntelliJ IDEA.
User: HaSee
Date: 2021/6/7
Time: 20:40
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>
<%
Person person = new Person();
person.setName("张三");
person.setPhones(new String[]{"110", "120"});
List<String> list = new ArrayList<String>();
list.add("四川");
list.add("浙江");
list.add("湖南");
list.add("广东");
person.setCites(list);
Map<String, Object> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
map.put("key4", "value4");
map.put("key5", "value5");
person.setMap(map);
pageContext.setAttribute("key1",person);
%>
<%--
下面代码运行的时候找的不是前面Person类定义的属性,而是找的对应的get方法
--%>
输出person的属性值:${key1}<br/>
输出person的name属性值:${key1.name}<br/>
输出person的phones属性值:${key1.phones[1]}<br/>
输出person的Cites属性值:${key1.cites}<br/>
输出person的个别属性值:${key1.cites[1]}<br/>
输出person的map集合中某个key的值:${key1.map.key3}<br/>
输出person的age的值:${key1.age}<br/>
</body>
</html>
13.3、 EL表达式的—运算
empty运算
以下几种情况为空:
1、值为null的时候,为空
2、值为空串的时候,为空
3、值是Object类型数组,长度为0的时候,为空
4、list集合,元素个数为零
5、map集合,元素个数为零
//值为空输出true,不为空输出false
// 1、值为null的时候,为空
request.setAttribute("emptyNull",null);
// 2、值为空串的时候,为空
request.setAttribute("emptyStr","");
// 3、值是Object类型数组,长度为0的时候,为空
request.setAttribute("emptyObject", new Object[]{"ddd","ddd"});
// 4、list集合,元素个数为零
List list = new ArrayList();
// list.add("1"); 添加元素为false
request.setAttribute("emptyList",list);
// 5、map集合,元素个数为零
Map<String,Object> map = new HashMap<>();
// map.put("key1","value1");添加元素为false
request.setAttribute("emptyMap",map);