Android WebView 與 JS 交互

目錄

  • 二、具體分析
    • 2.1 Android通過WebView調用 JS 代碼
      • 方式1:通過WebView的loadUrl()
      • 方式2:通過WebView的evaluateJavascript()
      • 方法對比
      • 使用建議
    • 2.2、JS通過WebView調用 Android 代碼
      • 2.2.1、方法分析
        • 方式1:通過 WebView的addJavascriptInterface()進行對象映射
        • 方式2:通過 WebViewClient 的方法shouldOverrideUrlLoading ()回調攔截 url
        • 方式3:通過 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回調攔截JS對話框alert()、confirm()、prompt() 消息
        • 三種方式的對比 & 使用場景


相關文章閱讀:

  • Android WebView使用攻略



Github下載地址Android WebView與JS互調


# 一、交互方式總結 Android與JS通過WebView互相調用方法,實際上是:
  • Android去調用JS的代碼;

  • JS去調用Android的代碼;

二者溝通的橋梁是WebView

對于Android調用JS代碼的方法有2種:

  • 通過WebView的loadUrl()

  • 通過WebView的evaluateJavascript()

對于JS調用Android代碼的方法有3種:

  • 通過 WebViewaddJavascriptInterface()進行對象映射;

  • 通過 WebViewClientshouldOverrideUrlLoading() 方法回調攔截 url;

  • 通過 WebChromeClientonJsAlert()onJsConfirm()onJsPrompt()方法回調攔截 JS 對話框alert()confirm()prompt()消息;

二、具體分析

2.1 Android通過WebView調用 JS 代碼

對于Android調用JS代碼的方法有2種:

  • 通過WebView的loadUrl()

  • 通過WebView的evaluateJavascript()

方式1:通過WebView的loadUrl()

  • 實例介紹:點擊Android按鈕,即調用WebView JS(文本名為javascript)中callJS()

  • 具體使用:

步驟1:將需要調用的JS代碼以.html格式放到src/main/assets文件夾里

1、為了方便展示,本文是采用Andorid調用本地JS代碼說明;
2、實際情況時,Android更多的是調用遠程JS代碼,即將加載的JS代碼路徑改成url即可

需要加載JS代碼:androidcalljs.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Java調用JS方法</title><!-- JS代碼 --><script><!-- Android需要調用的方法 -->function callJS(){alert("Android調用了JS的callJS方法");}</script></head>
</html>

步驟2:在Android里通過WebView設置調用JS代碼

Android代碼:AndroidCallJS1.java

package com.davis.webviewjs.demo;import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Button;public class AndroidCallJS1 extends AppCompatActivity {private Button btn;private WebView webview;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_webview);init();}private void init(){btn = (Button)findViewById(R.id.btn);webview = (WebView)findViewById(R.id.webview);WebSettings webSettings = webview.getSettings();// 設置與Js交互的權限webSettings.setJavaScriptEnabled(true);// 設置允許JS彈窗webSettings.setJavaScriptCanOpenWindowsAutomatically(true);// 先載入JS代碼// 格式規定為:file:///android_asset/文件名.htmlwebview.loadUrl("file:///android_asset/androidcalljs.html");btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {webview.post(new Runnable() {@Overridepublic void run() {// 注意調用的JS方法名要對應上// 調用javascript的callJS()方法webview.loadUrl("javascript:callJS()");}});}});// 由于設置了彈窗檢驗調用結果,所以需要支持js對話框// webview只是載體,內容的渲染需要使用webviewChromClient類去實現// 通過設置WebChromeClient對象處理JavaScript的對話框//設置響應js 的Alert()函數webview.setWebChromeClient(new WebChromeClient() {@Overridepublic boolean onJsAlert(WebView view, String url, String message, final JsResult result) {AlertDialog.Builder b = new AlertDialog.Builder(AndroidCallJS1.this);b.setTitle("Alert");b.setMessage(message);b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {result.confirm();}});b.setCancelable(false);b.create().show();return true;}});}
}

