国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Heim WeChat-Applet WeChat-Entwicklung Java WeChat-Entwicklungs-API Beispielcode für die Implementierung eines benutzerdefinierten personalisierten Menüs von WeChat

Java WeChat-Entwicklungs-API Beispielcode für die Implementierung eines benutzerdefinierten personalisierten Menüs von WeChat

Mar 21, 2017 pm 03:46 PM
api java Wechat -Entwicklung

In diesem Artikel werden haupts?chlich der vierte Schritt der Java-WeChat-Entwicklungs-API, das benutzerdefinierte Menü und die Implementierung personalisierter Menüs ausführlich vorgestellt.

So implementieren Sie benutzerdefinierte Pers?nlichkeiten in WeChat. Das Folgende ist eine Einführung in die Menü

1. Globale Beschreibung
Detaillierte Anweisungen finden Sie in den ersten beiden Artikeln.

2. Beschreibung dieses Artikels
Dieser Artikel ist in fünf Teile unterteilt:
* Kapselung der Werkzeugklasse AccessTokenUtils
* Lesen und Analyse von benutzerdefinierten und personalisierten Menüs Menüdokumente
* Analyse von Menü-JSON und Konstruktion entsprechender Beans
* Implementierung benutzerdefinierter Menüs
* Implementierung personalisierter Menüs
Demonstrationen aller Arten von Menüs in WeChat benutzerdefinierten Menüs werden gegeben
Unter das Ende dieses Artikels Enth?lt alle Demo-Quellcodes der ersten vier Artikel in diesem Artikel

Die Kapselung der Tool-Klasse AccessTokenUtils
Der Erwerb und Das geplante Speichern von AccessToken wurde oben ausführlich vorgestellt. Die gekapselten AccessTokenUtils nach der Verarbeitung werden hier jedoch direkt angegeben, und das Implementierungsprinzip und das Lesen von Dokumenten werden nicht mehr angegeben.
AccessTokenUtils.java


package com.gist.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

import com.gist.bean.Access_token;
import com.google.gson.Gson;

/**
 * @author 高遠(yuǎn)</n> 郵箱:wgyscsf@163.com</n> 博客 http://blog.csdn.net/wgyscsf</n>
 *   編寫時(shí)期 2016-4-7 下午5:44:33
 */
public class AccessTokenUtils {
 private static final long MAX_TIME = 7200 * 1000;// 微信允許最長Access_token有效時(shí)間(ms)
 private static final String TAG = "WeixinApiTest";// TAG
 private static final String APPID = "wx889b020b3666b0b8";// APPID
 private static final String SECERT = "6da7676bf394f0a9f15fbf06027856bb";// 秘鑰

