美文网首页MacOS, Java和IDEA
Tomcat和Servlet基础介绍

Tomcat和Servlet基础介绍

作者: SpaceCat | 来源:发表于2018-12-20 00:15 被阅读10次

    1、Tomcat介绍

    Tomcat是一个容器,如果
    Web服务器应用(如
    Apache)得到一个指向servlet的请求(非静态页面),此时服务器不会把这个请求交给servlet本身,而是交给部署该servlet的容器。要由容器向servlet提供HTTP请求和响应,而且要由容器调用servlet的方法,如doPost()或者doGet()。

    1.1 Tomcat功能

    Tomcat容器用来管理和运行servlet,主要完成了如下的功能:

    • 通信支持
      利用容器提供的方法,能够让servlet和Web服务器对话。无需自己建立ServerSocket、监听端口、创建流等。容器知道自己与Web服务器之间的协议,所以你的servlet不必担心Web服务器(如Apache)和你自己Web代码之间的API。开发人员只需要考虑如何在servlet中实现业务逻辑即可。
    • 生命周期管理
      容器控制着servlet的生与死,负责加载类、实例化和初始化servlet、调用servlet方法,并使servlet实例能够被垃圾回收。
    • 多线程支持
      容器会自动为接收的每个servlet请求创建一个新的Java线程。针对客户请求,如果servlet已经运行完相应的HTTP服务方法,这个线程就会结束。
    • 声明方式实现安全
      通过容器,可以使用XML部署描述文件来配置和修改安全性,而不必将其硬编码写到servlet或者其他类代码中。
    • Jsp支持
      容器负责将jsp代码翻译成java执行。

    1.2 Tomcat处理请求的过程

    当客户向servlet发起一个请求,容器的处理过程如下:

    • Tomcat容器看出这是一个向servlet发起的请求,然后,Tomcat容器会创建两个对象HttpServletReponse和HTTPServletRequest,分别代表请求和响应对象。
    • 容器根据请求URL,在web.xml配置文件中找到对应的servlet,为这个请求创建或者分配一个线程,并把前面创建的请求和响应对象传递给这个servlet线程。
    • 容器调用servlet的service()方法。然后根据请求类型的不同,service()方法会用请求和响应对象作为参数调用对应的doGet()或者doPost()方法。
    • 然后,由doGet()或者doPost()方法生成动态页面“填入”响应对象。
    • 线程结束时,容器把响应对象转换为一个HTTP响应,然后把它发给客户,然后删除请求和响应对象。最后,线程要么被撤销,要么返回到容器管理的一个线程池。

    2、Servlet介绍

    Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
    Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

    2.1 servlet的生命周期

    • 实例化和初始化
      一般来说,servlet会在第一次被访问时被实例化,实例化之后,会调用init()方法(该方法在servlet的整个生命周期中只执行一次)来完成一些初始化的操作(比如得到一个数据库连接等)。
    • 处理请求
      接下来,任何对该servlet的每次请求,都会在一个单独的线程中执行servlet的service()方法(service()方法会进一步根据请求的类型,调不同的doGet()或者doPsot()方法)。
    • 销毁servlet
      在servlet被垃圾回收,被销毁之前会调用destroy()方法(该方法在servlet的整个生命周期中也只执行一次)完成一些销毁的操作。

    2.2 Servlet的简单例子

    Servlet使用比较方便,一般来说就是重写doGet()和doPost()方法,这里简单介绍两个例子。

    2.2.1 Servlet中使用RequestDispatcher将请求发给jsp

    通过这种方式,使用jsp可以避免将大量的页面展现,写死在servlet的代码中,实现展现和处理的分离。
    Servlet2Jsp.java代码:

    package com.web.test;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * Created by chengxia on 2018/12/3.
     */
    public class Servlet2Jsp extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String []nbaPlayers = {"Kobe Byrant","Tim","Jordan"};
            request.setAttribute("players",nbaPlayers);
            RequestDispatcher view = request.getRequestDispatcher("players.jsp");
            view.forward(request,response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
    

    Jsp文件的代码(players.jsp):

    <%--
      Created by IntelliJ IDEA.
      User: chengxia
      Date: 2018/11/25
      Time: 12:40 PM
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>My Favourite NBA Players!</title>
      </head>
      <body>
        <h1>My Favourite NBA Players:</h1>
        <%
          String [] players = (String [])request.getAttribute("players");
          for(int i=0; i < players.length; i++){
              out.print("<h2>" + players[i] + "</h2>");
          }
        %>
      <h2></h2>
      </body>
    </html>
    

    运行效果:


    servlet到jsp效果

    2.2.2使用servlet重定向让浏览器完成工作

    有时候,需要将请求转发给另外一个url,这里可以通过servlet重定向来完成。
    ServletRedirect.java代码如下:

    package com.web.test;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * Created by chengxia on 2018/12/3.
     */
    public class ServletRedirect extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.sendRedirect("http://www.baidu.com");
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    

    当请求这个servlet时,浏览器中会出现百度首页,因为我们在servlet中做了重定向。

    2.2.3 重定向和RequestDispatcher请求分派的区别

    重定向是由客户来完成的,客户会在浏览器看到新的url。而前面通过RequestDispatcher做的请求分派是在服务器端做的。

    相关文章

      网友评论

        本文标题:Tomcat和Servlet基础介绍

        本文链接:https://www.haomeiwen.com/subject/wrhekqtx.html