Spring MVC Part 2 Spencer Uresk.

Slides:



Advertisements
Similar presentations
Chapter 6 Server-side Programming: Java Servlets
Advertisements

 2002 Prentice Hall. All rights reserved. Chapter 9: Servlets Outline 9.1 Introduction 9.2 Servlet Overview and Architecture Interface Servlet and.
SE 370: Programming Web Services Week 4: SOAP & NetBeans Copyright © Steven W. Johnson February 1, 2013.
Spring MVC Part 2 Spencer Uresk. Notes This is a training, NOT a presentation Please ask questions This is being recorded
FILE UPLOADS CHAPTER 11. THE BASIC PROCESS 1.The HTML form displays the control to locate and upload a file 2.Upon form submission, the server first stores.
Struts 2.0 an Overview ( )
UNIT-V The MVC architecture and Struts Framework.
Simple Web Services. Internet Basics The Internet is based on a communication protocol named TCP (Transmission Control Protocol) TCP allows programs running.
Simple Web Services. Internet Basics The Internet is based on a communication protocol named TCP (Transmission Control Protocol) TCP allows programs running.
Java Omar Rana University of South Asia. Course Overview JAVA  C/C++ and JAVA Comparison  OOP in JAVA  Exception Handling  Streams  Graphics User.
GET Examples – db.org/sops/3/experimental_conditions/55http://seek.sysmo- db.org/sops/3/experimental_conditions/55 –
COMP 321 Week 7. Overview HTML and HTTP Basics Dynamic Web Content ServletsMVC Tomcat in Eclipse Demonstration Lab 7-1 Introduction.
Chapter 3 Servlet Basics. 1.Recall the Servlet Role 2.Basic Servlet Structure 3.A simple servlet that generates plain text 4.A servlet that generates.
Website Development with PHP and MySQL Saving Data.
Copyright 2007 SpringSource. Copying, publishing or distributing without express written permission is prohibited. Forms with Spring MVC Handling Form.
1 Seminar on Service Oriented Architecture Principles of REST.
WWW: an Internet application Bill Chu. © Bei-Tseng Chu Aug 2000 WWW Web and HTTP WWW web is an interconnected information servers each server maintains.
Server - Client Communication Getting data from server.
Introduction to Server-Side Web Development Introduction to Server-Side Web Development Session II: Introduction to Server-Side Web Development with Servlets.
INTEGRATION OF BACKBONE.JS WITH SPRING 3.1. Agenda New Features and Enhancements in Spring 3.1 What is Backbone.js and why I should use it Spring 3.1.
IS-907 Java EE World Wide Web - Overview. World Wide Web - History Tim Berners-Lee, CERN, 1990 Enable researchers to share information: Remote Access.
1 Java Servlets l Servlets : programs that run within the context of a server, analogous to applets that run within the context of a browser. l Used to.
Copyright 2007 SpringSource. Copying, publishing or distributing without express written permission is prohibited. Spring MVC Essentials Getting started.
CSI 3125, Preliminaries, page 1 SERVLET. CSI 3125, Preliminaries, page 2 SERVLET A servlet is a server-side software program, Responds oriented other.
1 Introduction to Servlets. Topics Web Applications and the Java Server. HTTP protocol. Servlets 2.
ICM – API Server & Forms Gary Ratcliffe.
RESTful Web Services What is RESTful?
Lecture IV: REST Web Service
HTTP protocol Java Servlets. HTTP protocol Web system communicates with end-user via HTTP protocol HTTP protocol methods: GET, POST, HEAD, PUT, OPTIONS,
1 Java Server Pages A Java Server Page is a file consisting of HTML or XML markup into which special tags and code blocks are inserted When the page is.
Expect the Unexpected Kito D. Mann Principal Consultant.
Simple Web Services. Internet Basics The Internet is based on a communication protocol named TCP (Transmission Control Protocol) TCP allows programs running.
Web Services Essentials. What is a web service? web service: software functionality that can be invoked through the internet using common protocols like.
CITA 330 Section 10 Web Remoting Techniques. Web Remoting Web Remoting is a term used to categorize the technique of using JavaScript to directly make.
Introduction to Servlets
Web API - Introduction AJAX, Spring Data REST SoftUni Team Web API
Tiny http client and server
Building Web Apps with Servlets
Handling Errors in Web Applications
HTTP – An overview.
Play Framework: Introduction
HMA-S Final Presentation OGC DSEO Protocol
HTTP Protocol Specification
Hypertext Transfer Protocol
J2EE Lecture 7: Spring – Spring MVC
XMLHttp Object.
Pre-assessment Questions
HTTP Protocol.
IS333D: MULTI-TIER APPLICATION DEVELOPMENT
WEB API.
Generating the Server Response: HTTP Status Codes
HTTP Hypertext Transfer Protocol
Hypertext Transfer Protocol
EO Data Access Protocol
Hypertext Transfer Protocol
Web Server Design Week 15 Old Dominion University
Servlet APIs Every servlet must implement javax.servlet.Servlet interface Most servlets implement the interface by extending one of these classes javax.servlet.GenericServlet.
JavaScript & jQuery AJAX.
Chengyu Sun California State University, Los Angeles
Hypertext Transfer Protocol
Chengyu Sun California State University, Los Angeles
HTTP Hypertext Transfer Protocol
Web APIs API = Application Programmer Interface
Chengyu Sun California State University, Los Angeles
Web Server Design Week 14 Old Dominion University
Hypertext Transfer Protocol
Chengyu Sun California State University, Los Angeles
Web Programming Week 1 Old Dominion University
CS/COE 1520 Jarrett Billingsley
Presentation transcript:

