Servlet

servlet = server+applet运行在服务器端的java程序
servlet是一个接口,一个类如果想通过服务器访问到,那么这个类就必须直接间接的实现Servlet接口
作用是:接受请求,处理逻辑,响应结果

快速开始

定义类实现Servlet接口,并重写该Servlet接口的抽象方法

public class HelloServlet extends HttpServlet {
    /**
     * 构造器执行顺序
     * 优先执行
     */
    public HelloServlet(){
        System.out.println("构造器执行了");
    }
    /**
     * 前端发送的请求会在service方法中做逻辑处理
     * 一般在开发中不会这样写
     * @param req
     * @param res
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("hello requestServlet");
    }

    /**
     * 当web服务器关闭时会执行该方法
     */
    @Override
    public void destroy() {
        System.out.println("销毁容器");
    }

    /**
     * 当前端发送请求时会执行该方法,初始化容器
     * @throws ServletException
     */
    @Override
    public void init() throws ServletException {
        System.out.println("开始初始化容器");
    }
}

配置xml

    <!--配置HelloServlet的映射-->
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.lifly.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/HelloServlet</url-pattern>
    </servlet-mapping>

servlet的生命周期

生命周期是指一个对象从创建到销毁的过程
init方法,servlet对象创建时,调用此方法
service方法,用户访问servlet,调用此方法,每访问一次,执行一次
destory方法,servlet对象小回迁,调用此方法(Servlet被销毁执行,服务器正常关闭,才会执行destroy方法,destory方法在servlet销毁之前执行,一般用于释放资源)

servletConfig对象

主要用于读取web.xml配置文件servlet中<init-param>信息,实现参数和代码的解耦
例如读取xml中的字符编码配置</init-param>

public class ServletConfigServlet implements Servlet {
//    定义成员变量
    private ServletConfig servletConfig;
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
//        将init中的servletConfig对象,复制给成员变量
        this.servletConfig = servletConfig;
        System.out.println("ServletConfigServlet 初始化开始");
    }

    @Override
    public ServletConfig getServletConfig() {
//        获取全局的ServletConfigServlet对象
        return servletConfig;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//        获取web.xml文件中配置的编码
        String encode = getServletConfig().getInitParameter("encode");
        System.out.println(encode);
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("ServletConfigServlet 销毁");
    }
}

xml配置

    <!--ServletConfigServlet映射-->
    <servlet>
        <servlet-name>ServletConfigServlet</servlet-name>
        <servlet-class>com.lifly.servlet.ServletConfigServlet</servlet-class>
        <!--配置局部编码-->
        <init-param>
            <param-name>encode</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletConfigServlet</servlet-name>
        <url-pattern>/ServletConfigServlet</url-pattern>
    </servlet-mapping>

Servlet3.0

简化web.xml配置servlet复杂性,提高开发效率
只需要编写类实现servlet接口,在类上添加@WebServlet("资源路径")即可
例如以下代码

@WebServlet("/ServletDemo01")
public class ServletDemo01 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("初始化开始");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("服务开始");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

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