本文主要介绍了如何在tomcat部署一个webapp 以及 如何借助maven用servlet编写一个hello world .
Tomcat是一个Java里广泛使用的http服务器
HTTP服务器有很多实现,其中最知名的是Nginx;而在Java里,最知名的是Tomcat
一个Tomcat服务器上可以部署多个网站 ; 后续学习的servlet,就是依赖tomcat
Apache
apache最早是一个开源的http服务器,后来吸引了很多开源开发者,,这些人构成了一个名为apache的社区,这个社区做了很多知名的程序,Tomcat就是其中一个
tomcat自身也是使用Java写的(跨平台),所以要想运行Tomcat的前提是电脑上必须有jdk!!
>Tomcat目录
>bin(binary二进制 )
一般是可执行程序(有一些jar包,也有一些脚本文件)
注意框出的这两个文件:
bat后缀:windows上的批处理脚本,在windows上运行这个文件,就可以启动tomcat
sh后缀:linux上的shell脚本,在linux上运行这个文件,就可以启动tomcat
脚本:也就是编程语言,描述了先做什么再做什么.
有的工作需要多个命令配合执行,就需要使用脚本把多个要执行的命令串起来
>Conf(configuration配置)
放了tomcat的配置文件
Server.xml是最主要的配置文件,使用xml格式
很多程序都有配置文件,通过配置来开关/选择/设置某个功能
>lib
都是jar包,也就是tomcat程序运行过程中会使用的内容
>Logs
tomcat的日志文件
>webapps
放网站,把网站放在这个目录下,就可以加载运行这个网站
>双击bin目录下的startup.bat
乱码怎么办?
乱码原因 : tomcat使用的是utf8,而windows cmd默认是gbk
但是改编码方式还是不好操作的,所以当前就凑合用,后续使用idea中的终端来展示tomcat日志就可以避免乱码了
闪退怎么办?
多半是因为没有找到jdk路径
找原因:把startup拖到cmd中,出错就不会闪退,而是会告诉报错信息,根据错误信息配置环境变量即可
环境变量:操作系统维护的一种变量,往往是用于多个进程相互配合的时候,
有一些数据需要交互,就可以使用环境变量(本质上也可以认为是一种进程间通信的手段)
当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。
服务器:
* 可能是服务器主机:就是一个电脑,在上面运行着服务器程序,保持开机
* 可能是服务器程序:就是一个程序,绑定了一个端口号,客户端就可以通过ip+端口给服务器发请求
启动服务器,目的就是为了让客户端来对服务器发起请求 ; http服务器的客户端就是浏览器
tomcat默认端口是两个8000,8005(一个服务器可以绑定多个端口)
* 8000是业务端口,http请求就应该发到这个端口上
* 8005是管理端口,则是进行一些管理上的操作
服务器启动之后,我们在浏览器上输入:127.0.0.1:8080就可以访问到tomcat的欢迎页面!
我们可以给tomcat部署一个简单的webapp
在webapps目录下新建一个文件夹,文件夹中有一个简单的html页面
1.直接双击这个html文件,相当于通过浏览器直接访问磁盘文件打开的网页
2.通过网络的方式访问
通过网络的方式访问:是可以跨主机的。
tomcat对于Java有一定的支持,方便程序员编写后端的程序,比如他提供了一系列的api接口,这些api背后已经把一些基础的工作做好了,java程序员只要调用上述api通过少量的代码,就可以完成基本的http服务器的核心功能
tomcat把这组api称为Servlet
20年前是网站开发的一种主力技术;现在已经逐渐被spring代替了
虽说如此,Servle仍然有学习的价值,因为
1.spring作为一个框架,底层仍然是需要调用servlet里的一些api
熟悉servlet有助于理解spring工作原理 ; 包括spirng有些接口也会暴露servlet一些影子
2.学习servlet,不仅仅是学习servlet api本身,更主要是学习web开发!
动态页面 静态页面
* 静态页面:页面内容始终不变(这种已经比较少了)
* 动态页面:页面结构相似,但是页面内容是不同的 , 往往是在请求发起的时候,由服务器通过一系列运算,动态生成的页面
servlet主要解决的问题就是为了实现动态页面
难点:编写一个最简单的servlet的hello world!
我们创建一个maven项目 ( maven是一个构建工具 )
程序编写过程中,往往涉及到一些第三方库的依赖,另外需要针对程序打包部署 , 这两个工作我们可以交给maven来完成 !
maven的意义:方便的进行依赖管理和打包
当前的代码要使用servlet开发,而servlet并不是java标准库自带的,所以就需要让maven能把servlet的依赖获取过来
>先找到maven的中央仓库 , 复制对应版本的servlet依赖
https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api
servlet的版本和tomcat的版本是对应的 , 根据自己的tomcat版本下载对应的servlet版本( 具体对应表百度一下~)
Tomcat8使用servlet3.1
>手动创建一个依赖标签,把坐标复制进去,此时idea会自动通过maven从中央仓库下载这里的依赖 (第一次进去可能是红的,因为没下载完,此时也可以手动刷新)
tomcat对于Servlet项目,是有一些额外的要求
maven可以管理的不仅仅是servlet项目,还有其他的 , 因此对于servlet项目,可以创建出一些特定的目录/文件
web.xml内容固定,只需要从别的项目复制就行 , 下面是一个范例:
这个方法不需要手动调用
doget本质是一个回调函数
把这个方法写好之后就会交给Tomcat,tomcat在收到一个合适的GET请求就会自动调用doget
调用doget的时候,tomcat就会解析这次HTTP请求,生成一个httpServletRequest对象
这个对象的属性啥的都是和http协议格式匹配的(相当于tomcat帮我们把http请求解析好了)
同时,tomcat会构造出一个空的HttpServletResponse 对象, 这个对象也会传递到doget里面 ;
doget所做的事情 : 根据这次请求,计算出响应;
doGet : 根据req里不同的参数的细节,生成一个具体的resp对象(往空对象里设置属性)tomcat根据这个响应对象,转换成符合http协议的响应报文,返回给浏览器了
Tomcat在合适的时机自动调用doGet
1.请求的方法,是否是GET
一般来说不同的请求方法,在Servlet也会有对应的方法
2.请求的路径 url后面带有层次结构的路径
一个Servlet程序里,可能有多个Servlet类 ; 这些Servlet类,就需要在不同的情况下被执行
添加这个注解:
当请求的路径中带有hello时,才能执行到HelloServlet的代码,不同的Servlet类就可以关联到不同的路径 ! ! !
总结:
doget要做的事情,就是根据请求计算响应
疑问:
为什么不需要main 方法?
Servlet程序,不需要main方法
实际上,main方法其实是在tomcat里面,我们写的doGet方法都是让tomcat调用的
程序需要放到tomcat上运行,就需要对程序进行打包(达成一个能被tomcat识别的格式)
打包,也是借助maven完成的.
Maven -> LifeServlet -> 双击package
>打包成功
>查看
maven中默认打包方式生成的是jar包(里面就是一些.class文件)
但是tomcat需要的是war包(本质和jar差不多,里面会包含一些前端代码/tomcat配置) , 所以需要在pom.xml里面修改一些东西
>修改之后再重新打包
>war包生成成功,查看
把这个war包放到webappa里面
可这个war包复制到tomcat的webapps目录下,tomcat就会识别并且自动对这个war包进行解压
通过浏览器发起http get请求,触发刚才的servlet代码
在浏览器输入以下这个路径:
* java108test:称为context path/application path ,用来区分一个webapp
* hello: servler path , 和@WebServlet注解是对应的
通过上述七个步骤,hello world就编写完了 !
注意:
如果浏览器一直转圈圈,很有可能是cmd的问题
总结上述步骤:
看起来还是比较麻烦的 , 好在上述的过程spring做出了简化的效果 !