Servlet
一、servlet是什么?
Servlet是一个运行在Web服务器中的Java小程序,Servlet将会接收和响应来自Web客户端的请求,使用HTTP(超文本传输协议)进行通信。
Servlet是所有Web应用程序的核心类,它是唯一既可以直接处理和响应用户请求,也可以将处理工作委托给应用中的其他部分的类。除非某些过滤器提前终止了客户端的请求,否则所有的请求都将被发送到某些Servlet中。
在JSP+Servlet+JavaBean开发模式中,JSP作为视图将数据展现给用户,Servlet作为控制器,统一调度用户的请求,JavaBean封装和处理数据。
二、servlet怎么用?
1、Servlet继承关系
)
(1)Servlet
所有的Servlet都实现了javax.servlet.Servlet接口,但通常不是直接实现的。Servlet只是一个简单接口,它包含了初始化并销毁Servlet和处理请求的方法。不过,无论什么类型的请求,甚至是非HTTP请求,也会调用service方法。
(2)GenericServlet
一般情况下,Servlet都继承自javax.servlet.GenericServlet。GenericServlet也是一个不依赖具体协议的Servlet,它只包含了一个抽象的service方法和几个用于日志操作的辅助方法。
(3)HttpServlet
javax.servlet.http.HttpServlet继承自GenericServlet,主要用来响应HTTP请求。HttpServlet实现了service方法。并且提供了响应每种HTTP方法类型的方法的空实现。
(4)ServletConfig
表示此Servlet在web.xml中的配置信息。web容器将配置信息封装为ServletConfig对象.
此外,可以用ServletContext对象表示一个web工程
获取ServletConfig对象和ServletContext对象
this.getServletConfig()
this.getServletContext()
2、HttpServlet中的方法
HTTP方法类型 | Servlet方法 | 目的 |
---|---|---|
GET | doGet() | 从指定的URL中获取资源 |
HEAD | doHead() | 与GET一致,唯一的区别在于该请求只返回页面的头部数据 |
POST | doPost() | 通常用于处理Web表单提交 |
PUT | doPut() | 存储URL中提供的实体 |
DELETE | doDelete() | 删除由URL标示的资源 |
OPTIONS | doOptions() | 返回支持的HTTP方法 |
TRACE | doTrace() | 用于诊断目的 |
3、Servlet的生命周期
(1)初始化调用init()
init()方法只会在web容器初始化Servlet时调用一次,只会调用一次
(2)服务器响应客户端时调用service()
每次客户端请求服务器,服务器进行响应时都会调用service()方法,会调用多次
(3)终止阶段调用destory()
当将web工程从web容器移除时,将会调用
destory()方法
4、Servlet的执行过程
(1)在浏览器地址栏中输入访问路径,向服务器发出请求。
(2)服务器根据请求的URL地址在web.xml文件中的<servlet-mapping>标签下的子标签<url-pattern>中寻找匹配路径,找到对应的<servlet-name>。
(3)服务器根据已经寻找到<servlet-name>找到<servlet-class>(包名+类名)。
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--表示应用程序在应用服务器中显示的名字-->
<!--Tomcat管理器页面(显示出所有已安装应用程序的列表)中将显示出<display-name>标签中配置的名字-->
<display-name>Hello Web Application</display-name>
<!--配置Servlet,Web容器创建一个Servlet的实例-->
<servlet>
<servlet-name>hello</servlet-name><!--名称可以自定义-->
<servlet-class>com.hello.Servlet.HelloServlet</servlet-class><!--指定要创建实例的Servlet类-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--将Servlet映射为URL地址,告诉Servlet对哪些请求URL做出响应-->
<!--<Servlet>标签和<Servlet-mapping>标签中的<servlet-name>需要一致,Web容器通过这种方式关联这两种配置-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/</url-pattern><!--URL的路径-->
</servlet-mapping>
</web-app>
(4)服务器根据包名和类名寻找Servlet类(用户自定义的),创建Servlet实例。
(5)执行init方法
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
}
}
(6)调用service方法
//GenericServlet类
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
//......
public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
}
//HttpServlet类
public abstract class HttpServlet extends GenericServlet {
//.......
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest)req;
response = (HttpServletResponse)res;
} catch (ClassCastException var6) {
throw new ServletException("non-HTTP request or response");
}
this.service(request, response);
}
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long errMsg;
if(method.equals("GET")) {
//。。。。
} else if(method.equals("HEAD")) {
//。。。。
} else if(method.equals("POST")) {
this.doPost(req, resp);
} else if(method.equals("PUT")) {
this.doPut(req, resp);
} else if(method.equals("DELETE")) {
this.doDelete(req, resp);
} else if(method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if(method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
//错误请求
}
}
}