Android+struts2+JSON方式的手机开发

36 篇文章 0 订阅
18 篇文章 0 订阅

     在手机的后台服务无论是调用WebService还是Http请求,多数都是采用Android的HttpClient实现相关的调用实现。本文实现Android+Struts2+JSON方式实现为手机前台提供服务。

涉及的知识点:

  1.Struts2框架的搭建(包括Struts2的jSON插件)

  2.Android前台访问Web采用HttpClient方式。

  3.Android采用JSON的解析。

 

 功能:模拟远程登录流程:

 

 

 

手机后台服务:由于采用Struts2的JSON响应格式,响应详细会自动转变为JSON格式,故直接输出即可。

Java代码   收藏代码
  1. package com.easyway.json.android;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9. import org.apache.struts2.interceptor.ServletRequestAware;  
  10. import org.apache.struts2.interceptor.ServletResponseAware;  
  11.   
  12. import com.opensymphony.xwork2.ActionSupport;  
  13.   
  14. /** 
  15.  * 在android中有时候我们不需要用到本机的SQLite数据库提供数据,更多的时候是从网络上获取数据, 
  16.  * 那么Android怎么从服务器端获取数据呢?有很多种,归纳起来有 
  17.  *一:基于Http协议获取数据方法。 
  18.  *二:基于SAOP协议获取数据方法, 
  19.  *那么我们的这篇文章主要是将关于使用Http协议获取服务器端数据, 
  20.  *这里我们采取的服务器端技术为java,框架为Struts2,或者可以有Servlet,又或者可直接从JSP页面中获取数据。 
  21.  *那么,接下来我们便开始这一路程: 
  22.  *首先:编写服务器端方法,我这里采用的MVC框架是Struts2,目的很单纯,就是为了以后做个完整的商业项目, 
  23.  *技术配备为:android+SSH。当然,篇幅有限,我这里就直接用Strtus2而已。 
  24.  *服务器端:新建WebProject ,选择Java ee 5.0. 
  25.  *为了给项目添加Struts2的支持,我们必须导入Struts2的一些类库,如下即可(有些jar包是不必的,但是我们后来扩展可能是要使用到的,就先弄进去): 
  26.  *xwork-core-2.2.1.1.jar  struts2-core-2.2.1.1.jar commons-logging-1.0.4.jar  freemarker-2.3.16.jar 
  27.  *ognl-3.0.jar  javassist-3.7.ga.jar commons-ileupload.jar commons-io.jar json-lib-2.1-jdk15.jar   
  28.  *处理JSON格式数据要使用到 struts2-json-plugin-2.2.1.1.jar    
  29.  * 基于struts2的json插件. 
  30.  *  
  31.  *  
  32.  * 采用接口注入的方式注入HttpServletRequest,HttpServletResponse对象 
  33.  *  
  34.  * @author longgangbai 
  35.  * 
  36.  */  
  37. public class LoginAction extends ActionSupport implements ServletRequestAware,  
  38.         ServletResponseAware {  
  39.     /** * */  
  40.     private static final long serialVersionUID = 1L;  
  41.   
  42.     HttpServletRequest request;  
  43.   
  44.     HttpServletResponse response;  
  45.       
  46.     private String userName;  
  47.     private String password;  
  48.       
  49.   
  50.     public String getPassword() {  
  51.         return password;  
  52.     }  
  53.   
  54.     public void setPassword(String password) {  
  55.         this.password = password;  
  56.     }  
  57.   
  58.     public String getUserName() {  
  59.         return userName;  
  60.     }  
  61.   
  62.     public void setUserName(String userName) {  
  63.         this.userName = userName;  
  64.     }  
  65.   
  66.     public void setServletRequest(HttpServletRequest request) {  
  67.         this.request = request;  
  68.     }  
  69.   
  70.     public void setServletResponse(HttpServletResponse response) {  
  71.         this.response = response;  
  72.     }  
  73.       
  74.     /** 
  75.      * 模拟用户登录的业务 
  76.      */  
  77.     public void login() {  
  78.         try {  
  79.               //如果不采用接口注入的方式的获取HttpServletRequest,HttpServletResponse的方式  
  80.               // HttpServletRequest request =ServletActionContext.getRequest();  
  81.               // HttpServletResponse response=ServletActionContext.getResponse();  
  82.               
  83.                this.response.setContentType("text/json;charset=utf-8");  
  84.                this.response.setCharacterEncoding("UTF-8");  
  85.                //JSONObject json=new JSONObject();   
  86.                 Map<String,String> <span style="color: #ff0000;">json</span>=new HashMap<String,String>();  
  87.                 if ("admin".equals(userName)&&"123456".equals(password)) {  
  88.                      json.put("message""欢迎管理员登陆");  
  89.                 } else if ((!"admin".equals(userName))&&"123456".equals(password)) {  
  90.                     json.put("message""欢迎"+userName+"登陆!");  
  91.                 } else {  
  92.                     json.put("message""非法登陆信息!");  
  93.                 }  
  94.               byte[] jsonBytes = json.toString().getBytes("utf-8");  
  95.               response.setContentLength(jsonBytes.length);  
  96.               response.getOutputStream().write(jsonBytes);  
  97.               response.getOutputStream().flush();  
  98.               response.getOutputStream().close();  
  99.         } catch (Exception e) {  
  100.             e.printStackTrace();  
  101.         }  
  102.     }  
  103. }  

 

 

