假期学习记录12(android与web服务器之间的list/json数组的消息传递)

今天开发遇到了android从服务器上要获取一个列表的信息,记不大清了还得去看以前的项目,现在将代码发博客记录一下

下面是服务器中的servlet中的代码,主要看doget就可以了,安卓将向这个servlet发送请求,然后这个servlet会返回给android一个信息,然后进行解析

SportNew其实就是一个类,WriteSportNew.loadSportNew(demand);是一个select的查询列表的函数就不多说了,应该会一点数据库都没问题。

package org.java.servlet;

import java.io.IOException;
import java.util.ArrayList;

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 org.java.myclass.SportNew;
import org.java.write.WriteSportNew;
import org.json.JSONArray;
import org.json.JSONObject;



/**
 * Servlet implementation class getSportNewMess
 */
@WebServlet("/getSportNewMess")
public class getSportNewMess extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public getSportNewMess() {
        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
        String demand=request.getParameter("demand");
        ArrayList<SportNew> sportNews=WriteSportNew.loadSportNew(demand);
        JSONArray jsonarray = new JSONArray();
        for(SportNew sportNew:sportNews) {
            JSONObject jo = new JSONObject();
            jo.put("newName",sportNew.getNewName());
            jo.put("imageName",sportNew.getImageName());
            jo.put("weblink", sportNew.getWeblink());
            jsonarray.put(jo);
        }
        System.out.print("jsonArray="+jsonarray);
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().print(jsonarray);
    }

    /**
     * @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);
    }

}



然后我们在android项目中新建NetUtil类代码如下,一共两个函数第一个函数是访问servlet的,给servlet传了一个demand的值,第二个函数是必须要有的解析函数,一个文件中第一个类型的函数可以写很多,但是第二个函数写一个就可以了。一会儿我们将会在Activity的java中调用第一个函数

public class NetUtil {
    public static String getSportNewMes(String demand){
        HttpURLConnection conn=null;
        //一下为自己的服务器ip,10.0.2.2:8081是本机的ip,android中本机ip不是localhost
        String myurl = "http://10.0.2.2:8081/SportRecord/getSportNewMess?";
        try {
            //拼接字符串向服务器传值
            String data="demand="+demand;

            URL url=new URL(myurl+data);
            conn=(HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(10000);
            conn.setReadTimeout(5000);
            conn.connect();
            int code=conn.getResponseCode();


            if(code==200){
                //接受数据
                InputStream is=conn.getInputStream();
                String state=getStringFromInputStream(is);
                return state;
            }


        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(conn!=null){
                conn.disconnect();
            }
        }


        return null;
    }
private static String getStringFromInputStream(InputStream is) throws Exception{

        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        byte[] buff=new byte[1024];
        int len=-1;
        while((len=is.read(buff))!=-1){
            baos.write(buff, 0, len);
        }
        is.close();
        String mes=baos.toString();
        baos.close();


        return mes;
    }
}

在android的Activity.java中调用如上函数的代码如下,其中new Thread是开启一个线程,android不允许在主线程中访问网络

new Thread(new Runnable() {
            @Override
            public void run() {
                final String state = NetUtil.getSportNewMes("limit");
                System.out.println("=======================================================");
                System.out.println(state);
                System.out.println("=======================================================");
                try {
//将字符串转换为JSONArray
                    net.sf.json.JSONArray array= net.sf.json.JSONArray.fromObject(state);
                    for(int i=0;i<array.size();i++){
//获得第一个array结果
                        net.sf.json.JSONObject o = (net.sf.json.JSONObject) array.get(i);
                        sportNews.add(new SportNew(o.get("newName").toString(),o.get("imageName").toString(),o.get("weblink").toString()));
                      
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
原文地址:https://www.cnblogs.com/837634902why/p/12305627.html