为什么80%的码农都做不了架构师?>>>   

首先,服务器端已经存在一个项目,该项目基于SSH,已经部署在tomcat上并且正在运行了.我在这个项目的action层新建了一个包,该包主要是Struts2的一些action,只是这些action不是返回某些view,而是返回json,定义这些action的XML配置如下:

<package name="mobie" namespace="/mobie" extends="json-default"><action name="login" class="loginAction" method="login"><!-- 设置返回类型为json --><result name="success" type="json"><!-- 将对象放进一个map里面,这个map作为该action的一个field,必须具有setter个getter方法这样就可以向客户端返回整个实体的json对象,这个在需要返回复杂的组和对象是比较实用 --><param name="root">dataMap</param></result></action></package>

action类:

import java.util.HashMap;
import java.util.Map;import com.jeanselam.intf.UserService;
import com.jeanselam.pojo.User;
import com.opensymphony.xwork2.ActionSupport;public class LoginAction extends ActionSupport{private static final long serialVersionUID = 1L;private String email;private String password;private User user;private Map<String, Object> dataMap = new HashMap<String, Object>();private UserService userService;//业务接口,不写出来,省略public Map<String, Object> getDataMap() {return dataMap;}public void setDataMap(Map<String, Object> dataMap) {this.dataMap = dataMap;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public UserService getUserService() {return userService;}public void setUserService(UserService userService) {this.userService = userService;}public String login() throws Exception{//System.out.println("---------------------------移动端登陆");System.out.println("---------------------------移动端登陆"+email+"\t"+password);user = userService.login(email, password);dataMap.put("user", user);if(user != null){return SUCCESS;}return ERROR;}}

然后,在服务器端和android端都应该有相同的一个实体类,并且解析的json的字段名必须和该类的field名一致:

import java.util.Set;/*** Created by lin on 15-11-8.**/
public class User{private Integer id;private String email;private String password;private Integer gender;private String tel;private String nickname;private Integer isActive;//是否处于激活状态:1 是    0 否private Address address;private Set<Order> orders;//一对多public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Integer getGender() {return gender;}public void setGender(Integer gender) {this.gender = gender;}public String getTel() {return tel;}public void setTel(String tel) {this.tel = tel;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public Integer getIsActive() {return isActive;}public void setIsActive(Integer isActive) {this.isActive = isActive;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public Set<Order> getOrders() {return orders;}public void setOrders(Set<Order> orders) {this.orders = orders;}@Overridepublic String toString() {return "User{" +"id=" + id +", email='" + email + '\'' +", password='" + password + '\'' +", gender=" + gender +", tel='" + tel + '\'' +", nickname='" + nickname + '\'' +", isActive=" + isActive +", address=" + address +", orders=" + orders +'}';}
}

然后主要开发android端,在android端我的思路大概是这样的:通过http协议访问服务器端的action,服务器返回json,然后android接受json后,通过解析json构造出实例,然后显示在activity上反馈给用户.于是,在android端的主要工作就是解析json和显示数据的问题了,而解析json的工作可以通过某些包来做比较方便.

新建android项目:导入一下jar包:

界面文件:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:paddingBottom="@dimen/activity_vertical_margin"tools:context="com.ddd3.ddd3.MainActivity"android:orientation="vertical"android:background="@color/colorBackground"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="JeanseLam™"android:textSize="35dp"android:textColor="@color/colorText"/><Viewandroid:layout_width="match_parent"android:layout_height="1dip"android:background="#696969"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"/><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/mainUrl"android:textSize="20dp"android:textColor="@color/colorText"/><Viewandroid:layout_width="fill_parent"android:layout_height="40dp"></View><TextViewandroid:id="@+id/loginInfo"android:layout_width="fill_parent"android:layout_height="wrap_content"android:textSize="15dp"android:textColor="@color/colorError"/><EditTextandroid:id="@+id/email"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginBottom="10dp"android:hint="Type your Email"/><EditTextandroid:id="@+id/password"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginBottom="10dp"android:password="true"android:hint="Enter password"/><Buttonandroid:id="@+id/btn_login"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@drawable/button_selector"android:text="登录"android:textColor="@color/colorBtnText"android:layout_marginBottom="10dp"/><Buttonandroid:id="@+id/btn_exit"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="退出"android:background="@drawable/button_selector"android:textColor="@color/colorBtnText"android:layout_marginBottom="10dp"/><TextViewandroid:id="@+id/btn_register"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="新用户?"android:textColor="@color/colorText"android:autoLink="all"/></LinearLayout>

activity:

package com.ddd3.ddd3;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.ddd3.entity.User;
import com.ddd3.service.JSONService;public class MainActivity extends AppCompatActivity {private EditText emailText;private EditText passwordText;private Button btn_login;private Button btn_exit;private TextView info;private RequestQueue requestQueue;//用于网络网络请求,每一个activity只需要一个requestQueue//private UserService userService;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView(){emailText = (EditText)findViewById(R.id.email);passwordText = (EditText)findViewById(R.id.password);btn_login = (Button)findViewById(R.id.btn_login);btn_exit = (Button)findViewById(R.id.btn_exit);info = (TextView)findViewById(R.id.loginInfo);btn_login.setOnClickListener(new ButtonListener());btn_exit.setOnClickListener(new ButtonListener());requestQueue = Volley.newRequestQueue(this);//实例化请求队列}class ButtonListener implements View.OnClickListener{@Overridepublic void onClick(View v) {if(v.getId() == btn_login.getId()){String email = emailText.getText().toString();String password = passwordText.getText().toString();if(email.equals("") || password.equals("")){info.setText("请输入您的Email和密码");}else{//服务端url
String url = "http://192.168.56.1:8080/JeanseLam/mobie/login?email="+email+"&password="+password;JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET,url, null, new Response.Listener<org.json.JSONObject>() {@Overridepublic void onResponse(org.json.JSONObject jsonObject) {//System.out.println("----------------"+jsonObject.toString());String jsonStr = jsonObject.toString();//由于服务器端传过来的date格式gson默认是无法解析的,所以在创建gson的时候就要对date的格式进行设置Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create();//在服务器端传过来的json是包含类名的,应该做些字符串的处理,把类名去掉才可解析成实体类,否则解析的类的所有属性值均为null,我实验过了User user = gson.fromJson(jsonStr.substring(jsonStr.indexOf(":")+1,jsonStr.length()-1), new TypeToken<User>() {}.getType());//构造实例//System.out.println("-------------------"+user.toString());application.getSession().put("user", user);//用户登陆信息作为全局变量Intent intent = new Intent(MainActivity.this,IndexActivity.class);//转到主页startActivity(intent);}
}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {System.out.println("-------------------"+error.getMessage());}
});
jr.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 1, 1.0f));
requestQueue.add(jr);}}else if(v.getId() == btn_exit.getId()){android.os.Process.killProcess(android.os.Process.myPid());}}}
}