struts.xml

Java代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    "http://struts.apache.org/dtds/struts-2.0.dtd">  
  3. <struts>  
  4. <!-- setting encoding,DynamicMethod,language        
  5. <constant name="struts.custom.i18n.resources" value="messageResource"></constant>    -->  
  6.     <constant name="struts.i18n.encoding" value="UTF-8"/>  
  7.     <constant name="struts.enable.DynamicMethodInvocation"  value="true"/>  
  8.     <!-- add package here extends="struts-default"-->  
  9.     <package name="default" extends="json-default"><!--需要将struts-default改为-->  
  10.         <action name="login" class="com.easyway.json.android.LoginAction"  
  11.             method="login">  
  12.             <span style="color: #ff0000;"><result type="json"/></span>  
  13.             <!--返回值类型设置为json,不设置返回页面-->  
  14.         </action>  
  15.     </package>  
  16. </struts>  

 web.xml

Java代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  5.     <!-- 定义Struts2的核心控制器:FilterDispatcher -->  
  6.     <filter>  
  7.         <!-- 定义核心Filter的名称 -->  
  8.         <filter-name>struts2</filter-name>  
  9.         <!-- 定义Filter的实现类 -->  
  10.         <filter-class>  
  11.             org.apache.struts2.dispatcher.FilterDispatcher  
  12.         </filter-class>  
  13.     </filter>  
  14.     <filter-mapping>  
  15.         <filter-name>struts2</filter-name>  
  16.         <url-pattern>/*</url-pattern>  
  17.     </filter-mapping>  
  18.     <welcome-file-list>  
  19.         <welcome-file>index.jsp</welcome-file>  
  20.     </welcome-file-list>  
  21. </web-app>  

jsp测试页面:

Html代码   收藏代码
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%@ taglib uri="/struts-tags" prefix="s"%>  
  3. <%  
  4. String path = request.getContextPath();  
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  6. %>  
  7. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  8. <html>  
  9. <head>  
  10. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  11. <title>Ajax调用web服务</title>  
  12. <script type="text/javascript">  
  13. var xmlHttpReq;    //用于保存XMLHttpRequest对象的全局变量  
  14.   
  15. //用于创建XMLHttpRequest对象  
  16. function createXmlHttp() {  
  17.     //根据window.XMLHttpRequest对象是否存在使用不同的创建方式  
  18. //    if (window.XMLHttpRequest) {  
  19. //       xmlHttp = new XMLHttpRequest();                  //FireFox、Opera等浏览器支持的创建方式  
  20. //   } else {  
  21. //      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//IE浏览器支持的创建方式  
  22. //    }  
  23.     if (window.ActiveXObject) {  
  24.         xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");  
  25.     } else if (window.XMLHttpRequest) {  
  26.         xmlHttpReq = new XMLHttpRequest();  
  27.     }  
  28. }  
  29.   
  30. function loadAjax() {  
  31.     alert("-------1----------");  
  32.     createXmlHttp();                        //创建XmlHttpRequest对象  
  33.       alert("-------2---------");  
  34.         
  35.       
  36.     var url="http://localhost:8080/AndroidStruts2JSON/login.action?userName=admin&password=123456&date="+new Date();  
  37.     xmlHttpReq.open("get", encodeURI(encodeURI(url+param,"UTF-8"),"UTF-8"), true);  
  38.     //xmlHttpReq.open("get", encodeURI(encodeURI(url,"UTF-8"),"UTF-8"), true);//上传图片  
  39.     xmlHttpReq.setrequestheader("content-type","application/x-www-form-urlencoded");//post提交设置项  
  40.     xmlHttpReq.onreadystatechange = loadCallback;  //IE这里设置回调函数  
  41.     xmlHttpReq.send(null);  
  42.       
  43. }  
  44.   
  45.   
  46. function loadCallback() {  
  47.     alert("-------3---------");  
  48.     //alert(xmlHttpReq.readyState);  
  49.     if (xmlHttpReq.readyState == 4) {  
  50.        alert("aa");  
  51.         //if(xmlHttpReq.status==200){  
  52.         document.getElementById("contentDiv").innerHTML=xmlHttpReq.responseText;  
  53.         //}  
  54.     }  
  55. }  
  56.   
  57.   
  58. </script>  
  59.   
  60. <body>  
  61. <div id="contentTypeDiv">  
  62. </div>  
  63. <br/><br/>  
  64. <div id="contentDiv">  
  65. </div>  
  66.   
  67.   
  68.   
  69.   
  70. <input type="button" value="调用" onclick="loadAjax()">  
  71.   
  72. </body>  
  73. </head>  
  74. </html>  

 

 

手机前台服务:

Java代码   收藏代码
  1. package com.easyway.android.json;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.http.HttpEntity;  
  6. import org.apache.http.HttpResponse;  
  7. import org.apache.http.client.ClientProtocolException;  
  8. import org.apache.http.client.HttpClient;  
  9. import org.apache.http.client.methods.HttpGet;  
  10. import org.apache.http.impl.client.DefaultHttpClient;  
  11. import org.apache.http.util.EntityUtils;  
  12. import org.json.JSONException;  
  13. import org.json.JSONObject;  
  14.   
  15. import android.app.Activity;  
  16. import android.app.AlertDialog;  
  17. import android.app.AlertDialog.Builder;  
  18. import android.content.DialogInterface;  
  19. import android.os.Bundle;  
  20. import android.os.StrictMode;  
  21. import android.util.Log;  
  22. import android.view.View;  
  23. import android.widget.Button;  
  24. import android.widget.EditText;  
  25. /** 
  26.   
  27.  *   
  28.  *   
  29.  * 在android中有时候我们不需要用到本机的SQLite数据库提供数据,更多的时候是从网络上获取数据, 
  30.  * 那么Android怎么从服务器端获取数据呢?有很多种,归纳起来有 
  31.  *  一:基于Http协议获取数据方法。 
  32.  *  二:基于SAOP协议获取数据方法 
  33.  * 
  34.  *备注:在网络有关的问题最好添加以下两项: 
  35.  *   1.线程和虚拟机策略 
  36.  *   ///在Android2.2以后必须添加以下代码 
  37. *           //本应用采用的Android4.0 
  38. *           //设置线程的策略 
  39. *            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()    
  40. *            .detectDiskReads()    
  41. *            .detectDiskWrites()    
  42. *            .detectNetwork()   // or .detectAll() for all detectable problems    
  43. *            .penaltyLog()    
  44. *            .build());    
  45. *           //设置虚拟机的策略 
  46. *         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()    
  47. *                    .detectLeakedSqlLiteObjects()    
  48. *                    //.detectLeakedClosableObjects()    
  49. *                    .penaltyLog()    
  50. *                    .penaltyDeath()    
  51. *                    .build()); 
  52. *      2.可以访问网络的权限: 
  53. *       即AndroidManifest.xml中配置: 
  54. *        <uses-permission android:name="android.permission.INTERNET"/> 
  55.  * 
  56.  *  
  57.  * @author longgangbai 
  58.  *  
  59.  * 
  60.  */  
  61. public class AndroidHttpJSONActivity extends Activity {  
  62.      private static  String processURL="http://192.168.134.1:8080/AndroidStruts2JSON/login.action?";  
  63.           
  64.       private EditText txUserName;  
  65.       private EditText txPassword;  
  66.       private Button btnLogin;  
  67.         
  68.         /** 
  69.          *  Called when the activity is first created. 
  70.          */  
  71.         @Override  
  72.         public void onCreate(Bundle savedInstanceState) {  
  73.             ///在Android2.2以后必须添加以下代码  
  74.             //本应用采用的Android4.0  
  75.             //设置线程的策略  
  76.              StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()     
  77.              .detectDiskReads()     
  78.              .detectDiskWrites()     
  79.              .detectNetwork()   // or .detectAll() for all detectable problems     
  80.              .penaltyLog()     
  81.              .build());     
  82.             //设置虚拟机的策略  
  83.               StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()     
  84.                      .detectLeakedSqlLiteObjects()     
  85.                      //.detectLeakedClosableObjects()     
  86.                      .penaltyLog()     
  87.                      .penaltyDeath()     
  88.                      .build());  
  89.             super.onCreate(savedInstanceState);  
  90.             //设置页面布局  
  91.             setContentView(R.layout.main);  
  92.             //设置初始化视图  
  93.             initView();  
  94.             //设置事件监听器方法  
  95.             setListener();  
  96.         }  
  97.         /** 
  98.          * 创建初始化视图的方法 
  99.          */  
  100.         private void initView() {  
  101.             btnLogin=(Button)findViewById(R.id.btnLogin);  
  102.             txPassword=(EditText)findViewById(R.id.txtPassword);  
  103.             txUserName=(EditText)findViewById(R.id.txtUserName);  
  104.         }  
  105.   
  106.         /** 
  107.          * 设置事件的监听器的方法 
  108.          */  
  109.         private void setListener() {  
  110.             btnLogin.setOnClickListener(new View.OnClickListener() {  
  111.                 @Override  
  112.                 public void onClick(View v) {  
  113.                     String userName=txUserName.getText().toString();  
  114.                     String password=txPassword.getText().toString();  
  115.                     loginRemoteService(userName,password);  
  116.                 }  
  117.             });  
  118.         }  
  119.       
  120.     /** 
  121.      * 获取Struts2 Http 登录的请求信息 
  122.      * @param  userName 
  123.      * @param  password 
  124.      */  
  125.     public void loginRemoteService(String userName,String password){  
  126.         String result=null;  
  127.         try {  
  128.                    
  129.             //创建一个HttpClient对象  
  130.             HttpClient httpclient = new DefaultHttpClient();  
  131.             //远程登录URL  
  132.             processURL=processURL+"userName="+userName+"&password="+password;  
  133.             Log.d("远程URL", processURL);  
  134.             //创建HttpGet对象  
  135.             HttpGet request=new HttpGet(processURL);  
  136.             //请求信息类型MIME每种响应类型的输出(普通文本、html 和 XML,json)。允许的响应类型应当匹配资源类中生成的 MIME 类型  
  137.             //资源类生成的 MIME 类型应当匹配一种可接受的 MIME 类型。如果生成的 MIME 类型和可接受的 MIME 类型不 匹配,那么将  
  138.             //生成 com.sun.jersey.api.client.UniformInterfaceException。例如,将可接受的 MIME 类型设置为 text/xml,而将  
  139.             //生成的 MIME 类型设置为 application/xml。将生成 UniformInterfaceException。  
  140.             request.addHeader("Accept","text/json");  
  141.             //获取响应的结果  
  142.             HttpResponse response =httpclient.execute(request);  
  143.             //获取HttpEntity  
  144.             HttpEntity entity=response.getEntity();  
  145.             //获取响应的结果信息  
  146.             String json =EntityUtils.toString(entity,"UTF-8");  
  147.             //JSON的解析过程  
  148.             if(json!=null){  
  149.                 JSONObject jsonObject=new JSONObject(json);  
  150.                 result=jsonObject.get("message").toString();  
  151.             }  
  152.            if(result==null){  
  153.                json="登录失败请重新登录";  
  154.            }  
  155.             //创建提示框提醒是否登录成功  
  156.              AlertDialog.Builder builder=new Builder(AndroidHttpJSONActivity.this);  
  157.              builder.setTitle("提示")  
  158.              .setMessage(result)  
  159.              .setPositiveButton("确定"new DialogInterface.OnClickListener() {  
  160.                   
  161.                 @Override  
  162.                 public void onClick(DialogInterface dialog, int which) {  
  163.                     dialog.dismiss();  
  164.                 }  
  165.             }).create().show();  
  166.            
  167.          } catch (ClientProtocolException e) {  
  168.             // TODO Auto-generated catch block  
  169.             e.printStackTrace();  
  170.         } catch (IOException e) {  
  171.             // TODO Auto-generated catch block  
  172.             e.printStackTrace();  
  173.         } catch (JSONException e) {  
  174.             // TODO Auto-generated catch block  
  175.             e.printStackTrace();  
  176.         }  
  177.     }  
  178. }  

  

 

 

 

