[필독][기초] / 서블릿 / servlet [part 3]

2016. 1. 5. 14:51language/jsp

파라미터 전송 방법과 전송된 파라미터의 값 얻기
아래 표에서 폼 작성은 사용자로부터 값을 받기 위한 form 양식을 출력하기 위한 HTML 태그를 보여주고 있다.
표에서 서블릿은 form 양식에서 입력받은 파라미터 값을 서블릿에서 가져오기 위한 코드 조각이다.

폼 작성 서블릿
<input type="text" name="addr" /> req.getParameter("addr");
<input type="radio" name="os" value="Windows" />
<input type="radio" name="os" value="Linux" />
req.getParameter("os");
<input type="hidden" name="curPage" value="1" /> req.getParameter("curPage");
<input type="password" name="passwd" /> req.getParamter("passwd");
<textarea name="content" cols="60" rows="12">
</textarea>
req.getParamter("content");
<select name="grade">
  <option value="A">A</option>
  <option value="B">B</option>
  <option value="C">C</option>
  <option value="D">D</option>
  <option value="F">F</option>
</select>
req.getParameter("grade");
<input type="checkbox" name="hw" value="Intel" />
<input type="checkbox" name="hw" value="AMD" />
req.getParameterValues("hw");
<select name="sports" multiple="multiple">
<option value="soccer">축구</option>
<option value="basketball">농구</option>
<option value="baseball">야구</option>
</select>
req.getParameterValues("sports");



getParameter(String name)
ServletRequest 의 getParameter(String name) 메소드는 사용자가 보낸 데이터를 얻기 위해 사용하는 가장 보편적인 메소드이다.
전달되는 데이터는 파라미터 이름과 값의 쌍으로 서버 요소에 전달된다.
 |name|value| 이때 파라미터의 이름은 form 의 서브 엘리먼트(input, textarea, select)의 name 속성값과 같고 value 는 사용자가 입력한 값이다.
getParameter(String name) 인자값으로 파라미터명(input, textarea, select 엘리먼트의 name 속성값)을 전달하면 사용자가 입력하거나 선택한 값을 얻을 수 있다.


input 엘리먼트의 type 속성값이 radio(라디오 버튼)인 의 경우, name 속성값이 같은 라디오 버튼들은 그룹을 형성한다.
그룹내의 라디오 버튼은 그 중 하나만 선택된다.

getParameterValues(String name)
클라이언트 사이드에서 하나의 파라미터명에 여러 개의 값이 전송할 때 서블릿에서 이 데이터를 수신하려면 HttpServletRequest 의 getParamterValues(String name) 메소드를 사용한다.
이 메소드의 리턴 타입은 사용자가 선택한 값들만으로 구성된 String 배열이다.


클라이언트 사이드에서 하나의 파라미터에 값을 여러개 보내려면 체크박스나 multiple 속성값이 "multiple" 인 select 엘리먼트가 사용된다.
체크박스는 input 엘리먼트의 type 속성값이 checkbox 인 것을 말한다.
체크박스는 라디오 버튼과 마찬가지로 name 속성값을 같게 하면 그룹화되는데 라디오 버튼과 다른 점은 그룹내에서 선택을 다중으로 할 수 있다는 것이다.
select 엘리먼트는 일반적으로 값을 하나만 선택할 수 있지만 multiple 속성값이 "multiple" 인 select 엘리먼트는 Ctrl 이나 Shift 버튼을 이용해서 값을 여러개 선택할 수 있다.

getParamterNames()
클라이언트 사이드에서 전송되는 데이터가 어떤 파라미터에 담겨 오는지 알 수 있는 메소드가 HttpServletRequest 의 getParamterNames() 메소드이다.
getParameterNames() 메소드는 파라미터 이름을 접근할 수 있는 Enumeration 타입을 반환한다.


input type="file" 은 파일 업로드에 쓰인다.

