Contents

1 Spring Expression Language
1.1 Expression variables
1.2 SpEL examples
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";
   }
  }

5 default values #

New for @RequestParam
  @RequestParam(value="productId", defaultValue="1234")
  String productId
Standard issue for @RequestHeader and @CookieValue
  @RequestHeader(value="User-Agent", defaultValue="1234")
  String userAgent
  @CookieValue(value="LastVisit", defaultValue="1234")
  String lastVisit

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>
Returns HTTP 304 if content is unmodified if-none-match (MD5 Hash comparison) Saves bandwidth

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";
 }

11 Content negotiation #

ContentNegotiatingViewResolver Chooses a view based on HTTP Accepts header, JAF content type, format parameter, or request path extension New view resolvers AbstractAtomFeedView AbstractRssFeedView MarshallingView MappingJacksonJsonView

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/>

16 Scheduling #

 @Scheduled(fixedDelay=3000L)
 public void ping() { ... }
 @Scheduled(fixedRate=3000L)
 public void ping() { ... }
 @Scheduled(cron="0 0 0 * * SAT)
 public void ping() { ... }

17 Miscellaneous #

Object-to-XML mapping from Spring-WS Embracing Java 5 (generics, autoboxing, annotations, etc).
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-06-21 20:50:14
Processing time 0.2037 sec