【JavaWeb学习笔记】7 - Servlet入门开发

零、在线文档

Servlet 3.1 API Documentation - Apache Tomcat 8.0.53

一、Servlet基本介绍

1.为什么出现Servlet

提出需求:请用你现有的html css javascript,开发网站,比如可以让用户留言/购物/支付,你能搞定吗?

不能 这几个不能直接操作数据库

所以引入动态页面 跟用户交互

走静态和动态两个方面

2.什么是Servlet

Servlet在开发动态WEB工程中,得到广泛的应用,掌握好Servlet 非常重要了, ServletSpringMVC的基础

Servlet(java 服务器程序),它的特点:

1.他是由服务器端调用和执行的(是Tomcat解析和执行)

2.他是用java语言编写的,本质就是Java类

3.他是按照Servlet规范开发的tolmcat -> Servlet weblogic -> Servlet

4.功能强大,可以完成几乎所有的网站功能

3.Servlet在JavaWeb项目位置

二、Servlet基本使用

1.Servlet开发方式

1. servlet3.0前使用web.xml , servlet3.0版本以后(包括3.0)支持注解,同时 支持web.xml配置

2.如何查看servlet版本[如图]

3.讲解SpringBoot时, 我们用注解方式, 从ssm,springboot后面全部使用注解

4.这专门讲servlet,为让大家更清晰知道servlet使用原理,老师用配置方式(说明,原生的Servlet在项目中使用很少)

5.不管使用哪种方式,本质都一样

2.快速入门 - 手动开发Servlet

需求说明

1、开发一个HelloServlet

2、当浏览器访问http:/ /localhost:8080/web应用名/helloServlet时,后台输出"hi HelloServelt"

具体步骤

1.编写类HelloServlet去实现 Servlet接口(本质是一套规范)

2.实现service方法,处理请求,并响应数据

3.在web.xml中去配置servlet程序的访问地址

操作步骤

1.创建servlet JavaWeb工程,并配置好Tomcat

2.添加servlet-api.jar(在tomcat/lib)到工程,因为servlet.jar不是jdk自带的,要引入,引入后记得构建为libray

3.在src下包com.yinhai.servlet.HelloServlet.java,并实现Servlet接口

package com.yinhai.servlet;

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

/**
 * @author 银小海
 * @version 1.0
 * @email yinhai14@qq.com
 */
public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        /*
         1.初始化servlet
         2.当创建HelloServlet实例时,会调用init方法
         3.该方法只会被调用1次
        */
    }
    /*
        返回ServletConfig也就是返回Servlet的配置
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    /*
        1. service 方法处理浏览器的请求(包括get/post)
        2.当浏览 器每次请求Servlet时,就会调用一次service
        3. 当tomcat调用该方法时,会把http请求的数据封装成实现ServletRequest接口的request对象
        4. 通过servletRequest 对象,可以得到用户提交的数据
        5. servletResponse 对象可以用于返回数据给tomcat->浏览器
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }
    /*
        返回servlet信息,使用较少
     */
    @Override
    public String getServletInfo() {
        return null;
    }

    /*
       1. 该方法是在servlet销毁时,被调用
       2. 只会调用一次
     */
    @Override
    public void destroy() {

    }
}

4.在web.xmI配置HelloServlet,即:给HelloServlet 提供对外访问地址

<?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">
    <!-- web.xml主要用来配置该web应用使用到的Servlet
    1. servlet-name: 给Servlet取名(程序员决定), 该名字唯一
    2. servlet-class: Servlet的类的全路径: Tomcat在反射生成该Servlet需要使用
    3. url-pattern: 这个就是该servlet访问的url的配置(路径)
    4. 这时我们应该这样访问servlet http://localhost:8080/servlet/helloServlet
    5. url-pattern 取名是程序员决定的
    6. load-on-startup 表示在tomcat 启动时,会自动的加载servlet实例

    小技巧: alt+r => 老师配置
