做了一年半的码农,偶尔,贫瘠的大脑闪出一丝灵光。
当然,也有可能是没见过世面。先在这里偷乐一下,另外,算是个人职业生涯的一次累积。
其实觉得:
在这里 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传递,实现的代码的复用
第一次写,也不知道怎么给代码排版