【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 {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {/*1.初始化servlet2.当创建HelloServlet实例时,会调用init方法3.该方法只会被调用1次*/}/*返回ServletConfig也就是返回Servlet的配置*/@Overridepublic ServletConfig getServletConfig() {return null;}/*1. service 方法处理浏览器的请求(包括get/post)2.当浏览 器每次请求Servlet时,就会调用一次service3. 当tomcat调用该方法时,会把http请求的数据封装成实现ServletRequest接口的request对象4. 通过servletRequest 对象,可以得到用户提交的数据5. servletResponse 对象可以用于返回数据给tomcat->浏览器*/@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {}/*返回servlet信息,使用较少*/@Overridepublic String getServletInfo() {return null;}/*1. 该方法是在servlet销毁时,被调用2. 只会调用一次*/@Overridepublic 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应用使用到的Servlet1. servlet-name: 给Servlet取名(程序员决定), 该名字唯一2. servlet-class: Servlet的类的全路径: Tomcat在反射生成该Servlet需要使用3. url-pattern: 这个就是该servlet访问的url的配置(路径)4. 这时我们应该这样访问servlet http://localhost:8080/servlet/helloServlet5. 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

@Overridepublic 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基础的OOPHttpServletRequest 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请求*/@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("hiservlet doGet");}/*doPost请求*/@Overrideprotected 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 {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet");}@Overrideprotected 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对象,得到AnnotationWebServlet 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实例,放入到hashmapObject 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;@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic 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);}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 语言关键字

Java关键字是电脑语言里事先定义的&#xff0c;有特别意义的标识符&#xff0c;有时又叫保留字&#xff0c;还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义&#xff0c;他们用来表示一种数据类型&#xff0c;或者表示程序的结构等&#xff0c;关键字不能用作变量…

20231213给Ubuntu18.04.6LTS新加一块HDD机械硬盘

20231213给Ubuntu18.04.6LTS新加一块HDD机械硬盘 2023/12/13 22:50 rootrootrootroot-X99-Turbo:~$ cat /etc/issue Ubuntu 18.04.6 LTS \n \l sudo fdisk -l rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ sudo fdisk -lu Disk /dev/sda: 2.7 TiB, 300059298…

【源码解析】flink sql执行源码概述:flink sql执行过程中有哪些阶段,这些阶段的源码大概位置在哪里

文章目录 一. sql执行流程源码分析1. Sql语句解析成语法树阶段&#xff08;SQL - > SqlNode&#xff09;2. SqlNode 验证&#xff08;SqlNode – >Operation&#xff09;3. 语义分析&#xff08;Operation - > RelNode&#xff09;4. 优化阶段&#xff08;RelNode - &…

LangChain 25: SQL Agent通过自然语言查询数据库sqlite

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

2023全国大学生数据分析大赛A题完整论文教学

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了全国大学生数据分析大赛A题某电商平台用户行为分析与挖掘完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 实…

透析回溯的模板

关卡名 认识回溯思想 我会了✔️ 内容 1.复习递归和N叉树&#xff0c;理解相关代码是如何实现的 ✔️ 2.理解回溯到底怎么回事 ✔️ 3.掌握如何使用回溯来解决二叉树的路径问题 ✔️ 回溯可以视为递归的拓展&#xff0c;很多思想和解法都与递归密切相关&#xff0c;在很多…

Windows 网络监控的内容和方式

Microsoft Windows是使用最广泛的操作系统之一&#xff0c;受到全球用户的青睐&#xff0c;Windows 设备与许多进程、服务和事件相关联&#xff0c;这些进程、服务和事件通常需要从单个控制台进行跟踪&#xff0c;这就是 Windows 网络监控工具派上用场的地方。Windows 网络监控…

项目总结-自主HTTP实现

终于是写完了&#xff0c;花费了2周时间&#xff0c;一点一点看&#xff0c;还没有扩展&#xff0c;但是基本功能是已经实现了。利用的是Tcp为网络链接&#xff0c;在其上面又写了http的壳。没有使用epoll&#xff0c;多路转接难度比较高&#xff0c;以后有机会再写&#xff0c…

一张图片组合一组动作就可以生成毫无违和感的视频!

你敢信&#xff0c;1张人物图片 1张动作动画&#xff0c;就可以生成一段视频。网友直呼&#xff1a;“主播/视频UP主可能快要下岗了&#xff01;” &#xff08;模型视频来源于网络&#xff09; 本周&#xff0c;字节跳动联合新加坡国立大学发布了一款开源项目 MagicAnimate&…

Linux Ubuntu 手动搭建webDav

1、安装 因为需要跟 zotero 进行交互&#xff0c;因此需要在服务器搭建一个webDav 以下是搭建步骤&#xff1a; sudo apt-get update sudo apt-get install apache2 Ubuntu 安装apache2来实现 不同于Centos 安装好了之后&#xff0c;运行 a2enmod dav_fs a2enmod dav 激…

【视频笔记】古人智慧与修行

古人的智慧 相由心生、老子悟道、佛祖成佛 多一些思考&#xff0c;多一些精神修炼。 除非我们今天能够产生与人类科技发展相并行的精神变革&#xff0c;否则永远可能也无法跳脱出历史的轮回。 视频来源 曾仕强教授周易的智慧 太极两仪四象八卦 一生二&#xff0c;二生三&…

大数据机器学习深度解读决策树算法:技术全解与案例实战

大数据机器学习深度解读决策树算法&#xff1a;技术全解与案例实战 本文深入探讨了机器学习中的决策树算法&#xff0c;从基础概念到高级研究进展&#xff0c;再到实战案例应用&#xff0c;全面解析了决策树的理论及其在现实世界问题中的实际效能。通过技术细节和案例实践&…

现代雷达车载应用——第2章 汽车雷达系统原理 2.5节 检测基础

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.5 检测基础 对于要测试目标是否存在的雷达测量&#xff0c;可以假定下列两个假设之一为真&#xff1a; •H0:—测量结果仅为噪声。 •H1:—测量是噪…

eNSP小实验(vlan和单臂路由)

一.vlan的划分 实验目的&#xff1a; ①pc1 只可以和pc2通信&#xff0c;不可以和pc3 pc4通信 ②pc1和pc2只能到Server1&#xff0c;pc3和pc4到Server2 1.拓扑图 2.配置 PC1-4 同理配置 SW1 <Huawei> <Huawei>u t m //关闭注释 Info: …

Nginx的location匹配和rewrite重写

一、location匹配 常用的正则表达式 ^ &#xff1a;匹配输入字符串的起始位置 $ &#xff1a;匹配输入字符串的结束位置 * &#xff1a;匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”&#xff1a;匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll…

1.5万字 + 25张图盘点RocketMQ 11种消息类型,你知道几种?

本文是基于RocketMQ 4.9版本讲解 前置知识 为了帮助大家更好地理解这些消息底层的实现原理&#xff0c;这里我就通过三个问题来讲一讲RocketMQ最最基本的原理 1、生产者如何发送消息 在RocketMQ中有两个重要的角色 NameServer&#xff1a;就相当于一个注册中心 Broker&#xf…

批量生成标题文章:AI文章创作助力高效办公,提升办公效率

随着人工智能技术的不断发展&#xff0c;AI文章创作已经成为了高效办公的新趋势。这种技术可以快速生成高质量的文章&#xff0c;从而大大提高办公效率。相比传统的手写文章&#xff0c;AI文章创作具有更高的效率和准确性。在撰写文章时&#xff0c;往往要花费大量的时间和精力…

SpringBoot之视图渲染技术

前言 在Spring Boot中&#xff0c;视图渲染技术用于将动态数据渲染到用户界面&#xff0c;生成最终的HTML、XML、JSON等文档&#xff0c;以便将其返回给客户端浏览器 一.关于Freemarker 1.介绍 Freemarker是一个Java模板引擎&#xff0c;用于生成基于模板的动态内容。它是一…

有没有手机电脑同步的工作时间管理软件?

越来越多的职场人士感到每天的工作任务是比较多的&#xff0c;而工作时间又是有限的&#xff0c;所以经常时间不够用。因此&#xff0c;对于上班族来说&#xff0c;高效的时间管理是提高工作效率、按时完成任务的关键。为了满足这一需求&#xff0c;很多网友都在寻找一款既能在…

Leetcode 139.单词拆分

OJ链接 &#xff1a;139.单词拆分 代码&#xff1a; class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> set new HashSet<String>(wordDict);int n s.length();boolean[] dp new boolean[n1];dp[0] true;//初始…