captured from http://www.springinaction.com
Contents
- 1 Spring Expression Language
- 2 @PathVariable
- 3 @RequestHeader
- 4 @CookieValue
- 5 default values
- 6 <spring:url>
- 7 Declarative Validation
- 8 ETag Support
- 9 HTTP Method Conversion
- 10 HTTP Methods in Spring MVC
- 11 Content negotiation
- 12 REST consumption
- 13 JavaConfig
- 14 JavaConfig in Components
- 15 Asynchronous Methods
- 16 Scheduling
- 17 Miscellaneous
1 Spring Expression Language #
- Wires values evaluated from expressions
- Works in XML and annotations
<bean class="com.springinaction.peanuts.Blanket"> <property name="color" value="#{someOtherBean.color}" /> </bean>
@Component public class Blanket { @Value("#{someOtherBean.color}") private String color; public Blanket() { } // ... }
1.1 Expression variables #
Any bean ID systemProperties
Scope/Context-specific...
contextProperties
contextAttributes
request
session
1.2 SpEL examples #
Referencing bean properties
"#{settingBean.databaseUrl}"
Referencing system properties
"#{systemProperties.favoriteColor}"
Evaluating truth
"#{systemProperties.favoriteColor == 'red'}"
Using static methods
"#{T(java.lang.Math).random()}"
Templated Strings
"The time is #{T(java.lang.System).currentTimeMillis()}"
Collection projection
"#{snoopyPersonas.![name]}"
2 @PathVariable #
- Spring 2.5:
@Controller public class SpittleListController { @RequestMapping("/spittleList.htm") public String displaySpittleList(@RequestParam("username") String userName) { // ... return "spittleList"; } } http://localhost:8080/spitter/spittleList.htm?username=habuma
- Spring 3.0:
@Controller public class SpittleListController { @RequestMapping("/{username}/list") public String displaySpittleList(@PathVariable("username") String userName) { // ... return "spittleList"; } } http://localhost:8080/spitter/habuma/list
3 @RequestHeader #
- Spring 2.5:
@Controller public class HomeController { @RequestMapping("/home") public String displayHomePage(HttpServletRequest request) { String userAgent = request.getHeader("User-Agent"); // ... return "home"; } }
- Spring 3.0:
@Controller public class HomeController { @RequestMapping("/home") public String displayHomePage(@RequestHeader("User-Agent") String userAgent) { // ... return "home"; } }
4 @CookieValue #
- Spring 2.5:
@Controller public class HomeController { @RequestMapping("/home") public String displayHomePage(HttpServletRequest request) { String lastVisit = "never"; Cookie[] cookies = request.getCookies(); for (Cookie cookie : cookies) { if("LastVisit".equals(cookie.getName())) { lastVisit = cookie.getValue(); } } // ... return "home"; } }
- Spring 3.0:
@Controller public class HomeController { @RequestMapping("/home") public String displayHomePage(@CookieValue("LastVisit") String lastVisit) { // ... return "home"; } }
6 <spring:url> #
New JSP tag Generates
context-senstive URL
<spring:url value="/spittle/{id}/edit" var="editUrl" escapeXml="true"> <spring:param name="id" value="${spittle.id}" /> </spring:url> <a href="${editUrl}">Do something</a>
7 Declarative Validation #
Based on JSR-303 validators
Hibernate Validator as default implementation
Primarily used to validate inputs to Spring MVC controllers
Configured automatically with <mvc:annotation-driven/>
- In entity class
@Column(name="spittleText") @NotNull In entity @Size(min=1, max=140) class public String getText() { return this.text; }
- In Spring MVC controller
@RequestMapping(method=POST) public String addSpittle(@Valid Spittle spittle, BindingResult result) { if(result.hasErrors()) return "spittle/form"; spitterService.addSpittle(spittle); return "redirect:/home"; }
8 ETag Support #
- ShallowEtagHeaderFilter
<filter> <filter-name>etagFilter</filter-name> <filter-class> org.springframework.web.filter.ShallowEtagHeaderFilter </filter-class> </filter> <filter-mapping> <filter-name>etagFilter</filter-name> <servlet-name>spitter</servlet-name> </filter-mapping>
9 HTTP Method Conversion #
HTTP defines four methods: GET, POST, DELETE, and PUT
HTML only supports 2: GET and POST
Spring 3’s HiddenHttpMethodFilter fixes that
<filter> <filter-name>hiddenMethodFilter</filter-name> <filter-class> org.springframework.web.filter.HiddenHttpMethodFilter </filter-class> </filter> <filter-mapping> <filter-name>hiddenMethodFilter</filter-name> <servlet-name>spitter</servlet-name> </filter-mapping>POST를 사용하면서 hidden parameter로 Method를 명시하면 해당 Method로 변환해주는 HiddenHttpMethodFilter 제공 스프링 form 태그에서 이 기능을 지원하기 때문에 form 태그의 method에 delete, put도 사용 가능.
<form:form method="delete"> <p class="submit"><input type="submit" value="Delete Pet"/></p> </form:form>
10 HTTP Methods in Spring MVC #
Spring MVC form tags support hidden HTTP methods
<form:form method="delete"> <p class="submit"><input type="submit" value="Delete Spittle"/></p> </form:form>
Controllers can handle all HTTP methods
@RequestMapping(method = RequestMethod.DELETE) public String deleteSpittle(@PathVariable long spittleId) { spittleService.deleteSpittle(spittleId); return "redirect:/home"; }
12 REST consumption #
New RestTemplate
- Read
RestTemplate template = new RestTemplate(); template.getForObject("http://localhost:8080/spitter/users/${id}", String.class, userId);
- Create
RestTemplate template = new RestTemplate(); SpitterUser user = new SpitterUser(userName, password); template.postForLocation("http://localhost:8080/spitter/users/${id}", user, userId);
- Delete RestTemplate
template = new RestTemplate(); template.delete("http://localhost:8080/spitter/users/${id}", userId);
13 JavaConfig #
@Configuration public class PeanutsConfiguration { @Bean public Linus linus() { Linus linus = new Linus(); linus.setBlanket(blanket()); return linus; } @Bean private Blanket blanket() { Blanket blanket = new Blanket(); blanket.setColor("blue"); return blanket; } }
14 JavaConfig in Components #
@Component public class KiteEatingTree implements DeciduousTree { public void shedLeaves() { // ... } @Bean public Kite kite() { return new Kite(); } }
15 Asynchronous Methods #
- Annotate a bean method
@Async public void backgroundJob() { ... }
- In Spring configuration
<task:annotation-driven/>