JavaとSpringセグメントの記録(2)


@Controllerと@RestController


JavaとSpringセグメントを記録(1)に続き、学習の過程で疑問が生じた.

@Controllerと@RestControllerの違いは何ですか?

@RestController
public class Controller{
  
  @RequestMapping("/")
  public String index(){
  
    return "mainPage";
  }
}
@Controller
public class Controller{
  
  @RequestMapping("/")
  public String index(){
  
    return "mainPage";
  }
}
上の2つのコードは異なる結果を示しています.@RestControllerは、要求されたurlページに「mainPage」という文字列を直接表示し、@Controllerは、要求されたurlページに指定されたパスのファイルをマッピングします(デフォルトはresources/templatesディレクトリの.htmlファイルです).
簡単に言えば、@Controllerは、View@RestControllerjsonの形式のデータを返す.

@RequestMapping , @GetMapping , @PostMapping


HTTPメソッドにおけるGET,POSTのマッピング.@GetMapping@RequestMapping(method=RequestMethod.GET, value="...")で、@PostMapping@RequestMapping(method=RequestMethod.POST, value="...")に等しい.
会員登録ページを作成したいとします.
「/member/register」urlを使用してログインすると、「会員登録」ページが表示され、そのページに情報を入力して「登録完了」をクリックしてサーバーにデータを転送し、「会員登録完了」ページを示すコードを大まかに作成します.
@Controller
public class member{
  @GetMapping("/member/register") //해당 url에 대한 GET method 수행
  public String memberRegister(){
  
    return "/member/register"; // resources/templates/member 디렉토리 속 register.html 파일
    // 해당 파일은 <form>, <input> 등을 이용하여 회원 가입에 필요한 정보를 입력받고 전송하게 되어 있을 것.
  }
  
  @PostMapping("/member/register") //같은 url에 대한 POST method 수행.
  public String memberResiterSubmit(){
  
    return "/member/registerComplete"; // 서버로 데이터 전송 후 registerComplete.html 파일로 '회원가입완료' 페이지 보여줌.
  }
}

request, reponse

request:client→serverオブジェクト.response:server→clientオブジェクト.
これら2つを利用するために、HttpServletRequestHttpServletResponseを使用する.
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequest;

// (중략)

@PostMapping("...")
public String memberRegisterSubmit(HttpServletRequest request, HttpServletResponse response){
  String ID = request.getParameter("ID"); // "register.html" 파일 내 <input name="ID">으로 전송된 문자열. 즉 요청 정보 중 "ID"를 name으로 갖는 값을 ID라는 문자열 변수에 저장하겠다는 뜻.
  String PW = request.getParameter("PW");
  
  System.out.println("ID : " + ID + ", PW : " + PW);
  
  return "...";
  }
  //(후략)
マッピングされたURLでクライアント→サーバの要求が発生した場合、要求情報はHttpServeretRequestオブジェクトに格納されます.パラメータとして、メソッドでこれらの値を変数に格納して使用できます.
応答情報は、HttpServeretResponseオブジェクトに格納されます.
IDとPWしか使われていませんが、入力値が多ければどうなりますか?複数のパラメータに対して複数の変数を繰り返し宣言および割り当てる必要がありますか?
簡単な方法としてlombokの@Dataがあります.
@Data
public class MemberInputs{
  private String ID;
  private String PW;
  private String name;
}
以上のように、入力する情報のフィールドを作成し、Data Annotationを使用して、次のように各情報を出力することができます.
@PostMapping("...")
public String memberRegisterSubmit(HttpServletRequest request, HttpServletResponse response, MemberInputs infos){

  System.out.println(infos.toString());
  
  return "...";
}
結果は次のようになります.

で入力された情報では、これらの入力されたname属性値をMemberInputクラスの変数名と一致させることが重要である.一致しない場合、出力は次のようになります.

(「input」マークの「name」属性値を「ID」以外の値に設定)

リファレンス

  • https://mangkyu.tistory.com/49
  • https://velog.io/@yh20studio/CS-Http-Method-Ran-GET-POST-PUT-DELETE
  • https://memostack.tistory.com/161
  • https://ek12mv2.tistory.com/125