统一接口开发架构,统一接口架构实现封装

来源:互联网 发布:数据标准化方法比较 编辑:程序博客网 时间:2024/05/16 10:26

在一段时间的代码开发过程中和对同事开发的观察,发现在进行以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<String, String> argument = RequestDataUtil.requestToMap(req);
/**
* 进行乱码检测,将汉字乱码转换成汉字
*/
MapUtil.messyCodeCheck(argument);
/**
* 处理接口访问参数
*/
this.processMethod(req, resp, argument);
}


/**
* 用于处理所有POST类型接口请求
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
*  获取接口传入所有参数
*/
Map<String, String> argument = RequestDataUtil.requestToMap(req);
/**
* 处理接口访问参数
*/
this.processMethod(req, resp, argument);
}


/**
* 处理接口访问参数
* @param req req对象
* @param resp resp对象
* @param argument 请求参数
* @throws IOException 需要抛出的io异常
*/
private void processMethod(HttpServletRequest req, HttpServletResponse resp, Map<String, String> argument) throws IOException {
/**
* 通过工具类处理对象数据并进行反向映射及返回数据
*/
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.InterfaceConfigListener</listener-class>

 </listener>

配置相关配置文件路径为classpath

 <context-param>

    <param-name>interfaceConfigLocation</param-name>

    <param-value>

    interface.xml

    </param-value>

  </context-param>

初始化封装的接口统一入口servlet

<servlet>

    <servlet-name>EntranceForward</servlet-name>

    <servlet-class>cn.ac.sict.core.servlet.EntranceForwardServlet</servlet-class>

 </servlet>

 <servlet-mapping>

    <servlet-name>EntranceForward</servlet-name>

    <url-pattern>/entranceForward</url-pattern>

  </servlet-mapping>


Interface.xml配置

 

<services>

Code为service层版本号,class为对应的类别名

     <servicecode="版本"class="类别名">

Code为method版本号,标签中内容为方法名

          <methodcode="版本">方法名</method>

     </service>

</services>


框架中使用了json对象的序列化,所以在使用时需引入:



框架中使用了dom对象解析,所以在使用时需引入:


在框架入口类使用了servlet,所以在使用时需引入:



所有jar展示图:



以上只是本人的初步想法,欢迎批评指正!


原创粉丝点击