windows7 32bit
Eclipse 4.6
java8
2.ソースコード
2-1.起動クラス
SaikiApplication.java
@SpringBootApplication
public class SaikiApplication extends SpringBootServletInitializer{
public static void main(String[] args) {
SpringApplication.run(SaikiApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(SaikiApplication.class);
}
}
※サーブレット初期化子の追加
これを書かないとwar作成時にweb.xmlが生成されないらしい。
2-2.コントローラークラス
SaikiHomeController.java
@Controller
public class SaikiHomeController {
@RequestMapping(value="/saiki", method = RequestMethod.GET)
public String test(Model model, HttpServletRequest request, HttpServletResponse response) {
Person saiki1 = new Person("001", "saiki1", 20);
Person saiki2 = new Person("002", "saiki2", 23);
Person saiki3 = new Person("003", "saiki3", 24);
Person saiki4 = new Person("004", "saiki4", 27);
Person saiki5 = new Person("005", "saiki5", 30);
List<Person> members = new ArrayList<Person>();
members.add(saiki1);
members.add(saiki2);
members.add(saiki3);
members.add(saiki4);
members.add(saiki5);
System.out.println("★★★" + request.getLocalAddr());
model.addAttribute("msg","サンプルメッセージ!テスト!");
model.addAttribute("members",members);
return "test";
}
}
2-3.画面の作成
test.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>top page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
test
<p th:text="${msg}" />
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Age</th>
</tr>
<tr th:each="member:${members}">
<td th:text="${member.id}"></td>
<td th:text="${member.name}"></td>
<td th:text="${member.age}"></td>
</tr>
</table>
</body>
</html>
上記作成後
にアクセスすると
2-4.インターセプターを作成する
SaikiInterceptor.java
public class SaikiInterceptor implements HandlerInterceptor {
//private static final Logger LOGGER = LoggerFactory.getLogger(SaikiInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//コントローラメソッドの実行前
//LOGGER.debug("preHandleメソッドの実行");
System.out.println("preHandleメソッドの実行");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
//コントローラメソッドの実行後
//LOGGER.debug("postHandleメソッドの実行");
System.out.println("postHandleメソッドの実行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
//リクエスト処理が完了した後
//LOGGER.debug("afterCompletionメソッドの実行");
System.out.println("afterCompletionメソッドの実行");
}
}
2-5.作成したインターセプタークラスを設定するためのクラスを作成する
AppConfig.java
@Configuration
public class AppConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(saikiInterceptor());
}
@Bean
public SaikiInterceptor saikiInterceptor() {
return new SaikiInterceptor();
}
}
にアクセスすると
次は例外ハンドリングについて
2-6.エラー画面の作成
error.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>top page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
test
<p th:text="${msg}" />
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Age</th>
</tr>
<tr th:each="member:${members}">
<td th:text="${member.id}"></td>
<td th:text="${member.name}"></td>
<td th:text="${member.age}"></td>
</tr>
</table>
</body>
</html>
2-7.例外ハンドリングクラス
SaikiExceptionHandler.java
@ControllerAdvice
public class SaikiExceptionHandler {
@ExceptionHandler(SaikiAppException.class)
public String errorHandle(Model model) {
System.out.println("例外発生");
return "error";
}
}
2-8.例外クラス
ここは適当です。。
SaikiAppException.java
public class SaikiAppException extends RuntimeException{
private int state = 0;
private String error = null;
private String errorDescription = null;
public SaikiAppException(int state, String error, String errorDescription) {
super();
this.state = state;
this.error = error;
this.errorDescription = errorDescription;
}
/**
* @return state
*/
public int getState() {
return state;
}
/**
* @param state セットする state
*/
public void setState(int state) {
this.state = state;
}
/**
* @return error
*/
public String getError() {
return error;
}
/**
* @param error セットする error
*/
public void setError(String error) {
this.error = error;
}
/**
* @return errorDescription
*/
public String getErrorDescription() {
return errorDescription;
}
/**
* @param errorDescription セットする errorDescription
*/
public void setErrorDescription(String errorDescription) {
this.errorDescription = errorDescription;
}
}
にアクセスすると
エラー画面は表示されなかったんだけど、、、
先ほど作成した SaikiExceptionHandlerのerrorHandleメソッドが呼ばれていることがわかる。
3. springでの開発効率を上げてくれる開発ツール
Spring Boot 1.3 から
spring-boot-devtools
という開発補助モジュールが導入されている。導入方法はbuild.gradleに以下を追加してリフレッシュするだけ。
dependencies {
compile("org.springframework.boot:spring-boot-devtools")
}
4. springで特定クラスを遅延生成させたい場合
そのクラスに対して@Lazyを付与する。
@Controller
@Lazy
public class LoginController {
または、
@Authowired
@Lazy
LogicService logicService
こんな感じ
そして、全てのクラスを遅延生成させたい場合には BeanFactoryPostProcessor インターフェースを実装した Java Configuration のクラスを作成して、その中で setLazyInit(true) を呼び出せばよいそう。
書籍で詳しく学習するなら以下が参考になるかと。。