问题描写叙述

当我们使用SpringMVC作为服务端的框架时,有时不仅仅要应对web前端(jsp、javascript、Jquery等)的訪问请求,有时还可能须要响应Android和JavaSE(桌面应用)这些client的请求。因此,除了web使用form表单或者ajax作为client获取Controller响应之外。纯Java语言向SpringMVC的Controller提供參数和请求结果也是必须要实现的。web前端使用form和ajax来获取Controller响应在本篇博客暂不深究,本篇博课着力于实现纯Javaclient来实现请求Controller并获取响应。(假设不想看以下的方法探索,能够直接跳到第三部分)

方法探索

确定了须要解决的问题之后。我開始搜索相关的博客和问答。发现这样的问题相关解决方法不是非常多,找了非常多博客都是牛头不正确马嘴,可是还是有一些对解决这个问题有帮助的内容,之后又翻了非常久的书,对这个问题的解决方法有了主要的认识。
    看网上说的行之有效的方法是使用HttpClient来实现这个功能,只是须要导入HttpClient和HttpCore两个jar包。当时研究了一下认为可行。

可是在实际操作过程中。在向Android(IDE:Android Studio)build.gradle里面导入上述两个jar包的依赖后,同步的时候Android Studio给出了两个警告,大意是HttpClient已经过期云云。然后我又专门去查了一个HttpClient这个东西和Android之间的关系,发现Android6.0以及之后的版本号放弃了对HttpClient的支持。强行导入jar包也不行。(据说有人用了非常麻烦的方法导入成功过 = =)那好嘞。不让用算了。那就不用呗。看參考书《疯狂Android讲义》对HttpClient还那么推崇。也是有点醉。

详细不让用的原因就不再深究了,接下来就研究使用HttpUrlConnection来解决上述问题吧。

在使用HttpURLConnection的过程中代码实现照着套路来问题不大。遇到的问题是SpringMVC的Controller怎么接收数据,接收的数据格式是什么?我应该传什么类型的数据?
    Controller怎么接收数据这个问题经过前段时间的学习我已经有个大概的认识,SpringMVC的Controller工作原理就是client向 项目地址+Controller前面的value值 这个url发出请求,这个请求会带有一些參数。而SpringMVC会将请求携带的參数转换为Controller相应value以下的方法的參数,然后在这种方法进行相关的操作再返回client一些參数,至于返回的结果就有几种可能了。假设上面没有@ResponseBody凝视,返回的数据有可能是jsp页面的名字,则web会跳转到相应的jsp页面假设是ModelAndView也会跳转到相应的页面而假设加上@ResponseBody。那么返回的就是json类型的数据了,client会接收到Controller返回的參数。那么,明确了springmvc的工作原理,那么怎么使用HttpUrlConnection来訪问Controller就大概清楚了:我们就把请求地址拼接好,然后把携带的数据发送过去就能够等着拿到Controller返回的数据了。

那么第二个问题就来了。请求的地址清楚了。携带的数据应该是什么格式的呢?
    刚開始我以为和返回值一样是Json格式的键值对形式,比方说用户登录的userName和userPassword,(Controller的參数形式为 doLogin(String userName,String userPassword))開始我以为应该发送json格式数据。可是服务端不鸟我,没有获得參数。后来我又试了jsonArray形式也不行,试了map的键值对形式不行。我就疑惑了究竟是什么形式的。最后找了半天看了ajax发出相同请求时的http报文结构才知道了数据格式是什么样子的。

是这样的:

中间是一个&连接了两个參数,键值中间是=,好吧,最终明确了。当然这是Controller參数为两个单独的String值的时候的类型,有一种更好的办法是直接把Controller的參数设置为一个,然后在Controller里面解析Json数据,这样事实上更方便一点,以后还更easy做加密工作,只是眼下改起来太麻烦就不改了吧。如今弄明确了controller是两个參数的时候是这样的结构的。至于其他的list。bean以及json类型这里就不探究了。由于我看到非常多别的博主都讲了怎么转了。

废话了这么多。以下放代码。

解决这个问题

SpringMVC相应Controller代码(result单词拼错了,懒得改咯):

@RequestMapping(value="/doLogin",method=RequestMethod.POST)@ResponseBodypublic Map<String,Object> doLogin(String userName,String userPassword,HttpSession httpSession){String resoult="fail";User user = userService.getUser(userName);UserDetail userDetail = userDetailService.getUserDetail(userName);if(user!=null){if(Objects.equals(userDetail.getUserDetailPassword(), userPassword)){httpSession.setAttribute("currentUser",user);resoult = "success";}else{resoult = "wrong";}}else{resoult = "unexist";}Map<String, Object> resoults = new HashMap<String,Object>();resoults.put("resoult", resoult);return resoults;}

