Servlet是一个容器,在javaweb开发中,tomcat就是一个servlet容器。
生命周期:构造器、init初始化、service被多次调用、destroy销毁。
ServletConfig对象封装了所有的配置信息:获取service初始化参数和多个参数、获取servlet名字、获取ServletContext(他是web的大管家)。
init:自动生成当前的servletconfig,是arg0参数的形式。
service:自动生成当前的request(封装所有与请求有关的信息)和response(封装反馈的信息),以arg0和arg1的形式。
ServletContext(他是web的大管家):获取web的初始化参数、application范围内的属性、attribute等。
当我们写servlet时,实现Servlet接口有点繁琐,所以我们可以预先设计一个抽象类,然后只需要继承该抽象类,实现抽象方法service即可。同时也可以实现config接口。
如下:
package com;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
// 自定义的servlet 的实现类 抽象类 所有的servlet都可以继承该类 以简化开发。
public abstract class MyGeneralServlet implements Servlet,ServletConfig {
ServletConfig servletConfig=null;
public void destroy() {
// TODO Auto-generated method stub
}
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return servletConfig;
}
public String getServletInfo() {
return null;
// TODO Auto-generated method stub
}
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
this.servletConfig=arg0;
}
public abstract void service(ServletRequest arg0, ServletResponse arg1);
//以下是ServletConfig接口的方法
@Override
public String getInitParameter(String arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public Enumeration<String> getInitParameterNames() {
// TODO Auto-generated method stub 这是返回sevlet的init参数 而context获取的是web参数。
return servletConfig.getInitParameterNames();
}
@Override
public ServletContext getServletContext() {
// TODO Auto-generated method stub context是某一个web程序具备的 是web应用的管家
return servletConfig.getServletContext();
//通过获取ServletContext 然后调用ServletContext的getInitParameterNames获取init参数。
}
@Override
public String getServletName() {
// TODO Auto-generated method stub
return servletConfig.getServletName();
}
}
但是在实际开发中 用的是HttpServlet (已经实现好了) 是一个继承了GenericServlet的容器。
HttpServlet 原理如下,实现自定义的MyGeneralHttpServlet .则再写的servlet直接继承此,实现doGet 和doPost即可。 request和 response参数已经是实现好的,直接调用。
package com;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//
public class MyGeneralHttpServlet extends MyGeneralServlet{
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException {
HttpServletRequest request;
HttpServletResponse response;
try{
request=(HttpServletRequest)arg0;
response=(HttpServletResponse)arg1;
}catch(ClassCastException e){
throw new ServletException("http error");
}
service(request,response);
}
public void service(HttpServletRequest request,HttpServletResponse response){
String method=request.getMethod();
if("GET".equals(method)){doGet(request,response);}
if("POST".equals(method)){doPost(request,response);}
}
private void doPost(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
}
private void doGet(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
}
}