JavaWeb_servlet(4)_ HttpServlet

JavaWeb_servlet

HTTP 请求的 Servlet

● 因为现在我们的请求都是基于 HTTP 协议的,所以我们应该专门为 HTTP 请求写一个 Servlet 做为通用父类。

  • 对于专注于 HTTP 的 Servlet,我们需要处理以下几个问题:
    service() 方法的参数 ServletRequest 和 ServletResponse,但因为所有的请求都是 HTTP 请求,所以传递给 service() 就去的参数其实是 HttpServletRequest 和 HttpServletResponse 对象。如果子类希望使用的是 HttpServletRequest,而不是ServletRequest,那么它需要自己去做强转。

● Servlet:SUN公司设计之初,以后不仅仅依赖HTTP协议

  • GenericServlet — 通用Servlet
    • service(ServletRequest req, ServletResponse res)
  • HttpServlet — 与协议相关的Servlet
    • service(HttpServletRequest req, HttpServletResponse resp)
  • 以后再写 Servlet 继承 HttpServlet
    • Servlet — 一个标准
      |
      GenericServlet — 是 Servlet 接口子类
      |
      HttpServlet — 是 GenericServlet 子类,一个专门处理 Http 请求的 Servlet

● HttpServlet

  • 两个 Service 方法(只需要重写doGet和doPost就行)
    • 父类 service 调用子类 service 使用子类service方法就可以
    • 子类中 service 根据请求方式不同调用不同的方法

● 写一个 Servlet 继承 HttpServlet

  • 重写 doGet 和 doPost 方法.
  • Java 中已经存在了 javax.servlet.http.HttpServlet 类

● HTTP请求方法

  • HTTP 请求方法不只是 GET 和 POST,还有其他的方法,但基本上用不上。这里只是简单介绍一下。你自己心里有个数,HTTP 请求除了 GET 和 POST 之外还有别的就行了。
    • GET 通过请求 URI 得到资源
    • POST用于添加新的内容
    • PUT 用于修改某个内容
    • DELETE 删除某个内容
    • CONNECT 用于代理进行传输,如使用 SSL
    • OPTIONS 询问可以执行哪些方法
    • PATCH 部分文档更改
    • RACE 用于远程诊断服务器
    • HEAD 类似于 GET, 但是不返回 body 信息,用于检查对象是否存在,以及得到对象的元数据
    • TRACE 用于远程诊断服务器

● 示例

  • 编码(基于第一个例子)(完整源码见文末)
    JavaWeb_servlet(4)_ HttpServlet
  • 更改 index.jsp
    JavaWeb_servlet(4)_ HttpServlet
    3、测试
    JavaWeb_servlet(4)_ HttpServlet
    JavaWeb_servlet(4)_ HttpServlet

以上操作完整源码:

package com.wyx.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 
 * doGet是给 get 方式的 http 的请求做相应的 doPost 是给 post方式的 http 的请求做相应的
 */
public class demo1 extends HttpServlet
{

	@Override
	public void init() throws ServletException
	{
		System.out.println("HttpServletDemo实例被创建了");
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException
	{
		System.out.println("doGet方法被调用了");
		resp.getOutputStream().write("doGet方法被调用了".getBytes());
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException
	{
		System.out.println("doPost方法被调用了");
		doGet(req, resp);
	}
}

如有错误,欢迎指正!