协议的封装
一、协议封装之前的问题 // 未封装协议前的问题
// 5人的项目组,100个请求
// 问题一:代码编写极易出错,不好维护
// 问题二:抽取代码,不好维护(一套抽取的结果)
// 问题三:学习协议,5*0.5天(一个人)
// 问题四:学习情况的检验,5*0.5天
// 问题五:协议变更() // 如何规避风险,项目的影响最小化
// 解决:使用协议封装:抽取的操作(一个人完成),面向对象
|
协议封装
|
技术点: 1、日期时间的格式化找SimpleDateFormat,数字的格式化找DecimalFormat,格式化就找java.text包 2、查看某个类的继承关系,选中该类,Ctrl+T |
二、发送协议的封装
1、叶子leaf节点的封装-Leaf.java ①待封装的叶子: //<agenterid>889931</agenterid> ②封装的代码:
|
2、头header的封装 ①待封装的头信息 <header>
<agenterid>889931</agenterid>
<source>ivr</source>
<compress>DES</compress> <messengerid>20091113101533000001</messengerid>
<timestamp>20091113101533</timestamp>
<digest>7ec8582632678032d25866bd4bce114f</digest> <transactiontype>12002</transactiontype>
<username>13200000000</username>
</header>②封装后的代码 a、由于有8个叶子,所以需要声明出8个Leaf对象,每个对象代表一个叶子 b、对于叶子中不变的值,可以直接在构造方法中设置tagValue,而对于那些需要用代码拼凑出来tagValue, c、引用到了其他对象中的东西,作为参数传递进来
|
三、Element的封装 ①分析:由于一个Element代表的就是一个请求,而不同的请求,封装的内容不一样,所以需要将多个请求对象的共性内容给抽取出来,作为一个抽象类模板,不同的请求,只需要继承该模板,实现里面具体的实现就可以了 ② 需要封装的xml文件 <element>
<lotteryid>118</lotteryid>
<issues>1</issues>
</element>③抽象类Element.java package cn.zengfansheng.lottery.net.protocol;
import org.xmlpull.v1.XmlSerializer;
/**
* 3、Element请求内容的封装(35个请求)
* @author hacket
*/
public abstract class Element {
// 由于请求信息根据不能的请求,会有不同的节点,所以不能写死了
//由具体的子类来实现具体的请求的封装
/**
* 1、请求内容的序列化-生成对应的请求类型中的请求信息
* @param serializer
*/
public abstract void serializer(XmlSerializer serializer);
// 由于不同的请求有专门的数字代表,所以也要由子类实现
/**
* 2、获取代表该请求类型的请求码
* @return 返回代表该请求类型的请求码
*/
public abstract String getTransactiontype();
} ④可销售期信息查询 CurrentIssueElement.java
⑤ 用户登陆密码验证UserLoginElement.java
|
四、elements、body ①分析:elements中由多个element构成,所以只需要在body中用一个List<Element>就可以表示elements节点了 ②对应的xml文件 <body>
<elements>
<element>
<lotteryid>118</lotteryid>
<issues>1</issues>
</element>
</elements>
</body> ③ body请求的内容封装:Body.java
|
五、完整的message的封装 ①存在的问题 // 存在问题:
// ①完整的body获取
// 解决:在body中提供一个获取完整body的方法
// ②transactiontype获取
// 解决:由对应的请求类型Element返回
// ③设置请求参数的入口
// 解决:在Message中提供获取指定Element的xml生成文件
// ④body里面数据加密
// 解决:在body中提供一个获取加密body中内容的方法 ②完整的xml,message <?xml version=”1.0” encoding=”utf-8”?>
<message version="1.0">
<header>
<agenterid>889931</agenterid>
<source>ivr</source>
<compress>DES</compress>
<messengerid>20091113101533000001</messengerid>
<timestamp>20091113101533</timestamp>
<digest>7ec8582632678032d25866bd4bce114f</digest>
<transactiontype>12002</transactiontype>
<username>13200000000</username>
</header>
<body>
<elements>
<element>
<lotteryid>118</lotteryid>
<issues>1</issues>
</element>
</elements>
</body>
</message> ③ message的封装-完整的xml生成
|
六、测试 只需要将对应的请求类型的实现类传递给Message的getXml()方法就可以生成对应的xml文件 Message message = new Message();
CurrentIssueElement currentIssueElement = new CurrentIssueElement();
String xml = message.getXml(currentIssueElement);// 一句代码生成xml文件 |