-->
    <!-- 配置HelloServlet -->
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.yinhai.servlet.HelloServlet</servlet-class>
        <!--<load-on-startup>1</load-on-startup>-->
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/helloServlet</url-pattern>
    </servlet-mapping>
</web-app>

5.通过浏览器访问HelloServlet ,看是否正确(记住要redeploy或者restart)

3.浏览器Servlet流程分析

servlet是默认单例的

4.Servlet生命周期

1. init() 初始化阶段

2. service() 处理浏览器请求阶段

3. destroy() 终止阶段

5.GET和POST请求的分发处理

开发Servlet, 通常编写doGet、doPost方法。来对表单的get和post请求进行分发处理

1.创建D:\idea_java_projects\yinhai_servlet\web\register.html

@Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

        System.out.println("hello world by servlet" + (++count));

        //思考->从servletRequest对象来获取请求方式->
        //1. ServletRequest 没有得到提交方式的方法
        //2. ServletRequest 看看ServletRequest子接口有没有相关方法
        //3. 老师小技巧:ctrl+alt+b => 可以看到接口的子接口和实现子类
        //4. 把servletReqeust转成 HttpServletRequest引用
        //5. 仍然是Java基础的OOP
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String method = httpServletRequest.getMethod();
        if("GET".equals(method)) {
            doGet(); //用doGet() 处理GET请求
        }
        else if("POST".equals(method)) {
            doPost(); //用doPost() 处理POST请求
        }

    }

 6.通过继承HttpServlet开发Servlet

package com.yinhai.servlet;

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

/**
 * @author 银小海
 * @version 1.0
 * @email yinhai14@qq.com
 */
public class HiServlet extends HttpServlet {
    //重写HttpServlet的goGet和doPost

    /*
    处理doGet请求
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hiservlet doGet");
    }

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

HttpServlet本质上是对HttpServlet的service方法的调用

7.IDEA 开发Servlet 程序

手动开发Servlet需要程序员自己配置Servlet ,比较麻烦,在工作中,直接使用IDEA开发Servlet会更加方便

8.注意事项

1. Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,不能独立运行

2.针对浏览器的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对 象,也就是说Servlet实例对象一旦创建, 它就会驻留在内存中,为后续的其它请求服务,直至web容器退出/或者redeploy该web应用,servlet实例对象才会销毁

3.在Servlet的整个生命周期内,init方法只被调用一次。 而对每次请求都导致Servlet引擎调用一次servlet的service方法。

4.对于每次访问请求,Servlet引 擎都会创建一个新的HttpServletRequest请求对 象和-一个 新的
HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法

5.如果在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法 (定时发送邮件服务/自动启动 -> 完成任务)

三、Servlet - 注解方式

1.快速入门

1.编写类OkServlet去继承HttpServlet

2.注解方式配置HspServlet, 一个Servlet支持配置多个urlPattern

package com.yinhai.servlet.annotation;

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

/**
 * @author 银小海
 * @version 1.0
 * @email yinhai14@qq.com
 */
/*
 1. @WebServlet 是一个注解 => java基础->注解
        * 2. @WebServlet 源码
        * @Target({ElementType.TYPE})
 * @Retention(RetentionPolicy.RUNTIME)
 * @Documented => 在javadoc工具生成文档有记录
        * public @interface WebServlet {
 *     String name() default "";
 *
         *     String[] value() default {};
 *
         *     String[] urlPatterns() default {};
 *
         *     int loadOnStartup() default -1;
 *
         *     WebInitParam[] initParams() default {};
 *
         *     boolean asyncSupported() default false;
 *
         *     String smallIcon() default "";
 *  }
 *  3. urlPatterns 对应 web.xml 的 <url-pattern></url-pattern>
*  4. {"/ok1", "/ok2"} 可以给OkServlet配置多个 url-pattern
*  5. 相当于这个@WebServlet(urlPatterns = {"/ok1", "/ok2"}) 代替了 web.xml的配置
*     底层使用了 反射+注解+IO+集合 来完成一个支撑
*  6. 浏览器可以这样访问OkServlet时,可以 http://localhost:8080/servlet/ok1 或者
*     http://localhost:8080/servlet/ok2
*  7. 同学们有很多小问号? 解密. => 一会老师再说.
*  8. 我们可以根据 @interface WebServlet 源码知道可以配置哪些
 *  web.xml init-param 在注解中,如何指定呢? 老师看了源码,老师搞定
         *          <init-param>
        *             <param-name></param-name>
        *             <param-value></param-value>
        *         </init-param>
        *  9. 注解方式开发Servlet和 web.xml配置servlet 流程机制是一样
        *  10. /ok1/aa /ok1/bb /ok1/cc /ok1/aa/bb/cc /ok2
        *  11. *.action 这时 zs.action ls.action
        *  12. http://localhost:8080/servlet/register.html
        */
@WebServlet(urlPatterns = {"/ok1", "/ok2"})
public class OkServlet 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");
    }
}

