예를 들어 쇼핑몰을 이용하고자 할 때에 우리는 회원가입을 하죠?( 요즘은 비회원도 주문이 가능합니다만..^^?)

그 때에 쇼핑몰에서 사용할 아이디, 비밀번호 외의 개인정보를 입력하는데요.

우리가 그 개인정보 입력을 하고 결과를 출력하는 웹 페이지를 만들어봅시다!!

그러면~

아이디, 비밀번호, 이름, 성별, 메일수신여부, 직업

이렇게 6가지를 입력받도록 합시다.


입력받을 화면의 구성은 밑의 이미지와 같이 하도록 하겠습니다.



스타일이 없어서 허접해 보이긴 하지만..;; 지금 스타일은 중요하지 않으니까요 ㅎ


혹시 위와 같이 코드를 작성하실수 있으신가요?

HTML을 공부하신 분이시면 아마 쉽게 작성 하실 수 있을겁니다.

하지만 HTML을 모르신다고 너무 걱정하지는 마세요.

배우면 되니까요~

지금은 자세히는 알려드리지는 못하지만 인터넷에 HTML에 관해 검색 몇번 해보면 너무나 많은 학습자료가 있습니다.

지금은 필요한 부분만 설명해보도록 하겠습니다.

위의 코드가 개인정보를입력받는 개인정보입력 페이지의 HTML소스 입니다.

여기서 중요한 점은 form엘리먼트 입니다.

이 form엘리먼트 안에는 여러가지의 서브엘리먼트들을 사용할 수 있습니다.

각 엘리먼트들은 검색해보시면 어떻게 사용되는지 확인 가능하실겁니다.  ( 가능하다면 제가 HTML에 대해서 포스팅을 해보도록 하겠습니다)


지금 저희가 집중해서 봐야할 부분은


8번째 라인의 action애트리뷰트와 method애트리뷰트 입니다.

그리고 26번째 라인도 같이 봐주세요.


 

type애트리뷰트의 submit이라고 값을 적어놨습니다. 이것은 사용자가 확인버튼을 누르면 form엘리먼트의 action애트리뷰트 값에 적힌 URL로 입력된 데이터가 전송이 됩니다.

그런데 action애트리뷰트의 값이 URL처럼 생겼나요..?

저렇게 적은 이유는 html문서와 서블릿 클래스가 동일한 웹 서버에 있기 때문에 앞에 있어야 할 도메인 이름과 포트번호를 생략한 채 뒷 부분만 작성을 해도 가능하기 때문입니다.

또한 HTML문서를 기준으로 상대적인 URL을 적는 것도 가능합니다.


서블릿클래스가 입력된 데이터들을 다 넘겨 받았는데, 어떤게 이름이고, 어떤게 아이디인지 어떻게 구별할까요?

바로 각각의 엘리먼트에 존재하는 name애트리뷰트에 적힌 이름들로 구분을 하게 됩니다.


아참 그리고 form엘리먼트의 method애트리뷰트는 전송방식을 적어주는 겁니다.

전송방식에는 get방식 post방식이 있는데 저는 일단 get방식으로 하겠습니다.


자 이제는 입력결과를 확인하는 화면을 구현하기위는 서블릿 클래스를 작성해봅시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package info;
 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class InfoServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException{
        resp.setContentType("text/html; charset=UTF-8");
        String id = req.getParameter("id");
        String password = req.getParameter("password");
        String name = req.getParameter("name");
        String gender = req.getParameter("gender");
        if(gender.equals("male")){
            gender = "남자";
        }else{
            gender = "여자";
        }
        String eventMail = req.getParameter("eventmail");
        String adMail = req.getParameter("admail");
        String job = req.getParameter("job");
        PrintWriter out = resp.getWriter();
        out.println("<html>");
        out.println("<head><title>개인정보입력결과</title></head>");
        out.println("<body>");
        out.println("<h2>개인정보입력 - 결과화면</h2>");
        out.printf("이름 : %s <br>",name);
        out.printf("아이디 : %s <br>",id);
        out.printf("패스워드 : %s <br>",password);
        out.printf("성별 : %s <br>", gender);
        out.printf("이벤트소식 : %s <br>", mailcheck(eventMail));
        out.printf("광고메일 : %s <br>", mailcheck(adMail));
        out.printf("%s<br>",eventMail);
        out.printf("직업 : %s <br>", job);
        out.println("</body>");
        out.println("</html>");
    }
    String mailcheck(String mail){
        if(mail == null){
            return "수신거부";
        }else if(mail.equals("on")){
            return "수신";
        }else{
            return mail;
        }
    }
}
 
