カッコはアノテーションを記述する場所
@Component(クラス)
SpringDIコンテナにbeanとして登録したいクラスへ付与する。
※コンポーネントスキャンの対象になっている必要あり
DIとして使用する場合、シングルトンになるため、メンバ変数を使用している場合は共有されることを注意。(回避方法あり)
@Component
public class OfferComponent {
...
}
【コンポーネントスキャン対象の設定方法】
spring-mvc.xml(servlet-context.xml)に下記を記載する
※設定方法は他にも方法あり
</beans>
…
<contextcomponent-scan base-package="jp.co.demo" />
…
</beans>
@Controller(クラス)
@Componentと基本的には同じ働きをするが、SpringMVCでControllerの役割となるクラスに付与する。
@Controller
public class OfferController {
...
}
@Service(クラス)
@Componentと基本的には同じ働きをするが、Service層(ビジネスロジック等)を対象としている。
@Service
public class OfferService {
...
}
@Repository(クラス)
@Componentと基本的には同じ働きをするが、Persistence層(DAO等のDBアクセスを行うクラス)を対象としている。
@Repository
public class OfferRepository {
...
}
@RestController(クラス)
REST API 用の Controller クラス(Viewに遷移せず、メソッドの戻り値をそのままレスポンスとして返す)に使用する。
@RestController
public class RestController {
...
}
@RequestMapping(クラス、メソッド)
URLリクエストとクラス、メソッドのマッピングを行う。
【属性】
@RequestMapping(value="/test", method=RequestMethod.GET, headers="Accept=application/*", params="id=002")
@RequestMapping("/test")
value |
コンテキストルートからのパスを記載する。複数指定可能。ワイルドカード使用可能。 |
method |
GET、POST等を指定する。複数指定可能。省略時はPOSTになる。 |
headers |
HTTPヘッダ名のみ指定されている場合は、そのヘッダが存在するかどうかでマッチの判定。ヘッダ名と値が指定されている場合は、ヘッダにその値が設定されているかどうかでマッチの判定。 |
params |
リクエストパラメーターを指定する。 |
【使用例】
@Controller
@RequestMapping("/offer")
public class OfferController {
@RequestMapping("/offer_initDisplay")
public String initDisplay(Model model) {
return "offer";
}
@RequestMapping(value = {"/offer1?","/offer2*", "/offer3/**"})
public String initDisplay2(Model model) {
return "offer";
}
@RequestMapping(value="/offer4", method={RequestMethod.GET, RequestMethod.POST})
public String initDisplay3(Model model) {
return "offerConfirm";
}
@RequestMapping(value="offer_confirm", params="userId=1")
public String confirm(Model model) {
return "offerConfirm";
}
@RequestMapping(value="offer_confirm", params={"userId=1", "name=あ"})
public String confirm2(Model model) {
return "offerConfirm";
}
}
@PostMapping/@GetMapping(メソッド)
※Spring 4.3以降
RequestMappingとほぼ同様。メソッドが省略できる。
methodがPOSTの場合:PostMapping
methodがGETの場合:GetMapping
@Controller
@RequestMapping("/offer")
public class OfferController {
@PostMapping("/offer_initDisplay")
public String initDisplay(Model model) {
return "offer";
}
@GetMapping(value = {"/offer1?","/offer2*", "/offer3/**"})
public String initDisplay2(Model model) {
return "offer";
}
}
@ModelAttribute(メソッドの引数、メソッド)
メソッドの引数:画面(jsp)からフォームの値を受け取り、Modelに格納する。画面(jsp)のModelAttributeと紐づける必要あり。
メソッド:RequestMappingの前に実行される。Modelに格納する。
【メソッドの引数】
@ModelAttribute("{受け取るformの名前}") {格納する型} {格納する変数名}
@Controller
public class ConfirmOffer {
@PostMapping("offer_confirm")
public String confirm(Model model,
@ModelAttribute("offerForm") OfferForm form) {
form.setName("値を変更");
return "offer/confirmOffer";
}
}
画面(jsp)
modelAttributeでControllerの@ModelAttributeの値と紐づける必要あり
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<form:form modelAttribute="offerForm">
<label>ユーザーID:</label>
<form:input path="userId"/><br>
<label>名前:</label>
<form:input path="name"/><br>
<input type="submit" value="確認へ進む" formaction="offer_confirm"/>
</form:form>
</body>
</html>
【メソッド】
@ModelAttribute("{modelに格納する変数名}")
@Controller
public class ConfirmOffer {
@ModelAttribute("aiueo")
private String setupForm() {
return "あいうえお";
}
@RequestMapping("offer_confirm")
public String confirm(Model model) {
System.out.println(model.getAttribute("aiueo"));
return "offer/confirmOffer";
}
}
@PathVariable(メソッドの引数)
URLに含まれる動的なパラメータを受け取る。
【属性】
@PathVariable(name="id", required=true) String userId
@PathVariable("id") String userId
name |
URLに含まれるパラメータに紐づく |
required |
true:必須、false:必須でない。省略時はtrue:必須 |
使用例
@Controller
public class OfferController {
@GetMapping("/offer_initDisplay/sample_{id}")
public String initDisplay(Model model,
@PathVariable("id") String userId) {
System.out.println(userId);
return "offer/offer";
}
}
@RequestParam(メソッドの引数)
GETやPOSTのパラメータの値を受け取る。
【属性】
@RequestParam(name="id", required = true, defaultValue="default") String userId)
@RequestParam("id") String userId
name |
URLに含まれるパラメータに紐づく |
required |
true:必須、false:必須でない。省略時はtrue:必須。defaultValueがある場合はtrueでもエラーにならない |
defaultValue |
リクエストパラメータが指定されなかった時のデフォルト値を指定 |
【使用例】
・GETの場合
URLのパラメータを取得する
http://localhost:8080/demo/offer_initDisplay?id=sample
@Controller
public class OfferController {
@GetMapping("/offer_initDisplay")
public String initDisplay(Model model,
@RequestParam(name="id") String userId) {
System.out.println(userId);
return "offer/offer";
}
}
・POSTの場合
formで送信された値を取得する
@Controller
public class ConfirmOffer {
@PostMapping("offer_confirm")
public String confirm(Model model,
@RequestParam(name="userId") String id,
@RequestParam(name="name") String name,
String userId) {
System.out.println(id);
System.out.println(name);
return "offer/confirmOffer";
}
}
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<form method="post">
<label>ユーザーID:</label>
<input type="text" name="userId"/><br>
<label>名前:</label>
<input type="text" name="name"/><br>
<input type="submit" value="確認へ進む" formaction="offer_confirm"/>
</form>
</body>
</html>
@Scope(クラス)
インスタンスのスコープ(ライフサイクル)を変更する。
コントローラーやサービスはシングルトン(インスタンスを使いまわす)のため、メンバ変数の共有を防ぐためにrequestやprototypeを指定する。
@Controller
@Scope("request")
public class OfferController {
String sampleName;
@GetMapping("/offer_initDisplay")
public String initDisplay(Model model){
System.out.println(sampleName);
serviceName = "a";
return "offer";
}
}
@Autowired(クラス)
DIコンテナからBeanをDIする。(型が一致するクラスをDIする)
newを使ったインスタンス化と同じ。
シングルトンのためメンバ変数を使用している場合は、値が共有されるため注意する。(回避方法あり)
【属性】
@Autowired(required=false)
required |
true:対象のBeanがDIコンテナにないとエラー、false:DIコンテナになくてもエラーにならない。省略時はtrue。 |
【使用方法】
【Spring】DI - アルパカノフンに記載
@Qualifier(クラス)
@Autowiredと併用する。
@Autowiredでbean名を指定したい場合に使用する。
@Autowired
@Qualifier("beanName")
@Resource(クラス)
DIコンテナからBeanをDIする。(名称が一致するクラスをDIする)
※javaのアノテーション
@Resource(name="beanName")
name |
bean名を指定する。省略時はフィールド名の名前から指定する。 |