Servlet简单介绍(一)

前言

Servlet的出现

    早期的web服务器习惯于处理静态资源请求,随着网络的发展,用户所访问的资源已经不仅仅局限于服务器硬盘上存放的静态资源,更多的应用需要根据用户的请求动态生成页面信息。这时候就需要一个帮助程序来帮忙处理动态请求,web服务器会将动态请求转发给帮助程序,由帮助程序做一定的计算或者与数据库交互,帮助程序处理后,返回处理后的静态结果给web服务器。
    这个帮助程序提供了相应的扩展功能,早期的web服务器扩展机制是CGI(Common Gateway Interface),公共网关接口,然而CGI程序存在编写困难,对用户请求的相应时间较长、性能较差等不足,1997年,SUN 公司推出了Servlet技术,作为Java 阵营的CGI解决方案。作为对微软ASP技术的回应,SUN公司于1998年推出了JSP技术,允许在html页面中嵌入Java脚本代码,从而实现动态网页功能。

什么是Servlet

    Servlet 是Java 语言中编写Web服务器扩展功能的重要技术,同时又时JSP技术的底层运行基础。
    Servlet是为了解决实现动态页面而衍生的东西,它基于B/S 模式,用来处理请求和发送相应。它是一个规范,编写一个Servlet 实际上是按照Servlet规范编写一个java类,作为web组件,被Servlet容器所管理。

Servlet 和 Tomcat的关系

    上面提到Servlet是一个web组件,需要部署到容器中才能运行,Tomcat就是一个容器,符合一定规范,提供组件运行环境。
    Tomcat 是一个web应用服务器,也是一个servlet/jsp 容器。用于将客户端的请求传送给servle容器,servlet容器实例化一个servlet,将请求传送给实例化的servlet,并将servlet的相应传送回客户端。
这里写图片描述
【tomcat服务器接受客户端请求并做出响应】补充描述:
① 客户端(通常都是浏览器)访问web服务器,发送http请求
② web服务器接收到请求后,传递给Servlet容器。
③ Servlet容器加载Servlet,产生Servlet实例后,向其传递表示请求和响应的对象。
④ Servlet实例使用请求对象得到的客户端的请求信息,然后进行相应的处理。
⑤ servlet实例将处理结果通过相应对象发送回客户端,容器负责确保相应正确送出,同时将控制返回给web服务器。

Servlet的使用

生命周期

    Servlet 的生命周期是指Servlet从产生到毁灭的过程,有三个生命周期函数,分别是 初始化Init() 、服务service()、销毁destory() 方法。

  • Init() 方法
        创建Servlet 实例时会调用改Servlet 的构造函数去创建一个具体的对象,如果有客户端请求,web服务器会调用Servlet对象的init方法。
        在一个Servlet 生命周期中,init 方法只会被执行一次。
         init方法有一个类型为ServletConfig 的参数,向Servlet 传递配置信息,主要负责简单的创建或者加载一些数据,这些数据将用于该Servlet 的整个生命周期中。
  • service() 方法
         当客户端请求到来时,service方法负责处理客户端的请求,由web服务器调用service方法去接收请求,构造一个类型为ServletRequest的请求对象 和 一个类型为ServletResponse的响应对象作为参数传递给方法,处理请求,并把处理结果返回。
        做为开发人员,我们只需要关注好service 自动调用的doGet、doPost 等方法的实现就可以了。
  • destory() 方法
        当web应用关闭或者容器关闭或者电脑关闭时,调用destory 方法销毁servlet ,这时候容器将不会再把其他的请求发送给该对象。
        在一个Servlet 生命周期中,该方法只会被执行一次。

工作原理(请求到web服务器到Servlet流程)

这里写图片描述
注: 客户端(浏览器)是通过URL 地址访问web服务器中的资源,URL地址(http://hostname: port/contextpath/servletpath) hostname和port 用来与服务器建立TCP连接,后面的URL 用来选择在服务器中哪个子容器服务用户的请求,这个是在web.xml 中部署完成的。

<!-- 请求地址:http:localhost:8080/test01/MyServlet -->
<servlet>
    <!-- 3、找到servlet的名字,这个名字自定义,与下面的名字保持一致 -->
    <servlet-name>MyServlet</servlet-name>
    <!-- 4、servlet的全限定类名,找到了servlet的位置 -->
    <servlet-class>test01.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
    <!-- 2、找到servlet的名字 -->
    <servlet-name>MyServlet</servlet-name>
    <!-- 1、浏览器通过该url 找到servlet -->
    <url-pattrern>/MyServlet</url-pattern>
</servlet-mapping>

编写第一个Servlet

  • 1、开发Servlet
package helloWorldServlet;

//导入必需的java库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

//实现一个servlet需要继承HttpServlet ,更好地服务于http请求
public class HelloWorld extends HttpServlet{


    private static final long serialVersionUID = 1L;
    private String message;

    //初始化方法
    public void init() throws ServletException{
        message = "Hello World";
    }

    public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{

        //设置响应内容类型
        response.setContentType("text/html");

        //具体的逻辑
        PrintWriter out = response.getWriter();
        out.println("<h1>" + message + "</h1>");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    public void destory(){

    }
}

为什么在servlet 中没有见到service ()方法?

    我们都知道编写的servlet 继承于HttpServlet ,而httpServlet 又继承于GenericServlet类,在HttpServlet中提供了两个重载的service()方法,第一个service方法将req 对象和res 对象转换为HttpServletRequest 和 HttpServletResponse 类型,然后调用第二个service()方法对客户请求进行处理,将转换后的HttpServletRequest对象和HttpServletResponse 对象作为参数传递进去,首先调用HttpServletRequest对象的getMethod()方法,获取HTTP请求方法的类型,调用相应的doXxx()方法,所以我们在实现servlet时不需要去重写service()方法,只需要重写相应的doXxx()方法即可。

总结

    servlet的内容先介绍到这里,后面博文将会写到servlet 的会话跟踪机制。

猜你喜欢

转载自blog.csdn.net/zt15732625878/article/details/80877896