当前位置: 首页 > news >正文

【JavaWeb】Servlet基础

文章目录

  • 1.Tomcat服务器安装注意事项
  • 2.编写WebApp
  • 3.BS系统角色和协议
  • 4.模拟Servlet
    • 4.1模拟sun公司
    • 4.2模拟Tomcat服务器
    • 4.3模拟WebApp开发者
  • 5.开发一个带有Servlet的WebApp
    • 5.1创建一个名为crm的项目
    • 5.2 在项目中创建一个名为WEB-INF的文件(必须)
    • 5.3在WEB-INF下新建一个名为classes,将来存储java字节码文件。(必须)
    • 5.4在WENINF下新建一个名为lib的文件夹,将来存储jar包。
    • 5.5在WEB-INF下新建一个名为web.xml文件(必须)
    • 5.6 编写小Java程序,必须实现Servlet接口
    • 5.7编写HelloServlet程序
    • 5.8 将以上生成的class字节码拷贝到WEB-INF\classes下
    • 5.9 在web.xm注册Servlet类
    • 5.10启动Tomcat服务器
    • 5.11打开浏览器
  • 6.使用IDEA开发Servlet
    • 6.1项目
    • 6.2模块
    • 6.3 Module变成Java EE模块
    • 6.4编写Servlet
    • 6.5 导入数据库驱动
    • 6.6 在web.xm注册Servlet类
    • 6.7 前端页面
    • 6.8项目部署
    • 6.9启动Tomcat服务器
    • 6.10浏览器访问

1.Tomcat服务器安装注意事项

两个环境变量的配置:

  • JAVA_HOME jdk的根

在这里插入图片描述

  • CATALINK_HOME Tomcat服务器的根

请添加图片描述
没有配置CATALINK_HOME会出现如下:
请添加图片描述
防止使用命令shutdown.bat关机,将tomcat目录的bin下的shutdown.bat改为stop.bat
在这里插入图片描述

解决乱码:
conf下的logging.properties

在这里插入图片描述

2.编写WebApp

以下路径以/开头,带项目名,是一个绝对路径,不带
http://127.0.0.1:8080

<a href="/oa/login.html">user login</a>

3.BS系统角色和协议

在这里插入图片描述

4.模拟Servlet

4.1模拟sun公司

package javax.servlet;/*** 充当sun公司,将Servlet接口/规范制定出来** @author Beyong* @date 2023/02/28 09:11**/
public interface Servlet {void service();
}

4.2模拟Tomcat服务器

package org.apache;import javax.servlet.Servlet;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import java.io.FileReader;
import java.util.Scanner;/*** 充当Tomcat服务器的开发者** @author Beyong* @date 2023/02/28 09:26**/
public class Tomcat {public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException {System.out.println("tomcat服务器启动成功,开始接收用户输入");System.out.println("请输入访问地址");Scanner s = new Scanner(System.in);//用户输入请求路径String key = s.nextLine();//请求路径和Servlet之间的关系//Tomcat服务器解析配置文件FileReader reader = new FileReader("web.properties");Properties pro = new Properties();pro.load(reader);reader.close();//通过key获取valueString className = pro.getProperty(key);//通过反射机制创建对象Class clazz = Class.forName(className);//obj类型对于Tomcat服务器开发人员来说不知道Object obj = clazz.newInstance();//Tomcat服务器的开发者知道,你写的Servlet一定实现了Servlet接口Servlet servlet = (Servlet)obj;servlet.service();}
}

4.3模拟WebApp开发者

package com.sdnu.servlet;import javax.servlet.Servlet;/*** 充当银行webapp开发者** @author Beyong* @date 2023/02/28 08:47**/
public class BankServlet implements Servlet {public void service() {System.out.println("BankServlet's service...");}
}
package com.sdnu.servlet;import javax.servlet.Servlet;/*** 充当用户列表webapp开发者** @author Beyong* @date 2023/02/28 08:50**/
public class UserListServlet implements Servlet {public void service() {System.out.println("UserListServlet's service...");}
}
package com.sdnu.servlet;import javax.servlet.Servlet;/*** 充当用户登录webapp开发者** @author Beyong* @date 2023/02/28 08:51**/
public class UserLoginServlet implements Servlet {public void service() {System.out.println("UserLoginServlet's service...");}
}

web.properties

/aaa=com.sdnu.servlet.UserListServlet
/bbb=com.sdnu.servlet.UserLoginServlet
/ccc=com.sdnu.servlet.BankServlet

5.开发一个带有Servlet的WebApp

5.1创建一个名为crm的项目

在这里插入图片描述

5.2 在项目中创建一个名为WEB-INF的文件(必须)

在这里插入图片描述

5.3在WEB-INF下新建一个名为classes,将来存储java字节码文件。(必须)

在这里插入图片描述

5.4在WENINF下新建一个名为lib的文件夹,将来存储jar包。

在这里插入图片描述

5.5在WEB-INF下新建一个名为web.xml文件(必须)

在这里插入图片描述
从其它地方拷贝即可。

在这里插入图片描述

5.6 编写小Java程序,必须实现Servlet接口

在这里插入图片描述