 /*
  * 該方法實(shí)現(xiàn)獲取Access_token、保存并且只保存2小時(shí)Access_token。如果超過兩個(gè)小時(shí)重新獲取;如果沒有超過兩個(gè)小時(shí),直接獲取。該方法依賴
  * :public static String getAccessToken();
  * 
  * 思路:將獲取到的Access_token和當(dāng)前時(shí)間存儲(chǔ)到file里,
  * 取出時(shí)判斷當(dāng)前時(shí)間和存儲(chǔ)里面的記錄的時(shí)間的時(shí)間差,如果大于MAX_TIME,重新獲取,并且將獲取到的存儲(chǔ)到file替換原來的內(nèi)容
  * ,如果小于MAX_TIME,直接獲取。
  */
 // 為了調(diào)用不拋異常,這里全部捕捉異常,代碼有點(diǎn)長
 public static String getSavedAccess_token() {
  Gson gson = new Gson();// 第三方j(luò)ar,處理json和bean的轉(zhuǎn)換
  String mAccess_token = null;// 需要獲取的Access_token;
  FileOutputStream fos = null;// 輸出流
  FileInputStream fis = null;// 輸入流
  File file = new File("temp_access_token.temp");// Access_token保存的位置
  try {
   // 如果文件不存在,創(chuàng)建
   if (!file.exists()) {
    file.createNewFile();
   }
  } catch (Exception e1) {
   e1.printStackTrace();
  }
  // 如果文件大小等于0,說明第一次使用,存入Access_token
  if (file.length() == 0) {
   try {
    mAccess_token = getAccessToken();// 獲取AccessToken
    Access_token at = new Access_token();
    at.setAccess_token(mAccess_token);
    at.setExpires_in(System.currentTimeMillis() + "");// 設(shè)置存入時(shí)間
    String json = gson.toJson(at);
    fos = new FileOutputStream(file, false);// 不允許追加
    fos.write((json).getBytes());// 將AccessToken和當(dāng)前時(shí)間存入文件
    fos.close();
    return mAccess_token;
   } catch (Exception e) {
    e.printStackTrace();
   }
  } else {
   // 讀取文件內(nèi)容
   byte[] b = new byte[2048];
   int len = 0;
   try {
    fis = new FileInputStream(file);
    len = fis.read(b);
   } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
   }
   String mJsonAccess_token = new String(b, 0, len);// 讀取到的文件內(nèi)容
   Access_token access_token = gson.fromJson(mJsonAccess_token,
     new Access_token().getClass());
   if (access_token.getExpires_in() != null) {
    long saveTime = Long.parseLong(access_token.getExpires_in());
    long nowTime = System.currentTimeMillis();
    long remianTime = nowTime - saveTime;
    // System.out.println(TAG + "時(shí)間差:" + remianTime + "ms");
    if (remianTime < MAX_TIME) {
     Access_token at = gson.fromJson(mJsonAccess_token,
       new Access_token().getClass());
     mAccess_token = at.getAccess_token();
     return mAccess_token;
    } else {
     mAccess_token = getAccessToken();
     Access_token at = new Access_token();
     at.setAccess_token(mAccess_token);
     at.setExpires_in(System.currentTimeMillis() + "");
     String json = gson.toJson(at);
     try {
      fos = new FileOutputStream(file, false);// 不允許追加
      fos.write((json).getBytes());
      fos.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
     return mAccess_token;
    }

   } else {
    return null;
   }
  }

  return mAccess_token;
 }

 /*
  * 獲取微信服務(wù)器AccessToken。該部分和getAccess_token() 一致,不再加注釋
  */
 public static String getAccessToken() {
  String urlString = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
    + APPID + "&secret=" + SECERT;
  String reslut = null;
  try {
   URL reqURL = new URL(urlString);
   HttpsURLConnection httpsConn = (HttpsURLConnection) reqURL
     .openConnection();
   InputStreamReader isr = new InputStreamReader(
     httpsConn.getInputStream());
   char[] chars = new char[1024];
   reslut = "";
   int len;
   while ((len = isr.read(chars)) != -1) {
    reslut += new String(chars, 0, len);
   }
   isr.close();
  } catch (IOException e) {

   e.printStackTrace();
  }
  Gson gson = new Gson();
  Access_token access_token = gson.fromJson(reslut,
    new Access_token().getClass());
  if (access_token.getAccess_token() != null) {
   return access_token.getAccess_token();
  } else {
   return null;
  }
 }
}

Lesen und Parsen von benutzerdefinierten Menüs und personalisierten Menüdokumenten
? Benutzerdefiniertes Menü
? Benutzerdefinierte Menüerstellungsoberfl?che
? Benutzerdefinierte Menüabfrageoberfl?che
? Benutzerdefinierte Menül?schoberfl?che
? Benutzerdefinierter Menüereignis-Push
? Personalisierte Menüoberfl?che
? Holen Sie sich die Menükonfiguration von das ?ffentliche Konto

