目录
Servlet是Tomcat提供给Java程序猿的一组API,用来帮助程序猿简单高效的开发webapp,构建动态页面。
静态页面:内容始终固定的页面,即使访问用户不同/访问时间不同/输入的参数不同,页面的内容也不会发生变化,例如Tomcat的欢迎页面:
动态页面:和静态页面相对的页面,当访问的用户不同/访问的时间不同/输入的参数不同时,页面的内容会发生变化,例如B站的主页:
使用Servlet写一个简单的“hello world”代码需要分为以下七个步骤:
(本文以Idea2021.3.2版本为例,新版的Idea可能有所不同)
(1) 打开Idea创建一个Maven项目:
(2) 选择项目要存放的目录:
(3) 项目创建成功的样子:
Maven是Idea内置的一个构建工具,可以用来编译代码、打包程序、管理依赖……
Servlet并不是Java标准库自带的,我们需要在刚才创建的项目中生成的pom.xml文件中引入Servlet依赖的jar包。
(1) 在Java中央仓库:Maven Repository: servlet (mvnrepository.com)搜索servlet,选择第一个结果:
(2) 选择3.1.0版本
Servlet的版本要和Tomcat的版本匹配,如果Tomcat是8.5版本,那么就需要使用Servlet3.1.0版本。
查询版本对应关系:Apache Tomcat® - Which Version Do I Want?
(3) 在pom.xml文件中创建一个
(4) 把中央仓库的Maven里的内容复制到
修改后的pom.xml文件:
注意:如果是第一次使用maven,那么这里面的部分代码会变成红色的,maven会根据代码的内容,自动下载项目依赖的jar包到本地,下载完成后刷新一下就好了。
如果下载好之后代码还是标红,那么就需要根据报错的信息在网上搜索解决的方案。
当项目创建好之后,Idea会自动生成一些目录:
其中:
src:表示源代码所在的目录;
main/java:表示业务代码的根目录,后续创建的.java文件就放在这个目录中;
main/resources:表示项目的一些资源文件所在的目录;
test/java:表示测试代码的根目录;
pom.xml:表示项目中的“阵眼”,全局配置文件,存放项目相关的配置属性。
但这些目录还不够,还需要创建一个符合Tomcat要求的目录结构:
(1) 在main目录下,创建一个webapp目录:
(2) 在webapp目录下,创建一个WEB-INF目录:
(3) 在WEB-INF目录下,创建一个web.xml文件:
注意:不要把文件名写错,Tomcat要识别web.xml这个文件。
(4) 编写web.xml
往web.xml中拷贝以下代码:
- 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 Applicationdisplay-name>
- web-app>
(1) 在main/java目录下创建一个类,并继承HttpServlet类:
HttpServlet类来自于刚才通过maven下载的Servlet的jar包,如果这里的HttpServlet类标红,手动刷新一下就好了~
(2) 重写父类的doGet方法:
req对象是HTTP请求报文,被Tomcat解析成了一个对象;
resp对象则是Tomcat构造的一个空的对象,doGet方法会根据req里的一些数据和具体的业务逻辑来构造生成一个完整的resp对象(所以resp相当于一个“输出型参数”),然后Tomcat再把resp对象转换成HTTP响应报文。
(3) 加上@WebServlet注解
加上注解后,表示Tomcat在收到的GET请求中,找到路径为/hello的请求时才会调用Hello类中的toGet方法。
我们当前写的代码中是没有main方法的,要想让代码跑起来,需要把当前代码打包起来放到Tomcat中就可以跑起来了~
(1) 点击Idea右侧的Maven按钮,展开Lifecycle,找到package选项:
(2) 双击package选项,出现BUILD SUCESS表示打包成功了:
此时左侧会生成一个target目录,里面会包含一个jar包:
但是Tomcat需要识别的是war包格式,所以我们需要重新打包出一个war包:
jar包和war包的区别:
jar包是普通的java程序打包的结果,里面会包含一些.class文件;
war包是java web的程序,除了包含.class文件外,还会包含HTML,CSS,JS,图片以及其他的jar包,打包成war包才能被Tomcat识别。
(3) 在pom.xml中新增一个
<packaging>warpackaging>
(4) 在pom.xml中新增一个
- <build>
- <finalName>HelloServletfinalName>
- build>
完整的pom.xml文件:
(5) 重新使用maven的package打包就会生成一个war包:
(1) 把刚才打包的war包拷贝到Tomcat的webapps目录下:
(2) 启动Tomcat,把war包解压缩,此时会生成一个新的目录:
此时,在浏览器地址栏中输入:127.0.0.1:8080/HelloServlet/hello时就可以看到结果了:
在上面的URL中,/HelloServlet目录又称为ContextPath,/hello目录又称为ServletPath
(1) Tomcat通过ContextPath可以确定一个webapp,然后就会加载该目录下所有的类,重点识别出被@WebServlet注解的类;
(2) 然后根据ServletPath找到注解为/hello的类,找到类之后,就会创建一个类的实例(只会创建一次,如果之前创建过了,就会复用之前的实例);
(3) Tomcat再解析出HTTP请求的方法“GET”,根据HTTP请求的方法来调用类中对应的toGet方法。
GET请求调用toGer方法;POST请求调用toPost方法;PUT请求调用toPut方法……
上述第5步和第6步操作比较繁琐,并且只要代码中有一点改动,都需要重新执行打包程序和部署程序的操作,我们可以在IDEA上安装一个Smart Tomcat插件来优化这些操作:
(1) 打开IDEM,依次点击左上角的File、Settings:
(2) 在Settings对话框中选择Plugins、Marketplace,然后搜索smart tomcat,最后点击Install即可。
(1) 点击右上角的Add Configurations:
(2) 在弹出的对话框中点击左上角的+号,然后选择刚才下载的Smart Tomcat:
(3) 在弹出的对话框中进行如下设置(红色框中的内容是需要修改的,其余部分不变):
(4) 点击OK之后,右上角就生成了一个运行配置:
(5) 点击右上角绿色的三角符号,就可以一键式完成打包部署操作(让IDEA调用tomcat,并加载刚才写的Servlet程序):
出现这样的页面就说明操作成功了,此时就可以打开浏览器查看程序运行结果:
注意:使用Smart Tomcat进行一键式打包部署操作时,需要关闭控制台的Tomcat,否则会出现下面这种错误情况:
因为控制台中运行的Tomcat已经占用了8080(业务端口)和8005(管理端口)端口号,由于同一个端口号不能被多个程序绑定,所以当我们使用Smart Tomcat调用Tomcat时就会绑定端口失败。
404表示用户访问的资源不存在,如果出现404,很可能是URL写错了。
(1) 首先检查一下URL是否写错:
① 检查URL中是否写了Context Path;
注意:Context Path有两种情况:
(a) 如果是使用startup.bat的方式启动Tomcat(即控制台的方式),此时Context Path指的是webapps中的webapp目录名(即一开始打包的war包名)。
(b) 如果是使用Smart Tomcat的方式启动Tomcat,此时Context Path指的是配置Smart Tomcat时手动填写的。
② 检查URL中是否写了Servlet Path;
③ 检查Servlet Path和@WebServlet注解中的路径是否一致;
(2) 查看web.xml文件中的内容是否写错。
如果web.xml中的内容写错了,也会出现404错误。
如果出现405,则表示对应的HTTP请求方法没有实现。
例如HTTP请求的方法是GET,但是代码中没有doGet方法:
(在浏览器地址栏中直接输入一个URL,就会发送一个GET请求)
如果出现500,一般是Servlet代码中抛出了异常。
例如,修改当前doGet方法:
重新访问页面:
页面中会提示当前代码中抛出了什么异常,以及是在哪一行抛的异常。
这种情况一般是Tomcat启动失败。
例如在没有运行Tomcat的情况下访问页面:
如果出现空白页面,说明响应为空。
例如,注释掉 resp.getWriter().write("hello") 这行代码:
重新访问页面: