android网络编程

转自:http://www.linuxidc.com/Linux/2011-04/35009.htm

(http://www.blogjava.net/changcheng/archive/2010/03/04/314496.html)

Android 网络编程---STRUTS2,JSON,HttpClient

在Android开发过程中,我们需要访问网络上的Web资源,比如网络上的WEB请求。在这里Android就好像是一个终端,可以用来接收Web服务器端发送过来的数据。下面我以Struts2作为Web服务器端的Web框架。来说明Android客户端接收Web请求的过程。

首先,我们要配置Web服务器端,添加Struts2所需要的JAR包(包括JSON包)

下面是服务器端所要配置的JAR包,如下所示:


我们看看json包,有如下: json-lib-**.jdk15.jar,struts2-json-plugin-***.jar,ezmorph-**.jar

接下配置web.xml文件,代码如下所示:

   1. <!-- 定义Struts2的核心控制器:FilterDispatcher --> 
   2.   <filter> 
   3.      <!-- 定义核心Filter的名称 --> 
   4.      <filter-name>struts2</filter-name> 
   5.      <!-- 定义Filter的实现类 --> 
   6.      <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 
   7.   </filter> 
   8.     
   9.   <filter-mapping> 
  10.      <filter-name>struts2</filter-name> 
  11.      <url-pattern>/*</url-pattern> 
  12.   </filter-mapping> 

添加完JAR包后。我们来配置一下struts.xml文件,这个文件存放在src根目录下面,代码如下所示:

   1. <?xml version="1.0" encoding="UTF-8"?> 
   2. <!DOCTYPE struts PUBLIC  
   3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
   4. "http://struts.apache.org/dtds/struts-2.0.dtd"> 
   5. <struts> 
   6.     <!-- setting encoding,DynamicMethod,language  
   7.         <constant name="struts.custom.i18n.resources" value="messageResource"></constant> 
   8.     --> 
   9.     <constant name="struts.i18n.encoding" value="UTF-8"></constant> 
  10.     <constant name="struts.enable.DynamicMethodInvocation" 
  11.         value="true"> 
  12.     </constant> 
  13. <!--   
  14.     truts.enable.DynamicMethodInvocation = true,-动态方法调用,  
  15.     为true时,就可以在struts.xml配置“*”的通配符,来调用action里的方法  
  16.  --> 
  17.     <!-- add package here extends="struts-default"--> 
  18.     <package name="dongzi" extends="json-default"><!--需要将struts-default改为json-default--> 
  19.         <!-- setting action --> 
  20.         <action name="login" class="com.dongzi.action.LoginAction" 
  21.             method="login"> 
  22.             <result type="json"></result> 
  23.             <!--返回值类型设置为json,不设置返回页面--> 
  24.         </action> 
  25.     </package> 
  26. </struts> 

看看这个action

    <action name="login" class="com.dongzi.action.LoginAction"
            method="login">
            <result type="json"></result>
            <!--返回值类型设置为json,不设置返回页面-->
        </action>
返回的是json 数据。而且是由LoginAction类去处理,它存放在com.dongzi.action下面。LoginAction类的代码如下:

   1. public class LoginAction extends ActionSupport implements ServletRequestAware,  
   2.         ServletResponseAware {  
   3.     /** 
   4.      *  
   5.      */ 
   6.     private static final long serialVersionUID = 1L;  
   7.     HttpServletRequest request;  
   8.     HttpServletResponse response;  
   9.     public void setServletRequest(HttpServletRequest request) {  
  10.         this.request = request;  
  11.     }  
  12.     public void setServletResponse(HttpServletResponse response) {  
  13.         this.response = response;  
  14.     }  
  15.     public void login() {  
  16.         try {  
  17.             // HttpServletRequest request =ServletActionContext.getRequest();  
  18.             // HttpServletResponse response=ServletActionContext.getResponse();  
  19.             this.response.setContentType("text/html;charset=utf-8");  
  20.             this.response.setCharacterEncoding("UTF-8");  
  21.             // 将要返回的实体对象进行json处理  
  22.             // JSONObject json=JSONObject.fromObject(this.getUsername());  
  23.             // 输出格式如:{"id":1, "username":"zhangsan", "pwd":"123"}  
  24.             // System.out.println(json);  
  25.               
  26.            //   this.response.getWriter().write(json.toString());  
  27.               
  28.             //{"username":"mingg","password":"123"}  
  29.         JSONObject json=new JSONObject();  
  30. //          json.put("username", "mingg");  
  31. //          json.put("password","123");  
  32.               
  33.               
  34.               
  35.             //【这里在JSON中包含一个Map】  
  36.             Map map=new HashMap<Object, String>();  
  37.             map.put("username", "xiaomingg");  
  38.             map.put("password", "1234");  
  39.             map.put("state", "1");  
  40.             json.put("userbean", map);  
  41.               
  42.             response.getWriter().write(json.toString());  
  43.             ////{"userbean":{"username":"100196","password":"1234453","State":1}}  
  44.               
  45.               
  46.            /** 
  47.             * 值的数组 
  48.              
  49.             {"people": [ 
  50.                 {"username":"mingg","password":"123","email":"[email protected]"}, 
  51.                  
  52.                 {"username":"jie","password":"111","email":"[email protected]"}, 
  53.                  
  54.                 {"username":"yong","password":"1232","email":"[email protected]"} 
  55.             ]} 
  56.              
  57.             */ 
  58.               
  59.               
  60.               
  61. //          JSONArray jsonArray=new JSONArray();  
  62. //            
  63. //          JSONObject json=new JSONObject();  
  64. //          json.put("username", "mingg");  
  65. //          json.put("password","123");  
  66. //          json.put("email", "[email protected]");  
  67. //            
  68. //          JSONObject json1=new JSONObject();  
  69. //          json1.put("username", "jie");  
  70. //          json1.put("password","111");  
  71. //          json1.put("email", "[email protected]");  
  72. //            
  73. //          JSONObject json2=new JSONObject();  
  74. //          json2.put("username", "yong");  
  75. //          json2.put("password","1232");  
  76. //          json2.put("email", "[email protected]");  
  77. //            
  78. //          jsonArray.add(0, json);  
  79. //          jsonArray.add(1, json1);  
  80. //          jsonArray.add(2, json2);  
  81. //            
  82. //            
  83. //          JSONObject alObject=new JSONObject();  
  84. //          alObject.put("people", jsonArray);  
  85.               
  86.               
  87.               
  88.             /*** 
  89.              *{ "programmers":      [ 
  90.              *     {"username":"mingg","password":"123","email":"[email protected]"}, 
  91.              *      
  92.              *     {"username":"jie","password":"111","email":"[email protected]"}, 
  93.              *      
  94.              *     {"username":"yong","password":"1232","email":"[email protected]"}], 
  95.              *  "authors":    [ 
  96.              *      {"username":"mingg","password":"123","genre":"science fiction"}, 
  97.              *  
  98.              *      {"username":"jie","password":"111","genre":"fantasy"}, 
  99.              *  
100.              *      {"username":"yong","password":"1232","genre":"christian fiction"}], 
101.              *  "musicians": [ 
102.              *      {"username":"mingg","password":"123","instrument":"guitar"}, 
103.              *  
104.              *      {"username":"jie","password":"111","instrument":"piano"}, 
105.              *  
106.              *      {"username":"yong","password":"1232","instrument":"flute"}] 
107.              * } 
108.              *  
109.              */ 
110.               
111.               
112. //          JSONArray jsonArray=new JSONArray();  
113. //            
114. //          JSONObject json=new JSONObject();  
115. //          json.put("username", "mingg");  
116. //          json.put("password","123");  
117. //          json.put("email", "[email protected]");  
118. //            
119. //          JSONObject json1=new JSONObject();  
120. //          json1.put("username", "jie");  
121. //          json1.put("password","111");  
122. //          json1.put("email", "[email protected]");  
123. //            
124. //          JSONObject json2=new JSONObject();  
125. //          json2.put("username", "yong");  
126. //          json2.put("password","1232");  
127. //          json2.put("email", "[email protected]");  
128. //            
129. //          jsonArray.add(0, json);  
130. //          jsonArray.add(1, json1);  
131. //          jsonArray.add(2, json2);  
132. //            
133. //            
134. //            
135. //          JSONArray jsonArray2=new JSONArray();  
136. //            
137. //          JSONObject json20=new JSONObject();  
138. //          json20.put("username", "mingg");  
139. //          json20.put("password","123");  
140. //          json20.put("genre", "science fiction");  
141. //            
142. //          JSONObject json21=new JSONObject();  
143. //          json21.put("username", "jie");  
144. //          json21.put("password","111");  
145. //          json21.put("genre", "fantasy");  
146. //            
147. //          JSONObject json22=new JSONObject();  
148. //          json22.put("username", "yong");  
149. //          json22.put("password","1232");  
150. //          json22.put("genre", "christian fiction");  
151. //            
152. //          jsonArray2.add(0, json20);  
153. //          jsonArray2.add(1, json21);  
154. //          jsonArray2.add(2, json22);  
155. //            
156. //            
157. //           JSONArray jsonArray3=new JSONArray();  
158. //            
159. //          JSONObject json30=new JSONObject();  
160. //          json30.put("username", "mingg");  
161. //          json30.put("password","123");  
162. //          json30.put("instrument", "guitar");  
163. //            
164. //          JSONObject json31=new JSONObject();  
165. //          json31.put("username", "jie");  
166. //          json31.put("password","111");  
167. //          json31.put("instrument", "piano");  
168. //            
169. //          JSONObject json32=new JSONObject();  
170. //          json32.put("username", "yong");  
171. //          json32.put("password","1232");  
172. //          json32.put("instrument", "flute");//笛  
173. //            
174. //          jsonArray3.add(0, json30);  
175. //          jsonArray3.add(1, json31);  
176. //          jsonArray3.add(2, json32);  
177. //            
178. //            
179. //          JSONObject alObject=new JSONObject();  
180. //          alObject.put("programmers", jsonArray);  
181. //          alObject.put("authors", jsonArray2);  
182. //          alObject.put("musicians", jsonArray3);  
183.               
184.               
185.             /** 
186.              * yong:1232:[email protected] 
187.              */ 
188.             //获取任意节点的值:试例,第个节点,第三个子节点  
189.               
190. //          JSONArray jsonArrayt11 = (JSONArray) alObject.get("programmers");  
191. //            
192. //          JSONObject jsonObject11=(JSONObject)jsonArrayt11.get(2);  
193. //            
194. //          String username=jsonObject11.getString("username");  
195. //          String password=jsonObject11.getString("password");  
196. //          String email=jsonObject11.getString("email");  
197. //            
198. //          StringBuffer sBuffer=new StringBuffer();  
199. //          sBuffer.append(username+":").append(password+":").append(email);  
200.               
201.               
202. //          response.getWriter().write(username.toString());  
203.               
204.               
205.               
206.               
207.             /** 
208.              * JSONObject json=new JSONObject(); json.put("login", "login"); 
209.              * response.setContentType("text/html;charset=utf-8"); 
210.              * System.out.println(json); byte[] jsonBytes = 
211.              * json.toString().getBytes("utf-8"); 
212.              * response.setContentLength(jsonBytes.length); 
213.              * response.getOutputStream().write(jsonBytes); 
214.              */ 
215.               
216. //           JSONObject json=new JSONObject();   
217. //           json.put("login", "login");  
218. //            byte[] jsonBytes = json.toString().getBytes("utf-8");  
219. //            response.setContentType("text/html;charset=utf-8");  
220. //            response.setContentLength(jsonBytes.length);  
221. //            response.getOutputStream().write(jsonBytes);  
222. //            response.getOutputStream().flush();  
223. //            response.getOutputStream().close();  
224.               
225.         } catch (Exception e) {  
226.             e.printStackTrace();  
227.         }  
228.         // return null;  
229.     }  
230. } 
我下面简单说一下JSON解析过程。

          JSONObject json=new JSONObject();
            //【这里在JSON中包含一个Map】
            Map map=new HashMap<Object, String>();

            map.put("username", "xiaomingg");
            map.put("password", "1234");
            map.put("state", "1");
            json.put("userbean", map);
          
            response.getWriter().write(json.toString());

   通过访问http://localhost:8888/AndroidServerApp/login.action,得到如下JSON数据:

