前言

  系列文章:[传送门]

  洗了个澡,准备写篇博客。然后看书了。时间 3 7 分。我慢慢规律生活,向目标靠近。

          

           很喜欢珍惜时间像叮当猫一样

正文

  慢慢地,二维码实现签到将要落幕了。下篇文章出二维码实现签到

  这次

    我们实现 javaweb http json 交互 in action

  题目很长,但我想让你们看下,给我点意见。

开始吧

实战

  本次以经典的登录作为案例。登录做的好也是经典。 服务端 和 app端,服务端简略,app端详细介绍...

服务端

  资料: 

  《spring》 

 @ResponseBody

    将内容或对象作为 HTTP 响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,写入输出流。

  • GET模式下,这里使用了@PathVariable绑定输入参数,非常适合Restful风格。因为隐藏了参数与路径的关系,可以提升网站的安全性,静态化页面,降低恶意攻击风险。
  • POST模式下,使用@RequestBody绑定请求对象,Spring会帮你进行协议转换,将Json、Xml协议转换成你需要的对象。
  • @ResponseBody可以标注任何对象,由Srping完成对象——协议的转换。

代码例子:  

@RequestMapping(value = "/login")
public @ResponseBody Results login(@PathVariable String username, @PathVariable String password) throws IOException
{
System.out.println("userName:"+username);
System.out.println("password:"+password); Results result = new Results(); int resultState = userLoginService.checkUserLoginByPhone(username,password);
if(resultState == 1)
{
result.setResults(1);
System.out.println("... phone success!!");
}
else if(resultState == 0)
{
result.setResults(0);
System.out.println("... phone fail!!");
}
return result;
}
Results 类很简单
package sedion.jeffli.wmuitp.web.webservice;

public class Results
{
private int results; public int getResults()
{
return results;
} public void setResults(int results)
{
this.results = results;
} }

手机端

  资料 :

    1.android + java

    2.http

    3.json

  结构:

   

①itp包下,是程序的主入口,界面很简单。

package sedion.jeffli.itp;

import sedion.jeffli.util.SystemUtil;
import sedion.jeffli.util.UIHelper;
import sedion.wq.itp.webservice.WebService;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText; public class MainActivity extends Activity
{
/**帐号输入框**/
private EditText accountEditText;
/**密码输入框**/
private EditText passwordEditText;
/**登陆按钮**/
private Button loginButton; /**登陆后台任务**/
private LoginAsyncTask loginAsyncTask; @Override
protected void onCreate(Bundle savedInstanceState)
{ super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //控件初始实例化
accountEditText = (EditText) findViewById(R.id.activity_login_account);
passwordEditText = (EditText) findViewById(R.id.activity_login_password);
loginButton = (Button) findViewById(R.id.activity_login_btn_login); //控件事件绑定
loginButton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
String userName = accountEditText.getText().toString();
String userPassword = passwordEditText.getText().toString();
String[] params = new String[] { userName, userPassword }; loginAsyncTask = new LoginAsyncTask();
loginAsyncTask.execute(params);
loginButton.setEnabled(false); }
});
} class LoginAsyncTask extends AsyncTask<String, Integer, Integer>
{
@Override
protected Integer doInBackground(String... params)
{
int resultId = WebService.login(params[0], params[1]); Log.e("resultid", resultId+"");
return resultId;
} @Override
protected void onPostExecute(Integer result)
{
if (loginAsyncTask!=null)
{
loginButton.setEnabled(true); Log.e("result:", result+"");
//根据不同情况处理
if (result == -4)
{
UIHelper.ToastMessage(MainActivity.this, "网络不可用");
}
else if (result == 0 )
{
UIHelper.ToastMessage(MainActivity.this, "用户名或密码错误");
}
else if (result == 1)
{
UIHelper.ToastMessage(MainActivity.this, "登录成功");
}
else
{
UIHelper.ToastMessage(MainActivity.this, "...");
}
}
} @Override
protected void onCancelled()
{
loginAsyncTask = null; loginButton.setEnabled(true);
}
}
}

#LoginAsyncTask 里面是程序的重要部分

你会看到:

    

②webservice 工具类 (★★★)

