javaEE 初阶 — 第一个 servlet 程序

Servlet 是什么


Servlet 是一种实现 动态页面 的技术,是一组 Tomcat 提供给程序猿的 API,
帮助程序猿简单高效的开发一个 web app。

网页是分为两大类的:

1、静态页面:页面的内容始终是固定不变的,静态页面就只是单纯的 html ,例如搜狗主页。

2、动态页面:页面内容随着输入参数的不同而改变,动态页面则是 html + 数据,例如搜狗结构页。

第一个 Servlet 程序


先来实现一个 hello world ,预期写一个 servlet 程序,部署到 tomcat 上。
通过浏览器访问得到 hello world 字符串。


这里的操作一共分为 7 个步骤:

1、创建项目

2、引入依赖

3、创建目录结构

4、编写代码

5、打包程序

6、部署程序

7、验证

1 创建项目


选择 maven,不要选择左边的。



点击完成即可。


main 底下存放的是 业务代码java 目录底下存放的是 java 代码。
resources 里存放的是程序依赖的文件,此处再是不涉及。
test 目录下的 java 存放的是 测试代码,pom.xml 是 maven 项目的配置文件,后面会经常用到。




项目创建好以后,上面的代码是自带的。

2 引入依赖


搜索 https://mvnrepository.com/ 打开 maven 仓库。



需要先验证。

搜索 servlet 选择当前的圈出的。



点击进去,选择 3.1.0 版本。





选中当前的 maven,将上述的代码复制到 pom.xml 里,要复制到 dependencies 标签里。




为红色说明未下载完成。

3 创建目录结构


虽然 maven 已经帮我们自动的创建了一些目录,但是还是不够。
此处需要使用 maven 开发一个 web 程序,还需要别的目录。


1、在 main 目录下创建一个 webapp 目录



选择 Directory,创建 webapp 目录。


2、在 webapp 下创建一个 WEB-INF 目录



选择 Directory,创建 WEB-INF 目录。


3、在 WEB-INF 目录下创建一个 web.xml 文件



选择 File 创建文件。


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>


直接将上面的这段代码复制到 web.xml 文件中。



圈出的部分可能会是红色的,但是不一定是错误的,可以使用 alt + enter 使使。

4 代码编写


创建一个 HelloServlet 类。

import javax.servlet.http.HttpServlet;

public class HelloWorld extends HttpServlet {
    
    

}


HttpServletservlet api 里提供的现成的类,一般写 servlet 代码一般都是继承 HttpServlet


这个类需要重写 doGet 方法,如果是一个 Post 请求,那就是重写一个 doPost 请求。

public class HelloWorld extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
       //super.doGet(req, resp);
    }
}

@Override 表示的是方法重写
HttpServletRequest request 这个参数表示一个 http 请求。
HttpServletResponse response 这个参数表示一个 http 响应。


doGet 方法的效果就是 根据请求计算响应Tomcat 收到 get 请求就会触发 doGet 方法,Tomcat 就会构造好两个参数,
一个是 rep一个是 resp

rep 是 TCP socket 中读出来的字符串,按照 http 协议解析得到的对象。
resp 则只是一个 空的对象。

super.doGet(req, resp); 这儿条语句一定要注释掉。


编写业务代码,也就是我们的 hello world 。

// 这是一个注解
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    
    

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //super.doGet(req, resp);
        System.out.println("Hello World"); // 这是控制台打印
        // 返回到客户端的打印
        // getWriter 会得到一个 Writer 对象
        resp.getWriter().write("Hello World");
    }
}


这里的注解类似于一个导购员,作用是针对一个类/方法,进行额外的 “解释说明”,
赋予这个类/方法额外的功能/含义。


需要注意的是,doGetTomcat 收到 GET 请求的时候就会调用。
具体要不要调用 doGet,还要看当前的 GET 请求的路径是什么,不同的路径可以触发不同的代码。
(关联到不同的类上)

举一个例子,比如说,我到饭店吃饭,向老板点了一份蛋炒饭,我的要求是葱要多放。
此时就是 http://ip:port/蛋炒饭?葱=多放
老板再收到请求的时候就需要按照 “制作蛋炒饭” 的流程来做饭,也就是根据请求计算响应。


如果我点的是一个多放辣椒的炒面,那就是 http://ip:port/炒面?辣椒=多放
此时老板收到的请求之后,就是按照 “制作炒面” 的流程来制作饭,也就是根据请求计算响应。

这很明显是两个不同的流程,相当于是两个不同的类/方法。


一个 Servlet 程序中,可以有很多的 Servlet 类,每个 Servlet 都可以关联到不同的路径,也就是对应到不同的资源,因此多个 Servlet 就实现了不同的功能,但是一个 Servlet 类是不可以对应多个路径的。对应的,一个路径也不能对应多个 Servlet,路径 和 Servlet 类之间是一对一之间的关系

5 打包程序


程序编译好之后,会得到一些.class 文件,此时要把这文件打成 war 包。
war 是 tomcat 专属的用来描述 webapp 的程序,一个 war 就是一个 webapp。


1、点击右侧的 maven ,打开面板



2、选中此时的 Lifecyle 下的 package



可以直接双击运行。



也可以右键选中上面的 Run 运行。


3、成功之后就会显示 build success



如果打包错误了,就会产生一个报错。

打完之后再左侧的 target 目录里就包含了 所打的包,默认情况下打的是一个 jar


4、修改 jar 包 为 war 包

先在 pom.xml 文件中的 project 标签里加入一个 packaging 标签。
在这标签里写下指定的包是哪一种,我们打的是 war 包,此处就写的是 war 包。

 <packaging>war</packaging>


还需要有一个 build 标签,在 这个 build 标签里也要有一个 finalName 标签。
此处的 finalName 标签里写的就是包的名字。

