shgsdhgsdsdl-Java接口开发

来源:互联网 发布:淘宝关联店铺打单 编辑:程序博客网 时间:2024/06/01 10:41

Java后台接口开发初步实战

发表于2017/3/23 19:55:25  3415人阅读

分类: Java

这里写图片描述

上图是查询列表的接口,get方式

这里写图片描述

上图是用户注册的接口,同样是get,post方式也很简单

开发工具:IntelliJ IDEA 2016.3.5 
ORM框架:MyBatis 
数据库:MySql 
服务器:tomcat7.0

公司使用的的orm框架是Hibernate,使用起来感觉比mybatis好用多了,毕竟经过了公司这么多项目的考验,总比自己用mybatis写的项目可靠,但以下分享的还是mybatis的代码

注册接口方法:http://192.168.1.116:8080/register?username=111&password=222

    @RequestMapping(value = "register", method = RequestMethod.GET)    @ResponseBody    public Map<String, Object> register(@RequestParam("username") String username, @RequestParam("password") String password) {        out.println("welcome to register,username=" + username + ";password=" + password);        Map<String, Object> map = new HashMap<>();        ResultBean result = onRegister(username, password);        out.println("result==>" + result);        map.put("code", result.getCode());        map.put("reason", result.getReason());        map.put("success", result.isSuccess());        return map;    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

具体的注册方法,获取session基本和Hibernate差不多

    private ResultBean onRegister(String username, String password) {        ResultBean resultBean = new ResultBean();        SqlSession session = null;        try {            session = sqlSessionFactory.openSession();            LoginMapper loginMapper = session.getMapper(LoginMapper.class);            Map<String, Object> map = new HashMap<>();            map.put("name", username);            map.put("password", password);            LoginBean bean = new LoginBean();            bean.setName(username);            bean.setPassword(password);            // 查询用户是否存在            LoginBean userExist = loginMapper.findUserByName(map);            if (userExist != null) {                // 存在后无法注册                resultBean.setCode("001");                resultBean.setSuccess(false);                resultBean.setReason("用户已存在");            } else {                loginMapper.addUser(bean);                session.commit();// 重要,一定要commit,否则无法insert                System.out.println("当前增加的用户id为:" + bean.getId());                resultBean.setCode("200");                resultBean.setSuccess(true);                resultBean.setReason("注册成功");            }        } catch (Exception e) {            e.printStackTrace();            out.println("注册异常==>" + e.getMessage());            resultBean.setCode("001");            resultBean.setSuccess(false);            resultBean.setReason("注册异常");        } finally {            session.close();        }        return resultBean;    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

这个Mapper需要在配置文件中指定

public interface LoginMapper {    public LoginBean findUserByName(Map<String,Object> map) throws Exception;    public void addUser(LoginBean bean) throws Exception;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这是对应的LoginMapper.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-config.dtd"><mapper namespace="com.xm.travel.LoginMapper">    <select id="loadRunList" parameterType="java.util.Map" resultType="com.xm.travel.RunBean">        select * from run    </select>    <select id="loginUser" parameterType="java.util.Map" resultType="com.xm.travel.LoginBean">        select * from user where name = #{name} and password = #{password}    </select>   <select id="findUserByName" parameterType="java.util.Map" resultType="com.xm.travel.LoginBean">        select * from user where name = #{name}    </select>    <insert id="addUser"  useGeneratedKeys="true" keyProperty="id" >        insert into user(id,name,password)  values(#{id},#{name},#{password})    </insert></mapper>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

或许我可以写几个简单的接口供好旅App调用,但貌似需要购买一个空间之类的,这就感觉有点麻烦了,以后慢慢考虑吧,毕竟刚接触这方面,需要慢慢成长

====================================

环境搭建(一)

=====================================

web接口开发(二)

java web开发(二) 接口开发

原创 2016年06月03日 16:50:34

    java web开发(一) 环境搭建讲解了如何搭建基础项目,如果你还没了解,可以先去看看!今天我们就来看看接口的开发,打算使用比较古老的或者说比较原始方法实现的接口。

一.数据库设计。

    我打算做一个简单的学生信息管理系统,数据库名为students_manage,并且先设计一张学生表,表名为student。

1.打开Sqlyong工具,如果还没创建连接,可以点击新建,输入名称,点击确定即可,

2.然后在保存的连接中选择,刚刚新建的连接,只需要在密码输入框中输入,安装数据库时的设置的密码,点击连接,其他的默认即可,


如果都ok的话,那么将会出现如下界面,就代表连接成功了!


3.连接成功后,首先创建数据库,在左边的空白区域,鼠标右键,创建数据库,输入数据库名称students_manage,其他的默认,


点击创建即可,然后在左边的数据库列表中会多一个students_manage的数据库,


4.创建数据库成功后,我们便可以创建数据库表,选中students_manage的数据库中的Tables文件夹,右边,创建表,输入表的字段,类型,设置主键,是否可为空等,


点击创建表按钮,便会看到在Tables文件夹中,多一个student表,


5.双击student表,便会打开该表,我们需要给该表中,先初始化一些数据,点击表数据,然后插入数据,点击保存。


此时表中已有2条记录。

数据库的简单设计就差不多了,接下来,我们需要开发接口!

二.接口项目开发。如果对这一部分有疑问或者不清楚的,欢迎查看java web开发(四) 接口开发补坑1和 java web开发(五) 接口开发补坑2!

    接口返回的数据格式是JSON,如果你对JSON还不熟悉,可以先看看文章 JSON 使用讲解和JSON 解析。

   1.新建项目。这个就不多说了!这一块要是还不了解,请看这篇文章, java web开发(一) 环境搭建。

   2.设计Json数据。

    2.1.接口返回的Json数据格式如下:

   (1).返回对象,

{"code":" ","msg":" ","time":1464937933230,"object":{}}
   (2).返回数组,

{"code":" ","msg":" ","time":1464937933230,"items":[{},{}]}
    目前就设计返回为以上两种格式。如果你有分页的话,也可以加上。下面,就展示一下,代码以及说明。

    (1).建立AbstractJsonObject(Json数据的基类),具体实现如下:

public class AbstractJsonObject {        //codeprivate String code;//msgprivate String msg;private Long time = new Date().getTime();public String getCode() {return code;}public void setCode(String code) {this.code = code;}/** * @return the time */public Long getTime() {return time;}/** * @param time *            the time to set */public void setTime(Long time) {this.time = time;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public void setContent(String code, String msg) {this.code = code;this.msg = msg;}public void setStatusObject(StatusObject statusObject) {this.code = statusObject.getCode();this.msg = statusObject.getMsg();}}
    其中,StatusObject是一个状态对象,封装了状态码(code)和状态信息(msg),具体实现如下:

/** * 状态对象 */public class StatusObject {// 状态码private String code;// 状态信息private String msg;public StatusObject(String code, String msg) {super();this.code = code;this.msg = msg;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}}
    (2).建立Json对象类SingleObject,代码:

public class SingleObject extends AbstractJsonObject {private Object object;public Object getObject() {return object;}public void setObject(Object object) {this.object = object;}}
    (3).建立Json数组类ListObject,代码:

public class ListObject extends AbstractJsonObject {// 列表对象private List<?> items;public List<?> getItems() {return items;}public void setItems(List<?> items) {this.items = items;}}
经过上面几步,我们所需要的json数据格式已经创建好了,接下来就需要解析json数据了,我这儿选择的jackjson,JackJson 库下载。下载完jackson库后,将三个包导入到项目的lib目中,截图所示:

   (4).JackJsonUtils生成json数据和解析json数据,代码:

public class JackJsonUtils {static ObjectMapper objectMapper;/** * 解析json *  * @param content * @param valueType * @return */public static <T> T fromJson(String content, Class<T> valueType) {if (objectMapper == null) {objectMapper = new ObjectMapper();}try {return objectMapper.readValue(content, valueType);} catch (Exception e) {e.printStackTrace();}return null;}/** * 生成json *  * @param object * @return */public static String toJson(Object object) {if (objectMapper == null) {objectMapper = new ObjectMapper();}try {return objectMapper.writeValueAsString(object);} catch (Exception e) {e.printStackTrace();}return null;}}
    至此,json数据设计就ok了!是不是没有想象的那么难?也许,就真的这么简单!微笑接下来,就是接口的开发了。

    3.接口开发。

      本篇文章开发接口使用的是古老的servlet实现的,关于servlet,请自行查找资料,这里就不多说了(其实我也就一知半解偷笑)

      3.1.创建一个类继承自HttpServlet,例如StudentInq,鼠标右键,新建->选择Servlet,截图所示输入Servlet名称,点击Finish按钮,就ok了!

此时你会发现包下多了一个StudentInq类,具体代码:

public class StudentInq extends HttpServlet {private static final long serialVersionUID = 1L;/** * @see HttpServlet#HttpServlet() */public StudentsInq() {super();// TODO Auto-generated constructor stub}/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse *      response) */protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// TODO Auto-generated method stub}/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse *      response) */protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}
    实现HttpServlet的doGet()和doPost方法,此处为了简单就只实现doGet()。

PS: 如果你比较细心的话,会发现在web.xml文件中多了几行代码,具体如下截图:(web.xml 是网络程序中的一个很重要的配置文件,更具体的、详细的请查询相关文档)


可以看到我们刚才新建servlet,在这个xml文件中显示了。后面我们在调用接口的时候便会用到这个配置清单。

    3.2. 接口实现。

    我们就简单的实现一个学生查询接口!调用查询接口,返回数据库中所有的学生信息。

   (1).新建一个接口StudentService,代码:

public interface StudentService {public List<Students> getAllStudents();}
    (2). 实现该接口,StudentServiceImpl代码:

public class StudentServiceImpl implements StudentService{@Overridepublic List<Students> getAllStudents() {// TODO Auto-generated method stubreturn StudentBusiness.getAllStudents();}}

   其中,StudentBusiness提供了从数据库获取学生信息的方法。有关数据库操作下面会讲到。接着,我们实现Servlet的doGet(),具体代码:

 List<Students> list = new StudentServiceImpl().getAllStudents();ListObject listObject=new ListObject();listObject.setItems(list);listObject.setStatusObject(StatusHouse.COMMON_STATUS_OK);String responseText = JackJsonUtils.toJson(listObject);ResponseUtils.renderJson(response, responseText);

   其中,ResponseUtils是将返回的json数据写入到response中。

   至此,接口返回数据已经成功了!目前还没有连接数据库,那么接下来,就是有关数据库的操作。

   4. 数据库操作。

    文章开头,我们已经创建好了数据库以及表,并且也添加了几条测试数据。数据有了,我们需要在项目中获取到,那么该怎么操作呢?

   (1). 数据库连接。

    我们连接mysql数据库,需要导入mysql-connector.jar,jar包下载链接下载好jar后,导入到lib目录中,

   (2). 建立DBHelper连接数据库以及关闭连接:

public class DBHelper { public static final String url = "jdbc:mysql://localhost:3306/students_manage";      public static final String name = "com.mysql.jdbc.Driver";      public static final String user = "****";      public static final String password = "******";        public Connection conn = null;      public PreparedStatement pst = null;        public DBHelper(String sql) {          try {              Class.forName(name);//            conn = DriverManager.getConnection(url, user, password);//            pst = conn.prepareStatement(sql);//        } catch (Exception e) {              e.printStackTrace();          }      }        public void close() {          try {              this.conn.close();              this.pst.close();          } catch (SQLException e) {              e.printStackTrace();          }      }  }
这个代码很简单了,不需要多说!

    这一步,我们是连接数据库,连接成功后,就可以使用表中的数据了!

三. 运行。

    经过上面几步,我们就大致完成了一个简单使用Servlet的接口开发,接下来就到了激动人心的时刻了,运行!

PS: 在运行前,可以在WebContent中添加一个index.jsp,index.jsp代码:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"    pageEncoding="ISO-8859-1"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Insert title here</title></head><body><h1>hello world!</h1><h2>This is my test page!</h2><h3>Welcome to my page!</h3></body></html>

 (1).在项目上,右键->Run As->Run to Server。


如果一切都正常的话,(如果你创建了index.jsp,你会看到一个jsp页面;如果没有创建index.jsp,可能会显示一个404界面;当然没有创建index.jsp不会影响咱们接口的调试)


   (2).我们在浏览器中输入‘http://localhost:8080/mServer/StudentInq’,如果一切都正常的话,会显示:

   或者在浏览器中输入本机的ip地址,例如’http://192.168.1.133:8080/mServer/StudentInq‘,


看到这个界面,顿时泪流满面!奋斗

四. 总结。

    这么长的篇幅终于实现了简单接口的开发,不容易啊!太感动了!我们总结一下实现接口开发步骤:

(1). 数据库表设计;

(2).json数据设计;

(3).接口实现。

  总结后,是不是感觉很简单呢!从此以后,只要看到接口数据不如意的,你都可以随便来改!微笑!(实际上接口开发要牵扯好多东西,如果你要了解或者熟悉更多有关接口开发,那么就需要结合Web框架,例如SSH,Springmvc等等,本篇文章只是很基础的入门开发)至此,通过这篇文章,相信你对接口不再生疏了!下篇文章将介绍,后台接口服务和前端客户端结合,详情请看,java web开发(三) 接口使用。

  最后补上,例子下载地址。

 PS: json格式化工具

推荐文章:SpringMVC 开发接口


博文中经常有小伙伴留言,有关接口项目的问题,最近就推出几篇补坑的文章,打算这几篇文章详解项目中的代码以及业务流程,java web开发(四) 补坑1和 java web开发(五) 接口开发补坑2!欢迎大家查看!

============================

再续(三)



原创 2016年06月15日 15:31:32

    前面两篇文章讲解了,接口服务的搭建以及接口的开发,如果你还未了解,可以先看看文章,java web开发(一) 环境搭建和 java web开发(二) 接口开发。本篇文章,结合后台接口服务和客户端。客户端从接口获取数据,然后展示。(客户端使用Android)。

一.接口服务创建。可以参考上篇文章,这儿就不啰嗦了!

二. 实现Android项目。

1.创建Android项目。相信大家都会吧!(就不多说了)

2.实现Json数据解析。上篇接口开发文章中提到,返回的Json数据有2种,一种是对象,另一种是数组。那么我们就需要实现两种格式的解析对象。

 首先,需要创建一个基类,内部有三个字段,code、msg、time。具体实现如下:

public class Response implements Serializable {/** *  */private static final long serialVersionUID = 1L;private String code;// private String msg;private Long time = new Date().getTime();public String getCode() {return code;}public void setCode(String code) {this.code = code;}/** * @return the time */public Long getTime() {return time;}/** * @param time *            the time to set */public void setTime(Long time) {this.time = time;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public void setContent(String code, String msg) {this.code = code;this.msg = msg;}}

该类是所有json解析类的基类,封装了服务器返回的一些信息。

 2.1 对象。

public class EntityResponse<T> extends Response {private static final long serialVersionUID = 3750508105973880680L;private T object;public T getObject() {return object;}public void setObject(T object) {this.object = object;}}

该类继承自Response,用于返回json数据是单独对象的情况。

 2.2 数组。

public class ListResponse<T> extends Response  {private static final long serialVersionUID = 2857885317968129959L;private List<T> items;public List<T> getItems() {return items;}public void setItems(List<T> items) {this.items = items;}}

该类继承自Response,用于返回json数据是数组的情况。

 2.3 Json解析。解析Json使用的是Gson。

private static <T> T parseByGson(String json, TypeToken<T> typeToken) {Gson gson = new Gson();T result = gson.fromJson(json, typeToken.getType());String code = ((com.studentmaneagemobile.mobile.Response) result).getCode();String msg = ((com.studentmaneagemobile.mobile.Response) result).getMsg();//需要判断返回code是否是okif (code != null && code.equalsIgnoreCase("ok")) {return result;}return null;}
解析json,当code为‘ok’的时候,才认为返回json数据成功,此时才去解析json数据。传入返回json字符串和解析类型,例如

TypeToken<ListResponse<Students>> token = new TypeToken<ListResponse<Students>>() {};

 2.4 具体代码详解代码下载!

 2.5 运行。

 首先,启动接口服务,启动成功后,在浏览器中输入接口地址,例如出现如下截图表示接口服务启动成功,


接着,运行客户端代码,点击‘inq’按钮,效果图如下所示,


三. 总结。

   如果你做过Android或者Ios或者其他客户端开发,那么总是会需要后台服务提供接口。要实现这样的功能,简单的说可以分为2部分:

   1.接口服务开发。详情请看java web开发(一) 环境搭建和 java web开发(二) 接口开发。

   2.客户端开发。客户端需要,UI设计、网络、图片、数据库或者其他框架等等。

   PS: 这两部分,在前期设计的时候,需要好的架构师好好的设计一下!否则,在后期开发时,会遇到很大的问题!

  总结起来好像很简单,但是只有开发过的人,才知道其中的滋味!奋斗!“Good good study day day up”!

PS: 接口服务器代码, 接口服务demo下载地址

      客户端代码,客户端demo下载地址。

                             json格式化工具

推荐文章:SpringMVC 开发接口



博文中经常有小伙伴留言,说项目的许多问题,最近就推出几篇补坑的文章,打算这几篇文章详细解决项目中的代码以及业务流程,java web开发(四) 补坑1 java web开发(五) 接口开发补坑2欢迎大家查看!

==============================

原创 2016年06月15日 15:31:32

    前面两篇文章讲解了,接口服务的搭建以及接口的开发,如果你还未了解,可以先看看文章,java web开发(一) 环境搭建和 java web开发(二) 接口开发。本篇文章,结合后台接口服务和客户端。客户端从接口获取数据,然后展示。(客户端使用Android)。

一.接口服务创建。可以参考上篇文章,这儿就不啰嗦了!

二. 实现Android项目。

1.创建Android项目。相信大家都会吧!(就不多说了)

2.实现Json数据解析。上篇接口开发文章中提到,返回的Json数据有2种,一种是对象,另一种是数组。那么我们就需要实现两种格式的解析对象。

 首先,需要创建一个基类,内部有三个字段,code、msg、time。具体实现如下:

public class Response implements Serializable {/** *  */private static final long serialVersionUID = 1L;private String code;// private String msg;private Long time = new Date().getTime();public String getCode() {return code;}public void setCode(String code) {this.code = code;}/** * @return the time */public Long getTime() {return time;}/** * @param time *            the time to set */public void setTime(Long time) {this.time = time;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public void setContent(String code, String msg) {this.code = code;this.msg = msg;}}

该类是所有json解析类的基类,封装了服务器返回的一些信息。

 2.1 对象。

public class EntityResponse<T> extends Response {private static final long serialVersionUID = 3750508105973880680L;private T object;public T getObject() {return object;}public void setObject(T object) {this.object = object;}}

该类继承自Response,用于返回json数据是单独对象的情况。

 2.2 数组。

public class ListResponse<T> extends Response  {private static final long serialVersionUID = 2857885317968129959L;private List<T> items;public List<T> getItems() {return items;}public void setItems(List<T> items) {this.items = items;}}

该类继承自Response,用于返回json数据是数组的情况。

 2.3 Json解析。解析Json使用的是Gson。

private static <T> T parseByGson(String json, TypeToken<T> typeToken) {Gson gson = new Gson();T result = gson.fromJson(json, typeToken.getType());String code = ((com.studentmaneagemobile.mobile.Response) result).getCode();String msg = ((com.studentmaneagemobile.mobile.Response) result).getMsg();//需要判断返回code是否是okif (code != null && code.equalsIgnoreCase("ok")) {return result;}return null;}
解析json,当code为‘ok’的时候,才认为返回json数据成功,此时才去解析json数据。传入返回json字符串和解析类型,例如

TypeToken<ListResponse<Students>> token = new TypeToken<ListResponse<Students>>() {};

 2.4 具体代码详解代码下载!

 2.5 运行。

 首先,启动接口服务,启动成功后,在浏览器中输入接口地址,例如出现如下截图表示接口服务启动成功,


接着,运行客户端代码,点击‘inq’按钮,效果图如下所示,


三. 总结。

   如果你做过Android或者Ios或者其他客户端开发,那么总是会需要后台服务提供接口。要实现这样的功能,简单的说可以分为2部分:

   1.接口服务开发。详情请看java web开发(一) 环境搭建和 java web开发(二) 接口开发。

   2.客户端开发。客户端需要,UI设计、网络、图片、数据库或者其他框架等等。

   PS: 这两部分,在前期设计的时候,需要好的架构师好好的设计一下!否则,在后期开发时,会遇到很大的问题!

  总结起来好像很简单,但是只有开发过的人,才知道其中的滋味!奋斗!“Good good study day day up”!

PS: 接口服务器代码, 接口服务demo下载地址

      客户端代码,客户端demo下载地址。

                             json格式化工具

推荐文章:SpringMVC 开发接口



博文中经常有小伙伴留言,说项目的许多问题,最近就推出几篇补坑的文章,打算这几篇文章详细解决项目中的代码以及业务流程,java web开发(四) 补坑1 java web开发(五) 接口开发补坑2欢迎大家查看!


java web开发(五) 接口开发补坑2

原创 2017年08月07日 13:56:25

    这里主要是接上篇java web开发(四) 接口开发补坑1文章的。如果你还未了解接口开发方面的文章,请先看这篇文章, java web开发(二) 接口开发!今天这篇文章继续来细说,demo项目中的代码!

一、cn.xinxing.json 这个包中是处理有关json操作的。博文中留言有关响应状态码问题的小伙伴们,请仔细看这部分!

1.1 .cn.xinxing.json.core 这个包中定义了响应对象。下面具体看看这几个类。

1.1.1 AbstractJsonObject 这个类是所有响应对象的基类,定义了响应状态码、响应状态描述以及时间戳!

package cn.xinxing.json.core;import java.util.Date;import cn.xinxing.json.status.StatusObject;/** * 响应基类 */public class AbstractJsonObject {private String code;//响应状态码// private String msg;//响应状态描述private Long time = new Date().getTime();//时间戳public String getCode() {return code;}public void setCode(String code) {this.code = code;}/** * @return the time */public Long getTime() {return time;}/** * @param time *            the time to set */public void setTime(Long time) {this.time = time;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public void setContent(String code, String msg) {this.code = code;this.msg = msg;}public void setStatusObject(StatusObject statusObject) {this.code = statusObject.getCode();this.msg = statusObject.getMsg();}}
其中 code 是响应状态码,msg是响应状态描述,time 是时间戳。code之前也一直提到过,这里再次强调,code的值是项目中接口的运行状态!例如当接口运行运行成功,会设置code为‘ok’。具体code值是多少,这个要接口自己定义一个规范,当调用者拿到这个code时,就知道如何处理了!下面会给出这个项目中定义的code!

1.1.2 SingleObject ,这个对象中定了一个对象。主要是用来在返回单个对象时使用!

package cn.xinxing.json.core;/** *单个对象 */public class SingleObject extends AbstractJsonObject {private Object object;//单个对象public Object getObject() {return object;}public void setObject(Object object) {this.object = object;}}
当响应的内容是一个对象时,就定义这个SingleObject类,将对象设置给SingleObject类,然后返回SingleObject即可!

1.1.3  ListObject,这个对象中定了一个列表对象。是用来返回列表对象!

package cn.xinxing.json.core;import java.util.List;/** * 列表对象 */public class ListObject extends AbstractJsonObject {private List<?> items;// 列表对象public List<?> getItems() {return items;}public void setItems(List<?> items) {this.items = items;}}
当响应的内容是一个列表时,我们就可以使用这个ListObject,将列表放置到items属性中,然后返回ListObject就可以了!

这里我只给出了以上这两种返回结果!当然还有其他的返回结果,例如分页形式的!这些规则都需要在项目开发时制定好,在开发时,才会顺利便捷!

1.2  cn.xinxing.json.responseUtils 这个包中是响应处理,有一个类ResponseUtils,看具体实现,

package cn.xinxing.json.responseUtils;import java.io.IOException;import javax.servlet.http.HttpServletResponse;/** * 响应处理 */public class ResponseUtils {/** * 返回json 串 *  * @param response * @param text */public static void renderJson(HttpServletResponse response, String text) {// System.out.print(text);render(response, "text/plain;charset=UTF-8", text);}/** * 发送内容。使用UTF-8编码。 *  * @param response * @param contentType * @param text */public static void render(HttpServletResponse response, String contentType, String text) {response.setContentType(contentType);response.setCharacterEncoding("utf-8");response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);try {response.getWriter().write(text);} catch (IOException e) {}}}
将结果串设置到response中,返回给调用者!

1.3 cn.xinxing.json.status  这个包定义响应状态有关的。

1.3.1 StatusCode ,定义响应状态码

package cn.xinxing.json.status;/** *  * 返回code */public class StatusCode {public static String CODE_SUCCESS = "ok";//访问成功public static String CODE_ERROR = "0001"; //访问错误public static String CODE_ERROR_PARAMETER = "0002";//参数错误public static String CODE_ERROR_PROGRAM = "0003";//程序异常public static String CODE_ERROR_NO_LOGIN_OR_TIMEOUT = "0004";//未登录或登录超时,请重新登录public static String CODE_ERROR_EXIST_OPERATION = "0005";//已操作}
这个类中定义了接口中使用到的所有响应状态码。具体的定义规则,都是开发者定义的!没有什么标准规范!

1.3.2 StatusHouse,将code和msg组装到一起,在使用时更加方便!

package cn.xinxing.json.status;/** * 状态封装类 * 将code和msg组合到一起,方便使用 */public class StatusHouse {public static StatusObject COMMON_STATUS_OK = new StatusObject(StatusCode.CODE_SUCCESS, "访问成功");public static StatusObject COMMON_STATUS_ERROR = new StatusObject(StatusCode.CODE_ERROR, "访问错误,错误码:(" + StatusCode.CODE_ERROR + ")");public static StatusObject COMMON_STATUS_NO_LOGIN_OR_TIMEOUT = new StatusObject(StatusCode.CODE_ERROR_NO_LOGIN_OR_TIMEOUT, "未登录或登录超时,请重新登录,错误码:(" + StatusCode.CODE_ERROR_NO_LOGIN_OR_TIMEOUT + ")");public static StatusObject COMMON_STATUS_ERROR_PROGRAM = new StatusObject(StatusCode.CODE_ERROR_PROGRAM, "程序异常,错误码:(" + StatusCode.CODE_ERROR_PROGRAM + ")");public static StatusObject COMMON_STATUS_ERROR_PARAMETER = new StatusObject(StatusCode.CODE_ERROR_PARAMETER, "参数错误,错误码:(" + StatusCode.CODE_ERROR_PARAMETER + ")");public static StatusObject COMMON_STATUS_EXIST_OPERATION = new StatusObject(StatusCode.CODE_ERROR_EXIST_OPERATION, "已操作,错误码:(" + StatusCode.CODE_ERROR_EXIST_OPERATION + ")");}
1.3.3 StatusObject  定义了拥有code和msg属性的对象,在上面的StatusHouse类中使用到!

package cn.xinxing.json.status;/** * 状态对象 */public class StatusObject {// 状态码private String code;// 状态信息private String msg;public StatusObject(String code, String msg) {super();this.code = code;this.msg = msg;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}}
1.4 cn.xinxing.json.utils 这个包是有关json解析的,只有一个JackJsonUtils 类。

1.4.1 JackJsonUtils ,因为项目中使用的是jackjson来处理json。

package cn.xinxing.json.utils;import com.fasterxml.jackson.databind.ObjectMapper;/** * jackjson */public class JackJsonUtils {static ObjectMapper objectMapper;/** * 解析json *  * @param content * @param valueType * @return */public static <T> T fromJson(String content, Class<T> valueType) {if (objectMapper == null) {objectMapper = new ObjectMapper();}try {return objectMapper.readValue(content, valueType);} catch (Exception e) {e.printStackTrace();}return null;}/** * 生成json *  * @param object * @return */public static String toJson(Object object) {if (objectMapper == null) {objectMapper = new ObjectMapper();}try {return objectMapper.writeValueAsString(object);} catch (Exception e) {e.printStackTrace();}return null;}}
这个类有两个方法,fromJson()和toJson(),他们分别是解析json和生成json字符串的!

好了,有关响应以及json这么多。有疑问的,请多看几遍!
二、cn.xinxing.model 这个包定义实体类。只有一个Students类,类中定义了几个属性,以及实现了get()和set()方法。此处就不展开了!

三、 cn.xinxing.service.student  定义一个服务层,用于提供数据以及封装下层实现。

3.1  StudentService 这是接口,定义了获取学生数据相关的方法。

package cn.xinxing.service.student;import java.util.List;import cn.xinxing.model.Students;/** * 获取学生数据接口 */public interface StudentService {public List<Students> getAllStudents();//获取所有的学生数据}

3.2 cn.xinxing.service.student.impl 这个包实现了上文中定义的接口,只有一个实现类StudentServiceImpl ,看具体实现,

package cn.xinxing.service.student.impl;import java.util.List;import cn.xinxing.business.StudentBusiness;import cn.xinxing.model.Students;import cn.xinxing.service.student.StudentService;/** * 接口实现 */public class StudentServiceImpl implements StudentService{@Overridepublic List<Students> getAllStudents() {// TODO Auto-generated method stubreturn StudentBusiness.getAllStudents(); //调用具体的获取学生数据方法}}
getAllStudents()方法只是调用了其他地方的获取数据的方法。这个地方就是这么简单!大笑

至此,项目中的全部代码都已经展示完了!相信仔细阅读这两篇文章后,大家应该对java web 接口开发有了更深的了解!如果,还有其他疑问,欢迎指出!

最后补上,例子下载地址。

PS:   这里还想再多说几句!java接口开发,这个在正式项目中,需要涉及很多方面的知识,例如,数据库使用框架来维护,整个服务部署至云服务上等等!想要掌握这些东西,需要花费很多的时间和精力!我自己是一直多Android应用,接口开发是自己的自学的。java 接口开发这几篇博文呢,都只是初级的入门级的,在正式项目中呢,肯定不能这样做。目前的还有需要学习很多东西,希望和大家一块学习!




原创 2016年06月15日 15:31:32

    前面两篇文章讲解了,接口服务的搭建以及接口的开发,如果你还未了解,可以先看看文章,java web开发(一) 环境搭建和 java web开发(二) 接口开发。本篇文章,结合后台接口服务和客户端。客户端从接口获取数据,然后展示。(客户端使用Android)。

一.接口服务创建。可以参考上篇文章,这儿就不啰嗦了!

二. 实现Android项目。

1.创建Android项目。相信大家都会吧!(就不多说了)

2.实现Json数据解析。上篇接口开发文章中提到,返回的Json数据有2种,一种是对象,另一种是数组。那么我们就需要实现两种格式的解析对象。

 首先,需要创建一个基类,内部有三个字段,code、msg、time。具体实现如下:

public class Response implements Serializable {/** *  */private static final long serialVersionUID = 1L;private String code;// private String msg;private Long time = new Date().getTime();public String getCode() {return code;}public void setCode(String code) {this.code = code;}/** * @return the time */public Long getTime() {return time;}/** * @param time *            the time to set */public void setTime(Long time) {this.time = time;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public void setContent(String code, String msg) {this.code = code;this.msg = msg;}}

该类是所有json解析类的基类,封装了服务器返回的一些信息。

 2.1 对象。

public class EntityResponse<T> extends Response {private static final long serialVersionUID = 3750508105973880680L;private T object;public T getObject() {return object;}public void setObject(T object) {this.object = object;}}

该类继承自Response,用于返回json数据是单独对象的情况。

 2.2 数组。

public class ListResponse<T> extends Response  {private static final long serialVersionUID = 2857885317968129959L;private List<T> items;public List<T> getItems() {return items;}public void setItems(List<T> items) {this.items = items;}}

该类继承自Response,用于返回json数据是数组的情况。

 2.3 Json解析。解析Json使用的是Gson。

private static <T> T parseByGson(String json, TypeToken<T> typeToken) {Gson gson = new Gson();T result = gson.fromJson(json, typeToken.getType());String code = ((com.studentmaneagemobile.mobile.Response) result).getCode();String msg = ((com.studentmaneagemobile.mobile.Response) result).getMsg();//需要判断返回code是否是okif (code != null && code.equalsIgnoreCase("ok")) {return result;}return null;}
解析json,当code为‘ok’的时候,才认为返回json数据成功,此时才去解析json数据。传入返回json字符串和解析类型,例如

TypeToken<ListResponse<Students>> token = new TypeToken<ListResponse<Students>>() {};

 2.4 具体代码详解代码下载!

 2.5 运行。

 首先,启动接口服务,启动成功后,在浏览器中输入接口地址,例如出现如下截图表示接口服务启动成功,


接着,运行客户端代码,点击‘inq’按钮,效果图如下所示,


三. 总结。

   如果你做过Android或者Ios或者其他客户端开发,那么总是会需要后台服务提供接口。要实现这样的功能,简单的说可以分为2部分:

   1.接口服务开发。详情请看java web开发(一) 环境搭建和 java web开发(二) 接口开发。

   2.客户端开发。客户端需要,UI设计、网络、图片、数据库或者其他框架等等。

   PS: 这两部分,在前期设计的时候,需要好的架构师好好的设计一下!否则,在后期开发时,会遇到很大的问题!

  总结起来好像很简单,但是只有开发过的人,才知道其中的滋味!奋斗!“Good good study day day up”!

PS: 接口服务器代码, 接口服务demo下载地址

      客户端代码,客户端demo下载地址。

                             json格式化工具

推荐文章:SpringMVC 开发接口



博文中经常有小伙伴留言,说项目的许多问题,最近就推出几篇补坑的文章,打算这几篇文章详细解决项目中的代码以及业务流程,java web开发(四) 补坑1 java web开发(五) 接口开发补坑2欢迎大家查看!