栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Servlet入门[黑马笔记]

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Servlet入门[黑马笔记]

Servlet入门[黑马笔记]入门讲解小白必看
  • 学习目标
  • 学习内容
  • 学习知识点
    • Servlet快速入门
    • Servlet执行流程
    • Servlet生命周期
    • Servlet方法介绍
    • Servlet体系结构
      • 1、HttpServlet中为什么要根据请求方式的不同,调用不同方法?
      • 2、如何调用
    • Servlet urlPattern配置
    • XML配置方式编写Servlet(了解)

学习目标

初步的了解Servlet的基本知识

学习内容
  1. 快速入门
  2. Servlet执行流程
  3. Servlet生命周期
  4. Servlet方法介绍
  5. Servlet体系结构
  6. Servlet urlPattern配置
  7. XML配置方式编写Servlet(了解)
学习知识点 Servlet快速入门

1、创建web项目,导入Servlet依赖坐标

 
 javax.servlet
 javax.servlet-api
 3.1.0
 provided
 

其中的内容先copy使用

scope标签中的provided依赖环境是在编译环境和测试环境有效在运行环境无效。web项目打包成war包不会报错,因为tomcat中有servlet的jar包

2、创建:定义一个类,继承(implements) Servlet接口,并重写接口中所有方法,并在service方法中输入一句话
输出的这句话后期可以作为测试使用

 public class ServletDemo1 implements Servlet {
 public void service(){}
 }

3、配置:在类上使用@WebServlet注解,配置该Servlet的访问路径

 @WebServlet("/demo1")
 public class ServletDemo01 implements Servle{}
 //此时注解中的/demo1,有对应的key值,key是value
// 有一个键值对,并且键是key时value可以省略

4、访问:启动Tomcat,浏览器输URL访问该Servlet

http://localhost:8080/web-demo/demo1

Servlet执行流程

http://localhost:8080/web-demo/demo1

  • http://localhost:8080——>Apache TomCat的web服务器
  • web-demo——>web项目(web-demo)
  • demo1——>注解中value的值;

通过web服务器调用service()方法,每当访问该Servlet时都会在服务器面板上输出前面在其中输入的一句话
1、Servlet由谁创建?Servlet方法由谁调用?

Servlet由web服务器创建,Servlet方法由web服务器调用。

服务器怎么知道servlet中一定有service方法?

因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而servlet接口中有service方法

Servlet生命周期
  • 对象的生命周期指一个对象从被创建到被销毁的整个过程。
  • Servlet运行在servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:

1.加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象

@WebServlet(urlPattents = "/demo",loadOnStartup = 1)

此处使用了urlPattents,因为在WebServlet.class中有

  String[] value() default {};
  String[] urlPatterns() default {};

因为有两个键值对,可以用urlPattents代替value增加了阅读效率
loadOnStartup代表的是优先级,默认为-1

负整数:第一次被访问时创建Servlet对象
0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高

2. 初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只会调用一次

    
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init....");
    }

3.请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理。

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

4.服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收

    @Override
    public void destroy() {
        System.out.println("destroy...")    ;
Servlet方法介绍

javaee7_api.CHM百度网盘提取链接 提取码:0160

初始化方法,在Servlet被创建时执行,只执行一次(已介绍)

void init(ServletConfig config)

提供服务方法,每次Servlet被访问,都会调用该方法(已介绍)

void service(ServletRequest req, ServletResponse res)

销毁方法,当servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet(已介绍)

void destroy()

获取ServletConfig对象

ServletConfig getServletConfig()

获取Servlet信息

String getServletlnfo()

getServletlnfo()方法

    @Override
    public ServletConfig getServletConfig() {
        return null;
        //可以返回null可以返回"" (空字符串) 
    }

getServletConfig()方法

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

在init()方法中里面的参数是返回的是ServletConfig类型

此刻的需求是在getServletConfig()方法中使用init()方法的局部变量,只需要将init()局部变量作用域提升,提升到成员变量的位置,将来的作用域整个类里面都可以使用

class类中增加

  private ServletConfig config;

在init()方法中需要进行赋值

//添加
this.config = config;
//当前局部变量config的值赋值给成员变量config

赋值后在getServletConfig()方中返回即可

return config;
Servlet体系结构

Servlet——>Servlet体系根接口
Genericservlet——>Servlet抽象类
Httpservlet——>对HTTP协议封装的Servlet实现类

我们将来开发B/S架构的web项目,都是针对HTTP协议,所以我们自定义Servlet,会继承HttpServlet

@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get...");
    }

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

