Servlet全面理解

Serletserver applet

在这里插入图片描述

概念:运行在服务器端的小程序

  • servlet就是一个接口,定义了java类被浏览器访问到tomcat识别的规则【其实就是接口】
  • 定义的类实现Servlet接口,重写方法

可以理解为:用户通过url访问服务器,在服务器中有编写的java类【该类没有main方法】需要依赖于web服务器才能运行,这种的java类必须遵守一定的规则 【在java中规则就是接口】,其实就是实现接口,web服务器才能识别。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FzB9bLUL-1649770667960)(E:\Typora笔记\javaweb\IMG\image-20220412105939270.png)]

Serlet快速入门

步骤:

  1. 创建一个javaee项目

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

  3. 实现接口中所有抽象方法

  4. 配置Servlet

    1. 配置定义类的全路径
    2. 映射路径
     <!--1.配置定义类的全路径-->
        <servlet>
            <servlet-name>servlet1</servlet-name>
            <servlet-class>com.example.web.Servlet01</servlet-class>
                <!--   修改创建Servlet对象的时机
                        1.默认情况下是第一次访问时,创建Servlet, 值是一个正负数
                        2.可以修改为服务器启动时,创建Servlet, 值是一个0或正数
                -->
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <!--配置映射-->
        <servlet-mapping>
            <servlet-name>servlet1</servlet-name>
            <url-pattern>/servlet1</url-pattern>
        </servlet-mapping>
    

IDEA中设置项目的虚拟目录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K46adwnF-1649770667961)(E:\Typora笔记\javaweb\IMG\image-20220412113521688.png)]

执行原理
  1. 当服务器接受到客户端浏览器的请求后,会解析请求url路径,获取访问的servlet资源路径
  2. 查找web.xml,在映射配置中的<url-pattern>中是否有对应的资源名称
  3. 如果有,则继承查找相应的<servlet-class>全类名
  4. tomcat服务器会将该类的字节码加载进行内存,并且创建该的对象
  5. 调用该的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SZrvynbE-1649770667962)(E:\Typora笔记\javaweb\IMG\image-20220412115534183.png)]

Servlet生命周期
1.被创建:执行一次init方法,只执行一次

Servlet什么时候创建?

​ 《1》默认情况下,第一次访问时,Servlet被创建

​ 《2》可以配置执行Servlet标签下配置

​ 在<servlet>标签下配置

 <!--   修改创建Servlet对象的时机
                    1.默认情况下是第一次访问时,创建Servlet, 值是一个正负数 
                    2.可以修改为服务器启动时,创建Servlet, 值是一个0或正数
            -->
        <load-on-startup>1</load-on-startup>

2.Servletinit方法,只执行一次,说明只有一个Servlet对象在内存中,因为Servlet是单例的

  • ​ 当多个用户访问时,可能存在线程安全问题
  • 解决线程安全问题:尽量不要在Servlet中定义在成员变量,即使定义了成员变量,也不要对成员变量修改值
2.提供服务:执行servlce方法
  • 每次访问Servlet时,Servlet方法都会被调用一次
3.被销毁:执行destroy方法,前提是正常关闭服务器,只执行一次
  • Servlet被销毁时执行,服务器关闭时,Servlet被销毁
  • 只有服务器正常关闭时,才会执行destroy方法
  • Servlet销毁前先执行destroy方法后销毁,一般用于释放资源
/**
 * @author: 海康
 * @version: 1.0
 *
 * Servlet快速入门步骤:
 * 创建一个javaee项目
 * 定义一个类实现Servlet接口
 * 实现接口中所有方法
 * 配置web.xml文件,指定定义的类名和映射路径
 */
public class Servlet01 implements Servlet {
    /**
     * 初始化方法
     * 在Servlet创建时,执行,只会执行一次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    /**
     *获取ServletConfig对象
     * ServletConfig:Servlet的配置对象
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * 服务访问一次执行一次
  
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("您好:湛江,我的家!");
    }

    /**
     * 获取Servlet的一些信息,版本,作用等等
     */
    @Override
    public String getServletInfo() {
        return null;
    }

