Android开发基础

news2024/11/23 19:34:27

文章目录

    • 前言
    • 工程项目结构
    • hello world
      • 界面布局
      • 代码操作
    • 新页面
    • 页面间跳转
    • 简单计算器的实现思路
      • 前端控件传递数据
      • 后端实现逻辑
    • 两个Activity之间传值
      • 发送数据
      • 返回数据
    • SQLite
      • 简单使用
      • 利用语句
    • 写在后面
    • 写在后面

前言

安卓(Android)是一种基于Linux内核的开源操作系统

使用javakotlin语言开发(如果要求效率可以调用C/C++),安装Android Studio,基于idea的开发工具

简单配置新建项目运行一个helloworld

在这里插入图片描述

可能比较卡,在真机中调试,打开开发者选项,允许usb调试,我的是华为鸿蒙系统,还要设置关闭监控ADB安装应用才能安装调试

在这里插入图片描述

日志分5个等级

// e:错误信息 w:警告信息 i:一般消息 d:调试信息 v:冗余信息
Log.d("logtest","this is a test log");

如果我们在app中随意滑动,这个参数会实时传递(好神奇)

在这里插入图片描述

安卓开发通常有两种模式,原生模式和混合模式,就类似ClientBrowser的区别,混合模式通常由 HTML5云网站 + APP应用客户端组成,客户端是一个基础框架,而数据交互都要到云端去获取

工程项目结构

一个空项目的结构如下

在这里插入图片描述

app模块结构如下

在这里插入图片描述

app:app模块,我们编译运行app就是运行某个模块,而不是一个项目
	|————manifests:AndroidManifest.xml,APP的运行配置文件
	|————java:第一个包存放当前模块java源代码,后两个是java测试代码
	|————res:存放资源文件
		|————drawable:存放图形描述文件与图片文件
		|————layout:存放app页面的布局文件
		|————mipmap:存放app的启动图标
		|————values:存放常量定义文件,如字符串常量、像素常量...
Gradle Scripts:类似 maven
	|————build.gradle:分为项目级和模块级,用于描述app工程的编译规则
	|————proguard-rules.pro:描述java代码的混淆规则
	|————gradle.properties:配置编译工程的命令行参数
	|————setting.gradle:配置需要编译的模块
	|————local.properties:本地配置文件,描述开发者电脑环境配置

hello world

界面布局

使用xml文件来在前端(?)显示数据,类似html的作用,同样用java编写代码逻辑

res/layout/activity_main.xml,看名字就知道是主界面activityxmlActivity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
	<!-- 必须在定义了命名空间后才可以使用
    定义:xmlns:app =xxx   
    使用:app:xxx
    -->
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
	<!-- android:id="@+id/tv"为控件定义了唯一标识符 tv -->
</androidx.constraintlayout.widget.ConstraintLayout>

在这里插入图片描述

不知道大家用没用chatgpt,真的很好用啊,强烈推荐!尤其是做安全方面,现在要求太高,什么都要会一点,脚本小子都没饭吃,它可以帮助我们在任何领域快速的从0到1
在这里插入图片描述

看出使用了center属性,那我们的默认代码没有center怎么做到中间对齐呢?

在这里插入图片描述

ta真的更懂我!比起在搜索引擎搜索半天解决不了问题,这个真的太厉害了(或许暂时不能替代程序员或者解决一些高难度的问题,但是看好未来的发展,至少现在,ta已经很棒了,我们可以从枯燥的cv工程师进化成创意实现者,等一下,有了ta我们写博客还有看的价值吗hahaha😂😂)

ps:还有更多有意思的玩法大家自行去搜索吧,我目前只把ta当学习工具&代码助手

有了布局页面,使用代码操作

代码操作

java/com.example.myapplication/MainActivity,见名知意

在函数中插入两句代码,作用是找到xml文件中定义的tv控件,并改变它的文本内容

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = findViewById(R.id.tv);
        tv.setText("你好,世界!");
    }

在这里插入图片描述

新页面

layout下新建一个布局文件activity_main2.xml,添加了一个文本控件,内容引用strings.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/text2"/>

