day48_servlet

今日内容

周一
0 复习上周
1 本周计划
2 MVC和三层架构
3 Login案例
4 请求转发
5 重定向

0 复习昨日

1 jdbc五大步骤

  1. 注册驱动(反射)
  2. 获得连接
  3. 获得执行sql对象
  4. 执行SQL
  5. 关流
    2 什么是SQL注入
    通过SQL关键词,在执行SQL时出现不正常的情况
    3 PreparedStatement怎么使用,有什么特点
    怎么使用? 之前拼接sql参数的地方,现在使用?占位,经过预处理后,再给?处赋值
    有什么特点? 1) 执行时不需要再给executeQuery()传参数
    2) 可以避免SQL注入的问题
    3) 向?赋值的时候,自动给字符串拼接单引号
    mybatis # PreparedStatement ,字符串’’
    $ Statement
    4 什么是servlet
    servlet是运行在服务上的程序
    servlet主要功能是: 接收请求,做出响应

5 Http请求方式有哪些
get
post
6 Http请求报文都有哪些内容
请求头,请求行,请求正文(数据)

针对不同的请求方式,后台有哪些请求方法?
doGet()
doPost()
7 后台接收请求内容的方法有哪些
req.getMethod()
req.getRequestURL()
req.getRequestURI()
req.getParameter(name属性的值);//获得请求数据
req.getParameterValues();

8 前端如何发送数据
form表单,标签得设置name属性

		<form action="/day48/login" method="get"><input type="text" name="username" /><input type="text" name="password" /><input type="submit" value="提交" /></form>

​ ajax
​ a标签

<a href="/day48/login?username=root&pwd=555">登录</a>

9 前端后后台之间如何映射?
通过web.xml配置8行代码

	<servlet><servlet-name>servlet1</servlet-name><servlet-class>c.f.s.MyServlet1</servlet-class></servlet><servlet-mapping><servlet-name>servlet1</servlet-name><url-parttern>*.do</url-parttern></servlet-mapping>

1 MVC和三层架构

通过Login案例,一个LoginServlet中

  • 接收请求

  • 完成JDBC操作

  • 根据结果做出响应

    以上这种开发模式,不好,不便于后期迭代维护


在开发中有一个思想:“分而治之”

MVC思想

  • M model/模型
    • 模型主要是指javabean,有一些java类
    • 比如封装数据的类,User类
    • 比如其他功能类,UserService,UserDao
  • V view/视图
    • 视图就是页面,
    • 比如JSP/HTML
    • 为了展现数据
  • C controller/控制器
    • 控制器控制整个流程的走向
    • 控制页面跳转

三层架构: 是指开发中编码时项目结构,主要是指将不同的功能代码再细分

  • 控制层
    • servlet主要做控制
    • 控制页面跳转
  • 业务层
    • service层
    • 主要处理业务逻辑
  • 数据访问层
    • Dao层
    • 主要与数据库交互

2 Login案例

需求: HTML页面中输入框用户名和密码,登录

  • 登录成功给出提供,欢迎
  • 登录不成功,给出提示,用户名或密码错误

在这里插入图片描述

2.1 搭建环境

数据库环境

CREATE TABLE `tb_user` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',`username` varchar(10) DEFAULT NULL COMMENT '用户名',`password` varchar(10) DEFAULT NULL COMMENT '密码',`phone` varchar(11) DEFAULT NULL COMMENT '手机号',`createTime` date DEFAULT NULL COMMENT '注册时间',`money` double(10,2) DEFAULT NULL COMMENT '账户余额',`sex` int(1) DEFAULT NULL COMMENT '性别 1男2女',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8;

项目环境

  • 创建maven-web项目

  • 补全项目结构

  • 导入依赖

      <dependencies><!-- servlet --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency><!-- servlet-jsp --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.1</version></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!-- druid连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency></dependencies>
    
  • 项目必备的java包和类

    • 工具包和工具类
    • 实体类
    • 包结构

2.2 页面

登录页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<div><form action="/day48/login" method="post">用户名<input type="text" name="username"><br>密码<input type="password" name="password"><br><input type="submit" value="登录"><br></form>
</div>
</body>
</html>

2.3 UserServlet