    /**
     * 销毁方法
     * 在服务器正常关闭时,执行一次
     */
    @Override
    public void destroy() {

    }
}
使用注解开发javaweb项目

好处:支持注解配置,可以不需要web.xml文件

@WebServlet(urlPatterns = {"/httpSer"}) ,注意是一定不能漏掉/,否则会报下以的错误

Artifact javaweb01:war exploded: Error during artifact deployment. See server log for details.

使用步骤:

  1. 创建javaee项目,选择Servlet的版本是3.0以上,可以不创建web.xml

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

  3. 实现Servlet接口中所有方法

  4. 在类上使用@WebServlet注解,进行配置

    @WebServlet(urlPatterns="资源路径")

http://localhost:8080/javaweb02_annotation_war_exploded/demo1

/javaweb02_annotation_war_exploded表示项目的虚拟路径

/demo1表示是资源路径

@WebServlet(urlPatterns = "demo1")
public class Servlet_ann 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("您好javaweb注解开发...");
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
    }
}
IDEAtomcat相关配置
  1. IDEA会为每一个tomcat部署的项目单独建立一份配置文件

    可以查看控制台的log uSING CATALINA_BASE:

  2. 工作空间的项目 和 tomcat部署的web项目

    tomcat真正访问的是tomcat部署的web项目,tomcat部署的web项目对应着 “工作空间项目” 的web目录下的所有资源

    WEB-INF目录下的资源不能被浏览器直接访问

断点调试:使用"小虫子"启动dubug启动

Serlvet的体系结构

Serlvet接口中有一个抽象类GenericServlet

GenericServlet又有一个抽象类HttpServlet抽象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8pPQc4E3-1649770667962)(E:\Typora笔记\javaweb\IMG\image-20220412200016734.png)]

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

​ 在继承GenericServlet类时,只需要实现service()方法即可

HttpServlet:对http协议的一种封装,简化操作

使用的步骤是:

  1. 定义一个类继承HttpServlet抽象类
  2. 一般重写doGet()方法和doPost()方法

HttpServlet抽象类出现的本质是:由于每个service()方法都需要对请求进行判断是get请求还pout请求等等,所以sun提供了HttpServlet抽象,帮助我们判断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZPfdjxqa-1649770667963)(E:\Typora笔记\javaweb\IMG\image-20220412200757078.png)]

HttpServlet抽象类的继承关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RbKN2Wj9-1649770667963)(E:\Typora笔记\javaweb\IMG\image-20220412201101013.png)]

相关的方法和字段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PPOOOF4y-1649770667964)(E:\Typora笔记\javaweb\IMG\image-20220412201212185.png)]

HttpServletservice源码

public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        HttpServletRequest request;
        HttpServletResponse response;
        try {
            request = (HttpServletRequest)req;
            response = (HttpServletResponse)res;
        } catch (ClassCastException var6) {
            throw new ServletException("non-HTTP request or response");
        }

        this.service(request, response);
    }


protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                if (ifModifiedSince < lastModified) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }

案例:

public class HttpServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("是get请求...");
        // 在浏览器中默认是get请求
    }

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("是put请求...");
    }
}
Servlet相关注解路径配置

urlparttenServlet访问路径的配置

1.路径定义规则

  1. 方式一:/xxx:路径匹配一定不能漏掉/,否则报错
  2. 方式二:/xxx/xxx:多层路径,目录结构 一定不能漏掉/,否则报错
  3. 方式三:*.xx:扩展名匹配一定不能加在星号的前/,否则报错

2.一个Servlet可以定义多个访问路径:例如:@WebServlet(urlPatterns = {"/httpSer1","/httpSer2","/httpSer3"})

如果路径格式书写不正确,一般会报错,错误形式为:Artifact javaweb01:war exploded: Error during artifact deployment. See server log for details.

案例:

//@WebServlet({"/d4","/dd4","/ddd4"})
//@WebServlet("/user/demo4")
//@WebServlet("/user/*")
//@WebServlet("/*")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值