一、Servlet概述

一、问题引入

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

二、初识Servlet

一、Servlet概述_第1张图片
image.png

2.1Servlet做了什么

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

2.2Servlet是什么

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

2.3Servlet小结

一、Servlet概述_第2张图片
image.png

2.4ServletAPI

一、Servlet概述_第3张图片
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中保存初始设置。


一、Servlet概述_第4张图片
image.png

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


一、Servlet概述_第5张图片
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("");
        out.println("");
        out.println("  A Servlet");
        out.println("  ");
        out.print("    This is ");
        out.print(this.getClass());
        out.println(", using the GET method");
        out.println("  ");
        out.println("");
        out.flush();
        out.close();
    }

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

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("");
        out.println("");
        out.println("  A Servlet");
        out.println("  ");
        out.print("    This is ");
        out.print(this.getClass());
        out.println(", using the POST method");
        out.println("  ");
        out.println("");
        out.flush();
        out.close();
    }

    public void init() throws ServletException {
        // Put your code here
    }

}

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

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


    This is the description of my J2EE component
    This is the display name of my J2EE component
    MyServlet3
    cn.kgc.web.Servlet.MyServlet3
  

  
    MyServlet3
    /servlet/MyServlet3
  

配置文件分析:
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运行结果

一、Servlet概述_第6张图片
image.png

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

3.4销毁

一、Servlet概述_第7张图片
image.png

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

你可能感兴趣的:(一、Servlet概述)