【JavaEE】Tomcat-Servelet第一个helloworld程序

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: HTTP本质上就是一个TCP服务器(HTTP基于TCP)

JavaEE & Tomcat & 第一个Servelet程序

1. HTTP服务器 - Tomcat

HTTP本质上就是一个TCP服务器(HTTP基于TCP)


这个服务器按照HTTP协议的约定,解析请求,构造响应


你自己写一个HTTP服务器,也完全没问题!

不过我们Java圈子和生态中,有一个现成的,最流行的,apache社区开源的http服务器 = = =》 Tomcat


直接去官网下载就行了:Apache Tomcat® - Apache Tomcat 8 Software Downloads



新的不一定是好的,新的不一定稳定,可能会有点bug(别当小白鼠)


企业也不会经常更新,大部分公司还在用8这个版本

我的代码基于这个版本,servelet也要匹配上,所以如果你的版本跟我的不一样,有一定概率在你那跑不了!


选择这个:



下载成功放在熟悉的目录下:


大版本是8就行了,八点几无所谓


1.1 Tomcat的目录结构:

这就是一个绿色软件,连双击安装都不需要~


bin 表示binary,里面包含了一下可执行的二进制脚本


conf 表示config,配置文件


一个复杂的软件,通常会有配置,开启不同的功能~


logs表示运行日志


出问题来这里看


webapps 放webapp,即放网站(后端+前端)


一个Tomcat上可以同时部署多个网站


部署说起来高级,其实就是将你的网站的文件放在对应目录下

1.2 启动Tomcat


这样就启动成功了

乱码没关系的,后面你就知道了

Tomcat是一个http服务器,但凡是一个服务,基本上就是个黑框框~


服务器它好用就完了,丑了就丑了

查看Tomcat的端口号是否正常绑定


Tomcat默认端口号为8080

我们要避免这个端口号被其他程序占用!

win R 打开命令行


netstat -ano | findstr 8080


netstat -ano:获得所有端口情况

findstr 8080:找包含8080的字符串


两个的话,一个是ipv4,一个是ipv6


后面是进程id:11168


这样代表绑定成功


通过浏览器,访问Tomcat的欢迎页面



部署我们自己的网站~


我们自己电脑内打开html当然简单,但是别人不行呀

而这样别人也能访问才能我们的网站

将之前的博客系统html部署到webapps目录下:


部署==放置


打开Tomcat:



获取内网ip:


开热点看得到


输入【ip:端口:路径】去访问~



少写了字母就会出现404



这样操作,如果连的是一个热点,那么就可以访问到:


以手机为例

当然,这个页面并没有考虑移动端的问题,这也不做讨论


然而,没连热点或者外校或者外地的机器,是不能打开这个网站的~


因为NAT机制~

后续我们在云服务器获取外网ip,云服务器上的Tomcat部署网站,别人就能访问到了

1.3 Tomcat的优点

我们现在要写网站后端


虽然我们可以从头写一个HTTP服务器,但是很麻烦


Tomcat已经完成了这一部分工作,并且Tomcat给我们提供了一系列的API,可以让我们在程序里直接调用,大大提高开发速度!


想获取请求包的query string中的某个key的value,直接调用api即可,不必手动解析

想获取cookie,调用个api即可

省去了一部分工作,更加注重业务逻辑!


HTTP服务器:


根据HTTP协议解析请求报文

根据HTTP协议构造响应报文

而Tomcat提供的API,就是我们要学的第一个框架:Servelet


2. Servelet框架

在java中使用Servelet,从一个“hello world”开始!


我们需要经历7个步骤,虽然复杂,但是是固定套路

2.1 创建Maven项目

maven是一个构建工具,功能是帮助我们去构建,测试,打包一个项目~


以往我们写的代码都是简单程序,所以按ctrl shift f10直接运行即可


但是在公司中的项目不行,因为这个程序及其复杂,可能涉及很多存在依赖关系的模块,还可能会依赖很多第三方库~