</LinearLayout>

strings.xml中定义该变量

<string name="text2">My Application text2</string>

新建一个MainActivity2.java,写逻辑代码,引用main2的布局文件

public class MainActivity2 extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
    }
}

AndroidMainfest.xml中声明该页面

<activity android:name=".MainActivity2" />

这样一个页面就完成了,当然,有快捷新建选项,帮我们都配置好了,右键选择即可

页面间跳转

从页面1跳转到页面2,使用button控件绑定一个事件,在main1.xml中添加button

<Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/text3"
        tools:ignore="MissingConstraints" />

main1.java中新建一个Intent类,Intent 是 Android 应用程序中用于实现消息传递和跨应用组件调用的类。通过创建一个新的 Intent 对象,可以启动新的 Activity、向其他应用程序发送消息或广播、启动服务等。

Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent();
        intent.setClass(MainActivity.this,MainActivity2.class);
        startActivity(intent);
    }
});

启动main2activity,实现跳转

在这里插入图片描述

点击

在这里插入图片描述

简单计算器的实现思路

这里只实现了一个简单的计算器的部分功能,很多情况也没写到!!!只是为了了解一整个流程,不用细抠代码

前端控件传递数据

实现一个简单加减乘除计算器,并不需要与服务端链接,它的大致思路就是设计一个布局文件,由n个按钮组成,实现类获取输入的数字与计算方法(加减乘除),然后计算后返回结果到输出控件(话说看过vb的一定都知道这种控件编程)

在这里插入图片描述

首先设计布局,计算器由一个标题->简单计算器,一个文本框用来显示输入和计算结果,一个4×5的按钮控件组成

activity_calculator.xml: 改成垂直线性布局,设置背景颜色和边距

<LinearLayout ...
    tools:context=".CalculatorActivity"
    android:background="#EEEEEE"
    android:orientation="vertical"
    android:padding="5dp">
    <!-- LinearLayout设置一个垂直线性布局视图,标题,文本框,按钮垂直排列 -->
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <!-- ScrollView设置一个滚动视图,标题,文本框,按钮LinearLayout垂直排列 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <TextView></TextView>
            <TextView></TextView>
            <GridLayout>
                <Button></Button>
                <Button></Button>
                ...
                <Button></Button>
            </GridLayout>
        </LinearLayout>
	</ScrollView>
</LinearLayout>

设置标题行和文本框

<!-- 标题行设置 -->
<TextView
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:text="@string/简单计算器"
	android:textColor="@color/black"
	android:textSize="20sp"
	android:gravity="center"/>
<!-- 文本框设置 -->
<TextView
	android:id="@+id/tv_result"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:background="@color/white"
	android:lines="3"
	android:text="0"
	android:textColor="@color/black"
	android:textSize="25sp"
	android:gravity="right|bottom" />

按钮用一个<GridLayout>控件包裹,20个按钮的设置复制粘贴,改一下文本内容和id即可,效果如上图

<GridLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:columnCount="4"
    android:rowCount="5">
    <Button
        android:id="@+id/btn_clear_entry"
        android:layout_width="0dp"
        android:layout_height="@dimen/button_height"
        android:layout_columnWeight="1"
        android:gravity="center"
        android:text="@string/cancel"
        android:textColor="@color/black"
        android:textSize="@dimen/button_font_size"
        android:backgroundTint="#1100"
        />
    <Button
        android:id="@+id/btn_division"
        android:layout_width="0dp"
        android:layout_height="@dimen/button_height"
        android:layout_columnWeight="1"
        android:gravity="center"
        android:text="÷"
        android:textColor="@color/black"
        android:textSize="@dimen/button_font_size"
        android:backgroundTint="#1100"
        />
    ...
</GridLayout>

那么下一步就是数据传递,设置监听器,监听控件传递的内容

