


Différents types d'encapsulation de messages pour le développement secondaire de WeChat
May 10, 2017 am 09:29 AMCet article présente principalement en détail la troisième partie du développement secondaire de Java WeChat. Différents types d'encapsulation de messages dans Java WeChat ont une certaine valeur de référence. Les amis intéressés peuvent se référer à cet article
L'exemple partage le. encapsulation de différents types de messages dans Java WeChat pour votre référence. Le contenu spécifique est le suivant
étape 1?: Trouvez le package com.wtz.message.response, créez un nouvelle classe Image.java
package com.wtz.message.response; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 上午8:38:37 * version:1.0 * description:圖片的實(shí)體類 */ public class Image { //圖片媒體ID private String MediaId; public String getMediaId() { return MediaId; } public void setMediaId(String mediaId) { MediaId = mediaId; } }
étape 2?: Trouvez le package com.wtz.message.response et créez une nouvelle classe ImageMessage.java
package com.wtz.message.response; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 上午8:49:57 * version:1.0 * description:圖片消息類 */ public class ImageMessage extends BaseMessage { //圖片對(duì)象 private Image image; public Image getImage() { return image; } public void setImage(Image image) { this.image = image; } }
étape 3?: Trouvez le package com.wtz.message.response et créez une nouvelle classe Video.java
package com.wtz.message.response; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 上午9:02:14 * version:1.0 * description:視頻的實(shí)體類 */ public class Video { //視頻消息的媒體ID private String MediaId; //視頻消息的標(biāo)題 private String Title; //視頻消息的描述 private String Description; public String getMediaId() { return MediaId; } public void setMediaId(String mediaId) { MediaId = mediaId; } public String getTitle() { return Title; } public void setTitle(String title) { Title = title; } public String getDescription() { return Description; } public void setDescription(String description) { Description = description; } }
étape 4?: Trouvez com.wtz. message.response Package, créez une nouvelle classe VideoMessage.java
package com.wtz.message.response; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 上午9:10:14 * version:1.0 * description:視頻消息類 */ public class VideoMessage extends BaseMessage{ //視頻對(duì)象 private Video video; public Video getVideo() { return video; } public void setVideo(Video video) { this.video = video; } }
étape 5?: Trouvez le package com.wtz.message.response, créez une nouvelle classe Voice.java
package com.wtz.message.response; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 上午9:21:47 * version:1.0 * description:語音消息實(shí)體類 */ public class Voice { //語音媒體編號(hào) private String MediaId; public String getMediaId() { return MediaId; } public void setMediaId(String mediaId) { MediaId = mediaId; } }
étape 6?: Trouvez le package com.wtz.message.response et créez une nouvelle classe VoiceMessage.java
package com.wtz.message.response; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 上午9:44:58 * version:1.0</p> * description:語音消息類 */ public class VoiceMessage extends BaseMessage{ //語音對(duì)象 private Voice voice; public Voice getVoice() { return voice; } public void setVoice(Voice voice) { this.voice = voice; } }
étape 7?: Trouvez le package com.wtz.message.response, créez une nouvelle classe Music.java
package com.wtz.message.response; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 上午9:48:11 * version:1.0 * description:音樂消息實(shí)體類 */ public class Music { //音樂標(biāo)題 private String Title; //音樂描述 private String Description; //音樂鏈接 private String MusicUrl; //高品質(zhì)音樂鏈接 private String HQMusicUrl; //縮略圖的媒體ID private String ThumbMediaId; public String getTitle() { return Title; } public void setTitle(String title) { Title = title; } public String getDescription() { return Description; } public void setDescription(String description) { Description = description; } public String getMusicUrl() { return MusicUrl; } public void setMusicUrl(String musicUrl) { MusicUrl = musicUrl; } public String getHQMusicUrl() { return HQMusicUrl; } public void setHQMusicUrl(String hQMusicUrl) { HQMusicUrl = hQMusicUrl; } public String getThumbMediaId() { return ThumbMediaId; } public void setThumbMediaId(String thumbMediaId) { ThumbMediaId = thumbMediaId; } }
étape 8?: Trouvez le package com.wtz.message.response, créez un nouvelle classe MusicMessage.java
package com.wtz.message.response; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 上午9:58:21 * <p>version:1.0</p> * <p>description:音樂消息類</p> */ public class MusicMessage extends BaseMessage{ //音樂對(duì)象 private Music music; public Music getMusic() { return music; } public void setMusic(Music music) { this.music = music; } }
étape 9?: Trouvez le package com.wtz.message.response et créez une nouvelle classe Article.java
package com.wtz.message.response; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 上午10:05:29 * <p>version:1.0</p> * <p>description:圖文實(shí)體類</p> */ public class Article { //圖文標(biāo)題 private String Title; //圖文描述 private String Description; //圖片鏈接,支持JPG,PNG格式,較好的效果為大圖 private String PicUrl; //圖文消息跳轉(zhuǎn)鏈接 private String Url; public String getTitle() { return Title; } public void setTitle(String title) { Title = title; } public String getDescription() { return Description; } public void setDescription(String description) { Description = description; } public String getPicUrl() { return PicUrl; } public void setPicUrl(String picUrl) { PicUrl = picUrl; } public String getUrl() { return Url; } public void setUrl(String url) { Url = url; } }
étape 10?: Trouvez le package com.wtz .message.response, créez une nouvelle classe NewsMessage.java
package com.wtz.message.response; import java.util.List; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 上午10:16:22 * <p>version:1.0</p> * <p>description:圖文消息類</p> */ public class NewsMessage extends BaseMessage{ //圖文條數(shù) private int ArticleCount; //多條圖文消息信息,默認(rèn)第一個(gè)item為大圖 private List<Article> Articles; public int getArticleCount() { return ArticleCount; } public void setArticleCount(int articleCount) { ArticleCount = articleCount; } public List<Article> getArticles() { return Articles; } public void setArticles(List<Article> articles) { Articles = articles; } }
étape 11?: Créez un nouveau package com. wtz.message.request, créez une nouvelle classe BaseMessage.java
package com.wtz.message.request; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 上午10:53:23 * <p>version:1.0</p> * <p>description:請(qǐng)求消息基類(普通用戶->公眾賬號(hào))</p> * <p>站在服務(wù)器端的視角:接收信息</p> */ public class BaseMessage { //開發(fā)者微信號(hào) private String ToUserName; //發(fā)送方賬號(hào)(一個(gè)OpenId) private String FromUserName; //消息創(chuàng)建時(shí)間(整型) private long CreateTime; //消息類型 private String MsgType; //消息ID,64位整型 private long MsgId; public String getToUserName() { return ToUserName; } public void setToUserName(String toUserName) { ToUserName = toUserName; } public String getFromUserName() { return FromUserName; } public void setFromUserName(String fromUserName) { FromUserName = fromUserName; } public long getCreateTime() { return CreateTime; } public void setCreateTime(long createTime) { CreateTime = createTime; } public String getMsgType() { return MsgType; } public void setMsgType(String msgType) { MsgType = msgType; } public long getMsgId() { return MsgId; } public void setMsgId(long msgId) { MsgId = msgId; } }
étape 12?:Trouvez le package com.wtz.message.request et créez une nouvelle classe TextMessage.java
package com.wtz.message.request; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 上午11:04:35 * <p>version:1.0</p> * <p>description:文本消息</p> */ public class TextMessage extends BaseMessage{ //消息內(nèi)容 private String Content; public String getContent() { return Content; } public void setContent(String content) { Content = content; } }
étape 13?:Trouvez le package com.wtz.message.request et créez une nouvelle classe ImageMessage.java
package com.wtz.message.request; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 上午11:20:50 * <p>version:1.0</p> * <p>description:圖片消息</p> */ public class ImageMessage extends BaseMessage{ //圖片鏈接 private String PicUrl; //圖片消息媒體ID private String MediaId; public String getPicUrl() { return PicUrl; } public void setPicUrl(String picUrl) { PicUrl = picUrl; } public String getMediaId() { return MediaId; } public void setMediaId(String mediaId) { MediaId = mediaId; } }
étape 14?: Trouvez le package com.wtz.message.request et créez une nouvelle classe VoiceMessage java
package com.wtz.message.request; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 上午11:27:40 * <p>version:1.0</p> * <p>description:語音消息類</p> */ public class VoiceMessage extends BaseMessage { //媒體ID private String MediaId; //語音格式 private String Format; public String getMediaId() { return MediaId; } public void setMediaId(String mediaId) { MediaId = mediaId; } public String getFormat() { return Format; } public void setFormat(String format) { Format = format; } }
étape 15?: Trouvez le package com.wtz.message.request et. créer une nouvelle classe VideoMessage.java
package com.wtz.message.request; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 下午3:28:03 * <p>version:1.0</p> * <p>description:視頻消息類</p> */ public class VideoMessage extends BaseMessage { //視頻消息媒體ID private String MediaId; //視頻消息縮略圖的媒體ID private String ThumbMediaId; public String getMediaId() { return MediaId; } public void setMediaId(String mediaId) { MediaId = mediaId; } public String getThumbMediaId() { return ThumbMediaId; } public void setThumbMediaId(String thumbMediaId) { ThumbMediaId = thumbMediaId; } }
Dixième étape six?: Recherchez le package com.wtz.message.request et créez une nouvelle classe LocatonMessage.java
package com.wtz.message.request; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 下午3:27:40 * <p>version:1.0</p> * <p>description:地理位置消息類</p> */ public class LocationMessage extends BaseMessage { //地理位置緯度 private String Location_X; //地理位置經(jīng)度 private String Location_Y; //地圖縮放大小 private String Scale; //地理位置信息 private String Label; public String getLocation_X() { return Location_X; } public void setLocation_X(String location_X) { Location_X = location_X; } public String getLocation_Y() { return Location_Y; } public void setLocation_Y(String location_Y) { Location_Y = location_Y; } public String getScale() { return Scale; } public void setScale(String scale) { Scale = scale; } public String getLabel() { return Label; } public void setLabel(String label) { Label = label; } }
étape 17?: Trouvez le package com.wtz.message.request, créez une nouvelle classe LinkMessage.java
package com.wtz.message.request; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 下午1:58:04 * <p>version:1.0</p> * <p>description:鏈接消息類</p> */ public class LinkMessage extends BaseMessage { //消息標(biāo)題 private String Title; //消息描述 private String Description; //消息鏈接 private String Url; public String getTitle() { return Title; } public void setTitle(String title) { Title = title; } public String getDescription() { return Description; } public void setDescription(String description) { Description = description; } public String getUrl() { return Url; } public void setUrl(String url) { Url = url; } }
étape 18?: Créez un nouveau package com.wtz.message.event et créez une nouvelle classe BaseEventMessage.java
package com.wtz.message.event; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 上午10:44:09 * <p>version:1.0</p> * <p>description:基礎(chǔ)事件消息類</p> */ public class BaseEventMessage { //開發(fā)者微信號(hào) private String ToUserName; //發(fā)送方賬號(hào)(一個(gè)OpenID) private String FromUserName; //消息創(chuàng)建時(shí)間(整型) private long CreateTime; //消息類型 private String MsgType; //事件類型 private String Event; public String getToUserName() { return ToUserName; } public void setToUserName(String toUserName) { ToUserName = toUserName; } public String getFromUserName() { return FromUserName; } public void setFromUserName(String fromUserName) { FromUserName = fromUserName; } public long getCreateTime() { return CreateTime; } public void setCreateTime(long createTime) { CreateTime = createTime; } public String getMsgType() { return MsgType; } public void setMsgType(String msgType) { MsgType = msgType; } public String getEvent() { return Event; } public void setEvent(String event) { Event = event; } }
étape 19?: Trouvez le package com.wtz.message.event et créez un nouveau class QRCodeEventMessage.java
package com.wtz.message.event; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 下午3:24:30 * <p>version:1.0</p> * <p>description:掃描帶參數(shù)二維碼事件類</p> */ public class QRCodeEventMessage extends BaseEventMessage{ //事件Key值 private String EventKey; //用于換取二維碼圖片 private String Ticket; public String getEventKey() { return EventKey; } public void setEventKey(String eventKey) { EventKey = eventKey; } public String getTicket() { return Ticket; } public void setTicket(String ticket) { Ticket = ticket; } }
étape 20?: Trouvez le package com.wtz.message.event, créez une nouvelle classe SubscribeEventMessage.java
package com.wtz.message.event; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 下午3:27:11 * <p>version:1.0</p> * <p>description:關(guān)注/取消關(guān)注事件類</p> */ public class SubscribeEventMessage extends BaseEventMessage{ }
étape 21?: Trouvez le package com.wtz.message.event, créez une nouvelle classe MenuEventMessage.java
package com.wtz.message.event; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 下午3:32:42 * <p>version:1.0</p> * <p>description:自定義菜單事件類</p> */ public class MenuEventMessage extends BaseEventMessage{ //事件Key值,與自定義菜單接口中Key值對(duì)應(yīng) private String EventKey; public String getEventKey() { return EventKey; } public void setEventKey(String eventKey) { EventKey = eventKey; } }
étape 22?: Trouvez le package com.wtz .message.event et créez une nouvelle classe LocationEventMessage.java
package com.wtz.message.event; /** * @author wangtianze QQ:864620012 * @date 2017年4月20日 下午3:37:50 * <p>version:1.0</p> * <p>description:上報(bào)地理位置事件類</p> */ public class LocationEventMessage extends BaseEventMessage{ //地理位置緯度 private String Latitude; //地理位置經(jīng)度 private String Longitude; //地理位置精度 private String Precision; public String getLatitude() { return Latitude; } public void setLatitude(String latitude) { Latitude = latitude; } public String getLongitude() { return Longitude; } public void setLongitude(String longitude) { Longitude = longitude; } public String getPrecision() { return Precision; } public void setPrecision(String precision) { Precision = precision; } }
étape 23?:Trouvez la classe MessageUtil.java sous le package com.wtz.util, modifiez cette classe pour ajouter divers types de messages et types d'événements pour les demandes et les réponses, et ajoutez différents types de messages à convertir au format XML Méthode
package com.wtz.util; import java.io.IOException; import java.io.InputStream; import java.io.Writer; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.core.util.QuickWriter; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.io.xml.PrettyPrintWriter; import com.thoughtworks.xstream.io.xml.XppDriver; import com.wtz.message.response.ImageMessage; import com.wtz.message.response.MusicMessage; import com.wtz.message.response.NewsMessage; import com.wtz.message.response.TextMessage; import com.wtz.message.response.VideoMessage; import com.wtz.message.response.VoiceMessage; /** * @author wangtianze QQ:864620012 * @date 2017年4月19日 下午3:29:58 * <p>version:1.0</p> * <p>description:消息處理工具類</p> */ public class MessageUtil { //請(qǐng)求消息類型:文本 public static final String REQ_MESSAGE_TYPE_TEXT = "text"; //請(qǐng)求消息類型:圖片 public static final String REQ_MESSAGE_TYPE_IMAGE = "image"; //請(qǐng)求消息類型:語音 public static final String REQ_MESSAGE_TYPE_VOICE = "voice"; //請(qǐng)求消息類型:視頻 public static final String REQ_MESSAGE_TYPE_VIDEO = "video"; //請(qǐng)求消息類型:地理位置 public static final String REQ_MESSAGE_TYPE_LOCATION = "location"; //請(qǐng)求消息類型:鏈接 public static final String REQ_MESSAGE_TYPE_LINK = "link"; //請(qǐng)求消息類型:事件推送 public static final String REQ_MESSAGE_TYPE_EVENT = "event"; //--------------------------------------------------------------- //事件類型:subscribe(訂閱) public static final String EVENT_TYPE_SUBSCRIBE = "subscribe"; //事件類型:unsubscribe(取消訂閱) public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe"; //事件類型:scan(用戶已關(guān)注時(shí)的掃描帶參數(shù)的二維碼) public static final String EVENT_TYPE_SCAN = "scan"; //事件類型:LOCATION(上報(bào)地理位置) public static final String EVENT_TYPE_LOCATION = "LOCATION"; //事件類型:CLICK(自定義菜單) public static final String EVENT_TYPE_CLICK = "CLICK"; //--------------------------------------------------------------- //響應(yīng)消息類型:文本 public static final String RESP_MESSAGE_TYPE_TEXT = "text"; //響應(yīng)詳細(xì)類型:圖片 public static final String RESP_MESSAGE_TYPE_IMAGE = "image"; //響應(yīng)消息類型:語音 public static final String RESP_MESSAGE_TYPE_VOICE = "voice"; //響應(yīng)消息類型:視頻 public static final String RESP_MESSAGE_TYPE_VIDEO = "video"; //響應(yīng)詳細(xì)類型:音樂 public static final String RESP_MESSAGE_TYPE_MUSIC = "music"; //響應(yīng)消息類型:圖文 public static final String RESP_MESSAGE_TYPE_NEWS = "news"; //--------------------------------------------------------------- //從流中解析出每個(gè)節(jié)點(diǎn)的內(nèi)容 public static Map<String,String> parseXml(HttpServletRequest request) throws IOException{ Map<String,String> map = new HashMap<String,String>(); //從輸入流中獲取流對(duì)象 InputStream in = request.getInputStream(); //構(gòu)建SAX閱讀器對(duì)象 SAXReader reader = new SAXReader(); try { //從流中獲得文檔對(duì)象 Document doc = reader.read(in); //獲得根節(jié)點(diǎn) Element root = doc.getRootElement(); //獲取根節(jié)點(diǎn)下的所有子節(jié)點(diǎn) List<Element> children = root.elements(); for(Element e:children){ //遍歷每一個(gè)節(jié)點(diǎn),并按照節(jié)點(diǎn)名--節(jié)點(diǎn)值放入map中 map.put(e.getName(), e.getText()); System.out.println("用戶發(fā)送的消息XML解析為:" + e.getName() + e.getText()); } //關(guān)閉流 in.close(); in = null; } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } return map; } /** * 用于擴(kuò)展節(jié)點(diǎn)數(shù)據(jù)按照<ToUserName><![CDATA[toUser]]></ToUserName>,中間加了CDATA段 */ private static XStream xstream = new XStream(new XppDriver(){ public HierarchicalStreamWriter createWriter(Writer out){ return new PrettyPrintWriter(out){ boolean cdata = true; public void startNode(String name,Class clazz){ super.startNode(name,clazz); } protected void writeText(QuickWriter writer,String text){ if(cdata){ writer.write("<![CDATA["); writer.write(text); writer.write("]]>"); }else{ writer.write(text); } } }; } }); /** * 將文本消息對(duì)象轉(zhuǎn)換成XML格式 * params:textMessage 文本消息對(duì)象 * return:xml */ public static String messageToXml(TextMessage textMessage){ xstream.alias("xml",textMessage.getClass()); return xstream.toXML(textMessage); } /** * 將圖片消息對(duì)象轉(zhuǎn)換成XML格式 * params:imageMessage * return:xml */ public static String messageToXml(ImageMessage imageMessage){ xstream.alias("xml", imageMessage.getClass()); return xstream.toXML(imageMessage); } /** * 將語音消息對(duì)象轉(zhuǎn)換成XML格式 * params:voiceMessage * return:xml */ public static String messageToXml(VoiceMessage voiceMessage){ xstream.alias("xml",voiceMessage.getClass()); return xstream.toXML(voiceMessage); } /** * 將視頻消息對(duì)象轉(zhuǎn)換成XML格式 * params:videoMessage * return:xml */ public static String messageToXml(VideoMessage videoMessage){ xstream.alias("xml",videoMessage.getClass()); return xstream.toXML(videoMessage); } /** * 將音樂消息對(duì)象轉(zhuǎn)換成XML格式 * params:musicMessage * return:xml */ public static String messageToXml(MusicMessage musicMessage){ xstream.alias("xml",musicMessage.getClass()); return xstream.toXML(musicMessage); } /** * 將圖文消息對(duì)象轉(zhuǎn)換成XML格式 * params:newsMessage * return:xml */ public static String messageToXml(NewsMessage newsMessage){ xstream.alias("xml",newsMessage.getClass()); return xstream.toXML(newsMessage); } }
étape 24?: Trouver le ProcessService .java sous le package com.wtz.util, et modifiez la méthode dealRequest pour répondre à différents types de messages
package com.wtz.util; import java.io.IOException; import java.util.Date; import java.util.Map; import javax.servlet.http.HttpServletRequest; import com.wtz.message.response.TextMessage; /** * @author wangtianze QQ:864620012 * @date 2017年4月19日 下午8:04:14 * <p>version:1.0</p> * <p>description:核心服務(wù)類</p> */ public class ProcessService { public static String dealRequest(HttpServletRequest request){ //XML格式的消息數(shù)據(jù) String respXml = ""; //默認(rèn)返回的文本消息內(nèi)容 String respContent = "未知的消息類型"; //調(diào)用parseXml方法解析請(qǐng)求消息 Map<String, String> requestMap; try { requestMap = MessageUtil.parseXml(request); //發(fā)送方賬號(hào) String fromUserName = requestMap.get("FromUserName"); //開發(fā)者微信號(hào) String toUserName = requestMap.get("ToUserName"); //消息類型 String MsgType = requestMap.get("MsgType"); //回復(fù)文本消息 TextMessage textMessage = new TextMessage(); textMessage.setToUserName(fromUserName); textMessage.setFromUserName(toUserName); textMessage.setCreateTime(new Date().getTime()); textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){ respContent = "您發(fā)送的是文本消息"; }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)){ respContent = "您發(fā)送的是圖片消息"; }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)){ respContent = "您發(fā)送的是語音消息"; }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)){ respContent = "您發(fā)送的是視頻消息"; }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)){ respContent = "您發(fā)送的是地理位置消息"; }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)){ respContent = "您發(fā)送的是鏈接消息"; }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)){ //事件類型 String eventType = requestMap.get("Event"); if(eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)){ respContent = "感謝您的關(guān)注"; }else if(eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)){ //TODO 取消訂閱后用戶不會(huì)再收到公眾號(hào)發(fā)送的消息,因此不需要回復(fù) }else if(eventType.equals(MessageUtil.EVENT_TYPE_SCAN)){ //TODO 處理掃描帶參數(shù)二維碼事件 }else if(eventType.equals(MessageUtil.EVENT_TYPE_LOCATION)){ //TODO 處理上報(bào)地理位置事件 }else if(eventType.equals(MessageUtil.EVENT_TYPE_CLICK)){ //TODO 處理菜單點(diǎn)擊事件 } } //設(shè)置文本消息的內(nèi)容 textMessage.setContent(respContent); //將文本消息對(duì)象轉(zhuǎn)換成xml respXml = MessageUtil.messageToXml(textMessage); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return respXml; } }
Différents types d'encapsulation de messages terminés.
[Recommandations associées]
1. Téléchargement du code source de la plateforme de compte public WeChat
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Pour gérer correctement les transactions JDBC, vous devez d'abord désactiver le mode de validation automatique, puis effectuer plusieurs opérations, et enfin vous engager ou randonner en fonction des résultats; 1. Appelez Conn.SetAutoCommit (false) pour démarrer la transaction; 2. Exécuter plusieurs opérations SQL, telles que l'insertion et la mise à jour; 3. Appelez Conn.Commit () Si toutes les opérations sont réussies, et appelez Conn.Rollback () Si une exception se produit pour garantir la cohérence des données; Dans le même temps, les ressources TRY-With doivent être utilisées pour gérer les ressources, gérer correctement les exceptions et cl?turer les connexions pour éviter la fuite de connexion; De plus, il est recommandé d'utiliser des pools de connexion et de définir des points de sauvegarde pour réaliser un retour en arrière partiel, et de maintenir les transactions aussi courtes que possible pour améliorer les performances.

Pré-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusofperforming lightbetterine scénarios.

HTTP Log Middleware dans GO peut enregistrer les méthodes de demande, les chemins de requête, la propriété intellectuelle du client et le temps qui prend du temps. 1. Utilisez http.handlerfunc pour envelopper le processeur, 2. Enregistrez l'heure de début et l'heure de fin avant et après l'appel Suivant.Servehttp, 3. Obtenez le vrai client IP via R.RemoteAddr et X-Forwared-For Headers, 4. Utilisez le log.printf aux journaux de demande de sortie, 5. L'exemple de code complet a été vérifié pour s'exécuter et convient au démarrage d'un projet petit et moyen. Les suggestions d'extension incluent la capture des codes d'état, la prise en charge des journaux JSON et le suivi des ID de demande.

La collecte des ordures de Java (GC) est un mécanisme qui gère automatiquement la mémoire, ce qui réduit le risque de fuite de mémoire en récupérant des objets inaccessibles. 1. GC juge l'accessibilité de l'objet de l'objet racine (tel que les variables de pile, les threads actifs, les champs statiques, etc.), et les objets inaccessibles sont marqués comme des ordures. 2. Sur la base de l'algorithme de compensation de marque, marquez tous les objets accessibles et effacez des objets non marqués. 3. Adopter une stratégie de collecte générationnelle: la nouvelle génération (Eden, S0, S1) exécute fréquemment MinorGC; Les personnes agées fonctionnent moins, mais prend plus de temps pour effectuer MajorGC; Metaspace Stores Metadata de classe. 4. JVM fournit une variété de périphériques GC: SerialGC convient aux petites applications; Le parallelGC améliore le débit; CMS réduit

Le choix du bon type HTMLinput peut améliorer la précision des données, améliorer l'expérience utilisateur et améliorer la convivialité. 1. Sélectionnez les types d'entrée correspondants en fonction du type de données, tels que le texte, le courrier électronique, le tel, le numéro et la date, qui peuvent vérifier automatiquement la somme de la somme et l'adaptation au clavier; 2. Utilisez HTML5 pour ajouter de nouveaux types tels que l'URL, la couleur, la plage et la recherche, qui peuvent fournir une méthode d'interaction plus intuitive; 3. Utilisez l'espace réservé et les attributs requis pour améliorer l'efficacité et la précision du remplissage des formulaires, mais il convient de noter que l'espace réservé ne peut pas remplacer l'étiquette.

GradleisthebetterChoiceFormostNewProjectsDuetOtsSuperiorflexibility, Performance et ModerNtoolingSupport.1.gradle’sgroovy / kotlindslismoreConcis

La réponse claire à cette question est la recommandation d'implémenter le modèle d'observateur à l'aide d'une interface d'observateur personnalisée. 1. Bien que Java offre observable et observateur, le premier est une classe et a été obsolète et manque de flexibilité; 2. La pratique recommandée moderne consiste à définir une interface d'observateur fonctionnel, et le sujet maintient la liste des observateurs et informe tous les observateurs lorsque l'état change; 3. Il peut être utilisé en combinaison avec les expressions de lambda pour améliorer la simplicité et la maintenabilité du code; 4. Pour les scénarios GUI ou Javabean, PropertyChangeListener peut être utilisé. Par conséquent, les nouveaux projets devraient adopter un schéma d'interface d'observateur personnalisé, qui est sécurisé, facile à tester et se spécialise dans le Java moderne

ExecutorService convient à l'exécution asynchrone des taches indépendantes, telles que les opérations d'E / S ou les taches de synchronisation, en utilisant le pool de threads pour gérer la concurrence, soumettre des taches exécutables ou appelables via la soumission et obtenir des résultats avec l'avenir. Faites attention au risque de files d'attente illimités et fermez explicitement le pool de threads; 2. Le cadre Fork / Join est con?u pour les taches à forte intensité de processeur divisée, en fonction des méthodes de partitionnement et de la controverse et des algorithmes de vol de travail, et réalise la séparation récursive des taches via RecursiveTask ou récursiveAction, qui est planifiée et exécutée par Forkjoinpool. Il convient aux grands scénarios de sommation et de tri des tableaux. Le seuil divisé doit être réglé raisonnablement pour éviter les frais généraux; 3. Base de sélection: indépendant
