今日目标
- web知识概述
- tomcat【重点】
- 创建servlet
xml
anno(注解) - servlet执行原理
- servlet生命周期
- servlet体系结构
1.web相关知识概述【了解】
1.WEB简介
学习目标
- 了解什么是web
内容讲解
Web(World Wide Web)即全球广域网,也称为万维网。它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构。
简而言之就是我们平时上网浏览的网页,玩的网页游戏,上网下载资源。对于程序员而言就是前端知识、web服务器知识和数据库知识的结合就是web.
web发展阶段介绍:
【1】web1.0
1994年在中国第一个web网站是中国黄页,由马云。属于静态网页。只能看,不能交互。发布租赁信息
【2】web2.0
动态网站。网站数据是时时更新的。数据来自于数据库的。登录网站显示用户名,天气预报,微博头条。
可以实现前后台数据的交互。
注意:
网站:前端知识、web服务器知识和数据库知识
网页:前端页面html页面
2.软件架构模式(掌握)
学习目标
- 说出软件架构模式分类
内容讲解
有两种:
1.BS:browser server 浏览器服务器。
优点:
1)只需要服务器,用户下载浏览器,维护方便
2)减少用户的磁盘空间
缺点:
1)给服务器造成压力
2)用户观看体验不友好
例如: 天猫、京东、知乎网站
2.CS:client server 客户端 服务器
优点:
1)具有客户端和服务器端,减轻服务器的压力
2)用户观看体验友好
缺点:
1)维护成本大
2)版本升级麻烦,占用户磁盘空间
例如: QQ,绝地求生,LOL
内容小结
1.软件架构模式有两种
BS:browser server 浏览器服务器
CS:client server 客户端 服务器
3.B/S和C/S通信模式特点(很重要)
学习目标
- 掌握B/S和C/S通信模式特点
内容讲解
内容小结
B/S和C/S通信模式特点
1.先有请求
2.后有响应
3.请求和响应是成对出现的
4.WEB资源(理解)
学习目标
- 理解web资源的分类和特点
内容讲解
【1】资源:计算机中数据文件
【2】分类:
分为两种:
1.静态资源:html css js。只能书写静态网站。静态网站的数据永远不会发生改变。
2.动态资源:使用一些语言可以实现数据的变化,例如java语言。JAVAEE
5.URL请求路径(理解)
学习目标
- 说出URL请求路径作用和组成
- 能够说出通过url请求路径如何找到目标服务器
内容讲解
【1】作用:通过资源路径可以访问到具体的服务器。
【2】介绍:
URL (Uniform Resource Locator) ,统一资源定位符是对互联网上资源位置的一种表示,互联网上的每个文件都有一个唯一的URL。
【3】格式:
协议://服务器的ip地址:服务器的端口号/项目名/资源路径
说明:
1)协议:是一种规范。类似于我们之前讲解的TCP UDP(传输层),这里讲解的是应用层(http https协议)
2)服务器的ip地址:就是访问的服务器的地址。同一个网段中服务器ip地址是唯一的。
3)服务器的端口号:访问服务器端的进程号,属于唯一标识。
4)/项目名/资源路径
【4】浏览器通过url访问服务器的过程
https://www.baidu.com/s?ie=UTF-8&wd=java
内容小结
1.URL请求路径作用
通过资源路径可以访问到具体的服务器
2.URL请求路径的组成
协议://服务器的ip地址:服务器的端口号/项目名/资源路径
2.服务器(掌握)
1.服务器介绍 了解
学习目标
- 了解什么是服务器
- 说出服务器分类和常见的服务器
内容讲解
【1】服务器
服务器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。
【2】服务器分类
分为两类:
1.硬件服务器:服务器的构成包括处理器、硬盘、内存、系统总线等,和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。
2.软件服务器: 服务器软件本质上是一个应用程序(由代码编写而成),运行在服务器设备上。能够接收请求并根据请求给客户端响应数据,发布资源(静态和动态)。数据库服务器、邮件服务器(易邮)、网页服务器(tomcat nginx发布网页)等
【3】常见的Web服务器
* Tomcat: Apache软件基金开源免费的web服务器,支持JavaEE规范(Servlet/Jsp).
* Jetty:Apache组织开源免费的小型web服务器,支持JavaEE规范.
* JBoss: RedHat红帽公司的开源免费的web服务器,支持JavaEE规范.
* Glass Fish:Sun公司开源免费的web服务器,支持JavaEE规范.
---------------------------------------------------------------------
* WebLogic: Oracle公司收费的web服务器,支持JavaEE规范.
* WebSphere:IBM公司收费的web服务器,支持JavaEE规范.
内容小结
1.什么是服务器
服务器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。
2.服务器分类:硬件 软件
2.下载安装tomcat服务器 掌握
学习目标
- 能够下载和安装tomcat服务器
- 理解tomcat安装目录
内容讲解
【1】下载tomcat
tomcat服务器属于网页服务器,用来发布动态和静态网页的,由Apache公司开发的开源免费的。
官网:
https://tomcat.apache.org
【2】安装
将下载的tomcat放到没有中文和特殊符号的目录,然后进行解压即可。
【3】目录结构介绍
内容小结
1.安装:将下载的tomcat服务解压到没有中文和特殊符号的路径
2.目录结构:
bin:脚本目录 *****
启动脚本(启动服务器):startup.bat
停止脚本(停止服务器):shutdown.bat
conf:配置文件目录 (config /configuration) *****
核心配置文件:server.xml
用户权限配置文件:tomcat-users.xml
所有web项目默认配置文件:web.xml
lib:依赖库,tomcat和web项目中需要使用的jar包 *****
logs:日志文件.
localhost_access_log.txt tomcat记录用户访问信息,..表示时间。
例如:localhost_access_log.2017-04-28.txt
temp:临时文件目录,文件夹内内容可以任意删除。
webapps:默认情况下发布WEB项目所存放的目录。 *****
work:tomcat处理JSP的工作目录。
3.启动并使用浏览器访问tomcat服务器掌握
学习目标
- 能够启动访问tomcat
- 能够独立解决启动tomcat失败常见的问题
内容讲解
【1】tomcat启动和访问
-
启动
直接点击bin目录下面的startup.bat文件
-
访问
在浏览器地址栏上输入访问地址:
http://localhost:8080
说明:出现tomcat猫,说明访问成功。
-
停止tomcat
1)双击bin目录下的shutdown.bat
2)直接关闭dos窗口
3)在dos窗口上按快捷键:ctrl+c
【2】 tomcat启动失败常见原因
1.端口号冲突
1)查看端口号
2)打开任务管理器找到PID是5220的进程直接关闭该进程
2.没有配置环境变量JAVA_HOME
3.就是之前有的同学电脑上安装过tomcat,并且在环境变量path中配置了环境变量,导致启动不成功。需要将之前配置的删除即可
内容小结
1.启动tomcat
双击startup.bat
2.关闭tomcat
双击shutdown.bat
3.解决启动tomcat失败常见问题
1)端口号冲突,使用netstat -nao在命令行查看端口号冲突的软件进行关闭
2)配置环境变量path
4.使用tomcat服务器发布web项目 掌握
1.在tomcat的安装目录webapps下发布web项目
学习目标
- 掌握在在tomcat的安装目录webapps下发布web项目
内容讲解
1)在webapps文件夹下创建heima文件夹
2)并创建index.html页面
3)使用记事本打开html页面输入如下内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
哈哈哈
</body>
</html>
4)启动tomcat
5) 访问:必须加项目名heima
内容小结
1.在浏览器url地址栏访问页面注意:
浏览器访问页面的时候必须加上文件夹名即heima
2.使用开发工具idea创建web项目 课下多创建几次 掌握
学习目标
- 掌握如何在idea中创建web项目
内容讲解
-
idea创建maven的web项目_骨架(了解)
注意:需要连网
【1】
【2】
【3】
【4】
【5】删除pom.xml中多余的内容,留下如下内容
【6】补齐缺失的目录结构
【7】创建好之后
- idea创建maven的web项目_不使用骨架(建议使用)
【1】
【2】删除pom.xml中多余的内容,留下如下内容
3.使用开发工具idea发布web项目
- 使用maven骨架创建的项目
【1】
【2】
【3】
【4】
【5】
- 不使用骨架
说明:在创建工程的时候已经指定了tomcat服务器,不用再指定
- 启动tomcat并在浏览器访问
4.使用开发工具idea发布web项目的注意事项
学习目标
- 掌握使用开发工具idea发布web项目的注意事项
内容讲解
注意啦:WEB-INF下面的内容我们无法通过浏览器访问。
【1】web项目的目录结构说明
注意:静态页面(html,css js)不能放到WEB-INF下面,浏览器无法访问
【2】将虚拟路径的项目删除,只保留/
【3】再次点击启动按钮弹出框
【4】去掉自动打开浏览器功能(了解)
【5】浏览器输入url地址访问tomcat服务器的疑惑
【6】idea中启动tomcat服务器会自动访问web目录下面的三个页面:index.html index.htm index.jsp
如果没有这三个资源就会报404
注意:自动访问上述三个资源的原因是:
在tomcat的配置文件web.xml中存在如下友好访问页面的配置:
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
【7】pom.xml 添加 Tomcat插件(了解)
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
3.Servlet概述(掌握)
学习目标
- 掌握什么是Servlet以及作用
内容讲解
【1】Servlet介绍
1.Servlet是一个接口,即规范
2.定义的实现类必须实现接口中的所有的抽象方法
3.Servlet全称Server Applet 服务器端的程序。是sun公司提供一套规范,用来处理客户端请求、响应给浏览器的动态web资源。其实servlet的实质就是java代码,通过java的API动态的向客户端输出内容,并且从客户端接收数据。
4.一个类要想通过浏览器被访问到,那么这个类就必须直接或间接的实现Servlet接口
【2】Servlet作用
1)接收客户端的请求
2)处理业务逻辑
3)响应给浏览器客户端
内容小结
1.什么是Servlet?
Servlet全称Server Applet 服务器端的程序。是sun公司提供一套规范,用来处理客户端请求、响应给浏览器的动态web资源。其实servlet的实质就是java代码,通过java的API动态的向客户端输出内容,并且从客户端接收数据
2.Servlet的作用?
1)接收客户端的请求
2)处理业务逻辑
3)响应给浏览器客户端
4.Servlet快速入门(重点)
学习目标
- 在浏览器地址栏上直接访问java类
内容讲解
【1】步骤
1.创建web项目
2.导入servlet依赖
<!--导入依赖-->
<dependencies>
<!--导入servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
3.在创建的web项目中自定义类实现Servlet接口
4.在自定义类中实现Servlet接口中的所有的抽象方法
5.在实现Servlet接口的service方法体中书写代码处理业务逻辑
void service(ServletRequest req, ServletResponse res)
6.在web项目的核心配置文件web.xml中配置访问servlet的路径。
说明:这样配置是告知tomcat有具体的Servlet类需要被访问。
7.启动tomcat
8.在浏览器中访问servlet类
【2】实现
1.创建maven的web项目
2.导入servlet的依赖
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<!--编译 测试需要,运行时不需要-->
<scope>provided</scope>
</dependency>
2.在创建的web项目中自定义类实现Servlet接口
3.在自定义类中实现Servlet接口中的所有的抽象方法
4.在实现Servlet接口的service方法体中书写代码处理业务逻辑
package com.lystar.sh.a_demo_01;
import javax.servlet.*;
import java.io.IOException;
/*
2.在创建的web项目中自定义类实现Servlet接口
*/
public class HelloWorldServlet implements Servlet{
//3.在自定义类中实现Servlet接口中的所有的抽象方法
//4.在实现Servlet接口的service方法体中书写代码处理业务逻辑
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service....");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
5.在web项目的核心配置文件web.xml中配置访问servlet的路径。
<?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_3_1.xsd"
version="3.1">
<!--
5.在web项目的核心配置文件web.xml中配置访问servlet的路径。
说明:这样配置是告知tomcat有具体的Servlet类需要被访问。
-->
<!--
1.<servlet> 表示将当前Servlet类注册到tomcat中,告知tomcat有一个类要被访问
-->
<servlet>
<!--
表示当前要被访问类的标识,在当前web.xml中要唯一,helloWorldServlet属于标识符
-->
<servlet-name>helloWorldServlet</servlet-name>
<!--
配置要访问 的servlet类,必须是类的全路径:包名.类名。
说明:tomcat底层通过获取这里的类全路径使用反射技术调用当前类的无参构造方法创建对象
-->
<servlet-class>com.lystar.sh.a_demo_01.HelloWorldServlet</servlet-class>
</servlet>
<!--
配置要访问的servlet类的映射路径
-->
<servlet-mapping>
<!--这里要和上面的servlet-name文本值一致,这里找到上面的servlet-name-->
<servlet-name>helloWorldServlet</servlet-name>
<!--浏览器上地址栏上输入的映射路径及访问路径,这里必须加/-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
6.启动tomcat
7.在浏览器中访问servlet类
内容小结
1.使用浏览器访问java的类需要使用该类实现Servlet接口
5.Servlet的执行原理(掌握)
学习目标
- 明确访问servlet的执行流程
- 掌握servlet的原理
内容讲解
【1】执行流程:
【2】原理
说明:
1.当我们点击run运行的时候,tomcat之所以会启动,是因为程序入口(main方法)在tomcat中
2.tomcat开始运行,会加载web项目里面的配置文件web.xml(xml解析,读取数据)
主要是根据url-pattern 找到对应的servlet-class
3.然后tomcat进入等待状态(永不停止,除非手动关闭)
4.当用户在浏览器中输入地址:http://localhost:8080/hello就会定位到tomcat的访问的项目下面的某个servlet中
5.tomcat会根据 /hello 的servlet的虚拟路径 找到HelloServlet的全限定名
6.tomcat底层通过反射创建HelloServlet的对象,并调用HelloServlet的service方法:
Class clazz = Class.forName("全限定名");
Servlet servlet = clazz.newInstance();//实际上HelloServlet对象,向上转型
servlet.service();
内容小结
1.servlet的原理
tomcat根据servlet的虚拟路径找到对应的Servlet类,然后使用反射技术创建Servlet类的对象,最后使用对象调用service方法处理业务逻辑。
6.Servlet生命周期(掌握)
内容讲解
【1】生命周期:
指的是一个对象从生(创建)到死(销毁)的一个过程
【2】生命周期的api:
// 1. servlet对象创建完毕,使用对象调用此方法,初始化方法,只有在第一次访问的时候执行一次
public void init(ServletConfig servletConfig);
// 2. 用户访问servlet时,调用此方法 (每次访问都会调用一次)
public void service(ServletRequest servletRequest, ServletResponse servletResponse);
// 3. servlet对象销毁时,调用此方法
public void destroy();
【3】Servlet生命周期的api执行时机图解
1.当一个Servlet第一次被请求的时候,Servlet容器就会实例化该Servlet,一旦实例化好这个实例,该实例便会一直留在内存中,以便后续请求!
2.当一个Servlet实例刚被创建好之后,Servlet容器就调用init方法,该方法在整个生命周期只执行一次
3.当Servlet每次被请求的时候,Servlet容器都会去调用service方法
4.当web应用被取消部署的时候,Servlet容器就会调用Servlet的destroy方法
5.当Servlet的配置汇总加上了<load-on-startup>1</load-on-startup>的时候,那么Servlet就会在容器等到第一次被请求的时候才实例化
【4】代码实现
package com.lystar.sh.a_servlet_01;
import javax.servlet.*;
import java.io.IOException;
public class Life01Servlet implements Servlet {
/*
反射调用无参构造方法创建对象
*/
public Life01Servlet() {
System.out.println("无参构造。。。。");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init。。。。");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service。。。。");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("destroy。。。。");
}
}
【5】结果:
内容小结
1.何时创建servlet?
第一次访问servlet的时候创建
2.谁创建的?
tomcat服务器创建的
3.创建对象时做了什么?
调用无参构造方法创建对象,然后立刻调用init初始化方法
4.每次访问servlet执行哪个方法
service方法
5.何时销毁servlet?
关闭tomcat服务器,调用destroy方法
7.服务器启动,立刻加载Servlet对象 (理解)
学习目标
- 能够在web.xml中进行配置让服务器启动,立刻创建Servlet对象
内容讲解
【1】问题: 发现 init 默认第一次被访问的时候才调用,适合用来初始化项目数据
如果项目数据很多, 加载就需要一定的时间,这样就会给用户的体验不好,因为要等比较久的时间
【2】 解决: 服务器一启动,就执行init方法
【3】实现:在web.xml核心配置文件中对应的servlet标签中按照如下配置:
注意:
1.使用标签进行配置,表示标记容器是否应该在启动的时候加载这个servlet,(实例化并调用其init()方法)
2.它的文本值必须是一个整数,表示servlet应该被载入的顺序
3.如果文本值是负数:默认值是-1 【用户第一次访问时,创建】
4.当值大于等于0时,表示容器在应用启动时就加载并初始化这个servlet;
5.正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
6.当值相同时,容器就会自己选择顺序来加载
<servlet>
<servlet-name>life01Servlet</servlet-name>
<servlet-class>com.lystar.sh.a_servlet_01.Life01Servlet</servlet-class>
<!--
load-on-startup 标签可以让tomcat服务器启动就创建对应的servlet。标签文本值必须是整数:
数字越小,创建servlet的优先级越高
-->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>life01Servlet</servlet-name>
<url-pattern>/life01</url-pattern>
</servlet-mapping>
内容小结
-
load-on-startup 标签可以让tomcat服务器启动就创建对应的servlet。标签文本值必须是整数:
数字越小,创建servlet的优先级越高,建议是大于等于0的整数<load-on-startup>2</load-on-startup>
2.配置load-on-startup标签后servlet生命周期如下:
8.Servlet实现方式(重点)
一共有三种:
快捷键:
1. ctrl + alt + u : 查看一个类的继承结构图
2. ctrl + h : 这个类的简化版继承结构
1.实现Servlet方式二_自定义类继承GenericServlet
学习目标
- 编写Servlet实现类,只要重写service方法
内容讲解
【1】描述问题:
Servlet中使用频率最高,最重要的方法是service方法(大部分场景)
但是我们每次编写Servlet实现类,都是直接实现Servlet接口,重写5个抽象方法(太冗余了)
【2】解决问题:
我们可以自定义类继承GenericServlet抽象类,只在子类中重写service即可。不用重写所有的抽象方法。
【3】步骤:
1.自定义类继承GenericServlet类
2.在子类中重写service方法,处理业务逻辑
3.在web.xml中进行映射路径的配置
4.在浏览器客户端访问servlet类
【4】代码实现:
package com.lystar.sh.a_servlet_01;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
/*
1.自定义类继承GenericServlet类
*/
public class Demo01Servlet extends GenericServlet {
// 2.在子类中重写service方法,处理业务逻辑
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service....");
}
}
<?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_3_1.xsd"
version="3.1">
<!--3.在web.xml中进行映射路径的配置-->
<servlet>
<servlet-name>demo01Servlet</servlet-name>
<servlet-class>com.lystar.sh.a_servlet_01.Demo01Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo01Servlet</servlet-name>
<url-pattern>/demo01</url-pattern>
</servlet-mapping>
</web-app>
内容小结
1.方式二的好处是只需要重写service方法,在方法体内部处理业务逻辑即可。
2.实现Servlet方式三_自定义类继承HttpServlet(掌握)
学习目标
- 根据页面不同的请求方式执行具体的请求方法
内容讲解
【1】问题:
我们在前端的form表单中,method属性, 学习过有两种常用的请求方式(get/post)
我们现在的service方法是这样的: 用户发送请求,无论是什么请求方式,都会统一的执行service方法, 我们无法很好的区别是哪一种请 求方式
【2】解决问题:我们可以自定义类继承HttpServlet就可以根据不同的请求做不同的处理:get post
【3】步骤:
1.自定义类继承HttpServlet
2.在子类中根据不同的请求方式重写请求方式的方法:
get请求---重写doGet方法
post请求---重写doPost方法
3.在方法体中书写处理业务逻辑的代码
4.在web.xml中进行配置
5.浏览器客户端访问servlet
【4】实现
package com.lystar.sh.a_servlet_01;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
1.自定义类继承HttpServlet
*/
public class Demo02Servlet extends HttpServlet {
/*
2.在子类中根据不同的请求方式重写请求方式的方法:
get请求---重写doGet方法
post请求---重写doPost方法
*/
// 3.在方法体中书写处理业务逻辑的代码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get....");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post....");
}
}
<!--4.在web.xml中进行配置-->
<servlet>
<servlet-name>demo02Servlet</servlet-name>
<servlet-class>com.lystar.sh.a_servlet_01.Demo02Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo02Servlet</servlet-name>
<url-pattern>/demo02</url-pattern>
</servlet-mapping>
内容小结
1.实现servlet方式三的好处:
1)可以根据不同的请求执行对应的方法
2)可以处理满足http协议的请求和响应
2.对ServletRequest和HttpServletRequest接口的说明:
这个对象封装了浏览器发送的所有请求数据,兼容大部分协议。HttpServletRequest是子接口,可以匹配http协议下的所有请求。
3.实现servlet方式三_继承HttpServlet的执行流程
学习目标
- 能够说出继承HttpServlet方式的执行流程
内容讲解
疑问:就是正常浏览器访问tomcat服务器需要访问servlet接口中的service方法,但是方式三在子类中没有重写servlet中的service方法,只重写了doGet和doPost方法,那么底层是如何执行的呢?
内容小结
当我们访问自定义类的servlet的时候先访问HttpServlet类实现Servlet接口中的service方法,在service方法体中调用了重载的service方法,在该方法体内部获取请求方式,根据不同的请求方式来执行对应的方法。
get请求----doGet()方法
post请求---doPost()方法
注意:查看某个类的成员结构快捷键:alt+7
4.实现servlet的三种方式的总结
1.自定义类实现Servlet接口,重写所有的抽象方法,不能处理满足http协议的请求和响应
2.自定义类继承GenericServlet抽象类,该抽象类是Servlet接口的子类,这种方式只重写service方法即可,但是不能处理满足http协议的请求和响应,同时不能根据具体的请求方式执行具体的方法
3.自定义类继承HttpServlet抽象类,该抽象类是GenericServlet的子类,根据不同的请求方式执行对应方法:掌握
get----doGet
post---doPost
可以处理满足http协议的请求和响应
9.编写servlet常见问题
学习目标
- 能够解决在编写servlet时常见的几个问题
内容讲解
1.遇到500错误
表示服务器内部异常。
2.遇到404错误
浏览器客户端访问服务器的资源不存在。
3.遇到405错误
服务器servlet没有重写doGet或者doPost方法。
内容小结
1.500错误
服务器异常
2.404错误
找不到资源
3.405错误
如果我们不重写doGet/doPost方法, 那么父类的doGet/doPost方法会执行(继承),给浏览器响应一个错误: 状态码405 (http1.1)。
10.Servlet映射路径 理解
学习目标
- 能够配置一个Servlet映射单个和多个url
内容讲解
【1】一个Servlet映射单个url
【2】一个Servlet映射多个url
注解版本:
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnim
11. Servlet映射路径配置规范(理解)
学习目标
- 能够使用Servlet映射路径配置规范
内容讲解
servlet映射路径一共有四种:
1.完全路径匹配:就是访问什么在web.xml中配置什么路径。/hello /user 掌握
package com.lystar.sh.a_servlet_01;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class PathOneServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("PathOneServlet....");
}
}
<servlet>
<servlet-name>pathOneServlet</servlet-name>
<servlet-class>com.lystar.sh.a_servlet_01.PathOneServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>pathOneServlet</servlet-name>
<!--完全路径匹配-->
<url-pattern>/user/one</url-pattern>
</servlet-mapping>
2.目录匹配:/user/* 只要访问以/user开始的的路径都可以访问
package com.lystar.sh.a_servlet_01;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class PathTwoServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("PathTwoServlet....");
}
}
<servlet>
<servlet-name>pathTwoServlet</servlet-name>
<servlet-class>com.lystar.sh.a_servlet_01.PathTwoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>pathTwoServlet</servlet-name>
<!--目录匹配-->
<url-pattern>/user/*</url-pattern>
</servlet-mapping>
3.后缀名匹配:*.do *.action 注意这里不能书写/ 访问以.do或者.action结尾的资源路径,后缀名都属于标识 符
package com.lystar.sh.a_servlet_01;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class PathThrServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("PathThrServlet....");
}
}
<servlet>
<servlet-name>pathThrServlet</servlet-name>
<servlet-class>com.lystar.sh.a_servlet_01.PathThrServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>pathThrServlet</servlet-name>
<!--后缀名匹配,前面不能加/-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
4.缺省路径:/ 如果上述三种路径都不满足就访问缺省路径。
package com.lystar.sh.a_servlet_01;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class PathFourServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("PathFourServlet....");
}
}
<servlet>
<servlet-name>pathFourServlet</servlet-name>
<servlet-class>com.lystar.sh.a_servlet_01.PathFourServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>pathFourServlet</servlet-name>
<!--缺省路径匹配-->
<url-pattern>/</url-pattern>
</servlet-mapping>
内容小结
上述访问路径的优先级: 完全路径匹配 > 目录匹配 > 后缀名匹配 > 缺省路径
12.绝对路径(掌握)
学习目标
- 能够在代码中使用绝对路径
内容讲解
【1】绝对路径有两种写法:
1.带网络三要素:
http://ip地址:端口号/资源路径
2.不带网络三要素:
/资源路径 这里的/不能省略 ,要求访问的资源必须在同一个服务器上
【2】代码实现
html:
<a href="http://127.0.0.1:8080/pathAbso">带网络三要素的绝对路径</a><br>
<a href="/pathAbso">不带网络三要素的绝对路径</a><br>
Servlet:
package com.lystar.sh.b_servlet_02;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class PathAbso01Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get....");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post....");
}
}
web.xml
<servlet>
<servlet-name>pathAbso01Servlet</servlet-name>
<servlet-class>com.lystar.sh.a_servlet_01.PathAbso01Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>pathAbso01Servlet</servlet-name>
<url-pattern>/pathAbso</url-pattern>
</servlet-mapping>
内容小结
绝对路径的写法:
1.带网络三要素:
http://ip地址:端口号/资源路径
2.不带网络三要素:
/资源路径 这里的/不能省略 ,要求访问的资源必须在同一个服务器上
13.相对路径(理解)
学习目标
- 能够理解什么是相对路径
内容讲解
【1】 相对路径:不是相对当前项目,而是针对当前浏览器地址栏上的url而言的。
【2】案例一:
#假设我们在浏览器地址栏访问的页面路径: http://localhost:8080/demo01.html
#而在demo01.html页面想使用相对路径访问servlet: http://localhost:8080/pathAbso
说明:
如果在http://localhost:8080/demo01.html 页面中访问 http://localhost:8080/pathAbso 该servlet,我们通过url 观察发现只有最后一级目录不一样,所以在demo01.html页面中相对的路径的写法是:./pathAbso 这里的./表示当前路径 可以省 略不写即直接写 pathAbso
demo01.html
<a href="./pathAbso">相对路径</a><br>
<a href="pathAbso">相对路径</a><br>
【3】案例二:
# 如果在http://localhost:8080/aaa/demo02.html 页面中访问 http://localhost:8080/pathAbso 该servlet
我们通过url观察发现在demo02.html也面中书写访问的servlet即pathAbso和当前页面的父目录aaa是同等目录,所以我这里先找该页面 的父目录,然后在找该servlet即pathAbso
../pathAbso ../表示上一级目录或者父目录,找到父目录之后再找servlet即pathAbso
demo02.html
<a href="../pathAbso">相对路径</a><br>
内容小结
1.相对路径是不是相对当前项目,而是相对于当前浏览器地址栏上的url而言的
2.在相对路径写法中:
./表示当前路径 可以省略不写
…/表示上一级目录或者父目录
14.Servlet3.0注解开发 (掌握)
学习目标
- 掌握在idea中使用注解开发servlet
内容讲解
【1】问题
说明:之前我们都是使用web.xml进行servlet映射路径的配置。这样配置的弊端:web.xml中具有非常多个配置信息,显得非常臃肿并且容易出错。
【2】解决问题
使用web.xml配置映射路径的方式属于servlet2.5的技术。从servlet3.0开始引入注解配置访问servlet取代了web.xml配置。
【3】配置步骤:
1.在包上右键---new---servlet(create new Servlet)
2.输入类名
3.在方法体内输入逻辑代码
4.在浏览器地址栏中输入访问的路径
【4】实现
1.在包上右键—new—servlet(create new Servlet)
2.输入类名
3.在方法体内输入逻辑代码
package com.lystar.sh.c_servlet_anno_03;
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("/annoDemo01Servlet")
public class AnnoDemo01Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("注解开发");
}
}
4.在浏览器地址栏中输入访问的路径
15.修改idea创建注解的servlet模板
学习目标
- 能够在idea中修改创建Servlet的模板代码
内容讲解
1.File----Settings
2.找到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 {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
doGet(request,response);
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
}
}
内容小结
1.在Servlet的模板代码中修改在doPost方法体中调用doGet方法
2.在Servlet的模板代码中修改WebServlet注解的属性值为:“/${Entity_Name}”
16.关于servlet3.0注解开发的疑问_配置路径省略了属性urlPatterns
学习目标
- 能够理解servlet3.0注解开发配置路径的含义
内容讲解
正常我们在WebServlet注解中配置的路径赋值给属性urlPatterns,但是urlPatterns不能省略的,在一个注解中,如果含有多个属性,并且每个属性都有默认值,此时给value赋值可以省略value属性。
注意啦:在WebServlet注解中value等同于urlPatterns属性。
内容小结
1.在WebServlet注解中value等同于urlPatterns属性,实际开发中我们实际上省略的是value属性
17.HTTP协议(掌握)
1.HTTP协议介绍
学习目标
- 掌握http协议概念和分类以及特点
内容讲解
【1】概念
全称:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。
简而言之:浏览器和服务器数据交换固定的格式。
【2】版本
HTTP协议版本如下:
1). http1.0 (1996) : 每次请求都有一个新的连接(开销大,比较慢)
2). http1.1 (1999) : 长连接,多个请求共用一个连接(开销小一些,比较快)
传输的数据都是文本(比较慢)
【3】分类
分为两类:
1)请求报文协议(浏览器发送给服务器的数据 ):1)请求行 2)请求头 3)请求体
2)响应报文协议(服务器发送给浏览器的数据):1)响应行 2)响应头 3)响应体
【4】特点
1.先有请求
2.再有响应
3.一个请求对应一个响应
内容小结
1.HTTP协议称为超文本传输协议,是浏览器和服务器数据交换固定的格式。
2.HTTP协议分为两类:
1)请求报文协议:浏览器给服务器传输数据遵守的规范
2)响应报文协议:服务器给浏览器传输数据遵守的规范
3.Http协议特点:
1.先有请求 2.再有响应 3.一个请求对应一个响应
2.浏览器抓包观察请求报文协议
学习目标
- 能够使用谷歌浏览器抓包并查看请求报文协议
内容讲解
【1】步骤
1.创建html页面
2.在html页面书写html代码
3.创建servlet
4.在servlet中书写java代码
5.启动服务器
6.打开浏览器,在浏览器访问页面,然后按f12 点击网络 network
7.抓包结果分析
【2】实现
1.创建html页面
2.在html页面书写html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>GET请求</h2>
<form action="/getServlet" method="get">
用户名:<input type="text" name="username" value="zhangsan" /><br>
密码:<input type="text" name="pwd" value="123" /><br>
<input type="submit" value="提交"/>
</form>
<h2>POST请求</h2>
<form action="/postServlet" method="post">
用户名:<input type="text" name="username" value="zhangsan"/><br>
密码:<input type="text" name="pwd" value="123"/><br>
<input type="submit" value="提交"/>
</form>
</body>
</html>
3.创建servlet
4.在servlet中书写java代码
package com.lystar.sh.d_http_04;
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("/getServlet")
public class GetServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("get....");
}
}
package com.lystar.sh.d_http_04;
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("/postServlet")
public class PostServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("post....");
}
}
5.启动服务器
6.打开浏览器,在浏览器访问页面,然后按f12 点击网络
7.抓包结果分析
内容小结
1.打开浏览器抓包工具快捷键:f12
2.请求报文协议的get请求和post请求区别:
1. GET请求:
1)请求行直接传递请求参数.将请求参数追加在URL后面,不安全。例如:form.html?username=jack&username=1234
补充:但是get请求可以作为商品的分享。
2)URL长度限制(不同浏览器限制大小不一致),GET请求方式的数据大小,不可以传输数据量较大或者非文本数据。例如图片或者视频。
3)请求体里面没有内容。
2. POST请求:
1)请求参数以请求体形式发送给服务器,数据传输安全。
2)请求数据可以为非文本数据,可以传输数据量较大的数据。
3)只有表单设置为method=”post”才是post请求.
其他的都是get请求。常见GET请求:地址栏直接访问、<a href=””>、<img src=””> location.href=""等