HttpClient.java

package sedion.wq.itp.webservice;

import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log; public class HttpClient
{ /**连接超时**/
private static final String TIME_OUT = "{\"results\":-2}"; /** User-Agent 用户识别 **/
private static final String User_Agent = "..."; /**
* 使用post请求获取数据
* @param uriAPI 网址
* @param params 请求参数
* @return
* @throws JSONException
*/
private static JSONObject post(String uriAPI, List<NameValuePair> params)
{
org.apache.http.client.HttpClient httpClient = new DefaultHttpClient();
JSONObject result = null; try
{
// 使用post方式
HttpPost httpRequest = new HttpPost(uriAPI); if (params !=null && params.size()>0)
{
//设置请求参数和编码格式
httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
} //设置请求用户识别
//httpRequest.addHeader("User-Agent", User_Agent);
//设置请求超时时间为5s
httpRequest.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,5000);
//读取超时时间
httpRequest.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000); //发送请求并获取响应
HttpResponse httpResponse = httpClient.execute(httpRequest); //根据不同的请求结果代码进行处理数据
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
{
//判断请求成功并返回数据
//解析返回的结果,将返回的信息整成字符串
String strResult = EntityUtils.toString(httpResponse.getEntity());
//转化成json对象,便于操作,json对象是类似于hashmap
result = new JSONObject(strResult); System.out.println("JSONObject -> result:"+result); //如果返回的数据时空
if (result.optString("results").equals("null"))
{
result = null;
} }
else
{
//请求失败
Log.e("请求失败", String.valueOf(httpResponse.getStatusLine().getStatusCode()));
result = null;
}
}
catch(ConnectTimeoutException cException)
{
try
{
result = new JSONObject(TIME_OUT);
}
catch (Exception e)
{
Log.e("webservice json 转化错误", e.toString());
}
}
catch (Exception e)
{
Log.e("post Error", e.toString());
e.printStackTrace();
result = null;
}
finally
{
try
{
httpClient.getConnectionManager().shutdown();
}
catch (Exception e2)
{
Log.e("关闭连接失败", e2.toString());
}
}
return result;
} /**
* 使用post请求获取数据
* @param uriAPI 网址
* @param params 请求参数
* @return
*/
public static JSONObject post(String uri, String method, List<NameValuePair> params)
{
return post(uri + method, params);
} /**
* 使用get请求获取数据
* @param uriAPI 网址
* @return
*/
public static JSONObject get(String uriAPI,HttpParams params)
{
try
{
//实例化get请求
HttpGet httpRequest = new HttpGet(uriAPI);
if (params !=null)
{
//设置参数
httpRequest.setParams(params);
}
//执行
HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);
if (httpResponse.getStatusLine().getStatusCode() == 200)
{
String strResult = EntityUtils.toString(httpResponse.getEntity());
JSONObject result = new JSONObject(strResult);
System.out.println("result:"+result); return result;
}
else
{
return null;
}
}
catch (Exception e)
{
Log.e("get Error", e.toString());
return null;
}
} /** post 访问
* @param url
* @param reqEntity
* @return
*/
public static JSONObject post(String url ,MultipartEntity reqEntity )
{
JSONObject result = null;
HttpParams parms = new BasicHttpParams();
parms.setParameter("charset", HTTP.UTF_8);
org.apache.http.client.HttpClient client = new DefaultHttpClient(parms);
try
{
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Charsert", HTTP.UTF_8);
if (reqEntity != null)
{
//添加参数
httpPost.setEntity(reqEntity);
}
HttpResponse response = client.execute(httpPost);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
{
HttpEntity entity = response.getEntity();
String respnseString = EntityUtils.toString(entity);
result = new JSONObject(respnseString);
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
//关闭连接
client.getConnectionManager().shutdown();
}
catch (Exception e2)
{
e2.printStackTrace();
}
}
return result;
}
}

WebServiceHelper.java

package sedion.wq.itp.webservice;

