`
longgangbai
  • 浏览: 7340562 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

 
阅读更多

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

涉及的知识点:

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

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

  3.Android采用JSON的解析。

 

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

 

 

 

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

package com.easyway.json.android;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 在android中有时候我们不需要用到本机的SQLite数据库提供数据,更多的时候是从网络上获取数据,
 * 那么Android怎么从服务器端获取数据呢?有很多种,归纳起来有
 *一:基于Http协议获取数据方法。
 *二:基于SAOP协议获取数据方法,
 *那么我们的这篇文章主要是将关于使用Http协议获取服务器端数据,
 *这里我们采取的服务器端技术为java,框架为Struts2,或者可以有Servlet,又或者可直接从JSP页面中获取数据。
 *那么,接下来我们便开始这一路程:
 *首先:编写服务器端方法,我这里采用的MVC框架是Struts2,目的很单纯,就是为了以后做个完整的商业项目,
 *技术配备为:android+SSH。当然,篇幅有限,我这里就直接用Strtus2而已。
 *服务器端:新建WebProject ,选择Java ee 5.0.
 *为了给项目添加Struts2的支持,我们必须导入Struts2的一些类库,如下即可(有些jar包是不必的,但是我们后来扩展可能是要使用到的,就先弄进去):
 *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
 *ognl-3.0.jar  javassist-3.7.ga.jar commons-ileupload.jar commons-io.jar json-lib-2.1-jdk15.jar  
 *处理JSON格式数据要使用到 struts2-json-plugin-2.2.1.1.jar   
 * 基于struts2的json插件.
 * 
 * 
 * 采用接口注入的方式注入HttpServletRequest,HttpServletResponse对象
 * 
 * @author longgangbai
 *
 */
public class LoginAction extends ActionSupport implements ServletRequestAware,
		ServletResponseAware {
	/** * */
	private static final long serialVersionUID = 1L;

	HttpServletRequest request;

	HttpServletResponse response;
	
	private String userName;
	private String password;
	

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

	public void setServletResponse(HttpServletResponse response) {
		this.response = response;
	}
    
	/**
	 * 模拟用户登录的业务
	 */
	public void login() {
		try {
              //如果不采用接口注入的方式的获取HttpServletRequest,HttpServletResponse的方式
			  // HttpServletRequest request =ServletActionContext.getRequest();
			  // HttpServletResponse response=ServletActionContext.getResponse();
			
			   this.response.setContentType("text/json;charset=utf-8");
			   this.response.setCharacterEncoding("UTF-8");
			   //JSONObject json=new JSONObject(); 
			    Map<String,String> json=new HashMap<String,String>();
				if ("admin".equals(userName)&&"123456".equals(password)) {
					 json.put("message", "欢迎管理员登陆");
				} else if ((!"admin".equals(userName))&&"123456".equals(password)) {
					json.put("message", "欢迎"+userName+"登陆!");
				} else {
					json.put("message", "非法登陆信息!");
				}
			  byte[] jsonBytes = json.toString().getBytes("utf-8");
			  response.setContentLength(jsonBytes.length);
			  response.getOutputStream().write(jsonBytes);
			  response.getOutputStream().flush();
			  response.getOutputStream().close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- setting encoding,DynamicMethod,language      
<constant name="struts.custom.i18n.resources" value="messageResource"></constant>    -->
	<constant name="struts.i18n.encoding" value="UTF-8"/>
	<constant name="struts.enable.DynamicMethodInvocation"  value="true"/>
	<!-- add package here extends="struts-default"-->
	<package name="default" extends="json-default"><!--需要将struts-default改为-->
		<action name="login" class="com.easyway.json.android.LoginAction"
			method="login">
			<result type="json"/>
			<!--返回值类型设置为json,不设置返回页面-->
		</action>
	</package>
</struts>

 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<!-- 定义Struts2的核心控制器:FilterDispatcher -->
	<filter>
		<!-- 定义核心Filter的名称 -->
		<filter-name>struts2</filter-name>
		<!-- 定义Filter的实现类 -->
		<filter-class>
			org.apache.struts2.dispatcher.FilterDispatcher
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

jsp测试页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Ajax调用web服务</title>
<script type="text/javascript">
var xmlHttpReq;    //用于保存XMLHttpRequest对象的全局变量

//用于创建XMLHttpRequest对象
function createXmlHttp() {
    //根据window.XMLHttpRequest对象是否存在使用不同的创建方式
//    if (window.XMLHttpRequest) {
//       xmlHttp = new XMLHttpRequest();                  //FireFox、Opera等浏览器支持的创建方式
//   } else {
//      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//IE浏览器支持的创建方式
//    }
	if (window.ActiveXObject) {
		xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
	} else if (window.XMLHttpRequest) {
		xmlHttpReq = new XMLHttpRequest();
	}
}

function loadAjax() {
    alert("-------1----------");
	createXmlHttp();                        //创建XmlHttpRequest对象
	  alert("-------2---------");
	  
	
	var url="http://localhost:8080/AndroidStruts2JSON/login.action?userName=admin&password=123456&date="+new Date();
	xmlHttpReq.open("get", encodeURI(encodeURI(url+param,"UTF-8"),"UTF-8"), true);
	//xmlHttpReq.open("get", encodeURI(encodeURI(url,"UTF-8"),"UTF-8"), true);//上传图片
	xmlHttpReq.setrequestheader("content-type","application/x-www-form-urlencoded");//post提交设置项
	xmlHttpReq.onreadystatechange = loadCallback;  //IE这里设置回调函数
	xmlHttpReq.send(null);
	
}


function loadCallback() {
    alert("-------3---------");
	//alert(xmlHttpReq.readyState);
    if (xmlHttpReq.readyState == 4) {
       alert("aa");
		//if(xmlHttpReq.status==200){
		document.getElementById("contentDiv").innerHTML=xmlHttpReq.responseText;
		//}
    }
}


</script>

<body>
<div id="contentTypeDiv">
</div>
<br/><br/>
<div id="contentDiv">
</div>




<input type="button" value="调用" onclick="loadAjax()">

</body>
</head>
</html>

 

 

手机前台服务:

package com.easyway.android.json;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
/**
 
 *  
 *  
 * 在android中有时候我们不需要用到本机的SQLite数据库提供数据,更多的时候是从网络上获取数据,
 * 那么Android怎么从服务器端获取数据呢?有很多种,归纳起来有
 *	一:基于Http协议获取数据方法。
 *	二:基于SAOP协议获取数据方法
 *
 *备注:在网络有关的问题最好添加以下两项:
 *   1.线程和虚拟机策略
 *   ///在Android2.2以后必须添加以下代码
*			//本应用采用的Android4.0
*			//设置线程的策略
*			 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()   
*	         .detectDiskReads()   
*	         .detectDiskWrites()   
*	         .detectNetwork()   // or .detectAll() for all detectable problems   
*	         .penaltyLog()   
*	         .build());   
*			//设置虚拟机的策略
*		  StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()   
*			         .detectLeakedSqlLiteObjects()   
*			         //.detectLeakedClosableObjects()   
*			         .penaltyLog()   
*			         .penaltyDeath()   
*			         .build());
*	   2.可以访问网络的权限:
*	    即AndroidManifest.xml中配置:
*	     <uses-permission android:name="android.permission.INTERNET"/>
 *
 * 
 * @author longgangbai
 * 
 *
 */
public class AndroidHttpJSONActivity extends Activity {
	 private static  String processURL="http://192.168.134.1:8080/AndroidStruts2JSON/login.action?";
		
	  private EditText txUserName;
	  private EditText txPassword;
	  private Button btnLogin;
	  
	    /**
	     *  Called when the activity is first created.
	     */
	    @Override
	    public void onCreate(Bundle savedInstanceState) {
	    	///在Android2.2以后必须添加以下代码
			//本应用采用的Android4.0
			//设置线程的策略
			 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()   
	         .detectDiskReads()   
	         .detectDiskWrites()   
	         .detectNetwork()   // or .detectAll() for all detectable problems   
	         .penaltyLog()   
	         .build());   
			//设置虚拟机的策略
			  StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()   
			         .detectLeakedSqlLiteObjects()   
			         //.detectLeakedClosableObjects()   
			         .penaltyLog()   
			         .penaltyDeath()   
			         .build());
	        super.onCreate(savedInstanceState);
	        //设置页面布局
	        setContentView(R.layout.main);
	        //设置初始化视图
	        initView();
	        //设置事件监听器方法
	        setListener();
        }
        /**
         * 创建初始化视图的方法
         */
		private void initView() {
			btnLogin=(Button)findViewById(R.id.btnLogin);
			txPassword=(EditText)findViewById(R.id.txtPassword);
			txUserName=(EditText)findViewById(R.id.txtUserName);
		}

		/**
		 * 设置事件的监听器的方法
		 */
		private void setListener() {
			btnLogin.setOnClickListener(new View.OnClickListener() {
				@Override
				public void onClick(View v) {
					String userName=txUserName.getText().toString();
					String password=txPassword.getText().toString();
					loginRemoteService(userName,password);
				}
			});
		}
    
    /**
     * 获取Struts2 Http 登录的请求信息
     * @param  userName
     * @param  password
     */
    public void loginRemoteService(String userName,String password){
        String result=null;
    	try {
	    		 
	    	//创建一个HttpClient对象
	    	HttpClient httpclient = new DefaultHttpClient();
	    	//远程登录URL
	    	processURL=processURL+"userName="+userName+"&password="+password;
	    	Log.d("远程URL", processURL);
	        //创建HttpGet对象
	    	HttpGet request=new HttpGet(processURL);
	    	//请求信息类型MIME每种响应类型的输出(普通文本、html 和 XML,json)。允许的响应类型应当匹配资源类中生成的 MIME 类型
	    	//资源类生成的 MIME 类型应当匹配一种可接受的 MIME 类型。如果生成的 MIME 类型和可接受的 MIME 类型不 匹配,那么将
	    	//生成 com.sun.jersey.api.client.UniformInterfaceException。例如,将可接受的 MIME 类型设置为 text/xml,而将
	    	//生成的 MIME 类型设置为 application/xml。将生成 UniformInterfaceException。
	    	request.addHeader("Accept","text/json");
	        //获取响应的结果
			HttpResponse response =httpclient.execute(request);
			//获取HttpEntity
			HttpEntity entity=response.getEntity();
			//获取响应的结果信息
			String json =EntityUtils.toString(entity,"UTF-8");
			//JSON的解析过程
			if(json!=null){
				JSONObject jsonObject=new JSONObject(json);
				result=jsonObject.get("message").toString();
			}
		   if(result==null){
			   json="登录失败请重新登录";
		   }
			//创建提示框提醒是否登录成功
			 AlertDialog.Builder builder=new Builder(AndroidHttpJSONActivity.this);
			 builder.setTitle("提示")
			 .setMessage(result)
			 .setPositiveButton("确定", new DialogInterface.OnClickListener() {
				
				@Override
				public void onClick(DialogInterface dialog, int which) {
					dialog.dismiss();
				}
			}).create().show();
		 
    	 } catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
}

  

 

 

 

分享到:
评论
11 楼 longgangbai 2013-11-14  
bloomming 写道
Map<String,String> <SPAN style="COLOR: #ff0000">json</SPAN>=new HashMap<String,String>(); 
这句话报错Map.span cannot be resolved to a type
下面的所有json都报错json cannot be resolved
为什么?

不明白你想说什么
10 楼 bloomming 2013-11-11  
Map<String,String> <SPAN style="COLOR: #ff0000">json</SPAN>=new HashMap<String,String>(); 
这句话报错Map.span cannot be resolved to a type
下面的所有json都报错json cannot be resolved
为什么?
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错误

相关推荐

    struts2+json

    Struts2是一个强大的Java web开发框架,它极大地简化了基于MVC(模型-视图-控制器)架构的应用程序开发。这个资源"struts2+json"显然涉及到在Struts2框架下实现JSON(JavaScript Object Notation)数据交换,这是一...

    Struts2+Json+Android简单实现

    Struts2、JSON和Android是三个在Web应用开发中至关重要的技术。本示例将详细介绍如何结合这三者实现一个简单的交互。 首先,Struts2是一个基于MVC(Model-View-Controller)架构的Java Web框架,它简化了创建动态、...

    struts2+android+Json

    Struts2和Android是两种不同平台上的开发框架,它们在实际应用中经常通过JSON进行数据交互。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易于人阅读和编写,同时也易于机器解析和生成,因此...

    Android远程访问Struts2服务器程序(用到Json解析数据)

    Android+struts2+JSON形式的手机开发 把本机当作服务器,将Android当作客户端 服务器端采用Struts2编码,Android客户端采用Json解析它的数据 服务器端程序为ServerProject(用MyEclipse建立此项目),Android客户端程序...

    android接收json例子struts2Action返回json格式数据

    在Android开发中,与服务器进行数据交互是常见的需求,JSON作为一种轻量级的数据交换格式,被广泛用于客户端和服务器之间的通信。本示例将详细讲解如何在Android应用中通过HTTP请求从Struts2 Action获取JSON格式的...

    android+s2sh+json

    在这个项目中,开发者可能结合了移动应用开发(Android)和服务器端业务逻辑处理(Struts2和Spring),并通过JSON格式进行数据的序列化和反序列化,以便于客户端和服务器之间的通信。 Struts2是一个基于MVC设计模式...

    Android开发HTTP传输数据到Struts2生成Json数据案例

    在这个“Android开发HTTP传输数据到Struts2生成Json数据案例”中,我们将探讨如何实现这一过程。 首先,我们从Android客户端开始。在Android应用中,我们通常使用`HttpURLConnection`或者第三方库如`Volley`、`...

    struts2ToJson

    综上所述,Struts2ToJson帮助Android开发者利用Struts2框架的便利性,高效地进行JSON数据的生成和交换,降低了客户端与服务器通信的复杂性,提升了开发效率和应用性能。在实际项目中,结合恰当的网络库和数据解析...

    android调用struts2源码

    本示例探讨的是如何在Android客户端调用Struts2源码来实现JSON格式的数据交换。 **一、Android客户端调用Struts2** 1. **网络请求库**:Android中,我们可以使用`HttpURLConnection`、`HttpClient`(已废弃)或第...

    Android客户端与服务器通信+json交互数据

    Struts2使用JSON插件可以方便地将Java对象转换为JSON格式返回给客户端。 JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Android中,有多种库可以处理JSON,例如Gson和Jackson,...

    Struts2_Android(2.2)_模拟数据访问项目 JSON项目

    在“Struts2_Android(2.2)_模拟数据访问项目 JSON项目”中,我们关注的是如何在Android客户端与Struts2后端之间进行JSON数据交换。这个项目可能是为了展示如何在Android应用中利用Struts2提供的服务接口来获取或提交...

    myeclipse8下STRUTS(自带JSON插件)的JSON传值例子.rar

    STRUTS作为Java Web开发的一个热门框架,通过集成JSON插件,能够方便地实现JSON数据的传递。本示例主要探讨的是如何在MyEclipse8环境下,利用STRUTS框架内置的JSON支持,进行JSON数据的传递,同时避免了额外下载和...

    基于android开发的服务器端和客户端例子Struts2AndJSON

    这个例子为开发者提供了一个实践平台,帮助他们理解如何在Android应用中集成Struts2服务器和JSON数据交换,对于学习Android网络编程和服务器端开发有很高的参考价值。通过深入研究和实践这个示例,开发者可以提升...

    JAVA+JSP+Servlet+android+SSH视频教程全集+项目视频 亲自总结

    2. **开发环境搭建**:安装Android Studio、配置模拟器。 3. **UI设计**:布局管理器的使用、常用控件的属性设置。 4. **Activity与Intent**:Activity生命周期、Intent传递数据。 5. **数据存储**:...

    struts2小程序 struts2代码

    这个“struts2小程序”很可能是开发者利用Struts2框架开发的一个小型项目,可能包含了基本的CRUD操作或其他特定功能。在描述中提到花费了3小时搭建,暗示这可能是一个简单的入门示例,用于学习或教学目的。 Struts2...

    android客户端上传文件,struts2服务端接收

    在Android应用开发中,文件上传是一项常见的功能,通常用于用户分享图片、文档等信息到服务器。Struts2作为Java Web框架,提供了处理文件上传的能力。本篇将详细讲解如何实现Android客户端上传文件以及Struts2服务端...

    Android与服务器端数据交互(http协议整合struts2 android).doc

    文中提到了使用json-lib和struts2的JSON插件来处理JSON格式的数据。 5. **Android客户端**: - **发送HTTP请求**:在Android应用中,可以使用`HttpURLConnection`或`OkHttp`库发送HTTP请求到服务器,获取JSON或...

Global site tag (gtag.js) - Google Analytics