public class CalculatorActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView tv_result;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calculator);
        // 从布局文件获取名叫tv_result的文本视图
        tv_result = findViewById(R.id.tv_result);
        // 给20个按钮控件注册监听器
        findViewById(R.id.btn_clear_entry).setOnClickListener(this);
        findViewById(R.id.btn_division).setOnClickListener(this);
        findViewById(R.id.btn_multiplication).setOnClickListener(this);
        ......
    }
    @Override
    public void onClick(View view) {
        // 获取控件内容
        String inputText = ((TextView)view).getText().toString();
        // 测试是否传入
        System.out.println(inputText);
    }
}

点击后就会获得文本内容

在这里插入图片描述

后端实现逻辑

接下来就是计算器的逻辑设计了,要将按钮分类,每一类对应不同的处理方式

  • 一种是数字和小数点,这种是作为操作数拼接处理
  • 清除所有C,清除当前输入CE、等于这种文本框显示处理
  • 加减乘除倒数开根号这种运算处理
public void onClick(View view) {
    String inputText = ((TextView)view).getText().toString();
    switch (view.getId()){
        // 点击 CE 按钮
        case R.id.btn_clear_entry:
            break;
        // 点击 C 按钮
        case R.id.btn_clear:
            break;
        // 点击加减乘除
        case R.id.btn_add:
        case R.id.btn_sub:
        case R.id.btn_multiplication:
        case R.id.btn_division:
            break;
        // 点击求倒数
        case R.id.btn_reciprocal:
            break;
        // 点击开根号
        case R.id.btn_sqrt:
            break;
        // 点击等号按钮
        case R.id.btn_equal:
            break;
        // 点击数字和点
        default:
            break;
    }
}

设置操作数

// 第一个操作数
private String firstNum = "";
// 第二个操作数
private String secondNum = "";
// 运算符
private String operator = "";
// 当前计算结果
private String result = "";
// 显示的文本内容
private String showText = "";

在这里插入图片描述

CE

在这里插入图片描述

C

在这里插入图片描述

一般我们是先输入一个数,然后点击操作符运算,加减乘除还要输入第二个操作数,然后得到结果,第一个操作数可能是初始状态的 0(直接输入运算符0+1)/第一次输入的数值(如1+1)/当前计算结果的值(如1+1的结果继续运算 1+1+1),而第二个操作数显然就是运算符后的数值,这样我们计算完得到结果就需要将运算符清空

// 点击数字和点
default:
    // 11+1.2+44
    if (operator.equals("")){
        firstNum = firstNum + inputText;
        System.out.println("firstNum is "+firstNum);
    }else {
        secondNum = secondNum + inputText;
    }
    // 整数不需要拼接前面的0,不刷新
    if (showText.equals("0")&&!inputText.equals(".")){
        refreshText(inputText);
    }else {
        refreshText(showText + inputText);
    }
    break;


// 刷新文本显示
private void refreshText(String text){
    showText = text;
    tv_result.setText(showText);
}

加减乘除

// 点击加减乘除
case R.id.btn_add:
case R.id.btn_sub:
case R.id.btn_multiplication:
case R.id.btn_division:
    operator = inputText;
    refreshText(showText + operator);
    break;

等号计算加减乘除

// 点击等号按钮
case R.id.btn_equal:
    double calculate_result = calculateFour();
    refreshOperate(String.valueOf(calculate_result));
    refreshText(showText + "=" + result);
    break;

private void refreshOperate(String new_result) {
        result = new_result;
        firstNum = result;
        secondNum = "";
        operator = "";
    }

private double calculateFour() {
    switch (operator){
        case "+":
            return Double.parseDouble(firstNum) + Double.parseDouble(secondNum);
        case "-":
            return Double.parseDouble(firstNum) - Double.parseDouble(secondNum);
        case "×":
            return Double.parseDouble(firstNum) * Double.parseDouble(secondNum);
        case "÷":
            return Double.parseDouble(firstNum) / Double.parseDouble(secondNum);
    }
    return 0;
}

清除

// 点击 C 按钮
case R.id.btn_clear:
    clear();
    break;

private void clear() {
    firstNum = "";
    secondNum = "";
    operator = "";
    refreshText("");
}

重申:bug多多,感兴趣自行调试,加减乘除功能基本实现

在这里插入图片描述

两个Activity之间传值

发送数据

之前说两个Activity跳转使用intent(意图)跳转,发送数据也是如此

