【Servlet】—— 入门

快速入门

1. 创建 JavaEE 项目

在这里插入图片描述

2. 定义一个类,实现 Servlet 接口

public class ServletDemo1 implements Servlet {

}

注意:
但在实际开发中,我们不会直接去实现Servlet接口,因为那样需要覆盖的方法太多,我们一般创建类继承HttpServlet。
实现步骤:

  • 创建类继承HttpServlet类
  • 覆盖doGet和doPost
  • 在web.xml中进行servlet的配置

3. 实现接口中的抽象方法

package cn.ys.web.servlet;

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

/**
 * Servlet快速入门
 */
public class ServletDemo1 implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

    //提供服务的方法
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello Servlet");
    }

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

    @Override
    public void destroy() {

    }
}

4. 配置Servlet

  • 在web.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>  <!-- 注册Servlet -->
        <servlet-name>demo1</servlet-name>  <!-- Servlet名称,当前 xml 中唯一 -->
        <servlet-class>cn.ys.web.servlet.ServletDemo1</servlet-class>   <!-- Servlet 实现类的全限定类名 -->
    </servlet>

    <servlet-mapping>  <!-- 给注册的 Servlet 添加映射路径 -->
        <servlet-name>demo1</servlet-name>  <!-- 已经注册的 Servlet 名称。注意:必须与注册的名称一致 -->
        <url-pattern>/demo1</url-pattern>   <!-- 访问路径。要求:必须以 / 开头 -->
    </servlet-mapping>
    
</web-app>

在这里插入图片描述

测试:
启动 Tomcat,浏览器输入:http://localhost:8080/demo1
每访问一次,控制台就打印一次 Hello Servlet
在这里插入图片描述

在这里插入图片描述

三、执行原理:

在这里插入图片描述

  1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
  2. 查找web.xml文件,是否有对应的标签体内容。
  3. 如果有,则在找到对应的全类名
  4. tomcat会将字节码文件加载进内存,并且创建其对象
  5. 调用其方法

五、Servlet 3.0:注解配置

好处:

支持注解配置。可以不需要web.xml了。

步骤:

  1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
  2. 定义一个类,实现Servlet接口
  3. 复写方法
  4. 在类上使用@WebServlet注解,进行配置
    - @WebServlet("资源路径")
package cn.ys.web.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;


@WebServlet("/demo3")
public class ServletDemo3 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Servlet3.0来了.....");
    }

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

    @Override
    public void destroy() {

    }
}

测试:
启动 Tomcat,浏览器访问:http://localhost:8080/demo3
在这里插入图片描述

@WebServlet 注解

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package javax.servlet.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
    String name() default "";                    // 相当于<Servlet-name>

    String[] value() default {};                 // 代表urlPatterns()属性配置

    String[] urlPatterns() default {};           // 相当于<url-pattern>

    int loadOnStartup() default -1;              // 相当于<load-on-startup>

    WebInitParam[] initParams() default {};

    boolean asyncSupported() default false;

    String smallIcon() default "";

    String largeIcon() default "";

    String description() default "";

    String displayName() default "";
}

六、Servlet的体系结构

	Servlet -- 接口
		|
	GenericServlet -- 抽象类
		|
	HttpServlet  -- 抽象类
  • GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象

    • 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
  • HttpServlet:对http协议的一种封装,简化操作。(强烈推荐使用
    1. 定义类继承HttpServlet
    2. 复写doGet/doPost方法

在这里插入图片描述

package cn.ys.web.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

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

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

    @Override
    public void destroy() {

    }

}
package cn.ys.web.servlet;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/demo2")
public class ServletDemo2 extends GenericServlet {

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

}
package cn.ys.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost...");
    }
    
}

七、Servlet 相关配置

urlpartten :Servlet访问路径

  1. 一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})
  2. 路径定义规则:
    1. /xxx:路径匹配
    2. /xxx/xxx:多层路径,目录结构
    3. *.do:扩展名匹配
    4. /:缺省路径

注:
web 应用中所有的资源的响应都是 servlet 负责,包括静态资源。
通常情况访问 html 页面时,首先从当前 web 项目的 web.xml 文件寻找匹配路径,如果都没有找到,再从 tomcat 默认的 web.xml 匹配,将使用缺省 servlet。
优先级为:1>2>3>4

package cn.itcast.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Servlet路径配置
 */
//@WebServlet({"/d4","/dd4","/ddd4"})
//@WebServlet("/user/demo4")
//@WebServlet("/user/*")
//@WebServlet("/*")
@WebServlet("*.do")
public class ServletDemo4 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo4...");
        System.out.println(req);
    }
    
}

欢迎页面

在这里插入图片描述

ServletContext 对象

什么是 ServletContext 对象

ServletContext 代表是一个web应用的环境(上下文)对象,ServletContext对象内部封装是该web应用的信息 ServletContext对象一个web应用只有一个。

问题:一个web应用有几个servlet对象?----多个

ServletContext对象的生命周期?

创建:该web应用被加载(服务器启动或发布web应用(前提,服务器启动状态))
销毁:web应用被卸载(服务器关闭,移除该web应用)

怎么获得ServletContext对象

ServletContext servletContext = config.getServletContext();
ServletContext servletContext = this.getServletContext();

ServletContext 的作用

① 获得web应用全局的初始化参数
在这里插入图片描述
② 获得web应用中任何资源的绝对路径(重要)
方法:String path = context.getRealPath(相对于该web应用的相对地址);

③ ServletContext是一个域对象(重要)
什么是域对象?什么是域?
存储数据的区域就是域对象

注:
ServletContext域对象的作用范围:整个web应用(所有的web资源都可以随意向 servletcontext域中存取数据,数据可以共享)

域对象的通用的方法:

  • setAtrribute(String name,Object obj);
  • getAttribute(String name);
  • removeAttribute(String name);

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42112635/article/details/86598080
今日推荐