type 속성값이 file 인 input 엘리먼트는 이미지와 같은 바이너리 데이터를 서버 사이드로 전송할 때 쓰인다.
이때 form 엘리먼트의 method 속성값은 post 이고 동시에 enctype 속성(속성값이 "multipart/form-data")이 반드시 있어야 한다.
<form action="서버요소" method="post" enctype="multipart/form-data">
업로드하는 파일뿐만 아니라 다른 부가 정보(예를 들면 이름,제목,내용 등등)을 전송해야 한다면 이들 엘리먼트 역시 input type="file" 이 있는 form 안에 같이 위치시키면 된다.
submit 버튼을 누르면 이제까지와는 다른 전송 규약에 의해 서버 요소로 전송된다.
따라서 서버 요소에서는 getParameter() 메소드를 사용하여 데이터에 접근할 수 없다.
서블릿 JSP API를 가지고 바이너리 데이터를 수신하는 방법을 서블릿에 구현할 수 있겠지만 대부분의 경우 외부 라이브러리를 있고 이용한다.
이에 대한 예제는 곧 다룬다.


문자열 전송 예제
회원가입 예제를 통해 사용자가 보낸 데이터를 서블릿에서 수신하는 방법을 실습한다.
이 예제의 목적은 사용자가 보낸 데이터를 확인하는 것이다.
회원가입 양식(form)을 보여주는 HTML 파일을 작성한다.


/example/join.html


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입 폼</title>
</head>
<body>
<h3>회원가입</h3>
<form id="joinForm" action="../RegisterServlet" method="post">
아이디 <input type="text" name="id" /><br />
별명 <input type="text" name="nickname" /><br />
비밀번호 <input type="password" name="passwd" /><br />
이름 <input type="text" name="name" /><br />
<br />
성별<br />
남 <input type="radio" name="gender" value="M" />
여 <input type="radio" name="gender" value="F" /><br />

<br />
생년월일 <input type="text" name="birthyear" style="width: 30px" /> 년
 
<select name="birthmon">
   <option value="0" selected="selected">-월-</option>
   <option value="1">1</option>
   <option value="2">2</option>
   <option value="3">3</option>
   <option value="4">4</option>
   <option value="5">5</option>
   <option value="6">6</option>
   <option value="7">7</option>
   <option value="8">8</option>
   <option value="9">9</option>
   <option value="10">10</option>
   <option value="11">11</option>
   <option value="12">12</option>
</select>

<select name="birthday">
   <option value="0" selected="selected">-일-</option>
   <option value="1">1</option>
   <option value="2">2</option>
   <option value="3">3</option>
   <option value="4">4</option>
   <option value="5">5</option>
   <option value="6">6</option>
   <option value="7">7</option>
   <option value="8">8</option>
   <option value="9">9</option>
   <option value="10">10</option>
   <option value="11">11</option>
   <option value="12">12</option>
   <option value="13">13</option>
   <option value="14">14</option>
   <option value="15">15</option>
   <option value="16">16</option>
   <option value="17">17</option>
   <option value="18">18</option>
   <option value="19">19</option>
   <option value="20">20</option>
   <option value="21">21</option>
   <option value="22">22</option>
   <option value="23">23</option>
   <option value="24">24</option>
   <option value="25">25</option>
   <option value="26">26</option>
   <option value="27">27</option>
   <option value="28">28</option>
   <option value="29">29</option>
   <option value="30">30</option>
   <option value="31">31</option>                   
</select>

<br />

양력 <input type="radio" name="solar" value="Y" checked="checked" />
음력 <input type="radio" name="solar" value="N" /><br />
<br />

휴대전화 <input type="text" name="mobile" /><br />
일반전화 <input type="text" name="tel" /><br />
<br />

