从头开始 -- 聊聊JavaWEB

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

上图对servlet 的工作进行了简单的描述 , 一个java管理程序加载servlet的字节码文件并 实例化/初始化一个servlet对象, 然后将对应的请求交给这个servlet对象来处理 . 之后会销毁这个servlet对象 .

这里面的这个管理程序我们称之为Servlet容器简单来说: 容器提供了servlet的运行环境/ 控制servlet的生命周期 / 并且分配给servlet请求

web容器

Servlet容器web服务器都可以作为一个独立的应用。web服务器擅长处理HTTP服务,但它不能处理动态页面并和数据库进行交互。这些功能servlet容器都可以做到,但servlet容器没有web服务器更擅长处理HTTP服务。

所以容器的开发者希望将二者的优势结合起来,使用web服务器处理http请求 ,使用servlet容器处理业务逻辑 ,如 Apache Tomcat®:

image-20200710103035928

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)]

image-20200710120526231

2. Servlet 并运行

前文提过: 开发者编写Servlet 需要实现servlet接口 , 实时上java提供了两个实现类 , 他们已经实现了servlet接口 , 我们在实际编写的时候只需要继承HttpServlet,然后重写 doPost 和doGet 方法即可 :

doPost 和doGet 方法 是用来处理请求的方法 , tomcat会将请求信息封装成参数 , 然后在调用这两个方法的时候传递过去.

image-20200710134909613

项目目录/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

image-20200710144147739

访问成功

总结:

从上述的过程中我们可以明白 javaWEB 开发的要点:

  1. 根据规范编写servlet
  2. 规范的项目结构
  3. servlet注册到web.xml

我们只需要遵从这些规范进行开发即可 , tomcat作为容器 , 它是遵循servlet规范的 , 会根据规范运行我们的应用.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值