  • 将这个路径配置到环境变量
    在这里插入图片描述

在这里插入图片描述

5.7编写HelloServlet程序

小程序:

package com.sdnu.servlet;import jakarta.servlet.Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.ServletConfig;
import java.io.IOException;public class HelloServlet implements Servlet{public void init(ServletConfig config) throws ServletException{}public void service(ServletRequest request, ServletResponse response)throws ServletException, IOException{System.out.println("My Hello World!!!");}public void destroy(){}public String getServletInfo(){return "";}public ServletConfig getServletConfig(){return null;}
}

编译后:
在这里插入图片描述

获得字节码:
在这里插入图片描述

5.8 将以上生成的class字节码拷贝到WEB-INF\classes下

在这里插入图片描述

5.9 在web.xm注册Servlet类

目的:使得请求路径和Servlet类关联到一起。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaeehttps://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"version="5.0"metadata-complete="true"><!--servlet描述信息--><!--任何一个servlet都对应一个servlet-mapping--><srvlrt><srvlet-name>aaa</servlet-name><srvlet-class>com.sdnu.servlet.HelloServlet</servlet-class></servlet><!--servlet映射信息--><servlet-mapping><!--这里名字随便,但要和上面的内容一致--><srvlet-name>aaa</servlet-name><!--这里要一个路径--><!--必须以/开始--><srvlet-pattern>/bbb/ccc/ddd</servlet-pattern></servlet-mapping>
</web-app>

5.10启动Tomcat服务器

5.11打开浏览器

输入url:

http://127.0.0.1:8080/crm/bbb/ccc/ddd

在这里插入图片描述

6.使用IDEA开发Servlet

6.1项目

新建一个空的项目。

6.2模块

在项目中新建一个新的javase模块。

6.3 Module变成Java EE模块

在这里插入图片描述
在这里插入图片描述
如下结构符合WebApp
在这里插入图片描述

6.4编写Servlet

package com.sdnu.javaweb.servlet;import jakarta.servlet.*;import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;/*** StudentServlet** @author Beyong* @date 2023/02/28 17:37**/
public class StudentServlet implements Servlet{@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {servletResponse.setContentType("text/html");PrintWriter out = servletResponse.getWriter();Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/java_web";String user = "root";String password = "XXXXXXX";conn = DriverManager.getConnection(url, user, password);String sql = "select no, name from t_student";ps = conn.prepareStatement(sql);rs = ps.executeQuery();while(rs.next()){String no = rs.getString("no");String name = rs.getString("name");out.print(no + "," + name + "</br>");}} catch (ClassNotFoundException | SQLException e){e.printStackTrace();} finally {if(rs != null){try{rs.close();} catch(SQLException e){e.printStackTrace();}}if(ps != null){try{ps.close();} catch(SQLException e){e.printStackTrace();}}if(conn != null){try{conn.close();} catch(SQLException e){e.printStackTrace();}}}}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}
}

需要导入如下两个JAR包

在这里插入图片描述

6.5 导入数据库驱动

在WEB-INF下新建一个名为lib的文件夹,将数据库对应的jar包放入。

6.6 在web.xm注册Servlet类

web.xml完成servlet类的注册。

<?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-name>studentServlet</servlet-name><servlet-class>com.sdnu.javaweb.servlet.StudentServlet</servlet-class></servlet><servlet-mapping><servlet-name>studentServlet</servlet-name><url-pattern>/servlet/student</url-pattern></servlet-mapping>
</web-app>

6.7 前端页面

编写前端页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><a href="/servlet/student">student list</a>
</body>
</html>

放到web目录下。

6.8项目部署

使得IDEA连接Tomcat,同时将webapp部署到Tomcat上。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6.9启动Tomcat服务器

debug启动
在这里插入图片描述

6.10浏览器访问

http://localhost:8080/xmm/servlet/student

展示数据库中的数据
在这里插入图片描述

在这里插入图片描述

作者:Beyong    
出处:Beyong博客
github地址 https://github.com/beyong2023

本博客中未标明转载的文章归作者Beyong有,欢迎转载,但未经作者同意必须保留此段声明,且在文章明显位置给出原文连接,否则保留追究法律责任的权利。

相关文章:

【JavaWeb】Servlet基础

文章目录1.Tomcat服务器安装注意事项2.编写WebApp3.BS系统角色和协议4.模拟Servlet4.1模拟sun公司4.2模拟Tomcat服务器4.3模拟WebApp开发者5.开发一个带有Servlet的WebApp5.1创建一个名为crm的项目5.2 在项目中创建一个名为WEB-INF的文件&#xff08;必须&#xff09;5.3在WEB-…...

pinia + pinia-plugin-persistedstate + 组合式API 写法,持久化失效问题

持久化失效卡了一天的问题安装使用就不多说了&#xff0c;主要是针对持久化失效的几个问题说明和解决方法首先是组合式写法&#xff0c;配置持久化export const useUserStore defineStore(user, () > {},{persist: true} )defineStore 第三个参数&#xff0c;具体可以看 p…...

ptrace 调式详解

在程序出现bug的时候&#xff0c;最好的解决办法就是通过 GDB 调试程序&#xff0c;然后找到程序出现问题的地方。比如程序出现 段错误&#xff08;内存地址不合法&#xff09;时&#xff0c;就可以通过 GDB 找到程序哪里访问了不合法的内存地址而导致的。本文不是介绍GDB不是使…...

【AI绘画】绝美春天插画,人人都是插画师

春天&#xff0c;自然界重新苏醒&#xff0c;生机勃勃&#xff0c;百花争艳&#xff0c;万籁俱寂。一切都被新的生命活力所染上。春风拂面&#xff0c;一股清新的空气流过&#xff0c;仿佛带着一种神秘的力量&#xff0c;让人心旷神怡&#xff0c;心情舒畅、轻松愉悦。 突然&a…...

蓝桥杯入门即劝退(二十四)重复的子字符串(被秒杀)

欢迎关注点赞评论&#xff0c;共同学习&#xff0c;共同进步&#xff01; ------持续更新蓝桥杯入门系列算法实例-------- 如果你也喜欢Java和算法&#xff0c;欢迎订阅专栏共同学习交流&#xff01; 你的点赞、关注、评论、是我创作的动力&#xff01; -------希望我的文章…...

针对序列级和词元级应用微调BERT(需修改)

对于序列级和词元级自然语言处理应用&#xff0c;BERT只需要最小的架构改变&#xff08;额外的全连接层&#xff09;&#xff0c;如单个文本分类&#xff08;例如&#xff0c;情感分析和测试语言可接受性&#xff09;、文本对分类或回归&#xff08;例如&#xff0c;自然语言推…...

(四十七)大白话表锁和行锁互相之间的关系以及互斥规则是什么呢?

今天我们接着讲&#xff0c;MySQL里是如何加表锁的。这个MySQL的表锁&#xff0c;其实是极为鸡肋的一个东西&#xff0c;几乎一般很少会用到&#xff0c;表锁分为两种&#xff0c;一种就是表锁&#xff0c;一种是表级的意向锁&#xff0c;我们分别来看看。 首先说表锁&#xf…...

织梦TXT批量导入TAG标签并自动匹配相关文章插件

织梦TXT批量导入TAG标签并自动匹配相关文章插件是一种非常有用的插件&#xff0c;它可以帮助网站管理员快速地将TAG标签添加到文章中&#xff0c;并自动匹配相关文章。 以下是该织梦TXT批量导入TAG标签插件的几个优点&#xff1a; 1、提高网站的SEO效果&#xff1a;TAG标签是搜…...

Sentinel架构篇 - 10分钟带你看滑动窗口算法的应用

限流算法 以固定时间窗口算法和滑动时间窗口算法为例&#xff0c;展开两种限流算法的分析。 固定时间窗口算法 在固定的时间窗口内&#xff0c;设置允许固定数量的请求进入。如果超过设定的阈值就拒绝请求或者排队。 具体的&#xff0c;按照时间划分为若干个时间窗口&#…...

redis主从复制

<1> redis主从复制介绍&#xff1a; 首先来介绍一下什么是redis主从复制 Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。但如果当把数据存储在单个Redis的实例中&#xff0c;当读写体量比较大的时候&#xff0c;服务端就很难承受…...

近期常见组件漏洞更新:

&#xff08;1&#xff09;mysql 5.7 在2023年1月17日&#xff0c;发布了到5.7.41版本 mysql 8.0 在2023年1月17日&#xff0c;发布了到8.0.32版本 MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ &#xff08;2&#xff09;Tomcat8在202…...

深度学习常用的激活函数总结

各种激活函数总结 目录一、sigmoid二、tanh![在这里插入图片描述](https://img-blog.csdnimg.cn/a0d92552edf8464db793fdd2f2b75cb5.png)三、ReLU系列1.原始ReLU2.ReLU改进&#xff1a;Leaky ReLU四、swish五、GeLU一、sigmoid 优点&#xff1a; 1.可以将任意范围的输出映射到 …...

Java编程问题top100---基础语法系列(二)

Java编程问题top100---基础语法系列&#xff08;二&#xff09;六、如何测试一个数组是否包含指定的值&#xff1f;简单且优雅的方法:自己动手写逻辑对象数组JDK 8 APIJDK 9 API Set.of()七、重写&#xff08;Override&#xff09;equlas和hashCode方法时应考虑的问题理论上讲&…...

网页打印与导出word实现在A4纸上相同效果

在工作中遇到这样一个需求&#xff0c;客户要求&#xff1a; 1、实现在浏览器中打印和导出到word中&#xff0c;要求浏览器打印出来的效果和word中打印的效果基本一致。2、打印的内容要自动分页&#xff0c;第一页的顶部有文件头&#xff0c;最后一页的底部有页尾。 这里记录一…...

备战英语6级——记录复习进度

开始记录—— 学习&#xff1a;如何记录笔记&#xff1f; 1&#xff1a;首先我认为&#xff1a;电脑打字比较适合我&#xff01; 2&#xff1a;先记笔记&#xff0c;再“填笔记”&#xff01; 记笔记就是一个框架&#xff0c;记录一个大概的东西。后面需要在笔记中&#xff0…...

实例10:四足机器人运动学逆解可视化与实践

实例10&#xff1a; 四足机器人运动学逆解单腿可视化 实验目的 了解逆运动学的有无解、有无多解情况。了解运动学逆解的求解。熟悉逆运动学中求解的几何法和代数法。熟悉单腿舵机的简单校准。掌握可视化逆向运动学计算结果的方法。 实验要求 拼装一条mini pupper的腿部。运…...

Elasticsearch7.8.0版本优化——路由选择

目录一、Elasticsearch 如何知道一个文档存放在哪个分片二、不带 routing 查询三、带 routing 查询一、Elasticsearch 如何知道一个文档存放在哪个分片 其实是通过这个公式来计算出来&#xff1a;shard hash(routing) % number_of_primary_shardsrouting 默认值是文档的 id&a…...

Go常量的定义和使用const,const特性“隐式重复前一个表达式”,以及iota枚举常量的使用

Go常量的定义和使用const,以及iota枚举常量的使用Go常量constGo中常量的定义和使用Go特性const,"隐式重复前一个表达式"iota 实现枚举常量Go常量const Go语言中的const整合了C语言中的宏定义常量&#xff0c;const只读变量枚举变量 绝大多数情况下&#xff0c;Go常…...

Git学习(1)pro git阅读

目录 目录&#xff1a; 1. 起步 2. Git 基础 3. Git 分支 4. 服务器上的 Git 5. 分布式 Git 第一章 1.3 Git是什么 1.6运行git前的配置 该开源图书网站 Git - Book (git-scm.com) 目录&#xff1a; 1. 起步 1.1 关于版本控制1.2 Git 简史1.3 Git 是什么&#xff1f;1…...

PHY自协商

1. 自协商定义 自动协商模式是端口根据另一端设备的连接速度和双工模式&#xff0c;自动把它的速度调节到最高的公共水平&#xff0c;即线路两端能具有的最快速度和双工模式。 自协商功能允许一个网络设备能够将自己所支持的工作模式信息传达给网络上的对端&#xff0c;并接受对…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...