{"id":1402,"date":"2009-07-19T01:34:08","date_gmt":"2009-07-18T16:34:08","guid":{"rendered":"http:\/\/fukata.org\/?p=1402"},"modified":"2017-08-11T23:07:14","modified_gmt":"2017-08-11T23:07:14","slug":"jc-dwr2-spring2-and-twitter4j","status":"publish","type":"post","link":"https:\/\/blog.fukata.org\/archives\/1402\/","title":{"rendered":"[JC]DWR2+Spring2\u306e\u9023\u643a\u3068Twitter4J\u306b\u5bfe\u5fdc\u3057\u307e\u3057\u305f"},"content":{"rendered":"

\"home_1247931392419\"<\/a>\u30bf\u30a4\u30c8\u30eb\u304b\u3089\u3082\u5206\u304b\u308b\u901a\u308a\u3001SNS\u5185\u304b\u3089\u3001Twitter\u3092\u901a\u3058\u3066\u767a\u8a00\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u3066\u307f\u307e\u3057\u305f\u3002\u3055\u3089\u306b\u3001Ajax\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3068\u3057\u3066\u3001DWR2\u3092\u63a1\u7528\u3002\u540c\u30e9\u30a4\u30d6\u30e9\u30ea\u306f\u5143\u3005Spring\u3068\u306e\u9023\u643a\u3082\u8003\u616e\u3055\u308c\u3066\u3044\u308b\u306e\u3067\u3001\u6bd4\u8f03\u7684\u9023\u643a\u306f\u7c21\u5358\u3067\u3057\u305f\u3002<\/p>\n

\u307e\u305f\u3001Twitter\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3068\u3057\u3066faff.jp\u306e\u4f5c\u6210\u8005\u3067\u3082\u3042\u308bHaruyoshi\u3055\u3093\u304b\u3089\u300cTwitter4J<\/a>\u300d\u304c\u4fbf\u5229\u3060\u3068\u805e\u3044\u3066\u63a1\u7528\u3057\u307e\u3057\u305f\u3002Java\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3067\u64cd\u4f5c\u304c\u51fa\u6765\u308b\u305f\u3081\u3001\u81ea\u5206\u3067XML\u306a\u3069\u306e\u9762\u5012\u306a\u30d1\u30fc\u30b9\u3092\u3057\u306a\u304f\u3066\u6e08\u3080\u306e\u304c\u4e00\u756a\u306e\u5927\u304d\u306a\u70b9\u3067\u3059\u3002<\/p>\n

Java\u3067Twitter\u3068\u9023\u643a\u3057\u305f\u3044\u306e\u3067\u3042\u308c\u3070\u3001\u4e00\u756a\u7c21\u5358\u306a\u3093\u3058\u3083\u306a\u3044\u304b\u3068\u601d\u3044\u307e\u3059\u3002\u6ce8\u610f\u3068\u3057\u3066\u3001\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u6700\u65b0\u7248(2.0.8)\u306b\u3057\u306a\u3044\u3068\u3001Twitter\u5074\u306eAPI\u3068\u306e\u7d61\u307f\u3067Exception\u306f\u767a\u751f\u3057\u307e\u3059\u3002\u306a\u306e\u3067\u3001\u4f7f\u7528\u3059\u308b\u969b\u306f\u3001\u6700\u65b0\u7248\u3092\u5229\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n

\u307e\u3041\u3001\u4eca\u56de\u306e\u9023\u643a\u306b\u3064\u3044\u3066\u3001\u30b3\u30fc\u30c9\u3092\u6b8b\u3057\u3066\u304a\u304d\u307e\u3059\u306e\u3067\u3001\u4f55\u304b\u306e\u5f79\u306b\u7acb\u3066\u3070\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n

DWR2+Spring2\u306e\u9023\u643a\u306b\u3088\u308a\u3001dwr.xml\u306e\u8a18\u8ff0\u304c\u5fc5\u8981\u306a\u304f\u306a\u308a\u3001applicationContext.xml\u306b\u8a18\u8ff0\u3059\u308b\u3060\u3051\u3067\u3088\u304f\u306a\u308a\u3001Spring\u306b\u6163\u308c\u3066\u3044\u308b\u4eba\u306f\u8a2d\u5b9a\u3057\u3084\u3059\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n

\u81ea\u5206\u30e1\u30e2\u3067\u3059\u304c\u3001\u4eca\u56de\u306e\u30bf\u30b0\u306f\u300cMileStone_008\u300d\u306bDWR2+Spring2\u306e\u9023\u52d5\u307e\u3067\u306e\u78ba\u8a8d\u3092\u542b\u3081\u305f\u30bd\u30fc\u30b9\u3092\u30b3\u30df\u30c3\u30c8\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n

<\/p>\n

\u25a0applicationContext.xml<\/p>\n

\r\n< ?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\tclasspath:database.properties\r\n\t\t\t\t<\/value>\r\n\t\t\t<\/list>\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\r\n\t\r\n\t\t<\/property>\r\n\t\t<\/property>\r\n\t\t<\/property>\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\r\n\t\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\tPROPAGATION_REQUIRED<\/prop>\r\n\t\t\t\tPROPAGATION_REQUIRED<\/prop>\r\n\t\t\t\tPROPAGATION_REQUIRED<\/prop>\r\n\t\t\t\t\r\n\t\t\t<\/props>\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\r\n\t\r\n\t\t<\/property>\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\ttransactionInterceptor<\/value>\r\n\t\t\t<\/list>\r\n\t\t<\/property>\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t*Service<\/value>\r\n\t\t\t<\/list>\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\r\n\t\r\n\t\t<\/property>\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\r\n\t\r\n\t\r\n\t<\/bean>\r\n\r\n\t\r\n\t\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\t\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\t\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\r\n\t\r\n\t\r\n\t\t<\/property>\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\t\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\t\r\n\t<\/bean>\r\n\r\n\t\r\n\t\r\n\t<\/bean>\r\n\t\r\n\t\t<\/property>\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\t\r\n\t\t<\/property>\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\t\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\r\n\t\r\n\t\r\n\t\t<\/dwr><\/dwr>\r\n\t\t<\/dwr>\r\n\t\t<\/dwr>\r\n\t\r\n\t\r\n\t\t<\/property>\r\n\t\t<\/property>\r\n\r\n\t\t\r\n\t\t\t<\/dwr><\/dwr>\r\n\t\t\t<\/dwr>\r\n\t\t\t<\/dwr>\r\n\t\t\t<\/dwr>\r\n\t\t\r\n\t<\/bean>\r\n\r\n\r\n\t\r\n\t\r\n\t\t<\/property>\r\n\t<\/bean>\r\n\r\n\t\r\n\t\r\n\t\t<\/aop><\/aop>\r\n\t\r\n\t\r\n\t<\/bean>\r\n<\/beans>\r\n<\/pre>\n

\u25a0web.xml<\/p>\n

\r\n< !DOCTYPE web-app PUBLIC\r\n \"-\/\/Sun Microsystems, Inc.\/\/DTD Web Application 2.3\/\/EN\"\r\n \"https:\/\/java.sun.com\/dtd\/web-app_2_3.dtd\" >\r\n\r\n\r\n\tjc-front<\/display>\r\n\t\r\n\t\r\n\t\tcontextConfigLocation\r\n\t\t\/WEB-INF\/applicationContext.xml\r\n\t<\/context>\r\n\r\n\t\r\n\t\t<\/filter>jc-front<\/filter>\r\n\t\torg.apache.struts2.dispatcher.FilterDispatcher<\/filter>\r\n\t\t\r\n\t\t\tactionPackages\r\n\t\t\torg.fukata.jc_front.action\r\n\t\t<\/init>\r\n\t\r\n\r\n\t\r\n\t\t<\/filter>jc-front<\/filter>\r\n\t\t\/*<\/url>\r\n\t\r\n\r\n\t\r\n\t\t<\/listener>org.springframework.web.context.ContextLoaderListener<\/listener>\r\n\t\r\n\r\n\r\n\t\r\n\t\r\n\t\t<\/servlet>dwr-invoker<\/servlet>\r\n\t\torg.directwebremoting.spring.DwrSpringServlet<\/servlet>\r\n\t\t\r\n\t\t\t\r\n\t\t\tdebug\r\n\t\t\ttrue\r\n\t\t<\/init>\r\n\t\t\r\n\t\t\tactiveReverseAjaxEnabled\r\n\t\t\ttrue\r\n\t\t<\/init>\r\n\t\t1<\/load>\r\n\t\r\n\r\n\t\r\n\t\t<\/servlet>dwr-invoker<\/servlet>\r\n\t\t\r\n\t\t\/dwr\/*<\/url>\r\n\t\r\n\r\n<\/web>\r\n<\/pre>\n

\u25a0TwitterManager.java<\/p>\n

\r\npackage org.fukata.jc_front.dwr.manager;\r\n\r\nimport java.util.List;\r\n\r\nimport javax.servlet.http.HttpServletRequest;\r\n\r\nimport org.directwebremoting.WebContext;\r\nimport org.directwebremoting.WebContextFactory;\r\nimport org.fukata.jc_common.utils.beanutils.JcBeanUtils;\r\nimport org.fukata.jc_front.dto.CustomerDto;\r\nimport org.fukata.jc_front.dto.SessionUserDto;\r\nimport org.fukata.jc_front.dto.TwitterDto;\r\nimport org.fukata.jc_front.dwr.bean.TwitterBean;\r\nimport org.fukata.jc_front.service.CustomerService;\r\nimport org.fukata.jc_front.service.TwitterService;\r\n\r\nimport twitter4j.Status;\r\n\r\npublic class TwitterManager {\r\n\t\r\n\tprivate CustomerService customerService;\r\n\tprivate TwitterService twitterService;\r\n\t\r\n\t\/**\r\n\t * \u767a\u8a00\u7528\u30e1\u30bd\u30c3\u30c9\r\n\t * @param status\r\n\t *\/\r\n\tpublic TwitterBean echo(String status) {\r\n\t\tWebContext dwrContext = WebContextFactory.get();\r\n\t\tHttpServletRequest request = dwrContext .getHttpServletRequest();\r\n\t\tTwitterDto twitterDto = generateTwitterDto(request);\r\n\t\t\/\/ status\r\n\t\ttwitterDto.setStatus(status);\r\n\t\t\r\n\t\tStatus updateStatus = this.twitterService.updateStatus(twitterDto);\r\n\t\t\r\n\t\t\/\/ bean\u306e\u751f\u6210\r\n\t\tTwitterBean bean = new TwitterBean();\r\n\t\tbean.setLatestStatus(updateStatus);\r\n\t\t\r\n\t\treturn bean;\r\n\t}\r\n\r\n\tprivate TwitterDto generateTwitterDto(HttpServletRequest request) {\r\n\t\tSessionUserDto sessionUserDto = this.customerService.getSessionUserDto(request);\r\n\t\tCustomerDto customerDto = this.customerService.selectByCustomerId(sessionUserDto.getCustomerId());\r\n\t\t\r\n\t\tTwitterDto twitterDto = new TwitterDto();\r\n\t\tJcBeanUtils.copyProperties(twitterDto, customerDto);\r\n\t\t\r\n\t\treturn twitterDto;\r\n\t}\r\n\r\n\t\/**\r\n\t * \u30d5\u30ec\u30f3\u30c9\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u53d6\u5f97\u7528\u30e1\u30bd\u30c3\u30c9\r\n\t * @param value\r\n\t *\/\r\n\tpublic TwitterBean getFriendsTimeline() {\r\n\t\tWebContext dwrContext = WebContextFactory.get();\r\n\t\tHttpServletRequest request = dwrContext .getHttpServletRequest();\r\n\t\tTwitterDto twitterDto = generateTwitterDto(request);\r\n\t\t\r\n\t\tList friendsTimeline = this.twitterService.getFriendsTimeline(twitterDto);\r\n\t\t\r\n\t\t\/\/ bean\u306e\u751f\u6210\r\n\t\tTwitterBean bean = new TwitterBean();\r\n\t\tbean.setFriendsTimeline(friendsTimeline);\r\n\t\t\r\n\t\treturn bean;\r\n\t}\r\n\r\n\tpublic CustomerService getCustomerService() {\r\n\t\treturn customerService;\r\n\t}\r\n\r\n\tpublic void setCustomerService(CustomerService customerService) {\r\n\t\tthis.customerService = customerService;\r\n\t}\r\n\r\n\tpublic TwitterService getTwitterService() {\r\n\t\treturn twitterService;\r\n\t}\r\n\r\n\tpublic void setTwitterService(TwitterService twitterService) {\r\n\t\tthis.twitterService = twitterService;\r\n\t}\r\n\t\r\n}\r\n<\/status><\/pre>\n

\u25a0TwitterBean.java<\/p>\n

\r\npackage org.fukata.jc_front.dwr.bean;\r\n\r\nimport java.io.Serializable;\r\nimport java.util.List;\r\n\r\nimport twitter4j.Status;\r\n\r\npublic class TwitterBean implements Serializable {\r\n\tprivate Status latestStatus;\r\n\tprivate List friendsTimeline;\r\n\t\r\n\tpublic Status getLatestStatus() {\r\n\t\treturn latestStatus;\r\n\t}\r\n\tpublic void setLatestStatus(Status latestStatus) {\r\n\t\tthis.latestStatus = latestStatus;\r\n\t}\r\n\tpublic List<\/status> getFriendsTimeline() {\r\n\t\treturn friendsTimeline;\r\n\t}\r\n\tpublic void setFriendsTimeline(List<\/status> friendsTimeline) {\r\n\t\tthis.friendsTimeline = friendsTimeline;\r\n\t}\r\n\t\r\n}\r\n<\/status><\/pre>\n

\u25a0twitter.js(jquery.js\u306b\u4f9d\u5b58\u3057\u3066\u3044\u307e\u3059)<\/p>\n

\r\n\/\/ \u767a\u8a00\u7528\r\nfunction echo() {\r\n\t\/\/ HTML\u304b\u3089\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\r\n\tvar status = dwr.util.getValue(\"twitter_status\");\r\n\t\/\/ \u5165\u529b\u5024\u304c\u7a7a\u306e\u5834\u5408\u306f\u767a\u8a00\u3057\u306a\u3044\u3002\r\n\tif (status.trim==\"\") {\r\n\t\treturn false;\r\n\t}\r\n\t\r\n\t\/\/ \u30ea\u30e2\u30fc\u30c8\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u5b9f\u884c\uff08\u7b2c\u4e8c\u5f15\u6570\u306f\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u95a2\u6570\uff09\r\n\tTwitterManager.echo(status, _echo);\r\n\r\n\treturn false;\r\n}\r\n\r\n\/\/ \u767a\u8a00\u7528\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\r\nfunction _echo(twitterBean) {\r\n\t\/\/ \u5165\u529b\u5024\u306e\u521d\u671f\u5316\r\n\tdwr.util.setValue(\"twitter_status\", \"\");\r\n}\r\n\r\n\/\/ \u8fd4\u4fe1\r\nfunction reply(to) {\r\n\tvar status = dwr.util.getValue(\"twitter_status\");\r\n\tstatus = '@' + to + \" \" + status;\r\n\tdwr.util.setValue(\"twitter_status\", status);\r\n}\r\n\r\n\/\/ \u521d\u671f\u30ed\u30fc\u30c9\u6642\u5b9f\u884c\u7528\r\nfunction init() {\r\n\tdwr.engine.setActiveReverseAjax(true);\r\n\t\r\n\tgetFriendsTimeline();\r\n}\r\n\r\n\/\/ \u30d5\u30ec\u30f3\u30c9\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u53d6\u5f97\u7528\r\nfunction getFriendsTimeline() {\r\n\tTwitterManager.getFriendsTimeline({\r\n        callback: _getFriendsTimeline\r\n    });\r\n}\r\n\r\n\/\/ \u30d5\u30ec\u30f3\u30c9\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u53d6\u5f97\u7528\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\r\nfunction _getFriendsTimeline(twitterBean) {\r\n\tvar options = {};\r\n\toptions.escapeHtml = false;\r\n\t\r\n\t\/\/ \u521d\u671f\u5316\r\n\tdwr.util.setValue(\"twitter_timeline\", \"\", options);\r\n\tvar html = \"\";\r\n\tfor (var i = 0; i < twitterBean.friendsTimeline.length; i++) {\r\n\t\tvar status = twitterBean.friendsTimeline[i];\r\n\t\tvar _html = \"\";\r\n\t\t_html += '
';\r\n\t\t_html += '
';\r\n\t\t_html += '';\r\n\t\t_html += '<\/div>';\r\n\t\t_html += '
';\r\n\t\t_html += status.user.screenName + \"
\";\r\n\t\t_html += status.text;\r\n\t\t_html += '<\/div>';\r\n\t\t_html += '
';\r\n\t\t_html += '<\/a>';\r\n\t\t_html += '<\/div>';\r\n\t\t_html += '';\r\n\t\t\r\n\t\thtml += _html;\r\n\t\tdwr.util.setValue(\"twitter_timeline\", html, options);\r\n\t}\r\n\t\r\n\t\/\/ \u30dd\u30fc\u30ea\u30f3\u30b0\r\n\tsetTimeout(getFriendsTimeline, 60000);\r\n}\r\n\r\n$(document).ready(init);\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"

\u30bf\u30a4\u30c8\u30eb\u304b\u3089\u3082\u5206\u304b\u308b\u901a\u308a\u3001SNS\u5185\u304b\u3089\u3001Twitter\u3092\u901a\u3058\u3066\u767a\u8a00\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u3066\u307f\u307e\u3057\u305f\u3002\u3055\u3089\u306b\u3001Ajax\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3068\u3057\u3066\u3001DWR2\u3092\u63a1\u7528\u3002\u540c\u30e9\u30a4\u30d6\u30e9\u30ea\u306f\u5143\u3005Spring\u3068\u306e\u9023\u643a\u3082\u8003\u616e\u3055\u308c\u3066\u3044\u308b\u306e … \u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>\n","protected":false},"author":2,"featured_media":9223372036854775807,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1980],"tags":[351,349,341,350],"_links":{"self":[{"href":"https:\/\/blog.fukata.org\/wp-json\/wp\/v2\/posts\/1402"}],"collection":[{"href":"https:\/\/blog.fukata.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.fukata.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.fukata.org\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.fukata.org\/wp-json\/wp\/v2\/comments?post=1402"}],"version-history":[{"count":0,"href":"https:\/\/blog.fukata.org\/wp-json\/wp\/v2\/posts\/1402\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.fukata.org\/wp-json\/wp\/v2\/media\/9223372036854775807"}],"wp:attachment":[{"href":"https:\/\/blog.fukata.org\/wp-json\/wp\/v2\/media?parent=1402"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.fukata.org\/wp-json\/wp\/v2\/categories?post=1402"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.fukata.org\/wp-json\/wp\/v2\/tags?post=1402"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}