js&jQuery&servlet综合笔记

unit04-JavaScript
JavaScript简介
什么是JavaScript(了解)
JS特点和优势(了解)
在HTML书写JS的方式
JavaScript语法
注释格式
数据类型
变量声明
JS运算符
JS语句
JS数组
JS函数
综合练习
DOM操作
案例:电灯开关
案例:增删改元素
案例:网页换肤
总结:JS获取元素
总结:JS增删改元素
htmlcss+JS作业
unit05-jQuery
jQuery简介
什么是jQuery(了解)
jQuery的优势(了解)
jQuery引入
文档就绪事件函数
jQuery选择器(重点)
基本选择器
层级选择器
基本过滤选择器
综合案例
创建表格元素
仿QQ好友列表
模拟员工信息管理系统
jQuery总结
html元素操作
html元素内容和值的操作
元素属性和css属性操作
其他函数
扩展内容
为元素绑定点击事件
js对象和jQuery对象的互相转换
jQuery作业
unit06-tomcat、HTTP
服务器概述
什么是服务器?
什么是Web服务器?
tomcat下载、安装、启动、配置
下载tomcat服务器
安装、启动tomcat服务器
修改tomcat默认端口
tomcat目录结构
虚拟主机和Web应用
web应用
web应用的目录结构
部署web应用到虚拟主机中
扩展内容(了解)
配置WEB应用的主页
配置缺省的(默认的)WEB应用
打war包
HTTP协议概述
什么是HTTP协议?
HTTP协议详解
HTTP请求
HTTP响应
内容补充
将Tomcat整合到Eclipse中
方式一:在window偏好设置中配置Tomcat
方式二:在创建Web项目时配置Tomcat
将整合到Eclipse中的tomcat从Eclipse中删除
在Eclipse中创建Server及移除Server
tomcat右键选项介绍
tomcat启动失败常见原因
unit07-Servlet
Servlet概述
什么是Servlet?
开发Servlet程序
开发Servlet程序的步骤
使用Eclipse创建Web项目
使用Eclipse创建Servlet
Servlet在web.xml中的配置
运行Servlet程序、访问测试
Eclipse如何发布一个Web应用
Eclipse默认发布Web应用的位置
Servlet调用过程
扩展内容
添加Servlet模版
Servlet3.0的特性
request和response介绍
request对象
获取请求参数
实现请求转发
作为域对象使用
response对象
向客户端发送数据
实现重定向

1.unit04-JavaScript
1.1.JavaScript简介

1.1.1.什么是JavaScript(了解)
全称叫做JavaScript,简称叫做JS

由NetScape(网景)公司提供,是一门专门嵌入在浏览器中执行的脚本语言

LiveScript JavaScript

JS运行在浏览器中,负责实现网页中的动画效果

或者是实现表单校验等功能

1.1.2.JS特点和优势(了解)
1、特点:

(1)JS是一门直译式的语言(边解释边执行,没有编译的过程)

java–> 编写时 xx.java —>编译成 xx.class --> 运行class文件

js —> 编写时 html, 编写时 js文件, 直接运行, 没有编译过程

(2)JS是一门基于对象的语言(JS中没有类的概念,也没有编译的过程)

JS中是有对象的(内置对象、自定义对象)

(3)JS是一门弱类型的语言(Java:强类型)

1
在java中: 变量一旦声明, 就属于固定的数据类型, 不能被改变
2
String str = “abc”;
3
int number = 100;
4
在JS中: 变量是不区分类型的, 可以指向任意的数据类型
5
var s = 100;
6
s = “abc”;
7
s = true;
8
s = [];
9
s = function(){}
2、优势:

(1)JS具有良好的交互性

(2)JS具有一定的安全性(只能在浏览器内部运行,不能访问浏览器以外的资源)

(3)JS具有跨平台性(JS 浏览器)

( JS语言是跨平台的,是因为有浏览器,但浏览器不跨平台

Java语言是跨平台的,是因为有虚拟机,但虚拟主机不跨平台 )

1.1.3.在HTML书写JS的方式
1、在script标签内部可以书写JS代码:

在head或者body标签内部可以添加一个script标签,在script标签内部可以直接书写JS代码!

1

2

2、通过script标签引入外部的JS文件

在head或body标签内部,可以通过script标签引入外部的JS文件。例如:

1

2

注意:(1)在引入js文件的script标签内部不要书写JS代码,例如:

1

(2)不要将引入JS文件的script标签自闭,因为可能会导致文件引入失败,如下:

1

在引入jQuery函数库文件时,如果文件引入路径错误,则会导致文件引入失败,如下图:

image-20200217103533313

2.1.4.文档就绪事件函数

1

2 3 4 11 12 13

jQuery的引入示例...

14 问题描述:上面的代码在执行时,会报一个错误:

image-20200217105525351

原因描述:在执行获取id为demo的元素时, h1元素还没有被浏览器加载到,所以获取不到h1元素。

解决方式一:

将script标签移到body内部,也就是h1元素的后面

这样浏览器在加载时,会先加载h1元素,再执行获取h1元素的代码,由于在获取h1元素之前,h1元素已经被浏览器加载过了,所以后面再获取就能够获取到!

代码示例:

1

2

jQuery的引入示例...

3 9

解决方式二:

将获取元素的代码放在文档就绪事件函数中,文档就绪事件函数会在浏览器加载完所有的html元素后(也就是加载完最后一个html元素时)立即执行。

由于当前网页中的所有元素都被加载了,h1元素肯定也被加载了,此时再获取h1元素就一定能获取到。

1

2 3 4 13 14 15

jQuery的引入示例...

16 解决方式三:

将获取元素的代码放在一个自定义的函数中,并将该函数绑定在h1元素的点击事件上,当我们点击h1元素时会执行自定义的函数,函数执行时才获取h1元素,此时就能够获取到h1元素。

1

2 3 4 13 14 15

jQuery的引入示例...

16 总结:什么时候该使用文档就绪事件函数?

如果在获取元素时,获取元素的代码执行的时机,比元素本身加载的时间还要早,如果元素还没有加载就获取,必然是获取不到的。

可以将获取元素的代码放在文档就绪事件函数中,等浏览器加载完整个网页后,文档就绪事件函数才会执行,此时所有的元素都被加载了,再获取任何元素都能获取到!

jQuery提供的文档就绪事件函数(简写形式):

1

其完整写法为:

1

JS也为我们提供了文档就绪事件函数,其写法为:

1

2.2.jQuery选择器(重点)

2.2.1.基本选择器

1
(1)元素名选择器
2
$(“div”) – 选中所有的div元素
3
$(“span”) – 选中所有的span元素
4

5
(2)class/类选择器
6
$(".s1") – 选中所有class值为s1的元素(class值为s1的元素可能是任何元素)
7
$(“span.s1”) – 选中所有class值为s1的span元素
8

9
(3)id选择器
10
$("#one") – 选中id为one的元素
11