doGet()方法

在浏览器上访问URL:http://localhost:8080/web-demo/demo4,相当与是get请求,会输出get…

doPost()方法,在webapp中创建一个html文件,里面写一个form表单,method指定为post方式

在input中输入然后提交

在idea界面会出现post…,说明调用了doPost()方法

思考

1、HttpServlet中为什么要根据请求方式的不同,调用不同方法?

post和get请求请求参数的位置不同
1、post提交的请求参数在请求体里
2、get提交的请求参数在请求行中

2、如何调用

在service()方法中不同的请求方式,进行分别的处理

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
      //根据请求方式的不同,进行分别的处理
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        //1、获取请求方式
        String method = request.getMethod();
        //2、判断请求方式是get还是post
        if ("GET".equals(method)){
            //get方式的处理逻辑
            
        }else if ("POST".equals(method)){
            //post方式的处理逻辑
        }
    }

可以另外写个MyHttpServlet文件,在里面写方法,以后可以直接调用

    protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {
    }
    protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {
    }
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
      //根据请求方式的不同,进行分别的处理
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        //1、获取请求方式
        String method = request.getMethod();
        //2、判断请求方式是get还是post
        if ("GET".equals(method)){
            //get方式的处理逻辑
            doGet(servletRequest,servletResponse);
        }else if ("POST".equals(method)){
            //post方式的处理逻辑
            doPost(servletRequest,servletResponse);
        }
    }

如果是直接copy的话,在MyHttpServlet上面不要加@WebServlet注解,会产生冲突

新写一个ServletDemo5不需要重新写,直接继承MyHttpServlet
例如:

@WebServlet("/demo5")
public class ServletDemo5 extends MyHttpServlet{
    @Override
    protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {
        System.out.println("get...");
    }
    @Override
    protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {
        System.out.println("post");
    }
}

用上面的方法验证依旧可以在IDE上得出输出结果

自己写MyHttpServlet,通过继承的方式重写doGet()和doPost()方法,将1.html中的form表单中的action改成/web-demo/demo5进行验证

我们自己写的MyHttpServlet实现了 对HTTP协议的封装,并且根据不同的请求方式,完成了方法的分发

总结:获取请求方式,然后做不同的逻辑判断

HttpServlet使用步骤

  1. 继承HttpServlet
  2. 重写doGet和doPost方法

HttpServlet原理

  • 获取请求方式,并根据不同的请求方式,调用不同的doXxx方法
Servlet urlPattern配置

Servlet想要被访问,必须配置其访问路径(urlPattern)

1、urlPattern配置规则
@WebServlet(urlPatterns={"/demo1","/demo2"})
2、urlPattern配置规则
精准匹配
目录匹配

精确匹配的优先级高于目录匹配
扩展名匹配
任意匹配

/* 的优先级高于 /
/ 和 /****区别:
当我们的项目中的Servlet配置了“/”,会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet>
当我们的项目中配置了“/ *”,意味着匹配任意访问路径

XML配置方式编写Servlet(了解)

Servlet 从3.0版本后开始支持使用注解配置,3.0版本前只支持XML 配置文件的配置方式
步骤:

  1. 编写Servlet类
  2. 在web.xml中配置该Servlet

老版本的,不推荐使用,可以直接使用注解

       
    
        demo7
        zpd.web.ServletDemo7
    
        
    
        demo7
        /demo7
    

Java新人,正努力学习中,向大牛看齐,有错误请提出,谢谢

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/874125.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号