Servlet 请求和响应

 Servlet的存在就是要为客户服务。servlet的任务是得到一个客户的请求,再发回一个响应。

1 servlet的生命周期

加载类

容器加载servlet类。

初始化servlet

Servlet类的无参构造函数运行。

init()

在service()方法被调用之前执行,且Servlet在整个生命周期中,值执行一次。

service()

处理客户请求,有这个方法决定调用哪个方法(doGet或doPost 或者其他)。

destory()

容器调用这个方法,在servlet被回收前有机会清理资源。

表 servlet的生命周期

1.1 init() 方法

构造函数只是使Servlet类成为一个对象,而执行完init()是成为一个Servlet。

在执行init()方法期间,将会访问到ServletConfig及ServletContext对象。

ServletConfig

  1. 每个servlet都有一个ServletConfig对象。
  2. 用于向servlet传递部署时信息。
  3. 用于访问ServletContext。
  4. 参数在部署描述文件中配置。

ServletContext

  1. 每个Web应用有一个ServletContext(AppContext)。
  2. 用于访问Web应用参数(也在部署描述文件中配置)。
  3. 相当于一种应用公告栏,可以在这放置消息,应用的其他部分可以访问这些信息。
  4. 用于得到服务器信息,包括容器名称、版本以及所支持AP I得版本等。

表 ServletConfig和ServletContext对象

2 HTTP方法

GET

从服务器获取资源。

POST

用于向服务器提交数据、创建新的资源。通常用于提交表单数据、发送数据到服务器上的数据库或进行身份验证。

HEAD

只要求得到GET返回结果的首部部分。

TRACE

要求请求信息回送,以便客户可以看到中间服务器进行了哪些进度或增量,一般用于测试。

PUT

更新资源。主要用来传输文件,就像FTP协议的文件上传一样。但是因为HTTP/1.1 的PUT方法不带验证机制,存在安全性问题,所以一般都不用这个方法进行文件传输。

DELETE

用于删除服务器上的资源。

OPTIONS

用于向服务器请求关于支持的方法、认证信息和可接受的内容类型等信息。

CONNECT

要求连接以便建立隧道。

表 http常见方法

2.1 幂等操作

幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。

GET、HEAD和PUT方法是幂等的。

3 请求 HttpServletRequest

getParameteValue() 是用来从请求中得到一个参数。返回值总是一个String。

如果对应一个给定的参数名有多个参数值,要使用getParameteValues()方法来返回一个String数组。

getReader()和getInputStream()方法:只包含请求体和不包含请求头。

getHeader()和getIntHeader()方法:获取请求头信息。

getRemotePort()

获取客户的端口。

getServerPort()

获取服务器所监听的端口。

getLocalPort()

服务器会为每个请求线程找一个不同的本地端口,该方法获取的就是这个本地端口。

表 getServletPort()、getLocalPort()和getRemotePort()方法对比

4 实战

编写一个Servlet,要求打印出其生命周期中各个节点,同时编写Servlet对应的多个HTTP方法,获取相关请求参数及做出响应。

public class LifeServlet extends HttpServlet {

    public LifeServlet() {
        System.out.println("LifeServlet 无参数构造函数");
    }

    @Override
    public void init() throws ServletException {
        super.init();
        System.out.println("LifeServlet init()");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.service(req, resp);
        System.out.println("LifeServlet service()");
    }

    @Override
    public void destroy() {
        super.destroy();
        System.out.println("LifeServlet destroy");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost");
    }

//    运行结果:
//    LifeServlet 无参数构造函数  // 在第一次发起该servlet请求时触发
//    LifeServlet init()
//    doGet
//    LifeServlet service()
//    ...  // 停止tomcat
//    LifeServlet destroy
}

public class HttpMethodsServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("param1:" + req.getParameter("params1"));
        String[] param2s = req.getParameterValues("param2");
        System.out.println("param2:" + Arrays.asList(param2s));
        System.out.println("headNames:" + req.getHeaderNames());
        BufferedReader reader = req.getReader();
        System.out.println("reader:" + reader.readLine());

        PrintWriter writer = resp.getWriter();
        writer.println("hello response");
        reader.close();
        writer.close();
    }

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

    
        lifeServlet
        controller.LifeServlet
    

    
        lifeServlet
        /lifeServlet
    

    
        httpMethodsServlet
        controller.HttpMethodsServlet
    

    
        httpMethodsServlet
        /httpMethods
    

web.xml

你可能感兴趣的:(Head,First,Servlets,&,JSP,servlet)