Servlet 是什么及创建第一个 Servlet 程序

Servlet 是什么

        网站的后端就涉及到 http 服务器,因此肯定需要针对 http 协议进行一系列操作。tomcat 已经把这些相关操作已经封装好了,就叫 Servlet。Servlet 是一种实现动态页面的技术 . 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app.
        静态页面: 内容始终固定的页面 . 即使 用户不同 / 时间不同 / 输入的参数不同 , 页面内容也不会发生变 .(tomcat 官网每个人的页面都是一样的)
        动态页面: 用户不同 / 时间不同 / 输入的参数不同 , 页面内容会发生变化 .(B站每个人的页面都是不一样的)

第一个 Servlet 程序

1. 创建项目

使用 IDEA 创建一个 Maven 项目 .(maven 是个“工程管理”工具,里面的功能有:规范目录结构、管理依赖、打包......)
        菜单 -> 文件 -> 新建项目 -> Maven

2. 引入依赖

Maven 项目创建完毕后 , 会自动生成一个 pom.xml 文件 .
        a)我们需要在 pom.xml 中引入 Servlet API 依赖的 jar . 在中央仓库 https://mvnrepository.com/ 中搜索 "servlet", 一般第一个结果就是 .

        b)选择版本. 此处我使用 3.1.0 版本,为了和 tomcat8 对应

        c)把中央仓库中提供的 xml 复制到项目的 pom.xml

         创建一个<dependencies>标签然后把复制的内容放进去即可。首次创建的时候下方会有一个进度条,等它下载完就行了。

3. 创建目录

当项目创建好了之后 , IDEA 会帮我们自动创建出一些目录. 形如:

src 表示源代码所在的目录
main 就是放业务代码的
main / java 表示源代码的根目录 . 后续创建 .java 文件就放到这个目录中 .
main / resources 放 项目的一些依赖文件
test / java 表示测试代码的根目录
pom.xml 是maven 项目总的配置文件
        虽然 maven 已经帮我们自动创建了一些目录,但是还不够,因此需要使用 maven 开发一个 web 程序,所以还需要自己额外创建别的目录。
1. 在 main 目录下,创建一个 webapp 目录
2. 在 webapp 目录下,创建一个 WEB-INF 目录
3. 再在 WEB-INF 目录下,创建一个 web.xml 文件(这个文件的作用是让 tomcat 能识别当前的代码为 webapp,并进行加载)

4. 往 web.xml 里面添加代码:
<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
</web-app>

注意:这里的 servlet 程序和之前写的代码最大的不同就是 没有main方法。如果把 main 方法比作是汽车的发动机的话,servlet 程序这里就相当于火车车厢,每节车厢是没有发动机的,只有前面的车头(tomcat)有,当把写好的 servlet 程序放到 webapps 目录下,此时就相当于把车厢都挂到车头后了,tomcat 会根据目录里面的 WEB-INF/web.xml 来识别这里的车厢是需要拉着走的。

4. 编写代码

java 目录中创建一个类 HelloServlet, 代码如下 :
import javax.jws.WebService;
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("/hello")
//创建一个类 HelloServlet , 继承自 HttpServlet
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 这个代码一定要干掉. 父类里的这个方法只是返回了一个405错误页面
        // super.doGet(req, resp);

        // 这个只是在服务器的控制台里打印.
        System.out.println("hello world");
        // 要想把 hello world 返回到客户端, 就需要使用下面的代码.
        // getWriter 会得到一个 Writer 对象.
        resp.getWriter().write("hello world");
    }
}
        这里的 doGet 方法不需要手动调用,而是交给 Tomcat 来调用。当 Tomcat 收到 get 请求就会触发 doGet 方法。其中 req 请求是 TCP Socket 中读出来的字符串按照 http 协议解析得到的对象;resp 就是程序猿在 doGet 方法里面根据 req 请求构造出来的响应。
        
        在这个类上方加上 @WebServlet("/hello") 注解 , 表示 Tomcat 收到的请求中 , 路径为 /hello  的请求才会调用 HelloServlet 这个类的代码。doGet 是 Tomcat 收到 get 请求的时候调用,但具体要不要调用 doGet 还得看当前 get 请求的路径是什么。不同的路径可以触发不同的代码,路径和 Servlet 类是一对一关系的。
        
        resp.getWriter() 会获取到一个流对象 , 通过这个流对象就可以写入一些数据 , 写入的数据会被构造成一个 HTTP 响应的 body 部分 , Tomcat 会把整个响应转成字符串 , 通过 socket 写回给浏览器.

5. 打包程序

        .jar 就是针对 .class(程序编译好就会得到一些 .class)文件构成的压缩包,是一个普通的 Java 程序
        .war 是 tomcat 专属用来描述 webapp 的程序(相当于一个 war 就是一个 webapp),此处打的是这个包
首先:要打 war 包得先在 pom.xml 里面写入(否则打的是 jar):

其次:如下图双击运行

最后:在 target 这里有个 war 包就表示成功了

6. 部署程序

        把打包好的 war 包拷贝到 tomcat 的 webapps 中即可。无论 tomcat 和 war 包是否在同一个电脑都是这样拷贝。然后启动 tomcat。

7. 验证程序

        打开浏览器的地址栏,输入 url 查看结果

小结

        当在浏览器地址栏中输入 url 之后,浏览器就构造了一个对应的 http get 请求,发给 tomcat,此时 tomcat 就会根据第一级路径确定了具体的 webapp、再根据第二级路径确定了调用哪个类、最后再通过 get / post 方法来确定调用 HelloServlet 的哪个方法(doGet、doPost......)。

简化后的部署方式

        上面的第5、6个步骤是可以简化的,需要在 idea 上下载一个插件。

        按照上面的步骤进行之后就大功告成了。这个方式是基于 tomcat 插件自动打包部署的,smart tomcat 并不会把 war 包拷贝(webapps 目录里是不会变的),而是在启动的时候指定了一个特定的 webapp 目录,相当于让 tomcat 加载这单个 webapp 来运行。

idea 直接调用 tomcat,让 tomcat 加载当前项目中的目录,这个过程没有涉及到打 war 包,也没有拷贝,也没有解压缩的过程。因此,webapps 里面一些内容(比如欢迎页面)就没有了。

  • 30
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值