?Dokumentadresse: http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html
?Offizielles Website-Dokument zu Hier ist die Erkl?rung :
* Die benutzerdefinierte Menüoberfl?che kann mehrere Arten von Schaltfl?chen implementieren, wie folgt: 1. Klicken: Klicken Sie auf Ereignis...; 2. Ansicht: Sprungereignis...; 3.... (über das benutzerdefinierte Definitionsmenü)
* Beschreibung der Schnittstellenaufrufanforderung http-Anfragemethode: POST (bitte verwenden Sie das https-Protokoll) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN(über benutzerdefiniertes Menü)
* Klicken Sie und sehen Sie sich das Anfragebeispiel an {"button":[...]} (über benutzerdefiniertes Menü)
* Parameterbeschreibung...(über benutzerdefiniertes Menü)
* Erstellen Sie ein personalisiertes Menü http Anfragemethode: POST (bitte verwenden Sie das https-Protokoll) https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=ACCESS_TOKEN(über die Pers?nlichkeit des personalisierten Menüs)
* Anfrage Beispiel: {"button":[...],"matchrule":{...}}(über das personalisierte Menü)
* Parameterbeschreibung...(über das Personalisierungsmenü)
* Entwickler k?nnen festlegen Menü, das Benutzer sehen (über personalisierte Menüs), durch die folgenden Bedingungen:
1. Benutzergruppierung (die Gesch?ftsanforderungen des Entwicklers k?nnen mit Hilfe der Benutzergruppierung erfüllt werden)
2 , Geschlecht
3. Mobiles Betriebssystem
4. Region (die vom Benutzer auf dem WeChat-Client festgelegte Region)
5. Sprache (die vom Benutzer auf dem WeChat-Client festgelegte Sprache)

?Verstehen:
? Es ist Wieder eine bekannte POST-Anfrage, aber der Anruf scheint vage zu sein, sodass ich ihn nicht ganz verstehe. Wir wissen nur, dass wir den Parameter ??access_token=ACCESS_TOKEN“ verwenden müssen, den wir bereits im vorherigen Artikel erhalten haben. Wenn wir das ?ACCESS_TOKEN“ in der im WeChat-Dokument angegebenen Anforderungsadresse durch unser eigenes ACCESS_TOKEN ersetzen, das wir erhalten haben, und die URL besuchen, sehen wir ?{“errcode“:44002,“errmsg“: ?leerer Beitragsdatenhinweis: [ Gdveda0984vr23]“}“. Es handelt sich wahrscheinlich um leere Post-Request-Daten. Daher müssen wir die Parameter in Form einer POST-Anfrage an den WeChat-Server übergeben. Das Parameterformat ist auch unter dem Dokument angegeben: {"button":[...]}, also müssen wir die Parameter an übergeben den WeChat-Server gem?? diesem Format.
? In Bezug auf die Parameterbeschreibung k?nnen wir sehen, dass es bei der benutzerdefinierten Menüerstellung sieben Parameter gibt. Zus?tzlich zu diesen sieben Parametern gibt es in der personalisierten Menüoberfl?che acht weitere Parameter. Wenn wir uns nur diesen Teil des Dokuments ansehen, k?nnen wir verstehen, dass diese acht Parameter für den Abgleich und die überprüfung personalisierter Menüs verwendet werden.
?Jetzt müssen wir JSON gem?? den Anforderungen von WeChat-Dokumenten erstellen und diese Zeichenfolge von JSON-Daten über Post-Anfragen an den WeChat-Server senden. Das JSON enth?lt verschiedene Arten von Schaltfl?chenereignissen, die wir erstellt haben.

Menü-JSON-Analyse und Erstellung entsprechender Beans
Benutzerdefinierte Menü-JSON-Analyse (ausgenommen personalisierte Menüs). Der folgende Code ist ein Beispiel aus der WeChat-Dokumentation.
Klicken Sie und sehen Sie sich Anfragebeispiele an


 {
  "button":[
  { 
   "type":"click",
   "name":"今日歌曲",
   "key":"V1001_TODAY_MUSIC"
  },
  {
   "name":"菜單",
   "sub_button":[
   { 
    "type":"view",
    "name":"搜索",
    "url":"http://www.soso.com/"
   },
   {
    "type":"view",
    "name":"視頻",
    "url":"http://v.qq.com/"
   },
   {
    "type":"click",
    "name":"贊一下我們",
    "key":"V1001_GOOD"
   }]
  }]
 }

