什么是Web
Web是全球广域网,也称为万维网(www),能够通过浏览器访问的网站。例如百度、京东、淘宝等
20210717183958532.png什么是JavaWeb
JavaWeb,就是使用Java技术来解决web互联网领域的技术栈。
静态资源
使用HTML\CSS\JavaScript技术,构建前端网页,如果每个用户看到的内容都是一模一样的,就是静态资源
动态资源
- 动态资源包括Servlet、JSP等,负责逻辑处理
- 动态资源处理完逻辑后,得到的结果交给静态资源进行展示,使每个用户看到的内容都不一样,就是动态资源
- 动态资源需要和静态资源结合使用
HTTP协议
1627043194238.png- HyperText Transfer Protocol,超文本传输协议,定义浏览器和服务器之间的数据传输、通信的规则
- 数据传输规则,指的就是请求数据和响应数据,需要按照指定的规则进行传输
HTTP协议的特点
- 基于TCP协议,面向连接,安全(TCP,是一种面向连接(建立连接之前,需要经过三次握手)、可靠的、基于字节流的传输层通信协议,在数据传输方面更安全)
- 基于请求-响应模型,一次请求只有一次响应,请求和响应是一一对应关系
- HTTP协议是无状态的,对事务处理没有记忆能力,每次请求和响应都是独立的
HTTP协议无状态
- 无状态是指客户端发送HTTP请求给服务端后,服务端根据请求做出响应,响应完后,服务端不会记录任何信息,从而它也有优缺点
- 优点:速度快
- 缺点:多次请求间不能共享数据
请求格式
GET / HTTP/1.1
Host: www.baidu.cn
Connection: keep-alive
Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1
User-Agent: Moilla/5.0 Chrome/91.0.4472.106
HTTP的请求数据,分为三部分,分别为请求行
、请求头
和请求体
-
请求行,请求数据的第一行数据(只有一行),它包含三块内容,分别是请求方式、请求路径、HTTP协议以及版本号
- 请求方式有7种,最常用的是GET和POST
-
请求头,从第二行开始,格式为 key:value
Host: 表示请求的主机名
User-Agent: 浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like Gecko;
Accept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有;
Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip, deflate等。
- 请求体,和请求头之间有一个空行
- GET请求没有请求体,POST请求有请求体,GET请求的参数在请求行中,POST请求的参数在请求体中
POST / HTTP/1.1
Host: www.baidu.cn
Connection: keep-alive
Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 Chrome/91.0.4472.106
username=superbaby&password=123456
响应格式
HTTP/1.1 200 OK
Server: Tengine
Content-Type: text/html
Transfer- Encoding: chunked...
<html>
<head>
<title></title>
</head>
<body></body>
</html>
响应数据中,包含三个部分,分别是响应行,响应头和响应体
- 响应行,响应数据的第一行(也只有一行),由三部分组成,分别是HTTP协议版本号,响应状态码,响应状码的描述
- 响应头,第二行开始,格式为 key:value
Content-Type:表示该响应内容的类型,例如text/html,image/jpeg;
Content-Length:表示该响应内容的长度(字节数);
Content-Encoding:表示该响应压缩算法,例如gzip;
Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒
- 响应体,和响应头之间有一个空行,存放响应数据
<html>
<head>
<title></title>
</head>
<body></body>
</html>
- 常见的响应状态码
- 200 ok 客户端请求成功
- 404 Not Found 请求资源不存在
- 500 Internal Server Error 服务端发生不可预期的错误
什么是Web服务器
1627058356051.png- Web服务器是一个应用程序,将对HTTP协议的操作进行封装,让程序员不不需要直接对协议进行操作,让Web开发更加便捷,对外提供网上浏览服务
- Web服务器软件有很多,例如最常用的
Tomcat
Web服务器的功能
- 负责解析HTTP协议,解析请求数据,并发送响应数据
- 浏览器按照HTTP协议发送请求和数据,服务器使用一个Web服务器软件来根据HTTP来解析请求,再把服务器的响应按照HTTP协议发送给浏览器
Tomcat
1627176045795.png- Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范
Tomcat的下载、安装、配置、部署
下载和安装Tomcat
1627178001030.png- 进入Tomcat的官网进行下载,https://tomcat.apache.org/
- 例如下载
Tomcat/apache-tomcat-8.5.68-windows-x64.zip
,对压缩包进行解压,注意最好解压到非中文、没有空格的目录 - 打开
apache-tomcat-8.5.68
目录,目录结构如下: - bin目录,存放Tomcat的命令,
.bat
是windows的可执行文件,.sh
是Linux、Mac的可执行文件 - conf,存放Tomcat的一些配置文件
- webapps,部署的项目的目录
卸载Tomcat
删除Tomcat目录即可
启动Tomcat
1627179006011.png 1627199957728.png- 进入
bin
目录,windows系统双击startup.bat
或Linux、Mac使用命令行执行sh startup.sh
,启动Tomcat - 浏览器访问
http://localhost:8080
,能出现Tomcat的欢迎页面,即为成功 - 如果控制台出现中文乱码,则需要修改conf目录下的
logging.prooperties
配置文件,修改编码为GBK
# 默认
java.util.logging.ConsoleHandler.encoding = UTF-8
# 修改为GBK
java.util.logging.ConsoleHandler.encoding = GBK
关闭Tomcat
关闭有3种方式
- 直接x掉运行的命令行窗口,强制关闭(不建议,可能有不可预知的问题)
- windows双击bin目录下的shutdown.bat,Linux、Mac执行sh shutdown.sh命令,该方式为正常关闭
- 运行命令行窗口,ctrl + c,也是正常关闭
配置Tomcat
- Tomcat默认端口为8080,一般端口端口冲突才需要修改,修改conf目录下的server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
- 如果启动Tomcat时,一闪而过,一般是JAVA_HOME环境变量没有配置,进行配置重试即可
部署Tomcat
部署可以分为2种方式
- 手动在webapps目录下,创建一个目录,放入静态资源,在浏览器直接访问资源路径
- IDEA打包war包,启动Tomcat,手动将war包复制到webapps目录下,Tomcat会有一个定时任务解压该目录下的war包为一个目录
Servlet
1627236923139.png- Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态的web资源开发技术
Servlet入门
- 创建名为
web-demo
的maven项目,在pom.xml文件中,导入依赖坐标
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!--
此处为什么需要添加该标签?
provided指的是在编译和测试过程中有效,最后生成的war包时不会加入
因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错
-->
<scope>provided</scope>
</dependency>
- 定义一个类,继承Servlet接口
- 在类头添加
@WebServlet
注解,配置该Servlet的访问路径 - 实现所有方法,在service方法中输出打印一句话
- 在类头添加
@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet hello world~");
}
public void init(ServletConfig servletConfig) throws ServletException {
}
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
- 启动Tomcat,访问该Servlet,控制台能看到打印输出的语句
http://localhost:8080/web-demo/demo1
Servlet生命周期
-
init(),Servlet初始化方法,只会调用一次
-
service(),服务调用方法,每次访问Servlet就会调用一次
-
destroy(),Servlet销毁方法,服务器重启或关闭时,只会调用一次
-
@WebServlet注解
-
value属性:映射的路径,必须/开头,否则启动会报错
-
loadOnStartup属性:(数字越小,优先级越高)
- 大于等于0,Web容器启动时,就会创建Servlet。
- 如果为负数,则是第一次调用时才创建,默认为-1
@WebServlet(value = "/demo1", loadOnStartup = 1)
public class Demo1Servlet implements Servlet {
/**
* 初始化方法,每一次Servlet对象创建时,调用一次
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("你好 demo1 servlet 初始化方法");
}
/**
* 服务调用方法,每次访问Servlet都会被调用
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("你好 demo1 servlet");
}
/**
* 销毁方法,服务器重启或关闭时,调用一次
*/
@Override
public void destroy() {
System.out.println("你好 demo1 servlet 销毁方法");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
}
Servlet体系结构
针对HTTP协议,Servlet有提供专门的子类HttpServlet
,让我们只关注服务调用方法,提供了doGet
和doPost
方法,分别对应访问Servlet时,对应的GET请求和POST请求
- Servlet(根接口)
- GenericServlet(Servlet公共抽象类)
- HttpServlet(对HTTP协议进行封装的Servlet实现类)
@WebServlet(value = "/demo3")
public class Demo3Servlet extends HttpServlet {
private static final long serialVersionUID = 3652460378925257829L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo3 doGet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo3 doPost");
}
}
- 新建一个HTML页面,访问该Servlet,进行测试
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/web-demo/demo3" method="post">
<input name="username"/><input type="submit"/>
</form>
</body>
</html>
为什么HttpServlet要区分doGet和doPost
- 这是由于GET请求和POST请求的参数位置不一致,GET请求参数在请求行中,POST请求的参数在请求体中
Servlet访问路径匹配
除了精确匹配路径外,Servlet还支持目录匹配、任意匹配、多路径匹配等
- 优先级:精确匹配 > 目录匹配 > 任意匹配 > 后缀匹配
- 注意:value和urlPatterns是等价关系,不能同时出现!不然启动就会报错
//精确匹配
//@WebServlet(value = "/user/demo3")
//目录匹配,访问/user/下的路径,都是找到该Servlet
//@WebServlet(value = "/user/*")
//扩展名匹配(后缀匹配),访问/user/1.demo、/555/abc.do,就是访问后缀为.do的路径
//@WebServlet(value = "*.do")
//任意匹配,访问任何路径都可以访问到该
//@WebServlet(value = "/*")
//实际开发中,一般一个Servlet只配置一个访问路径
//@WebServlet(value = {"/demo3", "/demo4"})
@WebServlet(value = "/demo3")
XML配置Servlet
注解配置Servlet,是在Servlet 3.0开始支持的,在3.0之前,都是使用xml配置,xml配置太繁琐,所以才有了后来的注解配置,这里简单了解以下XML的配置方式
- 定义一个Servlet,注意不要添加@WebServlet注解
public class Demo4Servlet extends HttpServlet {
private static final long serialVersionUID = -1768906787754655105L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo4 doGet...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo4 doPost...");
}
}
-
在web.xml中,配置Servlet
- servlet标签,用于定义Servlet全类型以及对应的简短名称的映射关系
- servlet-mapping标签,用于定义Servlet对应的访问路径和简短名称的映射关系
<?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">
<!-- 使用xml方式配置Servlet -->
<!-- 1、 给Servlet配置一个名字-->
<servlet>
<servlet-name>demo4_servlet</servlet-name>
<servlet-class>com.itheima.servlet.Demo4Servlet</servlet-class>
</servlet>
<!-- 2、配置Servlet和访问路径的映射,路径也是必须以/开头 -->
<servlet-mapping>
<servlet-name>demo4_servlet</servlet-name>
<url-pattern>/demo4</url-pattern>
</servlet-mapping>
</web-app>
网友评论