Lesson9:Tomcat 和 Servlet(基础篇)

本文详细介绍了Tomcat服务器的下载安装、目录结构、启动与访问,以及Servlet的定义和部署步骤。讲解了如何在IDEA中创建Maven项目,配置依赖,编写Servlet代码,并通过SmartTomcat插件进行部署。遇到访问出错时,分析了各种错误状态码的含义及解决方法。最后,强调了Tomcat在Web应用中的角色和定位。
摘要由CSDN通过智能技术生成

目录

 一、HTTP服务器tomcat

1.1 下载安装

1.2 目录结构

1.3 启动服务器

1.3.1 启动Tomcat

1.3.2 访问Tomcat

1.3.3 部署静态页面

二、Servlet定义

我在我自己的电脑上,能否访问你电脑上的tomcat呢?

三、Servlet部署程序的步骤

3.1 创建maven项目

Q1:不是在IDEA里面直接一点三角号就可以运行了?

Q2:编译不是javac做的事情吗?  

Q3:maven如何安装?不需要,因为IDEA内置了maven

3.2 引入依赖

3.3 创建目录结构

3.4 编写代码

注意注意:代码已经不是通过main方法作为入口了

我们写个怎样的类才能被Tomcat调用呢?三个条件

3.5 打包程序

 打包过程:

3.6 部署程序

3.7 验证程序

四、使用Smart Tomcat插件部署程序

4.1 安装

4.2 配置

4.3 使用

出现错误:

五、访问出错

5.1 出现404

5.2 出现405

5.3 出现500

5.4 出现空白页面

5.5 出现无法访问此页面

5.6 总结

六、Tomcat的定位


 一、HTTP服务器tomcat

1.1 下载安装

Tomcat是一个HTTP服务器。

HTTP协议就是HTTP客户端和HTTP服务器之间的交互数据的格式。

本文使用的版本是Tomcat8。

下载网址是:Apache Tomcat® - Apache Tomcat 8 Software Downloads

zip文件下载后,最好放在一个纯英文的目录下。 

1.2 目录结构

bin目录:binary(二进制可执行程序),里面放的就是Tomcat的启动、停止程序。严格意义上说,Tomcat的启动停止程序不是二进制,而是文本,但是也在bin目录下了。

conf目录:config。Tomcat的配置文件,当前很少会修改。

lib目录:Tomcat的依赖。

logs:放了Tomcat的日志。日志就是打印的信息,能够体现程序的运行状态,后面写的程序要放到Tomcat上运行,运行过程就都在logs中被记录下了。

webapps:表示当前的Tomcat都有哪些webapp。

一个完整功能的网站,就可以叫做一个webapp。一个Tomcat上可以同时部署多个webapp。要想进行部署,就把webapp打包之后放到这个webapp目录下,Tomcat就会自动识别。

1.3 启动服务器

1.3.1 启动Tomcat

双击startup.bat,此时Tomcat就启动起来了

Tomcat是基于Java,天然是跨平台的。同样一个压缩包,在Windows上解压缩可以直接用,在LInux上解压缩,也可以直接用。

这里的乱码,暂时不做处理。乱码的原因,cmd默认是GBK,Tomcat默认是UTF8,编码不一致就乱了。 

1.3.2 访问Tomcat

通过浏览器给咱们的Tomcat服务器,发送一个HTTP请求,然后就可以看到Tomcat返回的响应了。

127.0.0.1 :主机自己的环回IP。当前的Tomcat在自己的主机上,访问的时候使用这个IP就行。如果想要访问别人的Tomcat,就得使用别人主机的IP。

8080:是Tomcat自己的端口号。 

1.3.3 部署静态页面

① 将自己的页面文件放到这个目录下,就可以利用浏览器来访问。

 这种是通过网络访问的,可以访问自己主机上的服务器,也可以访问别人的服务器。

这种是通过本地文件访问的,只能访问自己主机的文件。 

② 将html文件、css文件等放在ROOT目录下。

③ 新建一个和ROOT目录同级的目录,将html文件、css文件等放在该目录下。

二、Servlet定义

我在我自己的电脑上,能否访问你电脑上的tomcat呢?

可以,但是有一个前提,我们在同一个局域网中。要想访问一个主机,前提是知道他的IP地址。我们当前使用的IP协议,是IPv4,这个协议下的地址是一个32位,4个字节的整数,太小了,不够用。解决方案:NAT机制。分为内网IP和外网IP。多个主机公用一个外网IP。外网IP不能重复,但是内网IP只要在各自的局域网内不重复就好。

云服务器:其实是一个配置极低的电脑,买云服务器不是为了买云服务器本身,而是为了买外网IP。将Tomcat部署到云服务器上,此时其他人就都可以访问了。