2.模拟Tomcat注解的底层

package com.yinhai.servlet.annotation;

import javax.servlet.annotation.WebServlet;
import java.util.HashMap;

/**
 * @author 银小海
 * @version 1.0
 * @email yinhai14@qq.com
 * 模拟一把Tomcat是如果通过 @WebServlet(urlPatterns = {"/ok1", "/ok2"})
 * 来装载一个Servlet的
 *
 * 说明:这代码主要的目的,就是打破 注解的神秘感
 */
public class TestAnnotationServlet {

    private static final HashMap<String, Object> hm = new HashMap<>();

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {

        //1. 首先要得到扫描的包 路径 io, 进而得到类的全路径
        String classAllPath = "com.yinhai.servlet.annotation.OkServlet";
        //2. 得到 OkServlet的Class对象
        Class<?> aClass = Class.forName(classAllPath);
        //3. 通过class对象,得到Annotation
        WebServlet annotation = aClass.getAnnotation(WebServlet.class);
        System.out.println(annotation);
        String[] strings = annotation.urlPatterns();
        for (String url : strings) {
            System.out.println("url= " + url);
        }

        //如果匹配url,如果是第一次,tomcat就会创建一个OkServlet实例,放入到hashmap
        Object instance = aClass.newInstance();
        System.out.println("instance= " + instance);//OkServlet

        //简单的模拟,没有深入.
        hm.put("OkServlet", instance);

        System.out.println(hm);

    }
}

3.Servlet urlPatterns配置

//精确匹配
@WebServlet(urlPatterns = {"/ok1/ok", "/ok2"})
//目录匹配 模糊匹配 即/ok/任意 都能访问到(任意包括多级目录)
@WebServlet(urlPatterns = {"/ok1/*"})
//拓展名匹配 不能带/ "/*.xxx"否则报错
@WebServlet(urlPatterns = {"*.action"})
//任意匹配 @WebServlet("/") 
@WebServlet(urlPatterns = {"/","/*"})

4.注意事项

1、当Servlet配置了"/",会覆盖tomcat的DefaultServlet,当其他的utl-pattern都匹配不上时,都会走这个Servlet,这样可以拦截到其它静态资源,比如D:\hspedu_ javaweb_temp\hspedu_ servlet\web\hi.html[举例]
查看: tomcat/conf/ web.xml ,配置的DefaultServlet

2、当Servelt配置了"/*",表示可以匹配任意访问路径

3、提示:建议不要使用/和/*,建议尽量使用精确匹配

4、优先级遵守:精确路径 > 目录路径 > 扩展名路径 > /* > / > 默认

四、课后作业

1.

package com.yinhai.homework;




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

/**
 * @author 银小海
 * @version 1.0
 * @email yinhai14@qq.com
 *
 */
