Top Banner
Margus Hanni, Nortal AS Spring MVC 07.04.2015
68

Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Dec 19, 2015

Download

Documents

Maurice Clark
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Margus Hanni, Nortal AS

Spring MVC

07.04.2015

Page 2: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Millest räägime

Framework

SpringIoC - Inversion of Control

Spring MVCAngularJS

Page 3: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

What is a Web Framework?

A web framework is a software framework designed to simplify your web development life.

Frameworks exist to save you from having to re-invent the wheel and help alleviate some of the overhead when you’re building a new site.

Page 4: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

What is a Web Framework?

Typically frameworks provide libraries for accessing a database, managing sessions and cookies, creating templates to display your HTML and in general, promote the reuse of code.

Page 5: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Spring Framework

Open source application framework.

Inversion of Control container (IoC).

Lots of utility API-s.

Page 6: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Should I bother?

Spring framework is still extremely popular in Java (web) applications.

If you’re going to build web applications in Java then chances are that you will meet Spring.

Page 7: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Inversion of control (IoC)

Inversion of control is used to increase modularity of the program and make it extensible.

Page 8: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

IoC in Spring

@Servicepublic class UserService {

@Autowiredprivate UserDao userDao;

public User getByUserName(String name) {User user = userDao.getByUserName(name);// additional actionsreturn user;

}}

1234567891011121314

Page 9: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

IoC in Spring

@Servicepublic class UserService {

@Autowiredprivate UserDao userDao;

public User getByUserName(String name) {User user = userDao.getByUserName(name);// additional actionsreturn user;

}}

Declare bean, Spring will create it1234567891011121314

Declare dependencies, Spring will inject them

Page 10: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Dependency injection

Your code depends on abstractions, Spring handles actual implementations.

You can switch implementations easily.

Page 11: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Dependency injection

public interface UserDao {User getByUserName(String name);

}

@Repositorypublic class JdbcUserDao implements UserDao {

public User getByUserName(String name) {// load user from DB

}}

@Autowiredprivate UserDao userDao;

1234567891011121314

Page 12: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Dependency injection

public interface UserDao {User getByUserName(String name);

}

@Repositorypublic class JdbcUserDao implements UserDao {

public User getByUserName(String name) {// load user from DB

}}

@Autowiredprivate UserDao userDao;

Universal abstraction1234567891011121314

One possible implementation.

Spring will create and register it

Spring can inject as an abstraction type

Page 13: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

How to get a String from DB?

Page 14: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

How to get a String from DB?

Page 15: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

IoC in Spring

Spring handles the infrastructurebean creation, dependency lookup and injection

Developer focuses on application specific logic

Page 16: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

XML based configuration

Bean can also be defined and injected in XML.

<bean id="userDao" class="example.JdbcUserDao" />

<bean id="userService" class="example.UserService"><property name="userDao" ref="userDao" />

</bean>

Page 17: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

What is MVC?

http://java.sun.com/blueprints/patterns/MVC-detailed.html

Page 18: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Model-View-Controller

Model - Model represents an object or JAVA POJO carrying data

View - View represents the visualization of the data that model contains

Controller - Controller acts on both model and view:

It controls the data flow into model object

Executes business logic, data actions etc.

It keeps view and model separate

Page 19: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Model-View-Controller

Separation of different layers

An application might have more than one user interface

Different developers may be responsible for different aspects of the application

Page 20: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Spring MVC

Spring based web framework.

Request-driven.

Designed around a central Servlet.

Implements the Model-View-Controller design pattern.

Very flexible (we’ll see how exactly).

Page 21: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Spring MVC

IoC again – framework handles the infrastructure, you focus on application specific things.

Page 22: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Architecture - DispatcherServlet

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html

Page 23: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

DispatcherServlet

Is completely integrated with the Spring IoC container and as such allows to use every other feature that Spring has.

Page 24: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Controller

@Controllerpublic class HelloController {

@Resourceprivate UserService userService;

@RequestMapping("/hello")public String hello(Model model) {

User user = userService.getByUserName("Cartman");

model.addAttribute("user", user);

return "hello";}

}

1234567891011121314

Page 25: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Controller

@Controllerpublic class HelloController {

@Autowiredprivate UserService userService;

@RequestMapping("/hello")public String hello(Model model) {

User user = userService.getByUserName("Cartman");

model.addAttribute("user", user);

return "hello";}

}

Declare controller1234567891011121314

Inject Spring resources

