1.Servlet的基本架构
虚线是实现,实线是继承。
1.1servlet接口
servlet本身就是一个接口。
1.1.1方法:
void init(); //初始化
void service(); //处理客户端请求
void destory(); //摧毁资源
1.2 servletconfig接口:
实现配置加载。
1.2.1方法
String getServletName(); //获取到servlet的名字
Enumeration<String> getInitparameterNames(); //获取到所有的初始化参数,用枚举接收
1.3 GenericService抽象类
该类虽然实现了Servlet接口,但是更多的是对ServletConfig接口进行了实行,而把对应的Http请求方法Service,扔给了其子类HttpSevlet。
1.4HTTPServlet抽象类
该类主要完成用户的请求和响应,自定义的servlet必须继承该类。
1.4.1 servlet中的request和response
ServletRequest:
HTTPServletRequest:
除了继承ServletRequest的接口中的方法,还增加了适应于http相应的新方法。
ServletResponse:
HTTPServletResponse:
除了继承ServletResponse的接口中的方法,还增加了适应于http相应的新方法。
2.自定义servlet类
2.1先声明一个类,继承HTTPServlet
实例:
package controller;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import java.io.IOException;
public class TestServlet extends HttpServlet {
public TestServlet() {
System.out.println("我被创建了。。。");
}
@Override
public void init() throws ServletException {
System.out.println("我被初始化了。。。");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("我接受了请求");
System.out.println(this);
}
@Override
public ServletContext getServletContext() {
System.out.println("上下文");
return super.getServletContext();
}
@Override
public void destroy() {
System.out.println("我被销毁了。。。");
System.out.println("我被销毁了。。。");
System.out.println("我被销毁了。。。");
// super.destroy();
}
}
2.2 配置servlet
在WEB-INFO中的web.xml配置
<servlet>
<!--name可以自定义-->
<servlet-name>TestServlet</servlet-name>
<!--路径不可以自定义-->
<servlet-class>controller.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--name可以自定义-->
<servlet-name>TestServlet</servlet-name>
<!--pattern可以自定义-->
<url-pattern>/aaa</url-pattern>
</servlet-mapping>
Servlet运行步骤:
- 先去URL中找到对应的请求(urlpartten)
- 找到请求所对应的Servlet的名字 (servlet-name) 以上两个部分都是在servletmapping中.
- 根据名字找到Servlet配置节点中 的Servlet的名字(servlet-name)
- 再确定Servlet的class所在位置 (servlet-class)
3.servlet的生命周期
可简化为四个步骤:
实例化Servlet :
首先由客户端发起请求,容器会解析请求的 URL,找到对应Servlet配置中的"url-partten", 紧跟着继续查找对应“servlet-name”,找到了 “servlet-name”就会使用"servlet-class"实现类实 例化。
调用init方法实现Servlet初始化:
当容器执行自定义Servlet时,会自动调用init方 法,实现Servlet的初始化。 Servlet是一个单例设计的类,能够提高多线 程的访问能力。因此可能会存在线程安全性问 题。
调用Service方法提供服务:
在HttpServlet中的Service方法,会根据用户提 交的方式,选择调用doXXX方法,如果我们自己 重写了Service方法,而没有调用doXXX具体的方 法,可能在请求后,如果同时存在service以及对 应doXXX方法时,只会调用service这一个方法。
调用destory方法实现销毁:
当web容器销毁时,会调用每一个自定义Servlet 中的destory实现对Servlet的销毁功能。
4.在Servlet中获取request、session、 application内置对象的方式
- 获取request
doXXX(HttpServletRequest request, HttpServletResponse response);
service(HttpServletRequest request, HttpServletResponse response)
- 获取session
HttpSession session = request.getSession();
- 获取application
ServletContext application = request.getServletContext();