package com.qf.servlet;import com.qf.model.User;
import com.qf.service.UserService;
import com.qf.service.impl.UserServiceImpl;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;/*** --- 天道酬勤 ---** @author QiuShiju* @desc 控制层*/
public class UserLoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 防止乱码req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8");// 1 接收请求String username = req.getParameter("username");String password = req.getParameter("password");// 2 调用业务层处理业务UserService userService = new UserServiceImpl( );User user = userService.login(username, password);// 3 根据结果做出响应PrintWriter out = resp.getWriter( );if (user != null) {// 响应登录成功// 应该是跳转一个页面来展现数据,而不是直接作出响应// 但是现在还没学,暂时还是使用手动响应out.write("<html>");out.write("<body>");out.write("<h1>");out.write("欢迎"+user.getUsername()+"登录");out.write("</h1>");out.write("</body>");out.write("</html>");} else {// 响应登录不成功out.write("<html>");out.write("<body>");out.write("<h1>");out.write("用户名或密码错误!");out.write("</h1>");out.write("</body>");out.write("</html>");}}
}

2.4 UserService

一般开发时,会将UserService以及UserDao设计成接口+实现类的形式

  • 可以先设计接口,规定项目的功能
  • 接口还可以松耦合,实现多态,易于代码扩展

UserService接口

package com.qf.service;import com.qf.model.User;import java.util.List;/*** --- 天道酬勤 ---** @author QiuShiju* @desc 用户的业务层处理*/
public interface UserService {User login(String username, String password);// List<User> findAll();// boolean deleteUserById(int id);}

UseServiceImpl

package com.qf.service.impl;import com.qf.dao.UserDao;
import com.qf.dao.impl.UserDaoImpl;
import com.qf.model.User;
import com.qf.service.UserService;/*** --- 天道酬勤 ---** @author QiuShiju* @desc impl包,只用于存放实现类* 所有的实现类都应该是接口名+Impl来命名* 例如: UserServiceImpl* 通过这个名字,要得到两个信息* 1) 有一个接口UserService* 2) 有一个类UserServiceImpl* -----------------------------* Service层,是业务层,处理业务逻辑*/
public class UserServiceImpl implements UserService {@Overridepublic User login(String username, String password) {// 1 业务逻辑处理// 但是今天这个需求没有什么业务,就可以不做// 2 调用数据访问层操作数据库UserDao userDao = new UserDaoImpl();User user = userDao.login(username, password);// 业务层还可以对数据库返回的结果再处理return user;}
}

2.5 UserDao

UserDao接口

package com.qf.dao;import com.qf.model.User;/*** --- 天道酬勤 ---** @author QiuShiju* @desc*/
public interface UserDao {User login(String username, String password);}

UserDaoImpl实现类

package com.qf.dao.impl;import com.qf.dao.UserDao;
import com.qf.model.User;
import com.qf.util.DBUtil;/*** --- 天道酬勤 ---** @author QiuShiju* @desc*/
public class UserDaoImpl implements UserDao {@Overridepublic User login(String username, String password) {String sql = "select * from tb_user where username = ? and password = ?";User user = DBUtil.selectOne(sql, User.class, username, password);return user;}
}

这里使用了DBUtil,不习惯使用的话,也可以使用原始的JDBC自己操作

3 请求转发

请求对象HttpServletRequest

  • 请求的转发(将请求转发到其他的servlet)
  • 跳转页面
  • 请求域(存取数据)

请求转发的总结

  • 请求转发地址栏不动
  • 请求转发是服务器行为,是服务器内部动作
  • 浏览器只有一次请求
  • 可以当做请求域,数据可以在Servlet之间共享

在这里插入图片描述

3.1 请求转发

需求: 发出请求/a 映射AServlet,利用请求转发,将请求转发到BServlet

package com.qf.servlet;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** --- 天道酬勤 ---** @author QiuShiju* @desc*/
public class AServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("AServlet.doGet..." );// 请求转发// path: 就是要转发的Servlet对应的映射路径// RequestDispatcher dispatcher = req.getRequestDispatcher("/b");// 执行转发// dispatcher.forward(req,resp);// 路径不需要写成 /项目名/breq.getRequestDispatcher("/b").forward(req,resp);}
}
package com.qf.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 QiuShiju* @desc*/
public class BServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("BServlet.doGet..." );}
}
<?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_3_1.xsd"
version="3.1"><!-- 映射AServlet --><servlet><servlet-name>aServlet</servlet-name><servlet-class>com.qf.servlet.AServlet</servlet-class></servlet><servlet-mapping><servlet-name>aServlet</servlet-name><url-pattern>/a</url-pattern></servlet-mapping><!-- 映射BServlet --><servlet><servlet-name>bServlet</servlet-name><servlet-class>com.qf.servlet.BServlet</servlet-class></servlet><servlet-mapping><servlet-name>bServlet</servlet-name><url-pattern>/b</url-pattern></servlet-mapping>
</web-app>