經(jīng)過分析我們可以看到這串json數(shù)據(jù)分為三層:“”button”:[{…},{…}]”、“[{…},{{“name”:菜單,”sub_button”:[{},{}]}]”、“{“type”:”view”,”name:”:”視頻”,”url”:”…”},{},{}”,可能看起來比較暈。
但是,如果我們能夠聯(lián)想起來現(xiàn)實(shí)中看到的微信菜單,就會(huì)好理解一點(diǎn):一級(jí):菜單(一個(gè)菜單),下包括一到三個(gè)父按鈕;二級(jí):父按鈕(1~3個(gè)父按鈕),下包括一到五個(gè)子按鈕;三級(jí):子按鈕(1~5個(gè)子按鈕)。
現(xiàn)在,我們可以看到j(luò)son和我們理解的“菜單”可以一一對(duì)應(yīng)起來了?,F(xiàn)在重點(diǎn)是如何確認(rèn)每一級(jí)的“級(jí)名”,在java中也就是對(duì)應(yīng)的javabean對(duì)象。
同時(shí),因?yàn)橐患?jí)菜單下會(huì)有多個(gè)父按鈕,所以是一個(gè)List<父菜單>的形式。父按鈕下可能有多個(gè)子菜單,也是一個(gè) List<子菜單>;但是,父按鈕也有可能也是一個(gè)單獨(dú)的可以響應(yīng)的按鈕。是一個(gè)單獨(dú)的父按鈕對(duì)象。子按鈕就是一個(gè)單獨(dú)的子按鈕對(duì)象。
查看關(guān)于自定義菜單的參數(shù)說明,我們可以看到按鈕分為一級(jí)按鈕(“button”)和二級(jí)按鈕(“sub_button”)。還有一些公用的數(shù)據(jù)類型,例如:菜單響應(yīng)類型(“type”)、菜單標(biāo)題(“name”)、click類型的參數(shù)(“key”)、view類型的參數(shù)(“url”)、media_id類型和view_limited類型的參數(shù)(“media_id”)。
?數(shù)據(jù)抽象(沒有寫setter,getter):


//按鈕基類
public class BaseButton {
 private String type;
 private String name;
 private String key;
 private String url;
 private String media_id;
} 
//子按鈕
public class SonButton extends BaseButton {
 private String sub_button;
}
//父按鈕
public class FatherButton extends BaseButton {
private String button;//可能直接一個(gè)父按鈕做響應(yīng)
@SerializedName("sub_button")//為了保證Gson解析后子按鈕的名字是“sub_button”,具體用法請(qǐng)搜索
private List<SonButton> sonButtons;//可能有多個(gè)子按鈕
}

public class Menu {
@SerializedName("button")
private List<FatherButton> fatherButtons;
}

以上是完整的自定義菜單的分析以及對(duì)應(yīng)javabean的構(gòu)建。

對(duì)于個(gè)性化菜單,如果查看該部分的文檔,會(huì)發(fā)現(xiàn)和自定義菜單大致相同,只是多個(gè)一個(gè)“配置”的json,格式是這樣的:{“button”:[…],”matchrule”:{…}}。
我們發(fā)現(xiàn),“匹配”這段json和“button”是同級(jí)的,分析和實(shí)現(xiàn)和上面基本等同,直接給出實(shí)現(xiàn)的javabean。


//匹配的json對(duì)應(yīng)的json
public class MatchRule {
private String group_id;
private String sex;
private String client_platform_type;
private String country;
private String province;
private String city;
private String language;
}

//修改Menu.java
public class Menu {
@SerializedName("button")
private List<FatherButton> fatherButtons;
private MatchRule matchrule;
}

