在一段时间的代码开发过程中和对同事开发的观察,发现在进行以json数据为返回的数据接口时,经常需要针对于具体的功能编写具体的接口,在实现过程中做了很多的重复工作,所以本人就萌发了做一套统一接口开发的架构。
在架构的整体搭建及开发过程中,参考了spring的设计思路,并且在开发过程中也使用了spring框架的实例化工厂,所以本框架在使用过程中需要用到spring相关内容。
下面针对代码做具体介绍:
配置文件加载监听器
package cn.ac.sict.core.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import cn.ac.sict.core.util.CacheUtil;
import cn.ac.sict.core.util.XmlUtil;
/**
* 监听器用于在系统启动时加载配置文件信息
*/
public class InterfaceConfigListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent event) {
/**
* 加载配置的接口信息
*/
String fileName = event.getServletContext().getInitParameter("interfaceConfigLocation");
XmlUtil xmlUtil = new XmlUtil(fileName);
/**
* 将配置文件加载数据放入内存中
*/
CacheUtil.interfaces = xmlUtil.getProperties();
}
}
统一逻辑分发入口servlet
package cn.ac.sict.core.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.ac.sict.context.support.InstanceService;
import cn.ac.sict.core.util.MapUtil;
import cn.ac.sict.core.util.RequestDataUtil;
import net.sf.json.JSONObject;
/**
* 统一接口servlet,用于进行逻辑分发处理
* @author liyang
*
*/
public class EntranceForwardServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 用于处理所有GET类型接口请求
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 获取接口传入所有参数
*/
Map
/**
* 进行乱码检测,将汉字乱码转换成汉字
*/
MapUtil.messyCodeCheck(argument);
/**
* 处理接口访问参数
*/
this.processMethod(req, resp, argument);
}
/**
* 用于处理所有POST类型接口请求
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 获取接口传入所有参数
*/
Map
/**
* 处理接口访问参数
*/
this.processMethod(req, resp, argument);
}
/**
* 处理接口访问参数
* @param req req对象
* @param resp resp对象
* @param argument 请求参数
* @throws IOException 需要抛出的io异常
*/
private void processMethod(HttpServletRequest req, HttpServletResponse resp, Map
/**
* 通过工具类处理对象数据并进行反向映射及返回数据
*/
InstanceService service = new InstanceService(argument, req);
/**
* 返回数据对象
*/
Object ret_obj = service.invoke();
/**
* 将数据装换为json格式
*/
JSONObject jsonObject = JSONObject.fromObject(ret_obj);
/**
* 发送json数据
*/
resp.setCharacterEncoding("UTF-8");
resp.setContentType("application/json; charset=utf-8");
PrintWriter out = resp.getWriter();
out.print(jsonObject.toString());
out.flush();
out.close();
}
}
相关配置方式:
Web.xml配置
初始化配置文件监听器
<listener>
<listener-class>cn.ac.sict.core.listener.InterfaceConfigListenerlistener-class>
listener>
配置相关配置文件路径为classpath下
<context-param>
<param-name>interfaceConfigLocationparam-name>
<param-value>
interface.xml
param-value>
context-param>
初始化封装的接口统一入口servlet
<servlet>
<servlet-name>EntranceForwardservlet-name>
<servlet-class>cn.ac.sict.core.servlet.EntranceForwardServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>EntranceForwardservlet-name>
<url-pattern>/entranceForwardurl-pattern>
servlet-mapping>
Interface.xml配置
<services>
Code为service层版本号,class为对应的类别名
<servicecode="版本"class="类别名">
Code为method版本号,标签中内容为方法名
<methodcode="版本">方法名method>
service>
services>
框架中使用了json对象的序列化,所以在使用时需引入:
框架中使用了dom对象解析,所以在使用时需引入:
在框架入口类使用了servlet,所以在使用时需引入:
所有jar展示图:
以上只是本人的初步想法,欢迎批评指正!