Spring MVC Part 2 Spencer Uresk

This is a training, NOT a presentation Please ask questions Notes This is a training, NOT a presentation Please ask questions This is being recorded https://tech.lds.org/wiki/Java_Stack_Training Prerequisites Beginning Spring MVC (and all of its prerequisites)

Overview Last time, we showed how to map requests to handler methods, get information about the request, and how to pass information back to the view We’ll see what an HTTP message looks like This week, we’ll look at some of Spring MVC’s RESTful features, including RequestBody, ResponseBody, HttpMessageConverters, HttpEntity objects, and dealing with exceptions These are useful for RESTful web services and normal form-based interactions

What does an HTTP message look like? Sample Requests: GET /view/1 HTTP/1.1 User-Agent: Chrome Accept: application/json [CRLF] Request Line Headers POST /save HTTP/1.1 User-Agent: IE Content-Type: application/x-www-form-urlencoded [CRLF] name=x&id=2 Request Line Headers Request Body

HTTP Message (Responses) Sample Responses HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1337 [CRLF] <html> Some HTML Content. </html> Status Line Headers Response Body HTTP/1.1 500 Internal Server Error Status Line HTTP/1.1 201 Created Location: /view/7 [CRLF] Some message goes here. Status Line Headers Response Body

RequestBody Annotating a handler method parameter with @RequestBody will bind that parameter to the request body @RequestMapping("/echo/string") public void writeString(@RequestBody String input) {} @RequestMapping("/echo/json") public void writeJson(@RequestBody SomeObject input) {}

No view is rendered in this case ResponseBody Annotating a return type with @ResponseBody tells Spring MVC that the object returned should be treated as the response body No view is rendered in this case @RequestMapping("/echo/string") public @ResponseBody String readString() {} @RequestMapping("/echo/json") public @ResponseBody SomeObject readJson() {}

HttpMessageConverters How does Spring MVC know how to turn a JSON string into SomeObject, or vice-versa? HttpMessageConverters These are responsible for converting a request body to a certain type, or a certain type into a response body Spring MVC figures out which converter to use based on Accept and Content-Type headers, and the Java type Your Accept and Content-Type headers DON’T have to match. For example, you can send in JSON and ask for XML back

HttpMessageConverters A number of HttpMessageConverters are already provided You can define your own, but that is outside the scope of this training You don’t specify which ones are used to convert request/response bodies – they are selected based on the Content-Type/Accept headers

HttpMessageConverters make heavy use of MIME types (RFC 2046) These are the value for Accept and Content-Type headers Two-part identifier for content formats First part is the type. ie, application Second part is the sub-type. ie, json application/json Mention how content negotiation works can be used */*; applicaton/*

StringHttpMessageConverter Reads and writes Strings. Reads text/* Writes text/plain

StringHttpMessageConverter @RequestMapping("/echo/string") public @ResponseBody String echoString(@RequestBody String input) { return “Your Text Was: “ + input; } a POST /echo/string HTTP/1.1 Accept: text/plain Content-Type: text/plain Hello! REQUEST HTTP/1.1 200 OK Content-Type: text/plain Content-Length: 17 Your Text Was: Hello! RESPONSE DEMO Do a demo of this.

MappingJacksonHttpMessageConverter Maps to/from JSON objects using the Jackson library Reads application/json Writes application/json

MappingJacksonHttpMessageConverter public Person { // String name, int age; } @RequestMapping("/echo/json") public @ResponseBody Person echoJson(@RequestBody Person person) { // Upper case name, square age return person; a POST /echo/string HTTP/1.1 Accept: application/json Content-Type: application/json { “name” : “Spencer”, “age” : 5 } REQUEST HTTP/1.1 201 Created Content-Type: application/json { “name” : “SPENCER”, “age” : 25 } RESPONSE

Jaxb2RootElementHttpMessageConverter Maps to/from XML objects Must have your object at least annotated with @XmlRootElement Reads text/xml, application/xml Writes text/xml, application/xml

Jaxb2RootElementHttpMessageConverter @XmlRootElement public Person {// String name, int age;} @RequestMapping("/echo/xml") public @ResponseBody Person echoXml(@RequestBody Person person) { // Upper case name, square age return person; } a POST /echo/string HTTP/1.1 Accept: application/xml Content-Type: application/xml <thing><name>Spencer</name><age>5</age></thing> REQUEST HTTP/1.1 201 Created Content-Type: application/xml <thing><name>SPENCER</name><age>25</age></thing> RESPONSE

ByteArrayHttpMessageConverter Can read/write byte arrays (useful for dealing with binary data, such as images) Reads */* Writes application/octet-stream

