【android】基于Android的搜索客户端应用团队项目(服务端)
之前写过一篇也是关于这个软件的,但写得不是很详细,而且那界面现在也已经改了。之所以要再将这个项目写清晰,一是因为有网友在问,二是由于该项目就是一个典型的C/S模型开发框架,服务器采用的是Tomcat(支持外网访问),客户端程序是基于Android移动终端平台,所以通过下面的一番总结,对自己或多或少还是有些帮助的。下面进入正题……
整个软件的基本架构是:服务端,客户端和数据库服务器三大部分的交互。客户端只与服务端进行交互,数据库服务器也只与服务端进行交互,所以我们可以先写服务端,然后远程访问数据库,将所获取的结果以适当的数据结构返回到客户端显示。
由于在开发项目过程中客户的需求可能会常常地变动,临时更换数据库的需求也是常常发生的,那我们要如何来解决这种跨数据库的功能呢,这里就要使用到抽象工厂模式了,工厂模式常常用于创建多系列化的对象。
一个简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承
自一个父类或接口)的实例。该模式中包含的角色及其职责有:
工厂(Creator)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
public class RequestProcessorFactory { public static RequestProcessor getRequestProcessor(String requestType, String paraStr) { RequestProcessor processor = null; if ("PRODUCT_REQUEST".equals(requestType)) { processor = new ProductRequestProcessor(paraStr); } else if ("LOCATION_REQUEST".equals(requestType)) { processor = new LocationRequestProcessor(paraStr); } else if ("ADDRESS_REQUEST".equals(requestType)) { processor = new AddressRequestProcessor(paraStr); } return processor; } }
抽象产品(Product)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
public abstract class RequestProcessor { protected abstract ........; //抽象方法,需要在子类中实现 }
具体产品(Concrete Product)角色:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
public class AddressRequestProcessor extends RequestProcessor { protected …… ; //父类中声明的需要在不同子类中定义的方法 } public class LocationRequestProcessor extends RequestProcessor { protected …… ; //父类中声明的需要在不同子类中定义的方法 } public class ProductRequestProcessor extends RequestProcessor { protected …… ; //父类中声明的需要在不同子类中定义的方法 }
这样客户端只需要创建具体工厂的实例,然后调用工厂对象的工厂方法就可以得到所需要的产品对象。
服务端的设计模式大概就这样了,接下来是数据库服务器与服务端之间的交互设计,本项目采用的是Hibernate,即符合Java习惯的关系数据库持久化语言,它对JDBC进行了非常轻量级的对象封装,使得我们可以随心所欲的使用对象编程思维来操纵数据库,Hibernate的大部分方法都封闭在一个辅助类HibernateUtil中,这是一个用来管理Hibernate Session的类,使用线程本地来存储Session,我们只需调用里面的currentSession方法获取当前session状态,以及closeSession方法关闭当前Session即可。另外还需要学会如何配置hibernate的配置与映射文件,网上很多教程,这里就不多说了。最后关于数据库的查询语言,假如数据库需要批量处理大数据时,那么对数据库的查询效率要求就比较高,这时HQL可能会是一个比较好的选择,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。但由于本人对HQL不是很了解,所以也只是采用SQL语言来操作。
@Override public void init() throws ServletException { // TODO Auto-generated method stub super.init(); HibernateUtil.getCurrentSession(); HibernateUtil.closeSession(); System.out.println("数据库连接成功!"); }
之后通过继承HttpServlet中的doPost方法来完成客房端发来的请求,首先设置请求的编码格式,再获取请示的类型与参数,通过请求工厂类生成具体的请求对象实例,最后处理请求获得结果。大功告成。
/** * 处理post请求 */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println(req.getSession().getServletContext().getRealPath( getServletInfo())); resp.setCharacterEncoding("utf-8"); //获取请求类型与请求参数 String requestType = req.getHeader("RequestType"); String parameter = req.getHeader("RequestParameter"); //生成请求 RequestProcessor requestProcessor = RequestProcessorFactory .getRequestProcessor(requestType, parameter == null ? null : URLDecoder.decode(parameter, "UTF-8")); if (null == requestProcessor) { return; } //处理请求 String result = requestProcessor.getResult(); //记录请求的处理状态 if (requestProcessor.getStatusCode() == StatusCode.STATUS_SUCCESS) { …… } else { …… } }