public class WebServiceHelper extends HttpClient
{
/**错误 **/
protected static final int ERROR = -1;
/**成功**/
protected static final int SUCCESS = 1;
/**失败**/
protected static final int FAILURE = 0;
/**连接超时**/
protected static final int TIME_OUT = -2;
/**补充的数据**/
protected static final String EXTRA = "extra";
/** 请求回应 **/
protected static final String RESULTS = "results"; /** IP地址或域名 **/
public static String IP = "http://192.168.2.6:8080";
/** 项目名 **/
protected static final String PROJECT = "/wmuitp/";
/** Webservice提供地址 **/
protected static String URL = IP + PROJECT + "webservice/"; /********************** 下面是方法名 **************************/
/** 用户登陆 **/
protected static final String LOGIN = "login";
}

WebService.java(用于处理方法)

package sedion.wq.itp.webservice;

import java.util.ArrayList;
import java.util.List; import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject; import android.util.Log; public class WebService extends WebServiceHelper
{
/**
* 用户登陆,登陆成功,返回用户的编号,用户名或密码错误,返回0,系统错误,返回-1,用户注册未审核,返回-3
* @param userName
* @param password
* @return
*/
public static int login(String userName,String password)
{
try
{
List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("username", userName));
params.add(new BasicNameValuePair("password", password)); JSONObject result = post(URL, LOGIN, params); System.out.println("result:"+result); if (result!=null)
{
return result.optInt(RESULTS);
}
else
{
return ERROR;
}
}
catch (Exception e)
{
Log.e("login failure", e.toString());
return ERROR;
}
} }

③辅助类包

StringUtil.java

package sedion.jeffli.util;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import android.util.Log; /**
* 字符串操作工具类
* @author WWF
* @version 1.0
*/
public class StringUtil
{
/**
* 将字符串切割并剔除掉空的字符串
* @param value 需要切割的字符串
* @param regularExpression 分隔符
* @return 字符串数组
*/
public static String[] splitAndTrim(String value,String regularExpression)
{
try
{
String[] values = value.split(regularExpression);
int num=0; for (int i = 0; i < values.length; i++)
{
if (!values[i].trim().equals(""))
{
num++;
}
} String[] resultValues = new String[num]; for (int i = 0; i < resultValues.length; i++)
{
resultValues[i] = values[i];
} return resultValues;
}
catch (Exception e)
{
Log.e("字符串切割成数组错误", e.toString());
return null;
} } /**
* 将List集合转化为数组
* @param list 字符串集合
* @return 字符串数组
*/
public static String[] List2Array(List<String> list)
{
try
{
String[] strings = new String[list.size()]; for (int i = 0; i < list.size(); i++)
{
strings[i] = list.get(i);
; } return strings;
}
catch (Exception e)
{
Log.e("list转数组错误", e.toString());
return null;
}
}
/**
* 验证手机号码、电话号码是否有效
* 手机号前面加86的情况也考虑
* 新联通
   *(中国联通+中国网通)手机号码开头数字 130、131、132、145、155、156、185、186
   * 新移动
   * (中国移动+中国铁通)手机号码开头数字 134、135、136、137、138、139、147、150、151、152、157、158、159、182、183、187、188
   * 新电信
   * (中国电信 +中国卫通)手机号码开头数字 133、153、189、180
* 座机:
*3/4位区号(数字)+ “-” + 7/8位(数字)+ “-”+数字位数不限
*说明:“-”+数字位数不限;这段可有可无
*/
public static String checkPhone(String phone)
{
if (null != phone)
{
String reisphoto = phone.replace(",", ",").replace(";", ",")
.replace(";", ",").replace(" ", ",").replace(" ", ",")
.replace("/", ",").replace("\\", ",");
String[] photo1 = reisphoto.split(",");
String[] photo2 = new String[photo1.length];
boolean isfirst; if (null != photo1 && photo1.length > 0)
{
for (int i = 0; i < photo1.length; i++)
{
isfirst = false; if (photo1[i]
.matches("(^[0-9]{3,4}-[0-9]{3,8}$)|^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|2|3|5|6|7|8|9])\\d{8}$"))
{
photo2[i] = photo1[i];
isfirst = true;
} // 第二规则 “-”+数字位数不限 和手机号前面加86的情况也考虑
if (!isfirst)
{
if (photo1[i]
.matches("(^[0-9]{3,4}-[0-9]{3,8}-[0-9]{0,100}$)|^((\\+86)|(86))?(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|2|3|5|6|7|8|9])\\d{8}$"))
{
photo2[i] = photo1[i];
}
}
}
// 如果两个电话 只用一个
if (photo2.length > 0)
{
return photo2[0];
}
}
}
return null;
} /**
* 判断给定字符串是否空白串。
* 空白串是指由空格、制表符、回车符、换行符组成的字符串
* 若输入字符串为null或空字符串,返回true
* @param input
* @return boolean
*/
public static boolean isEmpty(String input)
{
if (input == null || input.trim().equals(""))
{
return true;
} for (int i = 0; i < input.length(); i++)
{
char c = input.charAt(i); if (c != ' ' && c != '\t' && c != '\r' && c != '\n')
{
return false;
}
}
return true;
} /**
* 验证是不是手机号码
* @param mobiles
* @return
*/
public static boolean isMobileNum(String mobiles)
{
Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$");
Matcher m = p.matcher(mobiles);
return m.matches();
} }

