1. 每一个servlet都必须实现Servlet接口,GenericServlet是个通用的,不特定于任何协议的Servlet,它实现了Servlet接口,而HttpServlet继承了GenericServlet,因此HttpServlet也实现了Servlet接口,所以我们定义的Servlet只需要集成HttpServlet父类即可。
2. Servlet接口中定义了service方法,HttpServlet对该方法进行了实现,实现方式是将ServletRequest和ServletResponse转换为HttpServletRequest和HttpServletResponse.
3. HttpServlet类中所提供的doGet, doPost等方法都是直接返回错误信息,所以我们需要在自己定义的service类中override这些方法。
4. 在Servlet接口中,定义了五个方法,其中三个方法代表了Servlet的生命周期 :
1). init方法,负责初始化Servlet对象
2). service方法,负责响应客户的请求
3). destroy方法,当Servlet对象退出声明周期时,负责释放占用的资源。
5. 某些Servlet在web.xml文件中只有<servlet></servlet>元素而没有<servlet-mapping></servlet-mapping>元素,这样我们就无法通过url地址的方式访问这个Servlet, 这种Servlet通过会在<servlet></servlet>元素中配置一个<load-on-startup></load-on-startup>子元素,让容器在启动的时候自动加载该Servlet,并且调用其init方法完成一些全局性的初始化工作。
6. ServletContext和Web应用关系
当Servlet容器启动Web应用时,并为每个web应用创建唯一的ServletContext对象。可以把ServletContext看成是一个Web应用的服务器端组件的共享内存。
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "CounterServlet")
public class CounterServlet extends HttpServlet {
private int count = 0;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = request.getServletContext();
Object obj = servletContext.getAttribute("count");
if(null != obj){
count = (int)obj;
}
count++;
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("utf-8");
servletContext.setAttribute("count",count);
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head> <title>计数器</title></head>");
out.println("<body>访问人数:");
out.println(count);
out.println("</body>");
out.println("</html>");
}
}