Intent intent = new Intent();
intent.putExtra("key", "value");
startActivity(intent);

或者使用包裹bundle打包数据,再放入

Bundle bundle = new Bundle();
bundle.putString("name","jojo");
bundle.putInt("age",15);
intent.putExtra(bundle);
startActivity(intent);

接收数据,从Intent中获取Extras

Bundle bundle = getIntent().getExtras();
String name = bundle.getString("name");
int age = bundle.getInt("age");

返回数据

返回数据方使用setResult方法

Intent resultIntent = new Intent();
resultIntent.putExtra("key", "value");
setResult(RESULT_OK, resultIntent);
finish();

接收方

Intent intent = new Intent(this, MyActivity.class);
startActivityForResult(intent, REQUEST_CODE);
// 接收返回数据,重写onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        String value = data.getStringExtra("key");
    }
}

SQLite

简单使用

SQLite是一款用于嵌入式的轻量级的数据库,我们在安卓开发时就使用这种数据

创建一个数据库,它是以文件的形式存在的

sqlite3 test.db
// 打开一个数据库,没有则新建
sqlite>.open test.db
// 查看当前数据库路径
sqlite> .databases
main: /home/ubuntu/Documents/sqlite_db/test.db r/w

在这里插入图片描述

创建表

sqlite> CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);
sqlite> CREATE TABLE DEPARTMENT(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      NOT NULL
);
// 查看表
sqlite> .tables
COMPANY     DEPARTMENT

插入数据

INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Allen', 25, 'Texas', 15000.00 );
...
// 查看表数据
SELECT column1, column2, columnN FROM table_name;
SELECT * FROM table_name
// 格式化输出
sqlite> .headers on
sqlite> .mode column
sqlite> select * from company;

菜鸟教程-SQLite

我们在开发时可以通过继承SQLiteOpenHelper实现类来编写sqlite语句,都是差不多的

利用语句

字段数&回显位置

/* 查询字段数(3列) */
'1' order by 3;
'1' order by 4;
/* 查看回显位置 */
'0' union select 1,2,3;
/* 查版本 */
'0' union select 1,2,sqlite_version();

查看当前数据库表名和字段名

'0' union select 1,2,sql from sqlite_master;

'0' union select 1,2,sql from sqlite_master where type='table';

'0' union select 1,2,sql from sqlite_master where type='table' and name='company';

查询数据

'0' union select ID,NAME,AGE,ADDRESS,SALARY from company;

webshell

/* 写到 db 文件需要文件包含漏洞,否则无法执行 */
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (payload, '00', 32, '<?php phpinfo();?>', 20000.00 );

在这里插入图片描述

还可以使用attach,这里就不说了

写在后面

因为学习过java,就不再继续深入了,了解大致开发流程即可,除了APP本地的数据交互,还会有云端交互,也就是常见的web app,这是一种框架型APP开发模式(HTML5 APP 框架开发模式),具有跨平台的优势,该模式通常由HTML5云网站+APP应用客户端两部份构成,APP应用客户端只需安装应用的框架部份,而应用的数据则是每次打开APP的时候,去云端取数据呈现给手机用户,还有完全的html5 app等,这就和web应用所差无几了

ere type=‘table’ and name=‘company’;


查询数据

