Android无线点餐系统
——服务器端的实现
学 院:计算机与信息工程学院
班 级:10软件技术1班
姓 名:
学 号:
同 组 者:
指导教师:
1. 服务器端的实现
服务器端功能
主控计算机处理各无线终端发送过来的数据信息并进行处理、加工(必要的情况下还进行信息回馈)以及发送,从而进行控制、结算、统计、结账打印以及管理等一系列职能操作。
服务端主要是数据库操作,针对无线终端各模块而设置响应相应功能的服务器小程序。主要包括:响应登录的Servlet、响应订单的Servlet、响应开桌的Servlet、响应并台的Servlet、响应转台的Servlet、响应查台的Servlet、响应更新桌号的Servlet、响应更新菜谱的Servlet、响应结算的Servlet、响应订单信息的Servlet等。
当操作员点结账的时候另一个Servlet启动,其作用就是讲该订单的标志位修改,并且将该桌子的状态设置成没人,其实就是根据订单号查询到桌子号,将该桌子的falg位置设置为0。
图 1 服务器功能图
1. 服务器各模块设计
2.1登录
当服务器访问loginservlet的时候,服务器得到用户的登录名和密码,该servlet的任务就是通过查询数据库,如果没有该用户或者密码不对返回0;如果有,并且密码正确,则返回一段有规则的字符串,包括用户id和名字。
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
UserDao dao = new UserDaoImpl();
// 获得客户端请求参数
String username = request.getParameter("account");
String password = request.getParameter("password");
User u = dao.login(username, password);
if(u!=null){
// 响应客户端内容,登录成功
out.print(build(u));
}else{
// 响应客户端内容,登录失败
out.print("0");
}
out.flush();
out.close();
}
private String build(User u){
String userMsg = "";
userMsg+="id="+u.getId();
userMsg+=";";
userMsg+="name="+u.getName();
return userMsg;
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
public void init() throws ServletException {
}
public LoginServlet() {
super();
}
public void destroy() {
super.destroy();
}
}
2.2更新
更新的Servlet主要有两个,一个是更新菜谱,另一个是更新桌子。主要是考虑到饭店的菜谱和桌子不可能一成不变,将软件的扩展性增强。当饭店的菜谱或者桌子更新的时候,操作员就可以将手机的数据库SQLITE和服务器的数据库的数据同步。
这两个Servlet的工作原理就是查询table表和menu表 组成一个xml文件并且返回给客户端。
public class UpdateServlet extends HttpServlet {
// 构造方法
public UpdateServlet() {
super();
}
// 销毁方法
public void destroy() {
super.destroy();
}
// 响应Get请求
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/xml");
PrintWriter out = response.getWriter();
// 实例化dao
UpdateDao dao = new UpdateDaoImpl();
// 获得菜谱列表
List list = dao.getMenuList();
// 拼XML格式数据
out.println("<?xml version='1.0' encoding='UTF-8'?>");
// 根节点
out.println("<menulist>");
for (int i = 0; i <list.size(); i++) {
Menu m = (Menu)list.get(i);
out.println("<menu>");
// 菜谱编号
out.print("<id>");
out.print(m.getId());
out.println("</id>");
// 分类
out.print("<typeId>");
out.print(m.getTypeId());
out.println("</typeId>");
// 名称
out.print("<name>");
out.print(m.getName());
out.println("</name>");
// 图片路径
out.print("<pic>");
out.print(m.getPic());
out.println("</pic>");
// 价格
out.print("<price>");
out.print(m.getPrice());
out.println("</price>");
// 备注
out.print("<remark>");
out.print(m.getRemark());
out.println("</remark>");
out.println("</menu>");
}
out.println("</menulist>");
out.flush();
out.close();
}
// 响应Post请求
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
// 初始化方法
public void init() throws ServletException {
}
}
2.3结账
结账的Servlet有两个,一个是当操作员发来order编号的时候,改Servlet查询订单表,拼成一个网页发送到手机,这样的好处就是手机不能修改订单信息。
当操作员点结账的时候另一个Servlet启动,其作用就是讲该订单的标志位修改,并且将该桌子的状态设置成没人,其实就是根据订单号查询到桌子号,将该桌子的falg位置设置为0。
PayServlet比较复杂,核心代码如下:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 实例化DAO
PayDao dao = new PayDaoImpl();
// 获得订单ID
String id = request.getParameter("id");
// 查询订单信息
QueryOrder qo = dao.getOrderById(Integer.parseInt(id));
// 查询订单详细列表
List list = dao.getOrderDetailList(Integer.parseInt(id));
// 拼HTML页面展示
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01
Transitional//EN\">");out.println("<HTML>");out.println(" <HEAD></HEAD>");
out.println(" <BODY>");out.print("<table>");out.print("<tr>");
out.print("<th>");out.print("订单编号");out.print("</th>");
out.print("<th>");out.print("下单时间");out.print("</th>");out.print("<th>");
out.print("服务员"); out.print("</th>");out.print("<th>");
out.print("人数");out.print("</th>");out.print("<th>");out.print("桌号");
out.print("</th>");out.print("</tr>");out.print("<tr>");out.print("<td>");
out.print(id);out.print("</td>");out.print("<td>");
out.print(qo.getOrderTime());out.print("</td>");out.print("<td>");
out.print(qo.getName());out.print("</td>");out.print("<td>");
out.print(qo.getPersonNum());out.print("</td>");out.print("<td>");
out.print(qo.getTableId());out.print("</td>");out.print("</tr>");
out.print("<tr>");out.print("<th>");out.print("菜名");out.print("</th>");
out.print("<th>");out.print("价格");out.print("</th>");out.print("<th>");
out.print("数量");out.print("</th>");out.print("<th>");out.print("总计");
out.print("</th>");out.print("<th>");out.print("备注");out.print("</th>");
out.print("</tr>");
for (int i = 0; i < list.size(); i++) {
QueryOrderDetail qod = (QueryOrderDetail) list.get(i);
String name = qod.getName();
int price = qod.getPrice();
int num = qod.getNum();
int total = qod.getTotal();
String remark = qod.getRemark();
out.print("<tr>");
out.print("<td>");
out.print(name==null?"":name);
out.print("</td>");
out.print("<td>");
out.print(price==0? "" :price+"");
out.print("</td>");
out.print("<td>");
out.print(num==0? "" :num+"");
out.print("</td>");
out.print("<td>");
out.print(total);
out.print("</td>");
out.print("<td>");
out.print(remark==null?"":remark);
out.print("</td>");
out.print("</tr>");
}
out.print("</table>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();