Servlet
Servlet:server applet
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
快速开始
创建JavaEE(Web项目)项目;
定义一个类,实现 Servlet 接口,实现接口中的方法;
public class ServletDemo1 implements Servlet{
//实现Servlet接口的方法
}配置Servlet:配置web.xml文件
下面的标签写在web-app标签内
<!--配置Servlet-->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
</servlet>
<!--mappint映射-->
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
执行过程
1. 当服务器接收到客户端浏览器的请求后,会解析这个请求的URL路径,获取要访问的Servlet的资源路径;
2. Tomcat会查找web.xml文件是否有对应的<url-pattern>标签内容;
3. 如果有,则再找到对应的<servlet-class>的类;
4. 找到对应类后,Tomcat会将其字节码文件加载进内存,创建其对象;
5. 然后调用方法;
Servlet中的生命周期(方法)
init()
初始化时:执行init()方法,只执行一次。一般用于加载资源
```
- Servlet什么时候被创建?
1. 默认情况下,第一次被访问时,Servlet被创建
2. 还可以配置执行Servlet的创建时机(配置web.xml文件)
在<servlet>标签下:
1.第一次被访问时创建:
<load-on-startup>标签值为负数,则第一次访问时被创建。(该标签默认值为-1)
2.在服务器启动时创建:
<load-on-startup>标签值配置成0或正整数
- Servlet的init()方法,只执行一次,说明一个Servlet在内存中只存在一个对象,说明Servlet是单例的。
- 多个用户同时访问时,可能存在线程安全问题
- 解决:
尽量不要在Servlet中定义成员变量,即是定义了成员变量,也不要对其修改值。
```
service()
服务:执行service()方法,Servlet每次被访问时,都会被执行
```
- 每次访问Servlet时,service()方法都会被调用一次。
```
destroy()
销毁时:执行destroy()方法,只执行一次
```
- Servlet被销毁时执行。服务器关闭时,Servlet被销毁
- 只有服务器正常关闭时,才会执行destroy()方法
- destroy()在Servlet销毁之前执行,一般用于释放资源。
```
Servlet 3.0
好处:
支持注解配置。可以不需要web.xml了。
步骤:
创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
定义一个类,实现Servlet接口,实现Servlet接口方法
在类上使用@WebServlet注解,进行配置
@WebServlet(urlPatterns = "/demo1") 或@WebServlet("/demo1")
IDEA与Tomcat的相关配置
IDEA会为每一个Tomcat部署的项目,单独建立一份儿配置文件
查看控制台log日志CATALINA_BASE: /Users/liyan/Library/......
工作空间项目和Tomcat部署的web项目是两个路径
Tomcat真正访问的是"Tomcat部署的web项目",它对应着工作空间下web目录下的所有资源
WEB-INF目录下的资源不能被浏览器直接访问。
断点调试:通过debug启动
Servlet体系结构
实现类:
Servlet 接口
GenericServlet 抽象类:将Servlet接口中其他的方法做了空实现,只将service()方法作为抽象,之后定义Servlet类时,可以继承GenericServlet类,实现service()方法即可。
HttpServlet 抽象类
- 定义一个类,继承HttpServlet类
- 重写doGet()、doPost()方法
Servlet相关配置
urlpartten:Servlet访问路径
一个Servlet可以定义多个访问路径
@WebServlet({"/d4","/dd4","/ddd4"})
路径定义规则:
- /xxx
- /xxx/xxx :多层路径,目录结构
- *.do