Web:全球广域网(www),也称为万维网,能够通过浏览器访问的网站
(Web就是网站,网站就是Web)
JavaWeb:就是使用JAVA技术来开发Web
B/S 架构:Browser/Server,浏览器/服务器 架构模式,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。
浏览器只需要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可。
静态资源主要包含HTML、CSS、JavaScript、图片等,主要负责页面的展示。
动态资源主要包含Servlet、JSP等,主要用来负责逻辑处理。
HTTP协议:HyperText Transfer Protocol,超文本传输协议。主要定义通信规则(服务端和客户端所约定的规则)
浏览器发送请求给服务器,服务器响应数据给浏览器,这整个过程都需要遵守一定的规则,之前大家学习过TCP、UDP,这些都属于规则,这里我们需要使用的是HTTP协议,这也是一种规则。
HTTP协议有它自己的一些特点,分别是:
基于TCP协议: 面向连接,安全
TCP是一种面向连接的(建立连接之前是需要经过三次握手)、可靠的、基于字节流的传输层通信协议,在数据传输方面更安全。
基于请求-响应模型的:一次请求对应一次响应
请求和响应是一一对应关系
HTTP协议是无状态协议:对于事物处理没有记忆能力。每次请求-响应都是独立的
无状态指的是客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息。这种特性有优点也有缺点,
缺点:多次请求间不能共享数据
优点:速度快
Web服务器:负责解析 HTTP 协议,解析请求数据,并发送响应数据
浏览器按照HTTP协议发送请求和数据,后台就需要一个Web服务器软件来根据HTTP协议解析请求和数据,然后把处理结果再按照HTTP协议发送给浏览器。
请求数据总共分为三部分内容,分别是请求行、请求头、请求体
请求行:
HTTP请求中的第一行数据,请求行包含三块内容,分别是 GET[请求方式] /[请求URL路径] HTTP/1.1[HTTP协议及版本]
请求方式有七种,最常用的是GET和POST
请求头:
第二行开始,格式为key: value形式
请求头中会包含若干个属性,常见的HTTP请求头有:
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等。
请求体:
POST请求的最后一部分,存储请求参数
GET请求请求参数在请求行中,没有请求体,POST请求请求参数在请求体中
GET请求请求参数大小有限制,POST没有
响应数据总共分为三部分内容,分别是响应行、响应头、响应体
响应行:
响应数据的第一行,响应行包含三块内容,分别是 HTTP/1.1[HTTP协议及版本] 200[响应状态码] ok[状态码的描述]
响应头:
第二行开始,格式为key:value形式
响应头中会包含若干个属性,常见的HTTP响应头有:
Content-Type:表示该响应内容的类型,例如text/html,image/jpeg;
Content-Length:表示该响应内容的长度(字节数);
Content-Encoding:表示该响应压缩算法,例如gzip;
Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒
响应体:
最后一部分。存放响应数据
响应体和响应头之间有一个空行隔开。
响应状态码
Tomcat的相关概念:
Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范。(轻量级的意思就是只支持Servlet/JSP少量JavaEE规范)
概念中提到了JavaEE规范,那什么又是JavaEE规范呢?
JavaEE: Java Enterprise Edition,Java企业版。指Java企业级开发的技术规范总和。包含13项技术规范:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAF。
因为Tomcat支持Servlet/JSP规范,所以Tomcat也被称为Web容器、Servlet容器。Servlet需要依赖Tomcat才能运行。
Web服务器是一个应该程序(软件),对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是"提供网上信息浏览服务"。
将项目拷贝到Tomcat的webapps目录下,通过浏览器能看到内容则证明部署成功。
但是文件一多,这样复制太麻烦,所以将文件打成war包,tomcat会自动解压
启动tomcat会默认去访问index文件,如果没有则404

部署之后的项目
编译后的Java字节码文件和resources的资源文件,会被放到WEB-INF下的classes目录下
pom.xml中依赖坐标对应的jar包,会被放入WEB-INF下的lib目录下
1.导入pom文件
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
<scope>providedscope>
dependency>
2.定义一个类实现Servlet接口
3.在类上加上@WebServlet注解,并配上路径
/**
* Servlet的执行流程和生命周期
*
* @WebServlet:定义servlet
* /demo1:定义访问Servlet的路径
*/
@WebServlet(value = "/demo1",loadOnStartup = 1)
//1.loadOnStartup默认是负整数:第一次被访问时创建Servlet对象
//2.0或正整数,服务器在启动时创建Servlet对象,数字越小优先级越高
public class ServletDemo implements Servlet {
/**
* 初始化方法,在对象创建的时候调用一次(servlet由tomcat创建),只执行一次
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("demo1初始化");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 每次访问servlet都会调用
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("第一个servlet1启动成功~");
}
@Override
public String getServletInfo() {
return null;
}
/**
* 销毁方法,服务器关闭的时候
*/
@Override
public void destroy() {
System.out.println("demo1销毁");
}
}
浏览器发出http://localhost:8080/web-demo/demo1请求,从请求中可以解析出三部分内容,分别是localhost:8080、web-demo、demo1
localhost:8080可以找到要访问的Tomcat Web服务器web-demo可以找到部署在Tomcat服务器上的web-demo项目demo1可以找到要访问的是项目中的哪个Servlet类,根据@WebServlet后面的值进行匹配找到ServletDemo这个类后,Tomcat Web服务器就会为ServletDemo这个类创建一个对象,然后调用对象中的service方法
Servlet由web服务器创建,Servlet方法由web服务器调用
因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法
在Servlet接口中有这样三个方法
init()
service()
destroy()
分别对应着Servlet的初始化,请求处理和销毁
Servlet默认在第一次访问时创建对象,并初始化对象,只执行一次,由此能想到这是单例模式的,代码中的loadOnStartup默认为负整数表示第一次访问时被创建,为正整数时,表示服务器启动就加载。
init()在对象创建时执行一次,也只会执行一次
service被访问几次就执行几次。
当服务器断开或者重启,就调用destroy方法,只执行一次。
Servlet中总共有5个方法,其中的三个是生命周期,剩下的两个方法作用分别是什么?
String getServletInfo()
//该方法用来返回Servlet的相关信息,没有什么太大的用处,一般我们返回一个空字符串即可
public String getServletInfo() {
return "";
}
获取ServletConfig对象
```java
ServletConfig getServletConfig()

HttpServlet中的service方法是先获取当前的请求方式,根据请求方式来调用doGet或doPost方法
之所以要分get和post方法,是因为get方法和post传参方式不同
GET请求参数在请求行中,POST请求参数在请求体中,为了能处理不同的请求方式,我们得在service方法中进行判断,然后写不同的业务处理。
一个Servlet,可以配置多个urlPattern
value和urlPattern一致,一般使用value,都是String类型的数组
/**
* 注意: 一般情况一个ServLet就对应一个配置路径就可以了
* /user/demo3 :精确匹配 路径要一致才能访问十
* user/*: 目录匹配
* *.to: 扩展名匹配
* /*: 任意匹配
*
* 匹配顺序
* 精确>目录>任意>后缀
* value和patten是一致的,但是不能放在一起使用,底层都是一个String类型的数组,可以放多个Servlet地址
* 一般常用value
*/
@WebServlet(value = {"/demo4", "/demo40"})
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo4这是get请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo4这是post请求");
}
}
如果你对本文有疑问,你可以在文章下方对我留言,敬请指正,对于每个留言我都会认真查看。