Android与JSP javaweb交互参考文章

Android之使用JavaWeb项目作为后台的实现

android客户端+JAVA WEB服务器实现json数据解析


首先,项目中使用javaweb作为后台服务器,源码地址:服务器和客户端源码地址
接下来进入正题。
   
   一、java web服务器
        
         这里就多说了,不太了解j2ee的请查阅相关书籍。
      
         项目结构如下:
       
        News类定义了之后解析的JSON对象的内容;
        NewsServer则是定义了一个获取最新新闻News的接口;
        NewsServer则是实现了这个接口,定义了获取最新新闻的方法;
        NewsListServlet则是一个实现客户端get和post请求的servlet,用于实现网络请求时的业务逻辑处理,主要返回含有News内容的json字符串;
        jsonnewslist.jsp是一个jsp文件用于测试服务器是否正常运行。
      
      服务器部分就不啰嗦了,直接贴代码和截图
      
  (1)News类
           
[java] view plain copy
  1. <span style="font-size:18px;"public class News {  
  2.     private Integer id;  
  3.     private String title;  
  4.     private Integer timelength;  
  5.     public News(Integer id, String title, Integer timelength) {  
  6.         this.id = id;  
  7.         this.title = title;  
  8.         this.timelength = timelength;  
  9.     }  
  10.     public Integer getId() {  
  11.         return id;  
  12.     }  
  13.     public void setId(Integer id) {  
  14.         this.id = id;  
  15.     }  
  16.     public String getTitle() {  
  17.         return title;  
  18.     }  
  19.     public void setTitle(String title) {  
  20.         this.title = title;  
  21.     }  
  22.     public Integer getTimelength() {  
  23.         return timelength;  
  24.     }  
  25.     public void setTimelength(Integer timelength) {  
  26.         this.timelength = timelength;  
  27.     }  
  28. }</span>  
         (2)NewsServer接口
      
[java] view plain copy
  1. <span style="font-size:18px;">public interface NewsServer {  
  2.     /* 
  3.      * 获取最新的新闻News 
  4.      */  
  5.     public java.util.List<News> getLastNews();  
  6.   
  7. }</span>  
          (3)NewsServerBean类 
[java] view plain copy
  1. <span style="font-size:18px;">import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. public class NewsServerBean implements NewsServer {  
  5.   
  6.     @Override  
  7.     public List<News> getLastNews() {  
  8.         // TODO Auto-generated method stub  
  9.         List<News> news = new ArrayList<>();  
  10.         news.add(new News(10"吕文健"20));  
  11.         news.add(new News(45"李昱喜"10));  
  12.         news.add(new News(89"android is amazing"50));  
  13.         return news;  
  14.     }  
  15.   
  16. }</span>  
       (4)NewsListServlet类
[java] view plain copy
  1. <span style="font-size:18px;">import java.io.IOException;  
  2. import java.util.List;  
  3. import javax.servlet.ServletException;  
  4. import javax.servlet.annotation.WebServlet;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9.   
  10. @WebServlet(name="newslist",  
  11.             urlPatterns={"/newslist"}  
  12.         )//配置Servlet  
  13. public class NewsListServlet extends HttpServlet {  
  14.   
  15.     /** 
  16.      *  
  17.      */  
  18.     private static final long serialVersionUID = 1L;  
  19.     NewsServerBean serverbean =new NewsServerBean();  
  20.   
  21.     @Override  
  22.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  23.         // TODO Auto-generated method stub  
  24.        doPost(req, resp);  
  25.     }  
  26.   
  27.     @Override  
  28.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  29.         // TODO Auto-generated method stub  
  30.         req.setCharacterEncoding("GBK");</span>  
[java] view plain copy
  1. <span style="font-size:18px;">      resp.setCharacterEncoding("GBK");//这里设置成gbk防止手机端显示乱码,之前设置为utf-8总是乱码  
  2.         List<News> news = serverbean.getLastNews();</span>  
[java] view plain copy
  1. <span style="font-size:18px;">      StringBuilder json = new StringBuilder();  
  2.         json.append("[");  
  3.         for(News news2:news){  
  4.             json.append('{').append("\"id\":").append(news2.getId()).append(",");                        
  5.             json.append("\"title\":").append("\""+news2.getTitle()+"\"").append(",");  
  6.             json.append("\"timelength\":").append(news2.getTimelength());  
  7.             json.append('}').append(",");  
  8.         }  
  9.         json.deleteCharAt(json.length()-1);//?  
  10.         json.append("]");  
  11.         req.setAttribute("json", json.toString());  
  12.         req.getRequestDispatcher("/jsonnewslist.jsp").forward(req, resp);  
  13.     }  
  14. }</span>  

    (5)jsonnewslist.jsp(在服务端测试服务器是否布置成功)
