问题描写叙述

当我们使用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)
@ResponseBody
public 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() {
@Override
public 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("登陆成功");
}
else
System.out.println("username或密码错误");
}
}; @Override
protected 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() {
@Override
public 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发送http请求

    写了一个简单的 Http 请求的Class,实现了 get, post ,postfile package com.asus.uts.util; import org.json.JSONExcepti ...

  2. Android开发之使用HttpURLConnection进行POST请求

    一.前提准备 在开始实际编码之前,我们有必要先了解下将会用的类以及方法,进行一个大体的了解. 1.URL类 这个类主要的功能是定位到要获取资源的网址以及打开连接.比如下面的代码: URL realur ...

  3. Java利用原始HttpURLConnection发送http请求数据小结

    1,在post请求下,写输出应该在读取之后,否则会抛出异常. 即操作OutputStream对象应该在InputStreamReader之前. 2.conn.getResponseCode()获取返回 ...

  4. springmvc请求数据的流程。

    验证了我说的,从model层中拿来的数据,不管什么类型,都是通过隐含模型,中转,放入request中的.除非你特意把这些数据放到session域中 流程含义解释:(来自网友)(1)HTTP请求到达we ...

  5. HttpURLConnection 发送http请求帮助类

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

  6. Java中HttpURLConnection使用详解、总结。

    感谢大佬:https://blog.csdn.net/qq_40036754/article/details/102554755 文章目录 一.前言 二.HttpURLConnection 介绍 三. ...

  7. Android(java)学习笔记210:采用post请求提交数据到服务器(qq登录案例)

    1.POST请求:  数据是以流的方式写给服务器 优点:(1)比较安全 (2)长度不限制 缺点:编写代码比较麻烦   2.我们首先在电脑模拟下POST请求访问服务器的场景: 我们修改之前编写的logi ...

  8. Android(java)学习笔记209:采用get请求提交数据到服务器(qq登录案例)

    1.GET请求:    组拼url的路径,把提交的数据拼装url的后面,提交给服务器. 缺点:(1)安全性(Android下提交数据组拼隐藏在代码中,不存在安全问题)  (2)长度有限不能超过4K(h ...

  9. Android(java)学习笔记153:采用post请求提交数据到服务器(qq登录案例)

    1.POST请求:  数据是以流的方式写给服务器 优点:(1)比较安全 (2)长度不限制 缺点:编写代码比较麻烦   2.我们首先在电脑模拟下POST请求访问服务器的场景: 我们修改之前编写的logi ...

随机推荐

  1. Linux下字符集的安装

    目前环境中经常会遇到编码转化的问题,UTF-8跟GB2312也有问题.只得在Linux上安装GB2312(在Linux操作系统上又称zh_CN.GB2312)的字符集,具体请看下文. Linux下几个 ...

  2. Docker考前突击

    dockerfile 介绍 镜像(Image)     容器(Container)     仓库(Repository)

  3. 解决java.io.IOException: Cannot run program "javac"问题,并设置jdk版本

    原因:没有配置java路径 解决方法:设置java_home路径 设置jdk版本是10的方法:在sbt文件中添加一行: javacOptions := Seq(") 然后重新执行命令:sbt ...

  4. python - hadoop,mapreduce demo

    Hadoop,mapreduce 介绍 59888745@qq.com 大数据工程师是在Linux系统下搭建Hadoop生态系统(cloudera是最大的输出者类似于Linux的红帽), 把用户的交易 ...

  5. [转] C#开源项目大全

      商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK ...

  6. jquery 笔记总结

    一.jquery 事件 <script type="text/javascript" src="/jquery/jquery.js"></sc ...

  7. .net 4中使用 dynamic,将json字符串转成对象的 万能方法。

    在.net 4中增加了对弱类型的支持.为和弱类型的对象进行数据交换提供了方法.我们常常会遇到将json字符串转成对象的情景,虽然可以使用 JavaScriptSerializer 或者 DataCon ...

  8. Redis管道传输

    Redis是一个TCP服务器,并支持请求/响应协议.redis的一个请求完成需要下面的步骤: 客户端发送一个查询到服务器,并从套接字中读取,通常在封闭的方式,对服务器的响应. 服务器处理命令并将响应返 ...

  9. Redis的内存回收机制

    Redis的内存回收机制 2018年01月16日 17:11:48 chs007chs 阅读数:1172   Redis的内存回收机制主要体现在一下两个方面: 删除过期时间的键对象 删除过期键对象 : ...

  10. 关于 HTTP GET/POST 请求参数长度最大值的一个理解误区

    1.    Get方法长度限制 Http Get方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制.这个限制是特定的浏览器及服务器对它的限制. 如:IE对URL长度的限制是20 ...