共计 2600 个字符,预计需要花费 7 分钟才能阅读完成。
一、什么是 Servlet
Servlet 是 JavaWeb 的 三大组件之一,它属于动态资源。Servlet 的作用是处理请求,服务器会把接收到的请求交给 Servlet 来处理,在 Servlet 中通常需要:
- 接收请求数据;
- 处理请求;
- 完成响应。
例如客户端发出登录请求,或者输出注册请求,这些请求都应该由 Servlet 来完成处理!Servlet 需要我们自己来编写,每个 Servlet 必须实现 javax.servlet.Servlet 接口。
二、实现 Servlet 的方式
实现 Servlet 有三种方式:
1、实现 javax.servlet.Servlet 接口;
2、继承 javax.servlet.GenericServlet 类;
3、继承 javax.servlet.http.HttpServlet 类;
通常我们会去继承 HttpServlet 类来完成我们的 Servlet,但学习 Servlet 还要从 javax.servlet.Servlet 接口开始学习。
了解 Servlet 接口
Servlet.java
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();
}
了解 GenericServlet 类
GenericServlet 是 Servlet 接口的实现类,我们可以通过继承 GenericServlet 来编写自己的 Servlet。
GenericServlet.java
public abstract class GenericServlet implements Servlet, ServletConfig,
java.io.Serializable {private static final long serialVersionUID = 1L;
private transient ServletConfig config;
public GenericServlet() {}
@Override
public void destroy() {}
@Override
public String getInitParameter(String name) {return getServletConfig().getInitParameter(name);
}
@Override
public Enumeration<String> getInitParameterNames() {return getServletConfig().getInitParameterNames();
}
@Override
public ServletConfig getServletConfig() {return config;
}
@Override
public ServletContext getServletContext() {return getServletConfig().getServletContext();
}
@Override
public String getServletInfo() {return "";
}
@Override
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);
}
@Override
public abstract void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
@Override
public String getServletName() {return config.getServletName();}
}
了解 HttpServlet 类
HttpServlet 类是 GenericServlet 的子类,它提供了对 HTTP 请求的特殊支持,所以通常我们都会通过继承 HttpServlet 来完成自定义的 Servlet。
HttpServlet.java
public abstract class HttpServlet extends GenericServlet {protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {……}
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {throw new ServletException("non-HTTP request or response");
}
service(request, response);
}
……
}
注意:
Servlet 中的方法大多数不由我们来调用,而是由 Tomcat 来调用。并且 Servlet 的对象也不由我们来创建,由 Tomcat 来创建!