android客户端访问服务端tomcat
为什么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相关推荐
- android客户端访问服务端,服务端返回json数据
json这里选用了fast-json 先看服务端代码如下 package novelserver.servlet;import java.io.IOException; import java.io. ...
- 在线登录注册功能(android客户端+javaweb服务端+腾讯云服务器+腾讯云数据库)
在线登录注册功能(android客户端+javaweb服务端+腾讯云服务器+腾讯云数据库) 完整的项目已上传github仓库,链接在文章最下面 注:笔者在安卓客户端部分写了kotlin语言和java语 ...
- 【Android 开发】: Android客户端与服务端之间使用JSON交互数据。
在前面的两讲中,我们讲解了JSON数据格式的一些基本知识,以及做一些小Demo,这一讲我们在前面的基础上来做一个综合的可扩展的Demo,主要是针对Android客户端解析服务端传递过来的JSON数据. ...
- Android 客户端与服务端的数据交互问题
Android客户端是如何与服务端的数据进行交互的呢? 一般就是客户端向服务端发送请求,服务端对数据进行相关处理,返回json数据返回给客户端,客户端再进行相关操作. 说明:主要是用登录功能来进行详解 ...
- android客户端和服务端交互,谈谈android客户端和网站数据交互的实现
android客户端一般不直接访问网站数据库,而是像浏览器一样发送get或者post请求,然后网站返回客户端能理解的数据格式,客户端解析这些数据,显示在界面上,常用的数据格式是xml和json. 可以 ...
- 胖葵酒店管理系统(android客户端+javaweb服务端+腾讯云服务器+腾讯云数据库)
胖葵酒店管理系统app 完整项目已上传github,链接在文章下面 先看效果图: 登录: 主页面(点击右上角图标进入个人中心页面): 经理模块(客房管理模块和员工管理模块与经理管理模块类似,员工管理模 ...
- android+okhttp+java服务端(tomcat)+mysql实现登录注册
先上代码(文章结尾有遇到的问题和对应解决方案) android客户端 >android:app-build.gradle 1.添加okhttp依赖,具体根据自己的okhttp包来决定 depen ...
- Android客户端和服务端如何使用Token和Session
对于初学者来说,对Token和Session的使用难免会限于困境,开发过程中知道有这个东西,但却不知道为什么要用他?更不知道其原理,今天我就带大家一起分析分析这东西. 一.我们先解释一下他的含义: 1 ...
- eclipse生成webservice客户端代码以及通过客户端访问服务端
最近工作中需要用到webservice调用其他服务,没接触过这个,研究了几天,做个记录 1.eclipse生成webservice客户端:打开eclipse, File >> New &g ...
最新文章
- 《中国人工智能学会通讯》——2.13 医疗服务机器人综述
- bean的属性类型----ibatis类型-------oracle数据库类型
- mvn 使用中的错误
- 计算机二级access什么时候报名_全国计算机等级考试什么时候报名
- Win7+IIS7下用FastCGI模式配置PHP环境
- 【AI视野·今日CV 计算机视觉论文速览 第179期】Tue, 25 Feb 2020
- Maven学习总结(25)——Eclipse Maven Update 时JDK版本变更问题
- Oracle 11gR2 RAC OCR和votingdisk故障恢复案例
- java字符转为数字_java判断字符串是否可以转为数字
- 【Oracle】用户管理
- Ngnix中的fastcgi参数性能优化和解释
- coco 数据集_PyTorch版YOLOv4更新了,适用于自定义数据集
- 处理minidump文件用到的“工具”的分享
- 群晖nas存储系统原理_一篇看懂黑群晖重装系统
- 不会做PPT图表?1000个高大上的PPT图表,0门槛0套路,想要就给你
- java中的xpath,读取xml文档。
- 非专业学生如何系统的学习计算机编程?
- 谷歌人机图像识别接口
- 编程入门先要学什么?打怪升级走起来!
- 浅谈一类积性函数的前缀和
热门文章
- 特来电CMDB应用实践
- pycharm与python环境配置
- Python ConfigParser 模块
- java 矩阵转置算法
- css动画 animation
- HDU 1398 Square Coins
- 数据挖掘原理与算法:练习题2
- c#_限制TextBox输入类型仅可为“-” “.” 数字
- 虚拟机服务器503解决,(图文)解决重启VCSA 6.0提示:503 Service Unavailable错误
- ccxprocess启动项可以禁用么_macOS 删除烦人的CCXProcess.app