您的位置:首页 > 其它

三种实现servlet的方式有什么区别?--转载

2016-01-21 21:37 609 查看
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:郭无心
链接:https://www.zhihu.com/question/38971252/answer/79165562
来源:知乎

首先明确,Servlet并不是专门用于处理Http请求的。然后再说三种方式的联系和区别。
1)原生Servlet接口

package javax.servlet;

import java.io.IOException;

public interface Servlet {

public void init(ServletConfig config) throws ServletException;

public ServletConfig getServletConfig();

public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;

public String getServletInfo();

public void destroy();
}


可以看到Servlet接口是定义在javax.servlet包中,该接口定义了5个方法。
init() :在Servlet实例化之后,Servlet容器会调用init()方法,来初始化该对象,主要是为了让Servlet对象在处理客户请求之前可以完成一些初始化工作,比如:建立数据库的连接,获取配置信息。

service():容器调用service()方法来处理客户端的请求。

destroy():当容器检测到一个Servlet对象应该从服务器中被移除的时候,容器会调用该对象的destroy方法,以便让Servlet对象可以释放它所使用的资源,保存数据到持久化存储设备中,例如:将内存中的数据保存到数据库中,关闭数据库的连接。

2)GenericServlet
为什么会出现GenericServlet?如果我们直接通过实现Servlet接口来编写一个Servlet类,就需要实现Servlet接口中定义的5种方法,为了简化Servlet的编写,在javax.servlet包中,给我们提供了一个抽象的类GenericServlet,它提供了除service()方法外的其他4种方法的简单实现。GenericServlet类定义了一个通用的,不依赖具体协议的Servlet

package javax.servlet;

import java.io.IOException;
import java.util.Enumeration;
import java.util.ResourceBundle;

public abstract class GenericServlet
implements Servlet, ServletConfig, java.io.Serializable
{
private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
private static ResourceBundle lStrings =
ResourceBundle.getBundle(LSTRING_FILE);

private transient ServletConfig config;

public GenericServlet() { }

public void destroy() {
}

public String getInitParameter(String name) {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString("err.servlet_config_not_initialized"));
}

return sc.getInitParameter(name);
}

public Enumeration<String> getInitParameterNames() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString("err.servlet_config_not_initialized"));
}

return sc.getInitParameterNames();
}

public ServletConfig getServletConfig() {
return config;
}

public ServletContext getServletContext() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString("err.servlet_config_not_initialized"));
}

return sc.getServletContext();
}

public String getServletInfo() {
return "";
}

public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}

public void init() throws ServletException {

}

public void log(String msg) {
getServletContext().log(getServletName() + ": "+ msg);
}

public void log(String message, Throwable t) {
getServletContext().log(getServletName() + ": " + message, t);
}

public abstract void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;

public String getServletName() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString("err.servlet_config_not_initialized"));
}

return sc.getServletName();
}
}


3)HttpServlet
由于大多数网络应用中,都是浏览器通过HTTP协议去访问服务器资源,而我们编写的Servlet也主要是应用于HTTP协议的请求和响应,为了快速开发应用于HTTP协议的Servlet,Sun公司在javax.servlet.http包中给我们提供了一个抽象的类HttpServlet,他继承自GenericServlet类,用于创建适合Web站点的HTTP Servlet。

比如,doPost doGet这些方法,从request解析请求信息开始,将根据http协议的格式进行解析,分发到不同的请求方法处理中,doPost doGet也肯定是被service方法调用的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: