servlet

参考资料:http://www.open-open.com/lib/view/open1331598718140.html
动态web资源开发技术有两种:servlet 和 jsp.
1.什么是servlet?
Servlet是一种服务器端的Java应用程序,Server + Applet =Servlet 意为服务器端的小程序,具有独立于平台和协议的特性,可以生成动态的Web页面。 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。 Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机.
2.servlet有什么作用?
当用户通过 URL 发出一个请求时,这些 Java servlet 类就将之转换成一个 HttpServletRequest,并发送给 URL 所指向的目标。当服务器端完成其工作时,Java 运行时环境(Java Runtime Environment)就将结果包装在一个 HttpServletResponse 中,然后将原 HTTP 响应送回给发出该请求的客户机。在与 Web 应用程序进行交互时,通常会发出多个请求并获得多个响应。所有这些都是在一个会话语境中,Java 语言将之包装在一个 HttpSession 对象中。在处理响应时,您可以访问该对象,并在创建响应时向其添加事件。
3.servlet容器
负责处理客户请求、把请求传送给Servlet并把结果返回给客户。不同程序的容器实际实现可能有所变化,但容器与Servlet之间的接口是由 Servlet API定义好的,这个接口定义了Servlet容器在Servlet上要调用的方法及传递给Servlet的对象类。
Tomcat 的容器模型中,Context 容器是直接管理 Servlet 在容器中的包装类 Wrapper,所以 Context 容器如何运行将直接影响 Servlet 的工作方式。
这里写图片描述

4.要实现servlet可以继承GenericServlet 或者 HttpServlet

GenericServlet :
定义了一个通用的,无关协议的的 Servlet 。如果要在 Web 应用中使用 Http 进行 Servlet 通信,请扩展 HttpServlet (即继承 HttpServlet )。

public abstract class GenericServlet
 implements Servlet, ServletConfig, Serializable
{
  private transient ServletConfig config;
  public void init()throws ServletException
  {
  }
  public void init(ServletConfig config)throws ServletException
  {
    this.config = config;
    init();
  }
  public ServletConfig getServletConfig()
  {
    return this.config;
  }
  public ServletContext getServletContext()
  {
    return getServletConfig().getServletContext();
  }
  public String getServletInfo()
  {
    return "";
  }
  public void destroy() {
  }
  public abstract void service(ServletRequest paramServletRequest, ServletResponse p  aramServletResponse)
    throws ServletException, IOException;

  public String getServletName()
  {
    return this.config.getServletName();
  }
  public String getServletName()
  {
    return this.config.getServletName();
  }
}

GenericServlet 是个抽象类,不能直接进行实例化,必须给出子类才能实例化。

即: GenericServlet gs = new GenericServlet(); 编译会报错。

GenericServlet gs = new MyServlet(); 这样是正确的(其中 MyServlet 是其子类)

其 service() 方法是个抽象方法,即它把处理请求的任务交给了子类。子类必须实现该方法。

继承genericServlet

public class genericServlet extends GenericServlet{

//继承GenericServlet必须实现他的抽象service()
@Override
public void service(ServletRequest arg0, ServletResponse resp)
throws ServletException, IOException {
public void service(ServletRequest arg0, ServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
OutputStream out=resp.getOutputStream();
out.write("hello servlet".getBytes());
}
}
}

HttpServlet 也是个抽象类,不能直接进行实例化,必须给出子类才能实例化(即不能直接使用,只能继承它)
httpServlet 是采用 Http 协议进行通信的,所以它也实现 Http 协议中的多种方法,

public abstract class HttpServlet extends GenericServlet implements
    Serializable {
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {}
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {}
 protected void service(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
      string method = req.getMethod();
    if (method.equals("GET")) {
      long lastModified = getLastModified(req);
      if (lastModified == -1L) {
        doGet(req, resp);
      } else {
        long ifModifiedSince = req.getDateHeader("If-Modified-Since");
        if (ifModifiedSince < lastModified / 1000L * 1000L) {
          maybeSetLastModified(resp, lastModified);
          doGet(req, resp);
        } else {
          resp.setStatus(304);
        }
      }
    } else if (method.equals("HEAD")) {
      long lastModified = getLastModified(req);
      maybeSetLastModified(resp, lastModified);
      doHead(req, resp);
    } else if (method.equals("POST")) {
      doPost(req, resp);
    } else if (method.equals("PUT")) {
      doPut(req, resp);
    } else if (method.equals("DELETE")) {
      doDelete(req, resp);
    } else if (method.equals("OPTIONS")) {
      doOptions(req, resp);
    } else if (method.equals("TRACE")) {
      doTrace(req, resp);
    } else {
      String errMsg = lStrings.getString("http.method_not_implemented");
      Object[] errArgs = new Object[1];
      errArgs[0] = method;
      errMsg = MessageFormat.format(errMsg, errArgs);

      resp.sendError(501, errMsg);
    }

}
 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);{
}
}
}

HttpServlet 的 service() 方法比较特殊,带 public 关键字的 service() 方法明显是继承自父类,它只接收 HTTP 请求,这里把相应的request 和 response 转换为了基于 HTTP 协议的相应对象 , 最终将请求转到带 protected 关键字的 service() 方法中。

protected service() 方法根据请求的类型将请求转发到相应的 doDelete() 、 doGet()、 doOptions() 、 doPost() 、 doPut() 等方法中。 所以开发自己的 Servlet 时,不需要覆盖 HttpServlet 的 service() 方法,因为该方法最终将请求转发给相应的 doXXX 方法中,只需要覆盖相应的 doXXX 方法进行请求处理即可。如果重写了该方法,那么就不会根据方法名调用其他具体的方法了。

同上道理, doOptions 和 doTrace 方法也不需要覆盖。

查看 doGet 、 doPost 、 doPut 、 doDelete四个方法代码,发现这些方法只是判断协议类型,然后抛出相应的异常,其他什么都没做,所以实现自己的 Servlet 时,需要重写这些方法,以符合自己的需要进行请求处理。

public class servletDemo extends HttpServlet{

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
//super.doGet(req, resp);
PrintWriter out=resp.getWriter();
out.print("hello servlet");
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
//super.doPost(req, resp);
doGet(req,resp);
}



}

5.servlet doGet和doPost的区别
在使用表单提交数据到服务器的时候有两张方式可共选择,一个是post一个是get。可在中的method属性中指定提交的方式。如:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值