效果圖

效果圖

特別注意:JS代碼調用一定要在 onPageFinished() 回調之后才能調用,否則不會調用。

onPageFinished()屬于WebViewClient類的方法,主要在頁面加載結束時調用

方式2:通過WebView的evaluateJavascript()

  • 優點:該方法比第一種方法效率更高、使用更簡潔

1、因為該方法的執行不會使頁面刷新,而第一種方法(loadUrl )的執行則會。
2、Android 4.4 后才可使用

  • 具體使用
// 只需要將第一種方法的loadUrl()換成下面該方法即可
webview.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() {@Overridepublic void onReceiveValue(String value) {//此處為 js 返回的結果Log.i("WEBVIEW_JS", "value : " + value);}
});

方法對比

調用方式優點缺點使用場景
使用loadUrl()方便簡潔效率低;
獲取返回值麻煩;
不需要獲取返回值,對性能要求較低時
使用evaluateJavascript()效率高向下兼容性差(僅Android 4.4以上可用)Android 4.4以上

使用建議

兩種方法混合使用,即Android 4.4以下使用方法1,Android 4.4以上方法2

// Android版本變量
final int version = Build.VERSION.SDK_INT;
// 因為該方法在 Android 4.4 版本才可使用,所以使用時需進行版本判斷
if (version < 18) {webview.loadUrl("javascript:callJS()");
} else {webview.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() {@Overridepublic void onReceiveValue(String value) {//此處為 js 返回的結果}});
}

2.2、JS通過WebView調用 Android 代碼

對于JS調用Android代碼的方法有3種:

  • 通過 WebViewaddJavascriptInterface() 進行對象映射

  • 通過 WebViewClientshouldOverrideUrlLoading() 方法回調攔截 url

  • 通過 WebChromeClientonJsAlert()onJsConfirm()onJsPrompt()方法回調攔截JS對話框alert()confirm()prompt()消息

2.2.1、方法分析

方式1:通過 WebView的addJavascriptInterface()進行對象映射

步驟1:定義一個與JS對象映射關系的Android類:AndroidtoJs

AndroidtoJs.java(注釋已經非常清楚)

// 繼承自Object類
public class AndroidtoJs extends Object {// 定義JS需要調用的方法// 被JS調用的方法必須加入@JavascriptInterface注解@JavascriptInterfacepublic void hello(String msg) {System.out.println("JS調用了Android的hello方法");}
}

步驟2:將需要調用的JS代碼以.html格式放到src/main/assets文件夾里

需要加載JS代碼:jscallandroid.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>JS調用Java方法</title><script>function callAndroid(){<!-- 由于對象映射,所以調用test對象等于調用Android映射的對象 -->test.hello("js調用了android中的hello方法");}</script></head><body><!-- 點擊按鈕則調用callAndroid函數 --><button type="button" id="button1" onclick="callAndroid()"></button></body>
</html>

步驟3:在Android里通過WebView設置Android類與JS代碼的映射

package com.davis.webviewjs.demo;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Button;public class JSCallAndroid1 extends AppCompatActivity {private Button btn;private WebView webview;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_webview);init();}private void init() {btn = (Button)findViewById(R.id.btn);btn.setVisibility(View.GONE);webview = (WebView)findViewById(R.id.webview);WebSettings webSettings = webview.getSettings();// 設置與Js交互的權限webSettings.setJavaScriptEnabled(true);// 設置允許JS彈窗webSettings.setJavaScriptCanOpenWindowsAutomatically(true);// 通過addJavascriptInterface()將Java對象映射到JS對象//參數1:Javascript對象名//參數2:Java對象名webview.addJavascriptInterface(new AndroidtoJs(), "test");//AndroidtoJS類對象映射到js的test對象// 先載入JS代碼// 格式規定為:file:///android_asset/文件名.htmlwebview.loadUrl("file:///android_asset/jscallandroid.html");}
}

在這里插入圖片描述
在這里插入圖片描述
特點

  • 優點:使用簡單

僅將Android對象和JS對象映射即可

  • 缺點:存在嚴重的漏洞問題

方式2:通過 WebViewClient 的方法shouldOverrideUrlLoading ()回調攔截 url

具體原理:

  • Android通過 WebViewClient 的回調方法shouldOverrideUrlLoading ()攔截 url

  • 解析該 url 的協議

  • 如果檢測到是預先約定好的協議,就調用相應方法

即JS需要調用Android的方法

具體使用:

步驟1:在JS約定所需要的Url協議

JS代碼:jscallandroid2.html

以.html格式放到src/main/assets文件夾里

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Java調用JS方法</title><!-- JS代碼 --><script>function callAndroid(){<!-- 約定的url協議為:js://webview?arg1=111&arg2=222 -->document.location = "js://webview?arg1=111&arg2=222";}</script></head><body><!-- 點擊按鈕則調用callAndroid函數 --><button type="button" id="button1" onclick="callAndroid()">JS調用Android方法</button></body></html>

當該JS通過Android的webview.loadUrl("file:///android_asset/jscallandroid2.html")加載后,就會回調shouldOverrideUrlLoading(),接下來繼續看步驟2:

步驟2:在Android通過WebViewClient復寫shouldOverrideUrlLoading()

JSCallAndroid2.java

package com.davis.webviewjs.demo;import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;import java.util.HashMap;
import java.util.Set;public class JSCallAndroid2 extends AppCompatActivity {private Button btn;private WebView webview;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_webview);init();}private void init() {btn = (Button)findViewById(R.id.btn);btn.setVisibility(View.GONE);webview = (WebView)findViewById(R.id.webview);WebSettings webSettings = webview.getSettings();// 設置與Js交互的權限webSettings.setJavaScriptEnabled(true);// 設置允許JS彈窗webSettings.setJavaScriptCanOpenWindowsAutomatically(true);// 先載入JS代碼// 格式規定為:file:///android_asset/文件名.htmlwebview.loadUrl("file:///android_asset/jscallandroid2.html");webview.setWebViewClient(new WebViewClient(){@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {// 步驟2:根據協議的參數,判斷是否是所需要的url// 一般根據scheme(協議格式) & authority(協議名)判斷(前兩個參數)//假定傳入進來的 url = "js://webview?arg1=111&arg2=222"(同時也是約定好的需要攔截的)Uri uri = Uri.parse(url);// 如果url的協議 = 預先約定的 js 協議// 就解析往下解析參數if ( uri.getScheme().equals("js")) {// 如果 authority  = 預先約定協議里的 webview,即代表都符合約定的協議// 所以攔截url,下面JS開始調用Android需要的方法if (uri.getAuthority().equals("webview")) {//  步驟3:// 執行JS所需要調用的邏輯Log.i("WEBVIEW_JS","js調用了Android的方法");// 可以在協議上帶有參數并傳遞到Android上HashMap<String, String> params = new HashMap<>();Set<String> collection = uri.getQueryParameterNames();Log.i("WEBVIEW_JS", "URI : " + uri);}return true;}return super.shouldOverrideUrlLoading(view, url);}});}
}

特點

  • 優點:不存在方式1的漏洞;

  • 缺點:JS獲取Android方法的返回值復雜。

如果JS想要得到Android方法的返回值,只能通過 WebView 的 loadUrl ()去執行 JS 方法把返回值傳遞回去,相關的代碼如下:

// Android:MainActivity.java
webview.loadUrl("javascript:returnResult(" + result + ")");// JS:javascript.html
function returnResult(result){alert("result is" + result);
}

方式3:通過 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回調攔截JS對話框alert()、confirm()、prompt() 消息

在JS中,有三個常用的對話框方法:

方法作用返回值備注
alert()彈出警告框沒有在文本加入\n可換行
confirm()彈出確認框兩個返回值- 返回布爾值;
- 通過該值可判斷點擊時確認還是取消:true表示確認,false表示取消。
prompt()彈出輸入框任意設置返回值- 點擊【確認】,返回輸入框的的值;
- 點擊【取消】,返回null。

方式3的原理:Android通過 WebChromeClientonJsAlert()onJsConfirm()onJsPrompt() 方法回調分別攔截JS對話框
(即上述三個方法),得到他們的消息內容,然后解析即可。

下面的例子將用 攔截JS的輸入框(即prompt()方法) 說明 :

1、常用的攔截是:攔截 JS的輸入框(即prompt()方法)
2、因為只有prompt()可以返回任意類型的值,操作最全面方便、更加靈活;而alert()對話框沒有返回值;confirm()對話框只能返回兩種狀態(確定 / 取消)兩個值;

步驟1:加載JS代碼,如下:

jscallandroid3.html

以.html格式放到src/main/assets文件夾里

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Java調用JS方法</title><!-- JS代碼 --><script><!-- Android需要調用的方法 -->function callJS(){var result = prompt("js://webview?arg1=111&arg2=222");alert("result : " + result);}</script></head><body><!-- 點擊按鈕則調用callAndroid函數 --><button type="button" id="button1" onclick="callJS()">JS調用Android方法</button></body></html>

當使用webview.loadUrl("file:///android_asset/jscallandroid3.html")加載了上述JS代碼后,就會觸發回調onJsPrompt(),具體如下:

1、如果是攔截警告框(即alert()),則觸發回調onJsAlert();
2、如果是攔截確認框(即confirm()),則觸發回調onJsConfirm();

步驟2:在Android通過WebChromeClient復寫onJsPrompt()

package com.davis.webviewjs.demo;import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.LinearLayout;public class JSCallAndroid3 extends AppCompatActivity {private Button btn;private WebView webview;private LinearLayout layout;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_webview);init();}private void init() {btn = (Button)findViewById(R.id.btn);btn.setVisibility(View.GONE);webview = (WebView)findViewById(R.id.webview);WebSettings webSettings = webview.getSettings();// 設置與Js交互的權限webSettings.setJavaScriptEnabled(true);// 設置允許JS彈窗webSettings.setJavaScriptCanOpenWindowsAutomatically(true);// 先載入JS代碼// 格式規定為:file:///android_asset/文件名.htmlwebview.loadUrl("file:///android_asset/jscallandroid3.html");webview.setWebChromeClient(new WebChromeClient(){@Overridepublic boolean onJsAlert(WebView view, String url, String message, JsResult result) {// 根據協議的參數,判斷是否是所需要的url(原理同方式2)// 一般根據scheme(協議格式) & authority(協議名)判斷(前兩個參數)//假定傳入進來的 url = "js://webview?arg1=111&arg2=222"(同時也是約定好的需要攔截的)Log.i("WEBVIEW_JS", "message : " + message);Uri uri = Uri.parse(message);// 如果url的協議 = 預先約定的 js 協議// 就解析往下解析參數if ( uri.getScheme().equals("js")) {// 如果 authority  = 預先約定協議里的 webview,即代表都符合約定的協議// 所以攔截url,下面JS開始調用Android需要的方法if (uri.getAuthority().equals("webview")) {//Log.i("WEBVIEW_JS", "js調用了Android的方法");// 攔截alert()之后必須調用result.confirm()方法,否則會出現白屏result.confirm();return true;}}return super.onJsAlert(view, url, message, result);}@Overridepublic boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {// 根據協議的參數,判斷是否是所需要的url(原理同方式2)// 一般根據scheme(協議格式) & authority(協議名)判斷(前兩個參數)//假定傳入進來的 url = "js://webview?arg1=111&arg2=222"(同時也是約定好的需要攔截的)Log.i("WEBVIEW_JS", "message : " + message);Uri uri = Uri.parse(message);// 如果url的協議 = 預先約定的 js 協議// 就解析往下解析參數if ( uri.getScheme().equals("js")) {// 如果 authority  = 預先約定協議里的 webview,即代表都符合約定的協議// 所以攔截url,下面JS開始調用Android需要的方法if (uri.getAuthority().equals("webview")) {//Log.i("WEBVIEW_JS", "js調用了Android的方法");// 攔截alert()之后必須調用result.confirm()方法,否則會出現白屏result.confirm("js調用了Android的方法");return true;}}return super.onJsPrompt(view, url, message, defaultValue, result);}@Overridepublic boolean onJsConfirm(WebView view, String url, String message, JsResult result) {return super.onJsConfirm(view, url, message, result);}});}@Overrideprotected void onDestroy() {if (webview != null) {webview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);webview.clearHistory();((ViewGroup) webview.getParent()).removeView(webview);webview.destroy();webview = null;}super.onDestroy();}
}

