本文結構如下:
1. android和servlet之間的直接信息傳遞(不通過json)
1.1 android端代碼
1.2 servlet端代碼
2. android和servlet之間通過json進行交互
2.1 android端代碼
2.2 servlet端代碼
=============================================================
1. android和servlet之間的直接信息傳遞
在android端通過httpclient去訪問服務器,發送request請求,並獲取response。
在servlet端只需要簡單的定義doGet方法和doPost方法即可。
1.1 android端代碼
package com.example.helloworld; public class MainActivity extends ActionBarActivity { private String responseMsg = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button1 = (Button)findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Thread loginThread = new Thread(new LoginThread()); loginThread.start(); } }); }
//發送請求的主要方法 private boolean loginServer(){ boolean loginValidate = false;
//servlet服務器地址是 String urlStr = "http://192.168.1.24:8080/servletTest/test"; HttpPost request = new HttpPost(urlStr); try { HttpClient client = getHttpClient(); //執行請求 HttpResponse response = client.execute(request);
//response是servlet給出的返回結果 if(response.getStatusLine().getStatusCode() == 200){ loginValidate = true; responseMsg = EntityUtils.toString(response.getEntity()); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return loginValidate; } public HttpClient getHttpClient(){ BasicHttpParams httpParams = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(httpParams, 5*1000); HttpConnectionParams.setSoTimeout(httpParams, 10*1000); HttpClient client = new DefaultHttpClient(httpParams); return client; } class LoginThread implements Runnable{ public void run(){ boolean loginValidate = loginServer(); System.out.println("======================bool is :"+loginValidate+"----------------response: "+responseMsg); } } }
1.2 servlet端代碼
package cn.dragon.servlet; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import com.sun.corba.se.pept.transport.Connection; public class ServletDemoFirst extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ // response.setContentType("text/html; charset=GB2312"); // PrintWriter outPrintWriter = response.getWriter(); // outPrintWriter.println("hello"); // outPrintWriter.close(); //Connection conn = null;
//首先建立數據庫連接 String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "admin"; PrintWriter out = response.getWriter(); //out.println("welcom"); try { Class.forName(driver); java.sql.Connection conn = DriverManager.getConnection(url, user, password); //out.println("loading success"); Statement statement = conn.createStatement();
//進行數據庫查詢。 ResultSet rs = statement.executeQuery("select * from career"); ArrayList<String> list1 = new ArrayList<String>(); while(rs.next()){ //out.println(rs.getString(1)); list1.add(rs.getString(1)); }
//out用來向客戶端返回數據。如果用網頁訪問這個網址,查詢數據庫的結果就顯示在網頁上,如果用android訪問,就返回給android手機 out.println(list1.toString()); rs.close(); statement.close(); conn.close(); } catch (ClassNotFoundException cnfex) { //System.err.println("裝載 JDBC/ODBC 驅動程序失敗。"); out.println("loading JDBC failed"); cnfex.printStackTrace(); System.exit(1); // terminate program } catch (SQLException sqlex) { //System.err.println("無法連接數據庫"); out.println("can not connect to the database"); sqlex.printStackTrace(); System.exit(1); // terminate program } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
doGet(request, response); } }
以上就是兩部分的代碼。都比較好理解,而且也給了一些注釋。
==================================================================
2. 通過JSON進行客戶端服務器的通訊
2.1 android端
package com.example.helloworld; public class MainActivity extends ActionBarActivity { private String responseMsg = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button1 = (Button)findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub //Intent intent = new Intent(MainActivity.this, InfoActivity.class); //startActivity(intent); Thread loginThread = new Thread(new LoginThread()); loginThread.start(); } }); } public HttpClient getHttpClient(){ BasicHttpParams httpParams = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(httpParams, 5*1000); HttpConnectionParams.setSoTimeout(httpParams, 10*1000); HttpClient client = new DefaultHttpClient(httpParams); return client; } private void sendJson(){ //boolean loginValidate = false; String urlStr = "http://192.168.1.24:8080/servletTest/test"; HttpPost post = new HttpPost(urlStr); try{ //向服務器寫json JSONObject json1 = new JSONObject(); //Object email = null; Object email = "hlelo"; json1.put("email", email); //Object pwd = null; Object pwd = "wodls"; json1.put("password", pwd); System.out.println("=============="+json.toString()); //保證json數據不是亂碼 StringEntity se = new StringEntity(json.toString()); se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); post.setEntity(se); //發送json給服務器 HttpClient httpClient = getHttpClient(); HttpResponse httpResponse = httpClient.execute(post); /*int httpCode = httpResponse.getStatusLine().getStatusCode(); if(httpCode == HttpURLConnection.HTTP_OK && httpResponse != null){ //org.apache.http.Header[] headers = httpResponse.getAllHeaders(); HttpEntity entity = httpResponse.getEntity(); //org.apache.http.Header header = httpResponse.getFirstHeader("content-type"); //讀取服務器返回的json InputStream inputStream = entity.getContent(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader reader = new BufferedReader(inputStreamReader); String s; while((s= reader.readLine())!= null){ result.append(s); } reader.close(); JSONObject jsonObject = new JSONObject(result.toString()); String nameString = jsonObject.getString("email"); String passString = jsonObject.getString("password"); System.out.println("===============email is: "+nameString+", password is: "+passString);*/ }catch(Exception exception){ exception.printStackTrace(); } } class LoginThread implements Runnable{ public void run(){ sendJson(); } } }
2.2 servlet端代碼
package cn.dragon.servlet; public class ServletDemoFirst extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ //處理json內容 response.setCharacterEncoding("UTF-8"); response.setContentType("text/json"); String acceptjson = ""; try { BufferedReader br = new BufferedReader(new InputStreamReader((ServletInputStream)request.getInputStream(), "utf-8")); StringBuffer sb = new StringBuffer(""); String temp; while((temp = br.readLine()) != null){ sb.append(temp); } br.close();
//以上的過程都從request中讀取json,並將json轉換成string,這樣可以顯示出來。最終String類型的json就是acceptjson acceptjson = sb.toString(); System.out.println("=======json is==========="+acceptjson); if(acceptjson != ""){ //System.out.println("get the json successfully"); JSONObject jo = JSONObject.fromObject(acceptjson);
//email即是android端發送過來的json當中的一個key,我們使用get方法讀取對應的value System.out.println(jo.get("email")); } else{ System.out.println("get the json failed"); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }
其實應該還有一段內容是servlet將json返還給android端,然后android端再解析出來。關於android端的解析過程在注釋掉的部分中,但這段內容我還沒有驗證。
下面稍微補充一點關於JSONArray的內容——JSONArray如何傳輸與解析
/**** android: sendJson() *****/ private void sendJson(){ //boolean loginValidate = false; StringBuilder result = new StringBuilder(); String urlStr = "http://192.168.1.24:8080/servletTest/test"; HttpPost post = new HttpPost(urlStr); List<NameValuePair> params = new ArrayList<NameValuePair>(); //params.add(new BasicNameValuePair("name", "this is post")); try{ //向服務器寫json JSONObject json1 = new JSONObject(); //Object email = null; Object email = "hlelo"; json1.put("email", email); //Object pwd = null; Object pwd = "wodls"; json1.put("password", pwd); JSONArray jsonArray = new JSONArray();
//生成一個JSONARRAY並將上面的json裝入其中 jsonArray.put(0, json1); JSONObject json = new JSONObject();
//再生成一個JSONObject,將剛才的JSONArray放入其中,再發送到服務器端 json.put("dao", jsonArray); System.out.println("=============="+json.toString()); //保證json數據不是亂碼 StringEntity se = new StringEntity(json.toString()); se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); post.setEntity(se); //發送json給服務器 HttpClient httpClient = getHttpClient(); HttpResponse httpResponse = httpClient.execute(post); }catch(Exception exception){ exception.printStackTrace(); }
/***** servlet: doPost() *****/ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{//處理json內容 System.out.println("=======json is==========="); response.setCharacterEncoding("UTF-8"); response.setContentType("text/json"); String acceptjson = ""; try { BufferedReader br = new BufferedReader(new InputStreamReader((ServletInputStream)request.getInputStream(), "utf-8")); StringBuffer sb = new StringBuffer(""); String temp; while((temp = br.readLine()) != null){ sb.append(temp); } br.close(); acceptjson = sb.toString(); System.out.println("=======json is==========="+acceptjson); if(acceptjson != ""){ //System.out.println("get the json successfully");
//先獲取json
JSONObject jo = JSONObject.fromObject(acceptjson); //再獲取json中包含的jsonarry,dao是剛才android端給出的key JSONArray ja = jo.getJSONArray("dao");
//循環獲取jsonarray中的每個json for(int i = 0; i < ja.size(); i++){ JSONObject object = JSONObject.fromObject(ja.get(i));
//獲取json中的email值,email是json中的key
System.out.println("email is: "+object.get("email")); } } else{ System.out.println("get the json failed"); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } }
Bon Appetite~
