由于当前智能手机的普及,且智能手机中Android用户占的比重也越来越大,这也就意味着有越来越多的人使用Android操作系统的手机。然而越来越多的网站论坛也都随即开发了自己的Android客户端,如网易、新浪新闻Android客户端以及百度贴吧、天涯、豆瓣Android客户端。对这些有人会说我不装客户端,用手机浏览器也可以进这些网站论坛啊,这的确是可以的。我们就用手机浏览器也可以访问这些论坛和网站的。

那随之而来的问题就是:我们为什么要开发一款Android客户端呢?对于这个问题,我想说明一下开发一款Android客户端有以下的几点好处:首先客户端确定性强,也就是我们进哪个网站的客户端,我看到就只是这个网站的信息,而不会看到其他网站的信息;再者,客户端容易定制,不管网站的界面开发的怎么样,在客户端上我们完全可以重新定义数据显示样式和各个界面;还有一点,客户端可以增加我们网站的流量,一个好的客户端相对于浏览器可以吸收更多的用户访问。上面简单说了开发一款客户端的几点好处,那如何为自己的网站开发一款Android客户端呢,接下来我们就来系统的介绍一下如何开发一个网站的Android客户端。

我们接下来的介绍将分节展开,首先我们今天讲到就是关于我们如何通过Android客户端来访问我们的服务器,也就是如何实现Android客户端与服务器的交互。这里说名一下我们使用的服务器端是Tomcat,数据库是使用的MySQL,然后整个网站是基于Java EE开发的,使用的开发模式是Jsp+Servlet。我们的网站是一个基于Java EE开发的一个专卖儿童用品的购物网站。那我们看一下我们的网站的主页效果,如下图所示:

a4c26d1e5885305701be709a3d33442f.png

我们这里的数据库包括的表有:记录商品信息的Product(商品)表,还有记录用户信息的User(用户)表,还有用于产品分类的Type(类型)表,以及用于购物车功能的Oder(订单)表。整个网站的基本功能在这里我们就不具体介绍了,我们主要讲解如何开发其Android客户端。

首先我们考虑如何通过Android客户端来实现用户登录的功能。我们要实现登录,那么在数据库这端我们需要查询的表即是User(用户)表,通过对用户登录时输入的用户名的“密码”字段的查询,来判断其输入的密码是否与查询的密码一致,若一致则登录成功,若不一致或查询的密码结果返回为空,则说明输入密码错误或者该用户名未注册,那么登录失败。所以我们可以对请求端返回对应的信息。如下代码我们在服务器端建立一个Servlet用于用户登录的逻辑操作。我们给这个文件命名为:UserServlet.java,然后下面就是我们这个Servlet的具体实现代码:

package com.wust.babyhousing.servlet;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import com.wust.babyhousing.dao.UserDao;

import com.wust.babyhousing.daoimpl.UserDaoImpl;

import com.wust.babyhousing.entity.User;

public class UserServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setCharacterEncoding("UTF-8");//设置编码格式

request.setCharacterEncoding("UTF-8");

String uName=request.getParameter("userName");//获取用户名

String uPass=request.getParameter("pwd");//获取密码

String client="pc";//pc为默认客户端类型

//获取客户端类型

if(request.getParameter("client")!=null)client=request.getParameter("client");

String mgs="";

UserDao userDao=new UserDaoImpl();

User user=userDao.findUser(uName);

if(user!=null&&user.getuPass()!=null&&user.getuPass().equals(uPass)){

if(client.equals("android")){//如果为Android客户端,则返回true,表示登录成功

PrintWriter out = response.getWriter();

out.print("true");

}else{//如果不是Android客户端,则跳转到登录成功的页面

HttpSession session=request.getSession();

session.setAttribute("user", user);

mgs="index.jsp";

request.getRequestDispatcher(mgs).forward(request, response);

}

}else{

if(client.equals("android")){//如果为Android客户端,则返回false,表示登录失败

PrintWriter out = response.getWriter();

out.print("false");

}else{//如果不是Android客户端,这显示登录失败的页面

mgs="login.jsp";

request.getRequestDispatcher(mgs).forward(request, response);

}

}

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);//调用doGet方法

}

}

在这里我们看到这里面传来的参数不只是有两个,还包括一个表示客户端类型的参数。也就是代码中的client这个String变量,它获取的是当前的客户端类型,我们默认的客户端类型为PC端,若是Android客户端登录我们会拿到“android”这个值,所以我们就可以返回不同的数据到对应客户端。若是PC端的客户端,我们就会跳转到对应的界面。而若是Android客户端,我们会返回true和false来判断到底是登录成功了,还是登录失败。其中在这个Servlet中我们使用到了一个我们自定义的类UserDao,对于这个类主要是用于我们的服务器与数据交互,我们通过findUser(uName)这个方法可以获取对于用户名的用户类的实体。这些类的及方法的源码大家完全可以自己实现,所以在这里我们就不在贴出了。那么我们可以看看Android客户端的源码该如何实现,下面是我们用户登录的部分源码:

public String send() {// 连接服务器,验证登录

String result = "";

String target = "http://172.16.9.15:8080/babyhousing/UserServlet";//登录验证地址

HttpClient httpclient = new DefaultHttpClient();

HttpPost httpRequest = new HttpPost(target);

List params = new ArrayList();

params.add(new BasicNameValuePair("userName", strName));//用户名

params.add(new BasicNameValuePair("pwd", strPwd));//密码

params.add(new BasicNameValuePair("client", "android"));//Android客户端标识

try {

httpRequest.setEntity(new UrlEncodedFormEntity(params, "utf-8"));

HttpResponse httpResponse = httpclient.execute(httpRequest);

if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

result += EntityUtils.toString(httpResponse.getEntity());

} else {

result = "请求失败!";

}

} catch (Exception e1) {

e1.printStackTrace();

}

return result;//返回结果

}

这是我们验证用户登录的一个方法,我们通过调用这个方法来实现登录验证。我们会把调用send()方法的结果放到一个String变量str里面。然后下面就是开始判断登录是否成功的步骤了。其中我们要注意上面服务器的登录验证地址,若是写错容易拿不到结果或者无法登录成功。我们要判断是否登录成功,只要调用一下str.contains("true"),也就是判断contains中是否包含“true”,若包含则显示登录成功,否则登录失败。我们做的是一个购物网站,做的是一个登录付款的功能,如下图我们就是登录付款的页面截图:

a4c26d1e5885305701be709a3d33442f.png a4c26d1e5885305701be709a3d33442f.png

通过上面的截图以及源码我们可以看到,我们由Android客户端登录服务器,其实不是很复杂,我们主要是实现在Android客户端这边将用户输入的信息进行简单处理,再通过网络传给服务器,服务器接到我们客户端的处理将会进行相应的处理操作。这些操作我们在Servlet里面实现就可以了。

好了,本节介绍到此结束,若还有问题可以留言,对于以上实现有兴趣的同学可以自己动手试试,尝试自己去实现一下。希望你会有收获!那么我们后续问题再讨论,谢谢!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