본문 바로가기

카테고리 없음

JSP_1. Servlet

 

* Servlet 이란 ?

: 웹 서비스를 위한 자바 클래스를 말하며 자바를 사용해서 웹페이지를 만들기 위해 필요한 기술이다.

- 사용자의 요청을 받아 처리하고 그에 해당하는 응답페이지를 만들어 
  다시 사용자에게 전달하는 역할을 하는 자바의 클래스
- 즉, 웹에서동적인 페이지를 java로 구현할 수 있게 도와주는 서버측 프로그램(WAS서버에 의해 구동됨)
  java클래스에서 웹 페이지 구현을 위한 HTML이 포함된 구조라고 할 수 있다(Java코드로 HTML을 구현)

 

  <!-- 절대경로 -->  
    action속성의 속성값이 '/'로 시작되는 경우
    : localhost:8081 뒤에 action에 지정한 속성값이 이어붙여지면서 요청이 들어감
  <h3><a href="views/requestTest_GET.html">GET방식 테스트</a></h3>
 	
  <!-- 상대경로 -->
    '/'가 아닌 문구로 시작되는 경우
    : 현재 이 페이지가 보여질 때의 "URL경로"를 기준으로
	  마지막 위치의 /로부터 그 뒤에 action속성의 속성값이 이어붙여지면서 요청이 들어감
  <h3><a href="/servlet/views/requestTest_POST.html">POST방식 테스트</a></h3>

 

 

1. Get방식

특징1. GET방식으로 요청한 데이터는 URL의 header영역에 데이터들을 포함시켜서 요청한다
    => 사용자가 입력한 값이 URL에 노출됨 
    => 보안유지 X 
    => 즉, 로그인이나 회원가입 같은 경우 GET방식으로 작업하는 것이 부적합하다.
			
특징2. Header영역은 전송하는 데이터의 길이에 제한이 있다. 
    => 방대한 데이터를 담았을 경우 초고된 데이터는 절단
    => 즉, 게시판 작성 같이 방대한 데이터가 포함된 경우 GET방식은 부적합하다.
			
특징3. URL에 데이터가 노출되기 때문에 즐겨찾기 기능을 사용하는데 있어서 적합하다.

 

 

 

// 1_Servlet\WebContent\views\requestTest_GET.html 생성하기

<h2>개인정보 입력 - GET</h2>
<form action='/servlet/test1.do' method="get">
  <ul>
    <li>
      <!-- 
          input태그 사용시 key값은 반드시 서버에 넘겨줘야 하는데 key값 설정은 name속성으로 한다 
      -->
        이름 : <input type="text" name="name">
    </li>
    <li>
        성별 : 
        남자 <input type="radio" name="gender" value="M">
	    여자 <input type="radio" name="gender" value="F">
    </li>
    <li>
        나이 : <input type="number" name="age">
    </li>
    <li>
        사는 도시 : 
        <select name="city">
            <option>서울시</option>
            <option>경기도</option>
            <option>강원도</option>
            <option>인천</option>
        </select> 
    </li>
    <li>
        키 : <input type="range" name="height" min="140" max="200">
    </li>
    <li>
        좋아하는 음식(모두 고르시오) :
        한식 <input type="checkbox" name="food" value="한식">
        중식 <input type="checkbox" name="food" value="중식">
        일식 <input type="checkbox" name="food" value="일식">
        양식 <input type="checkbox" name="food" value="양식">
        분식 <input type="checkbox" name="food" value="분식">
    </li>
    <li>
        <input type="submit">
        <input type="reset">
    </li>
  </ul>
</form>

 

// 1_Servlet\src\Servlet 생성하기

@WebServlet("/test1.do")
public class RequestGetServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public RequestGetServlet() {
        super();
    }
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String name = request.getParameter("name");     // "홍길동" or ""
		String gender = request.getParameter("gender");  // "M" / "F" 선택안한 경우 NULL
		int age = Integer.parseInt(request.getParameter("age")); 
        // 무조건 문자열 형태로만 전달되기 때문에 형변환 해줘야함.
		
		String city = request.getParameter("city");
		double height = Double.parseDouble(request.getParameter("height"));
		
        // 체크박스처럼 여러개의 정보를 동일한 키값으로 전달받는 경우 반드시 배열형태로 받아야한다.
		String[] foods = request.getParameterValues("food");
        // 체크박스를 하나도 선택하지 않는다면 null값 반환
		
		System.out.println("name : " + name);
		System.out.println("gender : " + gender);
		System.out.println("age : " + age);
		System.out.println("city : " + city);
		System.out.println("height : " + height);
		
		if(foods == null) {
			System.out.println("foods : 없음");
		} else {
			System.out.println("foods : " + String.join(",", foods));
		}
	
    
       /*
       DB와 상호작용후 결과값을 토대로 사용자가 보게될 화면을 꾸며준다.(일반적인 흐름)
       사용자가 보게될 응답페이지 만들기
	*/
	  // * response 객체를 통해 사용자에게 html(응답화면)을 전달하기
	
        // 1) 출력할 내용은 문서형태의 html파일이고, 문자셋은 utf-8 임을 지정
        response.setContentType("text/html; charset=UTF-8");

        // 2) 응답하고자 하는 사용자와의 스트림을 생성
        PrintWriter out =response.getWriter();

        // 3) 생성된 스트림을 통해 html구문을 출력
        out.println("<html>");
            out.println("<head>");
                out.println("<style>");
                    out.println("h2{color:red}");
                    out.println("#name{color:orange}");
                    out.println("#age{color:yellow}");
                    out.println("#city{color:green}");
                    out.println("#height{color:blue}");
                    out.println("#gender{color:navy}");					
                out.println("</style>");		
            out.println("</head>");
            out.println("<body>");
                out.println("<h2>개인정보 응답 화면</h2>");
                out.println("<span id='name'>"+name+"</span>님은");
                out.printf("<span id='age'> %d </span> 살이며", age);
                out.printf("<span id='city'> %s </span>에 사는", city);
                out.printf("<span id='height'> %.1f </span>cm 이고", height);
                out.print("성별은 ");
                if(gender == null) {
                    out.print("선택을 안했습니다. <br>");
                }else {
                    out.printf("<span id='gender'>%s</span> 입니다.", gender.equals("M") ? "남자" : "여자");
                }

                out.print("<br>좋아하는 음식은 ");

                if(foods == null) {
                    out.print("없습니다.");
                }else {
                    out.print("<ul>");

                    for(String food : foods) {
                        out.printf("<li>%s</li>", food);
                    }
                    out.print("</ul>");
                }
            out.println("</body>");
        out.println("</html>");
	
	/*
	  장점: java 코드 내에서 작성을 하기 때문에 자바에서 활용가능한 다양한 api를 사용하여 html 코드를 만들 수 있다.
	 
	  단점: 복잡하고, 혹시라도 html페이지를 수정하고자 할때 java코드 내에서 수정이 이루어지기 때문에
	  		수정된 내용을 다시 반영하고자 한다면 서버를 재실행해야한다.
	 */
	
	}

 

 

 

 

 


