Spring MVC抽象コントローラの例
自己参照のために、この記事では、Spring Controller用の抽象クラスまたはテンプレートメソッドの設計パターンを作成する方法を説明します。
1.抽象的なコントローラ
抽象クラスでは、 `@ Controller`アノテーションは省略可能です。実装されたクラスはそれを適用します。
AbstractResultController.java
package com.mkyong.web.controller; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.mkyong.web.generator.bo.ResultGenerator; public abstract class AbstractResultController { private final Logger logger = LoggerFactory.getLogger(getClass()); abstract ResultGenerator GetResultGenerator(); abstract String GetViewName(); abstract Validator GetValidator(); @RequestMapping(value = "/{q:.+}", method = RequestMethod.GET) final ModelAndView getModelAndView(@PathVariable("q") String q) { logger.debug("getModelAndView :[q]: {}", q); ModelAndView model = new ModelAndView(); Map<String, Object> results = GetResultGenerator().getResultForController(q); model.addObject("data", results); model.setViewName(GetViewName()); logger.debug("getModelAndView :[model]: {}", model); return model; } }
2.春のコントローラは抽象を拡張する
抽象クラスとその一致するURIパスの上に拡張されたSpringコントローラはほとんどありません。
2.1 Path = `/hosting/{q :. } `
ResultControllerHosting.java
package com.mkyong.web.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.mkyong.web.generator.bo.ResultGenerator; @Controller @RequestMapping("/hosting") public class ResultControllerHosting extends AbstractResultController { private static final String VIEW__NAME = "hosting"; @Autowired @Qualifier("resultGeneratorHosting") ResultGenerator resultGenerator; @Override ResultGenerator GetResultGenerator() { return resultGenerator; } @Override String GetViewName() { return VIEW__NAME; } }
2.2 Path = `/site/{q :. } `
ResultControllerSite.java
package com.mkyong.web.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.mkyong.web.generator.bo.ResultGenerator; @Controller @RequestMapping("/site") public class ResultControllerSite extends AbstractResultController { private static final String VIEW__NAME = "site"; @Autowired @Qualifier("resultGeneratorSite") ResultGenerator resultGenerator; @Override ResultGenerator GetResultGenerator() { return resultGenerator; } @Override String GetViewName() { return VIEW__NAME; } }
完了しました。
参考文献
Javaチュートリアル:抽象メソッドとクラス]。
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/mvc/AbstractController.html
[Spring
AbstractController JavaDoc]