Android实现上传更新至服务器(一)服务器端

预览

在手机APP上实现运维工单管理功能:创建、查看、执行、分享、删除……所有的数据(文本、图片)将实时更新至阿里云服务器中
Android实现上传更新至服务器(一)服务器端
Android实现上传更新至服务器(一)服务器端

Android实现上传更新至服务器(一)服务器端
Android实现上传更新至服务器(一)服务器端
Android实现上传更新至服务器(一)服务器端
Android实现上传更新至服务器(一)服务器端

服务器架构

服务器架构:Apache Tomcat+MySql,这部分是0基础,直接学习衷水木的系列技术完成服务器架构

【一步一个脚印】Tomcat+MySQL为自己的APP打造服务器

数据库设计

在MySql中建立工单模型,使用Navicat for MySql工具可视化操作数据库。
Android实现上传更新至服务器(一)服务器端

类型 备注
state 工单状态 0→未完成;1→已完成
type 工单类型 0→计划任务;1→异常维护;2→随工运维
image 执行图片记录 只存图片地址,用";"分割
  • 工单含3种状态:已完成逾期(截止时间endtime已过);计划中(endtime未到)
  • 在task(工单任务)、log(运维记录)、image(图片记录)中用“;”分割不同子项

后台服务设计

编程工具:Eclipse,基于Servlet开发,运行于Apache Tomcat上
Android实现上传更新至服务器(一)服务器端

工单模型

public class Workorder{
	private String id;
	private int woState;
	private int woType;
	private String title;
	private String tasks;
	private Date time;
	private Date endTime;
	private String location;
	private String worker;
	private String workLog;
	private String workImageUrl;
	private String woCreater;
	
	//************************************************************
	//*get and set block
	//************************************************************
	//由Json生成工单Workorder
	public static Workorder initWithJson(JSONObject jsonObject) {
		……
	}
	
}
public class DBUtil {

	public static String getQuerySqlById(String table,String id,String start,String end) {
		……
	}
	
	public static String getInsertSql(String table,BaseModel model) {
		……
	}
	
	public static String getUpdateSql(String table,BaseModel model) {
		……
	}
	
	public static String getDeleteSql(String table,BaseModel model) {
		……
	}
	
	//数据库连接
	public static Connection getConnection() {
		//注意加serverTimezone=GMT&useSSL=false防止出错
		String url="jdbc:mysql://localhost:3306/eds_mysql_workorder?serverTimezone=GMT&useSSL=false";
		Connection connection=null;
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			//MySql中设定的用户名,密码
			connection=(Connection)DriverManager.getConnection(url,"用户名","密码");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return connection;
	}

}

查询工单Servlet

@WebServlet("/QueryWorkorderServlet")
public class QueryWorkorderServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 解决中文格式乱码
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		String message=null;
		String resultCode="0";
		String id=request.getParameter("id");
		String time=request.getParameter("time");
		String endtime=request.getParameter("endtime");
		Connection connection=DBUtil.getConnection();
		if(!StringUtils.isNullOrEmpty(id)&&connection!=null){
			try {
				Statement statement=connection.createStatement();
				String querySql=DBUtil.getQuerySqlById(DBUtil.TABLE_WORKORDER, id,time,endtime);
				ResultSet resultSet=statement.executeQuery(querySql);
				//返回Json数据
				StringBuilder stringBuilder=new StringBuilder();
				stringBuilder.append("[");
				while (resultSet.next()) {
					stringBuilder.append("{");
					stringBuilder.append("\"id\":\""+resultSet.getString("id")+"\",");
					……
					stringBuilder.append("},");
				}
				stringBuilder=MyStringUtil.removeLastStr(stringBuilder, ",");
				stringBuilder.append("]");
				message=stringBuilder.toString();
				resultCode="1";
			} catch (SQLException e) {
				e.printStackTrace();
				message=e.getMessage();
				resultCode="-1";
			}
		}else {
			message="id or mysql_connection is null";
			resultCode="0";
		}
		
		HashMap<String,String> msgMap=new HashMap<>();
		msgMap.put("resultCode", resultCode);
		msgMap.put("message", message);
		PrintWriter writer=response.getWriter();
		writer.println(message);
		writer.flush();
	}
}