@WebServlet(urlPatterns = {"/cat"})
public class CatServlet implements Servlet {
    private int count = 0;
    @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("service count=" + count++);
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String method = httpServletRequest.getMethod();
        System.out.println(method);
    }

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

    @Override
    public void destroy() {

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/242919.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android gradle配置jar包加载顺序及延伸知识

Android gradle配置jar包加载顺序及延伸知识 前言一、直接配置1.APP目录下的build.gradle2.项目级的build.gradle3.其他问题 二、gradle的生命周期及关键方法1.关键方法2.gradle的生命周期 总结 前言 项目涉及到了要加载framework.jar&#xff0c;需要将libs文件夹下的framewo…

SpringBoot对PDF进行模板内容填充、电子签名合并

1. 依赖引入–这里只包含额外引入的包 原有项目包不含括在内 <!-- pdf编辑相关--> <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version> </dependency><de…

数据结构与算法:选择排序

原理 从当前位置到最后&#xff0c;找出最小(或者最大)值&#xff0c;放在当前位置&#xff0c;位置后移。然后重复此过程。 每次都要在剩余未排序的集合中&#xff0c;找到那个最小(或者最大)的值&#xff0c;放到当前位置。所以叫选择排序。 最小或者最大&#xff0c;影响…

iOS加密CoreML模型

生成模型加密密钥 必须在Xcode的Preferences的Accounts页面登录Apple ID&#xff0c;才能在Xcode中生成模型加密密钥。 在Xcode中打开模型&#xff0c;单击Utilities选项卡&#xff0c;然后单击“Create Encryption Key”按钮。 从下拉菜单中选择当前App的Personal Team&…

Hive命令操作

1.命令行模式 1. 获取帮助 --> hive -H 或-help 2. 运行hive语句 --> hive -e "执行语句" 3. 运行hive文件 --> hive –f "执行文件" 4. 定义变量 --> hive –hivevar keyvalue 5. 引用变量 --> ${varname} 2. 交互模式 1. 进入客户端 -…

Apache Web 服务器监控工具

将Apache Web 服务器监控纳入 IT 基础架构管理策略有助于先发制人地识别性能瓶颈&#xff0c;这种主动监控方法提供必要的数据&#xff0c;以确保 Web 服务器能够胜任任务&#xff0c;并在需要时进行优化。保证客户获得流畅、无忧的用户体验可以大大有助于巩固他们对组织的信任…

STM32的DMA的五大问题

1&#xff0c;DMA控制器的内部结构 STM32中的DMA控制器是一种用于在外设和存储器之间传输数据的专用硬件。DMA控制器的内部结构主要包括以下几个关键部分&#xff1a; 通道&#xff1a; DMA控制器可以有多个通道&#xff0c;每个通道独立管理一个数据传输任务。通道的数量取决于…

【教学类-06-15】20231213 (按比例抽题+乱序or先加后减)X-Y之间“加法减法+-题”

作品展示&#xff1a; 背景需求 1、加减混合题——加法题多&#xff0c;减法题少 大三班一位女孩让我给他批改0-10加减法混合题&#xff0c;我随机从每列题目里面选了2个加法和2个减法题抽查答案正确性。 “347&#xff0c;对&#xff0c;这里819 对” 然后我停顿几秒&…

22.Java程序设计-基于SpringBoot的批发零售业商品管理小程序系统的设计与实现

摘要&#xff1a; 批发零售业商品管理小程序系统的设计旨在提高批发商、零售商和管理员的业务效率&#xff0c;实现商品的高效管理、订单的快速处理以及库存的精准监控。本系统基于Spring Boot框架&#xff0c;利用其强大的特性和生态系统&#xff0c;结合小程序前端&#xff…

R语言对医学中的自然语言(NLP)进行机器学习处理(1)

什么是自然语言(NLP)&#xff0c;就是网络中的一些书面文本。对于医疗方面&#xff0c;例如医疗记录、病人反馈、医生业绩评估和社交媒体评论,可以成为帮助临床决策和提高质量的丰富数据来源。如互联网上有基于文本的数据(例如,对医疗保健提供者的社交媒体评论),这些数据我们可…

AndroidStudio flutter 开发环境 绿色版,绿化方法

这里写自定义目录标题 绿色版下载:绿色版制作过程参考资料1.按照正常方式配置flutter开发环境(不包括桌面开发环境),确认能够正常编译apk2.移动AndroidStudio3.修改 {Android Studio安装路径}\bin\idea.properties4.移动.android5.移动AndroidSdk6.移动gradle 绿色版下载: and…

flink yarn-session 启动失败retrying connect to server 0.0.0.0/0.0.0.0:8032

原因分析&#xff0c;启动yarn-session.sh&#xff0c;会向resourcemanager的端口8032发起请求&#xff1a; 但是一直无法请求到8032端口&#xff0c;触发重试机制会不断尝试 备注&#xff1a;此问题出现时&#xff0c;我的环境ambari部署的HA 高可用hadoop&#xff0c;三个节点…

计算机网络传输层(期末、考研)

计算机网络总复习链接&#x1f517; 目录 传输层的功能端口UDP协议UDP数据报UDP的首部格式UDP校验 TCP协议&#xff08;必考&#xff09;TCP报文段TCP连接的建立TCP连接的释放TCP的可靠传输TCP的流量控制零窗口探测报文段 TCP的拥塞控制慢开始和拥塞控制快重传和快恢复 TCP和U…

低代码 —— 饮食均衡,合理膳食

目录 一、低代码的概念 二、低代码的优缺点 &#xff08;一&#xff09;优点 &#xff08;二&#xff09;缺点 三、低代码的能力 1、场景构建能力 2、数据编排能力 3、连接生态能力 4、业务中台能力 四、你认为低代码会替代传统编程吗&#xff1f; 1、从技术特征来看…

各厂家扇区电下倾识别调整方法

一、华为设备 针对华为4488天线或44天线TDD/FDD1800/FDD900电子下倾调整步骤 步骤1&#xff1a;先通过“DSP RETPORT”命令梳理全网供电开关开启状态 操作命令如下&#xff1a; &#xff08;可通过脚本执行DSP RETPORT:;命令批量提取全网信息&#xff0c;该命令是以RRU为单位…

【深度学习】强化学习(七)基于策略函数的学习方法

文章目录 一、强化学习问题1、交互的对象2、强化学习的基本要素3、策略&#xff08;Policy&#xff09;4、马尔可夫决策过程5、强化学习的目标函数6、值函数7、深度强化学习 二、基于值函数的学习方法三、基于策略函数的学习方法 一、强化学习问题 强化学习的基本任务是通过智能…

OpenCV极坐标变换函数warpPolar的使用

学更好的别人&#xff0c; 做更好的自己。 ——《微卡智享》 本文长度为1702字&#xff0c;预计阅读4分钟 前言 前阵子在做方案时&#xff0c;得了几张骨钉的图片&#xff0c;骨科耗材批号效期管理一直是比较麻烦的&#xff0c;贴RFID标签成本太高&#xff0c;所以一般考虑还是…

【教学类-06-16】20231213 (按比例抽题+乱序or先加再减后乘)X-Y之间“加法减法乘法+-×混合题”

作品展示&#xff1a; 背景需求&#xff1a; 大三班的“第一高手”对我提供的每一套的题目都只有一种反应&#xff1a; “这个是分合题&#xff0c;太简单了” “乘法&#xff0c;乘法我也会&#xff0c;11的1 22的4 33的9&#xff0c;,44十六……” “都太简单了&#xff0…

数据通信网络基础

数据通信网络基础&#xff08;1&#xff09; 一.前言 • 在人类社会的起源和发展过程中&#xff0c;通信就一直伴随着我们。从20世纪七、八十年代开始&#xff0c; 人类社会已进入到信息时代&#xff0c;对于生活在信息时代的我们&#xff0c;通信的必要性更是不言而喻 的。…

11.仿简道云公式函数实战-逻辑函数-TRUE

1. TRUE函数 TRUE 函数可直接返回逻辑值 true。 2. 函数用法 TRUE() 3. 函数示例 TRUE 函数一般不会作为函数单独使用&#xff0c;可与其他函数一起使用&#xff0c;或作为判断逻辑的结果。如&#xff0c;判断字段值是否为空时&#xff0c;设置公式为IF(ISEMPTY(方案选择)…