주소<br />
<input type="text" name="zipcode1" style="width: 30px" /> -
<input type="text" name="zipcode2" style="width: 30px" /><br />
<input type="text" name="add" style="width: 300px" /><br />
<br />
이메일 <input type="text" name="email" /><br />
이메일수신여부<br />
수신 <input type="radio" name="emailyn" value="Y" checked="checked" />
수신안함 <input type="radio" name="emailyn" value="N" /><br />
<br />
좋아하는 운동<br />
<input type="checkbox" name="sports" value="soccer" />축구<br />
<input type="checkbox" name="sports" value="baseball" />야구<br />
<input type="checkbox" name="sports" value="basketball" />농구<br />
<input type="checkbox" name="sports" value="tennis" />테니스<br />
<input type="checkbox" name="sports" value="tabletennis" />탁구<br />
<br />
복수선택<br />
<select name="focus" multiple="multiple">
          <option value="">-- 복수선택 --</option>
          <option value="java">JAVA</option>
          <option value="jdbc">JDBC</option>
          <option value="jsp">JSP</option>
          <option value="css-layout">CSS Layout</option>
          <option value="jsp-prj">JSP 프로젝트</option>
          <option value="spring">Spring</option>
          <option value="javascript">자바스크립트</option>
</select>
<br />
<br />
자기소개<br />
<textarea name="aboutMe" cols="40" rows="7"></textarea><br />
<input type="submit" value="전송" />
</form>
</body>
</html>


RegisterServlet 서블릿 작성 : 회원 등록처리
데이터를 처리하는 서블릿을 아래와 같이 작성한다.


RegisterServlet.java
package example;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class RegisterServlet extends HttpServlet {
          @Override
          public void doPost(HttpServletRequest req, HttpServletResponse resp)
                              throws IOException,ServletException {
                   
                    resp.setContentType("text/html; charset=UTF-8");
                    PrintWriter out = resp.getWriter();
                    req.setCharacterEncoding("UTF-8");
                   
                    String id = req.getParameter("id");
                   
                    out.println("<html><body>");
                    out.println("id : " + id);
                   
                    String[] sports = req.getParameterValues("sports");
                    int len = sports.length;
                   
                    out.println("<ol>");
                    for (int i = 0; i < len; i++) {
                              out.println("<li>" + sports[i] + "</li>");
                    }
                   
                    out.println("</ol>");
                   
                    String path = req.getContextPath();
                    out.println("<a href=" + path + "/example/join.html>Join</a>");
                    out.println("</body></html>");
          }
}


명령 프롬프트를 열고 위 소스코드가 있는 /WEB-INF/src/exampe 로 이동하여 아래와 같이 컴파일한다.
javac -d C:/www/myapp/WEB-INF/classes ^
-cp "C:/Program Files/Apache Software Foundation/Tomcat 7.0/lib/servlet-api.jar" ^
RegisterServlet.java



다음으로 web.xml 파일을 열고 아래를 추가한다.


web.xml
<servlet>                             
    <servlet-name>RegisterServlet</servlet-name>
    <servlet-class>example.RegisterServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>RegisterServlet</servlet-name>
    <url-pattern>/RegisterServlet</url-pattern>
</servlet-mapping>


톰캣을 재시작 한 후 http://localhost:8989/example/join.html를 방문하여 테스트한다.
ID와 좋아하는 운동외에 사용자가 입력하거나 선택한 값을 확인하는 소스를 서블릿에 추가하고 테스트해 보자.

 

 

참고
http://docs.oracle.com/javaee/7/api/index.html?overview-summary.html
http://www.mkyong.com/servlet/a-simple-httpsessionlistener-example-active-sessions-counter/
http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
http://commons.apache.org/proper/commons-io/download_io.cgi
http://commons.apache.org/proper/commons-fileupload/using.html
http://www.albumbang.com/board/board_view.jsp?board_name=free&no=292
http://www.docjar.com/docs/api/javax/servlet/GenericServlet.html
http://www.java-school.net/jsp/Servlet

 

 

 

도움이 되셨다면 공감을 부탁드립니다. ^^