android与服务器交互的应用怎么设计

android与服务器交互的应用怎么设计,第1张

  笔者以前是学的Java EE,由于项目需要要开发Android,所以临时补了一个多星期,主要是手机端和服务器交互,双向开发的。 转载

  首先在服务器端,我采用的是SSH框架,struts 2集合了JSON插件,服务器和客户端的信息交互采用的JSON来传输,由于在服务器端用了Struts 2,所以我就用装了一个JSON插件。这样,很轻易的就把服务器端的信息用JSON的形式发送到了手机端。以下是代码:

  首先,在服务器端搭建好SSH框架,具体细节就不在陈述。strutsxml配置如下:

  <packagename="login"extends="json-default">

  <actionname="login"class="comjclicktestLoginAction"method="login">

  <resulttype="json"><paramname="includeProperties">result</param></result>

  </action>

  </package>

  

  <packagename="login"extends="json-default">

  <actionname="login"class="comjclicktestLoginAction"method="login">

  <resulttype="json"><paramname="includeProperties">result</param></result>

  </action>

  </package>

  手机端的代码如下:

  首先,手机端有一个缓存类,主要用于缓存一些手机端需要访问的数据,这样的好处是可以达达节省手机和服务器的交互,用单例实现的:

  packagecomjclickcache;

  

  importcomjclickbeanUser;

  

  publicclassCache{

  

  privateUserUser;

  

  privateCache(){

  

  }

  /构造单例/

  privatestaticclassCacheHolder{

  privatestaticfinalCacheINSTANCE=newCache();

  }

  publicCachegetInstance(){

  returnCacheHolderINSTANCE;

  }

  publicUsergetUser(){

  returnUser;

  }

  publicvoidsetUser(UserUser){

  thisUser=User;

  }

  

  }

  

  packagecomjclickcache;

  

  importcomjclickbeanUser;

  

  publicclassCache{

  

  privateUserUser;

  

  privateCache(){

  

  }

  /构造单例/

  privatestaticclassCacheHolder{

  privatestaticfinalCacheINSTANCE=newCache();

  }

  publicCachegetInstance(){

  returnCacheHolderINSTANCE;

  }

  publicUsergetUser(){

  returnUser;

  }

  publicvoidsetUser(UserUser){

  thisUser=User;

  }

  

  }

  接着开始书写手机端的协议,用户向服务器发送请求,同时服务器反馈给手机端信息的:

  packagecomjclickprotocol;

  

  importjavaioBufferedReader;

  importjavaioInputStreamReader;

  importjavautilArrayList;

  importjavautilList;

  

  importorgapachehttpHttpResponse;

  importorgapachehttpNameValuePair;

  importorgapachehttpclientHttpClient;

  importorgapachehttpcliententityUrlEncodedFormEntity;

  importorgapachehttpclientmethodsHttpPost;

  importorgapachehttpimplclientDefaultHttpClient;

  importorgapachehttpmessageBasicNameValuePair;

  importorgjsonJSONException;

  importorgjsonJSONObject;

  

  publicclassBaseProtocol{

  privateStringBuildersb=newStringBuilder();

  

  privateHttpClienthttpClient;

  privateHttpPosthttpRequest;

  privateHttpResponseresponse;

  

  privateList<NameValuePair>nameValuePair=newArrayList<NameValuePair>();

  

  BaseProtocol(){

  httpClient=newDefaultHttpClient();

  }

  

  /

  向服务器端发送请求

  

  @paramurl

  @throwsException

  /

  protectedvoidpack(Stringurl)throwsException{

  httpClient=newDefaultHttpClient();

  httpRequest=newHttpPost(url);

  

  httpRequestsetEntity(newUrlEncodedFormEntity(nameValuePair));

  response=httpClientexecute(httpRequest);

  }

  

  /

  得到返回数据

  

  @paramurl

  @return

  @throwsException

  /

  protectedvoidparse()throwsException{

  //TODO状态处理500200

  if(responsegetStatusLine()getStatusCode()==200){

  

  BufferedReaderbufferedReader2=newBufferedReader(

  newInputStreamReader(responsegetEntity()getContent()));

  for(Strings=bufferedReader2readLine();s!=null;s=bufferedReader2

  readLine()){

  sbappend(s);

  }

  }

  }

  

  /

  向服务器发送信息

  

  @paramkey

  @paramvalue

  /

  publicvoidaddNameValuePair(Stringkey,Stringvalue){

  nameValuePairadd(newBasicNameValuePair(key,value));

  }

  

  /

  返回JSONObject对象数据模型

  

  @return

  @throwsJSONException

  /

  publicJSONObjectgetJSON()throwsJSONException{

  returnnewJSONObject(sbtoString());

  }

  

  }

  

  packagecomjclickprotocol;

  

  importjavaioBufferedReader;

  importjavaioInputStreamReader;

  importjavautilArrayList;

  importjavautilList;

  

  importorgapachehttpHttpResponse;

  importorgapachehttpNameValuePair;

  importorgapachehttpclientHttpClient;

  importorgapachehttpcliententityUrlEncodedFormEntity;

  importorgapachehttpclientmethodsHttpPost;

  importorgapachehttpimplclientDefaultHttpClient;

  importorgapachehttpmessageBasicNameValuePair;

  importorgjsonJSONException;

  importorgjsonJSONObject;

  

  publicclassBaseProtocol{

  privateStringBuildersb=newStringBuilder();

  

  privateHttpClienthttpClient;

  privateHttpPosthttpRequest;

  privateHttpResponseresponse;

  

  privateList<NameValuePair>nameValuePair=newArrayList<NameValuePair>();

  

  BaseProtocol(){

  httpClient=newDefaultHttpClient();

  }

  

  /

  向服务器端发送请求

  

  @paramurl

  @throwsException

  /

  protectedvoidpack(Stringurl)throwsException{

  httpClient=newDefaultHttpClient();

  httpRequest=newHttpPost(url);

  

  httpRequestsetEntity(newUrlEncodedFormEntity(nameValuePair));

  response=httpClientexecute(httpRequest);

  }

  

  /

  得到返回数据

  

  @paramurl

  @return

  @throwsException

  /

  protectedvoidparse()throwsException{

  //TODO状态处理500200

  if(responsegetStatusLine()getStatusCode()==200){

  

  BufferedReaderbufferedReader2=newBufferedReader(

  newInputStreamReader(responsegetEntity()getContent()));

  for(Strings=bufferedReader2readLine();s!=null;s=bufferedReader2

  readLine()){

  sbappend(s);

  }

  }

  }

  

  /

  向服务器发送信息

  

  @paramkey

  @paramvalue

  /

  publicvoidaddNameValuePair(Stringkey,Stringvalue){

  nameValuePairadd(newBasicNameValuePair(key,value));

  }

  

  /

  返回JSONObject对象数据模型

  

  @return

  @throwsJSONException

  /

  publicJSONObjectgetJSON()throwsJSONException{

  returnnewJSONObject(sbtoString());

  }

  

  }

  接着是登陆协议,在这里我只是模拟登陆使用的一个类,仅供大家参考:

  packagecomjclickprotocol;

  

  importorgjsonJSONObject;

  

  importcomjclickbeanUser;

  

  publicclassLoginProtocolextendsBaseProtocol{

  

  privatefinalstaticStringURL="http://localhost:8080/test/login";

  

  publicbooleancheckLogin(Userusr){

  try{

  pack(URL);

  parse();

  JSONObjectobj=thisgetJSON();

  if(objgetString("result")equals("failed")){

  returnfalse;

  }else{

  returntrue;

  }

  }catch(Exceptione){

  eprintStackTrace();

  returnfalse;

  }

  }

  

  }

  

  packagecomjclickprotocol;

  

  importorgjsonJSONObject;

  

  importcomjclickbeanUser;

  

  publicclassLoginProtocolextendsBaseProtocol{

  

  privatefinalstaticStringURL="http://localhost:8080/test/login";

  

  publicbooleancheckLogin(Userusr){

  try{

  pack(URL);

  parse();

  JSONObjectobj=thisgetJSON();

  if(objgetString("result")equals("failed")){

  returnfalse;

  }else{

  returntrue;

  }

  }catch(Exceptione){

  eprintStackTrace();

  returnfalse;

  }

  }

  

  }

  然后是User实体类,主要用于保存用户信息:

  packagecomjclickbean;

  

  publicclassUser{

  privateStringusername;

  privateStringpassword;

  publicStringgetUsername(){

  returnusername;

  }

  publicvoidsetUsername(Stringusername){

  thisusername=username;

  }

  publicStringgetPassword(){

  returnpassword;

  }

  publicvoidsetPassword(Stringpassword){

  thispassword=password;

  }

  

  }

  

  packagecomjclickbean;

  

  publicclassUser{

  privateStringusername;

  privateStringpassword;

  publicStringgetUsername(){

  returnusername;

  }

  publicvoidsetUsername(Stringusername){

  thisusername=username;

  }

  publicStringgetPassword(){

  returnpassword;

  }

  publicvoidsetPassword(Stringpassword){

  thispassword=password;

  }

  

  }

  最后就是LoginActivity里边判断登陆的代码了,详细代码不再贴出来了,仅贴一个判断登陆的代码:

  privatevoidcheckedData(){

  username=((EditText)findViewById(Ridusername))getText()toString();

  password=((EditText)findViewById(Ridpassword))getText()toString();

  

  Useruser=newUser();

  usersetUsername(username);

  usersetPassword(password);

  LoginProtocollogin=newLoginProtocol();

  booleanresult=logincheckLogin(user);

  

  if(result){SpiderCachegetInstance()setUserSession(user);

  ToastmakeText(getApplicationContext(),"登录成功",1000)show();

  Intentintent=newIntent();

  intentsetClass(LoginActivitythis,WelcomeActivityclass);

  startActivity(intent);

  }else{ToastmakeText(LoginActivitythis,"密码或用户名不匹配,请重新输入!",1000)show();

  }

  }

  

  privatevoidcheckedData(){

  username=((EditText)findViewById(Ridusername))getText()toString();

  password=((EditText)findViewById(Ridpassword))getText()toString();

  

  Useruser=newUser();

  usersetUsername(username);

  usersetPassword(password);

  LoginProtocollogin=newLoginProtocol();

  booleanresult=logincheckLogin(user);

  

  if(result){ SpiderCachegetInstance()setUserSession(user);

  ToastmakeText(getApplicationContext(),"登录成功",1000)show();

  Intentintent=newIntent();

  intentsetClass(LoginActivitythis,WelcomeActivityclass);

  startActivity(intent);

  }else{ ToastmakeText(LoginActivitythis,"密码或用户名不匹配,请重新输入!",1000)show();

  }

  }

  以上代码为了跟大家分享一下,感觉手机端和服务器双向开发非常过瘾。同时对Android的兴趣大大提升,它也没有我们想象中的那么难。