服务器端的配置完成了。下面我来配置Android客户端了。

由于Android内置提拱了解析JSON数据的包。所以就不需要使用第三方包了

Android 访问网络资源的代码如下所示:

   1.     private static String url = "http://10.0.2.2:8888/AndroidServerApp/login.action";  
   2. getPDAServerData(url);  
   3. private void getPDAServerData(String url) {  
   4.         HttpClient client = new DefaultHttpClient();  
   5.         //提拱默认的HttpClient实现  
   6.         HttpPost request;  
   7.         try {  
   8.             request = new HttpPost(new URI(url));  
   9.             HttpResponse response = client.execute(request);  
  10.             // 判断请求是否成功  
  11.             if (response.getStatusLine().getStatusCode() == 200) { //200表示请求成功  
  12.                 HttpEntity entity = response.getEntity();  
  13.                 if (entity != null) {  
  14.                     String out = EntityUtils.toString(entity);  
  15.                     JSONObject jsonObject;  
  16.                     String username = "";  
  17.                     String password = "";  
  18.                     String stateStr="";  
  19.                       
  20.                     UserBean userBean=new UserBean();  
  21.                     try {  
  22.               
  23.                         //{"userbean":{"username":"100196","password":"1234453","State":1}}  
  24.                         //JSONObject jsonObject = new JSONObject(builder.toString()).getJSONObject("userbean");   
  25.                       
  26.                         jsonObject = new JSONObject(out).getJSONObject("userbean");  
  27.                           
  28.                           
  29.                         userBean.setUsername(jsonObject.getString("username"));  
  30.                         userBean.setPassword( jsonObject.getString("password"));  
  31.                         userBean.setState(Integer.parseInt(jsonObject.getString("state")));  
  32.                           
  33.                           
  34.                           
  35.                     } catch (JSONException e) {  
  36.                         // TODO Auto-generated catch block  
  37.                         e.printStackTrace();  
  38.                     }  
  39.                     new AlertDialog.Builder(this).setMessage(  
  40.                             userBean.getUsername() + ":" + userBean.getState()).create().show();  
  41.                 }  
  42.             }  
  43.         } catch (URISyntaxException e) {  
  44.             e.printStackTrace();  
  45.             new AlertDialog.Builder(this).setMessage(e.getMessage()).create()  
  46.                     .show();  
  47.         } catch (ClientProtocolException e) {  
  48.             e.printStackTrace();  
  49.             new AlertDialog.Builder(this).setMessage(e.getMessage()).create()  
  50.                     .show();  
  51.         } catch (IOException e) {  
  52.             e.printStackTrace();  
  53.             new AlertDialog.Builder(this).setMessage(e.getMessage()).create()  
  54.                     .show();  
  55.         }  
  56.     } 

里面的IP地址:10.0.2.2,代表着手机模拟器本地的地址,相当于localhost,但不能使用localhost,或者127.0.0.1,因不是在PC机上测试,而是在手机AVD上测试之。

而UserBean.java,它就是一个JAVABEAN,代码如下所示:

   1. package po;  
   2. public class UserBean {  
   3.     private String username;  
   4.     private String password;  
   5.     private int state;  
   6.     public String getUsername() {  
   7.         return username;  
   8.     }  
   9.     public void setUsername(String username) {  
  10.         this.username = username;  
  11.     }  
  12.     public String getPassword() {  
  13.         return password;  
  14.     }  
  15.     public void setPassword(String password) {  
  16.         this.password = password;  
  17.     }  
  18.     public int getState() {  
  19.         return state;  
  20.     }  
  21.     public void setState(int state) {  
  22.         this.state = state;  
  23.     }  
  24. } 

注恴必须AndroidManifest.xml中加入如下代码,不然Android就不能访问web资源。

   1. <uses-permission Android:name="android.permission.INTERNET" />  

你可能感兴趣的:(编程,json,android,qq,struts)