自定義菜單的實(shí)現(xiàn)
任務(wù),我們實(shí)現(xiàn)所有微信按鈕響應(yīng)類型:
任務(wù)(注釋:“m-0”表示父按鈕;“m-n”表示第m個(gè)父按鈕,第n個(gè)子按鈕(m,n≠0)):1-0:名字:click,響應(yīng)點(diǎn)擊事件:點(diǎn)擊推事件 。2-0:名字:父按鈕2。2-1:名字:view,響應(yīng)事件:跳轉(zhuǎn)網(wǎng)頁;2-2:名字:scancode_push,響應(yīng)事件:掃碼推事件;2-3:名字:scancode_waitmsg,響應(yīng)事件:掃碼推事件且彈出“消息接收中”提示框;2-4:名字:pic_sysphoto,響應(yīng)事件
:彈出系統(tǒng)拍照發(fā)圖。2-5:名字:pic_photo_or_album,響應(yīng)事件:彈出拍照或者相冊(cè)發(fā)圖。3-0:名字:父按鈕3。3-1:名字
:pic_weixin,響應(yīng)事件:彈出微信相冊(cè)發(fā)圖器;3-2:名字:location_select,響應(yīng)事件:彈出地理位置選擇器;3-3:名字:media_id,響應(yīng)事件:下發(fā)消息(除文本消息);3-4:名字:view_limited,響應(yīng)事件:跳轉(zhuǎn)圖文消息url。

