使用ognl表达式,实现代码复用

   做了一年半的码农,偶尔,贫瘠的大脑闪出一丝灵光。

   当然,也有可能是没见过世面。先在这里偷乐一下,另外,算是个人职业生涯的一次累积。

其实觉得:

    在这里 ognl表达式的使用有两点好处:

      1.取代了a.getB().getC()........等代码,还少了空指针的风险。对于类嵌套比较复杂的非常有效

       2.将属性以exp传递,实现了代码的复用


第一次写,也不知道怎么给代码排版



   先大概讲一下逻辑,用填写个人信息类比一下:

         在填写个人住址的地方,弹出一个页面,里面有各个市,选择去过的那些市,生成一个id要入库的,同时页面用逗号隔开市的名称来显示。同时个人信息下面还有朋友的信息,朋友信息里面也同样选择住址。

        模型:因为需要,会有Man{Integer id;     List<BoyFriend> friends}  Woman{Integer id;     List<GirlFriend> friends}类似这样的的



  然后上代码:代码和注释都改了点,一遍符合上面的实例逻辑

     /**
     * 页面初始化调用的方法,用来显示城市的名称。因为名称和id是对应的,但是个人信息对象中没有这个字段,他们的联系放到另外一个对象中
     * @param exp 页面传过来的OGNL表达式
     */
    @SuppressWarnings("unchecked")
    public String getPackageName(String exp)
    {

        // 这个就是
        String packageName = "";
        // 通过OGNL表达式判断是否有id
        Integer packageID = (Integer)WebUtil.findValue(exp);
        if (ObjectUtil.isNull(packageID))
        {
            return packageName;
        }

        // 如果ID不为空,先到上下文(Conversation )  中取Adress

        // 再次注释:在交互过程中,id、adress、地址详情以 map形式保存在上下文中,key是id,有个类保存cities和各个城市的id的集合

        // SubRuleBean{ String cities ; list<String> cityLsit;}
        SubRuleBean subRuleBean;
        Conversation cs = ConversationUtils.getConversation();
        Map<Integer, SubRuleBean> subRuleBeanMap =
            (HashMap<Integer, SubRuleBean>)cs.getAttributes().get("上下文中,map的key值");
        if (ObjectUtil.isNotNull(subRuleBean = (SubRuleBean)subRuleBeanMap.get(packageID)))
        {
            packageName = subRuleBean.getPackageName();
        }
        //找不到在调用接口通过ID去数据库查询
        else
        {
            subRuleBean = new SubRuleBean();
            //  根据packageID调用接口去数据库中查询出,该id
            Map<String, String> queryRulesByPackageId = ruleService.queryRulesByPackageId(packageID.toString());
            List<String> packageNameList = new ArrayList<String>();
            //对Map进行循环
            for (Map.Entry<String, String> entry : queryRulesByPackageId.entrySet())
            {
                // 设置被选中的规则ID和打包名称
                subRuleBean.getSelectedRuleIds().add(entry.getKey());
                // 把打包名称设置到List集合中
                packageNameList.add(entry.getValue());
            }
            / / 把城市名称用逗号拼接
            subRuleBean.setPackageName(StringUtil.getStrsWithSplit(packageNameList, COMMA));


            //把它设置到缓存中去,在后面的方法中便于规则的操作
            subRuleBeanMap.put(packageID, subRuleBean);
            packageName = subRuleBean.getPackageName();
        }
        return packageName;
    }


    /**
     *  跳着到选择城市之前的方法
     * @param exp 页面传过来的OGNL表达式
     * @param groupIndex 群组ID
     */
    @SuppressWarnings("unchecked")
    public String toSetSubScriptionRule(String exp, Integer groupIndex)
    {
        SubscriptionRuleDo subscriptionRuleDo = new SubscriptionRuleDo();


        Conversation cs = ConversationUtils.getConversation();

       //  把ognl表示式放到上下文中
        subscriptionRuleDo.setExp(exp);


        // 通过页面传来的OGNL表达式到对象中去找它对应的值
        Integer packageID = (Integer)WebUtil.findValue(exp);


        SubRuleBean subRuleBean;
        if (ObjectUtil.isNull(packageID))
        {
            subRuleBean = new SubRuleBean();
        }
        // 不为空从Map中查出它对应的值
        else
        {
            Map<Integer, SubRuleBean> subRuleBeanMap =
                (HashMap<Integer, SubRuleBean>)cs.getAttributes().get(SUBRULEBEANMAP);
            subRuleBean = subRuleBeanMap.get(packageID);
        }

。。。。。。


        return "SUSESS";
    }


    /**
     * 选择城市点击确定之后
     * @param subscriptionRuleDo 订购规则对象
     */
    @SuppressWarnings("unchecked")
    public void setSubScriptionRule(SubscriptionRuleDo subscriptionRuleDo)
    {
        // 获取上下文
        Conversation cs = ConversationUtils.getConversation();


        SubRuleBean subRuleBean = subscriptionRuleDo.getSubRuleBean();
        String exp = null;
        //  如果不选择规则的话,不需要生成packageId.
        if (!ObjectUtil.isEmpty(subRuleBean.getSelectedRuleIds()))
        {
            Integer packageID;
          
                //通过OGNL表达式到对象中查找相应的带宽ID
                packageID =
                    (Integer)WebUtil.ognlFindValue(subscriptionRuleDo.getExp(), cs.getAttributes().get(ORDERPRODUCTDO));

                // 如果之前已经选择的城市,id不能变,否则新生成一个
                if (ObjectUtil.isNull(packageID))
                {
                   使用算法随即生成一个
                    packageID = StringUtil.get8RandId();
                    exp = "#" + ORDERPRODUCTDO + "." + subscriptionRuleDo.getExp();
                }


           // 并用ognl表达式赋值
            WebUtil.setValue(exp, packageID);


            // 拼装城市名称
            String packageName =
                containsValue(subscriptionRuleDo.getSubscriptionRuleBeanList(), subRuleBean.getSelectedRuleIds());


            //将打包名称设置到subRuleBean对象中
            subRuleBean.setPackageName(packageName);
            Map<Integer, SubRuleBean> subRuleBeanMap =
                (HashMap<Integer, SubRuleBean>)cs.getAttributes().get(SUBRULEBEANMAP);


            // 把值设置到Map集合中
            subRuleBeanMap.put(packageID, subRuleBean);
        }
    }

     

其实觉得:

    在这里 ognl表达式的使用有两点好处:

      1.取代了a.getB().getC........。等代码,还少了空指针的风险

       2.将属性以exp传递,实现的代码的复用


第一次写,也不知道怎么给代码排版

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值