android与服务器交互的应用怎么设计
笔者以前是学的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,,中央桥创建成功后进入频道对应设置环节,左边板块为程序抓取到的论坛板块;右边为所创建应用频道;在下拉框中选择您应用中所需要与论坛板块对接的频道,选好后点对接;也可以点新建频道对接,系统自动会在应用中生成一个与您论坛板块名字一样的应用频道(新生成的频道图标、介绍、权限设置等可在对接好后自行在频道设置中再修改);频道对应设置好后,点击开启同步,看到“启动中”绿色文字则为中央桥对接成功。
0条评论