webapp:用html

css

和js开发的运行在

服务器端

的app;

Native

app:根据

手机系统

的默认开发语言开发的app

hybrid

app:基于两者之间的app

而你在问题里说的webapp本身就是一个用手机访问的网站,部署在服务器端,不需要安装,直接通过浏览器访问的,如果是需要安装的app,可以

百度一下

后面两种,你应该就会明白了。

C/S模式和B/S各有其有点也各有其缺点,B/S模式在开发中需要考虑数据如何从客户端提交到服务器端,数据又如何返回到客户端,这些是B/S模式所特有的,在去年之前,开发B/S模式的程序,我都是利用form来交互数据,当我看到XML之后,发现XML是个好冬冬,有很多优点,有好的东西当然不能独享啦,想当年为了实现XML交互数据,几乎把网络翻了个遍。咚,一块砖头上来了。呵呵,废话少说,下面我们就进入正题。

B/S模式分为服务器端和客户端,客户端接受用户的请求,客户端向应用服务提出请求,应用服务从数据库服务中获得数据,应用服务将数据进行计算并将结果提交给客户端,客户端将结果呈现给用户。这样,我们就看到了数据从客户到服务器,经过服务器的处理再返回到客户端,由客户端软件(如IE)显示结果。

(以ASP教本语言为例,其它的语言一样哈。)

