国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

請求路由到業務方法設計(1)-我們到底能走多遠系列(43)

2019-11-15 00:32:17
字體:
來源:轉載
供稿:網友
請求路由到業務方法設計(1)-我們到底能走多遠系列(43)

我們到底能走多遠系列(43)    常規的web項目,比如用sPRingmvc這種框架,要來將某個url的請求指定到某個 Controller里的某個方法,這個方法負責將具體的業務完成即可。這件事我們熟悉不過,可是它是怎么做到的,也可以翻看源碼閱讀。像這種,需要完成路由工作的事情在實際項目中可能也會出現,其實任何一個需要處理請求的框架都需要解決這個問題。先拋出問題,后續文章用一個例子來完整設計一個方案。還有可以看一下其他各種框架都是如何解決這個問題的,值得研究。簡化這件事情:我們就干一件事,哪就是如何在處理請求時,安排對應的具體的業務方法來執行。1,用一個map,把對用的請求中key(假設傳的事json,里面有個key,來表示什么業務),和對應的類關聯起來,2,用模版方法,把圖中三個流程串起來,其中業務處理子類實現,每個子類都有一個doservice方法3,處理請求時都會解析json,拿到key,再從map中取出指定的實例,執行doservice方法即可。代碼簡略如下:請求假設先到達RemoteOpenServiceImpl的executeOpenService方法,直接路由找到要執行的業務實例。
public interface RemoteOpenService {    public JSON executeOpenService(JSON json, String method);}public class RemoteOpenServiceImpl implements RemoteOpenService{    @Override    public JSON executeOpenService(JSON json, String method) {        JSON returnJson = null;        BaseService service = (BaseService) OpenServiceRouter.getRouterMap().get(method);        returnJson = service.execute(json, ExampleRequest.class);                return returnJson;    }    }
OpenServiceRouter:
public class OpenServiceRouter {    private static Map<String, Object> routerMap;        public static Map<String, Object> getRouterMap(){        if(routerMap != null){            return routerMap;        }        routerMap = new HashMap<String, Object>();        routerMap.put("example", "exampleService");        return routerMap;    }        }

模版方法設計:實際執行的時service的excute方法,而這個方法執行中把業務部分的實現留給子類實現。

public interface BaseService {    public JSON execute(JSON json, Class c);}public abstract class AbstractBaseService implements BaseService{    // TODO    public final Request decode(JSON json, Class c){        ObjectMapper mapper = new ObjectMapper();        Request request = null;        try {            request = mapper.readValue(json.toJSONString(), c);        } catch (JsonParseException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (JsonMappingException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }         return request;    }    // TODO    public final JSON encode(Response response){        ObjectMapper mapper = new ObjectMapper();                  // Convert object to JSON string          JSON json = null;        try {            String j =  mapper.writeValueAsString(response);            json = JSON.parSEObject(j);        } catch (JsonGenerationException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (JsonMappingException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return json;    }        /**     * 子類不同實現具體邏輯     * @param request     */    public abstract Response doService(Request request);        /**     * 模版執行方法     * @param json     */    public final JSON execute(JSON json, Class c){        Request request = this.decode(json, c);        Response response = doService(request);        JSON retrunJson = this.encode(response);        return retrunJson;    }}

子類的實現:

public class ExampleServiceImpl extends AbstractBaseService{    @Override    public Response doService(Request request) {        ExampleRequest exampleRequest = (ExampleRequest)request;                return null;    }}
因為剛好需要設計一個這樣的被調用的組件,我就想好多地方會遇到這個場景,所以值得深入進來研究一下,以上是我想,不參考任何框架,以最原始的方式去實現一個這樣的請求路由。作為筆記的一部分,先開個頭,后續研究下其他框架對這個問題的設計。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 伽师县| 南涧| 环江| 南投县| 荥阳市| 卢湾区| 汉中市| 泸水县| 肥西县| 新宁县| 繁峙县| 石阡县| 河北区| 旺苍县| 临清市| 洪湖市| 濮阳市| 临澧县| 讷河市| 彭水| 定远县| 屯留县| 盐源县| 黄龙县| 嘉义县| 香港| 报价| 凌海市| 商水县| 古蔺县| 东乡族自治县| 永城市| 三都| 西充县| 肥城市| 廊坊市| 郯城县| 叙永县| 敦煌市| 海晏县| 海晏县|