서블릿에서 ajax로 form전송하고 파라미터 받기

서현서현·2023년 9월 21일
0

작은 실수들

목록 보기
18/19

스프링을 쓸때는 스프링이 알아서 json데이터를 읽어서 객체에 바인딩 해줬었다.
근데 서블릿에선... json으로 비동기통신을 시도하면 못읽고 null을 띄운다.

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				String id = request.getParameter("user_id");
		String pw = request.getParameter("user_pw");
        }

이러면 둘다 null이 되는것이다!!
해결을 위해선 파싱을 해줘야한다. GSON 라이브러리를 추가 한 후

		BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
		String json = br.readLine();
		System.out.println("json데이터 : "+json);
		
		Gson gson = new Gson();
		
		MemberDto dto = gson.fromJson(json, MemberDto.class);
		System.out.println(dto);
		

이런걸 해주면 된다.

근데 한가지 의문...
스프링에서 비동기로 POST요청 보내서 @RequestParam받기
이때도 스프링을 사용하면서, @Requestparam으로 값을 받고싶어서 고민을 했었다. 기본 form전송을 사용하면 위 어노테이션으로 값을 받을 수 있는데, 늘 하던대로 json으로 전송했더니 @RequestParam으로 받을 수 없었다.

해결법은 기본form전송과 마찬가지로 content-type을 지정해주는것이었다.
http post 전송일경우, http body에 id=user&pw=1234가 들어가지는 형식을 가진다.
이때 form 전송을 기본값으로 두고, 바디를 셋팅한 후 (스프링의 경우 {userId:id, user_pw:pw} 이런식으로 했는데도 됐다) 전송해주면 된다.

그러나 서블릿에선 이같은 처리가 불가능했다. form태그가 내부적으로 어떠한 처리를 해주는것으로 추정된다... 즉, 서블릿 환경에서 ajax를 사용해서 기본form전송을 흉내낼경우, 서버는 request.getPara()으로 값을 파싱하지 못한다. 따라서 JSON전송을 하고 라이브러리로 파싱해야함...

서블릿 복습을 하면할수록 스프링이 참 편리하구나 하는 생각이 든다..

0개의 댓글