三種方式的對比 & 使用場景

調用方式優點缺點使用場景
通過addJavascriptInterface()進行添加對象映射方便簡潔Android 4.2以下存在漏洞問題Android 4.2以上相對簡單的互調場景
通過WebVeiw的方法shouldOverrideUrlLoading()回調攔截url不存在漏洞問題- 使用復雜:需要進行協議的約束;
- 從Native層往Web層傳遞值比較繁瑣
不需要返回值情況下的互調場景
通過WebChromeClient的onJsAlert()、onJsConfirm()、onJsPrompt()方法回調攔截JS對話框消息不存在漏洞問題使用復雜:需要進行協議的約束;能滿足大多數情況下的互調場景

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446794.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446794.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446794.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于鎖的注意事項

文件鎖 Linux 提供了 fcntl 系統調用&#xff0c;可以鎖定文件但是文件鎖是和進程相關聯的&#xff0c;一個進程中的多個線程/協程對同一個文件進行的鎖操作會互相覆蓋掉&#xff0c;從而無效。fcntl 創建的鎖是建議性鎖&#xff0c;只有寫入的進程和讀取的進程都遵循建議才有效…

安卓實現登錄與注冊界面

使用Intent與Bundle傳遞數據 登錄界面login.xml 1.使用Relativelayout相對布局 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"mat…