1.Form方式

Form方式是最基本的向服务器提交数据的方式。

testasp文件代码:

<%@ Language=VBScript %>

<%

ResponseExpires=-1

ResponseCharSet="UTF-8"

SessionCodePage="65001"

%>

<form name="frmTest" id="frmTest" action="testasp" method="POST">

<input name="name" id=" name" type="text" value="">

<input type="hidden" name="number" id="number" value="10">

<input type="submit" value="Submit" name="B1">

</form>

<%

dim intnumber

dim strname

if IsEmpty(Request("name")) then

strname =""

else

strname =Request("name")

end if

if IsEmpty(Request("number")) then

intnumber =0

else

intnumber =Request("number")

end if

具体步骤如下:

1,浏览器登陆网站首页,鼠标右键—查看网页源代码;

2,在打开的源代码中搜索查看generator,后面所跟内容为当前论坛版本号,搜索查看Content-Type,后面所跟内容为当前论坛编码类型。

3,登陆opencom后台,点击应用管理,选择您需要对接的APP应用;

4,点击网站对接菜单,下载插件对应论坛版本以及编码的插件。目前我们提供dz32、dz31和dz25的gbk和utf8两种类型,以及phpwind87版本;如需对接其它版本,可联系客服,选择好后接着点击提交。

5,点击下载,下载完后,请将解压后的文件cbhook上传到您论坛根目录下然后在浏览器中键入(你的论坛网址/cbhook/indexphp进行安装)

6,在论坛上运行安装插件,只有全部权限为可写才能安装,如果某个权限为不可写,请注意修改(权限修改请联系服务器提供商或者咨询我司技术人员)。安装完毕后回到opencom管理后台进行后面的操作。

7,输入您网站域名,注意域名开头需要加“http://+您的论坛网址”;点击创建中央桥(请确保你的论坛程序安装在根目录下,如果放在特定文件夹中,请打开cbapi_configphp修改文件中论坛程序文件夹路径)。

8,,中央桥创建成功后进入频道对应设置环节,左边板块为程序抓取到的论坛板块;右边为所创建应用频道;在下拉框中选择您应用中所需要与论坛板块对接的频道,选好后点对接;也可以点新建频道对接,系统自动会在应用中生成一个与您论坛板块名字一样的应用频道(新生成的频道图标、介绍、权限设置等可在对接好后自行在频道设置中再修改);频道对应设置好后,点击开启同步,看到“启动中”绿色文字则为中央桥对接成功。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » android与服务器交互的应用怎么设计

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情