Tomcat与Servlet

目录

[1 Tomcat](#1 Tomcat)

[1.1 目录结构](#1.1 目录结构)

[1.2 启动服务器](#1.2 启动服务器)

[1.3 部署](#1.3 部署)

[2 Servlet](#2 Servlet)

[2.1 创建项目](#2.1 创建项目)

(1)创建Maven项目

(2)目录结构

(3)引入依赖

(4)创建必要的目录结构

(5)编写代码

(6)打包

(7)部署

(8)访问


1 Tomcat

Tomcat是一种http服务器,让我们实现服务器不必从Java的TCP Socket来从头搭建服务器,而是基于Tomcat提供的API来处理请求和响应,实现业务逻辑的代码。

1.1 目录结构

下载安装好Tomcat后,其目录结构如下:

**bin:**包含了许多可执行程序,比如启动服务程序startup.bat和startup.sh,bat后缀是Windows的可执行程序,sh后缀是Linux的可执行程序,而Tomcat运行在JVM上,JVM已经实现了跨平台的特性,因此Tomcat的命令也是跨平台的多种格式。

**conf:**相关配置文件,通过修改配置文件可以满足不同模式需求。

**lib:**相关依赖库,Tomcat是基于Java实现的,运行时必须依赖相应的实现类库。

**logs:**运行时的日志文件,帮助排除异常。

**temp:**临时文件夹,不关心。

**webapps:**存放要运行的web application的文件夹,要部署网站就要把相关的web文件放入其中。

**work:**Tomcat内部进行预编译的文件夹。

1.2 启动服务器

双击bin目录下的startup.bat命令,出现下述字样说明启动成功:

如果启动失败,打开cmd,把startup.bat可执行程序拖拽到命令行中敲回车,即可查看启动日志,根据错误信息排查。

启动成功后,在浏览器地址栏输入localhost:8080(Tomcat默认使用8080端口号),出现如下界面也说明启动成功:

1.3 部署

Tomcat支持静态页面和动态页面的部署,静态页面是写死的页面,动态页面可以根据用户的输入动态变化。

所谓部署,就是把web文件复制粘贴到Tomcat的webapps文件夹下,比如把博客前端页面放入该文件夹下:

此时就可以通过ip+端口号+blog_web+页面来访问某个页面了,但是部署到本机上,没有公网ip,只有私网ip,那只能同一个局域网才能访问到页面。有公网ip就可以全网访问到页面。

如果要部署动态页面,就需要Servlet(Tomcat提供的后端API)来实现后端代码。

2 Servlet

2.1 创建项目

(1)创建Maven项目

(2)目录结构

java目录就是放java代码的地方。

resources目录放入项目依赖的资源。

webapp目录是手动创建(格式必须一模一样)的,内部放入前端资源的代码:html、css和js等等,这是项目部署到Tomcat的重要目录,而内部web.xml文件时Tomcat可以正确处理webapp中动态资源的重要依赖。

test目录则是放测试代码的地方。

pom.xml文件是Maven项目最重要的配置文件,内部除了一些重要的项目配置信息,还有自动引入依赖的作用。

(3)引入依赖

Maven中央仓库的地址在https://mvnrepository.com/,在中央仓库中搜索servlet,引入servlet 3.1版本(注意:servlet 3.1、Tomcat 8.5和Java 8是兼容的版本,选择其他版本可能出现不兼容问题)。

XML 复制代码
<!-- 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中<dependencies></dependencies>标签中,多个依赖都要粘到这个标签里面。

当前依赖还没有下载到本地,一般会自动下载,如果没有自动下载,就手动刷新(点击Maven框中的左上角)。如果没有红色,就说明依赖已经导入。

(4)创建必要的目录结构

按照(2)所示的目录依次创建必要的webapp目录、WEB-INF目录和web.xml,web.xml内容如下(一模一样):

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>

(5)编写代码

java 复制代码
@WebServlet("/hello")

public class HelloServlet extends HttpServlet {

    @Override

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

        System.out.println("hello");

        resp.getWriter().write("hello");

    }

}

1.必须继承HttpServlet,这个抽象类来源于servlet的依赖。

2.@WebServlet("/hello")注解表示只有收到/hello的请求才会执行这个类的代码(必须以

"/hello"结尾,不能作为中间路径)。

3.重写doGet方法。doGet的参数有两个,HttpServletRequest表示收到的HTTP请求,Http

ServletResponse表示要构造的HTTP响应。这个方法会在Tomcat收到GET请求时触发。

4.HttpServletRequest表示HTTP请求。Tomcat按照HTTP请求的格式把字符串格式的请求转成了一个HttpServletRequest对象。后续想获取请求中的信息(方法,url,header,body等)都是通过这个对象来获取。

5.HttpServletResponse表示HTTP响应。代码中把响应对象构造好(构造响应的状态码,head

er,body等)

6.resp.getWriter()会获取到一个流对象,通过这个流对象就可以写入一些数据,写入的数据会被构造成一个HTTP响应的body部分,Tomcat会把整个响应转成字符串,通过socket写回给浏览器。

7.没有main方法。main方法已经被包含在Tomcat里,在合适的时间执行。

(6)打包

点击package,再点击上栏绿色的运行,就可以把web程序打成包,包的名称是由把artifactId和version拼接组成:

打包成功:

默认是打成jar包(普通Java程序,只包含.class文件),而web程序需要打成war包(除了.class文件,还包含页面代码等)。

在pom.xml文件使用packaging标签指明打的是war包,finalName标签可以指明包名。再次打包:

如果出现打包失败,并且错误是Cannot access defaults field of Properties,可以尝试添加如下插件在pom.xml中:

XML 复制代码
    <build>

        <finalName>ServletHelloWorld</finalName>

        <plugins>

            <plugin>

                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-war-plugin</artifactId>

                <version>3.2.0</version>

                <configuration>

                    <failOnMissingWebXml>false</failOnMissingWebXml>

                </configuration>

            </plugin>

        </plugins>

    </build>

(7)部署

把war包拷贝到Tomcat的webapps目录下,启动Tomcat就会自动把war包解压缩。

启动Tomcat,发现war包自动解压缩为:

注意:如果修改了代码,就要重新打包部署,并且还要重启Tomcat。

(8)访问

访问http://127.0.0.1:8080/ServletHelloWorld/hello,就会给端口号为8080的Tomcat发送GET请求,从而触发doGet方法,返回hello的HTTP响应。

注意:路径的写法,8080/后ServletHelloWorld即webapps中的目录,而/hello就是doGet方法注解标识的路径。而这种直接输入URL的方式发送的GET请求,接收到的响应就会直接把body的数据渲染到页面上。要想不渲染,就需要用更灵活的方法处理请求和响应(ajax)。

下篇文章:

Tomcat与Servlet(2)https://blog.csdn.net/sniper_fandc/article/details/147278951?fromshare=blogdetail&sharetype=blogdetail&sharerId=147278951&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

相关推荐
忘梓.几秒前
从父类到子类:C++ 继承的奇妙旅程(2)
java·开发语言·c++
小杜-coding4 小时前
黑马点评day04(分布式锁-setnx)
java·spring boot·redis·分布式·spring·java-ee·mybatis
caihuayuan55 小时前
升级element-ui步骤
java·大数据·spring boot·后端·课程设计
佩奇的技术笔记6 小时前
Java学习手册:单体架构到微服务演进
java·微服务·架构
zm6 小时前
服务器多客户端连接核心要点(1)
java·开发语言
FuckPatience6 小时前
关于C#项目中 服务层使用接口的问题
java·开发语言·c#
天上掉下来个程小白7 小时前
缓存套餐-01.Spring Cache介绍和常用注解
java·redis·spring·缓存·spring cache·苍穹外卖
揣晓丹7 小时前
JAVA实战开源项目:健身房管理系统 (Vue+SpringBoot) 附源码
java·vue.js·spring boot·后端·开源
编程轨迹_7 小时前
使用 Spring 和 Redis 创建处理敏感数据的服务
java·开发语言·restful
奔驰的小野码7 小时前
SpringAI实现AI应用-自定义顾问(Advisor)
java·人工智能·spring boot·spring