<build>
    <finalName>test01</finalName>
</build>




可以看到此时打的 war 包。


5、右键打开 war 包



打开之后,可以看到 target 目录下的 war 包。

6 部署


部署就是将之前的 war 文件 拷贝到 tomcat 的 webapps 目录即可,无论 tomcat 是不是在你的同一个电脑上,都是如此拷贝。

拷贝后,启动 tomcat。

如果 tomcat 正在运行,直接拷贝的时候 tomcat 也可以识别,但是在 windows 中可能存在 bug,
实际工作中,tomcat 基本都是在 linux 上运行的。




之后启动 tomcat 。



看到上面的即为启动成功。

7 验证


打开地址栏,输入 url ,测试写好的代码。



test01 是 第一级目路径,也叫做 context path / application path,这个目录就代表了一个 webapp,也就是一个网站。


/hello 是 第二级路径 也叫做 servlet path,如果这两个路径有一个出现了错误,就会出现 404






第一级路径对应的是 war 包名,第二级路径对应的是 注解 里的内容。





可以看到在服务器和客户端都打印出了 Hello World。


小结

在浏览器地址栏输入 url 之后,浏览器就构造了一个对应的 HTTP GET 请求,发给了 tomcat 。
tomcat 就根据第一级路径确定了具体的 webapp,根据第二级路径确定了是调用哪个类。
然后再通过 GET/POST 方法确定调用 HelloSevlet 类里的哪个方法,是 doGet、doPost,还是其他的方法。

如何使用 tomcat 插件打包及部署


打包部署 是可以使用 idea 的 tomcat 插件,把 tomcat 集成到 idea 中。
就可以省去手动打包和部署的过程,只需要按一下运行就会自动打包部署。

基于 tomcat 插件自动打包部署,适用于开发阶段,频繁修改代码,频繁验证的场景。
手动打包部署,适用于上线阶段,发布程序时使用。

1 什么是插件


插件就是对现有的功能进行的拓展,很多程序都是有插件功能的。



就比如上图中的 m4,射击是它的一个功能,但是说如果目标距离过远导致没有办法很容易的命中,
此时就可以装上一个瞄准镜,此时的瞄准镜就是一个插件,作用就是添加一个远距离瞄准的功能。

如果没有添加瞄准镜这个插件,它也是可以开火射击的,只是对于远距离目标就没有那么精准了。
相当于是没有了插件后,功能比以前更少了。


如果此时在夜间看不见目标,就可以在添加上一个夜视仪,这个插件就保证了夜间也可以命中目标。
夜视仪就是另外的一个插件,另外的一个功能。

2 插件的安装


1、打开左上角的 File 选择点击 Settings


2、点击 Plugins



在点击后出现的页面中,



Marketplace 表示的是插件市场,要在这里搜索下载插件。
Installed 页面表示的是已经装好了的插件。


3、搜索 smart tomcat



smart tomcat 就是我们要下载的插件,点击 Install 开始下载。
下载完成之后,重启 idea 即可。

3 插件的使用


首次使用 smart tomcat 的时候,需要配置一下,当然之后就不需要配置了。

1、新增一个运行配置

单击右上角的 Add Configuration…





在出现的页面中,点击圈出的部分。


2、在出现的页面中选择 smart tomcat





点击后出现的页面就是上图中的页面,我们只需要配置绿色圈出的部分,这部分默认即可。


3、设置一下 tomcat 所在的路径

第一次配置好了,以后就不需要再配置了。


4、运行 tomcat



点击右上角的 三角形 运行。



运行后发现报错了,此时报的错误是 地址已被占用。



可以发现此时的使用的端口是 8080。


此时就可以打开 cmd ,键入 netstat -ano | findstr 8080



此时就可以看到 16620 这个进程占用了 8080 这个 端口。


打开 任务资源管理器



可以看到 16620 这个进程就是我们的 tomcat 对应到的 java 进程,因此,关掉 tomcat 即可。


关掉之后,就可以发现此时 8080 不再被占用了。





可以发现此时,就运行成功了。


此时还需要再验证一下,在地址栏输入 http://127.0.0.1:8080/test01/hello



smart tomcat 的工作原理

smart tomcat 不是自动把 war 包拷贝了,也就是 webapps 里是不变的,
而是通过另一种方式来启动的 tomcat 的。

tomcat 支持启动时显示指定一个特定的 webapp 目录,相当于是让 tomcat 加载单个 webapp 运行。
idea 直接调用 tomcat 让 tomcat 加载当前项目中的目录。这个过程中其实并没有打 war 包,也没有拷贝,也没有解压缩。

4 可能会出现的问题


1、404

导致 404 出现的原因,可能是路径写错了。也有可能是 webapp 没有被正确部署
例如,web.xml 文件里的内容写错了、文件名写错了、文件路径写错了、文件位置错了…


此时就是一个 404 错误。



2、405

如果出现了 405,可能是浏览器发了一个 GET 请求,但是此时的代码里是没写 doGet 方法的。



如果 super.doGet(req, resp); 这条语句没有注释掉,也会报 405。



3、500

出现 500 ,本质上就是代码抛出异常了,抛出 500 的时候日志会明确的告诉你异常调用栈,
会告诉你哪一行代码出问题了。

String s = null;
System.out.println(s.length());


此时的代码肯定会报一个 空指针异常



可以看到在报 500 的同时,也报出了空指针异常,而且连出现问题的代码行数也报出来了。



4、出现空白页面

出现空白页面,是因为代码里没写 resp.getWriter().write() 这条语句。



5、出现无法访问网站

这表明 tomcat 未启动,此时就需要检查 tomcat 是否启动了,如果没启动,那就启动。





在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_63033419/article/details/130022817