spring social

像我一样,无论是添加简单的Facebook“赞”按钮,一大堆“共享”按钮还是显示时间轴信息,您都不会注意到当前对应用程序“社交化”的热衷。 每个人都在做这件事,包括Spring的家伙,事实上,他们提出了一个叫做Spring Social的灵巧的API,可让您将您的应用程序与许多软件即服务(SaaS)提要(例如Twitter, Facebook,LinkedIn等

本文以及接下来的几篇博客通过演示Spring Social的使用来了解整个社交场景,而我将从非常基础开始。

如果您看过Spring Social Samples,您会知道它们包含几个非常好的和完整的“ quickstart”应用程序。 一个用于Spring 3.0.x,另一个用于Spring3.1.x。 在研究这些应用程序时,令我印象深刻的是,您必须学习多少概念才能欣赏正在发生的事情。 这包括配置,外部授权,提要集成,凭证持久性等……大部分复杂性是由于您的用户需要登录其软件即服务(SaaS)帐户(例如Twitter,Facebook或QZone),以便您的应用程序可以访问其数据1 。 由于周围有大量的SaaS提供程序以及它们使用的授权协议数量不同,这使情况更加复杂。

因此,我认为我会尝试将所有这些分解为各个单独的组件,以说明如何构建有用的应用程序; 但是,我将从一些背景开始。

Spring的家伙们正确地认识到Internet上有如此众多的SaaS提供程序,他们永远无法为所有这些提供模块,因此他们将功能分为两部分,第一部分包括spring-social-corespring-social-web模块,为每个SaaS提供程序提供基本的连接和授权代码。 提供所有这些听起来像是一项艰巨的任务,但是它的简化之处在于,要成为SaaS提供者,您需要实现所谓的OAuth协议 。 我还没有介绍OAuth的详细信息,但简而言之,OAuth协议执行了一个复杂的小操作,允许用户与您的应用程序共享其SaaS数据(即他们在Facebook等上拥有的内容),而无需用户分发他们的您的应用程序的凭据。 至少有三个版本:1.0、1.0a和2.0,并且SaaS提供程序可以自由实现自己喜欢的任何版本,通常会添加自己的专有功能。
此拆分的第二部分包括SaaS提供程序模块,这些模块知道如何与最低级别的各个服务提供程序服务器进行通信。 Spring的家伙目前提供 基本服务 ,西方世界是 FacebookLinkedInTwitter 。 采用广泛的模块化方法的好处是,您还可以使用很多其他社区主导的模块:

  • Spring社交500px
  • Spring社交BitBucket
  • Spring社交挖掘
  • Spring社交保管箱
  • Spring社交展
  • Spring社交电影
  • Spring社交四方
  • Spring社交Google
  • Spring社交Instagram
  • Spring社交Last.fm
  • Spring Social Live(Windows Live)
  • Spring社会味iso
  • Spring社交Mixcloud
  • Spring社交Nk
  • Spring社会销售人员
  • Spring社交SoundCloud
  • Spring社交Tumblr
  • Spring社交视频
  • Spring社交活动
  • Spring社交微博
  • Spring社会兴
  • Spring社交Yammer
  • Spring社会保障模块
  • Spring Social Grails插件

但是,这只是可用服务数量的一部分:要查看此列表的大小,请访问AddThis网站,并找出它们支持的服务。

返回代码

现在,如果您像我一样,那么当涉及到编程时,您会讨厌安全性:从开发角度来看,这非常麻烦,会阻止您编写代码并使您的生活变得困难,所以我想我应该开始通过扔掉所有东西并编写一个显示一些基本SaaS数据的小应用程序。 事实证明,这可能是因为某些SaaS提供商(例如Twitter)同时服务于私有数据和公共数据。 私有数据是您需要登录的东西,而公共数据对任何人都可用。

在今天的场景中,我正在编写一个基本应用程序,该应用程序使用Spring Social Twitter Module在应用程序中显示Twitter用户的时间线,而您要做的只是Twitter用户的屏幕名称。

要创建该应用程序,第一步是使用SpringSource Toolkit仪表板的模板部分创建一个基本的Spring MVC项目。 这提供了一个Web应用程序,可帮助您入门。

第二步是将以下依赖项添加到pom.xml文件中:

<!-- Twitter API --><dependency><groupId>org.springframework.social</groupId><artifactId>spring-social-twitter</artifactId><version>${org.springframework.social-twitter-version}</version></dependency><!-- CGLIB, only required and used for @Configuration usage: could be removed in future release of Spring --><dependency><groupId>cglib</groupId><artifactId>cglib-nodep</artifactId><version>2.2</version></dependency>

上面的第一个依赖关系是针对Spring Social的Twitter API的,而第二个依赖关系是使用Spring 3的@Configuration注释配置应用程序所必需的。 请注意,您还需要通过添加以下内容来指定Twitter API版本号:

<org.springframework.social-twitter-version>1.0.2.RELEASE</org.springframework.social-twitter-version>

…到文件顶部的<properties>部分。

步骤3是您需要配置Spring的地方。 如果查看Spring Social示例代码,您会注意到Spring的家伙使用Java和Spring 3 @Configuration注释配置他们的应用程序。 这是因为基于Java的配置比基于XML的原始配置具有更大的灵活性。

@Configurationpublic class SimpleTwitterConfig {private static Twitter twitter;public SimpleTwitterConfig() {if (twitter == null) {twitter = new TwitterTemplate();}}/*** A proxy to a request-scoped object representing the simplest Twitter API* - one that doesn't need any authorization*/@Bean@Scope(value = 'request', proxyMode = ScopedProxyMode.INTERFACES)public Twitter twitter() {return twitter;}}

上面的代码所做的全部就是通过Spring的Twitter接口为Spring提供一个简单的TwitterTemplate对象。 对于这个基本应用程序,使用@Configuration绝对是多余的,但是我将在以后的博客中继续使用它。

有关@Configuration批注和基于Java的配置的更多信息,请查看:

  1. Spring的基于Java的依赖注入
  2. 更多基于Spring Java的DI

编写完配置类后,接下来要做的就是整理控制器。 在这个简单的示例中,我使用了一个简单的@RequestMapping处理程序,该处理程序处理如下所示的URL:

<a href=timeline?id=roghughe>Grab Twitter User Time Line for @roghughe</a><br />

……代码看起来像这样:

@Controllerpublic class TwitterTimeLineController {private static final Logger logger = LoggerFactory.getLogger(TwitterTimeLineController.class);private final Twitter twitter;@Autowiredpublic TwitterTimeLineController(Twitter twitter) {this.twitter = twitter;}@RequestMapping(value = 'timeline', method = RequestMethod.GET)public String getUserTimeline(@RequestParam('id') String screenName, Model model) {logger.info('Loading Twitter timeline for :' + screenName);List<Tweet> results = queryForTweets(screenName);// Optional Step - format the Tweets into HTMLformatTweets(results);model.addAttribute('tweets', results);model.addAttribute('id', screenName);return 'timeline';}private List<Tweet> queryForTweets(String screenName) {TimelineOperations timelineOps = twitter.timelineOperations();List<Tweet> results = timelineOps.getUserTimeline(screenName);logger.info('Fond Twitter timeline for :' + screenName + ' adding ' + results.size() + ' tweets to model');return results;}private void formatTweets(List<Tweet> tweets) {ByteArrayOutputStream bos = new ByteArrayOutputStream();StateMachine<TweetState> stateMachine = createStateMachine(bos);for (Tweet tweet : tweets) {bos.reset();String text = tweet.getText();stateMachine.processStream(new ByteArrayInputStream(text.getBytes()));String out = bos.toString();tweet.setText(out);}}private StateMachine<TweetState> createStateMachine(ByteArrayOutputStream bos) {StateMachine<TweetState> machine = new StateMachine<TweetState>(TweetState.OFF);// Add some actions to the statemachinemachine.addAction(TweetState.OFF, new DefaultAction(bos));machine.addAction(TweetState.RUNNING, new DefaultAction(bos));machine.addAction(TweetState.READY, new ReadyAction(bos));machine.addAction(TweetState.HASHTAG, new CaptureTag(bos, new HashTagStrategy()));machine.addAction(TweetState.NAMETAG, new CaptureTag(bos, new UserNameStrategy()));machine.addAction(TweetState.HTTPCHECK, new CheckHttpAction(bos));machine.addAction(TweetState.URL, new CaptureTag(bos, new UrlStrategy()));return machine;}}

getUserTimeline方法包含三个步骤:首先,它包含一些推文,进行一些格式化,然后将结果放入模型中。 对于此博客,最重要的一点是掌握推文,您可以看到这是通过List <tweet> queryForTweets(String screenName)方法完成的。 此方法有两个步骤:使用Twitter对象获取TimelineOperations实例,然后使用该对象使用屏幕名称作为参数来查询时间线。

如果您查看Twitter界面,它将充当工厂对象,并返回其他对象来处理不同的Twitter功能:时间轴,直接消息传递,搜索等。我想这是因为开发人员意识到Twitter本身包含了如此多的功能,如果所有必需的方法都在一个类中,然后他们手上会有一个上帝对象 。

我还包括了将Tweets转换为HTML的可选步骤。 为此,我使用了State Machine项目和博客中的JAR,您可以在formatTweets(...)方法中查看其工作方式。

Tweet的列表作为属性放入模型后,要完成的最后一件事情是编写一个JSP来显示数据:

<ul><c:forEach items='${tweets}' var='tweet'><li><img src='${tweet.profileImageUrl}' align='middle'/><c:out value='${tweet.createdAt}'/><br/><c:out value='${tweet.text}' escapeXml='false'/></li></c:forEach>
</ul>

如果您实现了可选的锚标记格式,那么这里要记住的关键是确保浏览器能够获取格式化的TweetHTML。 这可以通过使用c:out标记的escapeXml ='false'属性或将$ {tweet.text}直接放入JSP中来实现。

在此示例中,我没有包含任何样式或花哨的前端,因此,如果您运行代码2 ,则应获得以下内容:

这就完成了我对Spring Social的简单介绍,但是仍然有很多基础。 在我的下一个博客中,我将了解背景情况。

1我猜想这里有很多隐私和数据保护合法性问题要考虑,尤其是如果您使用此API存储用户数据时,我希望对此发表评论和意见。

2该代码可在GitHub上的git项目中的git://github.com/roghughe/captaindebug.git上找到。

参考:来自Captain Debug博客博客的JCG合作伙伴 Roger Hughes的Spring Social入门 。

翻译自: https://www.javacodegeeks.com/2012/06/getting-started-with-spring-social.html

spring social

spring social_Spring Social入门相关推荐

  1. spring social_Spring Social入门–第2部分

    spring social 几周前,我写了一篇文章,展示了我认为可以使用Spring Social编写的最简单的应用程序. 该应用程序读取并显示了Twitter用户的公共数据,并被编写为Spring ...

  2. Spring Social入门–第2部分

    几周前,我写了一篇文章,展示了我认为可以使用Spring Social编写的最简单的应用程序. 该应用程序读取并显示了Twitter用户的公共数据,并被编写为Spring Social和社交编码领域的 ...

  3. Spring Social入门

    像我一样,无论是添加简单的Facebook"赞"按钮,一大堆"共享"按钮还是显示时间轴信息,您都不会注意到当前对应用程序"社交化"的热衷. ...

  4. Spring Cloud Eureka 入门 (三)服务消费者详解

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! "真正的进步 ...

  5. Spring Data ElasticSearch入门案例

    Spring Data ElasticSearch入门案例 创建maven工程elasticsearch_springdata 基于maven导入坐标 导入spring data elasticsea ...

  6. 微服务技术方案:Spring Cloud 从入门到实战

    随着互联网技术的发展与不断创新,以及用户流量的不断增大,越来越多的企业项目面临大数据.高并发等问题,随之而来的就是通过分布式模型组建架构,微服务思想就集中体现了应用价值,2020 年的你还没有掌握微服 ...

  7. Spring Data Solr入门

    Spring Data Solr是Spring Data项目的扩展,该项目旨在简化Apache Solr在Spring应用程序中的使用. 请注意,这不是Spring(数据)或Solr的简介. 我认为您 ...

  8. spring boot(一)入门

    目录 spring boot(一)入门 一.简介 1.微服务的概念 2.什么是spring boot 3.快速入门 4.springboot的快捷部署 spring boot(一)入门 一.简介 1. ...

  9. Spring Cloud Eureka 入门 (二)服务提供者详解

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! "优秀不是过 ...

最新文章

  1. .NET Core HttpClient请求异常思考
  2. Nginx 禁止部分 User-Agrent 访问
  3. Deeplearning4j 手写体数字识别
  4. Tensorflow Auto-encoder + VAE 实战
  5. JS 立即执行的函数表达式(function)写法
  6. python支持复数以及相关的运算吗_Python复数属性和方法运算操作示例
  7. LeetCode刷题——64. 最小路径和
  8. 1,python基础入门
  9. [NOIP2013 普及组 T1] 计数问题
  10. linux安装文泉驿字体,centos 安装文泉驿字体教程,centos文泉驿字体下载字体(URL:h...
  11. logcat日志分析
  12. 国内十家微交易平台,正规微交易平台排行榜
  13. 科技热点周刊|GitLab 上市、LinkedIn 中国停止运营、Visual Studio 2022 正式版将发布
  14. PHP简单实现MVC框架路由功能模式
  15. python制作pdf教程_学以致用:Python爬取廖大Python教程制作pdf!
  16. 无线AP 的频段(2.4GHZ or 5GHz)
  17. nodejs+ffmpeg视频转码
  18. 心形PCB补充一些小细节
  19. 生产用计算机房噪音应小于,计算机房建设标准.docx
  20. Linux网络 DHCP

热门文章

  1. 什么是G1垃圾回收算法
  2. Maven精选系列--发布jar包到Nexus私库
  3. java之StringBuider与StringBuffer
  4. Boostrap技能点整理之【网格系统】
  5. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Action的实现类
  6. JavaScript(笔记)
  7. 清洁代码_清洁单元测试
  8. java登录界面命令_Java命令行界面(第19部分):jClap
  9. java登录界面命令_Java命令行界面(第8部分):Argparse4j
  10. java 交替_Java 8:使用交替接口公开的类型安全地图生成器