android获取网络连接及相关事件
在android 中,仅仅是UI设计 ,还不能满足用户的一些需求,相应的如果用户需要登陆到app,我们就要进行一些认证了。本篇主要记录的是通过网络连接到后台,从数据库中查找验证用户的合法性。
首先我们需要一些后台的支持,这里是建立在有mysql数据库,切建立了相应的用户表,同时实现了对用户表的一些增删查修的service类,以便能够对数据库进行操作。这些操作也都是建立在能够连接数据库的基础上的,如果对于这些的基础的操作不是太了解的话,可以参考我的以下的博客
此时,你已能够简单的从数据库里面获取东西,插入东西,删除东西,更新条目了。
现在,需要建立一个web项目。这时,一些上面提到的东西都就可以分包归纳,以便于管理。
那么现在,就需要写一写给android后台提供数据的源代码了。
这里我主要是通过写一些servlet程序,给android提供后台的支持。
关于为什么要写servlet ,主要是,我最近写的一些的web 项目是用MVC框架模式写的。
可以参考我的博客:MVC相关内容
现在,最基本的东西已经就绪。
先说一下,android与后台是怎么进行数据传输的:通常,有两种传输的方式,一种是以XML的方式传输,另外一种是封装成JSON数据,以字符串的方式传输,(当然,关于封装成json数据,我们可以用网上一些打包好的类,也可以用自己的方式封装数据,关键是解析json数据的时候,要自己或他人能够解析出来。)在这里我用的是封装成json数据。
关于如何解析json数据的,会新开一篇博文详细介绍。
好了,一切就绪,我们就开干了。
首先写后台的返回请求数据的servlet程序(其实就是xxx.java的java程序)。
这里是以最近做的网球赛事管理系统作为例子的:
这时为android建立的包:
这里是登录后台的源码,下面,就来解释一下:
1.设置对提交数据的处理。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
doPost(request, response);
}
对于以GET方式提交的数据,在这里我们也是以 处理以POST方式提交的的程序 来处理。
关于request 与response,就是两个HttpServletRequest,与HttpServletResponse类型的对象,主要是一些参数信息,以及一些对象。同时里面包含了一些基本的方法。
2.设置字符编码,防止乱码。
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
上面的是设置字符的编码,通常与android端设置的相对应。
3.获取参数
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
从请求对象中获取参数,这里的请求对象,是由客户端向服务端的请求。
这里获取的是用户名和密码两个参数。
4.定义及声明一些稍后用到的引用变量。
competitorManager cpm = new competitorManagerimpl();
competitor cp =null;
String json=null;
StringBuilder sb = new StringBuilder();
PrintWriter out = response.getWriter();
String json1 ;
其中,competitorManager 是一个自己编写的对数据库competitor表操作的管理的接口,里面包含了一些对competitor操作的声明。其定义如下:
package cn.hpu.tennisGame.service;
import java.util.List;
import cn.hpu.tennisGame.model.competitor;
public interface competitorManager {
List selectAll();
boolean addC(competitor c);
boolean deleteC(competitor c);
boolean updateC(competitor c);
competitor selectOne(int id );
competitor selectOne(String name);
}
具体的实现稍后将会以源码贴出,现在知道,是怎么回事就行了,
competitor selectOne(String name); 是从数据库中通过名字把这条项目的信息抽出,然后以competitor对象的形式返回,(就是将信息放到了对象里面,。),
关于competitor类,是写的一个model类,关于model类的描述,最后也会以代码的形式展现。
里面主要是,一些相关的属性。
PrintWriter out = response.getWriter(); 这个是冲响应对象获取打印对象。稍后将数据直接向外打印。
StringBuilder 是字符串生成器,在追加,插入字符(串)方面,性能好于StringBuffer ,.
这里是如果自己装配json数据的话,会用到,目前,这里用不到。因为,这里是用.jar包里面提供的类。
5.获取密码,并且判断是否相同,根据情况返回数据。
try {
cp = cpm.selectOne(name);
pwd =Integer.toString( (Integer.toString(pwd.hashCode())+cp.getUsername()).hashCode());
System.out.println(cp.getPassword());
if(cp==null)
{
json= AppInterface.toJson(0,"failed" , "User doesn't exist !");
}
else if(cp.getPassword().equals(pwd)){
json= AppInterface.toJson(1,"success" , cp);
}else {
json= AppInterface.toJson(0,"failed" , "The password id wrong !");
}
out.write(json);
out.flush();
out.close();
} catch (Exception e) {
// TODO: handle exception
System.out.println(this.getServletName()+"#########"+e.getStackTrace());
}
json是一个String 类型的字串。
5.1这里主要是,通过名字活取一个条目(封装在对象里面了)。
5.2取得从参数中获取的密码,经过一个求哈希值的运算,得到最终密码(数据库中存的密码)。
5.3从对象中获取用户密码。并且判断是否与用户输入密码的最终密码相同。如果相同,则以一种方式封装json数据信息,里面主要是状态码,信息,对象。
如下: 下面的方法在AppInterface里面
public static String toJson(int code ,String msg ,Object obj)
{
String str="";
Map map = toMap(code ,msg ,obj);
JSONObject jObject = JSONObject.fromObject(map);
return jObject.toString();
}//这个方法中的obj是一个含有一个对象信息的对象。,也可以是一个含有多个对象的map对象的list数组
public static String toJson(String msg,Object obj)
{
String str="";
Map map = toMap( msg, obj);
JSONObject jObject = JSONObject.fromObject(map);
return jObject.toString();
}
5.4 通过刚才的out,把json数据打印出去,
out.write(json);
out.flush();
out.close();
下面的是:
android_login.java
package cn.hpu.tennisGame.android_servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.hpu.tennisGame.Interface.app.util.AppInterface;
import cn.hpu.tennisGame.model.competitor;
import cn.hpu.tennisGame.service.competitorManager;
import cn.hpu.tennisGame.service.competitorManagerimpl;
import net.sf.json.JSONObject;
/**
* Servlet implementation class android_login
*/
@WebServlet("/android_login")
public class android_login extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public android_login() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//doGet(request, response);
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
competitorManager cpm = new competitorManagerimpl();
competitor cp =null;
String json=null;
StringBuilder sb = new StringBuilder();
PrintWriter out = response.getWriter();
String json1 ;
try {
cp = cpm.selectOne(name);
pwd =Integer.toString( (Integer.toString(pwd.hashCode())+cp.getUsername()).hashCode());
System.out.println(cp.getPassword());
if(cp==null)
{
/*sb.append("[{");
sb.append("\"isSuccess\":");
sb.append("\"no\"");
sb.append("}]");
out.write("wrong");
System.out.println("nnnnnnnnnnnnn");
*/
json= AppInterface.toJson(0,"failed" , "User doesn't exist !");
}
else if(cp.getPassword().equals(pwd)){
/*sb.append("[{");
sb.append("\"isSuccess\":");
sb.append("\"yes\"");
sb.append("},");
sb.append("{");
sb.append(',');
sb.append("\"username\":\"").append(cp.getUsername()).append("\",");
sb.append("\"realname\":\"").append(cp.getRealname()).append("\",");
sb.append("\"matchage\":").append(cp.getMatchage()).append(',');
sb.append("\"borth\":\"").append(cp.getBorth()).append("\",");
sb.append("\"address\":\"").append(cp.getAddress()).append("\",");
sb.append("\"sex\":\"").append(cp.getSex()).append("\",");
sb.append("\"password\":\"").append(cp.getPassword()).append("\",");
sb.append("\"id\":").append(cp.getId());
sb.append("}]");*/
json= AppInterface.toJson(1,"success" , cp);
//这部分是字自己写的封装的类,将一些信息封装到json数据里面了
}else {json= AppInterface.toJson(0,"failed" , "The password id wrong !");}out.write(json);out.flush();out.close();} catch (Exception e) {// TODO: handle exceptionSystem.out.println(this.getServletName()+"#########"+e.getStackTrace());}out = response.getWriter();out.write(sb.toString());out.flush();out.close();}}