假期学习记录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();