読者です 読者をやめる 読者になる 読者になる

Spring Boot基礎

Spring Bootについて調べた内容をまとめてみる

○springアプリケーション起動
 SpringApplicatin.runを実行することで設定を読み込みアプリを起動する
 @autowiredや@ControllerアノテーションはSpringApplication.run以下のパッケージで有効になる。
 なのでアプリの根っこの部分のパッケージなどにSpringApplication.runを実行するクラスを配置させる。

○リクエストを受け取れるようにする
 まずはリクエストを受け取れるようにする。
 リクエストを受け取れるようにするには@RequestMappingアノテーションでURLのパスを指定する。
 @RequestMappingはクラスとメソッドの両方で有効なアノテーションである。
 そのため、以下のようにクラスとメソッドに@RequestMappingアノテーションを指定した場合、exec()メソッドを呼び出す場合のURLはhttp://ホスト名:ポート/login/execになる。

@Controller
@RequestMapping("/login")
public class LoginAction {
 @RequestMapping(value="/exec", method={RequestMethod.POST, RequestMethod.GET})
public String exec(HttpServletRequest request, @ModelAttribute LoginForm form, Model model) {
 	UserMstEntity user = userMstService.findUserByIdPass(form.getUserId(), form.getPassword());
 	if(isLoginSuccess( user) ){
 		//メイン画面へ遷移
 		request.getSession().setAttribute(UserMstEntity.class.getName(), user);
 		return "redirect:/main/";
 	}else{
 		model.addAttribute("msg", "ログイン情報が間違っています");
 		return "/login/index";
 	}
}

 それからjspを返す場合はクラスに@ControllerアノテーションをつけておきRequestMappingで呼び出されるメソッドの戻り値でjsp1ファイルへのパスを返すようにする。またjspファイルではなくサーバサイドのRequestMappingが指定されたメソッドを呼び出す場合はreturn "redirect:/main/";のようにredirect:でサーバサイドのメソッドのリクエストマッピングを指定するようにする。Reqiest○リクエストを受け取ったあとにJSPの画面を返せるようにする。
 spring bootでjspを使用する場合は、pom.xmlのdependenciesに以下の定義を追加する。

 <dependency>
	<groupId>org.apache.tomcat.embed</groupId>
	<artifactId>tomcat-embed-jasper</artifactId>
	<scope>provided</scope>
 </dependency>
||< 
 jspファイルを呼び出す場合、@RequestMappingで呼び出されたメソッドが以下のようにjspファイルのパスを指定すればよい。
 return "/login/index";
 だが、その前にsrc/main/resourcesにapplication.propertesを配置し以下の内容を記述しておく必要がある。
>||
 spring.view.prefix: /WEB-INF/views/
 spring.view.suffix: .jsp

 これでjspファイルのパスのルートが/WEB-INF/views/になる。
 また、今回はpropertiesファイルを使ったがymlを使うこともできるので使いやすい方を使えばよいでしょう。

 また、サーバサイドからjspに値を渡す場合は以下のようにmodel.addAttributeをすれば良い。

@RequestMapping(value="/logout")
public String logout(HttpServletRequest request, Model model) {
	request.getSession().setAttribute(UserMstEntity.class.getName(), null);
	model.addAttribute("msg", "ログアウトしました");
	return "/login/index";
}

 model.addAttributeされた値を使うにはstrutsと同じようにel式(${msg})で指定する。

○リクエストされた値をサーバサイドで受け取れるようにする。
 クライアントからリクエストされた値を受け取る場合、簡単な方法としては以下のように@RequestParamアノテーションを使ったものがある。

RequestMapping(value="/exec", method={RequestMethod.POST, RequestMethod.GET})
public String exec(HttpServletRequest request,@RequestParam("userId") String userId,
                       @RequestParam("password") String password, Model model) {
||< 
 ひとつずつ値を受け取るのが面倒な場合はFormクラスを作っておいて求めて受け取れるようにする方法がある。
 formを使用する場合、通常だったらgetter,setterを用意しなければ行けないのだがlombockといってコンパイルしたクラスファイルに自動でgetter,setterを追加してくれる便利なライブラリがある。lombockが使用可能なら以下のようにクラスファイルに@Dataアノテーションを使用することでeclipseがコンパイルしたあとのクラスファイルファイルに手を加えてくれる。
>|java|
import lombok.Data;
@Data
public class LoginForm {
    private String userId;
    private String password;
    
    private String msg;

}

 lombockを使用するにはまず、pom.xmlに以下の定義を加える。

 <dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.16.4</version>
	<scope>provided</scope>
 </dependency>
||< 
 これで@Dataアノテーションを使ったとしてもエラーはなくなるはずである。ただこれだけでは不十分でありクラスファイルを確認してもgetter,setterメソッドがセットされていないのがわかる。@Dataアノテーションを使用する場合はeclipse自体の設定を変更しなければいけず、方法としては公式サイトからダウンロードしてきたlombock.jarを実行して使用するeclipseを指定するというものだ。これで@Dataアノテーションがついているものにはgetter,setterが自動で吹かされていることが確認できる。

 クライアントからのリクエストをFormにセットする場合は、クラスに@Dataアノテーションを記述したあと以下のように@ModelAttributeアノテーションを使う。
>|java|
 @RequestMapping(value="/exec", method={RequestMethod.POST, RequestMethod.GET})
public String exec(HttpServletRequest request, @ModelAttribute LoginForm form, Model model) {
 	UserMstEntity user = userMstService.findUserByIdPass(form.getUserId(), form.getPassword());

とりあえずこれで、クライアントとサーバサイドで基本的な情報のやり取りができるようになった。
DBと依存性周りについてはまた今度で、