【JavaEE】Servlet
努力经营当下,直至未来明朗!
文章目录
- 【Servlet】1.0
- Servlet概述
- 写一个Servlet程序
- 1. 创建项目
- 2. 引入Servlet依赖
- 3. 创建目录结构
- 4. 编写代码
- 5. 打包程序
- 6. 部署程序
- 7. 验证程序
- 【Servlet 2.0】
- 访问出错
- 【小结】
追求想要的一定很酷!
【Servlet】1.0
Servlet概述
- Servlet就是Tomcat给程序员提供的进行二次开发的API。学会这些API就可以比较方便地写出一个网站的后端程序了。
- 动态页面 VS 静态页面
1)静态页面:页面的内容是固定的(以文件的形式静静地躺在你的硬盘的指定目录中)。
无论是啥时候、啥人来进行访问,得到的页面效果都是一样的。
【静态页面就直接将文件拷贝到webapps中就行】
2)动态页面:不是一个真实的硬盘文件,而是通过代码在内存中构造出来的一个“虚拟的资源”。可以根据访问时间、访问的人以及访问时带有的参数不同构造不同的页面。
【动态页面就需要基于Servlet API进行代码实现了】
写一个Servlet程序
写一个 Servlet程序(7个步骤)
1. 创建项目
需要创建一个maven项目(在idea中 new project-> Maven)
创建好之后的目录结构:
① src是用来存放源代码的。其中main是存放业务代码,test是存放测试代码。
② 其中java中都是存放代码,而resources是存放代码中依赖的资源。
③ pom.xml 是项目于中的“阵眼”,也就是全局配置文件,这里写了很多关于项目的相关配置属性。
【maven是一个构建工具(build),包括但不限于编译、打包、部署…】
- 之前咱们写的代码都是直接在idea中点击自动编译运行的,针对一些简单的程序是ok的,但是如果是一些更复杂的模块并且相互依赖,此时直接点击编译运行是不太方便的。
- 所以maven构建工具就是为了解决针对复杂姐相互依赖的程序问题,使我们在开发比较复杂的项目的时候也可以比较方便的进行编译和打包操作。
- 咱们使用maven主要就是借助maven进行编译、打包、管理依赖等
- 在java中,类似于maven的构建工具其实是比较多的,如ant、gradle等
2. 引入Servlet依赖
- Servlet是Tomcat提供的,不是java标准库自带的,所以要想使用就需要额外下载安装并引入到项目中。
- Maven的一个核心功能就是能够自动管理依赖,会把咱们使用的库里依赖的东西自动从中央仓库下载下来。
maven下载的jar包会被放到“本地仓库”这样的特殊目录中:
C:\Users\lenovo\.m2\repository\javax
。
- 首先下载Servlet API:
① 打开中央仓库(中央仓库)并搜索servlet,选择第一个:
(或者:直接链接:Servlet)
② 点击之后选择3.1.0版本(servlet3.1.0 和Tomcat8.5 和jdk8是配套的)
③此时不是下载jar包,而是复制maven中的这段代码:
④ 复制完成后粘贴到pom.xml中:
(需要重新创建dependencies标签,可以包含多个dependency!!)
【idea会自动根据所写的内容从中央仓库下载依赖,在该依赖下载好之前都是标红的;
在下载过程中,会在idea右下角有个进度条;如果等了一久之后还是标红,就进行手动刷新:右边maven 】
(首次使用maven可能会加载较久。
如果加载中出现报错的情况,一半是网络问题,另一半是pom.xml中写错了)
pom.xml文件名红了不是报错,而是开启了git仓库,这个pom.xml没有提交就会标红
① 如果出现版本不匹配等其他问题可以上网查查方案
② 出现警告建议升级,可以不用管,还是建议不用升级
3. 创建目录结构
-
虽然maven已经给我们创建出了一些目录结构,但是还不够,我们需要搞的是一个符合Tomcat的目录结构。
-
方法:main右键 -> new Directory -> 创建webapp(注意:没有s!) -> 在webapp下new Directory -> 创建WEB-INF -> 又在WEB-INF下new File -> web.xml (位置、名字、层次 必须严格一致!)
-
然后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>
① 这里的叫做schema文件,描述了你的xml中都允许写哪些节点,节点之间的层级关系哪些属性是合法的,其作用是:验证+补全。
② 这里标红只影响到idea对于web.xml的验证和补全功能(但是咱们不用就可以不管,如果实在看着难受,就alter+enter进行解决)
4. 编写代码
-
方法:main -> java -> 右键 -> new java class (把代码放到java目录下,当然也可以创建包package)
-
继承的类来自于通过maven下载的servlet的jar包;如果标红,要么是之前下载有问题,要么是没有正确导包。
① doGet方法是HttpServlet父类中已经包含的方法,此处是需要override重写该方法。
② doGet表示当前Tomcat在收到某些请求的时候会调用这个doGet方法。
③ 参数req、resp一个是请求、一个是响应;此处doGet的工作就是“根据请求计算响应”(业务逻辑)。
④ req对象:这是Tomcat把HTTP请求报文解析成一个对象了。
⑤ resp对象:则是Tomcat构造的一个空的对象(resp相当于一个“输出型参数”)
⑥ doGet就是要根据req里的一些数据+业务逻辑构造生成一个完整的resp对象;Tomcat进一步把resp对象转成一个HTTP响应报文。
-
【典型的服务器要做三件事:】
① 读取请求并解析
② 根据请求计算响应(业务逻辑)
③ 把响应结果返回给客户端 -
举栗子:
注:文件名、路径名之类的尽量不要使用中文,尽量不要带空格、特殊符号等
注意:自动生成的这个调用父类方法的super代码一定要注释or删除!!!
@WebServlet(“/helloS”): 会针对某些GET请求生效(主要是看具体的请求)。
此处写下的“/helloS”的意思就是:GET请求并且url里面路径是/helloS的请求才会生效!!
Tomcat可以让你关联很多的路径,可以给请求中的不同类关联上不同的类,也就是执行了不同的doGet方法。
(其实这里的/helloS是一个“虚拟的资源”,硬盘上的目录中是没有这个文件的;浏览器访问该路径的资源时,就通过servlet代码直接进行逻辑业务的返回)
当前写的servlet代码中没有main方法,但是Tomcat中是有main方法的,所以只要将servlet放到Tomcat上就可以跑起来,即:将写好的代码挂到Tomcat上:打包+部署
5. 打包程序
- 直接使用maven进行打包:Maven -> servlet -> Lifecycle -> package(双击 or 右键build)
打包就是:先把缺失的依赖给下载好,然后编译所有的.java文件得到一堆.class文件,再把这些.class文件给打到一个压缩包中。(打包中最主要的就是.class文件
双击后看到 build success就是打包成功!
成功的包在左侧target下:
- 虽然我们打出了jar包,但是Tomcat不认,Tomcat要求的压缩格式是war包。
【最主要的区别: war包是会将整个webapp目录都给打进去的,包括web.xml,以及未来放的一些静态的html、css…】
此时就需要修改一下pom.xml:
① packaging是决定打出的是jar包还是war包。
② build、finalName是所打出的包的名字(此处是war包的名字)
设置好后重新打包package(这里一直在报错!)
可能是版本不匹配问题,最好还是按照上述所说的版本进行!!然后问题解决。
注: 一定要把之前的版本配置进行删除,如jdk不匹配就删除原来的jdk,并删除原来的环境配置,然后重新配置。
6. 部署程序
- 把war包拷贝到Tomcat的webapps目录下!!
找到war包所在路径:war包 ->右键 -> Open In ->Explorer(文件资源管理器) - 拷贝之后重新启动Tomcat!启动Tomcat后就会加载war包,加载操作也就是把这个war包解压缩成目录了
(想要重新打包就先clean,再package)
7. 验证程序
- 通过浏览器构造一个http请求来访问咱们的Tomcat服务器。
在浏览器地址栏输入:127.0.0.1:8080/第一级路径/名称(WebServlet内容)
- Tomcat服务器解析请求:
1)获取到url中的第一级路径,也就是webapps下的一个目录,确定一个webapp。该路径就称为:Context Path / Application Path
2)Tomcat找到第一级路径的目录之后就会去加载里面的类,尤其是重点去识别出 @WebServlet注解修饰的类 。此时就会取出url中的第二级路径,在@WebServlet注解中找到符合名字的类并创建实例(实例只会创建一次,如果之前已经创建过了,那就直接复用上次的实例)。第二级路径也称为Servlet Path
3)再解析出HTTP请求的方法“GET”,取出GET之后就可以根据HTTP方法来调用对应的servlet中的方法。
如:GET请求就调用doGet方法、POST请求就调用doPost方法、PUT请求就调用doPut方法、DELETE请求就调用doDelete方法…
同时Tomcat还会构造出HttpServletRequest对象和HttpServletResponse对象。
注:如果发现在地址栏输入地址之后页面没有反应,可能就是在cmd中选中了一段文本,选中文本后cmd就会进入阻塞状态;此时就需要取消选中状态(多按两下回车)【如果之后使用linux就不涉及该问题】
- 为什么知道这里是GET请求,因为构造GET请求有以下几种方式:
① 直接在浏览器地址栏输入url
② html中的a、link、img、script等
③ form
④ ajax
⑤ 第三方工具(postman等)
这里就是直接在浏览器地址栏输入url,所以此时就是GET请求
-
那么,如何构造POST请求:
① form
② ajax
③ 第三方工具 -
如何构造PUT请求?
① ajax
② 第三方工具 -
Tomcat中的main方法,主要做的就是针对webapps中的webapp进行加载,也就是将 配置+ .class 加载到内存中;后面收到请求的时候,先匹配Context Path(webapp),再匹配Servlet Path(类),最后再匹配方法(类中带有@WebServlet的方法doXXX)。以上都是由Tomcat内部的源码实现的。
【其实和jdbc差不多,都是固定套路,多练习!!】
【Servlet 2.0】
-
写一个Servlet程序的步骤:
① 创建maven项目
② 引入Servlet依赖
③ 创建目录
④ 编写代码
⑤ 打包
⑥ 部署
⑦ 验证程序 -
能否简化以上步骤?
①②③虽然也有优化的空间,但是没必要,因为这些都是一次性的操作O(1)
④肯定不能优化!!
⑤⑥ 这俩操作是O(N)的:每次代码作出微调,哪怕只改一行代码都需要重新部署。
所以:针对⑤⑥进行“一键式”打包和部署。
⑦ 也不太好优化 -
【针对⑤⑥进行“一键式”打包和部署:】
如果使用的是IDEA专业版,内置了Tomcat插件;
如果是使用IDEA社区版,可以使用第三方的Smart Tomcat插件来完成
Smart Tomcat支持社区版和专业版;这个插件使用比较方便,甚至比IDEA专业版的内置还方便
- 插件pluging:直接安装IDEA只是包含了一些最核心的功能,插件就相当于是对IDEA功能的扩充。
- 安装Smart Tomcat插件:
File -> settings -> plugings -> 搜索tomcat(一定要在Marketplace底下) -> Smart Tomcat -> install
补:如果在IDEA上搜不到,直接去官网下载:
smart tomcat
点击get进行下载,会得到一个jar包,把该jar包直接拖拽到IDEA中就行
【注:tomcat server的配置比smart tomcat麻烦很多,不建议使用】
- 如何使用 Smart Tomcat?
右上角add configuration -> 点击+ -> 向下找到Smart Tomcat -> 然后进行配置:name随便起,Tomcat Server(配置一次,后面自动记住),Context Path【浏览器url访问时的第一级路径,表示webapp的。之前说该Context Path是和目录名一样(和war包一样);但是Smart Tomcat是另一种运行tomcat的方式,没有真的去拷贝war包,所以在这儿就需要手动去配置该路径了】 -> 然后右上角就多出了一个小猫图标,即:生成了一个运行配置 -> 点击这里的运行按钮就可以一键式完成打包部署了。(就是让IDEA直接调用tomcat,并且加载咱们写的servlet程序)
【Context Path 名字可以随便写,但是后面在浏览器进行访问时一定要匹配!!】
(Tomcat Server)
如果显示startup in …ms 就是成功的!(不是红色就是失败,Tomcat的日志本来就是红色的)
之后就可以在该状态下进行浏览器访问了127.0.0.1:8080/xxx/xxx
- 如果点击运行之后失败
Address already in use + 套接字
,原因:端口已经被控制台启动的Tomcat给绑定了,此时smart tomcat调用的tomcat就会绑定端口失败了。
解决方法:关闭控制台的tomcat。
tomcat绑定了8080和8005两个端口号,一个是业务端口,一个是管理端口。
-
如果显示的内容是乱码,可以打开settings -> 搜索encoding -> console中Project Encoding改为utf8试试,如果不行就改为其他试试。
-
【注:一个程序是可以绑定多个端口号的,一个端口号只能被一个程序绑定!!(类似于手机号和人)】
-
【Tomcat是每个项目配置一次!】
-
Tomcat运行方式有很多种:
① 直接在startup这里运行,手动拷贝war包过去
② Smart Tomcat的方式:直接通过java代码,调用tomcat的jar包运行则不需要拷贝war包,调用的时候指定tomcat加载哪个webapp就行(但是只能加载一个!)。该方法在webapps下不会有war包,也不会在浏览器访问127.0.0.1:8080时有欢迎页面(因为没有加载webapps目录下的东西。因为该方式不打war包,所以finalName就失效了!)
【只看不动手 100%学不会!!多动手!】
访问出错
- 如果出现404,一般就是以下两种原因:
① 路径写错了
② webapp没有被tomcat正确加载:web.xml是tomcat加载war包的一个重要依据。
具体原因:
① 少写了 Context Path
② 少写了 Servlet Path
③ Servlet Path 写的和 URL 不匹配
④ web.xml 写错了
Context Path分两种情况来看:
① 如果是使用startup.bat方式启动tomcat,此时的Context Path就是webapps下的webapp目录名(war包)
② 如果是使用Smart Tomcat方式启动tomcat,此时Context Path就是配置Smart Tomcat的时候手动填写的。
① Smart Tomcat只是用于调试/开发阶段,写代码的时候开着IDEA、开着Smart Tomcat,一边写代码一边验证。
② 等把网站写完真正上线部署则是要放到云服务器的tomcat中(打war包),不是自己电脑的tomcat。
- 出现405的原因:
① 请求的方法服务器没有实现:如GET请求,但是服务器没有写doGet方法。
② 虽然方法对应,但是忘记注释/删除 super.doxxx了。
【补充:cmd上查看某个端口是否被占用(在管理员下运行):netstat -ano | findstr 端口号
】
-
出现500的原因(超常见):服务器代码抛异常!
(出现异常则去读异常信息!)
-
出现“空白页面”:响应数据的操作可能没有构造,如没有 resp.getWriter.write(“…”);方法
-
出现“无法访问此网站”:tomcat没有启动 or ip/端口写错了。
(注:每次修改代码都要重新启动tomcat!/重新打包)
【小结】
- 写一个Servlet程序的七个步骤 要熟练掌握!
- 理解:浏览器发的请求是怎么和自己写的代码建立联系的。
① 匹配Context Path ② 匹配Servlet Path ③ 匹配HTTP方法(doXXX) - 使用tomcat “一键式”打包和部署
- 常见访问出错原因