# 学习目标
第一章-WEB开发介绍
知识点-WEB资源分类
1.目标
- 能够理解什么是WEB
2.讲解
2.1什么是web
WEB,在英语中web即表示网页的意思,它用于表示Internet主机(服务器)上供外界访问的资源
2.2WEB资源分类
2.2.1静态资源
- web页面中供人们浏览的数据始终是不变 (eg:html、css、js)
2.2.2动态资源
- 指web页面中供人们浏览的数据是由程序产生的,不同的用户或者不同时间点访问web页面看到的内容各不相同。(eg:servlet、php、asp、jsp)
3.小结
- web:表示服务器上供外部访问的资源
- web资源分类
- 静态资源 html 无论谁来访问内容都是一样的
- 动态资源 Serlet 当不同的人或不同的时间点访问得到内容也不同 会发送改变
知识点-软件架构
1.目标
- 能够理解软件的架构
2.讲解
2.1架构类别
2.1.1C/S架构
Client / Server,客户端和服务器端,用户需要安装专门客户端程序。(QQ、微信、LOL)
2.2.2B/S架构
Browser / Server,浏览器和服务器端,不需要安装专门客户端程序,浏览器是操作系统内置。(微信网页版、购物网站)
2.2B/S 和C/S交互模型的比较
-
相同点
都是基于请求-响应交互模型:即浏览器(客户端) 向 服务器发送 一个 请求。服务器 向 浏览器(客户端)回送 一个响应 。
-
不同点
实现C/S模型需要用户在自己的操作系统安装各种客户端软件(百度网盘、腾讯QQ等);实现B/S模型,只需要用户在操作系统中安装浏览器即可。
注:B/S模型可以理解为一种特殊C/S模型。
B/S:使用方便,更加通用,易于维护,不稳定,依赖网络、安全性相对较差。
C/S:稳定性较好,软件资源可以提前加载,安全性相对较高,更新维护成本较高(xp、win7、win8、win10、安卓、ios、ipad)
3.小结
- 架构类别:
- B/S架构:浏览器+服务器 【使用比较多】
- C/S架构:客户端+服务器
- B/S和C/S区别:
- B/S是直接通过浏览器访问 C/S需要安装客户端才能访问
- B/S:开发、安装、使用、维护 比较方便 稳定性较差 安全性较低
- C/S:开发、安装、使用、维护 比较麻烦 稳定性较高 安全性较高
知识点-web通信【重点】
1.目标
- 掌握web通讯机制
2.讲解
基于http协议,请求响应的机制(https=http+SSL)
请求一次响应一次
先有请求后有响应
3.小结
- 浏览器必须先请求服务器, 服务器处理请求, 给浏览器响应
- 浏览器和服务器之间通信是基于HTTP协议
- 一次请求,一次响应
- 先有请求,后有响应
第二章-服务器【重点】
知识点-服务器介绍
1.目标
- 掌握什么是服务器
2.讲解
2.1 什么是服务器
服务器就是提供服务的机器(电脑),提供数据库服务我们就称为数据库服务器,提供WEB服务我们就称为WEB服务器。(MySQL服务器=MySQL软件+电脑)
服务器就是一个软件,任何电脑只需要安装上了服务器软件, 我们的电脑就可以当做一台服务器了. 安装了MySQL软件的电脑就是一台数据库服务器,可以向外提供数据存储查询的服务。
服务器: 硬件(电脑)+软件(mysql, tomcat,nginx)
MySQL+主机:MySQL服务器 提供外部存储和访问的服务
tomcat+主机:web服务器 提供外部访问资源【静态资源+动态资源】的服务
2.2常见web服务器
-
WebLogic
Oracle公司的产品,是目前应用比较多的Web服务器,支持J2EE规范。WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。
-
WebSphere
IBM公司的WebSphere,支持JavaEE规范。WebSphere 是随需应变的电子商务时代的最主要的软件平台,可用于企业开发、部署和整合新一代的电子商务应用。
-
Glass Fish
最早是Sun公司的产品,后来被Oracle收购,开源免费,中型服务器。
-
JBoss
JBoss公司产品,开源,支持JavaEE规范,占用内存、硬盘小,安全性和性能高。
-
Tomcat
中小型的应用系统,免费,开源,效率特别高, 适合扩展(搭集群)支持JSP和Servlet.
3.小结
-
服务器:软件+硬件
- MySQl+主机:数据库服务器 提供外部进行数据存储查询的服务
- tomcat+主机:web服务器 通过外部访问静态资源和动态资源的服务
知识点-tomcat介绍,安装和使用【重点】
1.目标
- 能够安装,启动,关闭Tomcat服务器
2.讲解
2.1概述
Tomcat服务器是一个免费的开放源代码的Web应用服务器。 提供服务:提供WEB服务 用户就可以通过浏览器访问服务器上的动态资源和静态资源。
Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet 和JSP规范总是能在Tomcat中得到体现。
因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,是目前比较流行的Web应用服务器。
2.2tomcat的下载
-
先去官网下载:http://tomcat.apache.org/,选择tomcat8版本(红框所示):
-
选择要下载的文件(红框所示):
tar.gz 文件 是linux操作系统下的安装版本
exe文件是window操作系统下的安装版本
zip文件是window操作系统下压缩版本(我们选择zip文件)
-
下载完成:
2.3tomcat服务器软件安装
-
直接解压当前这个tomcat压缩包:(不要有中文,不要有空格)
-
配置环境变量:
tomcat运行依赖于java环境:
2.4tomcat的目录结构
2.5启动与关闭tomcat服务器
-
启动tomcat服务器
查找tomcat目录下bin目录,查找其中的startup.bat命令,双击启动服务器:
启动效果:
-
测试访问tomcat服务器
打开浏览器在,在浏览器的地址栏中输入:
http://127.0.0.1:8080或者http://localhost:8080
注: Localhost相当于127.0.0.1
-
关闭tomcat服务器
查找tomcat目录下bin目录,查找其中的shutdown.bat命令,双击关闭服务器:
3.小结(常见问题)
tomcat安装启动停止
1. 下载解压到没有中文和空格的目录下
2. 启动:点击bin目录下的startup.bat 停止:点击bin目录下的shutdown.bat
3.1安装注意点
- 解压到一个没有中文和空格目录下
- 使用之前, 配置JAVA_HOME和path(jdk环境变量)
- JAVA_HOME 配到jdk的安装 bin目录的上一级
- path 才是配到bin目录
3.2端口号冲突
报如下异常: java.net.BindException: Address already in use: JVM_Bind 8080
解决办法:
第一种:修改Tomcat的端口号
修改conf/server.xml , 第70行左右
第二种:查询出来哪一个进程把8080占用了, 结束掉占用8080端口后的程序
打开命令行输入: netstat -ano|find "8080"
找到占用了8080 端口的 进程的id
去任务管理器kill掉这个id对应的程序(cmd命令:taskkill -PID 22456
)
3.3JAVA_HOME没有配置
- 会出现闪退 (如果JAVA_HOME配置了还是闪退 忽略它了, 后面在IDEA里面进行启动, 就没有这个问题)
知识点-运用Tomcat服务器部署WEB项目
1.目标
- 能够运用Tomcat服务器部署WEB项目
2.讲解
http://172.16.1.147:8080/day20_html/index.html
2.1标准的JavaWeb应用目录结构
Web(文件夹,项目)
|---静态资源: html,css,js,图片(它们可以以文件存在,也可以以文件夹存在)
|---WEB-INF 固定写法。此目录下的文件不能被外部(浏览器)直接访问
|---lib:存放jar包的目录
|---web.xml:当前项目的配置文件(3.0规范之后可以省略)
|---classes:java类编译后生成class文件存放的路径
2.2发布项目到tomcat
2.2.1 方式一:直接发布
只要将准备好的web资源直接复制到tomcat/webapps文件夹下,就可以通过浏览器使用http协议访问获取
2.2.2方式二: 虚拟路径的方式发布项目
- 第一步:在tomcat/conf目录下新建一个Catalina目录(如果已经存在无需创建)
- 第二步:在Catalina目录下创建localhost目录(如果已经存在无需创建)
- 第三步:在localhost中创建xml配置文件,名称为:second(注:这个名称是浏览器访问路径)
-
第四步:添加second.xml文件的内容为: docBase就是你需要作为虚拟路径的项目的路径
<?xml version = "1.0" encoding = "utf-8"?> <Context docBase="G:/myApp" />
-
第五步:直接访问(通过写配置文件的路径来访问):
http://localhost:8080/second/a.html (second就是配置文件的名字, 映射成了myApp)
3.小结
- WEB-INF: 里面的资源受保护, 外界不能直接访问
- 发布方式
- 直接发布: 把WEB应用拷贝到 webapps目录
- 虚拟路径:
- 在conf\Catalina\localhost 创建xml
- xml文件中配置要发布项目的路径,xml文件名称即对应项目映射的访问根路径【项目部署虚拟路径】
- 直接通过xml的文件名访问项目
第三章-http协议【了解】
知识点-http协议概述
1.目标
- 掌握什么是HTTP协议, 以及HTTP协议的作用
2.讲解
2.1什么是HTTP协议
HTTP是HyperText Transfer Protocol(超文本传输协议)的简写,传输HTML文件。就是规范.
HTTP是互联网上用的最多的一个协议, 所有的www开头的都是遵循这个协议的(可能是https 超文本传输安全协议)
2.2HTTP协议的作用
HTTP作用:用于定义WEB浏览器与WEB服务器之间交换数据的过程和数据本身的内容
浏览器和服务器交互过程: 浏览器请求, 服务器处理请求响应
请求(请求行,请求头,请求体)
响应(响应行,响应头,响应体)
3.小结
-
HTTP: 超文本传输协议, 就是一种规范
-
HTTP作用: 规定了客户端(浏览器)和服务器之间进行交互的过程和传输的内容
- 请求(请求头、请求行、请求体)
- 响应(响应头、响应行、响应体)
知识点-请求部分
1.目标
- 了解请求行,常见请求头,请求体
2.讲解
- get方式请求
【请求行】
GET /myApp/success.html?username=zs&password=123456 HTTP/1.1
【请求头】
Accept: text/html, application/xhtml+xml, */*
X-HttpWatch-RID: 41723-10011
Referer: http://localhost:8080/myApp/login.html
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (MSIE 9.0; qdesk 2.4.1266.203; Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: localhost:8080
Connection: Keep-Alive
Cookie: Idea-b77ddca6=4bc282fe-febf-4fd1-b6c9-72e9e0f381e8
- post请求
【请求行】
POST /myApp/success.html HTTP/1.1
【请求头】
Accept: text/html, application/xhtml+xml, */*
X-HttpWatch-RID: 37569-10012
Referer: http://localhost:8080/myApp/login.html
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (MSIE 9.0; qdesk 2.4.1266.203; Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8080
Content-Length: 27
Connection: Keep-Alive
Cache-Control: no-cache
【请求体】
username=zs&password=123456
2.1请求行 (对请求信息的简单描述)
- 请求行
GET /myApp/success.html?username=zs&password=123456 HTTP/1.1
POST /myApp/success.html HTTP/1.1
-
请求方式(8种,put,delete等)【面试】
GET:明文传输, 不安全,参数跟在请求路径后面,对请求参数大小有限制,
POST: 暗文传输,安全一些,请求参数在请求体里,对请求参数大小没有限制,
-
URI:统一资源标识符(即:去掉协议和IP地址和端口号部分)
-
协议版本:HTTP/1.1
2.2请求头
从第2行到空行处,都叫请求头,以键值对的形式存在,但存在一个key对应多个值的请求头.
作用:浏览器告诉服务器自己相关的设置
- Accept:浏览器可接受的MIME类型 ,告诉服务器客户端能接收什么样类型的文件。
- User-Agent:浏览器信息.(浏览器类型, 浏览器的版本....)
- Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
- Content-Length:表示请求参数的长度
- Host:初始URL中的主机和端口
- Referrer:从哪里里来的(之前是哪个资源)、防盗链
- Content-Type:内容类型,告诉服务器,浏览器传输数据的MIME类型,文件传输的类型,application/x-www-form-urlencoded .
- Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip
- Connection:表示是否需要持久连接。如果服务器看到这里的值为“Keep -Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接 )
- Cookie:这是最重要的请求头信息之一(会话技术, 后面会有专门的时间来讲的)
- Date:Date: Mon, 22Aug 2011 01:55:39 GMT请求时间GMT
2.3请求体
只有请求方式是post的时候,才有请求体. 即post请求时,请求参数(提交的数据)所在的位置
3.小结
- 请求行:对请求信息的简单描述
- 请求方式 get|post
- 请求地址 URI(不包含协议、ip地址和端口号部分)
- 协议版本 HTTP/1.1
- 请求头:浏览器告诉服务器一些自身的信息
- user-agent:浏览器告诉服务器客户端浏览器的类型和版本
- referer:浏览器告诉服务器我从哪里来
- content-type:浏览器告诉服务器我给你内容类型
- 请求体
- get方式没有请求体 因为请求参数在url后面拼接
- post方式有请求体 请求体就是请求参数
知识点-响应部分
1.目标
- 掌握响应行, 常见的响应头,响应体
2.讲解
-
响应部分
【响应行】 HTTP/1.1 200 【响应头】 Accept-Ranges: bytes ETag: W/"143-1557909081579" Last-Modified: Wed, 15 May 2019 08:31:21 GMT Content-Type: text/html Content-Length: 143 Date: Sun, 08 Dec 2019 02:20:04 GMT 【响应体】 <!DOCTYPE html> <html lang="en"> <head> <title>Title</title> </head> <body> Success </body> </html>
2.1响应行
HTTP/1.1 200
-
协议/版本
-
响应状态码 (记住-背诵下来)
200:正常,成功
302:重定向
304:表示客户机缓存的版本是最新的,客户机可以继续使用它,无需到服务器请求. 读取缓存
403:请求被禁止,常发生于跨域请求(没有权限去请求进入某个服务器)
404:客户端错误(一般是路径写错了,没有这个资源) 请求路径不存在,请求地址写错了
406:请求与响应不一致 请求和响应是的content-Type设置不一样
500:服务器内部错误(程序运行出错了 java代码运行报错)
2.2响应头
响应头以key:vaue存在, 可能多个value情况. 服务器指示浏览器去干什么,去配置什么
-
Location: http://www.it315.org/index.jsp 指示新的资源的位置,通常和状态码302一起使用,完成请求重定向
-
Content-Type: text/html; charset=UTF-8; 设置服务器发送的内容的MIME类型,文件下载时候 (web.xml)
a.mp3 b.mp4
-
Refresh: 5;url=http://www.baidu.com 指示客户端刷新频率。单位是秒 eg: 告诉浏览器5s之后跳转到百度
-
Content-Disposition: attachment; filename=a.jpg 指示客户端(浏览器)下载文件
-
Content-Length:80 告诉浏览器正文的长度
-
Server:apachetomcat 服务器的类型
-
Content-Encoding: gzip服务器发送的数据采用的压缩类型
-
Set-Cookie:SS=Q0=5Lb_nQ;path=/search服务器端发送的Cookie
-
Cache-Control: no-cache (1.1)
-
Pragma: no-cache (1.0) 表示告诉客户端不要使用缓存
-
Connection:close/Keep-Alive
-
Date:Tue, 11 Jul 2000 18:23:51 GMT
2.3响应体
页面展示内容, 和网页右键查看的源码一样
3.小结
-
响应行
- 协议版本 HTTP/1.1
- HTTP状态码
- 200:请求成功
- 404:请求资源不存在 【路径写错 或 资源真的不存在】
- 500:服务器内部错误 【java代码运行出错】
-
响应头:服务器告诉浏览器一些信息
- location:重新设置请求地址
- refresh:定时刷新
- content-Type:服务器告诉浏览器我响应给你的内容类型
- content-disposition:服务器告诉浏览器你给我去下载
-
响应体:服务器响应给浏览器的内容
第四章-Servlet入门【重点】
知识点-Servlet概述
1.目标
- 知道什么是Servlet,Servlet作用
2.讲解
2.1什么是Servlet
Servlet 运行在服务端(tomcat)的Java小程序,是sun公司提供一套规范. 就是动态资源
Servlet是充当于服务器(tomcat)和java程序之前沟通的桥梁中介
2.2Servlet作用
用来接收客户端请求信息、处理客户端请求、响应给浏览器的动态资源。
但servlet的实质就是java代码,通过java的API动态的向客户端输出内容
2.3 servlet与普通的java程序的区别
- 必须实现servlet接口
- 必须在servlet容器(服务器 tomcat)中运行
- servlet程序可以接收用户请求参数以及向浏览器输出数据
3.小结
- Servlet是运行在服务器端java小程序, 动态资源 充当服务器与java程序之间的桥梁
- Servlet的作用: 从服务器接收请求给java程序处理,将java程序处理结果返回给服务器响应到浏览器
实操-使用IDEA创建web工程配置tomcat
1.目标
- 能够在IDEA配置tomcat 并且创建web工程
2.讲解
工欲善其事 必先利其器
2.1配置tomcat
我们要将idea和tomcat集成到一起,可以通过idea就控制tomcat的启动和关闭:
2.2创建JavaWeb工程
2.2.1web工程创建
2.2.2 发布
- 情况一: 已经关联成功的情况(因为我创建项目的时候, 已经选择了tomcat)
- 情况二: 如果之前没有选择tomcat, 现在就需要自己关联发布
3.小结
-
配置tomcat(选择local)
-
创建javaweb项目,选择Java Enterprise JavaEE7
-
发布
-
web工程目录结构【开发时】
-
web应用目录结构【发布时】
web开发细节:
1.web项目和web应用的不同?
web项目:【开发时创建】
项目名称
src:java源代码
web:存放资源
静态资源:html...
WEB-INF:存储外部不能直接访问的资源
lib:存放web项目的jar包
web.xml:web项目的配置文件
web应用:【发布到tomcat中】
项目虚拟路径:
WEB-INF:存储外部不能直接访问的资源
web.xml:web项目的配置文件
lib目录:存放web项目的jar包
classes目录:存入src下java源代码编译后的字节码文件
静态资源:html
2.idea如何发布项目到tomcat?
使用虚拟路径发布
3.项目编译后的内容在哪里【也就是说 web项目编译成为web应用存储在哪里?】?
普通JavaWEB项目 web项目编译后的web应用存储在out目录下
因此,以后如果说修改了代码,没有重新编译,导致运行还是和以前一样,这个时候就清理缓存,删除out目录。
案例-Servlet入门案例
1.需求
在IDEA编写Servlet,发布到Tomcat. 在浏览器输入路径请求, 控制台打印Hello SZ119...
2.分析
2.1配置文件方式
- 创建一个web工程
- 创建一个servlet类实现Servlet接口,编写servlet
- 在web.xml中配置servlet
2.2注解方式实现
- 创建一个web工程
- 创建一个servlet类实现servlet接口,编写servlet
- 在Servlet类上面使用
@WebServlet
进行配置请求映射
3.实现
3.1配置文件方式实现
- 在com.itheima.web包下创建一个类实现Servlet接口
package com.itheima.web;
import javax.servlet.*;
import java.io.IOException;
/**
* Servlet配置文件方式使用:
* 1.创建一个java类实现Servlet接口
* 2.在web.xml中配置Servlet 【Servlet作为一个动态资源 配置Servlet的请求地址】
*/
public class ServletDemo01 implements Servlet {
//初始化
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
//获取ServletConfig对象
@Override
public ServletConfig getServletConfig() {
return null;
}
//服务
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("ServletDemo01...");
}
//获取Servlet信息
@Override
public String getServletInfo() {
return null;
}
//销毁
@Override
public void destroy() {
}
}
- web.xml配置(该文件在web/WEB-INF 文件夹下):
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!--配置Servlet-->
<servlet>
<!--servlet-name: 名字 随便取; 一般就是类名-->
<servlet-name>ServletDemo01</servlet-name>
<!--servlet-class:Servlet这个类的全限定名-->
<servlet-class>com.itheima.web.ServletDemo01</servlet-class>
</servlet>
<servlet-mapping>
<!--servlet-name: 必须和servlet标签里面的servlet-name一样-->
<servlet-name>ServletDemo01</servlet-name>
<!--url-pattern: 配置访问的路径-->
<url-pattern>/demo01</url-pattern>
</servlet-mapping>
</web-app>
3.2注解方式实现
- 在com.itheima.web包下创建一个类实现Servlet接口, 添加注解
package com.itcast.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo02")
public class ServletDemo02 implements Servlet {
/**
* 服务
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello...");
}
}
配置tomcat服务器启动测试(配置过程之前已经展示,这里不再重复)
浏览器地址栏输入:http://localhost:8080/day22/demo02
4.小结
4.1 如果出现实现Servlet报错
- 检查当前的工程是否依赖了Tomcat
- 如果没有依赖, 依赖tomcat
4.2配置文件方式与注解方式比较
注解方式简化的javaweb代码开发,可以省略web.xml配置文件.
但是配置文件方式必须掌握的目前推荐主流使用方式 注解)
4.3步骤回顾
- xml方式
- 创建一个类 实现Servlet接口
- 在web.xml中配置Servlet的请求路径
- 注解方式
- 创建一个类实现Servlet接口
- 在Servlet类上添加@WebServlet("请求路径")注解
知识点-入门案例原理和路径
1.目标
- 掌握Servlet执行原理和Servlet路径的配置url-pattern
2.讲解
2.1Servlet执行原理
通过上述流程图我们重点需要掌握如下几个点:
-
Servlet对象是由服务器创建(反射)
-
request与response对象也是由tomcat服务器创建
-
service()方法也是服务器调用的
2.3Servlet路径的配置url-pattern
url-pattern配置方式共有四种:
- 完全路径匹配: 以 / 开始. 注: 访问的路径不能多一个字母也不能少一个,否则会报404
例如: 配置了/demo01 请求的时候必须是: /demo01
- 目录匹配"以 / 开始需要以 * 结束. 注: Servlet里面用的 不多, 但是过滤器里面通常就使用目录匹配
例如: 配置/* 访问/a, /aa, /aaa; 配置 /aa/* 访问 /aa/b , /aa/cc
- 扩展名匹配 不能以 / 开始, 以 * 开始的
例如: *.action; 访问: aa.action, bb.action, c.action; 错误写法: /*.do, 不可以写*.jsp,*.html
package com.itheima.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* Servlet注解方式使用:
* 1.创建一个java类实现Servlet接口
* 2.在Servlet类上添加@WebServlet("请求地址")注解 【Servlet作为一个动态资源 配置Servlet的请求地址】
* Servlet路径配置:
* 1.完全路径匹配: 以/开头 eg:@WebServlet("/demo02")
* 2.目录匹配:以/开头 以*结尾 eg:@WebServlet("/user/*") 表示当前Servlet接收处理user下的所有请求
* 3.扩展名匹配:不以/开头 eg:@WebServlet("*.do") 表示当前Servlet处理所有以.do结尾的请求
* 4.全局匹配:
* /*:表示接收所有请求 会拦截所有的jsp和html,【即使存在 也拦截了】
* /:表示接收除了jsp以外的所有请求 【如果html存在 不拦截,不存在 进入到当前Servlet处理】
* 以后学习SpringMVC 核心控制器使用的就是Servlet 请求路径配置的就是/
* 路径配置优先级:完全匹配> 目录匹配 > 扩展名匹配 >全局匹配(/)
*/
@WebServlet("/")
public class ServletDemo02 implements Servlet {
//初始化
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
//获取ServletConfig对象
@Override
public ServletConfig getServletConfig() {
return null;
}
//服务
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("ServletDemo02...");
}
//获取Servlet信息
@Override
public String getServletInfo() {
return null;
}
//销毁
@Override
public void destroy() {
}
}
注意的地方:
-
一个路径只能对应一个servlet, 但是一个servlet可以有多个路径
-
tomcat获得匹配路径时,优先级顺序:完全路径匹配> 目录匹配 > 扩展名匹配 >全局匹配(/)
3.小结
-
讲Servlet原理目的让大家对Servlet执行有一个深入认识, 只需要能懂就可以. 具体操作是服务器(创建servlet,执行service), 你【重点】要做的就是写出Servlet
-
路径有多种方式, 一般用完全路径匹配
- 完全路径匹配:以/开头 /不能省略 eg:/demo01
- 目录匹配:以/开头 以结尾 eg:/user/
- 扩展名匹配:以*开头 *.do
- 特殊情况
- /*:表示接收所有请求处理
- /:表示接收除了jsp以外的所有请求处理
-
Servlet使用细节
-
一个路径不能映射多个Servlet,否则将导致项目无法启动
-
完全路径匹配一定要以/开头,否则将导致项目无法启动
-
配置Servlet请求路径时使用value="访问路径",如下写法将出现404
-
查看报错
web应用程序启动错误会出现在Server下面
web应用程序运行错误一般会出现在Tomcat Localhost Log 下面
-
一个Servlet可以配置多个请求访问路径,但一个路径不能配置多个Servlet
-
第五章-Servlet进阶【重点】
知识点-Servlet的生命周期【重点】
1.目标
- 掌握Servlet的生命周期
2.讲解
2.1生命周期概述
生命周期 = 人的一生
一个对象从创建到销毁的过程,类比人的一生,从出生到死亡。
2.2Servlet生命周期方法
servlet从创建到销毁的过程 (服务器使用反射)
创建:Servlet实例化 创建Servlet对象
初始:(初始化)用户第一次访问时执行。 Servlet实例化和初始化同时发生,都只发生一次,一般发生在第一次请求时,但当设置提前启动加载(load-on-startup),则会在服务器启动时就进行实例初始化,这样就可以在启动之后立即提供服务。
活着:(服务)应用活着。每次访问都会执行。
死亡:(销毁)应用卸载。服务器正常关闭时销毁
serrvlet生命周期方法:
init(ServletConfig config)
service(ServletRequest req, ServletResponse res)
destroy()
2.3Servlet生命周期描述
-
常规【重点】
init:默认情况下, 来了第一次请求, 会调用init()方法进行初始化 【调用一次】
service:每次请求 都会调用service()方法处理这个请求 【多次调用】
destroy:服务器正常关闭或者项目从服务器移除, 调用destory()方法进行销毁【调用一次】
-
扩展
servlet是单例多线程的, 尽量不要在servlet里面使用全局(成员)变量,可能会导致线程不安全,但是可以使用一些公共对象。
单例: 在程序运行期间,有且仅有一个对象。
多线程: 服务器会针对每次请求, 开启一个线程调用service()方法处理这个请求
package com.itheima.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* Servlet生命周期:Servlet对象从创建到销毁的过程
* 创建:当用户第一次发起请求时,服务器使用反射技术创建出Servlet对象 只创建一次
* 初始化:对象创建之后进行初始化 init() 在用户发起第一次请求时,执行初始化操作 【执行一次】
* 服务:进行请求处理 service() 在用户每次发起请求时,都会执行服务方法 【执行多次】
* 销毁:对象销毁 destroy() 在服务器正常关闭,或项目从服务器移除时销毁 【执行一次】
*/
@WebServlet(value="/demo03",loadOnStartup = 1)
public class ServletDemo03 implements Servlet {
public ServletDemo03() {
System.out.println("Servlet对象创建111");
}
//初始化
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Servlet对象初始化222");
}
//获取ServletConfig对象
@Override
public ServletConfig getServletConfig() {
return null;
}
//服务
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Servlet服务3");
}
//获取Servlet信息
@Override
public String getServletInfo() {
return null;
}
//销毁
@Override
public void destroy() {
System.out.println("Servlet对象销毁444");
}
}
2.4.ServletConfig【了解】
Servlet的配置对象, 可以使用ServletConfig来获得Servlet的初始化参数, 在SpringMVC里面会遇到
- 方式一:配置文件里面配置初始化参数
<servlet>
<servlet-name>ServletDemo04</servlet-name>
<servlet-class>com.itheima.web.ServletDemo04</servlet-class>
<!--配置Servlet的初始化参数 注意:Servlet的初始化参数只能在当前Servlet中获取-->
<init-param>
<param-name>akey</param-name>
<param-value>aaa</param-value>
</init-param>
<!--配置启动项 值越小 优先级越高 配置为1,到时候这个Servlet就会在服务器启动时进行创建并初始化-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo04</servlet-name>
<url-pattern>/demo04</url-pattern>
</servlet-mapping>
- 方式二:注解配置servlet初始化参数
@WebServlet(value="/demo05",initParams = {@WebInitParam(name="bkey",value="bbb")})
public class ServletDemo05 implements Servlet {
}
- 可以通过akey获得aaa
@Override
public void init(ServletConfig servletConfig) throws ServletException {
String value = servletConfig.getInitParameter("akey");
System.out.println(value);
}
2.5启动项
Servlet默认情况下什么时候创建? 默认情况下是第一次请求的时候.
如果我想让Servlet提前创建(服务器器的时候), 这个时候就可以使用启动项 在SpringMVC里面会遇到
3.小结
-
Servlet生命周期
- 创建:默认是在来了第一次请求时,由服务器创建Servlet对象。 【创建一次】
- 初始化:默认在来了第一次请求时,调用init方法初始化。 【执行一次】
- 服务:每次来了请求时,都会调用service方法处理请求。 【执行多次】
- 销毁:服务器正常关闭,或项目从服务器异常,执行destroy方法 【执行一次】
-
Servlet是单例多线程的,相当于每个用户发起请求,都会为它创建一个线程处理
-
ServletConfig
- 获取初始化参数:getInitParameter(String key);
- 获取ServletContext对象:getServletContext();
-
配置启动项:为了让Servlet对象提前创建并初始化
- loadOnStartup
知识点-Servlet体系结构
1.目标
- 掌握Servlet的继承关系,能够使用IDEA直接创建Servlet
2.讲解
-
Servlet接口
前面我们已经学会创建一个类实现sevlet接口的方式开发Servlet程序,实现Servlet接口的时候,我们必须实现接口的所有方法。但是,在servlet中,真正执行程序逻辑的是service,对于servlet的初始化和销毁,由服务器调用执行,开发者本身不需要关心。因此,有没有一种更加简洁的方式来开发servlet程序呢?
我们先来查阅API回顾Servlet接口:
由上图可知在servlet接口规范下,官方推荐使用继承的方式,继承GenericServlet 或者HttpServlet来实现接口,那么我们接下来再去查看一下这两个类的API:
- GenericServlet 类
阅读上图API可知,GenericServlet 是一个类,它简化了servlet的开发,已经提供好了一些servlet接口所需的方法,我们开发者只需要重写service方法即可
我们来使用GenericServlet 创建servlet:
- 创建一个类
- 继承GenericServlet
- 重写service方法
package com.itheima.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* GenericServlet是一个抽象类,实现了Servlet接口,对Servlet接口中一些方法提供了默认实现
* 这样,我们在创建Servlet类时,去继承GenericServlet就只需要重写Service方法 简化开发
*/
@WebServlet("/demo06")
public class ServletDemo06 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("ServletDemo06...");
}
}
虽然,GenericServlet已经简化了servlet开发,但是我们平时开发程序需要按照一种互联网传输数据的协议来开发程序——http协议,因此,sun公司又专门提供了HttpServlet,来适配这种协议下的开发。
- HttpServlet
阅读上图的API可知,继承HttpServlet,我们需要重写doGet、doPost等方法中一个即可,根据Http不同的请求,我们需要实现相应的方法。
我们来使用HttpServlet创建servlet:
- 创建一个类
- 继承HttpServlet
- 重写doGet、doPost方法
package com.itheima.web;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* HttpServlet:是一个抽象类 继承了GenericServlet,主要就添加了和Http协议相关的开发内容
* 由于目前web通信都基于Http 所以今后创建Servlet类 都会继承HttpServlet
*/
@WebServlet("/demo07")
public class ServletDemo07 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//只处理get方式请求
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//只处理post方式请求
System.out.println("ServletDemo07...");
}
}
通过以上两个API阅读,同学们注意一个细节HttpServlet是GenericServlet的子类,它增强了GenericServlet一些功能,因此,在后期使用的时候,我们都是选择继承HttpServlet来开发servlet程序。
Servlet注解方式创建代码模板
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
@javax.servlet.annotation.WebServlet("/${Entity_Name}")
public class ${Class_Name} extends javax.servlet.http.HttpServlet {
@Override
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
}
@Override
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
doPost(request,response);
}
}
3.小结
- 继承关系
Servlet是接口 GenericServlet是Servlet接口的实现类,主要帮助我们对一些不常用的方法进行了实现,使开发人员只需要关注请求的处理响应即可,也就是只关注service就可以了。HttpServlet又对GenericServlet进行增强,可以用于处理基于Http的请求响应。
- 我们可以直接创建一个类继承HttpServlet, 直接在IDEA里面new Servlet
4.扩展(Servlet体系源码)
- 实际使用 推荐 继承HttpServlet创建Servlet类
第六章-ServletContext
知识点-ServletContext概述
1.目标
- 知道什么是ServletContext, 以及作用
2.讲解
2.1servletContext概述
ServletContext: 是一个全局对象, 上下文对象. Application:整个应用
服务器为每一个应用(项目)都创建了一个ServletContext对象。 ServletContext属于整个应用的,不局限于某个Servlet。
eg:把我们班级比作一个项目,每个同学都是这个项目中一个Servlet,班主任就相当于这个ServletContext对象
2.2ServletContext作用
1. 作为域对象存取数据,让Servlet之间实现数据共享 范围:整个应用
2. 获得文件MIME类型(文件下载)
3. 获得全局初始化参数 (ServletConfig获取的servlet局部初始化参数 只能获取当前servlet的)
4. 获取web资源路径 (当web目录下有资源文件 获取它的真实路径)
5. 获取web下的资源输入流
3.小结
- ServletContext是一个全局对象, 服务器会给每一个项目(工程)都创建一个ServletContext对象, 属于整个项目的, 不局限于某个Servlet ServletContext我们就可以将它理解为整个应用application
- 作用
- 作为域对象存取数据,让Servlet共享
- 获得文件mini类型(文件上传和下载)
- 获得全局初始化参数
- 获取web资源路径
知识点-ServletContext的功能
1.目标
- 掌握ServletContext的作用
2.路径
- 作为域对象存取数据
- 获得文件mini类型(文件下载)
- 获得全局初始化参数
- 获取web资源路径
3.讲解
3.1作为域对象存取值【重点】
-
域对象:对象有个范围可以存储数据
-
ServletContext域对象范围:整个应用
-
API
- getAttribute(String name) ;向ServletContext对象的map取数据
- setAttribute(String name, Object object) ;从ServletContext对象的map中添加数据
- removeAttribute(String name) ;根据name去移除数据
-
代码
-
ServletDemo06
/** * GenericServlet是一个抽象类,实现了Servlet接口,对Servlet接口中一些方法提供了默认实现 * 这样,我们在创建Servlet类时,去继承GenericServlet就只需要重写Service方法 简化开发 */ @WebServlet("/demo06") public class ServletDemo06 extends GenericServlet { @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { //使用ServletContext对象存储数据 可以在整个应用中进行共享【在每个Servlet中都能获取到】 ServletContext servletContext = this.getServletContext(); servletContext.setAttribute("name","shuaige"); System.out.println("ServletDemo06..."); } }
-
ServletDemo07
@WebServlet("/demo08") public class ServletDemo08 extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取ServletContext中共享的数据 Object name = this.getServletContext().getAttribute("name"); System.out.println("ServletDemo08-name = " + name); //移除ServletContext中共享的数据 this.getServletContext().removeAttribute("name"); System.out.println("ServletDemo08..."); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
-
3.2获得文件mime类型
- API
- getMimeType(String file)
- 代码
package com.itheima.web;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* HttpServlet:是一个抽象类 继承了GenericServlet,主要就添加了和Http协议相关的开发内容
* 由于目前web通信都基于Http 所以今后创建Servlet类 都会继承HttpServlet
*/
@WebServlet("/demo07")
public class ServletDemo07 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//只处理get方式请求
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取文件的MIME类型
String file1 = "a.mp3";
String file2 = "b.mp4";
String mimeType1 = servletContext.getMimeType(file1);
String mimeType2 = servletContext.getMimeType(file2);
System.out.println("mimeType1 = " + mimeType1);
System.out.println("mimeType2 = " + mimeType2);
System.out.println("ServletDemo07...");
}
}
3.3.获得全局初始化参数
- String getInitParameter(String name) ; //根据配置文件中的key得到value;
在web.xml配置
通过ServletContext来获得
3.4获取web资源路径
- API
- String getRealPath(String path);根据资源名称得到资源的绝对路径.
- getResourceAsStream(String path) ;返回指定路径文件的流
注意: filepath:直接从项目的根目录开始写
- 代码
package com.itheima.web;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* HttpServlet:是一个抽象类 继承了GenericServlet,主要就添加了和Http协议相关的开发内容
* 由于目前web通信都基于Http 所以今后创建Servlet类 都会继承HttpServlet
*/
@WebServlet("/demo07")
public class ServletDemo07 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//只处理get方式请求
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//3.获取web目录下资源的真实路径
String realPath = servletContext.getRealPath("a.txt");
System.out.println("realPath = " + realPath);
//4.获取web目录下的资源文件输入流 【重要,加载读取文件】 注意:使用ServletContext对象获取输入流的资源文件一定要在web目录下
InputStream is = servletContext.getResourceAsStream("a.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
String line = null;
while((line=br.readLine())!=null){
System.out.println(line);
}
br.close();
System.out.println("ServletDemo07...");
}
}
4.小结
-
作为域对象存取数据【项目中数据共享】【重点】
-
用ServletContext作为域对象存取数据 【作用范围:整个应用共享】 1.存数据 :getServletContext().setAttribute("name","帅哥"); 2.取数据:getServletContext().getAttribute("name"); 3.删数据:getServletContext().removeAttribute("name");
-
-
获得全局初始化参数
-
使用ServletContext配置全局初始化参数 在每个Servlet中都可以获取到! 1.在web.xml中配置 <context-param> <param-name>ckey</param-name> <param-value>ccc</param-value> </context-param> 2.使用ServletContext对象的getInitParameter()方法获取 getServletContext().getInitParameter("ckey");
- Servlet功能方法使用【了解】
-
-
//1.获取当前应用的访问虚拟路径
String contextPath = getServletContext().getContextPath();
System.out.println("contextPath = " + contextPath); // 虚拟目录:/day22
//2.获取一个文件的绝对路径
String realPath = getServletContext().getRealPath("a.gif");
System.out.println("realPath = " + realPath);
//3.根据文件名获取文件的MIME类型
String mimeType = getServletContext().getMimeType("a.txt");
System.out.println("mimeType = " + mimeType);
//4.根据web目录下的文件获取其文件流
InputStream is = getServletContext().getResourceAsStream("a.txt");
int i = 0;
byte[] b = new byte[1024];
while((i=is.read(b))!=-1){
System.out.println(new String(b));
}
is.close(); -
案例-统计网站被访问的总次数
1.需求
- 在页面中显示您是第x位访问的用户.
2.思路分析
-
创建web项目,创建两个Servlet CountServlet和ShowServlet 使用ServletContext存储网站访问的次数
-
编写CountServlet
//计数 记录网站访问人数 //1.获取当前访问次数 +1
-
编写ShowServlet
//显示 显示你是当前第几位访问用户 //1.获取当前访问次数 然后显示
3.代码实现
- CountServlet
package com.itheima.web;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 记录用户访问次数
* 用户访问次数存在ServletContext对象中 实现数据共享
*/
@WebServlet("/count")
public class CountServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
//设置第一次访问之前 访问次数为0
config.getServletContext().setAttribute("count",0);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取之前的访问次数
ServletContext servletContext = this.getServletContext();
Integer count = (Integer) servletContext.getAttribute("count");
//2.将访问次数+1
count++;
//3.将新的访问次数重新存入到ServletContext对象中
servletContext.setAttribute("count",count);
response.getWriter().print("Welcome...");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
- ShowServlet
package com.itheima.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
*显示用户访问次数
*/
@WebServlet("/show")
public class ShowServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取访问次数
Object count = this.getServletContext().getAttribute("count");
//2.显示 你是第几个访问的用户
// 解决响应中文乱码问题
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print("你是第"+count+"个访问的用户");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
4.小结
- 注意事项:
- 存和取的时候 这个key要一致