ByteArrayHttpMessageConverter @RequestMapping("/echo/string") public @ResponseBody String echoString(@RequestBody byte[] input) { return new String(input); } a POST /echo/string HTTP/1.1 Accept: text/plain Content-Type: text/plain Hello! REQUEST HTTP/1.1 200 OK Content-Type: application/octet-stream Content-Length: 6 Hello! RESPONSE

Create a handler that takes a request body and echoes it back. Lab 1 Create a handler that takes a request body and echoes it back. Create a handler that takes a request body, creates an object with it, and returns it as JSON. Create a handler that takes an XML input and echoes it back as JSON. Test all of these with your HttpClient

Other parts of the HTTP Message What if you need to get/set headers? Or set the status code? @RequestMapping("/echo/string") public @ResponseBody String echoString(@RequestBody String input, HttpServletRequest request, HttpServletResponse response) { String requestType = request.getHeader(“Content-Type”); response.setHeader(“Content-Type”, “text/plain”); response.setStatus(200); return input }

@ResponseStatus There is a convenient way to set what the default status for a particular handler should be @ResponseStatus @RequestMapping("/create") @ResponseStatus(HttpStatus.CREATED) // CREATED == 201 public void echoString(String input) { }

Convenience class for dealing with bodies, headers, and status HttpEntity Convenience class for dealing with bodies, headers, and status Converts messages with HttpMessageConverters @RequestMapping("/image/upload") public ResponseEntity<String> upload(HttpEntity<byte[]> rEntity) { String t = rEntity.getHeaders().getFirst(“Content-Type”); byte[] data = rEntity.getBody(); // Save the file HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.set(“Location”, “/image/1”); return new ResponseEntity<String>(“Created”, responseHeaders, HttpStatus.CREATED); }

Convert all your String controller method to use HttpEntity Lab 2 Convert all your String controller method to use HttpEntity Convert the Create Person controller method to use an HttpEntity. Also, return a Location header and a 201 (Created) response code.

Dealing with exceptions By default, Spring MVC will map certain exceptions to status codes You can implement your own HandlerExceptionResolver, which takes an exception and returns a ModelAndView You can register a SimpleMappingExceptionResolver to map exceptions to views You can annotate methods in the controller to handle specific exceptions

Default Exception Mappings These take effect if you have no other configuration ConversionNotSupportedException => 500 NoSuchMethodHandlingException => 404 MissingServletRequestParameterException => 400 HttpRequestMethodNotSupportedException => 405 TypeMismatchException => 400 HttpMediaTypeNotSupportedException => 415 HttpMediaTypeNotAcceptableException => 406

HandlerExceptionResolver Allows you to control how exceptions are resolved Implement HandlerExceptionResolver (but you’ll probably extend AbstractHandlerExceptionResolver) class AnExceptionHandler extends AbstractHandlerExceptionResolver { protected ModelAndView doResolveException( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { System.out.println("I got an error."); return new ModelAndView("errors/someError"); }

SimpleMappingExceptionResolver Allows you to simply map exceptions to views This is how the Stack comes configured <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key=".DataAccessException">errors/dataAccessFailure</prop> <prop key=".AccessDeniedException">errors/dataAccessFailure</prop> <prop key=".TypeMismatchException">errors/resourceNotFound</prop> </props> </property> <property name="defaultErrorView" value="errors/generalError"/> <property name="warnLogCategory" value="org.lds.stack"/> </bean>

ExceptionHandler methods look a lot like normal handler methods Create a method to handle the exception, annotate it with @ExceptionHandler, and pass in the exception(s) that method can handle ExceptionHandler methods look a lot like normal handler methods @RequestMapping("/error") public void doSomething() { throw new RecoverableDataAccessException("Unable to access that database."); } @ExceptionHandler(DataAccessException.class) public @ResponseBody String handleDataAccessError(DataAccessException ex) { return ex.getMessage();

We saw this annotation earlier @ResponseStatus We saw this annotation earlier It can also be placed on Exception classes or @ExeptionHandler methods to return a specific status code for a particular exception @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(DataAccessException.class) public void handleDataAccessError(DataAccessException ex) {} @ResponseStatus(value = HttpStatus.PAYMENT_REQUIRED, message = “I need money.”) public class PaymentRequiredException {}

Implement an @ExceptionHandler method Lab 3 Look at the SimpleMappingExceptionResolver already configured in your project Create a controller that throws one of those exceptions and verify that your request gets redirected to the corresponding view Remove the config, and change your exception to HttpMediaTypeNotSupportedException. Verify that you get a 415 using your Http Client Implement an @ExceptionHandler method