Android Button字母自動全部大寫的問題

兩種解決方案&#xff1a; 方法一&#xff1a; 在 xml 布局中設置屬性 android:textAllCaps"false" <Buttonandroid:layout_width"wrap_content"android:layout_height"match_parent"android:text"添加動作組"android:textAllCap…

安卓Activity與intent跳轉

Activity生命周期 Activity啟動模式 Intent跳轉 _________startActivity() 1.Intent intentnew Intent(A.this,B.class); startActivity(intent); 2.startActivity(new Intent(A.this,B.class)); _________startActivityForResult() Intent intentnew Intent(A.this,B.class…

將讀寫鎖放到共享內存中,實現進程之間對數據的讀寫訪問控制

代碼 #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <assert.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <fstream> #include <…

Android WebView 使用漏洞

目錄一、類型二、具體分析2.1、WebView任意代碼執行漏洞2.1.1、addJavascriptInterface 接口引起遠程代碼執行漏洞漏洞產生原因解決方案關于該方法的其他細節總結2.1.2、searchBoxJavaBridge_接口引起遠程代碼執行漏洞漏洞產生原因解決方案2.1.3、accessibility和 accessibilit…

將讀寫鎖放到共享內存,實現進程之間對于同一文件的讀寫操作

思路 將讀寫鎖和讀寫鎖的屬性以及一個用于存儲共享內存的地址的int型變量三者封裝成一個struct結構將這個結構體放到共享內存中&#xff0c;以及將讀寫鎖的屬性設置成全局性質&#xff0c;然后使用這個屬性初始化鎖&#xff0c;以及將鎖的地址關聯到結構體的內存地址這個變量定…

Android Studio 查看頁面布局層次結構

Android Studio有個可以查看手機上app頁面布局層次結構的工具。可以協助我們對布局進行優化&#xff0c;去掉沒有必要的節點等&#xff0c;通過這個工具可以清晰的看見頁面整個結構&#xff1b;廢話少說直接上圖&#xff0c;再說過程。 這就是我們想要看到的&#xff0c;每個節…

Java web后端 第一章框架搭建

Redis 通用Mapper 通用Mapper->MyBatis動態SQL封裝包,增刪改查 0 SQL語句 PageHelper PageHelper–>實現分頁操作,不需要limit,直接使用靜態方法 電商系統技術特點 分布式(數據很多,一臺電腦存儲一部分數據) 高并發,集群(并發量很高,后臺不只一個電腦) ,海量數據 主…

進程鎖 讀寫文件的小例子 C++代碼

代碼 #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <cassert> #include <pthread.h> #include <cstdio> #include <cstdlib> #include <fstream> #include <io…

Java 中sleep()與wait()的區別

目錄一、原理不同二、鎖的處理機制不同三、使用的區域不同四、異常捕獲不同五、總結一、原理不同 sleep()是Thread類的靜態方法&#xff0c;是線程用來控制自身流程的&#xff0c;它會使此線程暫停執行指定的時間&#xff0c;而把執行機會讓給其他的線程&#xff0c;等到計時時…

android--地圖定位打卡

獲取位置信息 1)位置信息 GPS衛星定位,在室外適用 基站(3個基站交叉,鎖定手機位置)–基站定位不平均,有些地方實現不了3點定位 網絡定位–通過手機IP地址,去鎖定位置(消耗流量,對網絡有要求) 谷歌地圖的大致實現思路(通用) 2)實現定位功能的重要類 在百度地圖和高德地圖中不…