SystemUtil.java

package sedion.jeffli.util;

import android.annotation.SuppressLint;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo; /**
* 检查系统参数工具
* @author WQ
* @version 1.0
*/ public class SystemUtil
{
/**
* 检查系统的网络或wifi是否连接
* @param context 上下文
* @return 是否连通
*/
public static boolean isNetworkConnected(Context context)
{
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo network = cm.getActiveNetworkInfo(); if (network != null&&network.isConnectedOrConnecting())
{
return network.isAvailable();
}
return false;
} /**
* 获取当前网络类型
* @return 0:没有网络 1:WIFI网络 2:WAP网络 3:NET网络
*/
@SuppressLint("DefaultLocale")
public static int getNetworkType(Context context)
{
int netType = 0;
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo == null)
{
return netType;
} int nType = networkInfo.getType(); if (nType == ConnectivityManager.TYPE_MOBILE)
{
String extraInfo = networkInfo.getExtraInfo(); if(!StringUtil.isEmpty(extraInfo))
{
if (extraInfo.toLowerCase().equals("cmnet"))
{
netType = 3;
}
else
{
netType = 2;
}
}
}
else if (nType == ConnectivityManager.TYPE_WIFI)
{
netType = 1;
} return netType;
}
}

UIHelper.java

package sedion.jeffli.util;

import android.app.Activity;
import android.content.Context;
import android.widget.Toast; public class UIHelper {
/**
* 弹出Toast消息
* @param msg
*/
public static void ToastMessage(Context cont,String msg)
{
Toast.makeText(cont, msg, Toast.LENGTH_SHORT).show();
} public static void ToastMessage(Context cont,int msg)
{
Toast.makeText(cont, msg, Toast.LENGTH_SHORT).show();
} public static void ToastMessage(Context cont,String msg,int time)
{
Toast.makeText(cont, msg, time).show();
} /**
* 返回原activity
* @param context
*/
public static void FinishActivity(Activity context)
{
context.finish();
}
}

终于写完代码了,下面我们试试咯!

实战说事

  1.启动服务端

  2.启动手机端

  3.尝试登陆

你会看到

服务端:

手机端:

就ok了,如果你看到这里,谢谢你。点个赞哦!!

总结

  实战真心学到很多!!

  http

  json

  spring @ResponseBody

感谢及资源共享

    

    

    路上走来一步一个脚印,希望大家和我一起。

    感谢读者!很喜欢你们给我的支持。如果支持,点个赞。

    知识来源: 《spring in action》

          http://www.cnblogs.com/Codenewbie/ 他指点

