①通过实现Servlet接口来开发servlet
这种方式能很好的体现一个servlet的生命周期但是不常用到。
在Servlet接口中一共定义了五个方法,我们要将他们一一实现才能算是完成一个servlet。以下这五个方法。
⑴void init()throws ServletException{} 是servlet的生命周期方法,该方法是用来初始化servlet的,只在该servlet第一次创建对象的时候被调用一次。
⑵void service(ServletRequest req,ServletResponse res){}
生命周期方法, 这个方法中用来存放该servlet的业务代码,也就是需要完成的程序代码。每次servlet被调用该方法都会执行。
⑶void destroy(){} 生命周期方法,当servlet被销毁时执行这个方法。
⑷public ServletConfig getConfig(){} 好像是一个返回该Servlet初始化参数和启动参数的ServletConfig对象的方法。一般在编写Servlet时都让它返回null。
⑸public String getServletInfo(){} 返回该Servlet类的信息,开发者,开发时间之类的。
代码如下:
import java.io.*; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; //实现Servlet接口来开发Servlet。 public class Welcom implements Servlet{ //处理业务的方法,每当客户端访问一次该Servlet就会被调用一次 public void service(ServletRequest request,ServletResponse response){ //javax.servlet.ServletResponse response; try{ PrintWriter pw=response.getWriter(); pw.println("welcom !"); }catch(Exception ex){ ex.printStackTrace(); } } public ServletConfig getServletConfig(){ return null; } public String getServletInfo(){ return null; } //初始化的方法,只会在用户访问该Servlet时被调用,且只会被调用一次。 public void init (ServletConfig arg0){ System.out.println("init it! "); } //释放内存。 public void destroy(){ System.out.println("destroy"); } }
②通过继承GenericServlet
这种方式也不是经常会用到的方式,
这种方式通过继承GenericServlet类,覆盖该类中的service方法来开发servlet,
public void servic(ServletRequest request,ServletResponse response)
{}在这个方法中写入业务代码。代码如下:
[java] view plain copy package com.kiritor.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.GenericServlet; import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * Servlet implementation class ExGenericServlet */ public class ExGenericServlet extends GenericServlet implements Servlet { private static final long serialVersionUID = 1L; /** * @see GenericServlet#GenericServlet() */ public ExGenericServlet() { super(); // TODO Auto-generated constructor stub } /** * @see Servlet#service(ServletRequest request, ServletResponse response) */ public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { PrintWriter writer = response.getWriter(); writer.write("Imp Servlet!"); writer.flush(); writer.close(); } }
③通过继承HttpServlet类来创建servlet
这种方式是最常见的一种方式开发Servlet
因为http在提交表单的时候一般都是get和post两种方法。
用这种方式的话,就要通过覆盖
doGet(HttpServletRequest req,HttpServletResponse res)和
doPost(HttpServletRequest req,HttpServletResponse res)两种方法来完成。
在覆盖两个方法时,需要传入HttpServletRequest 和HttpServletResponse 两个类的实例对象,这两个对象不需要我们去创建,web容器会帮我们去创建,我们只需要在方法中传入就行了。
在方法体中因为在调用的过程中可能会抛出异常,所以需要方法内try{}catch()住可能会抛异常的代码。
如果两种方法处理业务逻辑都相同的话,在两个方法中都写出同样的代码就会代码重复,为了提高代码复用性我们只需要在doPost()方法中通过this.doGet(),来完成同样的任务,反之亦可。
代码如下:
import javax.servlet.http.*; import java.io.*; public class DengLu extends HttpServlet { public void doGet(HttpServletRequest req,HttpServletResponse res){ try{ res.setContentType("text/html;charset=gbk"); PrintWriter pw=res.getWriter(); pw.println("<HTML>"); pw.println("<BODY>"); pw.println("<h1 align='center'>登录界面</h1>"); pw.println("<form action=tiaozhuan method=post>"); pw.println("<p align='center'>用户名:<input type=text name=username></p>"); pw.println("<p align='center'>密码 :<input type=password name=pw></p>"); pw.println("<p align='center'><input type=submit valua=登录></p>"); pw.println("</form>"); pw.println("</BODY>"); pw.println("</HTML>"); }catch(Exception ex){ ex.printStackTrace(); } } public void doPost(HttpServletRequest req,HttpServletResponse res){ this.doGet(req, res); } }