[html] view plain copy
  1. <span style="font-size:18px;"><%@ page language="java" contentType="text/plain; charset=GBK"  
  2.     pageEncoding="GBK"%>  
  3.    ${json}</span>  
             (6)服务器运行结果

    


      OK,运行成功,服务器解决了,楼主把它打包成war,放在阿里云服务器上,省去了用电脑做服务器的各种麻烦。接下来进入正题,客户端解析Json


二、android客户端

     客户端部分主要是一个简单的listview显示获取的news,运行结果如下:



接下来,开始贴代码:
    1、布局文件:
    (1)activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="wf.com.getnewsinjson.MainActivity">
<Button
    android:id="@+id/btn_refresh"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:text="刷新"
    />
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        />
</LinearLayout>
(2)item.xml(ListView中每一个item的布局)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <TextView
        android:id="@+id/title"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_weight="1"
        android:gravity="center"
        />
    <TextView
        android:layout_marginLeft="10dp"
        android:id="@+id/timelength"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="50dp"
        android:gravity="center"
        />
</LinearLayout>
2、主要代码
  (1)、News类(和之前服务器中的一样,用于解析)
   (2)、NewsServer类(用于连接服务器并解析JSON字符串)
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import Util.StreamTool;

/**
 * Created by wangfeng on 2016/12/8.
 */

public class NewsService {
    public static List<News> getJsonLastNews() {
        List<News> list = null;
        InputStream in = null;
                String path = "http://*****";//这里输入自己的服务器地址
                try {
                    list = new ArrayList<>();
                    URL url = new URL(path);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setConnectTimeout(5000);
                    conn.setRequestMethod("GET");
                    if (conn.getResponseCode()==200){
                        in = conn.getInputStream();
                        list = parseJSON(in);
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    System.out.println("客户端未连接到服务器");
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("客户端未连接到服务器");
                }
        return list;
    }
/*
*解析json字符串并返回一个List
*/
    public static List<News>  parseJSON(InputStream in){
        List<News> list = null;
        try {
            list = new ArrayList<>();
//           String str = StreamTool.streamToString(in);
//            System.out.println(str);
            byte[] bytes = StreamTool.stream2Byte(in);//这里用到了StreamTool工具类,自己到CSDN上下载一个,这里是把
                                                       //输入流转化为字节数组
             String str = new String (bytes,"GBK");//因为服务器设置了返回编码为GBK,这里也设置编码方式为GBK	
            System.out.println("解析成功"+str);
            JSONArray jsonArray = new JSONArray(str);//将json字符串转化为JSONArray
            for(int i =0;i< jsonArray.length();i++){
                JSONObject jsonObject = jsonArray.getJSONObject(i);//循环JSONArray获得每一个JSONObject对象
                int id = jsonObject.getInt("id");
                String title = jsonObject.getString("title");
                int timelength = jsonObject.getInt("timelength");
                list.add(new News(id,title,timelength));
            }
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("io","输入流读取错误");
        } catch (JSONException e) {
            e.printStackTrace();
            Log.e("json","json数组转换错误");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
}

    (3)MainActivity类
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity implements Runnable {
    List<HashMap<String,Object>> data;
    private static final int TAG =0X1;//用于Handler中的异步处理标志
    Thread thread = null;//声明线程,用于执行NewsServer中的网络访问
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case TAG:
                    SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this,data,R.layout.item,new String[]{"title","timelength"},new int[]{R.id.title,R.id.timelength});
                    listview.setAdapter(simpleAdapter);
                    break;
            }
        }
    };

    @BindView(R.id.btn_refresh)
    Button btnRefresh;
    @BindView(R.id.listview)
    ListView listview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);//这里使用了ButterKnife组件来初始化组件和绑定id,不懂得自行百度
    }
    
    @OnClick(R.id.btn_refresh)
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_refresh:
                thread = new Thread(this);
                thread.start();
                break;
        }
    }
    
    @Override
    public void run() {
        String length = getResources().getString(R.string.timelength);
        List<News> news = NewsService.getJsonLastNews();//这里必须另起一个线程访问,不能在主线程中访问
         data = new ArrayList<>();
        for(News news1:news){
            HashMap<String,Object> item  = new HashMap<>();
            item.put("id",news1.getId());
            item.put("title",news1.getTitile());
            item.put("timelength",length+": "+news1.getTimelength());
            data.add(item);
        }
        Message msg = new Message();
        msg.what=TAG;
        handler.sendMessage(msg);//通知组件更新界面
    }
}

