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

ホームページ WeChat アプレット WeChatの開発 Java WeChat開発API WeChatカスタムパーソナライズメニュー実裝サンプルコード

Java WeChat開発API WeChatカスタムパーソナライズメニュー実裝サンプルコード

Mar 21, 2017 pm 03:46 PM
api java WeChatの開発

この記事では、主に Java WeChat API 開発の第 4 ステップ、カスタム メニューとパーソナライズされたメニューの実裝について詳しく紹介します。興味のある方は、

WeChat でカスタマイズされたパーソナライズ メニューを?qū)g裝する方法を參照してください。以下はすべての人向けです。全體的な説明

詳しい説明については、最初の 2 つの記事を參照してください。
2. この記事の説明

この記事は 5 つの部分に分かれています: * ツール クラス AccessTokenUtils のカプセル化 * カスタム メニューとパーソナライズされたメニュー ドキュメントの読み取りと解析
* メニュー JSON の分析と対応する Bean の構(gòu)築
* カスタム メニューの実裝
* パーソナライズされたメニューの実裝
WeChat カスタム メニュー すべてのタイプのメニューがデモされます
この記事の最後に、この記事の最初の 4 つの記事を含むすべてのデモ ソース コードが提供されます


ツール クラス AccessTokenUtils のカプセル化

AccessToken の取得とスケジュールされた保存については、上で詳しく説明しました。処理後のカプセル化された AccessTokenUtils については、ここでの実裝原理とドキュメントの読み取りについては説明しません。
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;// 微信允許最長(zhǎng)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)長(zhǎng)
 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;
  }
 }
}


カスタムメニューとパーソナライズされたメニュードキュメントの読み取りと分析

?カスタムメニュー
?カスタムメニュー作成インターフェイス
?カスタムメニュークエリインターフェイス
?カスタムメニュー削除インターフェイス
?カスタムメニューイベントプッシュ
? パーソナライズされたメニューインターフェイス
? パブリックアカウントのメニュー構(gòu)成を取得する

? ドキュメントアドレス:
http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html

? 公式 Web サイトのドキュメント* カスタム メニュー インターフェイスでは、次のような複數(shù)の種類のボタンを?qū)g裝できます。 1. click: クリック イベント...; 2. view: ジャンプ イベント...; (カスタム メニューについて)
* インターフェース呼び出しリクエストの説明 http リクエストメソッド: POST (https プロトコルを使用してください)
https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
(自己定義メニューについて)
*クリックしてリクエスト例を表示 {"button":[...]} (カスタムメニューについて)* パラメーターの説明...(カスタムメニューについて)* パーソナライズメニューの作成 http リクエストメソッド:POST (https プロトコルを使用してください)
https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=ACCESS_TOKEN(
パーソナライズメニューについて)
* リクエスト例: {"button":[ ...],"matchrule":{ ...}}(パーソナライズメニューについて)* パラメータの説明...(パーソナライズメニューについて)* 開発者は、次の條件を通じてユーザーに表示されるメニューを設(shè)定できます(パーソナライズメニューについて):
1. ユーザーのグループ化(開発者のビジネス ニーズはユーザーのグループ化を利用して完了できます) 2. 性別
3. モバイル オペレーティング システム 4. 地域 (WeChat クライアントでユーザーが設(shè)定した地域) 5、言語 (WeChat クライアントでユーザーが設(shè)定した言語) )

