日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Android+struts2+JSON方式的手機開發(fā)

系統 2898 0

???? 在手機的后臺服務無論是調用WebService還是Http請求,多數都是采用Android的HttpClient實現相關的調用實現。本文實現Android+Struts2+JSON方式實現為手機前臺提供服務。

涉及的知識點:

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

? 2.Android前臺訪問Web采用HttpClient方式。

? 3.Android采用JSON的解析。

?

?功能:模擬遠程登錄流程:

? Android+struts2+JSON方式的手機開發(fā)

?

?

手機后臺服務:由于采用Struts2的JSON響應格式,響應詳細會自動轉變?yōu)镴SON格式,故直接輸出即可。

    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,目的很單純,就是為了以后做個完整的商業(yè)項目,
 *技術配備為: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;
	}
    
	/**
	 * 模擬用戶登錄的業(yè)務
	 */
	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對象的全局變量

//用于創(chuàng)建XMLHttpRequest對象
function createXmlHttp() {
    //根據window.XMLHttpRequest對象是否存在使用不同的創(chuàng)建方式
//    if (window.XMLHttpRequest) {
//       xmlHttp = new XMLHttpRequest();                  //FireFox、Opera等瀏覽器支持的創(chuàng)建方式
//   } else {
//      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//IE瀏覽器支持的創(chuàng)建方式
//    }
	if (window.ActiveXObject) {
		xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
	} else if (window.XMLHttpRequest) {
		xmlHttpReq = new XMLHttpRequest();
	}
}

function loadAjax() {
    alert("-------1----------");
	createXmlHttp();                        //創(chuàng)建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();
	        //設置事件監(jiān)聽器方法
	        setListener();
        }
        /**
         * 創(chuàng)建初始化視圖的方法
         */
		private void initView() {
			btnLogin=(Button)findViewById(R.id.btnLogin);
			txPassword=(EditText)findViewById(R.id.txtPassword);
			txUserName=(EditText)findViewById(R.id.txtUserName);
		}

		/**
		 * 設置事件的監(jiān)聽器的方法
		 */
		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 {
	    		 
	    	//創(chuàng)建一個HttpClient對象
	    	HttpClient httpclient = new DefaultHttpClient();
	    	//遠程登錄URL
	    	processURL=processURL+"userName="+userName+"&password="+password;
	    	Log.d("遠程URL", processURL);
	        //創(chuàng)建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="登錄失敗請重新登錄";
		   }
			//創(chuàng)建提示框提醒是否登錄成功
			 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();
		}
    }
}
  

??

?

?

?

Android+struts2+JSON方式的手機開發(fā)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 绍兴市| 疏勒县| 明水县| 奉贤区| 赤城县| 东平县| 承德市| 关岭| 宜州市| 奉节县| 五指山市| 安溪县| 乃东县| 乐清市| 安宁市| 定襄县| 灌云县| 深水埗区| 开封市| 合水县| 宜昌市| 南部县| 青海省| 娱乐| 湖州市| 常山县| 临清市| 淮阳县| 井冈山市| 鄢陵县| 曲阜市| 隆子县| 德格县| 民丰县| 醴陵市| 洮南市| 法库县| 恭城| 岗巴县| 岳阳市| 东城区|