정구리의 우주정복

[JAVA] form 태그 이용해 get,post 형식으로 정보 전송하기 , servlet 만들어보기 본문

STUDY/K-DIGITAL

[JAVA] form 태그 이용해 get,post 형식으로 정보 전송하기 , servlet 만들어보기

Jungry_ 2022. 9. 28. 17:01
반응형

 

우선 폴더의 구조는 이렇게 생겼다 webapp 에는 index.html 과 같은 정적 리소스들이 들어가게 된다 

 

index.html 에 조작을 위한 form 태그를 만들어주자

 

    <form action="servlet.do">
        <label>
            a : <input name="a" value="3" size="3">
        </label>
        <label>
            b : <input name="b" value="33" size="3">
        </label>
        <label>
            c : <input name="c" value="3333"size="3" >
        </label>
        <button>servlet.do Get 제출 (form submit)</button>
    </form>

form 의 default 값은 get 이기 때문에 아무것도 적지 않으면 get 으로 동작하게 된다 

    <form action="servlet.do" method="post">
        <label>
            a : <input name="a" value="3" size="3">
        </label>
        <label>
            b : <input name="b" value="33" size="3">
        </label>
        <label>
            c : <input name="c" value="3333"size="3" >
        </label>
        <button>servlet.do Post 제출 (form submit)</button>
    </form>

이녀석은 method 에 post 를 적어줬기 때문에 post 로 동작하게 된다 

 

 아래의 button 을 누르게 되면 form 태그의 action에 있는 .do 형태의 파일로 데이터가 전송되게 된다 

여기선 servlet.do 로 정보가 전달 될 것이다 

전달되는 정보들은 input 태그 안에있는 애들이 되게된다 

 

name = a , value=3

name = b , value = 33

name = c , value = 333

 

이렇게 3 녀석이 전달되게 된다 

이제 servlet.do 를 보자 

 

파일명은 짓고싶은이름.java   형식의 클래스 파일을 만들어주면 된다 (파일명을 servlet.do 로 해야하는게 아님) 

//@ 어노테이션 : 컴파일 될 때 동작 
@WebServlet("/servlet.do") //동작 리소스의 주소를 지정하는 어노테이션 
public class L01Servlet extends HttpServlet{
//브라우저가 url 로 요청하는 방식을 get 방식이라고 한다
//GET 방식의 요청을 처리하기 위해서는  HttpServlet.doGet(Req,resp) 를 재정의 
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//한글 출력 
		resp.setContentType("text/html; charset=UTF-8");
		int a = Integer.parseInt(req.getParameter("a"));
		
		PrintWriter out = resp.getWriter();
		out.write("<h1>Servlet.do.doPost()</h1>");
		out.write("<h2>받은 피라미터 모음 </h2>");
		out.write("<h3>post 방식의 통신은 파라미터를 path 에 포함하지 않는다. 요청 본문 헤더에 정보를 포함한다(페이로드) 그리고 데이터 길이 제한이 없다 </h3>");
		out.write("<h3>post 방식의 통신은 data를 처리하기 위해 존재하기 때문에 파라미터가 많고 바뀌기 쉽다 </h3>");
		out.write("<h3>post 방식의 통신은 처리방식이 바뀔 수 있기 때문에 양식 다시 제출 이거 뜬다 </h3>");
		