?理解:
? これもおなじみの POST リクエストですが、呼び出しが曖昧なようでよくわかりません。 「?access_token=ACCESS_TOKEN」パラメータを使用する必要があることだけがわかります。これは前の記事ですでに取得しています。 WeChat ドキュメントで指定されたリクエスト アドレスの「ACCESS_TOKEN」を、取得した獨(dú)自の ACCESS_TOKEN に置き換えて URL にアクセスすると、「{"errcode":44002,"errmsg":"empty post data ヒント: [ Gdveda0984vr23]”}”。おそらく、空のポストリクエストデータを意味します。したがって、パラメータを POST リクエストの形式で WeChat サーバーに渡す必要があります。パラメータの形式もドキュメントの下に示されています: {"button":[...]}。この形式に従って WeChat サーバーを作成します。
? パラメータの説明に関しては、カスタムメニューの作成には 7 つのパラメータがあることがわかります。パーソナライズされたメニュー インターフェイスには、これら 7 つのパラメータに加えて、さらに 8 つのパラメータがあります。文書のこの部分を見るだけで、これら 8 つのパラメータがパーソナライズされたメニューのマッチングとスクリーニングに使用されることがわかります。
次に、WeChat ドキュメントの要件に従って json を構(gòu)築し、投稿リクエストを通じてこの json データの文字列を WeChat サーバーに送信する必要があります。json には、作成したさまざまな種類のボタン イベントが含まれています。


メニュー JSON 分析と対応する Bean の構(gòu)築

カスタム メニュー JSON 分析 (パーソナライズされたメニューを除く)。次のコードは、WeChat ドキュメントに記載されている例です。

クリックしてリクエストの例を表示します

 {
  "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);
// ----

以上がJava WeChat開発API WeChatカスタムパーソナライズメニュー実裝サンプルコードの詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JDBCを使用してJavaのトランザクションを処理する方法は? JDBCを使用してJavaのトランザクションを処理する方法は? Aug 02, 2025 pm 12:29 PM

JDBCトランザクションを正しく処理するには、最初に自動(dòng)コミットモードをオフにし、次に複數(shù)の操作を?qū)g行し、結(jié)果に応じて最終的にコミットまたはロールバックする必要があります。 1。CONN.SETAUTOCOMMIT(FALSE)を呼び出して、トランザクションを開始します。 2。挿入や更新など、複數(shù)のSQL操作を?qū)g行します。 3。すべての操作が成功した場(chǎng)合はconn.commit()を呼び出し、データの一貫性を確保するために例外が発生した場(chǎng)合はconn.rollback()を呼び出します。同時(shí)に、リソースを使用してリソースを管理し、例外を適切に処理し、接続を密接に接続するために、接続の漏れを避けるために使用する必要があります。さらに、接続プールを使用してセーブポイントを設(shè)定して部分的なロールバックを達(dá)成し、パフォーマンスを改善するためにトランザクションを可能な限り短く保つことをお?jiǎng)幛幛筏蓼埂?/p>

Javaでカレンダーを操作する方法は? Javaでカレンダーを操作する方法は? Aug 02, 2025 am 02:38 AM

Java.Timeパッケージのクラスを使用して、古い日付とカレンダーのクラスを置き換えます。 2。LocalDate、LocalDateTime、LocalTimeを通じて現(xiàn)在の日付と時(shí)刻を取得します。 3。of()メソッドを使用して特定の日付と時(shí)刻を作成します。 4.プラス/マイナスメソッドを使用して、時(shí)間を不正に増加させて短縮します。 5. ZonedDateTimeとZoneIDを使用して、タイムゾーンを処理します。 6。DateTimeFormatterを介したフォーマットおよび解析の文字列。 7.インスタントを使用して、必要に応じて古い日付型と互換性があります。現(xiàn)代のJavaでの日付処理は、java.timeapiを使用することを優(yōu)先する必要があります。

H5支払いハンドラーAPIカスタム支払いフロー H5支払いハンドラーAPIカスタム支払いフロー Aug 02, 2025 pm 01:37 PM

