JavaWEB
原文阅读地址 : http://www.slient.xyz
基本概念
web:
- web —> 网页
- 静态web —> 网站同一个url访问到的内容始终不发生变化
- 动态web —> 在不同人/不同时间访问 网页内容/数据会发生变化 , 目前几乎所有网站都是动态web
静态web和web服务器:
早期的web主要用于浏览新闻等静态页面,我们做网站其实通常就是把一些资源放在服务器上面,让大家能够通过浏览器访问。当然通常来说我们计算机上的资源是不可能被他人直接访问到的,这就需要一个应用程序对外部提供服务,接受他人的请求并根据请求把指定的资源返回给请求者。这种应用程序就是web服务器
web服务器也叫http服务器,在服务器端其实就是一个http服务,http服务更擅长提供静态页面,许多静态页面只是存放在指定的目录中,在接收到浏览器端请求时候,web用用只需要将这些静态页面原封不动的返回给浏览器即可。
常见的web 服务器有 Apache / Nginx等 , web服务器擅长处理HTTP请求,但它不能处理动态页面并和数据库进行交互
动态web、Servlet和Servlet容器
随着互联网的发展,人们已经不满足于仅仅浏览静态页面了 ,但是上文说过:web服务器只是擅长处理HTTP请求将静态页面原封不动的返回给浏览器,如果需要根据不同的场景/用户/时间,提供动态的页面和数据,还需要数据库等操作,web服务就有些力不从心了。
为了不仅仅浏览静态页面,还希望通过一些交互操作,来获取动态结果。那么可以通过让HTTP服务器调用服务端程序来实现。
于是sun公司推出了Servlet技术,它是基于java语言开发的,在java中问们认为一个实现了servlet接口的类就是一个servlet,当有请求进入servlet的时候,它会(调用业务层)从数据库中存取数据,并返回页面给浏览器
但是servlet没有Main方法,它无法单独执行,所以servlet需要被另外一个程序(java程序)管理,这个程序负责加载/初始化/实例化servlet,并且将对应的请求及其参数分配给servlet实例的doPost 或者doGet方法处理:
![image-20200710092237821](JavaWEB/image-20200710092237821.png)
上图对servlet 的工作进行了简单的描述 , 一个java管理程序加载servlet的字节码文件并 实例化/初始化一个servlet对象, 然后将对应的请求交给这个servlet对象来处理 . 之后会销毁这个servlet对象 .
这里面的这个管理程序我们称之为Servlet容器简单来说: 容器提供了servlet的运行环境/ 控制servlet的生命周期 / 并且分配给servlet请求
web容器
Servlet容器和web服务器都可以作为一个独立的应用。web服务器擅长处理HTTP服务,但它不能处理动态页面并和数据库进行交互。这些功能servlet容器都可以做到,但servlet容器没有web服务器更擅长处理HTTP服务。
所以容器的开发者希望将二者的优势结合起来,使用web服务器处理http请求 ,使用servlet容器处理业务逻辑 ,如 Apache Tomcat®:
Tomcat 作为一个servlet , 它早期是嵌入在 web服务器Apache 中的 , 不过后来的版本自己实现了http的相关处理。
web容器 = web 服务器 + servlet容器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZlz6KJb-1594623511647)(http://www.slient.xyz/images/202007/1243169-20190530140355463-1290495667.png)]
Servlet规范
上文说了Servlet能够处理请求 , 而servlet容器 则管理一个servlet的生命周期 , 并且调用servlet的方法处理请求。
那么 , servlet如何被容器发现 ,容器如何知道调用哪个servlet呢?
这里就需要了解servlet规范: servlet规范 = servlet 容器规范 + servlet接口
servlet接口:定义了几个方法不如初始化方法/销毁方法/处理方法等,开发者开发的servlet实现了这个接口就必须有这些方法 。
另外,servlet通常以web应用的方式来部署到servlet容器中,根据servlet规范:web应用必须拥有特定的结构
| - MyWebApp
| - WEB-INF
| - web.xml -- 配置文件,用来配置 Servlet 等
| - lib/ -- 存放 Web 应用所需各种 JAR 包
| - classes/ -- 存放你的应用类,比如 Servlet 类
| - META-INF/ -- 目录存放工程的一些信息
在上面的结构中,servlet以及其他应用类的class文件村放与classes中 , 并且每个servlet必须住测在web.xml文件中 ,web.xml文件中详细定义了每个servlet的位置/初始化信息/以及需要处理的请求路径等。
总之,完整的流程就是:
- 我们编写的servlet实现了servlet接口 ,对外提供了一些方法
- 容器程序(比如tomcat) 实现的规范中的servlet规范
- 将servlet以及需要的其他业务类/jar包 按照规范的web应用结构组织 , 并将servlet注册到web.xml
- 将组织好的web应用交给servlet容器
- sevlet 容器启动时就会解析指定位置的web.xml , 能够定位每个servlet的位置和能够处理的url
- 请求到来时,容器会根据请求定位servlet ,并根据情况初始化需要的servelt , 然后封装请求参数并调用servlet的处理方法
- 完成之后 容器销毁servlet实例,释放资源。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nR4F3o7Z-1594623511658)(http://www.slient.xyz/images/202007/1243169-20190530143108924-909669294.png)]
Servlet开发
这部分文档将会手动实现一个servlet小项目,探索servlet开发JavaWEB 应用 ,并且该项目将不会使用IDE工具进行编写,从而获得更多细节。
1. 组织项目结构
在任意位置新建目录myproject
然后在该目录下按照规范建立相关目录:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9U32CFsH-1594623511660)(http://www.slient.xyz/images/202007/image-20200710115631906.png)]
下载tomcat : 此处选择8.x版本:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ljVa146d-1594623511663)(http://www.slient.xyz/images/202007/image-20200710115834982.png)]
tomcat解压目录下已经存在几个示例项目 , 我们可以从中拷贝web.xml
文件到我们的项目中:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FQ9VJvlZ-1594623511665)(http://www.slient.xyz/images/202007/image-20200710120433522.png)]
2. Servlet 并运行
前文提过: 开发者编写Servlet 需要实现servlet接口 , 实时上java提供了两个实现类 , 他们已经实现了servlet接口 , 我们在实际编写的时候只需要继承HttpServlet,然后重写 doPost 和doGet 方法即可 :
doPost 和doGet 方法 是用来处理请求的方法 , tomcat会将请求信息封装成参数 , 然后在调用这两个方法的时候传递过去.
在项目目录/WEB-INF/classes/com/servlet
下创建java文件: MyServlet.java
package com.servlet;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().print("test Response content");
}
}
servlet 编写完之后 , 我们需要在web.xml
中注册这个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_3_1.xsd"
version="3.1"
metadata-complete="true">
<display-name></display-name>
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping><!--servlet类映射配置-->
<servlet-name>myServlet</servlet-name>
<url-pattern>/my</url-pattern>
</servlet-mapping>
</web-app>
因为这里引用了javax.包下servlet相关的类 , 但是在jre中可能并没有这些包 , 所以我们需要手动指定 在进行编译:
首先复制tomcat目录下的lib中的 servlet-api.jar
到我们项目中:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KbaLyWzn-1594623511671)(http://www.slient.xyz/images/202007/image-20200710143204348.png)]
现在项目整体结构如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SEkXx06w-1594623511675)(http://www.slient.xyz/images/202007/image-20200710143310701.png)]
然后我们尝试编译servlet : 在项目目录\WEB-INF\classes\com\servlet
也就是servlet所在目录打开cmd 执行javac:
javac -cp "../../../lib/*" MyServlet.java
然后我们就可以得到MyServlet.class 文件
吧tomcat目录下的webapps 里面的东西全部删除 , 然后把我们的项目拖进去:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PQnAzHEu-1594623511677)(http://www.slient.xyz/images/202007/image-20200710144018860.png)]
启动tomcat 访问 http://localhost:8080/myproject/my
访问成功
总结:
从上述的过程中我们可以明白 javaWEB 开发的要点:
- 根据规范编写servlet
- 规范的项目结构
- servlet注册到web.xml
我们只需要遵从这些规范进行开发即可 , tomcat作为容器 , 它是遵循servlet规范的 , 会根据规范运行我们的应用.