Similar presentations:
Spring MVC 2017
1.
Backend:Dzianis Kashtsialian
Java D3 Mentoring Program BY/RU/KZ
April, 2017
CONFIDENTIAL
Lead Software Engineer
9+ years experience on <epam>
JMP Curator & Mentor
1
2.
AGENDA1
MVC and Spring MVC
2
DispatcherServlet / Controller / View / Model
3
Internationalization(i18n) / Themes / Templates (Apache Tiles)
4
Mapping of URLs, Validation support (JSR-349)
5
File Upload Handling
6
Supporting Servlet 3.0 Code-Based (Java-Based) Configuration
7
Handling Exceptions
8
Spring MVC and Spring security
9
Spring MVC Workshop
CONFIDENTIAL
2
3. Introducing MVC and Spring MVC
INTRODUCING MVC AND SPRING MVCCONFIDENTIAL
3
4. What is MVC?
Introducing MVC and Spring MVCWhat is MVC?
CONFIDENTIAL
4
5.
Introduction to Web Spring MVCMain features
Spring MVC provides a clear separation between a model, view and controller
Provides both XML-based and annotation-based approaches.
Enriched by Spring application context.
Provides a broad range of pre-configured facilities.
Takes convention over configuration approach.
Uses open-close principle.
Benefits
Decoupling views and models
Reduces the complexity of your design
Makes code more flexible
Makes code more maintainable
CONFIDENTIAL
5
6. What is MVC?
Introducing MVC and Spring MVCWhat
is
MVC?
Spring MVC WebApplicationContext Hierarchy
CONFIDENTIAL
6
7. What is MVC?
Introducing MVC and Spring MVCWhat
is
MVC?
Spring MVC WebApplicationContext Hierarchy
CONFIDENTIAL
7
8.
Introducing MVC and Spring MVCSpring MVC Request Life Cycle
CONFIDENTIAL
8
9.
Introducing MVC and Spring MVCIntercepting requests with a HandlerInterceptor
CONFIDENTIAL
9
10.
Introducing MVC and Spring MVCSpring MVC Request Life Cycle
BeanNameViewResolver
FreeMarkerViewResolver
InternalResourceViewResolver
JasperReportsViewResolver
ResourceBundleViewResolver
UrlBasedViewResolver
VelocityLayoutViewResolver
VelocityViewResolver
XmlViewResolver
XsltViewResolver
CONFIDENTIAL
10
11.
Introducing MVC and Spring MVCSpring MVC Configuration
To
configure Spring MVC support for web applications:
Configuring the root WebApplicationContext
Configuring the servlet filters required by Spring MVC
Configuring the dispatcher servlets within the application
CONFIDENTIAL
11
12. DispatcherServlet, Controller, View, Model
DISPATCHERSERVLET, CONTROLLER, VIEW, MODELCONFIDENTIAL
12
13.
DispatcherServlet, Controller, View, ModelDispatcherServlet
CONFIDENTIAL
13
14.
DispatcherServlet, Controller, View, ModelDispatcherServlet Code Overview
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
...
</web-app>
CONFIDENTIAL
14
15.
DispatcherServlet, Controller, View, ModelDispatcherServlet Code Overview
CONFIDENTIAL
15
16.
DispatcherServlet, Controller, View, ModelDispatcherServlet Code Overview
CONFIDENTIAL
16
17.
DispatcherServlet, Controller, View, ModelDispatcherServlet Code Overview
CONFIDENTIAL
17
18.
DispatcherServlet, Controller, View, ModelDispatcherServlet Code Overview
CONFIDENTIAL
18
19.
DispatcherServlet, Controller, View, ModelControllers
Controllers provide access to
the application behavior that
you typically define through a
service interface.
Controllers interpret user
input and transform it into a
model that is represented to
the user by the view.
Spring implements a controller
in a very abstract way, which
enables you to create a wide
variety of controllers.
CONFIDENTIAL
@RequestMapping("/contacts")
@Controller
public class ContactController {
private ContactService contactService;
@RequestMapping(method = RequestMethod.GET)
public String list(Model uiModel) {
List<Contact> contacts = contactService.findAll();
uiModel.addAttribute("contacts", contacts);
return "contacts/list";
}
@Autowired
public void setContactService(ContactService contactService) {
this.contactService = contactService;
}
}
19
20.
DispatcherServlet, Controller, View, ModelView Examples
CONFIDENTIAL
20
21.
DispatcherServlet, Controller, View, ModelModel examples
Map<String, Object>
Populated by controllers
Contains all data needed by the „view“
Not containing business logic
CONFIDENTIAL
21
22.
DispatcherServlet, Controller, View, ModelSupported method return types
ModelAndView
Model
Map
View
String
void
….
CONFIDENTIAL
22
23. Internationalization(i18n) / Themes / Templates (Apache Tiles)
INTERNATIONALIZATION(I18N) / THEMES /TEMPLATES (APACHE TILES)
CONFIDENTIAL
23
24.
Internationalization(i18n) / Themes / Templates (Apache Tiles)Internationalization
Enable i18n in the early stage.
Properties files within the e.g /WEB-INF/i18n folder:
The application*.properties
The message*.properties
CONFIDENTIAL
24
25.
Internationalization(i18n) / Themes / Templates (Apache Tiles)Configuring i18n in DispatcherServlet
CONFIDENTIAL
25
26.
Internationalization(i18n) / Themes / Templates (Apache Tiles)Configuring i18n in DispatcherServlet
CONFIDENTIAL
26
27.
Internationalization(i18n) / Themes / Templates (Apache Tiles)Configuring i18n in DispatcherServlet
CONFIDENTIAL
27
28.
Internationalization(i18n) / Themes / Templates (Apache Tiles)Example View
CONFIDENTIAL
28
29.
Internationalization(i18n) / Themes / Templates (Apache Tiles)Using Themes
CONFIDENTIAL
29
30.
Internationalization(i18n) / Themes / Templates (Apache Tiles)Using Themes
• FixedThemeResolver
• SessionThemeResolver
• CookieThemeResolver
CONFIDENTIAL
30
31.
Internationalization(i18n) / Themes / Templates (Apache Tiles)Using templates
CONFIDENTIAL
31
32. Mapping of URLs, validation support
MAPPING OF URLS, VALIDATION SUPPORTCONFIDENTIAL
32
33.
Mapping of URLs, Validation support (JSR-349)Mapping of URLs to the views
@RequestMapping
CONFIDENTIAL
33
34.
Mapping of URLs, Validation support (JSR-349)Mapping of URLs to the views
@RequestMapping
consumes
consumes="application/json“;
consumes=“!application/json“;
"text/plain", "application/*;
CONFIDENTIAL
34
35.
Mapping of URLs, Validation support (JSR-349)Mapping of URLs to the views
@RequestMapping
consumes
consumes="application/json“;
consumes=“!application/json“;
"text/plain", "application/*;
headers
headers="myHeader=myValue“;
headers="!myHeader=myValue“;
headers="myHeader", headers="!myHeader“;
CONFIDENTIAL
35
36.
Mapping of URLs, Validation support (JSR-349)Mapping of URLs to the views
@RequestMapping
consumes
consumes="application/json“;
consumes=“!application/json“;
"text/plain", "application/*;
headers
headers="myHeader=myValue“;
headers="!myHeader=myValue“;
headers="myHeader", headers="!myHeader“;
method
RequestMethod.GET, RequestMethod.POST etc.
CONFIDENTIAL
36
37.
Mapping of URLs, Validation support (JSR-349)Mapping of URLs to the views
@RequestMapping
consumes
consumes="application/json“;
consumes=“!application/json“;
"text/plain", "application/*;
headers
headers="myHeader=myValue“;
headers="!myHeader=myValue“;
headers="myHeader", headers="!myHeader“;
method
RequestMethod.GET, RequestMethod.POST etc.
name
params
params="myParam=myValue“;
params="!myParam=myValue“;
CONFIDENTIAL
37
38.
Mapping of URLs, Validation support (JSR-349)Mapping of URLs to the views
@RequestMapping
consumes
consumes="application/json“;
consumes=“!application/json“;
"text/plain", "application/*;
headers
headers="myHeader=myValue“;
headers="!myHeader=myValue“;
headers="myHeader", headers="!myHeader“;
method
RequestMethod.GET, RequestMethod.POST etc.
name
params
params="myParam=myValue“;
params="!myParam=myValue“;
path
CONFIDENTIAL
38
39.
Mapping of URLs, Validation support (JSR-349)Mapping of URLs to the views
@RequestMapping
consumes
consumes="application/json“;
consumes=“!application/json“;
"text/plain", "application/*;
headers
headers="myHeader=myValue“;
headers="!myHeader=myValue“;
headers="myHeader", headers="!myHeader“;
method
RequestMethod.GET, RequestMethod.POST etc.
name
params
params="myParam=myValue“;
params="!myParam=myValue“;
path
produces
CONFIDENTIAL
39
40.
Mapping of URLs, Validation support (JSR-349)Mapping of URLs to the views
@RequestMapping
consumes
consumes="application/json“;
consumes=“!application/json“;
"text/plain", "application/*;
headers
headers="myHeader=myValue“;
headers="!myHeader=myValue“;
headers="myHeader", headers="!myHeader“;
method
RequestMethod.GET, RequestMethod.POST etc.
name
params
params="myParam=myValue“;
params="!myParam=myValue“;
path
produces
value
CONFIDENTIAL
40
41.
Mapping of URLs, Validation support (JSR-349)Mapping example
CONFIDENTIAL
41
42.
Mapping of URLs, Validation support (JSR-349)Mapping example
CONFIDENTIAL
42
43.
Mapping of URLs, Validation support (JSR-349)Mapping example
CONFIDENTIAL
43
44.
Mapping of URLs, Validation support (JSR-349)Mapping example
CONFIDENTIAL
44
45.
Mapping of URLs, Validation support (JSR-349)Mapping example
CONFIDENTIAL
45
46.
Mapping of URLs, Validation support (JSR-349)Mapping example
CONFIDENTIAL
46
47.
Mapping of URLs, Validation support (JSR-349)Mapping example
CONFIDENTIAL
47
48.
Mapping of URLs, Validation support (JSR-349)Mapping example
CONFIDENTIAL
48
49.
Mapping of URLs, Validation support (JSR-349)Mapping example
CONFIDENTIAL
49
50.
Mapping of URLs, Validation support (JSR-349)Mapping example
/spring-web/spring-web-3.0.5.jar
CONFIDENTIAL
50
51.
Spring MVC AnnotationsComposed @RequestMapping Variants
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestMapping(method = RequestMethod.GET)
public Map<String, Appointment> get() {
return …;
}
@GetMapping
public Map<String, Appointment> get() {
return …;
}
@RequestMapping(method = RequestMethod.POST)
public String add(@Valid AppointmentForm
appointment, BindingResult result) {
return …;
}
@PostMapping
public String add(@Valid AppointmentForm
appointment, BindingResult result) {
return …;
}
CONFIDENTIAL
51
52.
Path Patterns/myPath/*.do
CONFIDENTIAL
52
53.
Path Patterns/myPath/*.do
CONFIDENTIAL
/owners/*/pets/{petId}
53
54.
Path Patterns/myPath/*.do
/hotels/{hotel}/*
CONFIDENTIAL
/owners/*/pets/{petId}
/hotels/{hotel}/**
54
55.
Path Patterns/myPath/*.do
/hotels/{hotel}/*
CONFIDENTIAL
/owners/*/pets/{petId}
/hotels/{hotel}/**
55
56.
Path Patterns/myPath/*.do
/hotels/{hotel}/*
/foo/bar*
CONFIDENTIAL
/owners/*/pets/{petId}
/hotels/{hotel}/**
/foo/*
56
57.
Path Patterns/myPath/*.do
/hotels/{hotel}/*
/foo/bar*
CONFIDENTIAL
/owners/*/pets/{petId}
/hotels/{hotel}/**
/foo/*
57
58.
Path Patterns/myPath/*.do
/hotels/{hotel}/*
/foo/bar*
/hotels/*
CONFIDENTIAL
/owners/*/pets/{petId}
/hotels/{hotel}/**
/foo/*
/hotels/{hotel}
58
59.
Path Patterns/myPath/*.do
/hotels/{hotel}/*
/foo/bar*
/hotels/*
CONFIDENTIAL
/owners/*/pets/{petId}
/hotels/{hotel}/**
/foo/*
/hotels/{hotel}
59
60.
Path Patterns/owners/*/pets/{petId}
/myPath/*.do
/hotels/{hotel}/*
/foo/bar*
CONFIDENTIAL
/hotels/{hotel}/**
/hotels/*
/foo/*
/hotels/{hotel}
/**
/api/{a}/{b}/{c}
60
61.
Path Patterns/owners/*/pets/{petId}
/myPath/*.do
/hotels/{hotel}/*
/foo/bar*
CONFIDENTIAL
/hotels/{hotel}/**
/hotels/*
/foo/*
/hotels/{hotel}
/**
/api/{a}/{b}/{c}
61
62.
Path Patterns/owners/*/pets/{petId}
/myPath/*.do
/hotels/{hotel}/*
/foo/bar*
/hotels/*
/foo/*
/hotels/{hotel}
/**
/api/{a}/{b}/{c}
/public/**
CONFIDENTIAL
/hotels/{hotel}/**
/public/path3/{a}/{b}/{c}
62
63.
Path Patterns/owners/*/pets/{petId}
/myPath/*.do
/hotels/{hotel}/*
/foo/bar*
/hotels/*
/foo/*
/hotels/{hotel}
/**
/api/{a}/{b}/{c}
/public/**
CONFIDENTIAL
/hotels/{hotel}/**
/public/path3/{a}/{b}/{c}
63
64.
Spring MVC Annotations@RequestBody
@PathVariable
@RequestParam
@RequestHeader
@RequestBody
@PutMapping("/something")
public void handle(@RequestBody String body, Writer writer) throws IOException {
writer.write(body);
}
CONFIDENTIAL
64
65.
Spring MVC Annotations@ResponseBody
@GetMapping("/something")
@ResponseBody
public String helloWorld() {
return "Hello World";
}
HttpMessageConverter
CONFIDENTIAL
65
66.
Spring MVC Annotations@RestController
@RestController
CONFIDENTIAL
66
67.
Spring MVC Annotations@ModelAttribute on a method
// Add one attribute
// The return value of the method is added to the model under the name "account"
// You can customize the name via @ModelAttribute("myAccount")
@ModelAttribute
public Account addAccount(@RequestParam String number) {
return accountManager.findAccount(number);
}
// Add multiple attributes
@ModelAttribute
public void populateModel(@RequestParam String number, Model model) {
model.addAttribute(accountManager.findAccount(number));
// add more ...
}
CONFIDENTIAL
67
68.
Spring MVC Annotations@ModelAttribute on method arguments
@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(@ModelAttribute Pet pet) { }
CONFIDENTIAL
68
69. Content Negotiation
CONFIDENTIAL69
70.
Mapping of URLs, Validation support (JSR-349)Configure JSR-349, “Bean Validation”
@Entity
@Table(name = "contact")
public class Contact implements Serializable {
private Long id;
private String firstName;
private String lastName;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@NotEmpty(message="{validation.firstname.NotEmpty.message}")
@Size(min=3, max=60, message="{validation.firstname.Size.message}")
@Column(name = "FIRST_NAME")
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@NotEmpty(message="{validation.lastname.NotEmpty.message}")
@Size(min=1, max=40, message="{validation.lastname.Size.message}")
@Column(name = "LAST_NAME")
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
CONFIDENTIAL
70
71.
Mapping of URLs, Validation support (JSR-349)Configure JSR-349, “Bean Validation”
public String update(@Valid Contact contact, ...
public String create(@Valid Contact contact, ...
<annotation-driven validator="validator"/>
<beans:bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<beans:property name="validationMessageSource" ref="messageSource"/>
</beans:bean>
CONFIDENTIAL
71
72. File Upload Handling
FILE UPLOAD HANDLINGCONFIDENTIAL
72
73.
File Upload HandlingOverview
Apache Commons FileUpload
CONFIDENTIAL
Tomcat 7 -> Servlet 3.0 -> Spring 3.1
73
74.
File Upload HandlingEnable File Upload support
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns=http://java.sun.com/xml/ns/javaee
</web-app>
CONFIDENTIAL
74
75.
File Upload HandlingEnable File Upload support
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns=http://java.sun.com/xml/ns/javaee
</web-app>
CONFIDENTIAL
75
76.
File Upload HandlingModifying Views for File Upload Support
CONFIDENTIAL
76
77.
File Upload HandlingModifying Views for File Upload Support
CONFIDENTIAL
77
78.
File Upload HandlingModifying Views for File Upload Support
CONFIDENTIAL
78
79. Supporting Servlet 3.0 Code-Based (Java-BAsed) Configuration
SUPPORTING SERVLET 3.0 CODE-BASED (JAVA-BASED)CONFIGURATION
CONFIDENTIAL
79
80.
Supporting Servlet 3.0 Code-Based (Java-Based) ConfigurationConfiguration
Advantages?
CONFIDENTIAL
80
81.
Supporting Servlet 3.0 Code-Based (Java-Based) ConfigurationConfiguration
Advantages?
Java синтаксис
Code IDE advantages
Flexibility
No need in full build and redeploy
CONFIDENTIAL
81
82.
Supporting Servlet 3.0 Code-Based (Java-Based) ConfigurationConfiguration
Advantages?
Java синтаксис
Code IDE advantages
Flexibility
No need in full build and redeploy
org.springframework.web.WebApplicationInitializer
org.springframework.web.SpringServletContainerInitializer
CONFIDENTIAL
82
83.
Supporting Servlet 3.0 Code-Based (Java-Based) ConfigurationConfiguration
public class MyWebAppInitializer implements
WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) throws
ServletException {
XmlWebApplicationContext appContext = new
XmlWebApplicationContext();
appContext.setConfigLocation("/WEBINF/spring/appServlet/servlet-context.xml");
ServletRegistration.Dynamic dispatcher =
container.addServlet("appServlet", new
DispatcherServlet(appContext));
MultipartConfigElement multipartConfigElement =
new MultipartConfigElement(null, 5000000, 5000000, 0);
dispatcher.setMultipartConfig(multipartConfigElement);
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
CONFIDENTIAL
83
84.
Supporting Servlet 3.0 Code-Based (Java-Based) ConfigurationConfiguration
public class MyWebAppInitializer implements
WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) throws
ServletException {
XmlWebApplicationContext appContext = new
XmlWebApplicationContext();
appContext.setConfigLocation("/WEBINF/spring/appServlet/servlet-context.xml");
ServletRegistration.Dynamic dispatcher =
container.addServlet("appServlet", new
DispatcherServlet(appContext));
MultipartConfigElement multipartConfigElement =
new MultipartConfigElement(null, 5000000, 5000000, 0);
dispatcher.setMultipartConfig(multipartConfigElement);
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
CONFIDENTIAL
<servlet>
<servlet-name>appServlet</servlet-name>
<servletclass>org.springframework.web.servlet.DispatcherServlet</ser
vlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servletcontext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<multipart-config>
<max-file-size>5000000</max-file-size>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
84
85. Handling exceptions
HANDLING EXCEPTIONSCONFIDENTIAL
85
86.
Handling exceptionsDealing with exceptions
Exceptions -> Status Codes
org.springframework.web.servlet.HandlerExceptionResolver: Exception -> ModelAndView
SimpleMappingExceptionResolver: Exceptions -> Views
@ExceptionHandler, @ControllerAdvice
@ResponseStatus
CONFIDENTIAL
86
87.
Handling exceptions@ExceptionHandler & @ResponseStatus
@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 {}
CONFIDENTIAL
87
88. Spring MVC and Spring security
SPRING MVC AND SPRING SECURITYCONFIDENTIAL
88
89.
Spring MVC and Spring SecurityIntroduction
Declaration Security
Support for many authentication and authorization
schemes, such as basic, form-based, based on digests,
JDBC and LDAP.
Support for security at the level of methods and
security annotations JSR-250
Support for a one-time password
Container integration support
Supports anonymous sessions, simultaneous sessions,
"remember me" mode, channel-level security and
much more
CONFIDENTIAL
89
90.
Spring MVC and Spring SecurityLibraries
Maven Dependencies for Spring Security
Group ID
Artifact ID
Version
Description
org.springframework.security
spring-security-core
3.2.1.RELEASE
Spring Security core module
org.springframework.security
spring-security-web
3.2.1.RELEASE
Spring Security web module
org.springframework.security
spring-security-config
3.2.1.RELEASE
Spring Security configuration
module
org.springframework.security
spring-security-taglibs
3.2.1.RELEASE
Spring Security JSP tag library
CONFIDENTIAL
90
91.
Spring MVC and Spring SecurityConfiguring Spring Security
Configure a filter in the web deployment descriptor:
CONFIDENTIAL
91
92.
Spring MVC and Spring SecurityConfiguring Spring Security
CONFIDENTIAL
92
93.
Spring MVC and Spring SecurityAdding Login Functions to the Application
CONFIDENTIAL
93
94.
Spring MVC and Spring SecurityEnable Method-Level Security
<!-- Enable controller method level security -->
<security:global-method-security pre-post-annotations="enabled"/>
CONFIDENTIAL
94
95.
Spring MVC and Spring SecurityEnable Method-Level Security
<!-- Enable controller method level security -->
<security:global-method-security pre-post-annotations="enabled"/>
CONFIDENTIAL
95
96. helpful LINKS
http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle
http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
http://en.wikipedia.org/wiki/Spring_Framework#Model-view-controller_framework
HELPFUL LINKS
CONFIDENTIAL
96
97. Thank you for your attention
THANK YOU FOR YOUR ATTENTIONCONFIDENTIAL
97