动态资源vs静态资源
- 静态资源:提前写好的内容
- 动态资源:内容不是提前写好的,而是随着用户请求可以随时变化(但不要求必须随时变化)
- Java官方提供了一套Servlet标准。Servlet: Serv (Server) +let(小物件)=服务端运行的一些小物件(web应用)
- Servlet标准在代码中的呈现方式:接口和抽象类的形式体现。
Java官方提供了一套Servlet标准:Java官方写好一套接口和抽象类,用于连接Tomcat开发者和应用开发者的桥梁
servlet 开发流程
一、开发阶段
(一)【开发环境的搭建】
- 创建maven项目
- 修改maven配置
(1)设置我们的代码打包方式是war类型打包
(2)设置maven的编译器版本是1.8
(3)作为添加 servlet 的依赖
scope=provided:指的是这个依赖下的所有类,只在开发、构建阶段需要,在运行阶段就不需要了
为什么在运行阶段就不需要了? 是因为Tomcat内部已经有这套类了
- 新建目录,作为存放静态资源的根目录src/main/webapp
- 新建目录,存在web 应用配置(web.xml)src/main/webapp/WEB-INF/
- 完成第一个动态资源
- 简化开发环境搭建
(1)通过maven提供的项目模板搞定
(2)利用IDEA提供的保存项目模板功能
(二)【资源开发:静态资源+动态资源】
- 静态资源统统放到以webapp为根的目录下,但不要放到 webapp/WEB-INF下
- 动态资源
(1)继承HttpServlet
(2)@WebServlet(“servlet path”)注解
(3)重写doGet方法
jar(Java ARchive): 将java类文件(包括资源文件组织起来的一个文件),本身其实是zip压缩包
war(Web ARchive): 将Servlet应用(包括类文件、静态资源文件、web.xml、依赖的jar包)按照指定规则,放在在目录中,并且用zip压缩的一种结构
二、构建阶段
(一)【编译】
(二)【打包】
原始步骤: war包的标准目录结构是什么规定
-
可以手动按照规定复制文件过去
-
可以利用maven提供clean+compile+package
利用maven简化编译和打包工作
-
专业版可以利用build artifact
(三)【部署】
原始步骤:把打包好的war包,复制到 tomcat/webapps/目录下作为一个web应用
开发阶段
- 社区版,利用SmartTomcat 插件,把Tomcat集成到IDEA中使用
- 专业版,利用自带的Tomcat插件,把Tomcat集成到IDEA中使用
三、运行阶段
(一)【重启Tomcat)
动态资源修改之后,必须重启Tomcat,才能真正生效
光改代码是没用的,必须让Tomcat直到类文件改动了,生效才能被我们浏览器看到
(二)【浏览器中访问对应资源】
资源的完整的URL = Context Path(Application Context) + Servlet Path
其中,我们开发阶段写在@WebServlet("…")只是ServletPath,需要和部署时,设置的Context Path 共同组成最终的完整的URL
Servlet中动态资源的开发
通过HttpServlet实现了Servlet接口
- 利用idea实现层级关系
FirstSevlet继承了HttpServlet抽象类
HttpServlet继承自GenericServlet 抽象类
GenericServlet继承自Object,同时实现了Servlet 接口(ServletConfig 接口,Serializable接口)
- init() : Tomcat启动的时候(首次创建Servlet对象时)会调用一次(用于做初始化工作)
- destroy(): Tomcat在结束时,会调用一次(用于做销毁工作)
- service():每次有请求过来时,就会被调用一次,在Tomcat工作期间,会被调用多次
- 我们的代码中,重写的init和destroy只会执行一次,doGet 会被执行多次(没有一次请求,执行一次)
每个Servlet类,在Tomcat运行过程中,都是保持单例(*)
单例(singleton):就是某些类,它的对象,在整个应用的运行过程中,需要并且只需要一个就够了,把这类对象就称为单例。
doGet(…)方法
- doGet(…)是浏览器每发起一个HTTP请求-响应周期,就会被调用一次
- 参数:
- HttpServletRequest req关于HTTP请求的一个对象化后的封装
req指向的对象,代表的就是本次由浏览器发起的HTTP请求 - HttpServletResponse resp关于HTTP响应的一个对象化后的封装
resp指向的对象,代表的就是本次准备发送给浏览器的HTTP响应
- req指向的请求对象,其中的数据是来自浏览器的(其中的各项属性是有值的)
- resp指向的响应对象,其实是一个“空的”对象,等待我们在doGet方法,将内容填充到对象中
- Tomcat 在执行完doGet方法后,会将我们在doGet 中填充好的resp对象,转化成HTTP响应发送给浏览器