JFinal 是基于 Java 語(yǔ)言的極速 WEB + ORM 框架,其核心設(shè)計(jì)目標(biāo)是開(kāi)發(fā)迅速、代碼量少、學(xué)習(xí)簡(jiǎn)單、功能強(qiáng)大、輕量級(jí)、易擴(kuò)展、Restful。 在擁有Java語(yǔ)言所有優(yōu)勢(shì)的同時(shí)再擁有ruby、python、php等動(dòng)態(tài)語(yǔ)言的開(kāi)發(fā)效率!為您節(jié)約更多時(shí)間,去陪戀人、家人和朋友 :)
JFinal有如下主要特點(diǎn)
MVC架構(gòu),設(shè)計(jì)精巧,使用簡(jiǎn)單
遵循COC原則,零配置,無(wú)xml
獨(dú)創(chuàng)Db + Record模式,靈活便利
ActiveRecord支持,使數(shù)據(jù)庫(kù)開(kāi)發(fā)極致快速
自動(dòng)加載修改后的java文件,開(kāi)發(fā)過(guò)程中無(wú)需重啟web server
AOP支持,攔截器配置靈活,功能強(qiáng)大
Plugin體系結(jié)構(gòu),擴(kuò)展性強(qiáng)
多視圖支持,支持FreeMarker、JSP、Velocity
強(qiáng)大的Validator后端校驗(yàn)功能
功能齊全,擁有struts2的絕大部分功能
體積小僅248K,且無(wú)第三方依賴
jfinal 微信使用的技術(shù)
前端使用淘寶tengine(Nginx),基于JAVA語(yǔ)言,采用JFinal開(kāi)發(fā),數(shù)據(jù)庫(kù)采用PostgreSQL,緩存及隊(duì)列采用SSDB。
XML處理采用dom4j,JSON處理采用溫少的fastjson。http相關(guān)處理采用HttpClient庫(kù)。
經(jīng)過(guò)測(cè)試發(fā)現(xiàn)使用Nginx做前端可大幅提高響應(yīng)速度。主要原因可能是Nginx建立連接更快吧。
核心接口:
public interface Handler<T,R> { T handle(R request); }public interface RequestMessage { public void parseXml(Element root); }public interface ResponseMessage { public void toXml(Element root); }public interface EngineService extends Service{ /** * @Title : handle * @Description : 處理收到的消息字符串 * @param : @param msgText 消息字符串 * @return : String xml字符串 */ public String handle(String msgText); /** * @Title : registEventHandler * @Description : 注冊(cè)事件處理器 * @param : @param eventType 事件類型 * @param : @param handler 事件處理器 */ public void registEventHandler(EventType eventType,Handler<RequestMessage , ResponseMessage> handler); /** * @Title : registInMessageHandler * @Description : 注冊(cè)消息處理器 * @param : @param msgType 消息類型 * @param : @param handler 消息處理器 */ public void registInMessageHandler(InMsgType inMsgType, Handler<RequestMessage , ResponseMessage> handler); /** * @Title : registUnsupportedInMesssageHandler * @Description : 注冊(cè)不支持的消息/事件處理器 * @param : @param handler 處理器 */ public void registUnsupportedInMessageHandler(Handler<RequestMessage , ResponseMessage> handler); /** * @Title : registUnsupportedMesssageHandler * @Description : 注冊(cè)不支持的消息/事件處理器 * @param : @param handler 處理器 */ public void registUnsupportedEventHandler(Handler<RequestMessage , ResponseMessage> handler); }
EngineService的handle方法會(huì)偵測(cè)消息事件類型,然后構(gòu)建對(duì)應(yīng)的對(duì)象,并調(diào)用對(duì)象的parseXML方法完成對(duì)消息xml的分析,最后調(diào)用注冊(cè)的handler來(lái)處理響應(yīng)的消息或者事件。
具體業(yè)務(wù)實(shí)現(xiàn)對(duì)應(yīng)的handler,然后注冊(cè)到某個(gè)消息或者事件上就可以了。
與JFinal集成部分代碼,主要就是集成JFinal的Handler,然后把請(qǐng)求轉(zhuǎn)發(fā)到EngineService的handle方法上。
public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) { isHandled[0] = true; try { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); if (checkSignature(request)) { if (request.getMethod().equals("POST")) { // 微信發(fā)送過(guò)來(lái)的數(shù)據(jù)(用戶發(fā)起) // 接收post過(guò)來(lái)的數(shù)據(jù) String requestStr = readPostData(request); if (logger.isDebugEnabled()) { logger.debug("POST請(qǐng)求,轉(zhuǎn)發(fā)到威爾伯樂(lè)微信引擎處理"); logger.debug("POST請(qǐng)求數(shù)據(jù):" + requestStr); } String responseStr = null; if (requestStr != null) { responseStr = engineService.handle(requestStr); } if (logger.isDebugEnabled()) { logger.debug("威爾伯樂(lè)微信引擎處理-處理結(jié)束"); logger.debug("響應(yīng)數(shù)據(jù):" + responseStr); } if (responseStr != null) { // 結(jié)果不為空,寫(xiě)入結(jié)果 response.setContentType("text/xml"); response.getWriter().write(responseStr); response.getWriter().flush(); } } else if (request.getMethod().equals("GET")) { if (logger.isDebugEnabled()) { logger.debug("GET請(qǐng)求,微信公共平臺(tái)驗(yàn)證URL有效性"); } String echostr = request.getParameter("echostr"); if (echostr != null) { // 若echostr不為空,則為微信公共平臺(tái)驗(yàn)證URL有效性 response.getWriter().write(echostr); response.getWriter().flush(); } } } else { // 簽名失敗,不做任何處理。 if (logger.isDebugEnabled()) { logger.debug("簽名驗(yàn)證失敗"); } } } catch (Exception e) { e.printStackTrace(); } }
只能給出這些信息了。其他源碼不能公開(kāi)了。
這是微信公眾平臺(tái)給出的API調(diào)用性能數(shù)據(jù),還不錯(cuò)。
- PC官方版
- 安卓官方手機(jī)版
- IOS官方手機(jī)版