Servlet(Server Applet)是 Java Servlet 的简称,用 Java 编写的运行在 web 服务器端的小程序
。其主要功能在于交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类
,一般理解为后者。Servlet 运行于支持 Java 的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
`Servlet 是sun公司开发动态项目的一门技术,并在API中提供了一个接口:Servlet接口。所以对于一个 Servlet 应用程序,需要做到这两步:
1、编写一个类,实现 Servlet 接口;
2、把开发好的类部署到 web 服务器中。当浏览器访问该资源时,由 web 服务器(也称web容器或servlet容器)加载该类、创建该类对象、调用并执行对象方法
。
Servlet的框架是由两个Java包组成:javax.servlet 和 javax.servlet.http。Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口。
Servlet 就是一个 Java 接口。(Java EE javax.servlet.Servlet)
已继承的子接口:JspPage接口直接继承Servlet接口;HttpJspPage接口继承JspPage接口。
已实现的抽象类:FacesServlet, GenericServlet 抽象类实现Servlet接口; HttpServlet 抽象类继承 GenericServlet 抽象类。
GenericServlet 抽象类将 Servlet 接口中其他方法做了默认的空实现,只有 service() 方法还作为抽象方法,以后继承该抽象类只需要实现这一个抽象方法。
HttpServlet 抽象类是对 Http 协议的一种封装,简化相应的操作。
Servlet 接口中一共有五个抽象方法:
生命周期方法:
1、初始化 servlet 的init(ServletConfig config)
方法,该方法在servlet被创建时执行,并且只执行一次。init 方法必须成功完成,servlet才能接收任何请求。
2、服务请求的service(ServletRequest req, ServletResponse res)
方法,该方法在访问servlet时执行,并且每次访问都会执行。用于响应请求。该方法只有在servlet的init()方法成功完成后才可调用执行。
3、servlet退出服务时调用的destroy()
方法。该方法在服务器正常关闭时执行,也只执行一次,一般用于释放资源;服务器不是正常关闭时不会执行。
两个普通方法:
1、getServletConfig()方法:获取ServletConfig对象对象
2、getServletInfo()方法:获取servlet的信息,如作者、版本和版权。
Servlet 的 init() 方法只执行一次,说明一个servlet在内存中只有一个对象,是单例的。
servlet 创建时机:
默认情况下,servlet 在第一次被访问时创建。
可以在web.xml配置文件中设置创建时机。如:
<servlet>
<servlet-name> servlet自定义名称 servlet-name>
<servlet-class> 实现Servlet接口的类的全类名 servlet-class>
<load-on-startup> 5 load-on-startup>
servlet>
使用步骤:
1、创建 JavaEE 项目;
2、定义一个类,实现 Servlet 接口;
3、实现接口中的抽象方法;
4、配置 Servlet 。就是将 Servlet 的实现类的全类名映射成一个资源路径url,方便通过这个 url 访问调用该应用小程序。
WEB-INF/web.xml
配置文件中部署<servlet>
<servlet-name> servlet自定义名称 servlet-name>
<servlet-class> 实现Servlet接口的类的全类名 servlet-class>
servlet>
<servlet-mapping>
<servlet-name> servlet自定义名称 servlet-name>
<url-pattern> servlet 的资源路径 url-pattern>
servlet-mapping>
实例:
<servlet>
<servlet-name> name servlet-name>
<servlet-class> cn.qgl.web.test.DemoServlet servlet-class>
servlet>
<servlet-mapping>
<servlet-name> name servlet-name>
<url-pattern> /hello 的资源路径 url-pattern>
servlet-mapping>
1、访问 http://localhost:8080/demo_pro/hello,当浏览器发送请求访问该 url,通过url中的域名(localhost:8080)找到对应的服务器、虚拟目录(/demo_pro)找到对应的项目,然后根据资源路径(/hello )去该项目的 web.xml 文件中去匹配,即匹配
2、匹配到后,得到
3、匹配到后,就可以得到
4、于是服务器就加载该类、创建对象、调用方法。所以这些服务器要能对这个类进行这些操作,这个类必须符合一定的规则(接口),即实现 Servlet 接口。
注解
部署 Servlet在 Servlet 3.0(JDK6.0)以后支持注解配置,可以不用在web.xml中配置。
@WebServlet(urlPatterns = "/资源路径")
public class 实现类 extends Servlet{}
这种方式只需在对应的 servlet 类上添加 @WebServlet 注解即可。当浏览器发送请求时,根据 url 直接寻找匹配 @WebServlet 后对应的资源路径,然后调用并执行对应的 servlet 类。
@WebServlet 注解信息。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
String name() default ""; //相当于
String[] value() default {}; //代表urlPatterns()属性配置
String[] urlPatterns() default {}; //相当于 默认是这个参数
int loadOnStartup() default -1; //相当于
WebInitParam[] initParams() default {};
boolean asyncSupported() default false;
String smallIcon() default "";
String largeIcon() default "";
String description() default "";
String displayName() default "";
}
当启动服务器后查看控制台的打印的日志信息:
查看上述路径(tomcat 给部署的项目单独创建的配置文件):
查看 conf 配置文件夹中的文件,该xml文件名即为项目的虚拟目录。
打开该xml文件可以看到项目文件的路径
查看上述路径(tomcat 部署的项目存放路径):
工作空间项目
存放在自定义的文件中
工作空间中的web目录(存放web项目)。
tomcat 部署的 web 项目
存放在工作空间项目中的 out 文件夹中的 artifacts 文件夹中,它是对应者工作空间项目下的web目录下的所有资源。tomcat 真正访问的是 tomcat 部署的项目。
其中 WEB-INF 下的 class 文件来自 src下的 java 文件编译而来的。
WEB-INF 下的资源是不能直接被浏览器访问到的。