Your SlideShare is downloading. ×
Multi Client Development with Spring
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Multi Client Development with Spring

2,144
views

Published on

Today's applications don't live in a vacuum - you need to take the applications to where your users are. Let Spring's REST support along with its powerful client-side technology support, help you get …

Today's applications don't live in a vacuum - you need to take the applications to where your users are. Let Spring's REST support along with its powerful client-side technology support, help you get there faster.

Published in: Technology

0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,144
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
125
Comments
0
Likes
7
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • \n
  • \n\n
  • Hello, thank you or having me. Im pleased to have the opportunity to introduce you today to Spring and the SpringSource Tool Suite \n\nMy anem is Josh Long. I serve as the developer advocate for the Spring framework. I’ve used it in earnest and advocated it for many years now. i’m an author on 3 books on the technology, as well as a comitter to many of the Spring projects. Additionally, I take community activism very seriously and do my best to participate in the community. Sometimes this means answering question on Twitter, or in the forums, or helping contribute to the InfoQ.com and Artima.com communities\n
  • Hello, thank you or having me. Im pleased to have the opportunity to introduce you today to Spring and the SpringSource Tool Suite \n\nMy anem is Josh Long. I serve as the developer advocate for the Spring framework. I’ve used it in earnest and advocated it for many years now. i’m an author on 3 books on the technology, as well as a comitter to many of the Spring projects. Additionally, I take community activism very seriously and do my best to participate in the community. Sometimes this means answering question on Twitter, or in the forums, or helping contribute to the InfoQ.com and Artima.com communities\n
  • \n
  • \n
  • these different framerworks let u tackle any problem youre likely to want to solve today \n- we support javee1.4 + 1.5 + 1.6; \n\nsits above target platform \nruns in cloud \n\n
  • \n
  • \n
  • \n
  • talk about how convenient the messaging support is, then roll back and start looking at how u might do the same thing manually. Explain that many of the pices are already there, and then seguqe into a discussion about the core Spring APIs. Lets imagine we’re going to build ourselves a file system poller to notify us of when something’s happened on the file system\n\n
  • talk about how convenient the messaging support is, then roll back and start looking at how u might do the same thing manually. Explain that many of the pices are already there, and then seguqe into a discussion about the core Spring APIs. Lets imagine we’re going to build ourselves a file system poller to notify us of when something’s happened on the file system\n\n
  • Familiar to somebody who’s used Struts:\n Models (like Struts ActionForms)\n Views (like Struts views: tiles, .jsp(x)s, velocity, PDF, Excel, etc.) \n Controllers (like Struts Actions)\n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • talk about how convenient the messaging support is, then roll back and start looking at how u might do the same thing manually. Explain that many of the pices are already there, and then seguqe into a discussion about the core Spring APIs. Lets imagine we’re going to build ourselves a file system poller to notify us of when something’s happened on the file system\n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • talk about how convenient the messaging support is, then roll back and start looking at how u might do the same thing manually. Explain that many of the pieces are already there, and then seguqe into a discussion about the core Spring APIs. Lets imagine we’re going to build ourselves a file system poller to notify us of when something’s happened on the file system\n\n
  • talk about how convenient the messaging support is, then roll back and start looking at how u might do the same thing manually. Explain that many of the pieces are already there, and then seguqe into a discussion about the core Spring APIs. Lets imagine we’re going to build ourselves a file system poller to notify us of when something’s happened on the file system\n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • talk about how convenient the messaging support is, then roll back and start looking at how u might do the same thing manually. Explain that many of the pices are already there, and then seguqe into a discussion about the core Spring APIs. Lets imagine we’re going to build ourselves a file system poller to notify us of when something’s happened on the file system\n\n
  • talk about how convenient the messaging support is, then roll back and start looking at how u might do the same thing manually. Explain that many of the pices are already there, and then seguqe into a discussion about the core Spring APIs. Lets imagine we’re going to build ourselves a file system poller to notify us of when something’s happened on the file system\n\n
  • \n
  • \n
  • talk about how convenient the messaging support is, then roll back and start looking at how u might do the same thing manually. Explain that many of the pices are already there, and then seguqe into a discussion about the core Spring APIs. Lets imagine we’re going to build ourselves a file system poller to notify us of when something’s happened on the file system\n\n
  • \n
  • \n
  • \n
  • \n
  • talk about how convenient the messaging support is, then roll back and start looking at how u might do the same thing manually. Explain that many of the pices are already there, and then seguqe into a discussion about the core Spring APIs. Lets imagine we’re going to build ourselves a file system poller to notify us of when something’s happened on the file system\n\n
  • \n
  • talk about how convenient the messaging support is, then roll back and start looking at how u might do the same thing manually. Explain that many of the pices are already there, and then seguqe into a discussion about the core Spring APIs. Lets imagine we’re going to build ourselves a file system poller to notify us of when something’s happened on the file system\n\n
  • \n
  • talk about how convenient the messaging support is, then roll back and start looking at how u might do the same thing manually. Explain that many of the pices are already there, and then seguqe into a discussion about the core Spring APIs. Lets imagine we’re going to build ourselves a file system poller to notify us of when something’s happened on the file system\n\n
  • another example of the fact that often the client side model won’t represent the server side model \n\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • talk about how convenient the messaging support is, then roll back and start looking at how u might do the same thing manually. Explain that many of the pices are already there, and then seguqe into a discussion about the core Spring APIs. Lets imagine we’re going to build ourselves a file system poller to notify us of when something’s happened on the file system\n\n
  • \n
  • Transcript

    • 1. Multi Client Development with Spring MVC@ Java2DaysJosh LongSpring Developer AdvocateSpringSource, a Division of VMwarehttp://www.joshlong.com || @starbuxman || josh.long@springsource.com © 2009 VMware Inc. All rights reserved
    • 2. About Josh LongSpring Developer Advocatetwitter: @starbuxmanjosh.long@springsource.com 2
    • 3. About Josh LongSpring Developer Advocatetwitter: @starbuxmanjosh.long@springsource.comContributor To:•Spring Integration•Spring Batch•Spring Hadoop•Activiti Workflow Engine•Akka Actor engine 3
    • 4. Why Are We Here? “ Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification. ” -Bob Martin 4
    • 5. Why Are We Here? do NOT reinvent the Wheel! 5
    • 6. Spring’s aim: bring simplicity to java development data web tier batch integration & access & service tier mobile processing messaging / NoSQL / RIA Big Data The Spring frameworkthe cloud: lightweight traditional CloudFoundry WebSphere tc Server Google App Engine JBoss AS Tomcat Amazon BeanStalk WebLogic Jetty Others (on legacy versions, too!) 6
    • 7. Not All Sides Are Equal 7
    • 8. Spring Web Support 8
    • 9. New in 3.1: XML-free web applications In a servlet 3 container, you can also use Java configuration, negating the need for web.xml: public class SampleWebApplicationInitializer implements WebApplicationInitializer { public void onStartup(ServletContext sc) throws ServletException { AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext(); ac.setServletContext(sc); ac.scan( “a.package.full.of.services”, “a.package.full.of.controllers” ); sc.addServlet("spring", new DispatcherServlet(webContext)); } } 9
    • 10. Thin, Thick, Web, Mobile and Rich Clients: Web Core Spring Dispatcher Servlet • Objects don’t have to be web-specific. • Spring web supports lower-level web machinery: ‘ • HttpRequestHandler (supports remoting: Caucho, Resin, JAX RPC) • DelegatingFilterProxy. • HandlerInterceptor wraps requests to HttpRequestHandlers • ServletWrappingController lets you force requests to a servlet through the Spring Handler chain • OncePerRequestFilter ensures that an action only occurs once, no matter how many filters are applied. Provides a nice way to avoid duplicate filters • Spring provides access to the Spring application context using WebApplicationContextUtils, which has a static method to look up the context, even in environments where Spring isn’t managing the web components
    • 11. Thin, Thick, Web, Mobile and Rich Clients: Web Core Spring provides the easiest way to integrate with your web framework of choice • Spring Faces for JSF 1 and 2 • Struts support for Struts 1 • Tapestry, Struts 2, Stripes, Wicket, Vaadin, Play framework, etc. • GWT, Flex
    • 12. Thin, Thick, Web, Mobile and Rich Clients: Spring MVC 12
    • 13. The Anatomy of a Spring MVC @ControllerSpring MVC configuration - config @Controller public class CustomerController { } 13
    • 14. The Anatomy of a Spring MVC @ControllerSpring MVC configuration - config@Controllerpublic class CustomerController { @RequestMapping(value=”/url/of/my/resource”) public String processTheRequest() { // ... return “home”; }}GET http://127.0.0.1:8080/url/of/my/resource 14
    • 15. The Anatomy of a Spring MVC @ControllerSpring MVC configuration - config @Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public String processTheRequest() { // ... return “home”; } }GET http://127.0.0.1:8080/url/of/my/resource 15
    • 16. The Anatomy of a Spring MVC @ControllerSpring MVC configuration - config @Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public String processTheRequest( HttpServletRequest request) { String contextPath = request.getContextPath(); // ... return “home”; } }GET http://127.0.0.1:8080/url/of/my/resource 16
    • 17. The Anatomy of a Spring MVC @ControllerSpring MVC configuration - config @Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public String processTheRequest( @RequestParam(“search”) String searchQuery ) { // ... return “home”; } }GET http://127.0.0.1:8080/url/of/my/resource?search=Spring 17
    • 18. The Anatomy of a Spring MVC @ControllerSpring MVC configuration - config @Controller public class CustomerController { @RequestMapping(value=”/url/of/my/{id}”, method = RequestMethod.GET) public String processTheRequest( @PathVariable(“id”) Long id) { // ... return “home”; } }GET http://127.0.0.1:8080/url/of/my/2322 18
    • 19. The Anatomy of a Spring MVC @ControllerSpring MVC configuration - config @Controller public class CustomerController { @RequestMapping(value=”/url/of/my/{id}” ) public String processTheRequest( @PathVariable(“id”) Long customerId, Model model ) { model.addAttribute(“customer”, service.getCustomerById( customerId ) ); return “home”; } @Autowired CustomerService service; }GET http://127.0.0.1:8080/url/of/my/232 19
    • 20. The Anatomy of a Spring MVC @ControllerSpring MVC configuration - config @Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public String processTheRequest( HttpServletRequest request, Model model) { return “home”; } } 20
    • 21. The Anatomy of a Spring MVC @ControllerSpring MVC configuration - config @Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public View processTheRequest( HttpServletRequest request, Model model) { return new XsltView(...); } } 21
    • 22. The Anatomy of a Spring MVC @ControllerSpring MVC configuration - config @Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public InputStream processTheRequest( HttpServletRequest request, Model model) { return new FileInputStream( ...) ; } } 22
    • 23. DEMO Demos • Simple Spring MVC based Application Not confidential. Tell everyone.
    • 24. the new hotness... 24
    • 25. dumb terminals ruled the earth.... 25
    • 26. then something magical happened: the web 26
    • 27. but the web didn’t know how to do UI state... so we hacked... 27
    • 28. ....then the web stopped sucking 28
    • 29. How Powerful is JavaScript? ...It Boots Linux!! 29
    • 30. REST 30
    • 31. Thin, Thick, Web, Mobile and Rich Clients: REST Origin • The term Representational State Transfer was introduced and defined in 2000 by Roy Fielding in his doctoral dissertation. His paper suggests these four design principles: • Use HTTP methods explicitly. • POST, GET, PUT, DELETE • CRUD operations can be mapped to these existing methods • Be stateless. • State dependencies limit or restrict scalability • Expose directory structure-like URIs. • URI’s should be easily understood • Transfer XML, JavaScript Object Notation (JSON), or both. • Use XML or JSON to represent data objects or attributes CONFIDENTIAL 31
    • 32. REST on the Server Spring MVC is basis for REST support • Spring’s server side REST support is based on the standard controller model JavaScript and HTML5 can consume JSON-data payloads
    • 33. REST on the Client RestTemplate • provides dead simple, idiomatic RESTful services consumption • can use Spring OXM, too. • Spring Integration and Spring Social both build on the RestTemplate where possible. Spring supports numerous converters out of the box • JAXB • JSON (Jackson)
    • 34. Building clients for your RESTful services: RestTemplate Google search exampleRestTemplate restTemplate = new RestTemplate();String url = "https://ajax.googleapis.com/ajax/services/search/web?v=1.0&q={query}";String result = restTemplate.getForObject(url, String.class, "SpringSource"); Multiple parametersRestTemplate restTemplate = new RestTemplate();String url = "http://example.com/hotels/{hotel}/bookings/{booking}";String result = restTemplate.getForObject(url, String.class, "42", “21”); CONFIDENTIAL 34
    • 35. Thin, Thick, Web, Mobile and Rich Clients: RestTemplate RestTemplate class is the heart the client-side story • Entry points for the six main HTTP methods • DELETE - delete(...) • GET - getForObject(...) • HEAD - headForHeaders(...) • OPTIONS - optionsForAllow(...) • POST - postForLocation(...) • PUT - put(...) • any HTTP operation - exchange(...) and execute(...) CONFIDENTIAL 35
    • 36. The Anatomy of a Spring MVC @ControllerSpring MVC configuration - config @Controller public class CustomerController { @RequestMapping(value=”/url/of/my/resource”, method = RequestMethod.GET) public @ResponseBody Customer processTheRequest( ... ) { Customer c = service.getCustomerById( id) ; return c; } @Autowired CustomerService service; } 36
    • 37. The Anatomy of a Spring MVC @ControllerSpring MVC configuration - config @Controller public class CustomerController { @RequestMapping(value=”/url/of/my/someurl”, method = RequestMethod.POST) public String processTheRequest( @RequestBody Customer postedCustomerObject) { // ... return “home”; } }POST http://127.0.0.1:8080/url/of/my/someurl 37
    • 38. The Anatomy of a Spring MVC @ControllerSpring MVC configuration - config @Controller public class CustomerController { @RequestMapping(value=”/url/of/my/{id}”, method = RequestMethod.POST) public String processTheRequest( @PathVariable(“id”) Long customerId, @RequestBody Customer postedCustomerObject) { // ... return “home”; } }POST http://127.0.0.1:8080/url/of/my/someurl 38
    • 39. What About the Browsers, Man?• Problem: modern browsers only speak GET and POST• Solution: use Spring’s HiddenHttpMethodFilter only then send _method request parameter in the request<filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <url-pattern>/</url-pattern> <servlet-name>appServlet</servlet-name> </filter-mapping>
    • 40. DEMO Demos:• Spring REST service• Spring REST client Not confidential. Tell everyone.
    • 41. Spring Mobile 41
    • 42. Thin, Thick, Web, Mobile and Rich Clients: Mobile Best strategy? Develop Native • Fallback to client-optimized web applications Spring MVC 3.1 mobile client-specific content negotiation and rendering • for other devices • (there are other devices besides Android??) 42
    • 43. DEMO Demos:• Mobile clients using client specific rendering Not confidential. Tell everyone.
    • 44. Spring Android 44
    • 45. Thin, Thick, Web, Mobile and Rich Clients: Mobile  Spring REST is ideal for mobile devices  Spring MVC 3.1 mobile client-specific content negotiation and rendering • for other devices  Spring Android • RestTemplate 45
    • 46. OK, so..... 46
    • 47. Thin, Thick, Web, Mobile and Rich Clients: Mobile CustomerServiceClient - client! private <T> T extractResponse( ResponseEntity<T> response) {! ! if (response != null && response().value() == 200) {! ! ! return response.getBody();! ! }! ! throw new RuntimeException("couldnt extract response.");! }! @Override! public Customer updateCustomer(long id, String fn, String ln) {! ! String urlForPath = urlForPath("customer/{customerId}");!!! ! return extractResponse(this.restTemplate.postForEntity( urlForPath, new Customer(id, fn, ln), Customer.class, id));! } 47
    • 48. Thin, Thick, Web, Mobile and Rich Clients: Mobile Demos:• consuming the Spring REST service from Android
    • 49. And The REST of it• Spring Data REST - exposes (JPA, MongoDB, GemFire, Neo4J, Redis) repositories built on Spring Data repositories (See my friend Sergi’s talk!)• Spring HATEOAS - take your REST-fu to the next level with support for HTTP as the engine of application state• Spring Security OAuth - secure RESTful web services using OAuth, the same security technology that Twitter, Facebook, etc.• Spring Social - RestTemplate is powerful, but some APIs are overwhelming, and OAuth client communication can be daunting. Spring Social makes it easier.
    • 50. @starbuxman | josh.long@springsource.com http://slideshare.net/joshlong Questions?

    ×