努力经营当下,直至未来明朗!
追求想要的一定很酷!
【静态页面就直接将文件拷贝到webapps中就行】
2)动态页面:不是一个真实的硬盘文件,而是通过代码在内存中构造出来的一个“虚拟的资源”。可以根据访问时间、访问的人以及访问时带有的参数不同构造不同的页面。
【动态页面就需要基于Servlet API进行代码实现了】
写一个 Servlet程序(7个步骤)
需要创建一个maven项目(在idea中 new project-> Maven)
创建好之后的目录结构:
① src是用来存放源代码的。其中main是存放业务代码,test是存放测试代码。
② 其中java中都是存放代码,而resources是存放代码中依赖的资源。
③ pom.xml 是项目于中的“阵眼”,也就是全局配置文件,这里写了很多关于项目的相关配置属性。
【maven是一个构建工具(build),包括但不限于编译、打包、部署…】
- 之前咱们写的代码都是直接在idea中点击自动编译运行的,针对一些简单的程序是ok的,但是如果是一些更复杂的模块并且相互依赖,此时直接点击编译运行是不太方便的。
- 所以maven构建工具就是为了解决针对复杂姐相互依赖的程序问题,使我们在开发比较复杂的项目的时候也可以比较方便的进行编译和打包操作。
- 咱们使用maven主要就是借助maven进行编译、打包、管理依赖等
- 在java中,类似于maven的构建工具其实是比较多的,如ant、gradle等
maven下载的jar包会被放到“本地仓库”这样的特殊目录中:
C:\Users\lenovo\.m2\repository\javax
。
② 点击之后选择3.1.0版本(servlet3.1.0 和Tomcat8.5 和jdk8是配套的)
③此时不是下载jar包,而是复制maven中的这段代码:
④ 复制完成后粘贴到pom.xml中:
(需要重新创建dependencies标签,可以包含多个dependency!!)
【idea会自动根据所写的内容从中央仓库下载依赖,在该依赖下载好之前都是标红的;
在下载过程中,会在idea右下角有个进度条;如果等了一久之后还是标红,就进行手动刷新:右边maven 】
(首次使用maven可能会加载较久。
如果加载中出现报错的情况,一半是网络问题,另一半是pom.xml中写错了)
① 如果出现版本不匹配等其他问题可以上网查查方案
② 出现警告建议升级,可以不用管,还是建议不用升级
虽然maven已经给我们创建出了一些目录结构,但是还不够,我们需要搞的是一个符合Tomcat的目录结构。
方法:main右键 -> new Directory -> 创建webapp(注意:没有s!) -> 在webapp下new Directory -> 创建WEB-INF -> 又在WEB-INF下new File -> web.xml (位置、名字、层次 必须严格一致!)
然后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 Applicationdisplay-name>
web-app>
① 这里的叫做schema文件,描述了你的xml中都允许写哪些节点,节点之间的层级关系哪些属性是合法的,其作用是:验证+补全。
② 这里标红只影响到idea对于web.xml的验证和补全功能(但是咱们不用就可以不管,如果实在看着难受,就alter+enter进行解决)
① 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上:打包+部署
打包就是:先把缺失的依赖给下载好,然后编译所有的.java文件得到一堆.class文件,再把这些.class文件给打到一个压缩包中。(打包中最主要的就是.class文件
双击后看到 build success就是打包成功!
成功的包在左侧target下:
【最主要的区别: war包是会将整个webapp目录都给打进去的,包括web.xml,以及未来放的一些静态的html、css…】
此时就需要修改一下pom.xml:
① packaging是决定打出的是jar包还是war包。
② build、finalName是所打出的包的名字(此处是war包的名字)
设置好后重新打包package(这里一直在报错!)
可能是版本不匹配问题,最好还是按照上述所说的版本进行!!然后问题解决。
注: 一定要把之前的版本配置进行删除,如jdk不匹配就删除原来的jdk,并删除原来的环境配置,然后重新配置。
127.0.0.1:8080/第一级路径/名称(WebServlet内容)
Context Path / Application Path
Servlet Path
如:GET请求就调用doGet方法、POST请求就调用doPost方法、PUT请求就调用doPut方法、DELETE请求就调用doDelete方法…
同时Tomcat还会构造出HttpServletRequest对象和HttpServletResponse对象。
注:如果发现在地址栏输入地址之后页面没有反应,可能就是在cmd中选中了一段文本,选中文本后cmd就会进入阻塞状态;此时就需要取消选中状态(多按两下回车)【如果之后使用linux就不涉及该问题】
这里就是直接在浏览器地址栏输入url,所以此时就是GET请求
那么,如何构造POST请求:
① form
② ajax
③ 第三方工具
如何构造PUT请求?
① ajax
② 第三方工具
Tomcat中的main方法,主要做的就是针对webapps中的webapp进行加载,也就是将 配置+ .class 加载到内存中;后面收到请求的时候,先匹配Context Path(webapp),再匹配Servlet Path(类),最后再匹配方法(类中带有@WebServlet的方法doXXX)。以上都是由Tomcat内部的源码实现的。
【其实和jdbc差不多,都是固定套路,多练习!!】
写一个Servlet程序的步骤:
① 创建maven项目
② 引入Servlet依赖
③ 创建目录
④ 编写代码
⑤ 打包
⑥ 部署
⑦ 验证程序
能否简化以上步骤?
①②③虽然也有优化的空间,但是没必要,因为这些都是一次性的操作O(1)
④肯定不能优化!!
⑤⑥ 这俩操作是O(N)的:每次代码作出微调,哪怕只改一行代码都需要重新部署。
所以:针对⑤⑥进行“一键式”打包和部署。
⑦ 也不太好优化
【针对⑤⑥进行“一键式”打包和部署:】
如果使用的是IDEA专业版,内置了Tomcat插件;
如果是使用IDEA社区版,可以使用第三方的Smart Tomcat插件来完成
Smart Tomcat支持社区版和专业版;这个插件使用比较方便,甚至比IDEA专业版的内置还方便
补:如果在IDEA上搜不到,直接去官网下载:
smart tomcat
点击get进行下载,会得到一个jar包,把该jar包直接拖拽到IDEA中就行
【注:tomcat server的配置比smart tomcat麻烦很多,不建议使用】
之后就可以在该状态下进行浏览器访问了127.0.0.1:8080/xxx/xxx
Address already in use + 套接字
,原因:端口已经被控制台启动的Tomcat给绑定了,此时smart 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%学不会!!多动手!】
具体原因:
① 少写了 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。
【补充:cmd上查看某个端口是否被占用(在管理员下运行):netstat -ano | findstr 端口号
】
出现“空白页面”:响应数据的操作可能没有构造,如没有 resp.getWriter.write(“…”);方法
出现“无法访问此网站”:tomcat没有启动 or ip/端口写错了。
(注:每次修改代码都要重新启动tomcat!/重新打包)