分享到:
评论
9 楼 piaomiaowc1 2013-05-29  
longgangbai 写道
piaomiaowc1 写道
我使用servlet做的,不知道能不能成功改成这个
学习了!感谢楼主!

肯定可以,struts2底层也就是Servlet和反射代理等实现的。

得好好研究下!
8 楼 longgangbai 2013-05-29  
piaomiaowc1 写道
我使用servlet做的,不知道能不能成功改成这个
学习了!感谢楼主!

肯定可以,struts2底层也就是Servlet和反射代理等实现的。
7 楼 piaomiaowc1 2013-05-29  
我使用servlet做的,不知道能不能成功改成这个
学习了!感谢楼主!
6 楼 longgangbai 2013-02-02  
hayen201986 写道
为什么我用手机测试  点登陆没反应呢?????

debug测试以下不就知道了
5 楼 hayen201986 2013-01-24  
为什么我用手机测试  点登陆没反应呢?????
4 楼 zhengxihong198861 2012-11-30  
     
3 楼 心惶惶呀 2012-09-10  
   
2 楼 longgangbai 2012-05-25  
wds1181977 写道
我为什么总是404错误

404的原因可能是页面找不到。要从两个方面分析。可能手机的路径写错了
1.首先要明白即使是手机的虚拟机和后台struts2在一台机器上,手机的虚拟机相等于一个linux系统,所以是不同的服务ip故,但是手机客户端请求的路径是不能采用localhost作为服务ip的。
2.检查服务端struts2在没有采用手机端是否正常运行。采用ajax测试一下验证一下。
综合以上两点基本上应该没有问题。
1 楼 wds1181977 2012-05-22  
我为什么总是404错误
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值