PaymentHandlerapiは、Requestapiの延長(zhǎng)としてWebPayments Standardの一部であり、その中心的な役割は、開発者が「支払いプロセッサ」を登録してカスタム支払いプロセスを?qū)g裝できるようにすることです。サービスワーカーを介して支払い方法を登録し、支払いアプリケーションマニフェストファイルを.well-knownディレクトリの下に組み合わせて、支払いプロセッサ情報(bào)を宣言します。使用すると、支払い要求はPaymentRequestインターフェイスを介して開始され、登録された支払いプロセッサが呼び出され、支払いが完了した後に完全な()メソッドが呼び出されます。一般的な予防措置には以下が含まれます。1。HTTPS展開を確認(rèn)します。 2。サービスを適切に構(gòu)成します

Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Javaフレームワークの比較:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

Pre-formanceTartuptimeMemoryusage、quarkusandmicronautleadduetocopile-timeprocessingingandgraalvsupport、withquarkusoftentylightbetterine serverlessシナリオ。

Garbage CollectionはJavaでどのように機(jī)能しますか? Garbage CollectionはJavaでどのように機(jī)能しますか? Aug 02, 2025 pm 01:55 PM

JavaのGarbage Collection(GC)は、メモリを自動(dòng)的に管理するメカニズムであり、到達(dá)不可能なオブジェクトを取り戻すことでメモリ漏れのリスクを軽減します。 1.GCルートオブジェクトからのオブジェクトのアクセシビリティ(スタック変數(shù)、アクティブスレッド、靜的フィールドなど)、および到達(dá)不可能なオブジェクトはゴミとしてマークされています。 2。マーククリアリングアルゴリズムに基づいて、すべての到達(dá)可能なオブジェクトをマークし、マークのないオブジェクトをクリアします。 3.世代の収集戦略を採用する:新世代(Eden、S0、S1)は頻繁にMinorGCを?qū)g行します。高齢者のパフォーマンスは少なくなりますが、MajorGCを?qū)g行するのに時(shí)間がかかります。 Metaspaceはクラスメタデータを保存します。 4。JVMはさまざまなGCデバイスを提供します。SerialGCは小さなアプリケーションに適しています。 ParallelGCはスループットを改善します。 CMSが減少します

ユーザーデータにHTML「入力」タイプを使用します ユーザーデータにHTML「入力」タイプを使用します Aug 03, 2025 am 11:07 AM

適切なHTMLinputタイプを選択すると、データの精度を向上させ、ユーザーエクスペリエンスを向上させ、使いやすさを向上させることができます。 1.テキスト、電子メール、電話、番號(hào)、日付など、データ型に従って対応する入力タイプを選択します。 2。HTML5を使用して、より直感的な相互作用方法を提供できるU(xiǎn)RL、色、範(fàn)囲、検索などの新しいタイプを追加します。 3.プレースホルダーと必要な屬性を使用して、フォームフィリングの効率と精度を改善しますが、プレースホルダーがラベルを置き換えることはできないことに注意してください。

Javaビルドツールの比較:Maven vs. Gradle Javaビルドツールの比較:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

gradleisthebetterchoiceformostnewprojectoitssuperorfficability、performance、andmoderntoolingsupport.1.gradle’sgroovy/kotlindslismoreconciseandexpressiveethanmaven’sverboseml.2.gradleorformsmavenbenbumebutedwitedwitedwitedspedexは

説明された延期聲明の例で進(jìn)みます 説明された延期聲明の例で進(jìn)みます Aug 02, 2025 am 06:26 AM

Deferは、クリーニングリソースなど、関數(shù)が戻る前に指定された操作を?qū)g行するために使用されます。パラメーターは、延期時(shí)にすぐに評(píng)価され、関數(shù)は最後のファーストアウト(LIFO)の順に実行されます。 1.複數(shù)の債務(wù)は、宣言の逆の順序で実行されます。 2.ファイルの閉鎖などの安全なクリーニングに一般的に使用されます。 3。指定された返品値を変更できます。 4.回復(fù)に適したパニックが発生した場(chǎng)合でも実行されます。 5。リソースの漏れを防ぐために、ループで延期の亂用を避けます。正しい使用により、コードのセキュリティと読みやすさが向上します。

See all articles