Servlet (简单的servlet的hello world程序)
Servlet
servlet在20年前左右,是网站开发的一种主力技术.
现在随着时间的推移,Java这个圈子中,逐渐使用spring代替了servlet.现在讲servlet,目的有两个方面.
1.spring作为一个框架.底层仍然是需要调用servlet里的一些api的,包括熟悉servlet有助于理解spring工作原理.包括spring有些接一口也会暴露出servlet的一些影子.
2.学习servlet,不仅仅是学习servlet api本身,更主要的是学习"web开发"这件事情(为了开发一个网站,你需要做哪些事情).
页面主要分为静态页面和动态页面.静态页面就是你无论什么时候,打开这个页面,他都是一成不变的.而动态页面,往往是在请求发起的时候,由服务器通过一系列运算,动态生成的页面.
servlet主要解决的问题,就是为了实现动态页面.
简单的servlet的hello world程序
1.创建项目
这里需要创建一个Maven项目
这一组现在用不到,但是如果你要把你先的程序放到Maven中央仓库上,就需要通过这几个属性来做区分.联合到一起,就相当于一个 库 的身份标识.
2.引入依赖
当前的代码要使用servlet开发.而servlet并不是Java标准库自带的.就需要让Maven能够把servlet的依赖给获取过来.
需要先找到Maven中央仓库.
选择这个版本.
servlet的版本,和Tomcat的版本是有对应关系的.Tomcat使用8,servlet就是3.1,如果不匹配就可能出现问题.
我们将servlet引入到Maven里面.先手动创建一个标签,把刚才的坐标复制到这个标签里.此时idea就会自动的通过Maven从中央仓库来下载这里的依赖.
如果等了很久还不行,可以点击这里的刷新,手动重新下载
首次使用,是最慢的,后面就快了(首次使用需要加载不少的依赖)下载的过程是需要下载时间的.
3.手动创建一些必要的目录/文件
Tomcat对于servlet项目,是有一些额外要求的.Maven是一个通用的工具,可以管理的不仅仅是servlet项目,还可以管理其他的项目.在这个基础上,在按照servlet项目的要求,创建出一些特定的目录和文件.
目录结构和名字都是固定的.
web.xml就是告诉Tomcat,我现在这个目录里的东西就是一个webapp,你就要把我加载起来.
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>
这个意思是:统一资源标识符没有注册,解决方法就是将这个标识符手动添加到idea中
(这里的标红并非是报错,不影响后续程序的运行.)
1.复制红色部分的代码
file --> settings- -> languages & frameworks -->Schemas and DTDs
解决
这个文件叫做schema文件,描述了该xml里面的格式是怎样的.(哪些标签是合法的,哪些不合法,如何进行嵌套等)idea拿到这个文件,就可以针对你的xml进行代码补全了.
4.编写代码
这个类,是前面的servlet的jar包,提供的父类.编写servlet程序一般都需要继承这个类.
继承不是目的,真正的目的是为了重写父类的方法
req:代表这次请求的http请求内容.
resp:代表这次请求要返回的http响应内容.
这个方法不需要咱们手动调用,doGet本质上也是一个"回调函数"把这个方法写好之后,就会交给Tomcat,Tomcat在收到一个合适的GET请求的时候就会自动调用doGet.调用doGet的时候,Tomcat就会解析这次的http请求,生成一个HttpServletRequest对象.(这个对象里的属性什么的都是个http协议格式匹配的)相当于Tomcat帮我们吧http请求给解析好了.同时,Tomcat也会构造出一个空的 HttpServletResponse 对象(这里的空不是指 null 而是一个new好的但是没有初始化属性的对象),把这个resp对象也会传递到doGet里面.doGet要做的事情,就是根据这次的请求(req),计算出响应(resp).doGet里面的代码,就要根据req里不同的参数的细节,生成一个具体的resp对象(往空的对象里设置属性)Tomcat就会根据这个响应对象,转换成符合HTTP协议的响应报文,返回给浏览器了.
总而言之,doGet就是根据请求计算响应.
在之前写echo server的时候,一个服务器,典型的工作流程就是三步.
1.读取请求并解析
2.根据请求计算响应
3.把响应写回到客户端
以上三个步骤体现了服务器的业务逻辑,1,3都是相对固定的操作.在Servlet这块,1,3都是Tomcat帮我们完成的.咱们写代码就只需要关注2,也就是doGet要完成的工作.
注意:这行代码一定要删除掉,否则会有问题.
我们还需要手动打上这个注解,这个注解就把当前这个Servlet类,和一个请求的路径关联起来了.(配置路由)
Tomcat会在合适的时机,自动调用doGet.
1.请求的方法,是否是GET
GET=>doGet
POST=>doPost
PUT=>doPut
...
2.请求的路径.URL后面带有层次结构的路径.
一个Servlet程序里,可能有多个servlet类的.这些servlet类,就需要在不同的情况下被执行到了
当请求的路径中带有hello的时候,才能执行到咱们这个HelloServlet的代码.不同的Servlet类,就可以关联到不同的路径.
至此,helllo word程序就写完了.
Servlet程序,不需要main方法.一个程序,是需要有main方法作为入口的.实际上,咱们在这里写的这个代码,并不是独立的程序.而是放到Tomcat上执行的.main方法其实是在Tomcat里的,咱们写的这些doGet之类的都是让Tomcat来调用的.
5.打包程序
咱们得程序是放到Tomcat上运行,就需要对程序进行打包,打成一个Tomcat能够识别的报的格式,此时代码才会被Tomcat给加载起来了.
同时"打包"也是借助Maven完成的.

这个就是打包选项
只要出现SUCCESS,那就成功了,注意,首次打包会很慢很慢.
打包成功之后
在左侧会出现target,里面可以看到实际上我们是将代码打包成一个jar包了,但是Tomcat要的不是jar包而是war包.war包本质上和jar包差不多,war包中会包含一些前端的代码(html,css,js),以及一些Tomcat的配置(web.xml)
下面的finalName设置的是打出的war包的包的名字(改名字不是必须的)
6.部署
部署的前提是Tomcat是运行的.
将war包复制到Tomcat的这个目录下
若你的Tomcat处于运行状态下,那么Tomcat就会对这个war包进行解压缩
同时Tomcat中也会多出来几行日志,这就是发现了新的war包,对这个war包进行部署.
7.验证程序是否可以正常工作
通过浏览器发起http get请求,触发刚才servlet的代码.
其中在这里,application path : webappTest
就是war包解压出来的文件名字
servlet path : hello
是这里的路径
通过第一级路径来确定一个webapp
通过第二级路径确定哪个servlet
通过方法确定执行servlet中的哪个方法
此时在页面上就展示出了hello word
这行代码的功劳.
注意如果出现Tomcat正常运行但是浏览器正常转圈.
只需要在Tomcat里面敲几个回车就出来了.
原因:之所以有这种情况,是因为CMD在搞鬼
通过上述七个步骤,hello word 就写完了.
如果需要修改代码,就需要重复上述 5 6 7,是比较麻烦的.当然了,也有大佬想出了办法,可以让我们简化这个修改的过程.让idea和Tomcat集成起来.直接使用idea图形化界面把你的代码部署到Tomcat上达成"一键式打包&部署"过程.
在idea中安装SmartTomcat插件.
在一个项目中,第一次使用,需要配置一下
下面配置一下名字以及ContentPath的名字,以及找到你当前电脑上Tomcat的路径即可
运行结果
但是不要去点击那个链接,此处只是提示你contextPath是什么.而且之前的乱码问题没有了.