简介:分发器是Cs框架的核心之一,主要用于处理客户端资源请求的响应,当客户端向服务器进行资源请求时,该请求如何传递到服务器?服务器又该如何处理该请求?其中涉及到的技术有gson的使用和注解与包扫描的配合以及反射机制调用。由于其中包含的操作过多,所以分篇来一一说明。
本篇用于介绍gson:
前几篇Cs框架的文章有提到过,信息在客户端和服务器之间是通过网络协议转化后在进行传递的,传递到服务器的信息都是由枚举和String类型组成的,所以在向服务器进行资源请求时应该将信息资源转化成字符串类型的(例如:客户端在登陆时将账号和密码传递给服务器),这时我们就用到gson了。
以下是源码,并在下文对其进行解释说明。
public class ArgumentMaker {
private static final Gson gson = new GsonBuilder().create();
private static final Type type = new TypeToken<Map<String, String>>() {}.getType();
private Map<String, String> paraMap;
public ArgumentMaker() {
paraMap = new HashMap<String, String>();
}
public ArgumentMaker(String str) {//将字符串map转化成真正的map
paraMap = gson.fromJson(str, type);
}
public ArgumentMaker addArg(String name, Object value) {
//用于将参数转化成json字符串
paraMap.put(name, gson.toJson(value));//将参数转化成字符串然后放到map中
return this;
}
@SuppressWarnings("unchecked")
public <T> T getValue(String name, Type type) {
//该方法用于以后和反射机制配和,后文会进行说明
String valueString = paraMap.get(name);//通过名称在map中找到对应的值
if (valueString == null) {
return null;
}
return (T) gson.fromJson(valueString, type);//把值转化成真的类型
}
@SuppressWarnings("unchecked")
public <T> T getValue(String name, Class<?> type) {
String valueString = paraMap.get(name);
if (valueString == null) {
return null;
}
return (T) gson.fromJson(valueString, type);
}
@Override
public String toString() {
return gson.toJson(paraMap);//把map也转化成字符串
}
}
1.gson进行包装:
由于一条信息可能由多个不同类对象组成,所以采用map来储存所有信息,在将map转化成gson字符串传递给对端;其中map是<String,String>的,键:就是传递过去的标识,值:是将具体类型的值转化成字符串类型,为什么要这么做呢?是因为底层是通过字符串进行传输,除了字符串外也之只能是字节流。
public class ArgumentMaker {
private static final Gson gson = new GsonBuilder().create();
private static final Type type = new TypeToken<Map<String, String>>() {}.getType();
private Map<String, String> paraMap;
public ArgumentMaker() {
paraMap = new HashMap<String, String>();
}
public ArgumentMaker addArg(String name, Object value) {
//用于将参数转化成gson字符串
paraMap.put(name, gson.toJson(value));//将参数转化成字符串然后放到map中
return this;
}
@Override
public String toString() {
return gson.toJson(paraMap);//把map也转化成字符串
}
}
我们先对上面的代码进行初步测试:
由上图可见,我们的包装没有问题。
2.解析:
服务器会话层收到来自客户端包装后的信息后应该将信息解析,先将map转化回去在将里面的参数值从string类型变回成原本的类类型。
public ArgumentMaker(String str) {//将字符串map转化成真正的map
paraMap = gson.fromJson(str, type);
}
@SuppressWarnings("unchecked")
public <T> T getValue(String name, Type type) {
//该方法用于以后和反射机制配和,后文会进行说明
String valueString = paraMap.get(name);//通过名称在map中找到对应的值
if (valueString == null) {
return null;
}
return (T) gson.fromJson(valueString, type);//把值转化成真的类型
}
@SuppressWarnings("unchecked")
public <T> T getValue(String name, Class<?> type) {
String valueString = paraMap.get(name);
if (valueString == null) {
return null;
}
return (T) gson.fromJson(valueString, type);
}
测试结果:
结果显示,map的解析没有问题,其中还有两个方法由于牵扯到其他内容,所以留到下文说明。