android + Spring RESTful 简单登录 (spring3实现服务端 rest api)

 https://github.com/spring-projects/spring-android-samples/tree/master/spring-android-showcase
 
注: 
url?format=json 服务器端返回json数据 
url?format=xml 服务器端返回xml数据 
url 默认返回html数据

登录restful风格 部分源码

android客户端 导入spring for android开源jar 
spring-android-rest-template-1.0.0.RC1.jar 
spring-android-core-1.0.0.RC1.jar 
spring-android-auth-1.0.0.RC1.jar

服务器端部分代码(spring3.1.1+hibernate4.1.2(jpa2)完全注解方式实现 )

======================================上代码===================================== 
======================================android客户端=================================

  1. public class SpringHttpClient {
  2. private static RestTemplate restTemplate;
  3. private final static String url = "http://192.168.0.8:6060/contact";
  4. private final static String login = url + "/user/userLogin/{loginname},{loginpassword}?format=json";
  5. private final static String query = url + "/user/list?format=json";
  6. private final static String add = url + "/user/add?format=json";
  7. private final static String detail = url + "/user/{id}/detail?format=json";
  8. private final static String update = url + "/user/{id}/updates?format=json";
  9. private final static String delete = url + "/user/{id}/delete?format=json";
  10. private final static String upload = url + "/user/upload?format=json";
  11. static {
  12. restTemplate = new RestTemplate();
  13. }
  14. public SpringHttpClient(){
  15. }
  16. /**
  17. * 登录,
  18. * @param username
  19. * @param password
  20. * @return {"user":{"id":"1","loginname":"superman","loginpassword":"unicom","username":"超级管理员","useremail":"superman@163.com","usermobile":null,"userstate":null,"userlogintime":null}}
  21. */
  22. public static String OAuth(String username,String password){
  23. Map<String, String> request = new HashMap<String, String>();
  24. request.put("loginname", username);
  25. request.put("loginpassword", password);
  26. return getObject(login,request);
  27. }
  28. /**
  29. * 得到所有的用户,
  30. * @return ........
  31. */
  32. public static String ListAll(){
  33. return getObject(query, null);
  34. }
  35. /**
  36. * 根据id得到唯一用户
  37. * @param id
  38. * @return{"user":{"id":"4028809b376e28be01376e294b180000","loginname":"sdfsdf","loginpassword":"sdfsdf","username":"sdfsdf","useremail":"sdfsdf","usermobile":null,"userstate":null,"userlogintime":null}}
  39. */
  40. public static String Detail(String id){
  41. Map<String, String> request = new HashMap<String, String>();
  42. request.put("id", id);
  43. return getObject(detail, request);
  44. }
  45. /**
  46. * 添加一个用户
  47. * @param user
  48. * @return
  49. */
  50. public static String Add(Users user){
  51. Map<String, String> request = new HashMap<String, String>();
  52. request.put("id", "");
  53. MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
  54. map.add("loginname", user.getLoginname());
  55. map.add("loginpassword", user.getLoginpassword());
  56. map.add("useremail", user.getUseremail());
  57. map.add("usermobile", user.getUsermobile());
  58. return postObject(add,map,request);
  59. }
  60. /**
  61. * 根据id更新用户 返回更新的实例和信息(restTemplate.put 也可以直接更新)
  62. * @param id
  63. * @param user
  64. * @return{"users":{"id":"4028809b376daa8901376dab59520001","loginname":"45345345","loginpassword":null,"username":"测试一下kankan","useremail":null,"usermobile":"ddddd","userstate":null,"userlogintime":null}}
  65. */
  66. public static String Update(String id,Users user){
  67. Map<String, String> request = new HashMap<String, String>();
  68. request.put("id", id);
  69. MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
  70. map.add("loginname", user.getLoginname());
  71. map.add("username", user.getUsername());
  72. map.add("usermobile", user.getUsermobile());
  73. return postObject(update,map, request);
  74. }
  75. /**
  76. * 更加id删除用户(也可以用restTemplate.delete 但是没有返回的信息)
  77. * @param id
  78. * @param user
  79. * @return {"ajax":{"success":true,"messages":"删除成功!"}}
  80. */
  81. public static String Delete(String id){
  82. Map<String, String> request = new HashMap<String, String>();
  83. request.put("id", id);
  84. return getObject(delete, request);
  85. }
  86. /**
  87. * 上传文件
  88. * @param path
  89. * @return
  90. */
  91. public static String UploadFile(String path){
  92. MultiValueMap<String, Object> formData = new LinkedMultiValueMap<String, Object>();
  93. Resource resource;
  94. try {
  95. resource = new UrlResource("file://"+path);
  96. formData.add("json", resource);
  97. } catch (MalformedURLException e) {
  98. e.printStackTrace();
  99. }
  100. HttpHeaders requestHeaders = new HttpHeaders();
  101. requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
  102. HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(formData, requestHeaders);
  103. ResponseEntity<String> response = restTemplate.exchange(upload, HttpMethod.POST, requestEntity, String.class);
  104. return response.getBody();
  105. }

=============================服务器端部分代码==============================

  1. /**注意下面的方法中请求的方法名称是一样的,
  2. * 只不过根据不同的RequestMethod.GET来找对应的方法
  3. * RequestMethod (
  4. * GET=get提交,
  5. * HEAD,
  6. * POST=post提交,
  7. * PUT=put更新,
  8. * DELETE=delete删除,
  9. * OPTIONS, TRACE)
  10. * 对应
  11. * <form:form method="POST">
  12. * <form:form method="PUT">
  13. * <form:form method="DELETE">
  14. */
  15. /**
  16. * 用户列表例子(不带分页)
  17. * @return
  18. */
  19. @RequestMapping(value="/list",method=RequestMethod.GET)
  20. public ModelAndView UserList(){
  21. List<Users> list = usersService.listAll();
  22. return new ModelAndView("main", "userslist", list);
  23. }
  24. /**
  25. * 用户列表例子(带分页)
  26. * @return
  27. */
  28. @RequestMapping(value="/query",method=RequestMethod.GET)
  29. public ModelAndView UserListPage(HttpServletRequest request,Model model, @ModelAttribute("command") Users command){
  30. model.addAttribute(Constants.COMMAND, command);
  31. int pn = ServletRequestUtils.getIntParameter(request, "pn", 1);
  32. Page<Users> list = usersService.listAllUsers(command, pn);
  33. model.addAttribute("page", list);
  34. return new ModelAndView("query");
  35. }
  36. /**
  37. * 新增之前绑定PO到form表单跳转到新增页面例子
  38. * @param model
  39. * @return
  40. */
  41. @RequestMapping(value="/add",method=RequestMethod.GET)
  42. public ModelAndView before_UserAdd(Model model){
  43. //相当于request.setattribute的意思
  44. if(!model.containsAttribute(Constants.COMMAND))
  45. model.addAttribute(Constants.COMMAND, new Users());
  46. return new ModelAndView("add");
  47. }
  48. /**
  49. * 新增用户例子
  50. * @param users
  51. * @return
  52. */
  53. @RequestMapping(value="/add",method=RequestMethod.POST)
  54. public ModelAndView after_UserAdd(Users user){
  55. usersService.save(user);
  56. AjaxResponse ajax = new AjaxResponse();
  57. ajax.setSuccess(true);
  58. ajax.setMessages("注册成功!");
  59. return new ModelAndView("ajax","ajax",ajax);
  60. //也可以直接返回列表也行
  61. //return new ModelAndView(new RedirectView("list"));
  62. }
  63. /**
  64. * 更新之前绑定PO到form表单跳转到更新页面
  65. * @param id
  66. * @param model
  67. * @return
  68. */
  69. @RequestMapping(value="/{id}/detail",method=RequestMethod.GET)
  70. public ModelAndView get_Users(@PathVariable String id,Model model){
  71. Users users = usersService.get(id);
  72. model.addAttribute("users", users);
  73. return new ModelAndView("detail");
  74. }
  75. /**
  76. * 更新之前绑定PO到form表单跳转到更新页面
  77. * @param id
  78. * @param model
  79. * @return
  80. */
  81. @RequestMapping(value="/{id}/updates",method=RequestMethod.GET)
  82. public ModelAndView before_UsersUpdate(@PathVariable String id,Model model){
  83. Users users = usersService.get(id);
  84. if(!model.containsAttribute(Constants.COMMAND))
  85. model.addAttribute(Constants.COMMAND, users);
  86. return new ModelAndView("updates");
  87. }
  88. /**
  89. * 更新用户例子(put更新 一般用在web)
  90. * @param users
  91. * @return
  92. */
  93. @RequestMapping(value="/{id}/updates",method=RequestMethod.PUT)
  94. public ModelAndView after_put_UserUpdate(Users user){
  95. usersService.update(user);
  96. return new ModelAndView("redirect:../list");
  97. }
  98. /**
  99. * 更新用户例子(post更新 一般用在client)
  100. * @param users
  101. * @return
  102. */
  103. @RequestMapping(value="/{id}/updates",method=RequestMethod.POST)
  104. public ModelAndView after_post_UserUpdate(Users user){
  105. usersService.update(user);
  106. AjaxResponse ajax = new AjaxResponse();
  107. ajax.setSuccess(true);
  108. ajax.setMessages("更新成功!");
  109. return new ModelAndView("ajax","ajax",ajax);
  110. }
  111. /**
  112. * 删除用户例子
  113. * @param id
  114. * @return
  115. */
  116. @RequestMapping(value="/{id}/delete",method=RequestMethod.GET)
  117. public ModelAndView UserDelete(@PathVariable String id){
  118. usersService.delete(id);
  119. AjaxResponse ajax = new AjaxResponse();
  120. ajax.setSuccess(true);
  121. ajax.setMessages("删除成功!");
  122. return new ModelAndView("ajax","ajax",ajax);
  123. }
  124. /**
  125. * 上传文件
  126. * @param request
  127. * @return
  128. */
  129. @RequestMapping(value="/upload",method=RequestMethod.POST)
  130. public ModelAndView Upload(@RequestParam("json") MultipartFile multi){
  131. try {
  132. byte[] bytes =  multi.getBytes();
  133. FileOutputStream out = new FileOutputStream("D:\\"+multi.getOriginalFilename());
  134. out.write(bytes);
  135. out.close();
  136. } catch (IOException e) {
  137. // TODO Auto-generated catch block
  138. e.printStackTrace();
  139. }
  140. AjaxResponse ajax = new AjaxResponse();
  141. ajax.setSuccess(true);
  142. ajax.setMessages("文件上传成功!");
  143. return new ModelAndView("ajax","ajax",ajax);
  144. }

//--------------------------------------------------------------

使用Spring-Android获取和解析json数据


项目中需要的LIB: 
spring-android-core-1.0.0.M4.jar 
spring-android-rest-template-1.0.0.M4.jar 
gson-2.1.jar 使用google的这个json解析lib是因为这个lib较小

服务端返回数据如:

  1. {"id":"109","word":"test","translation":"n. 试验;检验"}

客户端建立对应的Domain类,如:

  1. public class Word {
  2. private int id;
  3. private String word;
  4. private String translation;
  5. }

使用Spring-Android调用,并转换成Word类

  1. String url = "http://localhost/api/word/detail.php?id=109";
  2. RestTemplate restTemplate = new RestTemplate();
  3. Word word = restTemplate.getForObject(url, Word.class);

另外Spirng Android的Lib库中还提供了解析XML,RSS,还有OAuth验证的实现。

//--------------------------------------------------------------------------------------

http://www.chenwg.com/android/spring-android%E7%9A%84%E4%BD%BF%E7%94%A8.html

了解J2EE的人都会知道spring这个开源框架,不过哥对J2EE的开发没什么兴趣,太重量级了,不适合互联网的应用,还是喜欢php多点,不过sping在移动开发这块也推出了spring-android,spring-android可以做什么?有什么优势呢?

spring-android主要提供了两个重要的功能:

1.Rest模板,很多Android应用都要与服务器进行交互,而现在很多互联网应用的服务器端都会提供Rest服务,数据格式一般是json、xml、rss等,如果使用spring-android,这将大大方便你的Android应用与服务器端的交互,spring-android在解析json,xml都是非常方便的;

2.Auth授权验证,现在很多互联网应用都提供了开放的API服务,而你的Android应用要接入到这些服务中去,往往要经过授权才行,现在很多应用都使用Auth授权认证,如twitter、facebook、新浪微博等,如果使用spring-android,在授权验证这块将会非常方便。

如何使用spring-android呢?

1.首先要去http://www.springsource.org/spring-android 下载spring-android,然后解压。

2.新建一个Android项目,然后将解压后的spring-android里的spring-android-core-1.0.1.RELEASE.jar和spring-android-rest-template-1.0.1.RELEASE.jar放到Android项目的lib目录下,因为要访问在网络,所以要在AndroidManifest.xml文件下加入<uses-permission android:name=”android.permission.INTERNET”/>​

3.acitivity_main.xml文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<RelativeLayout 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"
    >
 
    <TextView
        android:id="@+id/result_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        tools:context=".MainActivity"/>
 
</RelativeLayout>

4.MainActivity.java如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.hxxy.springforandroidfirstdemo;
 
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
 
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final TextView resultTextView = (TextView) findViewById(R.id.result_text);
 
        AsyncTask<String, Void, String> simpleGetTask =  new AsyncTask<String, Void, String>() {
            @Override
            protected String doInBackground(String... params) {
                // executed by a background thread
 
                // 创建一个RestTemplate实例
                RestTemplate restTemplate = new RestTemplate();
 
                // 添加字符串消息转换器
                restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
 
                return restTemplate.getForObject(params[0], String.class);
            }
 
            @Override
            protected void onPostExecute(String result) {
                resultTextView.setText(result);
            }
 
        };
 
        String url = "http://www.chenwg.com";
        // 完成时更新resultTextView
        simpleGetTask.execute(url);
    }
}

spring-android的使用【转】的更多相关文章

  1. Spring学习总结(一)——Spring实现IoC的多种方式

    控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...

  2. 直接拿来用!最火的Android开源项目(完结篇)

    直接拿来用!最火的Android开源项目(完结篇) 2014-01-06 19:59 4785人阅读 评论(1) 收藏 举报 分类: android 高手进阶教程(100) 摘要:截至目前,在GitH ...

  3. 直接拿来用!最火的Android开源项目(完结篇)(转)

    摘要:截至目前,在GitHub“最受欢迎的开源项目”系列文章中我们已介绍了40个Android开源项目,对于如此众多的项目,你是Mark.和码友分享经验还是慨叹“活到老要学到老”?今天我们将继续介绍另 ...

  4. Android annotations REST

    使用前: public class BookmarksToClipboardActivity extends Activity { BookmarkAdapter adapter; ListView ...

  5. GitHub 优秀的 Android 开源项目(转)

    今天查找资源时看到的一篇文章,总结了很多实用资源,十分感谢原作者分享. 转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介 ...

  6. GitHub 优秀的 Android 开源项目

    转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的View,包括ListView.ActionBar.M ...

  7. GitHub上不错的Android开源项目(三)

    收集相关系列资料,自己用作参考,练习和实践.小伙伴们,总有一天,你也能写出 Niubility 的 Android App :-) GitHub上不错的Android开源项目(一):http://ww ...

  8. Spring实战1:Spring初探

    主要内容 Spring的使命--简化Java开发 Spring容器 Spring的整体架构 Spring的新发展 现在的Java程序员赶上了好时候.在将近20年的历史中,Java的发展历经沉浮.尽管有 ...

  9. Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤

    原文地址: Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤 - 网络资源是无限的 - 博客频道 - CSDN.NET http://blog.csdn.net/fen ...

  10. CSDN首页> 移动开发 直接拿来用!最火的Android开源项目(完结篇)

    此前,CSDN移动频道推出的GitHub平台上“最受欢迎的开源项目”系列文章引发了许多读者的热议,在“直接拿来用!最火的Android开源项目”系列文章(一).(二)中,我们也相继盘点了40个GitH ...

随机推荐

  1. 记录一个原因不明的段错误(libxml2 proc activemq的三角恋)

    又碰到了令人头疼的段错误,但是这次,虽然最终找到了出自何处,但是还是不明白究竟是为何. 最后将程序简化,贴上来,希望高人能指点一下. memt.pc: #include <libxml/pars ...

  2. MyEclipse 注册码

    MyEclipse 注册码和大家共享一下! 一:MyEclipse_6.0.1GA_E3.3.1_FullStackInstaller注册码 Subscriber:javp Subscription ...

  3. C# 多线程的坑 之 代码变序

    英文好的,可跳过,直接打开底部的“参考“链接. 代码变序--reordering of memory operations 大概4年前,阅读了这篇文章后http://www.albahari.com/ ...

  4. Emmet 语法探析

    Emmet 语法探析 Emmet(Zen Coding)是一个能大幅度提高前端开发效率的一个工具. 大多数编辑器都支持Snippet,即存储和重用一些代码块.但是前提是:你必须先定义 这些代码块. E ...

  5. tablbView中section的间距

    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { if (sect ...

  6. OC——NSArray和NSMutableArray

    /*---------------------NSArray---------------------------*/ //创建数组 NSArray *array1 = [NSArray arrayW ...

  7. POJ 2446 Chessboard

    要求用占两格的长方形铺满平面上除去指定点 二分图匹配 #include <iostream> #include <cstdio> #include <cstring> ...

  8. Ubuntu下安装arm-linux-gcc

    安装步骤: 这里采用友善之臂发布的arm-linux-gcc-4.4.3.tar.gz软件包. 一.将压缩包arm-linux-gcc-4.4.3.tar.gz存放在opt目录下. 执行解压命令:su ...

  9. linux学习笔记之线程同步机制

    一.基础知识. 1:线程同步机制:互斥量,读写锁,条件变量,自旋锁,屏障. 1,互斥量:每个进程访问被互斥量保护的资源时,都需要先对互斥量进行判断. 1)互斥量重要属性:进程共享属性,健壮属性,类型属 ...

  10. Wordpress主题中常用代码总结

    1. 在 Wordpress主题中显示最热文章的 PHP代码 <?php $result = $wpdb->get_results("SELECT comment_count,I ...