妙龄青年初入Java,所以对有些专业术语的了解不是很深入,可能在写博文的时候,会有误解,望各大V能慷慨指出,感激不敬。
一、接口框架形式
接口框架如下:
大概思路:以简单的servlet的形式做接口调用测试。
bean层以@XMLRootElement注释进行bean与xml的转化。
api层用来写具体需要实现的接口类,继承抽象接口类,进行数据库操作,并且返回对象。
servlet层用来写每一接口来调用的servlet类。
一个bean对应一个api类对应一个servlet类。
二、各类代码
AbstractApi类:此为抽象类,用来替后面各个接口继承,并且把数据库连接以ThreadLocal的形式写在此类中。
package com.mdf.api;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import com.mdf.api.bean.TestBean;
public abstract class AbstractApi {
//数据库连接URL
private static final ThreadLocal ConnectionHolder=new ThreadLocal();
private static String mysqlurl = "jdbc:mysql://localhost:3306/test?"
+ "user=root&password=root&useUnicode=true&characterEncoding=UTF8";
//数据库连接
public static void setConnection() throws Exception{
Connection conn=null;
conn=DriverManager.getConnection(mysqlurl);
ConnectionHolder.set(conn);
}
//获取数据库连接
public static Connection getConnection() throws Exception{
setConnection();
return ConnectionHolder.get();
}
//连接释放
public static void removeConnection(Connection conn){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conn=null;
}
}
//接口抽象方法
public abstract Object resolve(Object object) throws Exception;
//获取接口类映射
public static AbstractApi getAPI(String apiname) throws Exception{
AbstractApi abstractapi=null;
//System.out.println(String.format("com.mdf.api.api.%sAPI",apiname));
abstractapi=(AbstractApi)Class.forName(String.format("com.mdf.api.api.%sAPI",apiname)).newInstance();
return abstractapi;
}
}
Marshal类:对象转为string类型的xml类
package com.mdf.api;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
public class Marshal {
public static String objecttoxml(Object object) throws Exception{
Class> clazz=null;
clazz=object.getClass();
//反射机制 获取JAXBContext对象
JAXBContext context =JAXBContext.newInstance(clazz);
//创建Marshaller对象
Marshaller marshaller=context.createMarshaller();
StringWriter writer=new StringWriter();
//将object转为xml
marshaller.marshal(object, writer);
return writer.toString();
}
}
Umarshal类:string类型转为对象类
package com.mdf.api;
import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
public class UnMarshal {
public static Object xmltoobject(Object object,String xmlstr) throws Exception{
JAXBContext context=JAXBContext.newInstance(object.getClass());
Unmarshaller unmarsharller=context.createUnmarshaller();
StringReader sr=new StringReader(xmlstr);
return unmarsharller.unmarshal(sr);
}
}
Toxmlfile:string类转为xml文件类
package com.mdf.api;
import java.io.StringReader;
import javax.xml.parsers.documentBuilder;
import javax.xml.parsers.documentBuilderFactory;
import org.w3c.dom.document;
import org.xml.sax.InputSource;
public class Toxmlfile {
public static document strtoxmlfile(String xmlstr) throws Exception {
document returnValue = null; //返回文件类型
documentBuilder dbuilder = null;
documentBuilderFactory factory = null; //dom解析工厂
StringReader sr = null; //读取流
InputSource is = null; //sax的解析 将字符串转为inputsource 用来即系为xml
sr = new StringReader(xmlstr);
is = new InputSource(sr);
factory = documentBuilderFactory.newInstance();
dbuilder = factory.newdocumentBuilder();
returnValue = dbuilder.parse(is);
return returnValue;
}
}
TestBeanAPI:具体接口类
package com.mdf.api.api;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.mdf.api.AbstractApi;
import com.mdf.api.bean.TestBean;
import com.mdf.api.bean.TestBeanList;
public class TestBeanAPI extends AbstractApi {
@Override
public Object resolve(Object object) throws Exception {
// 数据库连接获取数据对象
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
TestBean rtestbean=null;
rtestbean=(TestBean)object;
List testbeans = null;
TestBeanList tbl = null;
StringBuffer sqlstr = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = getConnection();
testbeans = new ArrayList();
tbl = new TestBeanList();
sqlstr = new StringBuffer();
sqlstr.append("SELECt ID,NAME FROM TEST");
if (rtestbean.getId() != 0) {
sqlstr.append(" WHERe ID=?");
psmt = conn.prepareStatement(sqlstr.toString());
psmt.setInt(1, rtestbean.getId());
} else {
psmt = conn.prepareStatement(sqlstr.toString());
}
rs = psmt.executeQuery();
while (rs.next()) {
TestBean testbean = new TestBean();
testbean.setId(rs.getInt("ID"));
testbean.setName(rs.getString("NAME"));
testbeans.add(testbean);
}
tbl.setTestbeans(testbeans.toArray(new TestBean[testbeans.size()]));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
rs = null;
}
if (psmt != null) {
try {
psmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
psmt = null;
}
removeConnection(conn);
}
return tbl;
}
}
TestBean:bean类,以@xmlrootelement注释
package com.mdf.api.bean;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="TestBean")
public class TestBean {
private int id;
private String name;
public int getId() {
return id;
}
@XmlElement
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
}
TestBeanList:以上bean的list形式
package com.mdf.api.bean;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="TestBeanList")
public class TestBeanList {
private TestBean[] testbeans=null;
public TestBean[] getTestbeans() {
return testbeans;
}
@XmlElement
public void setTestbeans(TestBean[] testbeans) {
this.testbeans = testbeans;
}
}
TestBeanAPIServlet:调用的servlet类
package com.mdf.api.servlet;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.w3c.dom.document;
import com.mdf.api.AbstractApi;
import com.mdf.api.Marshal;
import com.mdf.api.Toxmlfile;
import com.mdf.api.UnMarshal;
import com.mdf.api.api.TestBeanAPI;
import com.mdf.api.bean.TestBean;
import com.mdf.api.bean.TestBeanList;
@WebServlet("/TestBeanAPIservlet")
public class TestBeanAPIservlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public TestBeanAPIservlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
InputStream is = null; //InputStream用来获取客户端请求
PrintWriter printwriter = null; //response输出
int i = -1;
TestBean rtestbean = null;
String requeststr = null;
TestBeanList tbl=null;
ByteArrayOutputStream bos = null;
String xmlstr=null;
document xmlfile=null;
String apiname=null;
AbstractApi api=null;
// 获取客户端传来请求参数
is = request.getInputStream(); // 获取输入流
bos = new ByteArrayOutputStream();
while ((i = is.read()) != -1) {
bos.write(i);
}
requeststr = bos.toString();
//分解xml头获取apiname
try {
xmlfile=Toxmlfile.strtoxmlfile(requeststr);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
apiname=xmlfile.getdocumentElement().getNodeName();
//获取api类
try {
api=AbstractApi.getAPI(apiname);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 将xml解析,转为bean
rtestbean = new TestBean();
try {
rtestbean = (TestBean) UnMarshal.xmltoobject(rtestbean, requeststr);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//执行接口类
try {
tbl=(TestBeanList)api.resolve(rtestbean);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//解析对象为xml
try {
xmlstr=Marshal.objecttoxml(tbl);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// PrintWriter返回给客户端
response.setCharacterEncoding("utf-8");
printwriter = response.getWriter();
printwriter.println(xmlstr.toString());
printwriter.flush();
printwriter.close();
}
}