Android端或者java端写的一个HttpPostUtils工具类

package cn.justwithme.withme.Utils;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;/*** Created by 桐木木 on 2017/2/8.* 发送Http请求。获取Controller返回的数据**/public class HttpPostUtils {public static String doPostRequest(String path,Object content){PrintWriter out = null;BufferedReader in = null;String resoult = "";try {System.out.println("要发送的信息是:"+content);/*拼接url,Android这里须要换上远程地址,由于Android端没办法訪问localhost。java的话本地tomcat执行的话倒是无妨*/String address = http://localhost:8080/WithMe/"+path;URL url = new URL(address);HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();//这两个參数必须加httpURLConnection.setDoInput(true);httpURLConnection.setDoOutput(true);//设置超时时间httpURLConnection.setReadTimeout(10*1000);httpURLConnection.setConnectTimeout(10*1000);httpURLConnection.setRequestMethod("POST");httpURLConnection.connect();out = new PrintWriter(httpURLConnection.getOutputStream());//在输出流中写入參数out.print(content);out.flush();if(httpURLConnection.getResponseCode() == 200){in = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(),"utf-8"));String line;while((line=in.readLine())!=null){resoult+=line;}}System.out.println("server返回的结果是:"+resoult);return resoult;} catch (MalformedURLException e) {System.out.println("URL异常");e.printStackTrace();} catch (IOException e) {System.out.println("IO异常");e.printStackTrace();}finally {try{if(out!=null)out.close();if(in!=null)in.close();}catch (IOException e) {e.printStackTrace();}}return null;}
}

工具类写好之后我们分别在Android端和Java端进行一些測试,(在我的服务端我已经注冊过14121047的前提下,你假设仅仅是測试把服务端查询数据库校验密码改成字符串匹配就成了)。
Android
LoginActivity.java

package cn.justwithme.withme.Activity;import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;import java.util.HashMap;
import java.util.Map;import cn.justwithme.withme.R;
import cn.justwithme.withme.Utils.HttpPostUtils;public class LoginActivity extends AppCompatActivity {private String result;private Handler mHanlder = new Handler() {@Overridepublic void handleMessage(Message message) {result = (String) message.obj;JSONObject resultJson = JSON.parseObject(result);String finalResult = resultJson.getString("resoult");System.out.println("结果是:"+finalResult);if(finalResult.equals("success")){System.out.println("登陆成功");}elseSystem.out.println("username或密码错误");}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);final EditText userNameInput = (EditText)findViewById(R.id.userName);final EditText passwordInput = (EditText)findViewById(R.id.password);Button login = (Button)findViewById(R.id.login);login.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String userName = userNameInput.getText().toString();String userPassword = passwordInput.getText().toString();final Map<String,Object> userInfo = new HashMap<String,Object>();userInfo.put("userName",userName);userInfo.put("userPassword",userPassword);
//                UserLogin userInfo = new UserLogin();
//                userInfo.setUserName(userName);
//                userInfo.setUserPassword(userPassword);final String user = "userName="+userName+"&userPassword="+userPassword;if(userName!= null && !userName.equals("") && userPassword!=null && !userPassword.equals("")){/*这里须要留意的是httpPostUtils请求在Android里面不能放在主线程里面,必须新建一个子线程。然后通过Hanlder把子线程的值传过来更新UI(由于子线程不能直接更改UI)*/new Thread() {public void run() {String response = HttpPostUtils.doPostRequest("doLogin",user);Message message = Message.obtain();message.obj = response;mHanlder.sendMessage(message);}}.start();}else{System.out.println("username密码不能为空");}}});}}

好吧。这是非常简陋的代码,毕竟Androidclient才刚刚開始写,activity_login.xml就不放了,两个输入框一个button而已。能够再以下查看输出结果来推断功能是否实现:

以下是Java的測试代码,用的工具类和Android用的一样的。

package httpPost;public class test {public static void main(String[] args){String test = "userName=14121047&userPassword=14121047";String ans = HttpPostUtils.doPostRequest("doLogin", test);System.out.println("server返回的数据为:"+ans);}
}

測试结果为:

要发送的信息是:userName=14121047&userPassword=14121047
server返回的结果是:{"resoult":"success"}
server返回的数据为:{"resoult":"success"}

结束语

当然,我这里演示的知识一个非常简单的android和java向springmvc发送请求的样例,可是,既然中间的道理和方法明确了,那之后不管是什么格式的数据都不是非常难了。

Json数据的那仅仅用一个參数就好了咯,两个參数都传了一个參数不是非常easy么?要传bean的先把Bean转json到服务端再把json转bean就好了咯。233。。

。(这里仅仅是讨论一下两个參数怎么传。并非不想用json。


    好好学习,天天向上,加油!

Android(或者Java)通过HttpUrlConnection向SpringMVC请求数据(数据绑定)相关推荐

  1. java用HttpURLConnection发起HTTPS请求并跳过SSL证书,解决:unable to find valid certification path to requested targ

    java用HttpURLConnection发起HTTPS请求并跳过SSL证书 问题出现:unable to find valid certification path to requested ta ...

  2. android service前台服务器,Android网络前台向服务端页面请求数据

    这是一个android前台向服务端网站请求少量数据的小例子. 首先设计好服务端,再来写安卓前端. 一:服务端 新建动态网站,在java包下新建一个类继承HttpServlet父类,重写doGet()方 ...

  3. java fetch_解析Fetch实现请求数据

    这篇文章主要介绍了fetch 如何实现请求数据,文中通过示例代码介绍的非常详细,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. 一 序言 在 传统 ...

  4. Java的HttpURLConnection通过POST请求中文乱码

    创建工具HttpRequestUtil类: import java.util.ArrayList; import java.util.Iterator; import java.util.List; ...

  5. HttpURLConnection 发送http请求帮助类

    java 利用HttpURLConnection 发送http请求 提供GET / POST /上传文件/下载文件 功能 import java.io.*; import java.net.*; im ...

  6. java 打开url连接访问不了,android 应用Java自带的HttpURLConnection 连接网络 读取返回数据...

    android 使用Java自带的HttpURLConnection 连接网络 读取返回数据 @Override protected void onCreate(Bundle savedInstanc ...

  7. java 对外提供接口_Java服务器对外提供接口以及Android端向服务器请求数据

    讲解下java服务器是如何对移动终端提供接口的,以什么数据格式提供出去,移动端又是怎么请求服务器,接收以及解析返回数据的. 服务端:还是在原先S2SH框架的项目上(搭建SSH详细步骤及其相关说明),加 ...

  8. mvc 404错误 php,java - springmvc 请求无法到达controller,出现404错误

    springmvc 请求无法到达controller,出现404错误 web.xml testmvc index.html index.htm index.jsp default.html defau ...

  9. java的connect和http_【JAVA】通过URLConnection/HttpURLConnection发送HTTP请求的方法

    Java原生的API可用于发送HTTP请求 即java.net.URL.java.net.URLConnection,JDK自带的类: 1.通过统一资源定位器(java.net.URL)获取连接器(j ...

最新文章

  1. 猫猫学iOS 之第一次打开Xcode_git配置,git简单学习
  2. 2017年度最受欢迎开源中国项目:roncoo-pay投票评选
  3. 业务逻辑全写在sql_TiDB 在转转的业务实战
  4. 【新版上线】网易云点播内容加密服务正式发布啦!
  5. css列表格式属性,css list-style-type属性笔记
  6. 《剑指offer》最小的k个数
  7. 【遥感物候】1983-2012年时间序列中国地区GIMMS 3g NDVI下载(已进行旋转、格式转换、投影变换和裁剪)
  8. linux c文件属性,【linux c learn 之stat】获取文件的属性
  9. android sonar 简书,SonarQube对ios、android代码检测
  10. Angular和Vue.js 深度对比
  11. Ubuntu系统的下载与安装(超详细)
  12. java struts json_json与java对象的转换,以及struts2对json的支持,实现ajax技术
  13. CSS实现纯右上角倾斜四十五度封页角以及小浮标效果
  14. 如何选择合适的境外网站服务器?
  15. 如何破坏双亲委派模型
  16. 计算机磁盘为uefi引导,科普一分钟|UEFI引导+GPT硬盘格式装系统方法
  17. 分布式事务解决方案——TCC
  18. 重金属离子深度去除工艺和技术
  19. 即将上市的三星Note8竟然拥有一般手机没有的这几个功能,你知道吗?
  20. MyBatis中关于resultType和resultMap的区别

热门文章

  1. 2009最新系统盘下载大全
  2. 【经验分享】总结自己考了十次四六级才过的历程
  3. Jetson TX1内核kernel编译与烧写
  4. 输入学生期中成绩、期末成绩、平时成绩,按30%、50%、20%计算学生的综合成绩
  5. 10.20美盘黄金独家指导解套,美原油白银td行情价格趋势分析
  6. patch文件中各参数的意义
  7. CentOS 7 配置iSCSI
  8. 一个简单的小项目博客园(2)登录、注册页面
  9. 【算法】动态规划 背包问题 python
  10. Array的内置方法api