因此,就诞生了一系列的构建工具,来帮你解决上述问题


Java中的构建工具:


Ant(比较老)

Maven(比较主流)

Gradle(比较新,主要是安卓生态在用)



首次使用maven项目,会从互联网上加载很多依赖,所以要保持网络通畅!

pom.xml配置文件(标签格式的文本)


这个文件就描述了maven项目的各个方面的内容


目录结构:



2.2 引入依赖

Servelet是Tomcat提供的api(第三方库,不是第三方库)


Tomcat是Tomcat,对于开发用到的api,则应该额外按照Servlet的jar包

传送门:中央仓库:Maven Repository: Search/Browse/Explore (mvnrepository.com)


选择3.1.0是跟我们的Servlet版本匹配的,不能乱选

这里可以选择下载jar包然后安装到对应目录下,当然也可以不怎么做,有更高效的方法:


复制这一段代码:



<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

粘贴到pom.xml里(写在dependancies标签内)


这个标签内可以放很多dependancy,也就是多个依赖,也就是多个第三方库


标红的话,则说明还没下载完成,点击刷新



2.3 创建目录

注意:要一字不差!




web.xml中的内容:

标红没关系,这只不过idea识别不准罢了,所以这不代表错了,当然,不标红也不代表对了

你看得别扭,alt+回车取消就行了

<!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>

2.4 写代码

如果你刚才的jar包加载成功了,那么就有了这个类

idea会提示

重写doGet方法:




doGet方法的工作就是,根据请求计算响应


而我们之前做的TCP回显服务器的基本流程就是:


读取请求并解析

根据请求计算响应

把响应写回客户端


我们只需要关注2即可,也就是这个doGet方法


这里的req就是Tomcat收到请求,把请求按照HTTP协议的格式解析成了一个对象

Tomcat本质上就是个TCP服务器,内部就是一系列的socket操作~

里面的属性,就是HTTP的各个信息

这里的resp则是响应对象,是一个“空的对象”

不是null,而是里面的属性是空的

需要我们设置进去,相当于饭盒打饭一样~

即,输出型参数

然后Tomcat就会在第三步的时候,把这个对象写回给客户端

为什么不用写main方法


这是因为Tomcat内部帮我们写了,它在合适的时机调用了我们重写的代码去计算响应~

Tomcat内部代码(伪代码):

main {
    HttpServlet servlet = new HelloServlet();//触发重写
    HttpServletRequest req = ...;//获取请求的一系列操作
    HttpServletResponse resp = new HttpServletResponse();//空响应
    servlet.doGet(req, resp);//调用我们重写的方法,这个响应就被构造好了
}


这种只需要我们参与一部分代码的编写的编写方式,就称之为“框架”(framework)


说到底,框架就是这种,按照别人规范写代码的模式

这还跟调用一些API不一样,因为API的使用还是我们主动的

使用框架就相当于进厂拧螺丝,其实并不是什么厉害的活

框架就相当于流水线~


父类中的doGet方法:


如果不重写或者不去掉super.doGet方法,你访问到的页面就是405


@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

   //super.doGet(req, resp);注释掉,或者删除

}


打印helloworld


public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doGet(req, resp);
    System.out.println("helloworld");//服务器的控制台上打印
        resp.getWriter().write("hello world");
        //给响应的对象中写入一个helloworld字符串,getWriter方法就是获取响应resp的字符输出流对象Writer,写入http响应包的body里面~
    }
}

加上注解:


在后续的操作中,这个非常重要~

注解实际上就是帮我们额外执行了一段逻辑


一般是修饰一个类或者一个方法

限制我们的编程行为,减少出错

其他…

@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("helloworld");
        resp.getWriter().write("helloworld");
    }
}

2.5 打包代码

我们的程序不能独立运行,必须部署(放置)到Tomcat上才能运行


而部署的前提,就是打包


对于一个规模很大的项目,就会有很多很多的java文件和class文件,所以我们是需要将这些class文件打成一个压缩包,再进行拷贝,是比较科学的~

