Scalatra	  2.2	  NOVEMBER	  2012	  
2	  Short	  introduc,on	  And	  overview	  of	  	  New	  features	  
What?	  ●  Rou5ng	  ●  Params	  ●  Json4s	  ●  Akka	  ●  Atmosphere	  ●  Commands	  
Hello,	  Scalatra	  class	  HelloWorld	  extends	  ScalatraServlet	  {	  	  	  	  	  get("/hello/:name")	  {	  	  	  	  	 ...
Hello,	  Scalatra:	  Routes	  class	  HelloWorld	  extends	  ScalatraServlet	  {	  	  	  	  	  get("/hello/:name")	  {	  	...
Hello,	  Scalatra:	  Ac,ons	  class	  HelloWorld	  extends	  ScalatraServlet	  {	  	  	  	  	  get("/hello/:name")	  {	  	...
Hello	  Scalatra:	  ScalatraServlet	  class	  HelloWorld	  extends	  ScalatraServlet	  {	  	  	  get("/hello/:name")	  {	 ...
Why	  Scalatra?	  ●  Based	  on	  Sinatra,	                 •  Java	     which	  I	  like	  to	  call	        •  F#	     "...
Scalatra	  Philosophy	  ●  Stateless	  by	  default,	       •  Akka	     sessions	  if	  you	  need	     •  Atmosphere	   ...
Rou,ng	  in	  depth:	  Methods	  get("/hello/:name")	  {	  "Hi,	  "+params("name")	  }	  ●  Routes	  start	  with	  an	  H...
Rou,ng	  in	  depth:	  Params	  get("/hello/:name")	  {	  "Hi,	  "+params("name")	  }	  ●  Matches	  the	  servlet	  path....
Rou,ng	  in	  depth:	  Params	  
Rou,ng	  in	  depth:	  Splats	  get("/hello/*")	  {	  multiParams("splat").mkString(",")	  }	  ●  Splats get stored in the...
Rou,ng	  in	  depth:	  regex	  get("""/hello/(w+)""".r)	  {	  "Hello,	  "+params("captures")	  }	  	  ●      Use if you ha...
Rou,ng	  in	  depth:	  booleans	  def	  userAgent	  =	  request.getHeader("User-­‐Agent”)	  get("/hello/:name",	  !userAge...
Ac,ons	  in	  depth:	  return	  value	  ●  The return value of an action becomes the   body of the response.	  
•  Its just a                                        •  OverrideAc,ons	  in	  depth:	  render	  pipeline	                 ...
Ac,ons	  in	  depth:	  mutable	  
Ac,ons	  in	  depth:	  mutable	  get("/hello/:name")	  {	    status	  =	  HttpServletResponse.SC_GONE	  	    contentType	 ...
Commands	  ●  Capture	  input	  ●  Validate	  input	  
Integra,ons:	  JSON4S	  ●  Serialize	  case	  classes	  to	  json	  ●  Handles	  xml	  as	  well	  as	  json	  
Integra,ons:	  Akka	  ●  Takes	  advantage	  of	  servlet	  3.0	  async	  support	  
Integra,ons:	  Atmosphere	  ●  WebSocket	  	  ●  Server	  side	  events	  ●  Like	  socket.io	  but	  not	  socket.io	  
Upcoming SlideShare
Loading in …5
×

Scalatra 2.2

3,429 views

Published on

The slides for my presentation at Scala for startups

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,429
On SlideShare
0
From Embeds
0
Number of Embeds
56
Actions
Shares
0
Downloads
27
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Scalatra 2.2

  1. 1. Scalatra  2.2  NOVEMBER  2012  
  2. 2. 2  Short  introduc,on  And  overview  of    New  features  
  3. 3. What?  ●  Rou5ng  ●  Params  ●  Json4s  ●  Akka  ●  Atmosphere  ●  Commands  
  4. 4. Hello,  Scalatra  class  HelloWorld  extends  ScalatraServlet  {          get("/hello/:name")  {          <h1>Hello,  {params("name")}</h1>      }  }  
  5. 5. Hello,  Scalatra:  Routes  class  HelloWorld  extends  ScalatraServlet  {          get("/hello/:name")  {          <h1>Hello,  {params("name")}</h1>      }  }  ●  Matches  GET  requests  to  /hello/*  ●  Captures  named  parameters  from  the  route  (here,  :name).  ●  Matching  requests  are  dispatched  to  the  ac5on.  
  6. 6. Hello,  Scalatra:  Ac,ons  class  HelloWorld  extends  ScalatraServlet  {          get("/hello/:name")  {          <h1>Hello,  {params("name")}</h1>      }  }  ●  When  a  request  matches  a  route,  the  ac5on  is  run.  ●  A  response  is  generated  from  the  ac5ons  result.   Supports  XML  literals,  Byte  arrays,  Strings,  Files,   InputStreams.  ●  Rendering  of  ac5on  results  is  customizable.  
  7. 7. Hello  Scalatra:  ScalatraServlet  class  HelloWorld  extends  ScalatraServlet  {      get("/hello/:name")  {          <h1>Hello,  {params("name")}</h1>      }  }  ●  ScalatraServlet  provides  the  HTTP  DSL.  ●  Scalatra  2.x  is  built  on  Java  Servlets,  the   standard  web  server  API  for  the  JVM.  
  8. 8. Why  Scalatra?  ●  Based  on  Sinatra,   •  Java   which  I  like  to  call   •  F#   "the  universal  web   •  Erlang   DSL".    Clones  exist  in:   •  Haskell   •  Ruby   •  Clojure   •  PHP   •  Bash   •  Python   •  Many  others   •  JavaScript  
  9. 9. Scalatra  Philosophy  ●  Stateless  by  default,   •  Akka   sessions  if  you  need   •  Atmosphere   them.   •  Embrace  standards  ●  Lean  by  default,   •  HTTP   integra5ons  if  theyre   •  JVM   popular.   •  Scala   •  Scalate   •  Beginner  friendly.   •  JSON4s   •  Scale  with  your  app   and  your  exper5se.  
  10. 10. Rou,ng  in  depth:  Methods  get("/hello/:name")  {  "Hi,  "+params("name")  }  ●  Routes  start  with  an  HTTP  method.   •  Get  /  Head  /  Op5ons  /  Connect   •  Post  /  Put  /  Patch  /  Delete  /  Trace  ●  Advanced  usage:  can  call  at  any5me  to  register   routes  on  the  fly.  
  11. 11. Rou,ng  in  depth:  Params  get("/hello/:name")  {  "Hi,  "+params("name")  }  ●  Matches  the  servlet  path.   •  Pro5p:  compose  large  apps  with  mul5ple  servlets  ●  Declare  route  params  with  a  leading  :’   •  Matches  everything  up  to  next  /,  ?,  or  #  
  12. 12. Rou,ng  in  depth:  Params  
  13. 13. Rou,ng  in  depth:  Splats  get("/hello/*")  {  multiParams("splat").mkString(",")  }  ●  Splats get stored in the captures param.●  If you expect multiple values, you can access it through multiParams. •  params is just a convenient view of multiParams
  14. 14. Rou,ng  in  depth:  regex  get("""/hello/(w+)""".r)  {  "Hello,  "+params("captures")  }    ●  Use if you have a real hairy route that standard syntax cant handle.●  No named groups yet. Java didnt add named regexes until version 7!
  15. 15. Rou,ng  in  depth:  booleans  def  userAgent  =  request.getHeader("User-­‐Agent”)  get("/hello/:name",  !userAgent.contains("Lynx"))  {     status  =  403   "You  and  your  fancy,  schmancy  browser.  Get  out.”  }  ●  Both paths and boolean expressions are converted to route matchers. Implicitly●  A route matches if and only if all route matchers match.
  16. 16. Ac,ons  in  depth:  return  value  ●  The return value of an action becomes the body of the response.  
  17. 17. •  Its just a •  OverrideAc,ons  in  depth:  render  pipeline   protected  def  renderPipeline:  RenderPipeline  =  {      case  bytes:  Array[Byte]  =>          response.outputStream.write(bytes)      case  is:  java.io.InputStream  =>          using(is)  {  util.io.copy(_,  response.outputStream)  }  } ●  Its just a partial function.●  Override it. Use orElse to delegate to the default.
  18. 18. Ac,ons  in  depth:  mutable  
  19. 19. Ac,ons  in  depth:  mutable  get("/hello/:name")  {   status  =  HttpServletResponse.SC_GONE     contentType  =  "text/html”   <h1>Goodbye,  cruel  world</h1>  }  ●  Status and headers are typically set in an imperative fashion.  ●  Response is thread local. Relax.
  20. 20. Commands  ●  Capture  input  ●  Validate  input  
  21. 21. Integra,ons:  JSON4S  ●  Serialize  case  classes  to  json  ●  Handles  xml  as  well  as  json  
  22. 22. Integra,ons:  Akka  ●  Takes  advantage  of  servlet  3.0  async  support  
  23. 23. Integra,ons:  Atmosphere  ●  WebSocket    ●  Server  side  events  ●  Like  socket.io  but  not  socket.io  

×