第一步,定义Xml文件。
随便定义一个xml,例如:
<Info>
<Type>1</Type>
<Price>
<PriceValue>10000</PriceValue>
</Price>
</Info>
第二步,获取Xml数据。
(Xml文件读入在页面上一般会用个弹出框或者浮层的展现形式,但从实现上一般来说都会是一个异步ajax请求。)
首先从request中取xml描述信息,比如
String xmlDesc = rundata.getRequest.getParameter(“content”);
处理下换行符等:
String line = System.getproperty(“line.separator”);
xmlDesc = xmlDesc.replace(line,””);
xmlDesc = xmlDesc.replace(“\r”,””);
xmlDesc = xmlDesc.replace(“\n”,””);
xmlDesc = xmlDesc.replace(“\r\n”,””);
然后检查xml是否符合xml规范:
Public class DocumentXmlHelper{ Public static Document read(String xmlDesc){ java.io.StringReader stringReader = new StringReader(xmlDesc); org.dom4j.io.SAXReader saxReader = new SAXReader(); boolean valid = true; org.dom4j.Document document = null; try{ document = saxReader.read(stringReader); }catch(org.dom4j.DocumentException e){ valid = false; } if(valid){ Return document; } }
注:这是dom4j官方提供的对xml规范的校验。
如果符合xml规范即valid是true,继续将这段string形式的xmlDesc保存成javabean。
Public static SomeDO parseXml(String xmlDesc){ Document document = DocumentXmlHelper.read(xmlDesc); SomeDO someDO = new SomeDO(); If(document != null){ Element root = document.getRootElement(); For(Iterator<Element> fitrator = root.elementIterator(“Type”);fitrator.hasNext();){ Element e = (Element) fitrator.next(); Int type = Integer.parseInt(e.getTextTrim()); someDO.setType(type); } For(Iterator I = root.elementIterator(“Price”);i.hasNext();){ Element element = (Element) i.next(); For(Iterator<Element> fitrator = root.elementIterator(“PriceValue”);fitrator.hasNext();){ Element e = (Element) fitrator.next(); priceValue = Long.parseLong(e.getTextTrim()); someDO.setPriceValue(priceValue); } } } }
至此,定义解析xml就完成了。
---------------------------------------------------------------------------------------------------------------------------------
下面是根据业务规则对xmlDesc进行规则校验的过程了。
调用的是对象检查的统一服务接口:
List<String> checkResults = objectCheckService.check(someDO); 返回结果是个String列表,给个string描述一条规则校验的结果,如果是true表示校验通过,如果不通过就可以显示在具体校验类中返回的原因描述。
Public interface ObjectCheckService{
List<String> check(Object obj) ;
}
Public class ObjectCheckServiceImpl implements ObjectCheckService{
Public List<String> check(Object obj){
1. 取容器启动时就已经加载好的需校验条件列表。
每个规则校验类都实现统一接口ObjectCheck,这样在spring容器启动时就可以全部加载起来,通过ApplicationContext的getBeanNamesForType(ObjectCheck.class,true,false)方法得到所有实现了ObjectCheck的类名,然后再通过类名获得类实例ObjectCheck objectCheck = applicationContext.getBean(objectChekName,ObjectCheck.class);将这些objectCheck都add到objectCheckList列表中。
2. 定义一个倒计数的锁存器CountDownLatch变量doneSingal,初始值为1中需校验条件列表长度objectCheckList.size()
3. 对每个需校验条件进行校验。每种规则的校验都通过线程池中一个线程完成,直到countDownLatch变量值减为0,所有校验才都完成返回校验结果。
threadPool.execute( new WorkerRunnable(doneSingal, objectCheck,返回结果featureResult, someDO);
每个校验规则new出来的WorkerRunnable线程的run方法只要做一件事,就是调用规则校验实例objectCheck的check方法,将返回结果add如featureResult,计数器减一,这样等多个线程共同操作的计数器变量减到0时所有校验就完成了,会自动返回featureResult.
}
}
接下来是具体定义每个校验类。建议一类规则一个校验类。
Public String check(SomeDO someDO){
//someDO.getType==1然后怎样,这就根据业务了,不满足的话就return “type必须是1才可以**,嘿嘿”
}