```sqlite
'0' union select ID,NAME,AGE,ADDRESS,SALARY from company;

webshell

/* 写到 db 文件需要文件包含漏洞,否则无法执行 */
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (payload, '00', 32, '<?php phpinfo();?>', 20000.00 );

[外链图片转存中…(img-wHI63ChM-1670913175990)]

还可以使用attach,这里就不说了

写在后面

因为学习过java,就不再继续深入了,了解大致开发流程即可,除了APP本地的数据交互,还会有云端交互,也就是常见的web app,这是一种框架型APP开发模式(HTML5 APP 框架开发模式),具有跨平台的优势,该模式通常由HTML5云网站+APP应用客户端两部份构成,APP应用客户端只需安装应用的框架部份,而应用的数据则是每次打开APP的时候,去云端取数据呈现给手机用户,还有完全的html5 app等,这就和web应用所差无几了

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

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

相关文章

不就是性能测试吗?竟让我一个月拿了8个offer,其中两家都是一线大厂

随着互联网的发展&#xff0c;单机软件的逐渐减少&#xff0c;系统从单机步入“云”时代&#xff0c;软件系统功能和规模也越来越庞大&#xff0c;盗版也越来越难&#xff0c;用户规模也越来越大&#xff0c;企业盈利随之爆发式地增长。 随着用户数量的增多&#xff0c;系统稳…

Chrome浏览器修改用户资料(User Data)的存放位置

2022.12.13一、 原先采用的在快捷方式中修改目标的方法&#xff0c;没有效果。二、创建链接1. 复制2. 删除3. 创建链接mklink参考用于缓解C盘压力&#xff0c;将浏览器用户数据存放于其他的指定位置。简单记录一下操作步骤。 其中用户数据可以如此查找&#xff0c;在浏览器地址…

数字虚拟人发展简史

虚拟人的发展史就是技术的发展史 作为元宇宙时代的基石&#xff0c;虚拟人的发展历史与制作技术的进步高度相关。在元宇宙概念中&#xff0c;未来每个用户都将依托虚拟人作为自己的化身进入虚拟世界中探索&#xff0c;要达成这个目的&#xff0c;就要求数字虚拟人不仅拥有人的…

java计算机毕业设计ssm智慧消防维保系统后端设计与实现3cmg0(附源码、数据库)

java计算机毕业设计ssm智慧消防维保系统后端设计与实现3cmg0&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都…

【毕业设计】微信小程序校园跑腿系统 校园跑腿小程序 校园跑腿微信小程序

一、前言 大学是一个小社会&#xff0c;我们在学校学习到专业知识的时候&#xff0c;有会遇到很多形形色色的任务&#xff0c;但最重要的依旧是社会经历。很多大学生都会想着在大学闯出一片新天地&#xff0c;所以他们往往会选择自己或者带上志同道合的朋友来一起创业。一次好…

泛微京桥通集成SAP,让采购流程闭环、业务管理一体化

SAP作为强大的业务处理平台&#xff0c;推动着组织采购管理走向数字化。其中的SAP MM&#xff08;MaterialManagement&#xff09;&#xff08;物料管理&#xff09;涉及到物料管理全过程&#xff0c;主要包括&#xff1a;物料需求计划、物料主数据、采购、供应商评价、库存管理…

简单聊聊 WebSocket

简单聊聊 WebSocket 1、简介 ​  WebSocket 是一种在单个 TCP 连接上进行 全双工 通信的协议。 扩展&#xff1a; ​  WebSocket 与 Socket 的区别 WebSocket 是应用层的一个通信协议&#xff1b;Socket 是对 TCP&#xff08;或UDP&#xff09;抽象封装的一组接口&#xf…

浅谈责任链设计模式在框架源码中的运用

写在前面&#xff0c;该篇博文为我在部门的技术分享&#xff0c;所以文字记录不是特别详细。本文更像是一个大纲&#xff0c;由浅入深讲解责任链设计模式。 浅谈责任链设计模式在框架源码中的运用一、分享目的二、简单介绍三、逐个拆解四、源码环节1、Tomcat2、Spring MVC3、Sp…

【MySQL基础】什么是MySQL约束?什么是主键约束?

目录 一、什么是MySQL约束&#xff1f; 二、MySQL约束有什么作用&#xff1f; 三、MySQL约束常见七大类&#xff1f; 主键约束(primary key) PK 1.概念 2.主键约束的相关操作 添加单列主键 添加多列主键(联合主键) 通过修改表结构添加主键 删除主键 &#x1f49f; 创…

【Notebook系列第十三期】基于多模型推理任务的车辆特征识别

在之前的课程中&#xff0c;我们分享的推理任务大部分都只由一个模型构成&#xff0c;但在真实的业务场景下&#xff0c;往往需要我们将多个模型放在一起去运行&#xff0c;才能获取到这个任务的最终预期结果。 因此&#xff0c;本次分享将通过一个简单的示例演示如何使用 Ope…

12月13日(第11天)

腾讯云上通过面板开放端口&#xff0c;不起作用&#xff0c;解决办法&#xff1a;手动在服务器上开放&#xff0c;参考文章地址&#xff1a;在腾讯云控制台下配置防火墙端口无效 直接关闭防火墙是最简单的&#xff0c;systemctl stop firewalld&#xff0c;然后再再腾讯云上打开…

解决端口被占用的方法(查看端口和关闭端口)

目录 前言必读 一.简介 二、解决办法 1.查看该端口是否被占用 2.关闭占用该端口的进程 前言必读 读者手册&#xff08;必读&#xff09;_云边的快乐猫的博客-CSDN博客 一.简介 在使用各种端口时候经常会出现端口被占用导致代码程序无法执行或者执行错误。一般都是由于该端…

DataGear 4.3.0 发布,数据可视化分析平台

DataGear 4.3.0 发布&#xff0c;增强图表和看板功能&#xff0c;具体更新内容如下&#xff1a; 新增&#xff1a;看板模板新增dg-dashboard-auto-render属性&#xff0c;用于控制看板是否自动渲染&#xff1b;新增&#xff1a;看板模版新增dg-dashboard-code属性&#xff0c;…

Spring Batch 批处理-作业参数设置与获取

引言 书接上篇Spring Batch批处理-作业Job简介&#xff0c;上篇带小伙伴们了解色作业Job对象&#xff0c;那这篇就看一下作业参数是啥一回事&#xff0c;同时要怎么设置参数并获取参数的。 JobParameters 前面提到&#xff0c;作业的启动条件是作业名称 识别参数&#xff0…

MQ消息中间件

MQ消息中间件1、应用场景1、流量削峰2、应用解耦3、异步处理2、MQ分类1、ActiveMQ2、kafka3、RocketMQ4、RabbitMQ3、RabbitMQ详解3.1、核心概念3.2 RabbitMQ基本知识点3.3消息发布确认3.4 交换机1、应用场景 1、流量削峰 将访问的大流量通过消息队列做缓冲&#xff0c;我们可…

二叉树-二叉树的基础遍历(3)

二叉树的遍历的三种方式 1.前序遍历&#xff1b; 先访问根结点&#xff0c;然后再访问左子树&#xff0c;最后访问右子树 2.中序遍历&#xff1b; 先访问左子树&#xff0c;中间访问根节点&#xff0c;最后访问右子树 3.后序遍历&#xff1b; 先访问左子树&#xff0c;再访问右…

PicoRV32 笔记 05

接口信号 PicoRV32 提供一个本地存储器接口&#xff0c;Native Memory Interface。 本地存储器接口采用 valid-ready握手信号。这种机制在axi总线中使用相同&#xff0c;能够实现流控&#xff0c; 和axi总线不同点&#xff0c;PicoRV32本地接口使用一组valid-ready信号&…

什么是SWDM4和100G QSFP28 SWDM4光模块?

随着OM5多模光纤(MMF)的推广和40G或100G数据中心传输网络的大规模部署&#xff0c;SWDM技术逐渐进入人们的视野并开始得到应用。那么&#xff0c;什么是SWDM4呢&#xff1f;什么是100G SWDM4光模块&#xff1f;它们的优势是什么&#xff1f;跟着易天光通信ETU-LINK看下面的文字…

十、原型、原型链、闭包和立即执行函数、插件开发初始

十、原型、原型链、闭包和立即执行函数、插件开发初始 原型 什么是原型&#xff08;prototype&#xff09;&#xff1f; 无论何时&#xff0c;只要创建一个函数&#xff0c;就会按照特定的规则为这个函数创建一个prototype属性&#xff0c;指向原型对象。 function Car(){}…

Vue入门与指令

Vue入门 1.1、MVVM编程思想 MVVM&#xff1a;页面输入改变数据&#xff0c;数据改变影响页面数据展示与渲染。 M&#xff08;model&#xff09;&#xff1a;普通的javascript数据对象。 V&#xff08;view&#xff09;&#xff1a;前端展示页面。 VM&#xff08;ViewModel&…