静态页面:页面中显示的内容是固定不变的。

动态页面:是根据用户输入的不同,得到不同的结果。

Tomcat是支持动态页面的。动态页面中,用户输入不同,得到的结果也不同。程序员需要自己写代码,先读取用户的输入,再进行一些相关计算,得到结果后生成页面,返回给浏览器。

Tomcat提供了一组API供程序员直接使用,程序员就可以基于这个API很方便的对用户发起的请求进行处理,也很方便的返回计算结果。这组API称为Servlet。

其实以后在公司,很少用Servlet来开发后台,主要是因为他不方便。有大佬对Servlet这组API有了更高层次的封装,得到了一些功能更强大,使用更方便的框架——Spring。Spring会在后面有介绍哦!

三、Servlet部署程序的步骤

3.1 创建maven项目

Maven:是Java世界中一个非常知名的构建工具,负责编译打包代码。

构建工具,也不是只有Maven一个,Gradle和Maven齐名的,现在先只介绍Maven。

Q1:不是在IDEA里面直接一点三角号就可以运行了?

写的很多程序往往都不是在自己的电脑上运行的,需要让这个程序在指定的机器(服务器)上运行,因此,需要对程序进行打包,打包之后才方便进行部署

Q2:编译不是javac做的事情吗?  

如果程序比较复杂的时候,光一个javac是不够的。典型的,一个程序可能依赖很多的第三方库,不手动引入第三方库,此时就不能进行编译,就需要有一个程序来帮助我们管理依赖(需要哪些第三方库,就自动下载过来)

Q3:maven如何安装?不需要,因为IDEA内置了maven

 项目创建好之后,IDEA自动给我们创建了一些目录结构。下图所示的目录结构,就是一个maven项目的典型结构。

3.2 引入依赖

借助maven管理第三方依赖,直接将依赖的第三方库放到pom.xml即可。

下载第三方库的方式有:去第三方库的官网、去第三方库的github上下载、去中央仓库下载。前两种都比较麻烦,推荐第三种方式。maven中央仓库有很多,https://mvnrepository.com/

本文使用这个中央仓库。

点进去后,发现有很多版本,选择3.1.0版本即可。

​ 一个项目里会有多个依赖。每个依赖放到一个dependency标签里面,所有依赖放在dependencies标签里。

 将这个代码片段粘贴进来之后,maven就会自动地从中央仓库下载依赖的jar包到本地,同时引入到我们的项目中。

第三方库下载的位置?

如何引入依赖后一直标红,怎么办?

way1:手动刷新

way2:手动刷新很多遍还不行?

可能是因为网络不太好,将3.1.0这个目录全删了,重新下载试试。 

3.3 创建目录结构

web项目对于目录结构有自己的要求,只有maven生成的目录是不够的。还需要手动创建一些出来。

web.xml非常重要,是tomcat能够识别这个动态页面的入口文件 。如果web.xml出了差错,就无法在Tomcat上进行部署。

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>

3.4 编写代码

1.构建一个类继承自HttpServlet。

2.加注解@WebServlet

3. 重写HttpServlet的doGet方法。

这个方法就是收到请求后,根据这个请求执行业务逻辑,将结果构造成响应对象。

HTTP请求的解析、HTTP响应的构造,这些都不需要写,Tomcat都写好了。咱们直接使用的就是两个对象:

HttpServlRequest:请求。Tomcat将收到的HTTP请求解析成这个对象。

HttpServletResponse:响应。这个是Tomcat要给浏览器返回的响应对应的对象。

// 这个注解,就是告诉Tomcat,如果收到的请求中中的URL路径带有/hello,就调用HelloServlet这个类来处理
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       // super.doGet(req, resp); //super父类实例的引用,调用父类的doGet,没啥用,删掉
        // 给响应的body里面写一个helloservlet这样的字符串,Tomcat就会自动把这个响应返回给客户端
        resp.getWriter().write("hello Servlet");
    }
}

注意注意:代码已经不是通过main方法作为入口了

main方法已经包含在Tomcat里,我们的代码会被Tomcat在合适的时机调用起来。此时写的代码并不是一个完整的程序,而是Tomcat这个程序中的一小部分逻辑。

我们写个怎样的类才能被Tomcat调用呢?三个条件

继承自HttpServlet

使用@WebServlet注解关联上一个HTTP的路径

需要实现doXXX方法。条件,Tomcat就可以找到这个类,并且在合适的时候进行调用。

满足这三个

3.5 打包程序

①修改pom.xml,加入一些必要的配置。

<!--    打包的类型,Java的压缩包一般都是jar包;部署到Tomcat时,一般用的时war包-->
    <packaging>war</packaging>
