前回作成したJSPファイル「war/twitter/index.jsp」を以下のように編集します。
<%@page pageEncoding="UTF-8" isELIgnored="false" session="false"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <%@taglib prefix="f" uri="http://www.slim3.org/functions"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>twitter Index</title> </head> <body> <p>Hello twitter Index !!! </p> <!-- つぶやき --> <form method="post" action="tweet"> <input name="message" istyle="1" format="*M" mode="hiragana" size="20" type="text"> <input value="つぶやく" type="submit"> ${result} </form> </body> </html>
<form>タグのactionに「tweet」を指定することにより、フォーム送信時にTweetControllerを呼び出します。
それでは、実際につぶやいてみましょう。Webブラウザに「http://localhost:8888/twitter/index」を入力して開いてみてください。
つぶやきを入力して、「つぶやく」ボタンを押下します。そしてTwitterのページを開き、つぶやきを確認してください。
次に、タイムラインを取得してみましょう。
「com.hayato.gpstweet.service.TwitterService」に、以下のようにgetTimelineメソッドを追加します。
package com.hayato.gpstweet.service; import java.util.List; import twitter4j.Paging; import twitter4j.Status; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; import twitter4j.http.AccessToken; public class TwitterService { ……【略】…… // タイムラインの取得 public List<Status> getTimeline() throws TwitterException { int page = 1; int pageCount = 20; Twitter twitter = getTwitter(); // タイムラインの取得 List<Status> statusList = twitter.getUserTimeline(new Paging(page, pageCount)); return statusList; } }
TwitterインスタンスのgetUserTimeline()メソッドを呼び出すことにより、タイムラインが取得できます。
引数として、Pagingクラスを指定します。Pagingクラスには、取得するページとページ内に含めるツイート数を指定します。これにより、ページング処理が行えますが、ここでは、1ページ(20ツイート)だけを取得します。
次にコントローラクラスを作成します。「build.xml」を実行し、「gen-controller」で、ダイアログに「/twitter/timeline」を指定します。
「com.hayato.gpstweet.controller.twitter.TimelineController」を以下のように編集します。
package com.hayato.gpstweet.controller.twitter; import java.util.List; import org.slim3.controller.Controller; import org.slim3.controller.Navigation; import twitter4j.Status; import com.hayato.gpstweet.service.TwitterService; public class TimelineController extends Controller { private TwitterService service = new TwitterService(); @Override public Navigation run() throws Exception { // タイムラインの取得 List<Status> statusList = service.getTimeline(); requestScope("tweets", statusList); return forward("timeline.jsp"); } }
TweetControllerクラスで、TwitterServiceを呼び出したのと同じ要領で、TwitterインスタンスのgetTimeline()を呼び出します。
JSPファイル「war/twitter/timeline.jsp」を以下のように編集します。
<%@page pageEncoding="UTF-8" isELIgnored="false"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <%@taglib prefix="f" uri="http://www.slim3.org/functions"%> <%@taglib prefix="m" uri="http://taglibs.mobylet.org/" %> <html> <head> <title>Twitter</title> </head> <body style="border: 2px solid black;"> <div> <table style="background: none repeat scroll 0% 0% #A9A9A9; width: 100%;"> <tbody> <c:forEach var="tweet" items="${tweets}" varStatus="status"> <c:choose> <c:when test="${status.count % 2 == 0}"> <c:set var="color" value="#FFFFFF;" /> </c:when> <c:otherwise> <c:set var="color" value="#F5F5F5;" /> </c:otherwise> </c:choose> <tr> <td style="background: none repeat scroll 0% 0% <c:out value="${color}"/> padding: 5px;"> ${status.count}<br /> <img src="${tweet.user.profileImageURL}" width="40" height="40"> </td> <td style="background: none repeat scroll 0% 0% <c:out value="${color}"/> padding: 5px;"> ${f:h(tweet.text)} </td> </tr> </c:forEach> </tbody> </table> </div> <br> </body> </html>
JSTLのforEachタグを使用して、取得したツイートを表示します。その際、見やすくするために奇数行と偶数行の背景色を変えています。
${tweet}のtextから、つぶやきが取得できます。HTMLをエスケープするために、Slim3が提供している「Slim3 JSP」機能のf:hタグを使用しています。
また、user.profileImageURLからツイートしたユーザーの画像のURLが取得できるので、<img>タグに指定します。
それでは、Webブラウザで確認してみましょう。「http://localhost:8888/twitter/timeline」を指定して、Webブラウザを開きます。
最後に、エラーハンドリングについてです。GAE上にデプロイし、Twitter4Jを使用して、ツイートを検索すると、「You have been rate limited. Enhance your calm.」というエラーが発生することがあります。
これは、Twitter4Jの検索処理で使用しているTwitter APIの検索回数制限に引っかかっているためです。IPアドレスをキーとした制限がかかりますが、GAEにデプロイされているアプリはすべて同一IPからTwitterにアクセスするため、制限に引っかかりやすくなります。
以下のようにShowContorollerクラスにhandleError()メソッドを追加して、エラー発生時に「error.jsp」というファイルにリダイレクトするようにしましょう。
// ローカル開発環境かどうか protected boolean isLocal(){ return ServletContextLocator.get().getServerInfo().indexOf("Development") >= 0; } // エラーハンドル @Override protected Navigation handleError(Throwable error) { // ローカル開発環境の場合 if (isLocal()){ throw new RuntimeException(error); } // エラー画面にリダイレクトする return redirect("error"); }
以下は、error.jspの例です。「war/twitter」に作成してください。
<%@page pageEncoding="UTF-8" isELIgnored="false" session="false"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <%@taglib prefix="f" uri="http://www.slim3.org/functions"%> <%@taglib prefix="m" uri="http://taglibs.mobylet.org/" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Error</title> </head> <body> サーバが混み合っております。申し訳ございません。<br /> お手数をお掛け致しますが、しばらくしてから再度、実行してください。 </body> </html>
このように今回は、「Twitter4J」を使って、Twitterからタイムラインを取得したり、つぶやいたりする機能を実装しましたが、いかがでしたでしょうか。最後に紹介したように、Twitter APIには使用回数制限があるので、実際に使うには注意が必要です。
次回は、携帯端末ならではの位置情報取得機能とGoogleマップ表示機能を実装して、サンプルアプリを仕上げますので、お楽しみに!
Copyright © ITmedia, Inc. All Rights Reserved.