2. POST방식

특징1. POST방식으로 요청한 데이터는 URL의 Body영역에 데이터를 포함시켜서 요청
	=> 사용자가 입력한 값들이 URL에 노출되지 않는다. 
	=> 보안유지가 가능함 
	=> 로그인이나 회원가입 같은 경우 POST방식이 적합함 
			
특징2. Body영역은 전송하는 길이에 제한이 없음
	=> 게시판 작성 같은 경우 POST방식이 적합함
			
특징3. 즐겨찾기는 가능하나 전달되는 데이터가 URL에 노출되지 않음
		
특징4. 최대 요청받는 시간이 존재해서 페이지 요청 및 대기시간이 있다.

 

 

 

<h2>개인정보 입력 - POST</h2>
   <form action='../test2.do' method="post">
    
    // .. 이하 GET방식과 동일(생략)

 

@WebServlet("/test2.do")
public class RequestPostServlet extends HttpServlet {
   private static final long serialVersionUID = 1L;
    
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        request.setCharacterEncoding("UTF-8");

        String name = request.getParameter("name"); 	
        String gender = request.getParameter("gender");
        int age = Integer.parseInt(request.getParameter("age"));	
        String city = request.getParameter("city");
        double height = Double.parseDouble(request.getParameter("height"));
        String[] foods = request.getParameterValues("food");	

        /*
            요청처리 : Service - DAO - SQL문 실행

            위의 요청처리를 다 했다는 가정하에 사용자가 보게될 응답페이지 출력

            - 순수 Servlet : Java코드 내에 html코드를 작성
            - JSP(Java Server Page) : html내에 Java코드를 쓸 수 있는 기술

            응답페이지 만드는 과정을 JSP에게 위임(forward)
            단, 응답화면에서 필요로 하는 데이터들을 꾸미기 위해 JSP에게 필요한 데이터를 넘겨줘야 함.
            => request에 attribute영역에 담아서 보내준다.
                (attribute는 Object이기 때문에 모든 자료형을 받아준다)
        */

        // request.setAttribute("키", "밸류"); // 키=String, 밸류=Object
        request.setAttribute("name", name);
        request.setAttribute("gender", gender);
        request.setAttribute("age", age);
        request.setAttribute("city", city);
        request.setAttribute("height", height);
        request.setAttribute("foods", foods);

        // 위임시 필요한 객체
        // 1) 응답하고자 하는 뷰를 선택하면서 RequestDispatcher객체 생성
        RequestDispatcher view = request.getRequestDispatcher("views/responsePage.jsp");

        // 2) 포워딩(JSP에게 위임)
        view.forward(request, response);
	}

}

 

 

// Servlet에서 위임한 responsePage.jsp 작성하기

<%
	// 이 구문은 스클립트릿으로 JSP 문서 내에 자바코드를 쓸 수 있는 영역
	// 현재 이 jsp에서 필요로 하는 데이터들 request의 attribute에 담겨있음
	// request.getAttribute("키값") : Object
	// Object 형식에서 내가 받고자 하는 자료형으로 강제형변환해서 담아주면 된다.
    
	String name = (String) request.getAttribute("name");
	int age = (int) request.getAttribute("age");
	String gender = (String) request.getAttribute("gender");
	String city = (String) request.getAttribute("city");
	double height = (double) request.getAttribute("height");
	String[] foods = (String[]) request.getAttribute("foods");
%>
<head>
    <style>
        h2{color:red;}
        span{font-weight:bold;}
        #name{color:orange;}
        #age{color:yellow;}
        #city{color:green;}
        #height{color:navy;}
        #gender{color:blue;}
        li{color:purple;}
    </style>
</head>

<body>
	<h2>개인정보 응답화면</h2>
	
	<span id = 'name'><%= name %></span>님은
	<span id = 'age'><%= age %></span>살이며,
	<span id = 'city'><%= city %></span>에 사는,
	<span id = 'height'><%= height %></span> cm이고
	
	성별은
	<% if(gender == null) { %>
		선택을 안했습니다. <br>
	<%} else { %>
		<span id = 'gender'><%= gender.equals("M") ? "남자" : "여자" %></span>
	<% } %>
	
	좋아하는 음식은
	<%
	if (foods == null) {
		out.print("없습니다.");
	
	} else {
		out.print("<ul>");
		for(String food : foods){
			out.print("<li>"+food+"</li>");
		}
		out.print("</ul>");
	}
	%>
</body>