android 获取网络连接(登陆验证+获取数据)

本文介绍如何在Android应用中实现用户登录验证,通过JSON数据格式与后台进行交互。涉及数据库操作、Servlet编程及JSON数据封装等内容。

android获取网络连接及相关事件


  在android 中,仅仅是UI设计 ,还不能满足用户的一些需求,相应的如果用户需要登陆到app,我们就要进行一些认证了。本篇主要记录的是通过网络连接到后台,从数据库中查找验证用户的合法性。


  首先我们需要一些后台的支持,这里是建立在有mysql数据库,切建立了相应的用户表,同时实现了对用户表的一些增删查修的service类,以便能够对数据库进行操作。这些操作也都是建立在能够连接数据库的基础上的,如果对于这些的基础的操作不是太了解的话,可以参考我的以下的博客

1.MySql 命令大全

2.JDBC连接数据库

3.Statement的详细用法(数据库操作时用到)



此时,你已能够简单的从数据库里面获取东西,插入东西,删除东西,更新条目了。


现在,需要建立一个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<competitor> 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<String ,Object>  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<String , Object> 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);
			<span style="font-size:18px;"></span><pre name="code" class="java">         //这部分是字自己写的封装的类,将一些信息封装到json数据里面了<pre>		}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();}}
	


 
 

 

 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值