Method for handling requests

What requests to serve?

Page 26: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Controller

@Controllerpublic class HelloController {

@Resourceprivate UserService userService;

@RequestMapping("/hello")public String hello(Model model) {

User user = userService.getByUserName("Cartman");

model.addAttribute("user", user);

return "hello";}

}Logical view name

1234567891011121314

Page 27: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Model

Set of attributes that Controller collects and passes to the View.

Page 28: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Model

Spring’s Model object…

@RequestMapping(value="/hello")public String hello(Model model) {

User user = userService.getByUserName(“cartman");model.addAttribute("user", user);...

Page 29: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Model

Or plain java.util.Map

@RequestMapping(value="/hello")public String hello(Map<String, Object> model) {

User user = userService.getByUserName("cartman");model.put("user", user);...

Page 30: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Model

Or plain java.util.Map

@RequestMapping(value="/hello")public String hello(Map<String, Object> model) {

User user = userService.getByUserName("cartman");model.put("user", user);...

Page 31: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

View

Any representation of output, invoked after the Controller, uses data from the Model to render itself.

Page 32: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

View technologies

Usually Java Server Pages that generate HTML.

Out-of-the-box there are also PDF, XML, JSON, Excel and other views.

You can create your own.

Page 33: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

View

Controller is totally decoupled from actual view technology.

@RequestMapping("/hello")public String hello() {...return "hello";

}

Just a logical view name to be invoked

Page 34: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

JSP view

<bean class="org.springframework...InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" />

</bean>

"hello” /WEB-INF/jsp/hello.jsp

Page 35: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

JSP view (hello.jsp)

Model attributes are accessible as EL (Expression Language) variables in JSP.

JSP: <p>Hello, ${user.fullName}!</p>

HTML: <p>Hello, Eric Cartman!</p>

Page 36: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

JSON view

JSON view transforms the whole model to JSON format.

<bean class="org.springframework...ContentNegotiatingViewResolver">

<property name="defaultViews"> <list>

<bean class="org.springframework...MappingJacksonJsonView" />

</list> </property></bean>

Page 37: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

JSON view

Outputs the Model as JSON document.

{"user":{"fullName":"Eric Cartman"}}

Page 38: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Request mapping

@RequestMapping("/hello")

@RequestMapping(value="/hello", method=RequestMethod.GET)

@RequestMapping(value="/hello", params= {"param1", "param2"})

@RequestMapping(value="/hello", consumes="application/json", produces="application/json")

Page 39: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Path variables

@RequestMapping(value="/hello/{username}")public String hello(

@PathVariable String username, Model model) {...

http://[SERVER]/hello/cartman

Page 40: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Request parameters

@RequestMapping(value="/hello")public String hello( @RequestParam("username") String username, Model model) {

...

http://[SERVER]/hello?username=cartman

Page 41: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Type conversion

HttpServletRequest parameters, headers, paths etc are all Strings.

Spring MVC allows you to convert to and from Strings automatically.

Page 42: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Built-in conversion

There are some standard built-in converters.

@RequestMapping("/foo")public String foo(

@RequestParam("param1") int intParam,

@RequestParam("param2") long longParam) {...

Page 43: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Type conversion

You can also define your own PropertyEditors

PropertyEditorSupport implements PropertyEditor

Page 44: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Custom types

public class DateRange {

private Date start;private Date end;

public DateRange(Date start, Date end) {this.start = start;this.end = end;

}

public int getDayDifference() {// calculate

}}

1234567891011121314

Page 45: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Custom type editor

public class DateRangeEditor extends PropertyEditorSupport {

private DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");

public void setAsText(String text) throws IllegalArgumentException {String[] parts = text.split("-");

Date start = dateFormat.parse(parts[0]);Date end = dateFormat.parse(parts[1]);

setValue(new DateRange(start, end)); }

public String getAsText() {DateRange dateRange = (DateRange) getValue();return dateFormat.format(dateRange.getStart()) + "-" +

dateFormat.format(dateRange.getEnd());}

}

String to custom type

Custom type to String

12345678910111213141516171819

Page 46: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Register and use

@Controllerpublic class MyController {

@InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(DateRange.class, new DateRangeEditor()); }

@RequestMapping(value="/dateRange") public String dateRange(@RequestParam("range") DateRange range) {

... }}

1234567891011121314

Page 47: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Method parameters

It all about IoC and Convention Over Configuration.

Your code simply declares what it needs from the environment, Spring makes it happen.

The order is not important, the type is.

Page 48: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Method parameters

Model/Map – model

@RequestParam/@PathVariable annotated

HttpServletRequest, HttpServletResponse, HttpSession – it is all based on Servlet API!

Page 49: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Method parameters

java.io.Writer / java.io.OutputStream – if you want to generate response directly in controller

Page 50: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Method parameters

For example

@RequestMapping(value="/hello")public String hello(Model model, Writer writer, HttpServletRequest request, HttpSession session) {

...

12345

Page 51: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Return values

Same principle – you return what Spring awaits from you.

Page 52: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Return value examples

String – logical view name.

voidIf you write the response in controller

If you use default/content negotiating views (like JSON earlier)

Page 53: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Non-intrusive

Very important feature of a framework is non-intrusiveness.

Spring MVC normally lets you do stuff according to MVC pattern.

But it doesn’t prevent you from violating MVC if you really want to.

Page 54: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

No view examples

@RequestMapping(value="/noView")@ResponseBodypublic String noView() {

return "Too simple for a view";}

@RequestMapping(value="/noView")public void noView(Writer writer) {

writer.write("Too simple for a view");}

Page 55: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Form

First you need to give Spring a new command object

@RequestMapping(value="/addUser")public String add(Model model) {

model.addAttribute("user", new User());return "add";

}

Page 56: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Command object

public class User {

private String fullName;private int age;

// getters/setters...

Page 57: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Form JSP

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

<form:form commandName="user"><form:input path="fullName" />...<form:input path="age" />...<input type="submit" value="Add" />

</form:form>

Page 58: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Form

Spring will bind the data to our command object

@RequestMapping(value="/addUser", method=RequestMethod.POST)

public String save(User user) {// save user

return "home";}

Page 59: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Validation

JSR-303 defines constraint annotations:

public class User {

@NotNull@Size(max=20)private String fullName;

@Min(10)private int age;

...

Page 60: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Validation

@RequestMapping(value="/addUser", method=RequestMethod.POST)public String save(@Valid User user, BindingResult result,

Model model) {

if (result.hasErrors()) {model.addAttribute("user", user);return "add";

}

// save userreturn "home";

}

Check for validation errors.

Render the same view in case of errors

123456789101112

Page 61: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Validation

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

<form:form commandName="user"><form:input path="fullName" /><form:errors path="fullName" />...<form:input path="age" /><form:errors path="age" />...<input type="submit" value="Add" />

</form:form>

Show validation errors

Page 62: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Validation

It is of course possible to define your own constraints and validators.

Page 63: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

AngularJS ja Spring MVC

Mis kaob ning asendatakse?

Mis rolli mängib Spring MVC?

Kuhu nihkub arendus? FE BE

Page 64: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

RESTful

REST - Representational State Transfer

is a software architecture style consisting of guidelines and best practices for creating scalable web services

RESTful systemscommunicate over the Hypertext Transfer Protocol with HTTP verbs (GET, POST, PUT, DELETE, etc.)

Page 65: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Mis muutub

Kontroller nihkub

REST teenused

Stateless

http://blog.jhades.org/developing-a-modern-java-8-web-app-with-spring-mvc-and-angularjs/

Page 66: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Mida tuleb arvestada

Autentimine

Autoriseerimine

Kontrollid

Page 67: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Spring MVC + AngularJS või JSP

„Üks eelistab ema, teine aga tütart!“Konventsioonid

Tagasiühilduvus

Mõttemaailma muutus

Tehnoloogiate ja vahendite rohkus

Single-page application

Erinevad kihidData Transfer Object (DTO)

Page 68: Margus Hanni, Nortal AS Spring MVC 07.04.2015. Millest räägime Framework Spring IoC - Inversion of Control Spring MVC AngularJS.

Sources of wisdomSpring has great documentation: http://www.springsource.org/spring-framework#documentation

Java BluePrints - Model-View-Controllerhttp://www.oracle.com/technetwork/java/mvc-detailed-136062.html

Model-View-Controllerhttp://www.oracle.com/technetwork/java/mvc-140477.html

Inversion of controlhttp://en.wikipedia.org/wiki/Inversion_of_control

Design Patterns - MVC Patternhttp://www.tutorialspoint.com/design_pattern/mvc_pattern.htm

Web App Architecture - the Spring MVC - AngularJs stackhttp://blog.jhades.org/developing-a-modern-java-8-web-app-with-spring-mvc-and-angularjs/