Android 將整形顏色值轉換成String類型

轉換方法&#xff1a; val hexColor String.format("#%06X", [0xFFFFFF or intColor]);轉換結果&#xff1a; #F2EADA

MacOS 的 zsh 和 bash 切換

目錄一、從 bash 切換到 zsh1、使用系統自帶的 zsh2、使用第三方的 zsh2.1、Clone代碼到本地2.2、備份你已存在的 ~/.zshrc 文件2.3、新建一份新的 zsh 配置文件2.4、改變默認的shell腳本二、從 zsh 切換回 bash三、zsh 和 bash 的環境變量zsh、bash 都是shell&#xff0c;zsh …

android--在命令行中生成Android的數字證書keystore文件

標題 生成 密鑰口令為 13458977480 密鑰庫口令為 13458977480 存放位置 查看證書的相關資料

linux查看系統日志

cd /var/log/gscubuntu:/var/log$ tail -f syslog

IDEA 創建 SpringBoot 項目

目錄一、新建Springboot項目第一步&#xff1a;新建一個Springboot項目第二步&#xff1a;選擇項目模板第三步&#xff1a;設置項目配置第四步&#xff1a;設置項目依賴第五步&#xff1a;設置項目名稱及路徑第六步&#xff1a;創建完成二、測試及運行1、測試代碼2、設置默認端…

VC++軟件

一個main fatal error LNK1169: 找到一個或多個多重定義的符號–報錯 一個項目即一個程序&#xff0c;多個文件只能有一個main函數 刪除掉多余的main 控制臺按enter鍵閃退 在代碼中加上 #include<stdlib.h> getchar();//讓控制臺停留 system("pause");//讓…

IDEA 將 SpringBoot 項目打包成jar

目錄一、打包配置1、File -> Project Structure2、Project Structure3、設置啟動類及META-INF4、設置打包輸出目錄二、打包1、Build -> Artifacts2、Build三、查看打包文件四、運行新建SpringBoot項目&#xff1a;IDEA 創建 SpringBoot 項目 一、打包配置 1、File -> …