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 }}