Servlet概念(server applet)
官方定义:运行在服务器端的小程序
*动态资源的逻辑性体现在Java代码上,直观的就是去寻找Java类,这里的Java类是依赖于服务器才能运行的。
*要遵循一定的规则,才能被tomcat所识别,这里的规则指的就是Java当中的Interface(接口)。
Servlet:本质上就是一个接口,定义了Java类被浏览器访问到(被Tomcat识别)的规则。
官方给出的Servlet的API
Servlet接口当中的方法
Servlet快速入门
1.创建JavaEE项目
2.定义一个类,实现Servlet接口
3.实现接口当中的抽象方法
4.配置Servlet
在web.xml当中配置Servlet
<!--configure Servlet-->
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>cn.itcast.web.servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
Servlet执行原理
tomcat实际上是一个web容器
*当服务器接收到客户端浏览器的请求后,会解析请求URL路径,会获取访问的servlet的资源路径。
访问地址:http://localhost:8080/day8_tomcat/demo
通过localhost:8080可以找到tomcat应用进程,通过day8_tomcat可以找到部署的项目,“/demo”为资源名称。
*查找web.xml文件
在web.xml的<servlet-mapping>当中解析<url-pattern>对应的是否存在一个“/demo”的资源名称,然后找到对应的<servlet-name>,通过<servlet>当中的<servelt-name>找到对应的位置,在通过<servlet-calss>找到对应的类。
1、tomcat将全类名对应的字节码文件加载进内存。class.forName();
2、创建对象。cls.newInstance();
3、调用方法——service()方法。(因为实现接口,必然存在这个方法)。
Servlet当中的方法
Servlet接口方法解析
package cn.itcast.web.servlet;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemoExtend implements Servlet {
/**
* 初始化方法
* 在Servlet被创建的时候执行,只会执行一次
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...");
}
/**
*获取ServletConfig对象
* ServletConfig:servlet配置对象
* @return
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 提供服务的方法
* 每一次servlet访问时被执行,可能会执行多次
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service...");
}
/**
* 获取servlet的一些信息
* 版本、作者...一般不会去实现这个方法
* @return
*/
@Override
public String getServletInfo() {
return null;
}
/**
* 销毁方法
* 在servlet被杀死的时候将会执行
* 在服务器被正常关闭的时候将会执行,仅仅会执行一次
*/
@Override
public void destroy() {
System.out.println("destroy...");
}
}
Servlet中的生命周期相关的几个重要方法
1、被创建:执行init方法,只执行一次
*servlet什么时候被创建:默认情况下,第一次被访问时,servlet被创建
*可以配置执行sevlet的创建时机
<!--configure ServletDemoExtend-->
<servlet>
<servlet-name>demoextend</servlet-name>
<servlet-class>cn.itcast.web.servlet.ServletDemoExtend</servlet-class>
<!--指定servlet的创建时机-->
<!--第一次被访问时,创建,值负数-->
<!--在服务器启动时,创建,值整数或者零-->
<load-on-startup>1</load-on-startup>
</servlet>
*servlet的init方法,只执行一次,说明一个servlet在内存只存在一个对象,servlet的单例的
*多个用户同时访问时,可能存在线程安全问题(12306买票问题):
*如果对方法加锁,将会大大影响性能,因此不会采用加锁的方法
*解决:尽量不要再servlet当中不要定义成员变量,即使定义成员变量,也不要对其同时修改值
2、提供服务:执行service方法,将会执行多次
*每一次访问servlet时,service方法都会执行一次。
3、被销毁:执行destroy方法,只执行一次
*servlet被销毁时执行。服务器关闭时servlet被销毁。
*只有服务器被正常关闭的时候,才会执行destroy方法
*destroy方法执行完毕才进行servlet的销毁
Servlet3.0
优点
支持注解配置,不需要web.xml
步骤
1、创建JavaEE项目,选择Servlet3.0以上的版本,可以不创建web.xml
2、定义一个类,实现Servlet接口,实现抽象方法
3、在类上使用@WebServlet注解,进行配置
@WebServlet(urlPatterns = "/demo")