项目ITP(四) javaweb http json 交互 in action (服务端 spring 手机端 提供各种工具类)勿喷!的更多相关文章

  1. 项目ITP(七) javaWeb 整合 Quartz 实现动态调度 而且 持久化

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u010378410/article/details/36255511 项目ITP(七) javaWe ...

  2. android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据

    补充:关于PHP服务端可能出现的问题: 如果你刚好也像我一样,用php实现的服务端程序,采用的是apache服务器,那么虚拟主机的配置可能会影响到android应用的调试!! 在android应用中访 ...

  3. SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析

    SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析 一:问题demo展示 ...

  4. 总结的一些json格式和对象/String/Map/List等的互转工具类

    总结的一些json格式和对象/String/Map/List等的互转工具类,有需要的可以看看,需要引入jackson-core-asl-1.7.1.jar.jackson-jaxrs-1.7.1.ja ...

  5. spring-oauth-server实践:使用授权方式四:client_credentials 模式的客户端和服务端交互

    spring-oauth-server入门(1-11)使用授权方式四:client_credentials 模式的客戶端 一.客户端逻辑 1.界面入口(credentials_access_token ...

  6. 解决前端浏览器传JSON对像到服务端后全部变成string类型的方法

    这几天公司用nodejs+mongodb来做些东西,UI用的是kendo UI 碰到一个问题: 举个例子var a={"name":"张三","age ...

  7. HttpURLConnection 发送PUT请求 json请求体 与服务端接收

    发送请求: public void testHttp() { String result = ""; try { URL postURL = new URL("http: ...

  8. (九)springmvc之json的处理(服务端发送json数据到客户端)

    一.json处理方法有两种 1:导入Spring需要json的jar包.(本例使用) 使用@ResponseBody该注解用于将Controller的方法返回的对象,通过HttpMessageConv ...

  9. 使用CXF开发WebService程序的总结(四):基于bean的客户端和服务端代码的编写

    1. 在原服务端项目 ws_server中添加两个bean 1.1 添加两个类  User 和 Clazz   package com.lonely.pojo; public class User { ...

随机推荐

  1. Linux 第十四天

    6)Bash常用快捷键 快捷键 作用 ctr1+ a 把光标移动到命令行开头.如果我们输入的命令过长,想要把光标移| 动到命令行开头时使用. ctr1+e 把光标移动到命令行结尾. ctr1+c 强制 ...

  2. 破解某普通话测试app会员

    设备要求 已root的Android手机 软件要求 反编译工具 jeb.APK改之理(APK IDE) hook工具 frida.xposed. 布局分析工具 Android Device Monit ...

  3. Git使用(一、TortoiseGit和Gitlab在Windows下的项目库创建和上传)

    介绍使用TortoiseGit初次创建并上传到gitlab项目库,转载请注明出处. 一.需要先安装git环境,并配置Git用户名及邮箱. 二.用PuTTYgen生成公约私钥对(鼠标画画).PuTTYg ...

  4. MySQL数据库(三)索引总结

    一.什么是索引?  索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存. 如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录 ...

  5. Linux关于文件,文件夹操作命令

    文件 文件夹 相关操作命令 查看文件 cd 切换目录位置 ls 目录    查看指定目录所有文件  --缺省当前目录 ls -l 目录 查看指定目录所有文件的详细信息 --同 ll 命令 ls -a ...

  6. 你可能不知道的web api

    简介 作为前端工作者,我们的工作与web是分不开的,随着HTML5的日益壮大,浏览器自带的webapi也随着增多.本篇文章主要选取了几个有趣且有用的webapi进行介绍,分别介绍其用法.用处以及浏览器 ...

  7. Nginx 代理配置

    1.反向代理 修改conf\nginx.conf文件, 添加proxy_pass属性 server { listen 7080; #nginx 端口 server_name localhost; #n ...

  8. CSS伪类的理解

    因为之前一直对css伪类没有过多的了解,在网上看到一段css代码,不能理解 a:hover span.title{ color:red; ......... } 现通过查询css手册,其实css伪类只 ...

  9. OpenCV Mat格式存储YUV图像

    YUV图像用的比较多,而且YUV图像的格式众多(YUV格式可以参考YUV pixel formats),如何用OpenCV的Mat类型来存储YUV图像也是经常遇到的问题. 对于YUV444图像来说,就 ...

  10. codefores 1066 E. Binary Numbers AND Sum

    这个题吧 你画一下就知道了 就拿这个例子来讲 4 5100110101 对于b串的话第5位只会经过a串的第4位,b串的第4位会经过a串的第3位和第4位.....b串的第1和第2位会经过a串的每一位 由 ...