實(shí)現(xiàn)源碼(引用的AccessTokenUtils.java在第一部分:工具類AccessTokenUtils的封裝)


 /*
  * 創(chuàng)建自定義菜單。
  */
 @Test
 public void createCommMenu() {
  String ACCESS_TOKEN = AccessTokenUtils.getAccessToken();// 獲取AccessToken,AccessTokenUtils是封裝好的類
  // 拼接api要求的httpsurl鏈接
  String urlString = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token="
    + ACCESS_TOKEN;
  try {
   // 創(chuàng)建一個(gè)url
   URL reqURL = new URL(urlString);
   // 拿取鏈接
   HttpsURLConnection httpsConn = (HttpsURLConnection) reqURL
     .openConnection();
   httpsConn.setDoOutput(true);
   // 取得該連接的輸出流,以讀取響應(yīng)內(nèi)容
   OutputStreamWriter osr = new OutputStreamWriter(
     httpsConn.getOutputStream());
   osr.write(getMenuJson());// 使用本類外部方法getMenuJson()
   osr.close();

   // 返回結(jié)果
   InputStreamReader isr = new InputStreamReader(
     httpsConn.getInputStream());
   // 讀取服務(wù)器的響應(yīng)內(nèi)容并顯示
   char[] chars = new char[1024];
   String reslut = "";
   int len;
   while ((len = isr.read(chars)) != -1) {
    reslut += new String(chars, 0, len);
   }
   System.out.println("返回結(jié)果:" + reslut);
   isr.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 public String getMenuJson() {
  Gson gson = new Gson();// json處理工具

  Menu menu = new Menu();// 菜單類
  List<FatherButton> fatherButtons = new ArrayList<FatherButton>();// 菜單中的父按鈕集合
  // -----------
  // 父按鈕1
  FatherButton fb1 = new FatherButton();
  fb1.setName("click");
  fb1.setType("click");
  fb1.setKey("10");
  // -------------
  // 父按鈕2
  FatherButton fb2 = new FatherButton();
  fb2.setName("父按鈕2");
  List<SonButton> sonButtons2 = new ArrayList<SonButton>();// 子按鈕的集合

  // 子按鈕2-1
  SonButton sb21 = new SonButton();
  sb21.setName("view");
  sb21.setUrl("http://www.baidu.com");
  sb21.setType("view");
  // 子按鈕2-2
  SonButton sb22 = new SonButton();
  sb22.setName("scancode_push");
  sb22.setType("scancode_push");
  sb22.setKey("22");
  // 子按鈕2-3
  SonButton sb23 = new SonButton();
  sb23.setName("scancode_waitmsg");
  sb23.setType("scancode_waitmsg");
  sb23.setKey("23");
  // 子按鈕2-4
  SonButton sb24 = new SonButton();
  sb24.setName("pic_sysphoto");
  sb24.setType("pic_sysphoto");
  sb24.setKey("24");
  // 子按鈕2-5
  SonButton sb25 = new SonButton();
  sb25.setName("pic_photo_or_album");
  sb25.setType("pic_photo_or_album");
  sb25.setKey("25");

  // 添加子按鈕到子按鈕集合
  sonButtons2.add(sb21);
  sonButtons2.add(sb22);
  sonButtons2.add(sb23);
  sonButtons2.add(sb24);
  sonButtons2.add(sb25);

  // 將子按鈕放到2-0父按鈕集合
  fb2.setSonButtons(sonButtons2);

  // ------------------
  // 父按鈕3
  FatherButton fb3 = new FatherButton();
  fb3.setName("父按鈕3");
  List<SonButton> sonButtons3 = new ArrayList<SonButton>();

  // 子按鈕3-1
  SonButton sb31 = new SonButton();
  sb31.setName("pic_weixin");
  sb31.setType("pic_weixin");
  sb31.setKey("31");
  // 子按鈕3-2
  SonButton sb32 = new SonButton();
  sb32.setName("locatselect");
  sb32.setType("location_select");
  sb32.setKey("32");
  // // 子按鈕3-3-->測(cè)試不了,因?yàn)橐猰edia_id。這需要調(diào)用素材id.
  // SonButton sb33 = new SonButton();
  // sb33.setName("media_id");
  // sb33.setType("media_id");
  // sb33.setMedia_id("???");
  // // 子按鈕3-4-->測(cè)試不了,因?yàn)橐猰edia_id。這需要調(diào)用素材id.
  // SonButton sb34 = new SonButton();
  // sb34.setName("view_limited");
  // sb34.setType("view_limited");
  // sb34.setMedia_id("???");

  // 添加子按鈕到子按鈕隊(duì)列
  sonButtons3.add(sb31);
  sonButtons3.add(sb32);
  // sonButtons3.add(sb33);
  // sonButtons3.add(sb34);

  // 將子按鈕放到3-0父按鈕隊(duì)列
  fb3.setSonButtons(sonButtons3);
  // ---------------------

  // 將父按鈕加入到父按鈕集合
  fatherButtons.add(fb1);
  fatherButtons.add(fb2);
  fatherButtons.add(fb3);

  // 將父按鈕隊(duì)列加入到菜單欄
  menu.setFatherButtons(fatherButtons);
  String json = gson.toJson(menu);
  System.out.println(json);// 測(cè)試輸出
  return json;

 }

個(gè)性化菜單的實(shí)現(xiàn)
?任務(wù):根據(jù)性別展示不同的按鈕顯示(可以根據(jù)性別、地區(qū)、分組手機(jī)操作系統(tǒng)等)
?修改代碼一,因?yàn)槭遣煌奈⑿藕笈_(tái)實(shí)現(xiàn),所以接口也不一樣,不過還是POST請(qǐng)求,代碼不用改,只要替換原來urlString即可。


// 拼接api要求的httpsurl鏈接
String urlString = "https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token="
   + ACCESS_TOKEN;

?修改代碼二,只要?jiǎng)?chuàng)建一個(gè)MatchRule,設(shè)置匹配規(guī)則,然后將matchrule加入到menu便可以完成匹配規(guī)則。


// -----
// 從此處開始設(shè)置個(gè)性菜單
MatchRule matchrule = new MatchRule();
matchrule.setSex("2");// 男生
menu.setMatchrule(matchrule);
// ----

Das obige ist der detaillierte Inhalt vonJava WeChat-Entwicklungs-API Beispielcode für die Implementierung eines benutzerdefinierten personalisierten Menüs von WeChat. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erkl?rung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Hei?e KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?e Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen

