Servlet

2019-03-25  本文已影响0人  丫甘九

1、什么是Servlet?

Servlet是javaweb的三大组件之一,它属于动态资源,servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
- 接收请求数据
- 处理请求
- 完成响应
例如客户端发出登陆请求,或者输出注册请求,这些请求都应该由Servlet来完成处理,Servlet需要我们自己来编写,每个Servlet必须实现java.servlet.Servlet接口

image.png

2、实现servlet的方式(由我们自己来编写)

实现servlet有三种方式

实现javax.servlet.Servlet接口
import javax.servlet.*;
import java.io.IOException;

public class AServlet implements Servlet{
    /*查看servlet接口中的方法*/
    /*什么叫生命周期方法?生命周期:(例如人)出生于哪年哪月那日,哪年哪月那日上小学,
    哪年哪月那日上初中,哪年哪月那日上大学,哪年哪月那日工作,哪年哪月那日死亡*/
    /*servlet的生命周期就为,第一次调用servlet方法起,到调用了多少次,直至最后一次调用*/

    /*它是生命周期方法(被Tomcat调用的方法)*/
    /*它会在servlet对象创建之后马上执行,并且只执行一次!(出生之后调用的第一个方法)*/
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init()...");

    }
    /*可以用来获取servlet的配置信息*/

    @Override
    public ServletConfig getServletConfig() {
        System.out.println("getServletConfig()...");
        return null;
    }
    /*它是生命周期方法*/
    /*它会被调用多次!!!*/
    /*每次处理请求都是在调用这个方法!*/

    @Override
    public void service(ServletRequest servletRequest, ServletResponse 
servletResponse) throws ServletException, IOException {
        System.out.println("service()...");
    }
    /*获取servlet的信息*/

    @Override
    public String getServletInfo() {
        System.out.println("getServletInfo()...");
        return null;
    }
    /*它是生命周期方法*/
    /*它会在servlet被销毁之前调用,并且只会被调用一次(自杀前调用的最后一个方法)*/

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

    }
}



特性

3、如何让浏览器访问Servlet

配置xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>

    <servlet-name>xxx</servlet-name>
    <servlet-class>cn.itcast.web.servlet.AServlet</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>xxx</servlet-name>
        <url-pattern>/AServlet</url-pattern>

    </servlet-mapping>
</web-app>

ServletConifg介绍

image.png
package lxbaoming;

import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;

public class AServlet implements Servlet{
    /*查看servlet接口中的方法*/
    /*什么叫生命周期方法?生命周期:(例如人)出生于哪年哪月那日,哪年哪月那日上小学,
     哪年哪月那日上初中,哪年哪月那日上大学,哪年哪月那日工作,哪年哪月那日死亡*/
    /*servlet的生命周期就为,第一次调用servlet方法起,到调用了多少次,直至最后一次调用*/

    /*它是生命周期方法(被Tomcat调用的方法)*/
    /*它会在servlet对象创建之后马上执行,并且只执行一次!(出生之后调用的第一个方法)*/
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init()...");
        /*获取初始化参数*/
        System.out.println(servletConfig.getInitParameter("p1"));
        System.out.println(servletConfig.getInitParameter("p2"));

        /*获取初始化参数的名称*/
        Enumeration e = servletConfig.getInitParameterNames();
        while (e.hasMoreElements()){
            System.out.println(e.nextElement());
        }

    }
    /*可以用来获取servlet的配置信息*/

    @Override
    public ServletConfig getServletConfig() {
        System.out.println("getServletConfig()...");
        return null;
    }
    /*它是生命周期方法*/
    /*它会被调用多次!!!*/
    /*每次处理请求都是在调用这个方法!*/

    @Override
    public void service(ServletRequest servletRequest, ServletResponse 
servletResponse) throws ServletException, IOException {
        System.out.println("service()...");
    }
    /*获取servlet的信息*/

    @Override
    public String getServletInfo() {
        System.out.println("getServletInfo()...");
        return null;
    }
    /*它是生命周期方法*/
    /*它会在servlet被销毁之前调用,并且只会被调用一次(自杀前调用的
    最后一个方法)*/

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

    }
}



xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
          http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <display-name>AServlet</display-name>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>xxx</servlet-name>
        <servlet-class>lxbaoming.AServlet</servlet-class>

        <init-param>
            <param-name>p1</param-name>
            <param-value>v1</param-value>

        </init-param>
        <init-param>
            <param-name>p2</param-name>
            <param-value>v2</param-value>

        </init-param>
    </servlet>


    <servlet-mapping>
        <servlet-name>xxx</servlet-name>
        <url-pattern>/AServlet</url-pattern>
    </servlet-mapping>
</web-app>
image.png

GenericServlet介绍

1、GenericServlet概述

模拟 GenericServlet类

package baoming;

import javax.servlet.*;
import java.io.IOException;
/*模拟GenericServlet*/

public class AServlet implements Servlet {
    private ServletConfig config;
    /*生命周期方法,由Tomcat来调用,并且只调用一次*/
    /*它是这些方法中第一个被调用的,它会在构造器之后马上被调用*/
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        //把tomcat传递的ServletConfig赋值给本类的一个成员,其实就是把它保存起来,
        // 方便在其他方法中使用!
        this.config = config;
        init();

    }
    /*这个方法是本类自己定义的! 不是servlet接口中的方法*/
    public void init(){

    }

    @Override
    public ServletConfig getServletConfig() {
     /*请放心,这个方法一定会在init()方法之后被调用
     * init()被调用后,本类的成员this.config已经有值了*/
        return this.config;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse 
servletResponse) throws ServletException, IOException {
        /*这里是否可以使用ServletConfig的成员(config)呢?
        * 因为这是在init()后面被调用,当然可以使用了*/
        System.out.println("每次处理请求都会被调用");
    }
    public ServletContext getServletContext(){
         return config.getServletContext();
    }
    public String getServletName(){
        return config.getServletName();
    }
    public String getInitParameter(String name){
        return config.getInitParameter(name);
    }
    /*没有用的东西,爱实现不实现,用字符串来对servlet做一个简单的描述*/
    @Override
    public String getServletInfo() {
        return "我是一个快乐的servlet";
    }

    /*需要就写,不需要就不写,临死之前的方法*/
    @Override
    public void destroy() {
        System.out.println("啊!我就要死了");
    }
}

封装后我们子类继承它

package baoming;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class BServlet extends AServlet {
   /* public void init(ServletConfig servletConfig) throws ServletException {
        //把tomcat传递的ServletConfig赋值给本类的一个成员,其实就是把它保存起来,
        // 方便在其他方法中使用!
        this.config = config;
        init();

    }
    在父类中的东西相当于在子类中,例如init()方法,tomcat调用init()方法,
    给config赋值,然后调用构造init()方法,然后子类重写构造init方法,既没有覆盖父类
    中的this.config = config;还能输出我们要在子类中输出的内容
    */
    public void init(){
        System.out.println("哈哈哈哈哈哈哈哈哈哈哈");
    }
    public void service(ServletRequest servletRequest, ServletResponse 
servletResponse) throws ServletException, IOException {
       String value = getInitParameter("p1");
    }
}

可以很明显的看出来代码量大大减少

上一篇 下一篇

猜你喜欢

热点阅读