三、后记
      作为一只菜鸟不得不承认在这次练习中,犯了不少低级错误,比如,服务器端,没有设置返回的编码方式,json字符串忘记加“ ”;在客户端,在非UI线程中更新UI组件,在解析json时没有设置编码方式,在设置请求方式时将GET写成Get,哎,吃一堑长一智。



  1.     private String title;  
  2.     private Integer timelength;  
  3.     public News(Integer id, String title, Integer timelength) {  
  4.         this.id = id;  
  5.         this.title = title;  
  6.         this.timelength = timelength;  
  7.     }  
  8.     public Integer getId() {  
  9.         return id;  
  10.     }  
  11.     public void setId(Integer id) {  
  12.         this.id = id;  
  13.     }  
  14.     public String getTitle() {  
  15.         return title;  
  16.     }  
  17.     public void setTitle(String title) {  
  18.         this.title = title;  
  19.     }  
  20.     public Integer getTimelength() {  
  21.         return timelength;  
  22.     }  
  23.     public void setTimelength(Integer timelength) {  
  24.         this.timelength = timelength;  
  25.     }  
  26. }</span>  
         (2)NewsServer接口
      
[java] view plain copy
  1. <span style="font-size:18px;">public interface NewsServer {  
  2.     /* 
  3.      * 获取最新的新闻News 
  4.      */  
  5.     public java.util.List<News> getLastNews();  
  6.   
  7. }</span>  
          (3)NewsServerBean类 
[java] view plain copy
  1. <span style="font-size:18px;">import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. public class NewsServerBean implements NewsServer {  
  5.   
  6.     @Override  
  7.     public List<News> getLastNews() {  
  8.         // TODO Auto-generated method stub  
  9.         List<News> news = new ArrayList<>();  
  10.         news.add(new News(10"吕文健"20));  
  11.         news.add(new News(45"李昱喜"10));  
  12.         news.add(new News(89"android is amazing"50));  
  13.         return news;  
  14.     }  
  15.   
  16. }</span>  
       (4)NewsListServlet类
[java] view plain copy
  1. <span style="font-size:18px;">import java.io.IOException;  
  2. import java.util.List;  
  3. import javax.servlet.ServletException;  
  4. import javax.servlet.annotation.WebServlet;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9.   
  10. @WebServlet(name="newslist",  
  11.             urlPatterns={"/newslist"}  
  12.         )//配置Servlet  
  13. public class NewsListServlet extends HttpServlet {  
  14.   
  15.     /** 
  16.      *  
  17.      */  
  18.     private static final long serialVersionUID = 1L;  
  19.     NewsServerBean serverbean =new NewsServerBean();  
  20.   
  21.     @Override  
  22.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  23.         // TODO Auto-generated method stub  
  24.        doPost(req, resp);  
  25.     }  
  26.   
  27.     @Override  
  28.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  29.         // TODO Auto-generated method stub  
  30.         req.setCharacterEncoding("GBK");</span>  
[java] view plain copy
  1. <span style="font-size:18px;">      resp.setCharacterEncoding("GBK");//这里设置成gbk防止手机端显示乱码,之前设置为utf-8总是乱码  
  2.         List<News> news = serverbean.getLastNews();</span>  
[java] view plain copy
  1. <span style="font-size:18px;">      StringBuilder json = new StringBuilder();  
  2.         json.append("[");  
  3.         for(News news2:news){  
  4.             json.append('{').append("\"id\":").append(news2.getId()).append(",");                        
  5.             json.append("\"title\":").append("\""+news2.getTitle()+"\"").append(",");  
  6.             json.append("\"timelength\":").append(news2.getTimelength());  
  7.             json.append('}').append(",");  
  8.         }  
  9.         json.deleteCharAt(json.length()-1);//?  
  10.         json.append("]");  
  11.         req.setAttribute("json", json.toString());  
  12.         req.getRequestDispatcher("/jsonnewslist.jsp").forward(req, resp);  
  13.     }  
  14. }</span>  

    (5)jsonnewslist.jsp(在服务端测试服务器是否布置成功)
[html] view plain copy
  1. <span style="font-size:18px;"><%@ page language="java" contentType="text/plain; charset=GBK"  
  2.     pageEncoding="GBK"%>  
  3.    ${json}</span>  
             (6)服务器运行结果

    


      OK,运行成功,服务器解决了,楼主把它打包成war,放在阿里云服务器上,省去了用电脑做服务器的各种麻烦。接下来进入正题,客户端解析Json


