1.什么是Servlet?
从广义上来讲,Servlet规范是Sun公司制定的一套技术标准,包含与Web应用相关的一系列接口,是Web应用实现方式的宏观解决方案。而具体的Servlet容器负责提供标准的实现。
从狭义上来讲,Servlet指的是javax.servlet.Servlet接口及其子接口,也可以指实现了Servlet接口的实现类。
- Servlet(Server Applet)作为服务器端的一个组件,它的本意是“服务器端的小程序”。
- Servlet的实例对象由Servlet容器负责创建;
- Servlet的方法由容器在特定情况下调用;
- Servlet容器会在Web应用卸载时销毁Servlet对象的实例。
在Servlet中通常需要:
- 接收请求数据;
- 处理请求;
- 完成响应。
2.怎么来使用Servlet
实现Servlet有三种方式:
- 实现Servlet接口;
- 继承javax.servlet.GenericServlet类;
- 继承javax.servlet.http.HttpServlet类;
实现Servlet接口需要重写它的(init(),getServletConfig(),service(),getServletInfo(),destory())方法
public class AServalet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
继承GenericServlet类需要重写它的service方法
public class AServalet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
}
继承HttpServlet类需要重新doGet和doPost方法
public class AServalet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
在实际开发中使用第三种方法!
运行Servlet需要配置Servlet文件
在web目录下WEB-INF中的web.xml文件配置
<servlet>
//名称,随意取, 一般取名类名
<servlet-name>Servlet02</servlet-name>
//对应的Servlet类, 全名(包.类名)
<servlet-class>com.fs.web01.Servlet02</servlet-class>
</servlet>
//指定访问路径
<servlet-mapping>
<servlet-name>Servlet02</servlet-name>
//访问路径
<url-pattern>/Servlet02</url-pattern>
</servlet-mapping>
我的第一个Servlet应用
public class Servlet02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Hello Servlet!");
}
}
需要在浏览器域名后输入访问路径
在后面的开发中我们推荐使用注解来替换配置文件,使用方法:
name忽略: @WebServlet(name="Servlet02",urlPatterns="/Servlet02") @WebServlet(urlPatterns="/Servlet02") urlPatterns 与value 等同 @WebServlet(value="/Servlet02")
@WebServlet(value = "/Servlet02")
public class Servlet02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Hello Servlet!");
}
}
Servlet作用:
- 接收请求 【解析请求报文中的数据:请求参数】
- 处理请求 【DAO和数据库交互】
- 完成响应 【设置响应报文】
3.Servlet生命周期
所谓生命周期,就是说出生、服务,以及死亡。Servlet生命周期也是如此!与Servlet的生命周期相关的方法有:
- void init(ServletConfig);
- void service(ServletRequest,ServletResponse);
- void destroy();
1.出生:服务器会在Servlet 第一次被访问时创建Servlet ,或者是在服务器启动时创建Servlet 。 如果服务器启动时就创建Servlet,那么还需要在web.xml文件中配置。也就是说默认情况下,Servlet是在第一次被访问时由服务器创建的。在Servlet被创建后,服务器会马上调用Servlet的void init(ServletConfig)方法。请记住, Servlet出生后马上就会调用init()方法,而且一个Servlet的一生 这个方法只会被调用一次。
2.服务:当服务器每次接收到请求时,都会去调用Servlet的service()方法来处理请求。 服务器接收到一次请求,就会调用service() 方法一次 ,所以service()方法是会被调用多次的。正因为如此,所以我们才需要把处理请求的代码写到service()方法中!
3.死亡:Servlet是不会轻易离去的,通常都是在服务器关闭时Servlet才会离去!在服务器被关闭时,服务器会去销毁Servlet,在销毁Servlet之前服务器会先去调用Servlet的destroy()方法,我们可以把Servlet的临终遗言放到destroy()方法中,例如对某些资源的释放等代码放到destroy()方法中。
测试生命周期:
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet(value="/Servlet02")
public class Servlet02 implements Servlet{
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("我出生啦");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("我在这里!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("我要寄啦!");
}
}
启动后
关闭后
4.Servlet两个接口
1. ServletConfig接口
ServletConfig接口封装了Servlet配置信息
- 每一个Servlet都有一个唯一对应的ServletConfig对象,代表当前Servlet的配置信息。
- 对象由Servlet容器创建,并传入生命周期方法init(ServletConfig config)中。可以直接获取使用。
- 代表当前Web应用的ServletContext对象也封装到了ServletConfig对象中,使ServletConfig对象成为了获取ServletContext对象的一座桥梁。
- ServletConfig对象的主要功能:
- 获取Servlet名称:getServletName()
- 获取全局上下文ServletContext对象:getServletContext()
- 获取Servlet初始化参数:getInitParameter(String) / getInitParameterNames()。
2.ServletContext接口
Web容器在启动时,它会为每个Web应用程序都创建一个唯一对应的ServletContext对象,意思是Servlet上下文,代表当前Web应用。
- 由于一个Web应用程序中的所有Servlet都共享同一个ServletContext对象,所以ServletContext对象也被称为 application 对象(Web应用程序对象)。
- 对象由Servlet容器在项目启动时创建,通过ServletConfig对象的getServletContext()方法获取。在项目卸载时销毁。
- ServletContext对象的主要功能: a.获取项目的上下文路径(带/的项目名): getContextPath()
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//获取路径对象
ServletContext servletContext = servletConfig.getServletContext();
//获取具体路径
String contextPath = servletContext.getContextPath();
System.out.println(contextPath);
}
b.获取虚拟路径所映射的本地真实路径:getRealPath(String path)
c. 作为域对象共享数据
setAttribute(key,value):以后可以在任意位置取出并使用
getAttribute(key):取出设置的value值.