Android HttpServlet Json 数据交互

Android 对其访问进行封装

Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
Callable和Runnable有几点不同:
 (1)Callable规定的方法是call(),而Runnable规定的方法是run().
 (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
 (3)call()方法可抛出异常,而run()方法是不能抛出异常的。
 (4)运行Callable任务可拿到一个Future对象,
Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。

 

客户端通过Json获取服务端数据

/**
 *
 */
package org.crazyit.auction.client.util;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
/**
 * Description:
 * <br/>网站: <a href="http://www.crazyit.org">疯狂ava联盟</a>
 * <br/>Copyright (C), 2001-2014, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author  Yeeku.H.Lee [email protected]
 * @version  1.0
 */
public class HttpUtil
{
    // 创建HttpClient对象
    public static HttpClient httpClient = new DefaultHttpClient();
    public static final String BASE_URL =
        "http://10.10.9.51:8080/auction/android/";
    /**
     *
     * @param url 发送请求的URL
     * @return 服务器响应字符串
     * @throws Exception
     */
    public static String getRequest(final String url)
        throws Exception
    {
        FutureTask<String> task = new FutureTask<String>(
        new Callable<String>()
        {
            @Override
            public String call() throws Exception
            {
                // 创建HttpGet对象。
                HttpGet get = new HttpGet(url);
                // 发送GET请求
                HttpResponse httpResponse = httpClient.execute(get);
                // 如果服务器成功地返回响应
                if (httpResponse.getStatusLine()
                    .getStatusCode() == 200)
                {
                    // 获取服务器响应字符串
                    String result = EntityUtils
                        .toString(httpResponse.getEntity());
                    return result;
                }
                return null;
            }
        });
        new Thread(task).start();
        return task.get();
    }

    /**
     * @param url 发送请求的URL
     * @param params 请求参数
     * @return 服务器响应字符串
     * @throws Exception
     */
    public static String postRequest(final String url
        , final Map<String ,String> rawParams)throws Exception
    {
        FutureTask<String> task = new FutureTask<String>(
        new Callable<String>()
        {
            @Override
            public String call() throws Exception
            {
                // 创建HttpPost对象。
                HttpPost post = new HttpPost(url);
                // 如果传递参数个数比较多的话可以对传递的参数进行封装
                List<NameValuePair> params = 
                    new ArrayList<NameValuePair>();
                for(String key : rawParams.keySet())
                {
                    //封装请求参数
                    params.add(new BasicNameValuePair(key 
                        , rawParams.get(key)));
                }
                // 设置请求参数
                post.setEntity(new UrlEncodedFormEntity(
                    params, "gbk"));
                // 发送POST请求
                HttpResponse httpResponse = httpClient.execute(post);
                // 如果服务器成功地返回响应
                if (httpResponse.getStatusLine()
                    .getStatusCode() == 200)
                {
                    // 获取服务器响应字符串
                    String result = EntityUtils
                        .toString(httpResponse.getEntity());
                    return result;
                }
                return null;
            }
        });
        new Thread(task).start();
        return task.get();
    }
}

服务端

public class BaseServlet extends HttpServlet
{
    private ApplicationContext ctx;
    public void init(ServletConfig config)
        throws ServletException
    {
        super.init(config);
        // 获取Web应用中的ApplicationContext实例
        ctx = WebApplicationContextUtils
            .getWebApplicationContext(getServletContext());
    }
    // 返回Web应用中的Spring容器
    public ApplicationContext getCtx()
    {
        return this.ctx;
    }
}
@WebServlet(urlPatterns="/android/login.jsp")
public class LoginServlet extends BaseServlet
{
    public void service(HttpServletRequest request ,
        HttpServletResponse response)
        throws IOException , ServletException
    {
        String user = request.getParameter("user");
        String pass = request.getParameter("pass");
        // 获取系统的业务逻辑组件
        AuctionManager auctionManager = (AuctionManager)getCtx().getBean("mgr");
        // 验证用户登录
        int userId = auctionManager.validLogin(user , pass);
        response.setContentType("text/html; charset=GBK");
        // 登录成功
        if (userId > 0)
        {
            request.getSession(true).setAttribute("userId" , userId);
        }
        try
        {
            // 把验证的userId封装成JSONObject
            JSONObject jsonObj = new JSONObject()
                .put("userId" , userId);
            // 输出响应
            response.getWriter().println(jsonObj.toString());
        }
        catch (JSONException ex)
        {
            ex.printStackTrace();
        }
    }
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。