美文网首页
一、Servlet概述

一、Servlet概述

作者: lifeline张 | 来源:发表于2018-07-16 15:26 被阅读0次

    一、问题引入

    在之前做的新闻管理系统中,jsp页面一方面显示数据,比如newsDetailVies页面;另一方面也接受请求,调用javaBean(后台的Service)去处理请求,比如doAdd界面。而JSP其实是一种负责显示的技术,那如何只专注于显示呢?相当于把接受请求、处理请求的功能模块给外包出去,外包给谁呢?就是今天要学的Servlet。把这一部分功能外包出去之后,显示与接受请求、处理请求的工作就分开了。显示JSP来做,接受请求、处理请求Servlet来做。

    二、初识Servlet

    image.png

    2.1Servlet做了什么

    Servlet本身不做任何业务处理,只是接受请求,并决定调用哪个Service去解决这个问题,然后决定用哪个界面来显示返回的数据。这会的问题是Servlet的载体是什么?

    2.2Servlet是什么

    Servlet是java程序,但是是运行在服务器端的java程序。(Servlet是由Server+Applet合成的。)服务器端的java程序太多了,后台src包里面的都是,但是只有当一个服务器端的程序使用了servlet API的时候,这个服务器端的程序才能称之为Servlet。

    2.3Servlet小结

    image.png

    2.4ServletAPI

    image.png

    2.5Servlet创建方式

    1、创建一个类,实现Servlet接口。
    示例代码:

    package cn.kgc.web.Servlet;
    
    import java.io.IOException;
    
    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class MyServlet1 implements Servlet {
    
        public void destroy() {
            // TODO Auto-generated method stub
    
        }
    
        public ServletConfig getServletConfig() {
            // TODO Auto-generated method stub
            return null;
        }
    
        public String getServletInfo() {
            // TODO Auto-generated method stub
            return null;
        }
    
        public void init(ServletConfig arg0) throws ServletException {
            // TODO Auto-generated method stub
    
        }
    
        public void service(ServletRequest arg0, ServletResponse arg1)
                throws ServletException, IOException {
            // TODO Auto-generated method stub
    
        }
    
    }
    

    2、继承GenericServlet类
    示例代码:

    package cn.kgc.web.Servlet;
    
    import java.io.IOException;
    
    import javax.servlet.GenericServlet;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class MyServlet2 extends GenericServlet {
    
        @Override
        public void service(ServletRequest arg0, ServletResponse arg1)
                throws ServletException, IOException {
            // TODO Auto-generated method stub
    
        }
    
    }
    

    GenericServlet类对Servlet接口中的除了service方法的其他四个方法进行了默认实现,所以继承GenericServlet类之后不需要管其他的方法了,只需要在service方法中写代码就行了。

    3、在包里面new一个Servlet(最简单也最常用)
    此时会默认继承javax.servlet.http.HttpServlet父类,并实现一些方法,同时会在web.xml中保存初始设置。


    image.png

    在上面这个图中,有两个数据:Servlet Name和Servlet Mapping URL,这两个数据的作用是在web.xml中保存数据。
    web.xml数据:


    image.png
    示例代码:
    package cn.kgc.web.Servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MyServlet3 extends HttpServlet {
        
        public MyServlet3() {
            super();
        }
    
        public void destroy() {
            super.destroy(); // Just puts "destroy" string in log
            // Put your code here
        }
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
            out.println("<HTML>");
            out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
            out.println("  <BODY>");
            out.print("    This is ");
            out.print(this.getClass());
            out.println(", using the GET method");
            out.println("  </BODY>");
            out.println("</HTML>");
            out.flush();
            out.close();
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
            out.println("<HTML>");
            out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
            out.println("  <BODY>");
            out.print("    This is ");
            out.print(this.getClass());
            out.println(", using the POST method");
            out.println("  </BODY>");
            out.println("</HTML>");
            out.flush();
            out.close();
        }
    
        public void init() throws ServletException {
            // Put your code here
        }
    
    }
    

    一般在开发的时候会把构造方法,destroy方法和init方法都去掉,只留下doGet和doPost。这两种方式分别对应表单的get和post方法。

    注:要使用一个Servlet,只创建是不行的,还需要在web.xml中写配置文件,前两种方式需要用手写,但是容易出错。最后一种方式直接会生成配置文件,配置文件主要如下:

    <servlet>
        <description>This is the description of my J2EE component</description>
        <display-name>This is the display name of my J2EE component</display-name>
        <servlet-name>MyServlet3</servlet-name>
        <servlet-class>cn.kgc.web.Servlet.MyServlet3</servlet-class>
      </servlet>
    
      <servlet-mapping>
        <servlet-name>MyServlet3</servlet-name>
        <url-pattern>/servlet/MyServlet3</url-pattern>
      </servlet-mapping>
    

    配置文件分析:
    1、servlet标签和servlet-mapping标签成对出现。
    2、servlet标签标签中的description标签和display-name标签没什么用,可以删除掉。
    3、servlet-name标签里面的数据两个都一样,只要这个标签里面数据一样的,都是一对。
    4、在servlet标签中,servlet-name的意思是内部映射名,servlet-class是内部映射类:cn.kgc.web.Servlet.MyServlet3
    5、在servlet-mapping标签中,servlet-name的也是名字,其作用是根据servlet标签中的名字来找servlet-mapping标签中相对应的名字;url-pattern是servlet映射,用户通过里面的数据就可以访问MyServlet3了。
    6、也就是说在servlet标签中存放的是servlet名和这个名对应的servlet类;在servlet-mapping标签中存放的是servlet名和这个名所对应的类所在的url地址。

    三、运行Servlet

    观察通过第三种方式创建的Servlet里面的各个方法的实现时机。

    3.1示例代码

    package cn.kgc.web.Servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MyServlet3 extends HttpServlet {
        
        public MyServlet3() {
            super();
        }
    
        public void destroy() {
            System.out.println("销毁Servlet");
        }
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            System.out.println("进入doGet()");
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            System.out.println("进入doPost()");
        }
    
        public void init() throws ServletException {
            System.out.println("初始化Servlet");
        }
    
    }
    

    3.2开启方式

    因为Servlet需要web容器的支持,所以部署在Tomcat上。
    将创建的Servlet项目部署到Tomcat上,然后访问该项目下面的MyServlet3 。
    访问网址如下:http://localhost:8080/ServletDemo1/servlet/MyServlet3

    3.3运行结果

    image.png

    最开始访问的时候会出现初始化和进入doGet(),之后每刷新一次就出现一次doGet()。

    3.4销毁

    image.png

    停止服务器,不要通过console界面的红按钮去停止,通过开启的那个按钮去停止服务器,就会看到servlet的销毁。原因是Servlet的运行需要依赖外部容器,所以外部容器消失的时候Servlet就销毁了。从初始化到销毁就是servlet的一个生命周期。

    相关文章

      网友评论

          本文标题:一、Servlet概述

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