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]