JavaWeb

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 特殊字符
<!--
常用的特殊字符:
    >  ====> &lt;
    <  ====> &gt;
   空格 ====>&nbsp;
-->

我是&lt;br&gt;标签</br>
警告&nbsp;&nbsp;&nbsp;&nbsp;远一点
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>
image-20210501235420058
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变量未赋予初始值的时候,默认值都是undefinednull					空值

​		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响应对象
pageContextjsp的上下文
session会话对象
applicationServletContext对象
request请求对象
configServletConfig对象
outjsp输出流对象
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);
13\4
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值