3.2 请求域

请求域是指: HttpServletRequest对象相当于是容器,存取数据,可以在请求转发的几个类中共享数据.

  • 存储数据 req.setAttribute(key,value)
  • 取出数据 req.getAttribute(key)

请求域作用以及场景: 在多个Servlet请求转发的时候,用来传递数据

package com.qf.servlet;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;/*** --- 天道酬勤 ---** @author QiuShiju* @desc*/
public class AServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("AServlet.doGet..." );// 请求域// 存储数据到请求域req.setAttribute("username","jack");// 请求转发// path: 就是要转发的Servlet对应的映射路径// RequestDispatcher dispatcher = req.getRequestDispatcher("/b");// 执行转发// dispatcher.forward(req,resp);// 路径不需要写成 /项目名/breq.getRequestDispatcher("/b").forward(req,resp);}
}
package com.qf.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 QiuShiju* @desc*/
public class BServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("BServlet.doGet..." );// 请求域中取出数据String username = (String) req.getAttribute("username");System.out.println("username = " + username);}
}

3.3 跳转页面

在这里插入图片描述

4 重定向

重定向是HttpServletResponse对象完成一个动作

  • 可以将请求重新跳转至其他Servlet
  • 可以跳转页面

重定向总结:

  • 重定向是浏览器动作
  • 重定向地址栏会有变化
  • 是发出两次请求
  • 请求域中的数据在重定向后不能共享(因为是两次请求)

需求:

需求: 发出请求/a 映射AServlet,利用重定向,将请求重新发送请求到BServlet

public class AServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("AServlet.doGet..." );// 请求域// 存储数据到请求域req.setAttribute("username","jack");// 请求转发// path: 就是要转发的Servlet对应的映射路径// RequestDispatcher dispatcher = req.getRequestDispatcher("/b");// 执行转发// dispatcher.forward(req,resp);// 路径不需要写成 /项目名/b,是因为请求转发是服务器动作// /b,即从服务器根路径开始访问,服务器的根路径自带项目名// http://localhost:8080/day48/b//req.getRequestDispatcher("/b").forward(req,resp);// 请求转发可以跳转页面// req.getRequestDispatcher("/404.html").forward(req,resp);// 重定向// 重定向是浏览器行为,发出/b请求,那就是从浏览器的根路径发出请求// 浏览器的根路径是端口: http://localhost:8080/bString contextPath = req.getContextPath( ); // 获得项目名 /day48System.out.println("contextPath = " + contextPath);// resp.sendRedirect(contextPath+"/b");resp.sendRedirect(contextPath+"/404.html");}
}

5 注解

JDK1.5后出现的技术,注解(Annotation),是一种注释,给程序注释然后程序运行给JVM中的java代码看的

  • @Override

注解文件既不是类也不是接口

5.1 创建注解文件

在这里插入图片描述

5.2 元注解

注解的注解就是元注解

5.2.1 @Target

@Target 目标,用来规定注解能用在什么位置

位置ElementType
包上PACKAGE
类/接口/数组/枚举上TYPE
成员变量/局部变量FIELD/LOCAL_VARIABLE
方法/构造方法METHOD/CONSTRUCTOR

5.2.2 @Retention

保留,指注解保留到什么时候,或者说叫保留至什么时候生效

ps: 如果是自定义注解,一般是为了通过反射技术读取注解,所以要定义保留策略为RUNTIME

保留策略解释
SOURCE源码阶段有效
CLASS编译后class中有效
RUNTIME运行时生效