cs

저는 위와 같이 작성하였습니다.


입력페이지에서 입력된 각 값들은 HttpServletRequest타입에서 getParameter메소드를 이용해 가져올 수 있는데요

14번라인처럼 사용하시면 됩니다.

그런데 제가 14번라인과 비슷하게 여러번 작성 한 것을 확인 하실 수 있습니다.

즉, 입력된 데이터들은 한번에 가져오는 것이 아닌 각 파라미터로 넘겨준 이름에 해당되는 데이터 하나만을 가져오는겁니다.

String id = req.getParameter("id");

여기서 괄고 한에 가져올 데이터의 name애트리뷰트의 값을 써주면 됩니다.

또한 이 메소드의 리턴값은 String이므로 만약 숫자를 사용하기위해서는 Integer클래스에 있는 타입변환에 사용하는 메소드를 사용하면 됩니다. ( parseInt(), parseDouble() 등)


그리고 소스를 보시면 아시다시피 체크박스에 대해서는 getParameter()를 각각 한 번씩 호출을 해야 하는데요

name애트리뷰트의 값을 넘겨 받을때에 체크박스가 선택된 상태라면 'on', 그렇지 않다면 null을 리턴해줍니다.

저는 'on'을 넘겨 받으면 '수신' , null이면 '수신거부'라고 한글로 변경해주기 위해 mailcheck라는 메소드를 만들었습니다.


자 이렇게 작성 했으면 마지막 단계는 만들어진 서블릿클래스를 등록해야합니다~


web.xml파일을 여시고~


저는 이렇게 했습니다~


이제 실행을 시켜보도록 하겠습니다.


위와 같이 입력하고~

확인!!



오~ 잘 나오네요^^



하. 지. 만 !!

주소표시줄을 한번 확인해 주시겠습니까?

아니.. 제가 입력한 정보들이 주소표시줄에 그대로 나와버리네요..

저 URL이 웹 브라우저 히스토리에 남으면 다른 사람이 제 정보를 쉽게 알 수 있겠죠?

신상 털리는거 시간문제 입니다.


처음에 form엘리먼트의 애트리뷰트중 method애트리뷰트를 기억하시나요?

신상이 털리기 싫으시다면( 물론 싫으실꺼에요) post방식으로 바꿔주어야합니다.


get방식으로 입력된 데이터들은 지금과 같이 URL뒤에 입력된 값들이 붙어서 전송됩니다.

하지만 url의 길이에는 한계가 있기 때문에 만약 데이터가 아주 큰 경우라면 문제가 됩니다.

또한 보안상으로도 좋지 않습니다.

그렇다고 get방식을 무조건 사용하면 안된다는 것은 아닙니다.

프로그래밍을 할 때에 get과 post 중 어떤게 적합한지 판단하여 사용해야 합니다.


여러분은 이제 이 에제를 post로 바꿔보시면 됩니다.^^

방법은 간단합니다

method애트리뷰트의 값을 post로 바꿔 적어 주고

서블릿클래스의 doGet메소드를 doPost메소드로 바꾸어 주시기만 하면 됩니다.

결과 사진은 올리지 않겠습니다^^

URL이 꺠끗이 나오고

음...

한글 어떠세요? ㅎㅎ

결과화면 잘 나오시나요?


한글로 입력된 데이터값이 깨져서 출력될겁니다.


이렇게 post방식을 사용하면서 한글을 정확히 출력하기 위해서는

doPost메소드의 첫번째 파라미터를 이용해 setCharacterEncoding메소드를 사용하여야 합니다.


1
req.setCharacerEncoding("UTF-8");
cs
저는 위와 같이 적어주었습니다.

이 메소드는 항상 맨 처음 적어주세요

getParameter메소드보다 반드시 먼저 호출 되어야합니다!!!



적다보니 글이 조금 길어진것 같습니다.

Servlet에 대해서는 여기까지 공부하고, 다음 포스팅부터는 JSP형태로 페이지를 구현해 봅시다^^