PHP-Tutorial
1502
276
Wie gehe ich mit Transaktionen in Java mit JDBC um? Wie gehe ich mit Transaktionen in Java mit JDBC um? Aug 02, 2025 pm 12:29 PM

Um JDBC -Transaktionen korrekt zu verarbeiten, müssen Sie zun?chst den automatischen Komiti -Modus ausschalten und dann mehrere Vorg?nge ausführen und schlie?lich entsprechend den Ergebnissen festlegen oder rollen. 1. Nennen Sie Conn.SetAutoCommit (False), um die Transaktion zu starten. 2. Führen Sie mehrere SQL -Operationen aus, z. B. einfügen und aktualisieren. 3. Rufen Sie Conn.Commit () an, wenn alle Vorg?nge erfolgreich sind, und rufen Sie Conn.Rollback () auf, wenn eine Ausnahme auftritt, um die Datenkonsistenz zu gew?hrleisten. Gleichzeitig sollten Try-with-Ressourcen verwendet werden, um Ressourcen zu verwalten, Ausnahmen ordnungsgem?? zu behandeln und Verbindungen zu schlie?en, um Verbindungsleckage zu vermeiden. Darüber hinaus wird empfohlen, Verbindungspools zu verwenden und Save -Punkte zu setzen, um teilweise Rollback zu erreichen und Transaktionen so kurz wie m?glich zu halten, um die Leistung zu verbessern.

Vergleich von Java Frameworks: Spring Boot vs Quarkus gegen Micronaut Vergleich von Java Frameworks: Spring Boot vs Quarkus gegen Micronaut Aug 04, 2025 pm 12:48 PM

Pre-Formancetartuptimemoryusage, QuarkusandmicronautleadduToCompile-Time-foringandgraalvSupport, WithQuarkusofttenperformLightBetterin serverloser Szenarien.2. Thyvelopecosystem,

H5 Zahlungshandler -API für benutzerdefinierte Zahlungsstr?me H5 Zahlungshandler -API für benutzerdefinierte Zahlungsstr?me Aug 02, 2025 pm 01:37 PM

PaymentHandlerapi ist Teil des Webpayments -Standards als Erweiterung von PaymentRequestAPI, und es besteht die Kernaufgabe darin, Entwicklern zu erm?glichen, einen "Zahlungsverarbeitungsverarbeiter" für die Implementierung von benutzerdefinierten Zahlungsprozessen zu registrieren. Es registriert Zahlungsmethoden über den Servicearbeiter und kombiniert die Beantragung der Zahlungsanmeldung im Rahmen des. Well Bekannten Verzeichnis, um Zahlungsverarbeitungsinformationen zu deklarieren. Bei Verwendung wird die Zahlungsanforderung über die PaymentRequest -Schnittstelle eingeleitet, der registrierte Zahlungsabwickler wird aufgerufen und die vollst?ndige () -Methode wird aufgerufen, nachdem die Zahlung abgeschlossen ist. Zu den gemeinsamen Vorsichtsma?nahmen geh?ren: 1. HTTPS -Bereitstellung; 2. Konfigurieren Sie den Dienst ordnungsgem??

Gehen Sie zum Beispiel für HTTP Middleware -Protokollierung Gehen Sie zum Beispiel für HTTP Middleware -Protokollierung Aug 03, 2025 am 11:35 AM

HTTP-Protokoll Middleware in Go kann Anforderungsmethoden, Pfade, Client-IP und zeitaufw?ndiges Aufzeichnen aufzeichnen. 1. Verwenden Sie http.Handlerfunc, um den Prozessor zu wickeln, 2. Nehmen Sie die Startzeit und die Endzeit vor und nach dem Aufrufen als n?chstes auf. Der vollst?ndige Beispielcode wurde überprüft, um auszuführen und eignet sich zum Starten eines kleinen und mittelgro?en Projekts. Zu den Erweiterungsvorschl?gen geh?ren das Erfassen von Statuscodes, die Unterstützung von JSON -Protokollen und die Nachverfolgung von ID -IDs.