<!--    压缩包的名字-->
    <build>
        <finalName>helloservelt</finalName>
    </build>

②执行打包程序

 打包过程:

先删除上次打包得到的一些文件

检查依赖的第三方库是否被下载好,如果没好就会尝试下载。

编译java代码,得到.class文件

整理输出的目录结构,将.class和其他文件放到合适的目录里

打出一个war格式的压缩包

如果依赖下载失败,或者代码存在编译错误,这里都会体现出来。出错要认真看错误提示呦!!! 

3.6 部署程序

war包拷贝到Tomcat的webapps目录中就可以。

一般不需要重启 Tomcat,Tomcat能够自动识别出war包并且进行解压缩和部署操作。然后就可以通过浏览器来访问刚才部署的内容了,偶尔Tomcat可能也识别不出来war,就得手动重启一下服务器.。(一般windows上的tomcat会有这个问题, Linux上一般都是好着的)。

 启动 Tomcat , Tomcat 就会自动把 war 包解压缩。

3.7 验证程序

通过浏览器来访问我们当前这个Servlet生成的动态页面。

 ​ 

 hello1:这个路径称为Content Path,就表示一个webapp(网站)。

hello:这个路径称为Servlet Path,标识网站中的一个页面。

一个Tomcat上可以同时部署多个网站(webapp),每个网站(webapp)又可以有多个网页(servlet)。

一旦这里的路径不匹配就会出现404。

注意!!!URL中协议是http而不是https。

四、使用Smart Tomcat插件部署程序

手动拷贝war包到Tomcat的过程比较麻烦。可以使用IDEA中的Smart Tomcat完成这个工作。

4.1 安装

菜单 -> 文件 -> Settings-Plugins

安装SmartTomcat。

4.2 配置

配置好,点击apply就可。 

 使用 Smart Tomcat 部署的时候, 我们发现 Tomcat 的 webapps 内部并没有被拷贝一个 war 包,
也没有看到解压缩的内容.Smart Tomcat 相当于是在 Tomcat 启动的时候直接引用了项目中的 webapp 和 target 目录.

4.3 使用

如果Tomcat启动失败,检查自己是否同时运行了多个Tomcat。 

出现错误:

 注意:HTTP请求解析错误的进一步发生将记录在DEBUG级别。
    java.lang.IllegalArgumentException: 在方法名称中发现无效的字符串, HTTP 方法名必须是有效的符号.
  at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:434)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:513)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:881)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1647)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

解决方案:将https改为http

五、访问出错

5.1 出现404

标识用户访问的资源不存在,大概率是:

①URL中的路径写的不正确。

检查Content-Path和Servlet Path是否漏写以及这两个是否和URL对的上

②web.xml写错了。

如果web.xml写错了,就会引起Tomcat不能识别webapp,也就无法找到对应的资源了。检查web.xml所在的目录名字、文件名字、所在的位置、文件内容

5.2 出现405

对应的HTTP请求方法没有实现。

①通过GET方法来访问服务器,但是在Servlet中没有实现doGet。

在这种情况下。默认执行的是父类的doGet方法。在父类的doGet方法中,啥都没干,只是返回一个405的错误页面。

②写了doGet,但是忘记删除super.doGet(req, resp)。

5.3 出现500

往往是Servlet代码中抛出异常导致的 

5.4 出现空白页面

是否正确的往resp中写数据了,检查resp.getWritter().write()的内容。

5.5 出现无法访问此页面

没有正确的访问到Tomcat,可能是Tomcat没启动,也可能是IP / 端口号错了

①注解中应该写作 "/servlet path",不是"servlet path"

 Tomcat 在启动的时候已经提示了相关的错误。Tomcat 启动的日志里面报错信息可能比较多, 需要耐心观察, 找到关键的提示.

5.6 总结

①4xx 的状态码表示路径不存在, 往往需要检查 URL 是否正确, 和代码中设定的 Context Path 以及
Servlet Path 是否一致.

②5xx 的状态码表示服务器出现错误, 往往需要观察页面提示的内容和 Tomcat 自身的日志, 观察是否存在报错.

③出现连接失败往往意味着 Tomcat 没有正确启动, 也需要观察 Tomcat 的自身日志是否有错误示.

④空白页面这种情况则需要我们使用抓包工具来分析 HTTP 请求响应的具体交互过程.

六、Tomcat的定位

 ①Tomcat和浏览器进行交互,交互手段就是HTTP协议。

②Tomcat的工作就是解析HTTP请求,将请求的代码交给Servlet的代码进行下一步处理。

③Servlet的代码根据这个请求计算得到响应对象,在这个过程中,也会和数据库打交道。

④Tomcat把这个响应对象,构造成HTTP响应,返回给浏览器。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘减减

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值