目录
基于Tomcat对Servlet进行部署
以下将会通过七个步骤,以打印“hello”为例,对Servlet进行部署;
使用工具(这是配套使用的方案!):idea2021或2020,jdk 8,Java Servlet API 3.1.0版本,Tomcat 8.5;
一、创建项目
首先,需要创建一个maven项目(这里建议使用idea社区版2021或2020,因为2022版本创建maven项目变化比较大);(如下图)
项目创建好后,可以看到目录结构(如下图)
解释:
- main文件里主要存放业务代码;
- resources存放代码需要的依赖资源(暂时不用);
- test测试代码;
- test下的java文件是项目的“阵眼”,是全局配置文件,有很多关于项目相关属性的配置;
为什么要使用maven来构建项目?
以前写的代码,都是在idea中的main方法里直接点击运行即可,针对简单的程序还可以,但对于有多个模块,病区相互依赖的程序来说,使用maven,就方便了我们进行编译和打包操作;
二、引入Servlet依赖
Servlet不是java标准库自带的,所以需要下载Servlet依赖;(maven的一个核心功能就是能自动管理依赖:把使用库中依赖的东西,自动从中央仓库中下载下来)
打开中央仓库搜索servlet:(如下图)
地址:Maven Repository: Search/Browse/Explore (mvnrepository.com)
选择第一个API:(如下图)
选择3.1.0版本(如下图):
选择maven,复制里面的内容(如下图)
返回idea,打开pom.xml,手动写下这个标签(如下图),把刚刚复制的内容粘贴到这个标签里
解释:
这时候idea就会自动根据你刚刚粘贴进去的内容,去中央仓库下载依赖,依赖下载完成之前,这里是标红报错的,等待他下载好之后,就手动刷新一下(如下图);
三、构建目录结构
根据Tomcat要求的目录,咱还需要添加点东西(如下图)
注意:一定要注意命名,严格按照下图格式!
web.xml中需要写点东西,写的内容不用记,直接复制,这部分内容是固定的,Tomcat会识别他,所以不能没有;
这里给出代码(直接复制就可以):
<!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>
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >这个是schema文件,描述了你的xml中都允许写哪些节点,结点间的层次关系,那些属性是合法的;
作用:验证 + 补全;
如果这里标红报错了,之影响以上作用,但是咱目前来说用不上,但是如果实在不限看到标红,可以alt + enter;
四、编写代码
将代码放到java目录下(也可以创建一些package)如下图:
将创建好的这个公开的类里继承HttpServlet;(这是刚才通过maven下载的servlet的jar包);
根据请求计算响应——写下doGet方法:(如下图)
doGet方法是什么?
doGet就表示,当Tomcat收到GET请求时,就会调用到此方法;
扩展:
这里还有很多函数,写doGet函数,就表示使用GET方法,写下doPost函数,就会使用Post方...
HttpServletRequest req是什么?
这是Tomcat的请求报文,将他解析成一个对象了;
HttpServletResponse resp 是什么?
这是Tomcat构造的一个空的对象,就是根据请求所要计算的响应,resp相当于“输出型参数”,doGet就需要根据req 的数据 + 业务逻辑构造出一个完整的resp对象;最后Tomcat就把resp对象转化成Http响应报文;
接下来,还需要在此方法之上,加一段代码(如下图):
解释:
表示当GET请求并且url里的路径是/hello请求的时候,Tomcat才会调用到这里的doGet方法;所以我们在请求中写不同的路径,就会关联上不同的类,也就会执行不同的方法;
修改这个方法里的内容(以打印hello为例):解释都在注释里
@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");//在Tomcat这里打印日志
resp.getWriter().write("hello");//给客户端返回hello
}
}
解释:为什么一定要删掉 super.doGet(req, resp) 这段代码?
这是为了防止程序员忘记写对应的重写方法专门弄的一个保险;
当代码中有 super.doGet,然后你在写下计算的响应代码,而 super.doGet 中引用父类的方法已经有默认的响应(响应是用 resp.sendError,
此方法将抛出illegalstateexception。使用此方法后,应将响应视为已提交;简而言之就是一个检查机制,检查你是否忘记写重写方法),你接着又写了一次响应,就相当于有两次响应,所以若不删除这段代码,你会得到了非法的状态异常。
五、打包程序
打包是干什么的?
需要将缺失的依赖下载好,然后编译所有的.java文件,得到一堆class文件,再将.class压缩到一个压缩包中;
Servlet程序是怎么跑起来的?为什么要打包?
以前所写的Java代码中,都包含main方法,这就相当于一个带发动机的火车车头,剩下的java代码就是车厢;在Servlet的代码中,Tomcat就是带发动机的火车车头,Servlet代码就是车厢,打包就是将写好的代码挂在车头后面~
具体做法:直接使用maven打包(如下图)
双击后,结果如下:
问题:
虽然成功的打包出了jar包,但是tomcat不认识,因为tomcat是要求压缩包的格式为war包!
jar包和war包有什么区别?
最主要的区别就是,war包会将整个webapp的目录都打包进去,包括web.xml,以及外来的一些静态html、css等;
解决办法:修改pom.xml,在其中写下如下代码:
最后在点击一次打包,就可以观察在target中看到我们所需要的文件了(如下图)
六、部署程序
将war包拷贝到Tomcat的webapps中;
保存到(如下图目录)
最后运行你的Tomcat,就可以发现,你的war包会自动解压缩;
七、验证程序
通过浏览器构造一个HTTP请求,访问Tomcat服务器;
可以观察到如下结果:
这样就成功啦~
基于Smart Tomcat对Servlet进行部署
实际上,对于以上的七步,还可以进行优化:第五第六步是可以“一键式”打包和部署,使用IDEA社区版,可以使用第三方的Smart Tomcat插件来完成;
第一步:下载Smart Tomcat插件
第二步:进行相关配置
注意:
Context path是网络路径,这相当于将webapp映射成了 Context path;
第三步:运行配置
一键式的完成打包部署;(实际上,就是让idea直接调用tomcat,并且加载写的servlet程序);(如下图)
第四步:确认部署是否成功
注意:
这里标红不要害怕,不是报错,Tomcat的日志信息就是这样的颜色,看到startup in xxxms就表示成功了;
第五步:验证程序
Tomcat的运行方式
1.直接在startup里运行,手动拷贝war包;
2.Smart Tomcat直接通过java代码,调用tomcat的jar包运行,不需要调用的时候指定tomcat加载哪个webapp;