Tugboat Gtd Docs For S2 Event At 20070629

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    Favorites, Groups & Events

    Tugboat Gtd Docs For S2 Event At 20070629 - Presentation Transcript

    1. Seasar Mini Event. Table Of Contents 1.Intoroduction 2.Demo 3.Examples 4.Ver 0.8 Preview - RESTful Web Services yosuke hara - June 29,2007
    2. 1.Introduction 2
    3. yosuke hara URI::d.hatena.ne.jp/yousukehara 3
    4. What's tugboat.GTD? 4
    5. Answer: 日々増え続けるタスクを効率的に けるタスクを効率的に タスク 処理するためのタスク管理ツールです するためのタスク管理ツール 処理するためのタスク管理ツールです 5
    6. の こだわり」 tugboat.GTDの 「こだわり」 6
    7. の こだわり」 tugboat.GTDの 「こだわり」 使いやすく直感的に理解可能な UI いやすく直感的に理解可能な 直感的 7
    8. の こだわり」 tugboat.GTDの 「こだわり」 使いやすく直感的に理解可能な UI いやすく直感的に理解可能な 直感的 そして、「設定」からの解放! そして、「設定」からの解放! 、「設定 解放 8
    9. 2.Demo 9
    10. 3.Examples 10
    11. Tugboat.GTDの構成 Layer Frame Work / Library View XHTML + CSS JavaScript prototype.js,mochiKit, YahooUI,script.aculo.us S2JSF (include:Teeda) Presentation S2JSF (include:Teeda) S2Container(DI+AOP) Service S2Container(DI+AOP) DAO S2DAO 11
    12. S2JSF (include:Teeda)のメリット • HTMLをテンプレートして開発を進めることができる – Web Designerとの分業が可能に • Teeda.extention.Ajax – Client(XMLHttpRequest通信)から送信されたパラメ ータを自動的にPOJOに設定することができる 12
    13. XMLHttpRequest Browser Teeda.Ajax.Servlet 13
    14. XMLHttpRequest Browser Teeda.Ajax.Servlet Web.xmlの << Web.xmlの抜粋 >> <servlet> <servlet-name>AjaxServlet</servlet-name> <servlet-class>org.seasar.teeda.ajax.AjaxServlet org.seasar.teeda.ajax.AjaxServlet</servlet-class> org.seasar.teeda.ajax.AjaxServlet <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>AjaxServlet</servlet-name> <url-pattern>*.ajax *.ajax *.ajax</url-pattern> </servlet-mapping> 14
    15. << Using prototype.js >> new Ajax.Request( Tugboat.AJAX_SERVLET_NAME, { method: Tugboat.constant.REQUEST_POST, XMLHttpRequest parameters: { component :'taskAjax 'taskAjax', action :'add 'add', activityId :1, Browser Teeda.Ajax.Servlet title :'Title', description:'Description' }, onComplete: function(transport){ json = eval(transport.responceText); } } ); //Tugboat.AJAX_SERVLET_NAME =‘teeda.ajax’ 15
    16. << Using prototype.js >> new Ajax.Request( Tugboat.AJAX_SERVLET_NAME, { method: Tugboat.constant.REQUEST_POST, XMLHttpRequest parameters: { component :'taskAjax 'taskAjax', action :'add 'add', activityId :1, Browser Teeda.Ajax.Servlet title :'Title', description:'Description' }, onComplete: function(transport){ json = eval(transport.responceText); } } ); //Tugboat.AJAX_SERVLET_NAME =‘teeda.ajax’ TaskAjaxImpl TaskAjaxImpl #add () 16
    17. << Using prototype.js >> new Ajax.Request( Tugboat.AJAX_SERVLET_NAME, { method: Tugboat.constant.REQUEST_POST, XMLHttpRequest parameters: { component :'taskAjax 'taskAjax', action :'add 'add', activityId :1, Browser Teeda.Ajax.Servlet title :'Title', description:'Description' }, onComplete: function(transport){ json = eval(transport.responceText); } } ); //Tugboat.AJAX_SERVLET_NAME =‘teeda.ajax’ String description String title 17
    18. Method#invoke Browser Teeda.Ajax.Servlet TaskAjaxImpl#add diconファイル ファイルの << diconファイルの抜粋 >> <component name=\"taskAjax taskAjax\" taskAjax class=\"org.seasar.tugboat.gtd.contents.task.page.impl.TaskAjaxImpl\" instance=\"request\"> <meta name=\"teeda-ajax\"/> <property name=\"taskService\">taskService taskService</property> taskService <property name=\"taskHelper\">taskHelper taskHelper</property> taskHelper <aspect>ajaxMethodInterceptor</aspect> 18 </component>
    19. Requestパラメータを自動的 に対象のAjaxクラスのプロパティに 設定 Browser Teeda.Ajax.Servlet TaskAjaxImpl#add TaskAjaxImpl = POJO String title_; //accessor:省略 String description_; //accessor:省略 public String add() { // return this.taskHelper.createJSON(taskDto); } 19
    20. Browser Teeda.Ajax.Servlet TaskAjaxImpl#add Service / DAO 20
    21. Browser Teeda.Ajax.Servlet TaskAjaxImpl#add Service / DAO JSON生成 (JSON-Lib) TaskHelper 21
    22. Browser Teeda.Ajax.Servlet TaskAjaxImpl#add Service / DAO JSONをレスポンス TaskHelper 22
    23. new Ajax.Request( Tugboat.AJAX_SERVLET_NAME, { method: Tugboat.constant.REQUEST_POST, parameters: { component :'taskAjax 'taskAjax', action :'add 'add', Browser Teeda.Ajax.Servlet TaskAjaxImpl#add Service / DAO activityId :1, title :'Title', description:'Description' }, onComplete: function(transport){ Eval関数を実行し、 eval(transport.responceText); json = eval(transport.responceText); } TaskHelper Objectを生成 } ); 23
    24. var list = LI({'id':ID_PREFIX + t.id, 'class':'default'}, LI DIV({'class':blockStyle.class_name}, DIV [ function() { var folderDiv = (TugboatUI.DragBox.selectedFolderId != 'folder_all') ? DIV DIV({'class': 'class_icon'}) : DIV DIV({'class': t.classId == 1 ? 'class_icon today' : t.classId == 2 ? 'class_icon week' : t.classId == 4 ? 'class_icon hold' : t.classId == 5 ? 'class_icon Service / DAO someday' Browser Teeda.Ajax.Servlet TaskAjaxImpl#add : 'class_icon' }); return folderDiv; }, DIV({'class':'activity_icon a_'+t.activityColor}), DIV DIV({'class': 'status'}), DIV MochiKIT (JS-lib) P({'class':'title'}, t.title), TaskHelper P({'class':'due'}, t.due == '' ? 'N/A' : t.due), を使用してDOMを P({'class':'personInCharge'}, t.isMe ? '[Me]' : t.personInCharge) 生成 ] ) ); 24
    25. << 結果 >> <div class=\"task today_todo\"> div <div class=\"class_icon\"/> div <div class=\"activity_icon a_00ff00\"/> div <div class=\"status\"/> div <p class=\"title\"> p <span span>test123</span> span <a href=\"javascript:void(0);\">test123</a> a Browser Teeda.Ajax.Servlet TaskAjaxImpl#add Service / DAO </p> <p class=\"due\">N/A</p> p <p class=\"personInCharge\">[Me]</p> p </div> MochiKIT (JS-lib) TaskHelper を使用してDOMを 生成 25
    26. 26
    27. 27
    28. 4.Ver 0.8 Preview 28
    29. いつでも、どこでも、 いつでも、どこでも、 アプリケーションを えれれば・・・を実現させたい アプリケーションを使えれれば・・・を実現させたい ・・・ 29
    30. 30
    31. Ruby Client Python Client Java Script Client Java Client 31
    32. tugboat.GTD == Virtual Database Ruby Client Python Client Java Script Client Java Client 32
    33. tugboat.GTD == Virtual Database Ruby Client Python Client <可能性> 可能性> Java Script Client ・Portlet ・Firefox Plugin ・Cell Phone's App Java Client etc… ・etc… 33
    34. Weekly Step 1. Collection Review Step 2. Processing Step 3. Organizing Step 4. Review Step 5. Doing 34
    35. RESTful Web Services 35
    36. 36
    37. Architecture Tugboat.GTD Web Application Tugboat.GTD RESTful Web Services Client View ( Ruby ) Presentation RESTful Web Service Service Service (Business Logic) (Business Logic) DAO DAO Resource Resource 37
    38. What's REST? 38
    39. Task id = 1 39
    40. Task id = 1 http://tugboat-gtd.sandbox.seasar.org/tasks/1 40
    41. Task id = 1 http://tugboat-gtd.sandbox.seasar.org/tasks/1 GET index.html HTTP/1.1 Host: tugboat-gtd.sandbox.seasar.org 41
    42. HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Task id = 1 http://tugboat-gtd.sandbox.seasar.org/tasks/1 GET index.html HTTP/1.1 Host: tugboat-gtd.sandbox.seasar.org 42
    43. • RESTで重要なのは、リソース – 全ての情報はリソース – リソースはURI(識別子)を持つ – リソースの状態は時間や条件とともに変化する可能性 がある – リソースの意味は時間や条件が変化しても不変である 43
    44. : Action : SQL:HTTP Verb Action SQL HTTP Create Insert POST Read Select GET Update Update PUT Delete Delete DELETE URIで表されるリソースに対して各種HTTPメソッドを発行しCRUDを実行 44
    45. HTTP Verb : Status 成功 失敗 Status Code 内容 Status Code 内容 ATOM | RSS Not found 200 404 GET 作成された Already exits 201 406 POST リソースのURI Validate error 406 Not found 200 (204) N/A 404 PUT Validate error 406 Not found DELETE 200 N/A 404 45
    46. Security 46
    47. • WSSE認証 WSSE認証 – WSSE認証はHTTPのX-WSSEヘッダを用いて認証用文字列 を送信する認証手段 – WSSE認証用文字列にはUser IdとPasswordが含まれます。 このとき、パスワードはSHA1アルゴリズムによって暗 号化されたダイジェストとして送信されるので、HTTP 基本認証などに比べてセキュアな認証が可能 47
    48. • WSSEヘッダの例 WSSEヘッダの ヘッダ – X-WSSE UsernameToken Username WSSE: Username=\"yousukehara\", PasswordDigest=\"z+FvFN5x6+OfEfmdmvjbHOLHlc0=\", PasswordDigest Nonce=\"YTI1ODdmOGU4ODA3YzAzZQ==\", Created Created=\"2007- Nonce 06-14T07:39:02Z\" • Username: User Id • Nonce: HTTPリクエスト毎に生成したセキュリティ・トークン • Created: Nonceが作成された日時をISO-8601表記で記述した もの • PasswordDigest: Nonce, Created, Passwordを文字列連結し SHA1アルゴリズムでダイジェスト化して生成された文字列を、 Base64エンコードした文字列 48
    49. Processing Flow Request Client Application 1.Clientは、認証トークンをApplicationに要求する 49
    50. Request Client Application Response 1.Clientは、認証トークンをApplicationに要求する 2.取得したトークンを元に「X-WSSEヘッダ」を作成する << Ruby >> require 'base64' require 'sha1' password_digest = Base64.encode64(SHA1.digest(\"#{nonce}#{created}#{@password}\")).chop wsse = \"UsernameToken Username=¥\"#{@userId}¥\",\" wsse << \"PasswordDigest=¥\"#{password_digest}¥\",\" wsse << \"Nonce=¥\"#{nonce}¥\",\" wsse << \"Created=¥\"#{created}¥\"\" 50
    51. Request Client Application Response 1.Clientは、認証トークンをApplicationに要求する 2.取得したトークンを元に「X-WSSEヘッダ」を作成する << Java >> import org.apache.commons.codec.binary.Base64; org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils; String compPasswordDigest = new String( new Base64().encode( DigestUtils.sha(nonce + created + user.getPassword()) ) ).trim(); 51
    52. Request Client Application Client: Ruby, Python, JavaScript(制限あり) 1.Clientは、認証トークンをApplicationに要求する 2.取得したトークンを元に「X-WSSEヘッダ」を作成する 3.処理を実行 52
    53. Request Client Application Response Client: Ruby, Python, JavaScript(制限あり) < ex.Ruby Client > taskService = TugboatGTD::TaskRestService.new(\"hara@test\",\"pass\") id = taskService.create(1,\"TITLE-1\",\"DESCRIPTION-1\") task = taskService.find(id) puts task[“title”] ※結果は、ATOMで取得 53
    54. <?xml version='1.0' encoding='UTF-8'?> <feed xmlns:taxo='http://purl.org/rss/1.0/modules/taxonomy/' version='0.3' xmlns:sy='http://purl.org/rss/1.0/modules/syndication/' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns='http://purl.org/atom/ns#'> <title>Sample Feed - tugboat.GTD - tasks</title> <link href='http://tugboat-gtd.sandbox.seasar.org' rel='alternate'/> <tagline>tugboat.GTD</tagline> <entry> <title>TITLE- <title>TITLE-1</title> <link href='http://127.0.0.1:8080/rest/tasks/0' rel='alternate'/> <author> <name>Yosuke Hara</name> </author> <modified>2007-06-21T02:36:48Z</modified> <issued>2007-06- <issued>2007-06-21T02:36:48Z</issued> type='text/plain'>DESCRIPTION- <summary mode='escaped' type='text/plain'>DESCRIPTION-1</summary> <dc:creator>Yosuke Hara</dc:creator> <dc:date>2007-06-21T02:36:48Z</dc:date> </entry> </feed> 54
    55. Examples 55
    56. HttpRequest Incl. X-WSSE Client RESTful Web Services Servlet ( Ruby ) HTTP Method [GET GET] GET http://127.0.0.1/tugboatGTD/rest/tasks/1 tasks/1 56
    57. HTTP Method URI Parse Client RESTful Web Services RESTful Web Service Servlet ( Ruby ) HTTP Method [GET GET] GET http://127.0.0.1/tugboatGTD/rest/tasks/1 tasks/1 Servlet Mapping 57
    58. 一部抜粋) << web.xml (一部抜粋) >> <servlet> <servlet-name>restServlet</servlet-name> <servlet-class> org.seasar.tugboat.gtd.container.servlet.RESTfulWebServiceServlet org.seasar.tugboat.gtd.container.servlet.RESTfulWebServiceServlet </servlet-class> <load-on-startup>4</load-on-startup> </servlet> <servlet-mapping> <servlet-name>restServlet</servlet-name> <url-pattern>/rest/* /rest/*</url-pattern> /rest/* </servlet-mapping> 58
    59. HTTP Method URI Parse Client RESTful Web Services RESTful Web Service Servlet ( Ruby ) HTTP Method [GET GET] GET http://127.0.0.1/tugboatGTD/rest/tasks/1 tasks/1 ‘ Get task by id == 1’ 59
    60. diconファイル 一部抜粋) << diconファイル (一部抜粋) >> <components namespace=\"webservice webservice\"> webservice <include path=\"dicon/contents/task/task.dicon\" /> <component name=\"tasks tasks\" tasks class=\"org.seasar.tugboat.gtd.contents.task.webservice.impl.TaskWebServiceImpl\" instance=\"request\"> <property name=\"taskService\">taskService</property> </component> </components> 60
    61. (一部抜粋 一部抜粋) << web service class (一部抜粋) >> public class TaskWebServiceImpl implements TaskWebService { @RestMethod(method = HttpMethod.GET) HttpMethod.GET) public String find(int id) { TaskRelationDto dto = this.taskService_.getTaskById(id); // // 以下省略 // } } 61
    62. Invoke Business Logic Client RESTful Web Services RESTful Web Service Servlet ( Ruby ) Service (Business Logic) DAO 62
    63. Generate ATOM (XML) Client RESTful Web Services RESTful Web Service Servlet ( Ruby ) Service (Business Logic) DAO 63
    64. Response ATOM (XML) Client RESTful Web Services RESTful Web Service Servlet ( Ruby ) Service (Business Logic) DAO 64
    65. DEMO 65
    66. Question ? 66
    67. 67

    + yousukeharayousukehara, 3 years ago

    custom

    5130 views, 0 favs, 1 embeds more stats

    More Info

    © All Rights Reserved

    Go to text version
    • Total Views 5130
      • 5129 on SlideShare
      • 1 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 103
    Most viewed embeds
    • 1 views on http://192.168.10.100

    more

    All embeds
    • 1 views on http://192.168.10.100

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as innappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel

    Categories