5.3 注解参数

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {// 注解的参数// 数据类型 参数名();// 一旦设置了参数,那么在使用注解时就必需给注解参数赋值// 除非给参数设置了默认值int a() default 0;// 当注解的参数名value,使用时可以省略String value() default "";String[] values() default "";}

注解的参数都是为了通过反射技术去读取到注解参数中的值

5.4 实际应用

Servlet开发中也支持使用注解,大大提高开发效率

  • @WebServlet 注解,可以取代web.xml中[经典8行]代码

作业

login案例重写2遍 (注解)通过代码演示记住 请求转发和重定向的特点SQL15道题牛客网-SQL专项 (每天2-3)
留策略解释
SOURCE源码阶段有效
CLASS编译后class中有效
RUNTIME运行时生效

5.3 注解参数

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {// 注解的参数// 数据类型 参数名();// 一旦设置了参数,那么在使用注解时就必需给注解参数赋值// 除非给参数设置了默认值int a() default 0;// 当注解的参数名value,使用时可以省略String value() default "";String[] values() default "";}

注解的参数都是为了通过反射技术去读取到注解参数中的值

5.4 实际应用

Servlet开发中也支持使用注解,大大提高开发效率

  • @WebServlet 注解,可以取代web.xml中[经典8行]代码

作业

login案例重写2遍 (注解)通过代码演示记住 请求转发和重定向的特点SQL15道题牛客网-SQL专项 (每天2-3)

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

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

相关文章

刷题之Leetcode19题(超级详细)

19.删除链表的倒数第N个节点 力扣题目链接(opens new window)https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 进阶&#xff1a;你能尝试使用一趟扫描实现吗&#x…

react09 hooks(useState)

react-09 hooks&#xff08;useState&#xff09; hooks组件&#xff08;函数组件动态化&#xff09; 其本质就是函数组件&#xff0c;引用一些hooks方法&#xff0c;用来在函数组件中进行例如状态管理&#xff0c;模拟类组件的生命周期等&#xff0c;只能运用到函数组件中 ho…

代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II,55. 跳跃游戏,45.跳跃游戏II

目录 122.买卖股票的最佳时机II思路代码 55. 跳跃游戏思路代码 45.跳跃游戏II思路代码 122.买卖股票的最佳时机II 题目链接&#xff1a;122.买卖股票的最佳时机II 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;贪心算法也能解决股票问题&#xff01;LeetCode&#xff1…

项目管理-项目成本管理

目录 一、成本管理概述 二、成本估算 2.1 定义 2.2 成本估算方法 2.2.1 自顶向下的估算 2.2.1.1 估算方法 2.2.1.2 优点 2.2.1.3 缺点 2.2.2 自底向上的估算 2.2.2.1 估算方法 2.2.2.2 优点 2.2.2.3 缺点 2.2.3 差别估算法 三、成本预算 3.1 定义 3.2 成本预算的…

ccfcsp201312-2 ISBN号码

注意&#xff1a;50分 -- u10&#xff0c;最后一位为X 代码&#xff1a; #include <bits/stdc.h> using namespace std; string s; int a[12]; int main() {cin >> s;a[1] s[0] - 0;a[2] s[2] - 0;a[3] s[3] - 0;a[4] s[4] - 0;a[5] s[6] - 0;a[6] s[7] - …

Jupyter Notebook更改默认打开的浏览器和工作目录

Jupyter Notebook更改工作目录 打开cmd&#xff0c;输入&#xff1a;jupyter notebook --generate-config&#xff0c;可以得到Jupyter Notebook配置文件的路径&#xff0c;找到路径下的jupyter_notebook_config.py文件&#xff0c;用记事本或者Sublime打开文件 找到&#xff…

统一SQL-支持unpivot列转行

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库&#xff1a;Oracle 目标数据库&#xff1a;TDSQL-MySQL 操作目标 在Oracle中&#xff0c;可以使用unpivot将列转换成行&#xff0c;在TDSQL-MySQL中没有对应的功能&#xff0c;由…

HDMI to TYPE-C芯片|HDMI2.0转TYPE-C转接器方案|CS5802设计方案|ASL CS5802

CS5802输入端可以是1080P、4K30、4K60HZ这三种规格,输出的接口可以是TYPE-C信号接口,或者是TYPE-C信号接口,输入端HDMI由4路信号组成&#xff0c;支持1.62Gbps、2.7Gbps、5.4Gbps链路速率。内置可选SSC功能可降低EMI的干扰状况。 ASL CS5802芯片概述&#xff1a; 符合HDMI规范…

二分查找详解

二分查找是一种查找方式&#xff0c;用于在已经排好序的数组中寻找某个特定的数 我们直接来介绍二分查找的查找方法 左边界与右边界 左闭右闭&#xff1a; n为数组元素个数&#xff0c;a为目标数字 我们以左闭右闭区间为例&#xff0c;left为左边界0,right为右边界n-1&…

不同条件累加(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;float result1 0;float result2 0;float result…

牛客小白月赛91 ----- Bingbong的回文路径 ---- 题解

Bingbong的回文路径&#xff1a; 题目描述&#xff1a; 思路解析&#xff1a; 现在有一棵树&#xff0c;树上每个结点上都有一个小写字母&#xff0c;那么如果唯一确定了x和y两个结点&#xff0c;那么就唯一确定了一个字符串路径&#xff08;最短路径&#xff09;。 -现在给出…

CSS 画一个三角形

一、前言 在前端开发的时候&#xff0c;我们有时候会需要用到一个三角形的形状&#xff0c;比如地址选择或者播放器里面播放按钮 通常情况下&#xff0c;我们会使用图片或者svg去完成三角形效果图&#xff0c;但如果单纯使用css如何完成一个三角形呢&#xff1f; 实现过程似…

3、MATLAB中矩阵和多维矩阵介绍

文章目录 一、矩阵二、矩阵举例三、定义变量四、定义矩阵五、获取变量值 一、矩阵 MATLAB中数据的基本格式是矩阵&#xff1b; 二维矩阵是一个带有以行和列排列的元素的矩阵表&#xff1b;如果右m行、n列&#xff0c;这个矩阵的大小就是m x n&#xff1b;多维矩阵的维数大于2…

[jinja2]模板访问对象属性

甚至可以用. 访问字典 .访问一般用得是最多的

【java解决线程间变量不可见性的方案】

解决线程间变量不可见性的方案 一、 背景 所有的实例变量和类变量都存储在主内存&#xff0c;但每个线程都有自己的工作内存&#xff0c;保留了主内存的共享变量的副本&#xff0c;线程修改的是共享变量&#xff0c;但是每个线程每次只能读取工作内存里的值&#xff0c;所以会…

Elasticsearch:(二)2.安装kibana

1.环境安装介绍: 安装java环境安装Elasticsearch安装kibana安装Elasticsearch-head插件 本节文章主要讲解kibana的安装。 2.下载 下载Elasticsearch对应的版本,参考官方自身产品兼容版本:支持一览表 | Elastic 下载地址:Kibana 7.17.20 | Elastic Kibana 7.17.20 | Ela…

操作教程丨MaxKB+Ollama:快速构建基于大语言模型的本地知识库问答系统

2024年4月12日&#xff0c;1Panel开源项目组正式对外介绍了其官方出品的开源子项目——MaxKB&#xff08;github.com/1Panel-dev/MaxKB&#xff09;。MaxKB是一款基于LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统。MaxKB的产品命名内涵为“Max …

C++ stl容器stack,queue,priority_queue的底层模拟实现

目录 前言&#xff1a; 文档借鉴&#xff1a;Reference - C Reference 1.deque a.deque的结构特点&#xff1a; b.deque的迭代器结构&#xff1a; c.面试题&#xff1a; 2.stack 3.queue 4.仿函数 5.priority_queue 总结&#xff1a; 前言&#xff1a; 本篇一共简单…

04节-51单片机-数码管模块

1.静态数码管显示 LED数码管&#xff1a;数码管是一种简单、廉价的显示器&#xff0c;是由多个发光二极管封装在一起组成“8”字型的器件 下图展示了数码管的线路连接 数码管的连接方式分为&#xff0c;公共端&#xff0c;共阴极和共阳极连接&#xff1a; 多个数码管共用引…

存储过程的查询

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 在实际使用中&#xff0c;经常会需要查询数据库中已有的存储过程或者某一个存储过程的内容&#xff0c; 下面就介绍-下如何查询存储过程。 这需要使用到数据字典 user_sou…