需要注意的是:由于访问本地项目,url的地址为:192.168.56.1:8080而不是localhost或其他


转载于:https://my.oschina.net/ChiLin/blog/528850

android客户端访问服务端tomcat相关推荐

  1. android客户端访问服务端,服务端返回json数据

    json这里选用了fast-json 先看服务端代码如下 package novelserver.servlet;import java.io.IOException; import java.io. ...

  2. 在线登录注册功能(android客户端+javaweb服务端+腾讯云服务器+腾讯云数据库)

    在线登录注册功能(android客户端+javaweb服务端+腾讯云服务器+腾讯云数据库) 完整的项目已上传github仓库,链接在文章最下面 注:笔者在安卓客户端部分写了kotlin语言和java语 ...

  3. 【Android 开发】: Android客户端与服务端之间使用JSON交互数据。

    在前面的两讲中,我们讲解了JSON数据格式的一些基本知识,以及做一些小Demo,这一讲我们在前面的基础上来做一个综合的可扩展的Demo,主要是针对Android客户端解析服务端传递过来的JSON数据. ...

  4. Android 客户端与服务端的数据交互问题

    Android客户端是如何与服务端的数据进行交互的呢? 一般就是客户端向服务端发送请求,服务端对数据进行相关处理,返回json数据返回给客户端,客户端再进行相关操作. 说明:主要是用登录功能来进行详解 ...

  5. android客户端和服务端交互,谈谈android客户端和网站数据交互的实现

    android客户端一般不直接访问网站数据库,而是像浏览器一样发送get或者post请求,然后网站返回客户端能理解的数据格式,客户端解析这些数据,显示在界面上,常用的数据格式是xml和json. 可以 ...

  6. 胖葵酒店管理系统(android客户端+javaweb服务端+腾讯云服务器+腾讯云数据库)

    胖葵酒店管理系统app 完整项目已上传github,链接在文章下面 先看效果图: 登录: 主页面(点击右上角图标进入个人中心页面): 经理模块(客房管理模块和员工管理模块与经理管理模块类似,员工管理模 ...

  7. android+okhttp+java服务端(tomcat)+mysql实现登录注册

    先上代码(文章结尾有遇到的问题和对应解决方案) android客户端 >android:app-build.gradle 1.添加okhttp依赖,具体根据自己的okhttp包来决定 depen ...

  8. Android客户端和服务端如何使用Token和Session

    对于初学者来说,对Token和Session的使用难免会限于困境,开发过程中知道有这个东西,但却不知道为什么要用他?更不知道其原理,今天我就带大家一起分析分析这东西. 一.我们先解释一下他的含义: 1 ...

  9. eclipse生成webservice客户端代码以及通过客户端访问服务端

    最近工作中需要用到webservice调用其他服务,没接触过这个,研究了几天,做个记录 1.eclipse生成webservice客户端:打开eclipse, File >> New &g ...

最新文章

  1. 《中国人工智能学会通讯》——2.13 医疗服务机器人综述
  2. bean的属性类型----ibatis类型-------oracle数据库类型
  3. mvn 使用中的错误
  4. 计算机二级access什么时候报名_全国计算机等级考试什么时候报名
  5. Win7+IIS7下用FastCGI模式配置PHP环境
  6. 【AI视野·今日CV 计算机视觉论文速览 第179期】Tue, 25 Feb 2020
  7. Maven学习总结(25)——Eclipse Maven Update 时JDK版本变更问题
  8. Oracle 11gR2 RAC OCR和votingdisk故障恢复案例
  9. java字符转为数字_java判断字符串是否可以转为数字
  10. 【Oracle】用户管理
  11. Ngnix中的fastcgi参数性能优化和解释
  12. coco 数据集_PyTorch版YOLOv4更新了,适用于自定义数据集
  13. 处理minidump文件用到的“工具”的分享
  14. 群晖nas存储系统原理_一篇看懂黑群晖重装系统
  15. 不会做PPT图表?1000个高大上的PPT图表,0门槛0套路,想要就给你
  16. java中的xpath,读取xml文档。
  17. 非专业学生如何系统的学习计算机编程?
  18. 谷歌人机图像识别接口
  19. 编程入门先要学什么?打怪升级走起来!
  20. 浅谈一类积性函数的前缀和

热门文章

  1. 特来电CMDB应用实践
  2. pycharm与python环境配置
  3. Python ConfigParser 模块
  4. java 矩阵转置算法
  5. css动画 animation
  6. HDU 1398 Square Coins
  7. 数据挖掘原理与算法:练习题2
  8. c#_限制TextBox输入类型仅可为“-” “.” 数字
  9. 虚拟机服务器503解决,(图文)解决重启VCSA 6.0提示:503 Service Unavailable错误
  10. ccxprocess启动项可以禁用么_macOS 删除烦人的CCXProcess.app