		out.write("<ul>");
		out.write("<li>a :" +a+"</li>");
		out.write("</ul>");
		
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// HttpServletRequest req  : url 과 같은 요청정보들이 포함됨 
		//HttpServletResponse resp : 응답할 내용을 적어놓으면 tomcat 이 자동으로 응답해준다 
		System.out.println(req.getRequestURL());
		resp.setContentType("text/html; charset=UTF-8");
		//파라미터 : 동적 리소스(servlet) 의 내용을 바꾸기 위해 전달하는 데이터 
		//url : 서버주소 + path naver.com(서버주소)/shopping?page=1&cate=식품 (path ->서버에 있는 리소스의 위치)
		//path(리소스의 위치) : 리소스 + 파라미터  shopping(리소스)?page=1&cate=식품(파라미터)
		String a_Str = req.getParameter("a"); //key 값을 쓰면 받을 수 있다 
		String b_Str = req.getParameter("b");
		String c_Str = req.getParameter("c");
		int a= Integer.parseInt(a_Str);
		int b= Integer.parseInt(b_Str);
		int c= Integer.parseInt(c_Str);
		resp.getWriter().append("<h1>Hello servlet.do.doGet()</h1>")
		.append("<h2>입력받은 피라미터 목록 </h2>")
		.append("<h3> get 방식 통신은 리소스를 요청하는 것으로 파라미터가 Path 에 포함되어있다(동적 리소스는 파라미터에 의해 내용이 바뀜)</h3>")
		.append("<h4>url 길이에 제한이 있어서 파라미터의 길이나 양에 제한이 있다 .</h4>")
		.append("<h4>파라미터가 포함 된 url 을 공유하면 같은 리소스를 참조할 수 있다</h4>")
		.append("<ul>")
		.append("<li>a :" +a_Str+"</li>")
		.append("<li>b :" +b_Str+"</li>")
		.append("<li>c :" +c_Str+"</li>")
		.append("<li>a+b+c :" +(a+b+c)+"</li>")
		.append("</ul>");
		
		//DBServer 에 접속한 후에 그 내역을 table로 출력 
	}
    }

크게 두가지로 나누어져 있는데 doGet 과 doPost 이다

get 방식으로 정보를 받게 되면 doGet 이 동작하고 post 방식으로 정보를 받게되면 doPost 가 동작한다.

 

우선 doGet 부터 보자 

가장 큰 특징은 url 에 있다

GET 방식의 URL

get 방식으로 전달받은 것은 url 의 뒤에 어떤 정보들이 들어있는지 보이게 된다 이전에 내가 전달한 a,b,c 의 내용들이 모두 보여지는 것을 알 수 있다. 

POST 방식의 URL

반면 post 형태는 딱 주소만 나오는 것을 볼 수 있다 

 

만약 나의 아이디, 비밀번호를 GET 방식으로 전달하게 된다면 ? 보안에 아주 취약하게 될 것이다 

그럼 보안이 약한 get을 사용할 이유가 없는것 아니냐 ??? 라고 할수있지만 전혀아니다 

 

만약 내가 재미있는 유튜브 영상을 친구에게 공유하고 싶어서 url 을 복사해 전달했는데 post 형태로 받게된다면 

https://www.youtube.com

이렇게만 출력되고 아무리 클릭해도 유튜브의 메인으로 연결될 것이다 하지만 get 방식을 쓴다면 

 

https://www.youtube.com/watch?v=A_jpL4Kgrdk 

어떤 영상인지 알 수 있게된다 ! 이러한 이유로 get 을 사용한다

 

클래스 파일의 맨 위를 보면 특이하게 생긴 친구들이 있다 

//@ 어노테이션 : 컴파일 될 때 동작 
@WebServlet("/servlet.do") //동작 리소스의 주소를 지정
public class 클래스명 extends HttpServlet {
}

@WebServlet 어노테이션을 지정해줘 이 클래스가 servlet 으로 사용될것이라고 전달해주고 어떠한 이름으로 사용될지를 인자값으로 넣어준다 

여기서 주의할 점은 / 을 꼭 붙여줘야한다는 것 !  "servlet.do" -> 안됨 ! "/servlet.do" -> 됨 !

 

그리고 HttpServlet 을 extends 해줘야지 이용이 가능하게 된다 

 

앞의 Index.html 에서 전달 받아온 파라미터를 사용하려면 req.getParameter(name); 을 사용해주면 된다 

만약 아까 name 이 a 였던걸 쓰고싶으면 req.getParameter("a"); 이렇게 쓰면 된다 

 

PrinterWriter 을 사용하면 화면에 출력도 가능하다 

PrintWriter out = resp.getWriter();

이렇게 만들어준 후 

out.write("<h2>받은 피라미터 모음 </h2>"); 안에 넣고싶은 내용들을 넣어주면 화면에 출력이 된다 

 

 

 

Post 버튼 눌렀을때  실행 화면 

 

Get 버튼 눌렀을때 실행화면

반응형
Comments