栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021-10-20

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-10-20

Java http接口进阶——自我理解为接口框架形式

妙龄青年初入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();
    }

}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/336508.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号