一 核心Servlet设计思路
前面很简略的设计了数据表和Bean结构,以及Dao层的数据访问,没有设计任何复杂设计,这部分开始,逐步向核心的服务端设计延展。
传统的JavaWeb项目中,每一个Servlet都被作为请求的处理程序,这里我对请求处理的公共部分抽离出来,单独封装在一个核心Servlet中,所有的请求都经它进行处理,它的主要功能如下:
- 分发请求到具体的Servlet
- 拼装应答为JSON格式并相应给客户端
- 提供常用的公用的方法
大致的思路如上,实现过程中可能会设计较多且较为复杂的逻辑,比如说如何分发请求到具体的Servlet处理,如何在应答的时候如何进行JSON拼装,应答的时候如何处理带有回调的请求等等,接下来我们逐一分解。
二 设计公用应答模型
我们将每一笔请求的应答先做一个封装,这样对于所有的Servlet而言,其应答均要满足共用应答的格式,这样做也便于做JSON的序列化。
这个应答模型前期设置较为简单的几个属性即可:
- 应答码,由应用判断请求成功与否
- 应答信息,一般仅做调试及请求失败时分析用
- 应大数据,服务端将查询、处理后的数据返回给请求端
- 请求处理耗时,仅作性能分析用
package com.bubbling.servlet.base;
/**
* 公用应答模型,每笔请求进入后进行初始化 <br>
* 对请求的应答设置响应码,响应信息及响应数据 <br>
* 为了性能分析用,我们还设置了请求处理耗时
*
* @author 胡楠
*
*/
public class IResponse
{
private String code;
private String message;
private Object data;
private int elapsedTime;
public IResponse()
{
this(null, null, null, 0);
}
public IResponse(String responseCode, String message, Object data, int elapsedTime)
{
this.code = responseCode;
this.message = message;
this.data = data;
this.elapsedTime = elapsedTime;
}
public String getCode()
{
return code;
}
public void setCode(String responseCode)
{
this.code = responseCode;
}
public String getMessage()
{
return message;
}
public void setMessage(String message)
{
this.message = message;
}
public Object getData()
{
return data;
}
public void setData(Object data)
{
this.data = data;
}
public int getElapsedTime()
{
return elapsedTime;
}
public void setElapsedTime(int elapsedTime)
{
this.elapsedTime = elapsedTime;
}
}
三 设计公用服务异常
服务层处理所有请求的业务逻辑,包括参数校验、数据访问及文件处理,这些逻辑需要一个公用的异常类型来处理,这个异常并不会抛至应答处理逻辑中,仅仅为应答处理提供错误码及错误信息,所以该类的设计如下:
package com.bubbling.common;
/**
* 公用服务异常,仅供业务层处理使用 <br>
* 当业务逻辑处理失败,包括参数校验失败、数据访问失败、文件操作失败等各种场景下抛出 <br>
* 该异常在应答前结束作用域,对应答拼装提供错误码及错误信息
*
* @author 胡楠
*
*/
public class ServiceException extends Exception
{
private static final long serialVersionUID = 1L;
private String code;
private String info;
public ServiceException(String code)
{
this(code, null);
}
public ServiceException(String code, String info)
{
this.code = code;
this.info = info;
}
public String getCode()
{
return code;
}
public void setCode(String code)
{
this.code = code;
}
public String getInfo()
{
return info;
}
public void setInfo(String info)
{
this.info = info;
}
@Override
public String getMessage()
{
return toString();
}
@Override
public String toString()
{
return "ServiceException [code=" + code + ", info=" + info + "]";
}
}