二、android客户端

     客户端部分主要是一个简单的listview显示获取的news,运行结果如下:



接下来,开始贴代码:
    1、布局文件:
    (1)activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="wf.com.getnewsinjson.MainActivity">
<Button
    android:id="@+id/btn_refresh"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:text="刷新"
    />
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        />
</LinearLayout>
(2)item.xml(ListView中每一个item的布局)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <TextView
        android:id="@+id/title"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_weight="1"
        android:gravity="center"
        />
    <TextView
        android:layout_marginLeft="10dp"
        android:id="@+id/timelength"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="50dp"
        android:gravity="center"
        />
</LinearLayout>
2、主要代码
  (1)、News类(和之前服务器中的一样,用于解析)
   (2)、NewsServer类(用于连接服务器并解析JSON字符串)
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import Util.StreamTool;

/**
 * Created by wangfeng on 2016/12/8.
 */

public class NewsService {
    public static List<News> getJsonLastNews() {
        List<News> list = null;
        InputStream in = null;
                String path = "http://*****";//这里输入自己的服务器地址
                try {
                    list = new ArrayList<>();
                    URL url = new URL(path);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setConnectTimeout(5000);
                    conn.setRequestMethod("GET");
                    if (conn.getResponseCode()==200){
                        in = conn.getInputStream();
                        list = parseJSON(in);
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    System.out.println("客户端未连接到服务器");
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("客户端未连接到服务器");
                }
        return list;
    }
/*
*解析json字符串并返回一个List
*/
    public static List<News>  parseJSON(InputStream in){
        List<News> list = null;
        try {
            list = new ArrayList<>();
//           String str = StreamTool.streamToString(in);
//            System.out.println(str);
            byte[] bytes = StreamTool.stream2Byte(in);//这里用到了StreamTool工具类,自己到CSDN上下载一个,这里是把
                                                       //输入流转化为字节数组
             String str = new String (bytes,"GBK");//因为服务器设置了返回编码为GBK,这里也设置编码方式为GBK	
            System.out.println("解析成功"+str);
            JSONArray jsonArray = new JSONArray(str);//将json字符串转化为JSONArray
            for(int i =0;i< jsonArray.length();i++){
                JSONObject jsonObject = jsonArray.getJSONObject(i);//循环JSONArray获得每一个JSONObject对象
                int id = jsonObject.getInt("id");
                String title = jsonObject.getString("title");
                int timelength = jsonObject.getInt("timelength");
                list.add(new News(id,title,timelength));
            }
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("io","输入流读取错误");
        } catch (JSONException e) {
            e.printStackTrace();
            Log.e("json","json数组转换错误");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
}

    (3)MainActivity类
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity implements Runnable {
    List<HashMap<String,Object>> data;
    private static final int TAG =0X1;//用于Handler中的异步处理标志
    Thread thread = null;//声明线程,用于执行NewsServer中的网络访问
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case TAG:
                    SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this,data,R.layout.item,new String[]{"title","timelength"},new int[]{R.id.title,R.id.timelength});
                    listview.setAdapter(simpleAdapter);
                    break;
            }
        }
    };

    @BindView(R.id.btn_refresh)
    Button btnRefresh;
    @BindView(R.id.listview)
    ListView listview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);//这里使用了ButterKnife组件来初始化组件和绑定id,不懂得自行百度
    }
    
    @OnClick(R.id.btn_refresh)
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_refresh:
                thread = new Thread(this);
                thread.start();
                break;
        }
    }
    
    @Override
    public void run() {
        String length = getResources().getString(R.string.timelength);
        List<News> news = NewsService.getJsonLastNews();//这里必须另起一个线程访问,不能在主线程中访问
         data = new ArrayList<>();
        for(News news1:news){
            HashMap<String,Object> item  = new HashMap<>();
            item.put("id",news1.getId());
            item.put("title",news1.getTitile());
            item.put("timelength",length+": "+news1.getTimelength());
            data.add(item);
        }
        Message msg = new Message();
        msg.what=TAG;
        handler.sendMessage(msg);//通知组件更新界面
    }
}

三、后记
      作为一只菜鸟不得不承认在这次练习中,犯了不少低级错误,比如,服务器端,没有设置返回的编码方式,json字符串忘记加“ ”;在客户端,在非UI线程中更新UI组件,在解析json时没有设置编码方式,在设置请求方式时将GET写成Get,哎,吃一堑长一智。
阅读更多

扫码向博主提问

灵思致远Leansmall

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • android
  • c++
  • java
  • 单片机
  • unity
去开通我的Chat快问
个人分类: Server开发
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