Wie funktioniert die Müllsammlung in Java? Wie funktioniert die Müllsammlung in Java? Aug 02, 2025 pm 01:55 PM

Die Müllsammlung von Java (GC) ist ein Mechanismus, der automatisch den Speicher verwaltet, der das Risiko eines Speicherlecks verringert, indem unerreichbare Objekte zurückgeführt werden. 1.GC beurteilt die Zug?nglichkeit des Objekts aus dem Stammobjekt (z. B. Stapelvariablen, aktive Threads, statische Felder usw.) und nicht erreichbare Objekte als Müll markiert. 2. Basierend auf dem markierten Algorithmus markieren Sie alle erreichbaren Objekte und l?schen Sie nicht markierte Objekte. 3.. Verfolgen Sie eine Generationskollektionsstrategie: Die neue Generation (Eden, S0, S1) führt h?ufig MollGC aus; Die ?lteren Menschen erzielen weniger, dauert jedoch l?nger, um MajorGC durchzuführen. MetaPace speichert Klassenmetadaten. 4. JVM bietet eine Vielzahl von GC -Ger?ten: SerialGC ist für kleine Anwendungen geeignet; ParallelgC verbessert den Durchsatz; CMS reduziert sich

Verwenden von HTML `Input` -Typen für Benutzerdaten Verwenden von HTML `Input` -Typen für Benutzerdaten Aug 03, 2025 am 11:07 AM

Durch die Auswahl des richtigen HTMlinput -Typs kann die Datengenauigkeit verbessert, die Benutzererfahrung verbessert und die Benutzerfreundlichkeit verbessert werden. 1. W?hlen Sie die entsprechenden Eingabetypen gem?? dem Datentyp aus, z. B. Text, E -Mail, Tel, Nummer und Datum, die automatisch überprüft und an die Tastatur anpassen k?nnen. 2. Verwenden Sie HTML5, um neue Typen wie URL, Farbe, Reichweite und Suche hinzuzufügen, die eine intuitivere Interaktionsmethode bieten k?nnen. 3.. Verwenden Sie Platzhalter und erforderliche Attribute, um die Effizienz und Genauigkeit der Formulierung zu verbessern. Es sollte jedoch beachtet werden, dass der Platzhalter das Etikett nicht ersetzen kann.

Vergleich von Java -Build -Werkzeugen: Maven vs. Gradle Vergleich von Java -Build -Werkzeugen: Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

GradleStheBetterChoiceFormostnewProjectsDuetoitSuperiorFlexibilit?t, Leistung und ModerntoolingSupport.1.GRADLE'SGROOVY/KOTLINDSLISMORECONCISEANDEIPRESSIVETHANMANMANBOSEXML.2.GRAGRECONCISEANDEPRPRESSIVETHANMAVENSVOSEXML.2.

Gehen Sie mit einer Beispielverschiebung erkl?rt Gehen Sie mit einer Beispielverschiebung erkl?rt Aug 02, 2025 am 06:26 AM

Auf Defer wird verwendet, um bestimmte Vorg?nge auszuführen, bevor die Funktion zurückgibt, z. B. die Reinigungsressourcen. Die Parameter werden sofort bewertet, wenn sie aufgeschoben werden, und die Funktionen werden in der Reihenfolge von Last-In-First-Out (LIFO) ausgeführt. 1. Mehrere Defers werden in umgekehrter Reihenfolge der Erkl?rungen ausgeführt. 2. h?ufig für die sichere Reinigung wie das Schlie?en von Dateien verwendet; 3. Der benannte Rückgabewert kann ge?ndert werden; V. 5. Vermeiden Sie den Missbrauch von Verschiebungen in Schleifen, um Ressourcenleckage zu verhindern. Die korrekte Verwendung kann die Sicherheit und die Lesbarkeit der Code verbessern.

See all articles