12
(4)多元素选择器
13
$(“div,span,.s1,#one”) – 选中所有的div元素,以及所有的span元素,以及所有class值为s1的元素,以及id为one的元素
2.2.2.层级选择器

1
$(“div span”) – 选中所有div内部的所有span元素
2
$("#one span") – 选中id为one的元素内部的所有span元素
3

4
$("#two+span") – 选中id为two的元素后面紧邻的span兄弟元素
5
$("#two").next(“span”) – 选中id为two的元素后面紧邻的span兄弟元素
6
$("#two").prev(“span”) – 选中id为two的元素前面紧邻的span兄弟元素
7

8
$("#two~span") – 选中id为two的元素后面所有的span兄弟元素
9
$("#two").nextAll(“span”) – 选中id为two的元素后面所有的span兄弟元素
10
$("#two").prevAll(“span”) – 选中id为two的元素前面所有的span兄弟元素
11

12
$("#two").siblings(“span”) – 选中id为two的元素前、后所有的span兄弟元素

2.2.3.基本过滤选择器

1
(1) 选中第一个div元素
2
$(“div:first”)
3
$(“div:eq(0)”)
4
$(“div”).eq(0)
5

6
(2) 选中最后一个div元素
7
$(“div:last”)
8
$(“div:eq(-1)”)
9
$(“div”).eq(-1)
10

11
(3) 选中第n+1个div元素(n从零开始)
12
$(“div:eq(n)”)
13
$(“div”).eq(n)
2.3.综合案例

2.3.1.创建表格元素
练习1:创建单行单列的表格

1
function createTable1(){
2
//1.创建一个table元素
3
var $tab = $("

");
4
//2.创建一个tr元素
5
var $tr = $("");
6
//3.创建一个td元素, 并为td添加内容
7
var $td = $("");
8
$td.html(“Hello TD~~”);
9
//4.将td添加到tr元素内部
10
$tr.append( $td );
11
//5.将tr添加到table元素内部
12
$tab.append( $tr );
13
//6.将table添加到body元素内部
14
$(“body”).append( $tab );
15

16
//$(“body”).append( “

Hello~~TD…
” );
17
}
练习2.1:创建单行6列的表格

1
function createTable2(){
2
//1.创建一个table元素
3
var $tab = $("

");
4
//2.创建一个tr元素
5
var $tr = $("");
6
for(var i=0;i<6;i++){
7
//3.创建一个td元素, 并为td添加内容
8
var $td = $("");
9
$td.html(“Hello TD~~”);
10
//4.将td添加到tr元素内部
11
$tr.append( $td );
12
}
13
//5.将tr添加到table元素内部
14
$tab.append( $tr );
15
//6.将table添加到body元素内部
16
$(“body”).append( $tab );
17
}
练习2.2:创建5行6列的表格

1
function createTable2(){
2
//1.创建一个table元素
3
var $tab = $("

");
4
for(var j=0;j<5;j++){ //外层循环:控制行数
5
//2.创建一个tr元素
6
var $tr = $("");
7
for(var i=0;i<6;i++){ //内层循环:控制列数
8
//3.创建一个td元素, 并为td添加内容
9
var $td = $("");
10
$td.html(“Hello TD~~”);
11
//4.将td添加到tr元素内部
12
$tr.append( $td );
13
}
14
//5.将tr添加到table元素内部
15
$tab.append( $tr );
16
}
17
//6.将table添加到body元素内部
18
$(“body”).append( $tab );
19
}
练习3:创建指定行和列的表格

1
function createTable3(){
2
//获取用户输入的行数和列数(js方式)
3
//var rows = document.getElementById(“rows”).value;
4
//var cols = document.getElementById(“cols”).value;
5
var rows = $("#rows").val();
6
var cols = $("#cols").val();
7
console.log(rows+" : “+cols);
8
//1.创建一个table元素
9
var $tab = $(”

");
10
for(var j=0;j<rows;j++){ //外层循环:控制行数
11
//2.创建一个tr元素
12
var $tr = $("");
13
for(var i=0;i<cols;i++){ //内层循环:控制列数
14
//3.创建一个td元素, 并为td添加内容
15
var $td = $("");
16
$td.html(“Hello TD~~”);
17
//4.将td添加到tr元素内部
18
$tr.append( $td );
19
}
20
//5.将tr添加到table元素内部
21
$tab.append( $tr );
22
}
23
//6.将table添加到body元素内部
24
$(“body”).append( $tab );
25
}
2.3.2.仿QQ好友列表

1
/** 通过jQuery实现仿QQ列表好友列表 */
2
function openDiv(thisobj){ //thisobj是一个js对象 --转成–> jQuery对象
3
//先将其他三个分组关闭( 将其他三个分组内的div设置为隐藏 )
4
$(“table span”).not(thisobj).next(“div”).hide(); //css(“display”, “none”)
5
//根据被点击的分组找到分组内的好友列表, 切换好友列表的展示状态
6
$(thisobj).next(“div”).toggle(); //如果元素显示则切换为隐藏, 如果隐藏则切换为显示
7
}
2.3.3.模拟员工信息管理系统
练习1:添加员工信息

1
function addEmp(){
2
//1.获取要添加的员工信息(id, name, email, salary)
3
var id = $("#box1 input[name=‘id’]").val().trim();
4
var name = $("#box1 input[name=‘name’]").val().trim();
5
var email = $("#box1 input[name=‘email’]").val().trim();
6
var salary = $("#box1 input[name=‘salary’]").val().trim();
7
console.log(id+" : “+name+” : “+email+” : "+salary);
8

9
//2.校验员工信息
10
//2.1.添加的员工信息不能为空!
11
if( id == “” || name == “” || email == “” || salary == “” ){
12
alert( “添加的员工信息不能为空!” );
13
return;
14
}
15

16
//2.2.添加的员工id不能重复! (id=3)
17
//获取所有的tr元素, 并遍历所有的tr元素
18
var flag = false; //false表示id是不存在的!!!
19
$(“table tr”).each(function(){ //this(JS对象)表示当前被遍历的元素
20
// this --转换为jQuery对象–> $( this )
21
var _id = $(this).find(“td:eq(1)”).text();
22
//拿着用户输入的id和当前员工的id进行比较
23
if( id == _id ){ //只要有一个相等,就说明id已存在,则停止添加
24
alert(“您输入的员工ID已存在, 请重新添加!”);
25
flag = true; //true表示id已存在!!
26
//return; 放在这里的return不能终止程序的执行
27
}
28
});
29
if( flag ){ //true表示id已存在!!
30
return;
31
}
32
//3.将员工信息添加到页面上(添加到table中)
33
//>>创建一个tr元素
34
var $tr = $("");
35
//>>创建5个td元素,并将员工信息添加到td中
36
var $td1 = $(""); //复选框
37
var $td2 = $(""+id+""); //ID
38
var $td3 = $(""+name+""); //name
39
var $td4 = $(""+email+""); //email
40
var $td5 = $(""+salary+""); //email
41
//>>将td元素添加到tr中
42
$tr.append( $td1 ).append( $td2 ).append( $td3 ).append( $td4 ).append( $td5 );
43

44
//>>将tr元素添加到table中
45
$(“table”).append( $tr );
46
}
练习2:删除员工信息

1
function delEmp(){
2
//1.获取所选中员工所在的tr行 (获取所有被选中的复选框)
3
//$(“input:checked”).parents(“tr”).remove(); //会连接表头一起删除
4
$(“input:checked”).parent(“td”).parent(“tr”).remove();
5
}
练习3:修改员工信息(自己完成)

练习4:实现全选或全不选

1
function checkAll(){
2
//1.获取全选复选框的选中状态( 选中(true)? 没选中(false)? )
3
var isCheck = $("#all").prop(“checked”); //true|false
4
//2.获取所有普通复选框, 将全选框的选中状态设置给所有普通复选框
5
$(“input[type=‘checkbox’][id!=‘all’]”).prop(“checked”,isCheck);
6
}
2.4.jQuery总结

2.4.1.html元素操作
1、创建元素

1
$("

") – 创建一个div元素,返回的是一个jQuery对象,表示创建的div元素
2
$(“
xxxx
”) – 创建一个包含内容的div元素,返回的是一个jQuery对象,表示创建的div元素
2、添加子元素

1
$parent.append( $child ) – 父元素调用方法添加子元素
2
$(“body”).append( “

我是新来的…
” ); – 往body元素内部追加一个div子元素
3、删除元素

1
$(“div”).remove() – 删除所有的div元素
2

3
JS删除所有div元素:
4
//获取所有的div元素(返回的是所有div组成的数组)
5
var divArr = document.getElementsByTagName(“div”); //div数组
6
//遍历div数组,依次删除每一个div元素
7
var len = divArr.length;
8
for(var i=0;i<len;i++){
9
//通过当前元素的父元素删除当前元素(始终删除第一个)
10
divArr[0].parentNode.removeChild( divArr[0] );
11
}
4、替换元素

1
$(“div”).replaceWith(“

我是来替换的…

”)

2.4.2.html元素内容和值的操作

1

2 这是一个div11元素 3 这是一个span元素 4 这是一个div1111元素 5
1、html()函数 (类似于js中的innerHTML属性)

– 用于获取或设置元素的内容,比如为div、span、p、h1~h6、table、tr、td、form等元素设置内容

1
$(“div”).html() – 获取所有div中的第一个div的内容
2
$(“div”).html(“xxxx”) – 为所有div设置内容
2、text()函数 (类似于js中的innerText属性,innerText在部分浏览器中不兼容)

– 用于获取或设置元素的文本内容

1
$(“div”).text() – 获取所有div中的所有文本内容
2
$(“div”).text(“xxxx”) – 为所有div设置文本内容
3、val()函数 (类似于js中的value属性)

– 获取或设置表单项元素的value值(input/select/option/textarea)

1
$(“input”).val() – 获取所有input元素中的第一个input元素的value值
2
$(“input”).val(值) – 为所有的input元素设置value值

2.4.3.元素属性和css属性操作

1

1、prop()函数 – 用于获取或设置元素的属性值

在jQuery1.6版本之后才有这个函数,1.6之前版本的jQuery可以使用attr()函数

1
$(“input[type=‘checkbox’]”).prop(“checked”)
2
// 获取input复选框的选中状态, 返回true表示复选框为选中状态,返回false表示复选框为取消选中状态
3
$(“input[type=‘checkbox’]”).prop(“checked”, true)
4
// 设置所匹配的复选框元素为选中状态
5

6
$("#inp").prop(“name”); //获取id为inp元素的name属性值, 返回useranme
7
$("#inp").prop(“name”,“user”); //为id为inp的元素设置name属性值, name属性值就会变成user
2、css()函数 – 用于获取或设置元素的css属性值

1
$("#div1").css(“width”) – 获取id为div1元素的宽度
2
$("#div1").css(“width”,“200px”) – 设置id为div1元素的宽度为200px
3
$("#div1").css({
4
“width” : “200px”,
5
“height” : “150px”,
6
“border” : “5px solid red”,
7
“background” : “pink”
8
}); // 为id为div1的元素设置宽度为200px、高度为150px、边框以及背景颜色等样式
2.4.4.其他函数
1、each() 函数

1
( s e l e c t o r ) . e a c h ( f u n c t i o n ( i n d e x , e l e m e n t ) ) 2 / / e a c h ( ) 函 数 可 以 遍 历 (selector).each(function( index,element ){}) 2 // each()函数可以遍历 (selector).each(function(index,element))2//each()(selector)选择器选中的所有元素(即每次都选择器选中的元素中获取一个元素,并执行function 函数)
3
// function中的index – 表示遍历的元素的下标
4
// function中的element – 表示当前正在遍历的元素(也可以通过this获取)
示例:

1
$(“table tr”).each(function(){
2
//从当前行中获取第二个单元格的内容(当前行的id值)
3
var tempId = $(this).find(“td”).eq(1).html();
4
//拿着用户输入的id 和 每一行中的id值进行比较
5
if( id == tempId ){
6
alert(“添加失败,id已存在!”);
7
flag = true; //id存在,更新flag的值,true表示已存在!
8
}
9
});

2、show()/hide() 函数

show() – 设置元素由隐藏变为显示

1
$(“div”).show() – 设置所有的div元素为显示
等价于:

1
$(“div”).css(“display”, “block”);
hide() – 设置元素由显示变为隐藏

1
$(“div”).hide() – 设置所有的div元素为隐藏
等价于:

1
$(“div”).css(“display”, “none”)
2、toggle()/slideToggle()

toggle() – 切换元素的显示状态, 如果元素是显示的, 则切换为隐藏, 否则切换为显示

slidToggle() --切换元素的显示状态, 如果元素是显示的, 则切换为隐藏,否则切换为显示,切换为显示为下拉状态,隐藏为收缩状态。

2.5.扩展内容

2.5.1.为元素绑定点击事件
以点击事件为例,为元素绑定点击事件的方式为:

方式1(js版):

1

6

7 8 方式2(js版):

1

10

11 12 方式3(jQuery版):

1

9

10 11 2.5.2.js对象和jQuery对象的互相转换 通过JS的方式获取元素,返回的是JS对象,JS对象只能调用JS的属性或函数

通过jQuery选择器获取元素,返回的是jQuery对象(结构像一个集合),jQuery对象只能调用jQuery的属性或函数。

如果现有JS对象,但我们需要调用jQuery的属性或函数,可以将JS对象转成jQuery对象;

如果现有jQuery对象,但我们需要调用JS的属性或函数,可以将jQuery对象转成JS对象;

image-20200512153617181

2.6.jQuery作业

05-13作业:

1、复习文档就绪事件函数(掌握什么时候该使用文档就绪事件函数)

2、将课上讲过的选择器练习自己再做一遍!

3、完成jQuery综合案例:

1
(1)创建表格
2
(2)仿QQ好友分组
3
(3)模拟员工信息管理系统
3.unit06-tomcat、HTTP
3.1.服务器概述

3.1.1.什么是服务器?
服务器:分为服务器硬件 和 服务器软件。在硬件服务器(计算机)上安装了服务器软件,才可以对外提供服务。

比如:让其他的计算机来访问当前服务器,为其他的计算机提供服务。

(1) 服务器硬件:是指在互联网上具有独立IP地址的计算机,比如我们自己用的计算机也可以作为服务器使用。

(2) 服务器软件:就是一个计算机程序,比如MySQL服务器软件,tomcat服务器软件。服务器软件分为很多类型,比如:ftp服务器,数据库服务器,web服务器软件,邮件服务器等。

3.1.2.什么是Web服务器?
(1) web服务器是指驻留在互联网上的某种类型的计算机程序。当浏览器访问服务器,请求服务器上的文件时,服务器将会处理该请求,并将请求的文件响应给浏览器,并会附带一些信息告诉浏览器如何查看该文件(即文件的类型)

(2) web服务器是可以向 “发出请求的浏览器提供文档” 的程序,比如在访问百度时,其实就是在访问百度的服务器。
在这里插入图片描述

tomcat就是一个web服务器软件,是由apache组织提供的一款服务器软件,特点:小巧灵活,免费开源,简单易用。

3.2.tomcat下载、安装、启动、配置

3.2.1.下载tomcat服务器
下载地址:http://tomcat.apache.org/

tomcat有很多版本,有解压版 和 安装版,还分windows (还分为32位和64位版)和linux版,根据自己的需求,选择对应的版本下载。

tomcat服务器运行需要jdk的支持(tomcat是由java语言开发的),版本对应为:

1
tomcat5 需要jdk4以上支持
2
tomcat6 需要jdk5以上支持
3
tomcat7 需要jdk6以上支持
4
tomcat8 需要jdk7以上支持
3.2.2.安装、启动tomcat服务器
1、安装tomcat服务器

绿色版解压之后就可以使用(原则:安装的路径中不要包含中文和空格)
在这里插入图片描述

解压后还需要配置JAVA_HOME环境变量,该变量指向jdk的根目录,指定tomcat启动时使用哪一个位置的jdk。

2、启动tomcat服务器

如何配置JAVA_HOME环境变量:

变量名: JAVA_HOME

变量值: C:\Program Files\Java\jdk1.8.0_45

注意:变量值指向JDK的根目录(不是bin目录),变量值的后面也不要加分号;

2、启动tomcat服务器

启动、关闭tomcat服务器:

通过 [tomcat根目录]/bin/startup.bat 可以启动tomcat服务器;

通过 [tomcat根目录]/bin/shutdown.bat 可以关闭tomcat服务器;

访问测试服务器:

在tomcat服务器启动后,服务器会默认监听8080端口,可以通过如下地址访问tomcat服务器的主页:

1
http://localhost:8080
3.2.3.修改tomcat默认端口
image-20200218164109285

tomcat服务器在启动时,默认监听的端口是8080,这意味着,我们在访问tomcat服务器时,需要在主机名(localhost)或者IP地址(127.0.0.1)等后面加上端口。这样非常不方便。

可以将8080端口改为80端口,因为80端口非常特殊,可以省略不写(只有80端口可以省略,其他端口可在访问时必须得加上)

修改方法:找到 [tomcat安装目录]/conf/server.xml 文件并打开该文件,将文件中的 69 行的 标签上的 port 属性的值改为 80即可。

1
<Connector port=“80” protocol=“HTTP/1.1”
2
connectionTimeout=“20000”
3
redirectPort=“8443” />
改完后,保存文件,重新启动服务器(只有在服务器启动时,才会重新加载server.xml文件)再次启动的服务器就会监听新的端口。

image-20200218164951343

扩展问题:端口占用问题:

在启动tomcat服务器时,可能会遇到端口占用问题,如下图:

image-20200609152859436

原因分析:

情况一:可能是之前的tomcat服务器没有完全关闭,仍然在占用8080(或80)端口,导致服务器再次启动时,启动失败。

解决方式:运行shutdown.bat文件,将tomcat按照正常流程再关闭一次即可。再次启动服务器,如果成功,则说明问题已解决,否则看情况二。
情况二:可能是其他程序占用了8080(或80)端口,导致服务器启动失败。

解决方式:打开一个cmd窗口,通过 netstat -ano 命令查看当前系统中活动的进程,找到8080(或80)端口对应的进程编号(PID),根据进程编号将进程结束即可!

1
netstat -ano

1
协议 本地地址 外部地址 状态 PID
2
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 6520
3
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 448
4

1
taskkill /f /pid 6520
3.3.tomcat目录结构

3.3.tomcat目录结构介绍
在这里插入图片描述

tomcat服务器安装根目录下有很多子目录,这些目录的作用是:

1
bin:用于存放tomcat服务器中批处理文件的目录(xx.bat/xx.sh)
2
conf:用于存放tomcat服务器中的配置文件的目录(其中server.xml文件是tomcat服务器中非常重要的一个文件。)
3
lib:用于存放tomcat服务器运行时所依赖的jar包。
4
logs:用于存放tomcat服务器运行时产生的日志文件(启动tomcat服务器时会打印很多日志信息,这些日志信息还会以文件形式保存到logs目录下)
5
temp:用于存放tomcat服务器产生的临时文件,tomcat会自己清理,可以忽略该目录
6

7
webapps:是localhost【虚拟主机】默认管理的目录,将开发好的【web应用】程序放在webapps目录下,就可以通过浏览器访问localhost主机中的Web资源文件了。
8
可以简单的理解为:webapps目录就是web资源(html、css、js、图片、jsp等)的存放目录,将web资源文件放在该目录下,就可以通过浏览器来访问。
9

10
work:用于存放tomcat服务器产生的工作文件(JSP翻译后的Servlet文件会放在work目录下;session对象序列化后产生的文件也会放在work目录下;)
3.4.虚拟主机和Web应用

image-20200328095145558

总结:

(1)虚拟主机就是tomcat服务器中配置的一个站点,在tomcat服务器中默认提供了一个localhost虚拟主机,这个主机的发布目录是webapps目录:

image-20200513155211940

这样意味着,将Web应用放在webapps目录下,就表示发布到了localhost虚拟主机中。

(2)Web应用就是一个存放了很多Web资源(html、css、js、jsp、servlet、图片等)的目录,将Web应用发布到虚拟主机中,就可以通过浏览器来访问Web应用中的这些资源文件了。

3.5.web应用

3.5.1.web应用的目录结构

1
news(目录,web应用)
2
|-- 其他目录, 放在news根目录或者其他目录中的资源文件,浏览器可以直接访问
3
|-- WEB-INF目录, 放在这个目录下的资源文件是受保护的,浏览器不能直接访问(不是不能访问,是不能直接访问)
4
|-- classes目录, 用于存放编译后的class文件
5
|-- lib目录, 用于存放web应用所依赖的jar包
6
|-- web.xml文件, 用于存放和web应用相关的一些配置(配置Servlet、配置主页、配置session的超时时间等)
其中news就是一个目录, 同时也是一个web应用程序, 其中可以包含很多的资源文件。

3.5.2.部署web应用到虚拟主机中
直接将Web应用的目录拷贝到虚拟主机所管理的目录下,就发布到了虚拟主机中

例如:将news目录拷贝webapps目录下,由于webapps目录是localhost主机默认管理的目录,所以就相当于将news应用发布到 了localhost主机中。

通过如下路径规则就可以访问localhost主机下的news应用下的资源文件:

1
http://localhost:端口/news/xxx
3.6.扩展内容(了解)

哔哩哔哩视频链接:https://www.bilibili.com/video/BV1Hg4y1B7dr

访问tomcat服务器主页:http://localhost

访问news/hello.html:http://localhost/news/hello.html

能否将访问 news/hello.html 的路径缩短一些(比如只通过主机名就可以访问news/hello.html这个网页)

3.6.1.配置WEB应用的主页
如果没有将 hello.html 配置为当前Web应用的主页,在访问 hello.html 时的路径为:

1
http://localhost/news/hello.html
如果将 hello.html 配置为当前Web应用的主页,再次访问 hello.html 时的路径为:

1
http://localhost/news
在上的路径中,/hello.html 这个路径可以加,也可以省略。

将 hello.html 配置为当前应用的主页,方式为:找到 [当前Web应用]/WEB-INF/web.xml文件并打开,在web.xml文件的根标签内部添加如下配置:

1

<?xml version="1.0" encoding="UTF-8"?>

2
<web-app xmlns=“http://xmlns.jcp.org/xml/ns/javaee”
3
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
4
xsi:schemaLocation=“http://xmlns.jcp.org/xml/ns/javaee
5
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd”
6
version=“3.1”>
7

8
/hello.html
9
/hello1.html
10
/hello2.html
11

12

13

配置完后,需要重启服务器,配置才会生效。

3.6.2.配置缺省的(默认的)WEB应用
上面已经将news/hello.html配置为news应用的主页,访问hello.html时路径为:http://localhost/news/

如果不将 news 应用配置为默认的Web应用,在访问 news 下的 hello.html(主页)时的访问路径为:

1
http://localhost/news/
如果将 news 应用配置为缺省的(默认的)Web应用,在访问 hello.html(主页)时的路径就变成了:

1
http://localhost/
如何将 news 配置为缺省的(默认的)Web应用(缺省Web应用只能有一个)?:

将Web应用的名字改为一个大写的ROOT,当前Web应用就是一个默认的Web应用,再访问这个Web应用下的资源文件时,访问的路径中就可以不用写Web应用的名称了。

3.6.3.打war包
war包和jar包都是java程序中的一种压缩包格式,如果开发一个Java基础工程,可以将其中编译后的class文件和相关的配置文件打成一个jar包。

可以将一个Web应用打成一个war包,这样做的好处有:

1
(1) 将web应用打成一个war包,传输起来更加方便,而且文件体积会变小。
2
(2) 将war包发布到服务器中,服务器能识别war包格式,会自动将war包解压发布!
打war包的方法是:

进入到web应用的目录下,将Web应用目录下的所有子目录和文件全部选中,右键压缩成一个 xxx.zip 包,再把 xxx.zip 改为 xxx.war即可!!

需要注意的是,如果有以下问题,可能会导致war不会自动解压:

1
(1) 在将Web应用打成一个压缩包时,没有打成一个 xxx.zip,而是使用 rar格式或者其他格式,会导致自动解压失败!
2
(2) 打成的war包的名字 和 已发布的web应用的名字不能冲突,会导致自动解压失败!
3
(3) war包中包含的目录名和文件名是中文的,也会导致自动解压失败!
3.7.HTTP协议概述

3.7.1.什么是HTTP协议?
在这里插入图片描述

HTTP协议是用于规定浏览器和服务器之间的通信方式/规则

主要规定了浏览器给服务器发送的请求信息的格式

以及规定了服务器给浏览器发送响应信息的格式

HTTP协议在工作时所遵循的基本原则:

1
(1)一次请求,只对应一次响应
2
(2)请求只能由浏览器发起,服务器只能被动的等待请求,根据请求作出回应。
3.8.HTTP协议详解

IE浏览器的插件:HttpWatch,可以监听浏览器和服务器通信的内容。

3.8.1.HTTP请求
在这里插入图片描述

1、请求行

1
GET /news/hello.html HTTP/1.1
(1)GET:表示请求方式,在HTTP协议中一共定义了7种提交方式,但是我们只用GET和POST。

(2)/news/hello.html:请求资源路径,表示浏览器请求的是哪一个Web应用以及哪一个web资源文件。

(3)HTTP/1.1:请求所遵循的协议和版本。

2、若干请求头

请求头都是Key-Value结构,例如:

image-20200219143453111

1
Host:localhost – 通知服务器,浏览器要请求的是哪一台虚拟主机。
2
Accept:text/html, appliaction/xhtml+xml,… – 通知服务器,浏览器能接收的响应数据类型。
3

(空白行,用于分隔请求头和请求实体)

3、请求实体内容

如果请求方式为 GET 提交,请求实体是没有内容的!

如果请求方式为 POST 提交,并且请求中携带了数据,请求实体中才会有内容!

3.8.2.HTTP响应
在这里插入图片描述

1、状态行

1
HTTP/1.1 200 OK
(1)HTTP/1.1:表示响应所遵循的协议和版本

(2)200:状态码,三位的数字,表示服务器对请求处理的结果。

1
200: 表示请求处理成功
2
302: 表示请求重定向(即需要再进一步请求才可以获取到相应的资源)
3
304/307: 表示通知浏览器使用缓存
4
404: 表示浏览器请求的资源不存在(浏览器的问题, 请求路径错误)
5
500: 表示服务器在处理请求的过程中抛出了异常。
(3)OK:描述短语(可以忽略),也表示服务器对请求处理的结果,和状态码表示的结果一致。

1
200:OK
2
404:Not Found
3
500: Internal Server Error
4

2、若干响应头:也是key-value格式

1
Content-Type: 表示服务器响应的数据类型,text/html, image/*…
2
Content-Length: 表示服务器响应数据的长度, 例如: 384 /字节
3
Set-Cookie: 和cookie技术相关的一个头, 后面会提到。
4

3、响应实体内容

响应实体就是浏览器所请求文件的内容。例如:浏览器向服务器请求一个hello.html文件,服务器会找到hello.html文件,将文件的内容作为响应实体发送给浏览器。

3.8.3.内容补充
1、问题1:请求方式什么时候是GET提交?什么时候是POST提交?

只有当使用表单(form),并且在表单上明确的通过method指定提交方式为POST时,请求方式才是POST提交,其他方式都是GET提交(AJAX除外)

思考:判断以下请求方式是GET还是POST?

1
(1) – GET提交
2
(2) – GET提交
3
(3) – POST提交
4
(4)点击超链接访问服务器,例如:
5
百度一下 – GET提交
6
(5)直接在浏览器的地址栏中书写URL地址访问服务器 – GET提交
2、问题2:GET提交和POST提交有什么区别?

主要区别体现在请求参数传输过程的不相同

GET提交:

将数据通过问号拼接在地址栏URL地址的后面,相对非常不安全。
将数据拼接在地址栏URL地址的后面,数据量是有限制的,通常不能超过1KB或者4KB。
POST提交:(form)

POST提交是通过请求实体将数据提交给服务器,不会显示在地址栏上,因此相对更加安全。
POST提交通过请求实体提交数据,数据量理论上是没有限制的。
3、总结:

如果只是单纯做一个跳转,请求中没有数据,尽量使用GET提交。
如果在请求中有数据,但数据量不大,并且数据没有隐私性,也尽量使用GET提交。
如果在请求中有数据,数据量比较大或者数据较为隐私,此时推荐使用POST提交。
3.9.将Tomcat整合到Eclipse中

将Tomcat服务器整合到Eclipse工具中,可以通过Eclipse启动、关闭tomcat服务器,更重要的是,可以非常方便的将在Eclipse中创建的Web项目发布到Tomcat服务器中运行。

哔哩哔哩视频链接:https://www.bilibili.com/video/BV1wz411z73V

3.9.1.方式一:在window偏好设置中配置Tomcat
1、点击Window --> Preferences(偏好设置):

image-20200311184907773

2、在偏好设置窗口中点击 Server --> Runtime Environments --> add:

image-20200311184913436

3、在弹出的窗口中选择 --> Apache --> Apache Tomcat v8.5,需要注意的是,这里得根据自己安装的tomcat版本进行选择,比如我安装是8.5版本的tomcat,所以这里选择Apache Tomcat v8.5。

image-20200311184921087

4、在下面的窗口中配置tomcat服务器的安装根目录,可以直接把路径复制到第二个输入框中;也可以点击后面的 Browse按钮在文件管理器中选择tomcat服务器安装根目录。

image-20200311184932405

最后点击finish即可完成将Tomcat整合到Eclipse中的配置。

3.9.2.方式二:在创建Web项目时配置Tomcat
1、如果在创建Web项目时,Target runtime选项中没有配置可选的服务器,可以点击右面的选项进行配置

点击后进入下一步操作。

image-20200311184950046

2、在弹出的窗口中选择 --> Apache --> Apache Tomcat v8.5,需要注意的是,这里得根据自己安装的tomcat版本进行选择,比如我安装是8.5版本的tomcat,所以这里选择Apache Tomcat v8.5。

image-20200311185003036

3、在下面的窗口中配置tomcat服务器的安装根目录,可以直接把路径复制到第二个输入框中;也可以点击后面的 Browse按钮在文件管理器中选择tomcat服务器安装根目录。

image-20200311185013454

最后点击finish即可完成将Tomcat整合到Eclipse中的配置。

4、上一步完成后,回到Web项目创建的视图窗口,再查看"Target runtime"选项,如下:

image-20200311185028965

3.9.3.将整合到Eclipse中的tomcat从Eclipse中删除
如果要将整合到Eclipse中的tomcat从Eclipse删除:点击Windows --> Preferences --> Server --> Runtime Environments,选中要删除的服务器,点击右侧的删除按钮即可删除,最后点击Apply and Close保存设置即可!

image-20200311185037713

3.9.4.在Eclipse中创建Server及移除Server
上面讲解了如何将Tomcat整合到Eclipse中,整合之后,需要在Eclipse中创建一个Server才可以进行启动tomcat、关闭tomcat等操作。

1、Eclipse中找到Servers窗口:
在这里插入图片描述

2、如果没有可以到Window --> Show View --> Other中搜索"servers",如下图:
在这里插入图片描述
在这里插入图片描述

3、在Server窗口中点击“No servers are available…”链接:

在这里插入图片描述

4、在弹出的窗口中,保持默认配置,直接点击完成

如果弹出的窗口中默认的服务器不是tomcat,则说明在此之前没有将Tomcat整合到Eclipse中。
在这里插入图片描述

5、在上一步点完成后,Eclipses左侧会多出一个Servers项目,Servers窗口中会出现创建的Server,也就是tomcat服务器。

注意:①处的Servers项目不能关闭(close),更不能删除(delete)
在这里插入图片描述

6、在创建完Server后,双击tomcat,可以修改Tomcat服务器配置

(1)将Server Locations中的选项切换为第二个选项

(2)将Deploy Path右侧的输入框中的内容改为webapps。ctrl+s保存配置即可

image-20200328164951699

以上配置是为了保证在Eclipse中发布Web应用到tomcat服务器中时,可以将项目发布到tomcat服务器的webapps目录下。

如果不配置,会导致tomcat服务器中webapps下的Web应用无法访问。
在这里插入图片描述

7、如果要移除添加的Server,需要同时删除①处的Servers项目(右键delete,要彻底从硬盘上删除),以及删除②处的tomcat服务器(右键delete)

3.9.5.tomcat右键选项介绍
在这里插入图片描述

a) Start:用于启动tomcat服务器,如果已启动,则显示 ReStart,作用是重启服务器

b) Stop:用于停止服务器

c) Add and Remove:将Web应用部署到tomcat服务器中,或者移除服务器中部署的Web应用

d) Clean:作用是将发布到Eclipse自己的webapps目录中的项目删除再重新部署

e) Clean Tomcat Work Directory:作用是将在tomcat运行过程中存入work目录的文件删除

3.9.6.tomcat启动失败常见原因
问题1:tomcat服务器启动失败-1

如果在启动服务器时,服务器启动失败,并弹出窗口显示如下异常信息:
在这里插入图片描述

根据上面的描述信息,可以看出是8005、8080、8009端口被同时占用了,此时只有一种可能,就是之前已经启动了tomcat或者之前开启的tomcat没有完全关闭导致的。

解决方式:到tomcat安装目录找到bin目录中的shutdown.bat文件,双击运行将服务器关闭,再到Eclipse中启动服务器即可!

问题2:tomcat服务器启动失败-2

如果在启动服务器时,服务器启动失败,并弹出窗口显示如下异常信息:
在这里插入图片描述

解决方法:

(1) 可以先将服务器中所有的Web应用移除(在服务器上右键,Add and Remove–>Remove All–>Finish)

(2) 再分别执行服务器右键选项中的clean和Clean Tomcat Work Directory

(3)再次启动服务器,如果启动没有报错,则说明tomcat服务器本身没有问题,再将要运行的项目发布到tomcat中,再次启动服务器,观察是否有错误。如果有则说明是项目本身的问题。

(4)如果移除了所有的Web应用,启动tomcat服务器报错,则说明tomcat本身就有问题,可以将tomcat服务器重新配置一次到Eclipse中(将tomcat和Server项目删除,再点击链接重新创建Server)

4.unit07-Servlet
4.1.Servlet概述

4.1.1.什么是Servlet?
Servlet是由SUN公司提供的一门动态Web资源开发技术

1
静态Web资源:不同的人,在不同的条件下访问后看到的是相同的效果,这样的资源叫做静态Web资源(html、css、js等)
2
动态Web资源:在不同的访问条件下看到的是不同的效果,这样的资源叫做动态Web资源
3
(Servlet、jsp、.NET、PHP等)
Servlet本质上是一段Java程序,和之前的Java程序不同的是,Servlet程序无法独立运行,需要将Servlet程序放在服务器中(比如tomcat服务器),由服务器调用才可以执行。

Servlet: 服务器端的Java程序.

Servlet是运行在服务器端的Java程序,其作用是什么?

其作用是对服务器接收过来的请求进行处理(作用为处理请求)
在这里插入图片描述

4.2.开发Servlet程序

4.2.1.开发Servlet程序的步骤
第一步: 写一个类,实现一个Servlet接口或者继承Servlet接口的子类(GenericServlet/HttpServlet),并实现其中的方法

1
Servlet接口
2
|-- GenericServlet类(抽象类)
3
|-- HttpServlet类
第二步: 在web应用的web.xml文件中配置Servlet程序对外访问的路径。

Eclipse在创建一个Servlet时,会在web.xml文件中生成Servlet配置,所以不需要我们手动配置。

4.2.2.使用Eclipse创建Web项目
在这里插入图片描述

以上是Web项目在工程视图(Project)和包视图(package)下结构,推荐使用包视图!

1、创建一个Web工程: 在左侧窗口中, 点击鼠标右键 —> New —>
Dynamic Web Project。
在这里插入图片描述

2、接着会弹出如下窗口:

创建Web项目
在这里插入图片描述
注意:

(1) 3.0版本不会创建web.xml文件,
并且创建Servlet时也不会在web.xml文件中生成Servlet相关的配置信息, 记得改为2.5。

(2) Target runtime选项中如果没有可选的服务器,可点击右侧的"New
Runtime…"进行配置。

详细操作步骤在《5.2配置Target runtime(Web项目运行环境)》

3、Eclipse中创建的Web工程的目录结构:

image-20200219170618551

1
(1) day09: 工程名称/项目名称
2
(2) src: 源码目录, 创建的java源文件、配置文件(properties、xml文件等)都可以放在src源码目录下
3
(3) build/classes: 编译文件的输出目录, src源码目录中的文件编译后会输出到classes目录下。
4
其中的classes目录在发布时会放在WEB-INF目录下,随着项目一起发布到服务器中
5
(4) WebContent: 就是Web应用的目录,其中可以存放 html、css、js、jsp、图片以及编译后的class文件、jar包、web.xml文件等. 将来发布项目到服务器,其实就是将WebContent中的所有内容一起发布到服务器中。
6
(5) WebContent/WEB-INF/lib: 用于存放当前项目所依赖的jar包。比如要访问mysql数据库,需要导入mysql驱动包,直接将jar包拷贝到lib目录下即可!(也不用再去做 build path --> add to build path)

4.2.3.使用Eclipse创建Servlet
1、选中项目中的src目录,鼠标右键 —> New —> Servlet
在这里插入图片描述

2、在弹出的窗口中,根据提示填写内容:
在这里插入图片描述

3、点击finish即可完成Servlet创建过程, 创建好的Servlet如下:
在这里插入图片描述

通过Eclipse创建Servlet,默认继承HttpServlet。由于HttpServlet也是Servlet接口的子类,让HelloServlet继承HttpServlet,相当于间接实现了Servlet接口。

继承HttpServlet类,默认会覆盖doGet方法和doPost方法,两个方法的作用为:

  • doGet方法:当浏览器发送请求的方式为GET提交时, 将会调用doGet方法来处理请求

  • doPost方法:当浏览器发送请求的方式为POST提交时,
    将会调用doPost方法来处理请求

提示:如果当GET提交和POST提交处理代码相同时,可以将代码写在其中一个方法里(例如写在doGet中),并在另外一个方法(例如doPost)中调这个方法。这样一来,不管是GET提交还是POST提交,最终doGet方法都会执行,都会对请求进行处理!!

4.2.4.Servlet在web.xml中的配置
在通过Eclipse创建Servlet时,会自动在web.xml文件中进行Servlet相关信息的配置

(注意:如果是复制Servlet类文件,但配置信息不会跟着复制,需要自己手动添加配置,否则复制的Servlet将无法访问!)

1

2
HelloServlet
3
com.tedu.HelloServlet
4

5

6
HelloServlet
7
/HelloServlet
8

关于上面的配置信息:

a) Eclipse每创建一个Servlet,就会在web.xml文件中添加两个标签:和标签(可以将这两个标签看成一个组的标签)

b) 和标签内都会有一个标签,标签的内容可以更改,但要求更改后的这两个标签的内容也必须一致。

c) 标签用于配置Servlet类的全限定类名(即包名+类名)

需要注意:如果在创建Servlet后修改了Servlet类的名称,这个地方也要一起更改,否则将会出现"ClassNotFoundException" 即类找不到异常

d) 标签用于配置浏览器以什么路径访问当前Servlet(即Servlet对外访问的路径),默认的路径是:/类名

例如:上面为HelloServlet配置的为/HelloServlet,因此我们在浏览器中的访问路径则为:

http://主机名/web项目访问路径/HelloServlet

4.2.5.运行Servlet程序、访问测试
1、访问Servlet方式一:

若是第一次运行,需要先创建tomcat服务器,即在Servers窗口中点击链接可创建一个tomcat服务器,且只需创建一次即可!

(1)发布项目到服务器:在服务器上右键 --> 点击 “add and remove” 将当前web项目发布到服务器中,并点击完成。

(2)启动tomcat服务器:在服务器上右键 Start 即可启动服务器

(3)通过浏览器访问Servlet:打开本地浏览器,通过路径访问,即可访问Servlet程序

http://localhost:端口/项目名称/HelloServlet

2、访问Servlet方式二:

(1) 在运行的Servlet上点击右键 —> “Run As” —> “1 Run on Server”
在这里插入图片描述

(2) 在弹出的窗口中,直接点击完成即可!!!
在这里插入图片描述

(3) 运行结果如下:
在这里插入图片描述

或者打开浏览器,复制上图中的路径:

http://localhost:8080/Hello/HelloServlet,粘贴到浏览器的地址栏中,回车访问:
在这里插入图片描述

4.2.6.Eclipse如何发布一个Web应用
当通过eclipse将day09项目发布到服务器中,是直接将day09拷贝到服务器中对应的目录下吗?

发布的过程如下:
在这里插入图片描述

4.2.7.Eclipse默认发布Web应用的位置
Tomcat服务器中默认只有一台虚拟主机,叫做localhost主机

而localhost主机发布web应用的位置是webapps。

将day09发布到localhost主机中,但为什么day09项目没有在webapps目录下?


默认情况下,发布一个Web应用到localhost主机中,只需要将Web应用的目录拷贝到webapps目录下即可完成发布!

而将Eclipse和Tomcat整合之后,通2中,发布的路径默认被改成了:

[工作空间].metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps

如何修改Eclipse默认发布Web应用的目录位置:

(1)关闭服务器,将服务器中的所有应用移除

(2)在服务器上右键 --> clean

(3)双击tomcat服务器,在弹出窗口中找到 Server location, 选择第二个选项

并将下方的Deploy Path改为: webapps 改完后,Ctrl+s保存配置即可!!

4.3.Servlet调用过程

通过浏览器访问服务器中的一个Servlet程序,这个Servlet程序是如何执行的?又是如何被调用的?

localhost/Hello/HelloServlet

参考<<Servlet调用过程图>>

4.4.扩展内容

4.4.1.添加Servlet模版
通过Eclipse可以直接创建一个Servlet类,这相比通过记事本等文本编辑工具创建Servlet,可以节省配置Servlet的时间,提高了我们的开发效率。

但是通过Eclipse生成的Servlet类中包含了许多我们不需要的注释和默认实现代码,这些每次都删除也非常占用时间。

接下来可以通过添加模版代码的形式,来生成Servlet的内容,以便于提高我们的开发效率。

1、先创建一个Servlet,将其中的内容修改为自己期望的模版格式,并复制其中的内容,例如:

1
package ${enclosing_package};
2

3
import java.io.IOException;
4
import java.io.PrintWriter;
5
import javax.servlet.ServletException;
6
import javax.servlet.http.HttpServlet;
7
import javax.servlet.http.HttpServletRequest;
8
import javax.servlet.http.HttpServletResponse;
9

10
/**
11

  • author: bjzhangsz@tedu.cn
    12
  • datetime: ${date} ${time}
    13
    */
    14
    public class ${primary_type_name} extends HttpServlet {
    15
    private static final long serialVersionUID = 1L;
    16

17
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
18
response.setContentType(“text/html;charset=utf-8”);
19
PrintWriter out = response.getWriter();
20
}
21
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
22
doGet(request, response);
23
}
24
}
2、点击菜单栏中的window --> Preferences:
在这里插入图片描述

3、在出现的窗口左侧依次点击:Java --> Editor --> templates
–>(在右边的窗口中) 点击New… :
在这里插入图片描述

4、在出现的新窗口中填写如下内容:
在这里插入图片描述

5、替换包路径和类名(作用是在新建Servlet生成的Servlet模版中使用当前类的包路径和类型)

在这里插入图片描述

效果如下:

在这里插入图片描述

效果如下:
在这里插入图片描述

6、点击OK保存,创建新的Servlet文件,测试:

将Servlet中的所有内容全选删除,并输入"servlet",接着按 “Alt+ /”
提示即可生成自己想要的Servlet模版内容!

在这里插入图片描述

4.4.2.Servlet3.0的特性
上面使用的是Servlet2.5版本,其实JavaEE5.0规范的子规范,要求运行环境最低是JDK5.0,tomcat5.0。

而Servlet3.0规范是JavaEE6.0的子规范,其要求运行环境最低是JDK6.0,tomcat7.0。若要使用Servlet3.0规范,则需要在创建动态Web项目时就要指定。具体用法是,在Eclipse中创建动态Web工程时,指定创建的“动态Web模块版本”为3.0或以上版本,此时创建的Web工程中默认是没有web.xml文件的。

在这里插入图片描述

思考:如果没有web.xml文件,那么如何配置Servlet的访问路径呢?

通过注解方式进行配置Servlet访问路径。下面来几个Servlet3.0的示例。

1、在3.0以上版本的动态Web项目中创建一个Servlet,如下:

1
@WebServlet("/HelloServlet")
2
public class HelloServlet extends HttpServlet {
3
private static final long serialVersionUID = 1L;
4

5
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
6
PrintWriter out = response.getWriter();
7
out.write( “Hello Servlet3.0…”+new Date() );
8
}
9
}
其中@WebServlet("/HelloServlet") 这个注解的作用就是配置当前Servlet的访问路径为/HelloServlet,完善doGet方法中的代码,直接运行Servlet。

可以在浏览器中看到如下效果:

image-20200630001900994

2、@WebServlet注解中可以配置多个访问路径

在@WebServlet注解中配置的访问路径,其实前面省略了value属性,完整写法为:

@WebServlet(value="/HelloServlet"),只不过value可以省略

由于在源码中value属性其本质是一个字符串数组,因此可以为value属性赋值为一个数组直接量。例如:@WebServlet(value={})

将HelloServlet类上的注解改为如下形式:

1
@WebServlet(value={"/HelloServlet", “/hello01”, “/hello02”})
2
public class HelloServlet extends HttpServlet {
3
private static final long serialVersionUID = 1L;
4

5
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
6
PrintWriter out = response.getWriter();
7
out.write( “Hello Servlet3.0…”+new Date() );
8
}
9
}
在浏览器中运行效果为:
在这里插入图片描述

3、可以将value属性替换为urlPattern属性

1
@WebServlet(urlPatterns={"/HelloServlet", “/hello01”, “/hello02”})
2
public class HelloServlet extends HttpServlet {
3
private static final long serialVersionUID = 1L;
4

5
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
6
PrintWriter out = response.getWriter();
7
out.write( “Hello Servlet3.0…”+new Date() );
8
}
9
}
在浏览器中运行效果为:

image-20200630003836494

4.5.request和response介绍

request是代表HTTP请求信息的对象,response是代表HTTP响应信息的对象。

当浏览器发请求访问服务器中的某一个Servlet时,服务器将会调用Servlet中的service方法来处理请求。在调用service方法之前会创建出request和response对象。

其中request对象中封装了浏览器发送给服务器的请求信息(请求行、请求头、请求实体等),response对象中将会封装服务器要发送给浏览器的响应信息(状态行、响应头、响应实体),在service方法执行完后,服务器再将response中的数据取出,按照HTTP协议的格式发送给浏览器。

每次浏览器访问服务器,服务器在调用service方法处理请求之前都会创建request和response对象。(即,服务器每次处理请求都会创建request和response对象)

在请求处理完,响应结束时,服务器会销毁request和response对象。

4.6.request对象

4.6.1.获取请求参数
问题1:什么是请求参数?

所谓的请求参数,就是浏览器发送给服务器的数据(不区分请求方式),例如:通过表单向服务器提交的用户名、密码等,或者在超链接后面通过问号提交的数据,都是请求参数。

1
http://localhost/day10/TestParam?user=zhangsan&pwd=123&like=篮球&like=足球
问题2:如何获取请求参数?

1
(1)request.getParameter(String paramName)
2
– 根据请求参数的名字获取对应的参数值,返回值是一个字符串;
3
– 如果一个参数有多个值,该方法只会返回第一个值。
4
– 如果获取的是一个不存在的参数,返回值为null
5
(2)request.getParameterValues(String paramName)
6
– 根据请求参数的名字获取该名字对应的所有参数值组成的数组,返回值是一个字符串数组,其中包含了这个参数名对应的所有参数值
7
– 如果获取的是一个不存在的参数,返回值为null
代码示例:

1
//1.获取请求参数中的用户名(user)
2
String user = request.getParameter(“user”);
3
System.out.println( “user=”+user );
4

5
//2.获取请求参数中的爱好(like)
6
String[] like = request.getParameterValues( “like” );
7
System.out.println( “like=”+Arrays.toString( like ) );
问题3:如何解决获取请求参数时的中文乱码问题?

在获取中文的请求参数时,可能会出现乱码问题(和请求方式、tomcat服务器版本有关),具体可以分为以下三种情况:

(1)如果请求是GET提交,并且tomcat是8.0及以后的版本,GET提交的中文参数,在获取时不会出现乱码问题!(8.0以后的tomcat包括8.0在获取GET提交的中文参数时,已经处理中文乱码问题。)

(2)如果请求是POST提交,不管是哪个版本的tomcat服务器,在获取中文参数时,都会出现乱码问题。因为tomcat底层在接收POST提交的参数时,默认会使用iso8859-1编码接收,而这个编码中没有中文字符,所以在接收中文参数时,一定会出现中文乱码问题!

解决方法是:通知服务器在接收POST提交的参数时,使用utf-8编码来接收!

1
request.setCharacterEncoding(“utf-8”);
注意:这行代码不会影响GET提交,只对POST提交有效!

这行代码要放在任何获取参数的代码之前执行!

(3)如果请求是GET提交,并且tomcat是7.0及以前的版本,GET提交的中文参数,在获取时会出现乱码问题!

解决方法:在[tomcat安装目录]/ conf/server.xml文件的(修改端口的)Connector标签上,添加一个 URIEncoding=“utf-8” 属性,如下:

1
<Connector port=“80” protocol=“HTTP/1.1”
2
connectionTimeout=“20000”
3
redirectPort=“8443”
4
URIEncoding=“utf-8” />
同时在[Eclipse]/Servers/[当前tomcat服务器对应的配置目录]/server.xml文件中,在Connector标签上,添加一个 URIEncoding=“utf-8” 属性,同上!

4.6.2.实现请求转发
请求转发是服务器内部资源的一种跳转方式,即当浏览器发送请求访问服务器中的某一个资源(A)时,该资源将请求转交给另外一个资源(B)进行处理并且由资源B做出响应的过程,就叫做请求转发。

请求转发和重定向都是资源的跳转方式,但是跳转的过程有所不同。

image-20200304232156159

请求转发的特点:

1
(1)转发是一次请求,一次响应
2
(2)请求转发前后,浏览器的地址栏地址不会发生变化。(浏览器–访问–> A --转发–> B,地址栏地址始终指向A的地址)
3
(3)请求转发前后的request对象是同一个(转发前在A中的request和转发到B后,B中的request对象和A中的request对象是同一个。基于这一点,可以通过request从A带数据到B)
4
(4)请求转发前后的两个资源必须属于同一个Web应用,否则将无法进行转发。(A–转发–>B,A和B必须属于同一个Web应用!)
请求转发实现:

1
request.getRequestDispatcher(url地址/转发到资源的地址).forward(req, res);
代码示例:

1
//从当前Servlet转发到 index.jsp(http://localhost/day10/index.jsp)
2
//request.getRequestDispatcher("/index.jsp").forward(request, response);
3
request.getRequestDispatcher(“index.jsp”).forward(request, response);
image-20200221171059404

4.6.3.作为域对象使用
request在实现转发时,通过request.setAttribute方法和request.getAttribute方法带数据到目的地时,就是通过request对象中的map集合带数据,这个request对象上的map集合以及request对象所在的范围即称之为是一个域对象。

如果一个对象具备可以被访问的范围,通过这个对象上的map集合可以在整个范围内实现数据的共享。这样的对象就叫做域对象。

在request对象上提供了往域对象(map)中存数据的方法以及取数据的方法:

1
request.setAttribute(String attrName, Object attrValue);
2
– 往request域中存入一个域属性,属性名(key)只能是字符串,属性值(value)可以是任意类型。
3
request.getAttribute(String attrName);
4
– 根据属性名(key)获取对应的属性值(value)。返回的是一个Object类型的对象。
request域对象所具备的三大特征:

生命周期:在服务器调用Servlet程序的service方法之前,会创建代表请求的request对象,在请求处理完,响应结束时,会销毁request对象。

作用范围:在一次请求范围内,都可以获取到同一个request对象。

主要功能:和请求转发配合使用,从Servlet带数据到JSP(带数据到目的地)

扩展内容:request对象的getParameter和getAttribute方法有什么区别?

getParameter()方法是用于获取(从浏览器发送过来的)请求参数的,请求参数不能设置,只能是浏览器发送给服务器,在服务器端再通过getParameter方法获取请求中的参数
getAttribute()方法是用于从request域中获取域属性时用的,域属性得先存入到域中(即得先通过setAttribute方法将数据存入request域中),再通过getAttribute()方法从域中获取。

4.7.response对象

response是代表HTTP响应信息的对象。

4.7.1.向客户端发送数据
PrintWriter out = response.getWriter();

由于服务器在通过response获取的流发送数据时,默认使用iso8859-1编码,而这个编码中没有中文字符,所以在通过response获取的流发送中文数据时,会出现乱码问题。

解决方法是:在响应数据之前,通知服务器使用utf-8发送数据。

1
/* 通知服务器在响应数据时,使用utf-8编码
2

  • 也能通知浏览器使用utf-8接收服务器发送的数据 */
    3
    response.setContentType( “text/html;charset=utf-8” );
    4
    PrintWriter out = response.getWriter();
    5
    out.write( “你好” );
    4.7.2.实现重定向
    当浏览器向服务器发请求访问某一个资源A,资源A在响应时通知浏览器需要再进一步请求才能获取到对应的资源,浏览器再次发请求访问服务器中的资源B,最终由资源B响应浏览器要获取的资源,这个过程叫做重定向。

image-20200304232136926

重定向的特点:

1
(1)重定向是两次请求、两次响应
2
(2)重定向前后,浏览器的地址栏地址会发生变化。(因为两次请求都是通过浏览器发起,浏览器知道这个跳转的过程,因此地址栏地址会变化)
3
(3)重定向前后的request对象不是同一个(因为重定向是两次请求,服务器会根据两次请求创建两个不同的request对象,request对象不是同一个,也就不能在重定向时通过request带数据到目的地。)
4
(4)重定向前后的两个资源可以是来自不同的web应用,甚至可以是来自不同的服务器。(进行跳转的两个资源之间没有限制)
实现代码:

1
response.sendRedirect(所重定向到资源的URL地址);
image-20200516163229388

代码示例:

1
//测试1: 从当前Servlet(day10/TestRedirect)重定向到day10/index.jsp
2
// http://localhost/day10/TestRedirect
3
// http://localhost/day10/index.jsp
4
response.sendRedirect( “http://localhost/day10/index.jsp” );
5
response.sendRedirect( “/day10/index.jsp” );
6
response.sendRedirect( “/index.jsp” ); //错误路径
7
response.sendRedirect( “index.jsp” ); //正确路径
8

9
//测试2: 从当前Servlet重定向到day09/index.jsp
10
response.sendRedirect( “http://localhost/day09/index.jsp” );
11

12
//测试3: 从当前Servlet重定向到百度首页
13
response.sendRedirect( “http://www.baidu.com” );
总结-1:请求转发(forward)和重定向(redirect)的区别?

1
(1)请求转发是一次请求,一次响应; 而重定向是两次请求两次响应
2
(2)请求转发前后地址栏地址不会发生变化; 而重定向前后地址栏地址会发生变化
3
(3)请求转发前后的request对象是同一个,可以配合request域对象带数据到目的地; 而重定向前后的request对象不是同一个, 不能结合request域对象在重定向前后带数据.
4
(4)请求转发要求两个资源必须属于同一个Web应用; 而进行重定向的两个资源可以是同一个Web应用,也可以不是同一个Web应用,甚至可以是来自于不同的主机或服务器.
总结-2:什么时候用请求转发(forward)?什么时候用重定向(redirect)?

1
(1)如果希望跳转前后地址栏地址不会发生变化, 只能使用转发; 如果希望跳转前后地址栏地址会发生变化, 只能使用重定向
2
(2)如果希望在跳转前后, 能够通过request对象带数据到目的地, 只能使用转发
3
(3)如果仅仅是做一个跳转,没有其他要求,此时推荐使用转发(转发是一次请求,一次响应,可以减少访问服务器的次数,降低服务器的压力)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值