更新工单(增、改、删)Servlet

@WebServlet("/UpdateWorkorderServlet")
public class UpdateWorkorderServlet extends HttpServlet {

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//防止中文乱码
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		String message=null;
		int resultCode=0;
		//获取Json数据,生成工单对象
		BufferedReader reader= request.getReader();
		StringBuffer stringBuffer=new StringBuffer();
		String line=null;
		while((line=reader.readLine())!=null){
			stringBuffer.append(line);
		}
		String jsonString=stringBuffer.toString();
		JSONObject jsonObject=JSONObject.fromObject(jsonString);
		Workorder workorder=Workorder.initWithJson(jsonObject);
		
		Connection connection=DBUtil.getConnection();
		if(!StringUtils.isNullOrEmpty(workorder.getId())&&connection!=null){
			try {
				Statement statement=connection.createStatement();
				//查询此工单是否存在:分别执行删除(title为空),新增,更新等操作
				String sqlQuery=DBUtil.getQuerySqlById(DBUtil.TABLE_WORKORDER, workorder.getId(),null,null);
				ResultSet resultSet=statement.executeQuery(sqlQuery);
				String sqlUpdate=null;
				//title为空时执行删除工单
				boolean isDelete=StringUtils.isNullOrEmpty(workorder.getTitle());
				if(resultSet.next()){
					sqlUpdate=isDelete?DBUtil.getDeleteSql(DBUtil.TABLE_WORKORDER, workorder):DBUtil.getUpdateSql(DBUtil.TABLE_WORKORDER,workorder);
				}else {
					sqlUpdate=isDelete?null:DBUtil.getInsertSql(DBUtil.TABLE_WORKORDER, workorder);
				}
				int update=sqlUpdate==null?0:statement.executeUpdate(sqlUpdate);
				if(update==1){
					message=String.format("update ID:%s success",workorder.getId());
					resultCode=1;
				}else {
					message=String.format("update ID:%s failed",workorder.getId());
					resultCode=-1;
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				resultCode=0;
				message=e.getMessage();
			}
			
		}else {
			message="id or mysql_connection is null";
			resultCode=0;
		}
		
		String result=String.format("{\"resultCode\":%s,\"message\":\"%s\"}",resultCode,message);
		PrintWriter writer= response.getWriter();
		writer.println(result);
		writer.flush();
	}

}

上传图片/文件Servlet

@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {

	@SuppressWarnings("deprecation")
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		String message=null;
		int resultCode=0;
		//图片将存放于upload文件夹中
		DiskFileItemFactory factory=new DiskFileItemFactory();
		String path=request.getRealPath("/upload");
		File file=new File(path);
		if(!file.exists()){
			file.mkdirs();
		}
		factory.setRepository(new File(path));
		factory.setSizeThreshold(1024*1024);
		ServletFileUpload upload=new ServletFileUpload(factory);
		
		try {
			java.util.List<FileItem> list = (java.util.List<FileItem>)upload.parseRequest(request);
			for(FileItem item:list){
				String name=item.getFieldName();
				if(item.isFormField()){
					String value=item.getString();
					request.setAttribute(name, value);
				}else {
					String value=item.getName();
					int start=value.lastIndexOf("\\");
					String fileName=value.substring(start+1);
					request.setAttribute(name, fileName);
					item.write(new File(path,fileName));
					message="upload: "+fileName+" success.";
					resultCode=1;
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			message="upload failed.";
			resultCode=-1;
		}
		
		String result=String.format("{\"resultCode\":%s,\"message\":\"%s\"}",resultCode,message);
		PrintWriter writer= response.getWriter();
		writer.println(result);
		writer.flush();
	}

}

API说明

Android实现上传更新至服务器(一)服务器端
Android实现上传更新至服务器(一)服务器端
Android实现上传更新至服务器(一)服务器端