java中使用的压缩包,就是jar、war

jar:普通java程序,打成jar包


war:部署到Tomcat上的程序的压缩包,Tomcat是专门识别这种压缩包的内容


本质上是没区别的,war中则有Tomcat对应的特定的目录结构(专属定制版的jar包)


打包操作:


双击package



打包操作的maven做了事情:


检测代码中是否存在依赖,即依赖是否下载好了

把代码进行编译,生成.class文件

把这些.class文件以web.xml对应格式进行打包


但是看一下里面的内容,发现是jar包而不是war包



为了打出来war包,需要调整pom.xml:



描述打出来的war包的名字:



再次重新打包:



解压jar包:



解压war包:


拖动到解压软件即可


2.6 部署

把打好的war包,拷贝到Tomcat的webapps目录里


启动Tomcat:


通过这个日志可以看出,war部署成功了的,乱码无所谓(只不过是字符集对应不上罢了)


Tomcat是utf8,Windows的cmd是gbk

后续不适用cmd,所以没关系~

自动解压缩:



2.7 验证程序

doGet运行也有前提条件,并不是Tomcat服务器启动就触发


doGet ==> 遇到一个GET请求,就执行doGet方法

也不是随便一个GET请求都能,要求请求req的URL路径要匹配~

同样的也有doPost,doXXX…

直接在浏览器地址栏输入URL,就能构造GET请求~



结果:




127.0.0.1:8080 ==> 到达Tomcat的webapps目录


/helloServelet ==> 到达我们的项目目录



/hello ==> 到达对应的Servlet(这就是我们前面写的注解里面的字符串)


因为webapp里可以有多个Servlet,自然就有多个doGet

因为我们建立的多个java文件中的类,都能继承HttpServlet~

所以需要我们确定要执行哪个doGet


打错打少都是错的:



helloworld的程序就讲完了,虽然复杂,但是套路固定!


用抓包工具抓一下:

目录
相关文章
|
6月前
|
Java 应用服务中间件 Apache
Maven程序 tomcat插件安装与web工程启动
Maven程序 tomcat插件安装与web工程启动
62 0
|
应用服务中间件
关于tomcat程序不支持图形化的解决办法
关于tomcat程序不支持图形化的解决办法
|
7月前
|
Java 应用服务中间件 API
SpringBoot项目 Tomcat部署war程序时启动成功但是访问404异常处理
SpringBoot项目 Tomcat部署war程序时启动成功但是访问404异常处理
780 0
|
SQL Java 关系型数据库
[笔记]【IDEA2020.2 Ultra】JSP+Servelt+JDBC+Tomcat Helloworld+增删改查(二)
[笔记]【IDEA2020.2 Ultra】JSP+Servelt+JDBC+Tomcat Helloworld+增删改查(二)
|
6月前
|
Java 应用服务中间件 Apache
安装和配置Apache Tomcat是部署Java Web应用程序的常见任务
安装和配置Apache Tomcat是部署Java Web应用程序的常见任务
152 7
|
6月前
|
前端开发 Java 应用服务中间件
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
|
5月前
|
Java 应用服务中间件 Linux
Tomcat安装部署[单机软件],可以让用户开发的WEB应用程序,变成可以被访问的网页,Tomcat的使用需要jdk环境
Tomcat安装部署[单机软件],可以让用户开发的WEB应用程序,变成可以被访问的网页,Tomcat的使用需要jdk环境
|
7月前
|
XML 网络协议 Java
JavaEE精选-TomCat
JavaEE精选-TomCat
42 1
|
应用服务中间件
Tomcat——通过.bat批处理程序重启Tomcat
Tomcat——通过.bat批处理程序重启Tomcat
|
SQL 关系型数据库 MySQL
CentOS部署JAVA程序、安装Tomcat以及安装导入mysql文件的方法
CentOS部署JAVA程序、安装Tomcat以及安装导入mysql文件的方法