[Servlet] 서블릿 바인딩과 API

sang·2024년 2월 10일

바인딩 binding

다른 서블릿 또는 JSP로 대량의 데이터 공유 및 전달

  1. 데이터(자원)를 서블릿 관련 객체에 저장
    HttpServletRequest, HttpSession, ServletContext 객체 등
  2. 저장된 데이터를 서블릿 또는 JSP에 공유해 사용
  • 서블릿에서 직접 전달 필요
    dispatch 방식 사용 가능
  • 클라이언트를 거쳐서 전달 불가
    redirect 방식 사용 불가

관련 메소드

  • setAttribute(String name, Object obj)
    데이터를 각 객체에 바인딩
  • getAttribute(String name)
    바인딩된 데이터를 name으로 가져오기
  • removeAttribute(String name)
    바인딩된 데이터를 name으로 제거


ServletRequest 인터페이스

javax.servlet.ServletRequest

클라이언드와 서블릿 간의 통신에 활용

단일 데이터 바인딩

pro08/src/sec04/ex01/FirstServlet.java

package sec04.ex01;
...

@WebServlet("/first")
public class FirstServlet extends HttpServlet{
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");
    /* 바인딩 */
    request.setAttribute("address", "서울시 성북구");
    /* 포워드 */
    RequestDispatcher dispatch = request.getRequestDispatcher("second");
    dispatch.forward(request, response);
  }
}

pro08/src/sec04/ex01/SecondServlet.java

package sec04.ex01;
...

@WebServlet("/second")
public class SecondServlet extends HttpServlet{
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");
    /* 출력 */
    PrintWriter out = response.getWriter();
    String address = (String)request.getAttribute("address"); //address 가져오기
    out.println("<html><body>");
    out.println("주소:"+address);
    out.println("<br>");
    out.println("dispatch를 이용한 바인딩 실습");
    out.println("</body></html>"); 
  }
}

복수 데이터 바인딩

pro08/src/sec04/ex03/MemberServlet.java

package sec04.ex03;
...

@WebServlet("/member")
public class MemberServlet extends HttpServlet {
  protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    doHandle(request,response);
  }
  protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    doHandle(request,response);
  }
  private void doHandle(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out=response.getWriter();
    MemberDAO dao=new MemberDAO();
    /* 바인딩 */
    List memberList = dao.listMembers();
    request.setAttribute("membersList", membersList);
    /* 포워딩 */
    RequestDispatcher dispatch = request.getRequestDispatcher("viewMembers");
    dispatch.forward(request, response);
  }
}

pro08/src/sec04/ex03/ViewServlet.java

package sec04.ex03;
...
@WebServlet("/viewMembers")
public class ViewServlet extends HttpServlet {
  protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");
    
    PrintWriter out=response.getWriter();
    /* 바인딩 데이터 리스트 가져오기 */
    List membersList = (List) request.getAttribute("membersList");
    out.print("<html><body>");
    out.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
    out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td><td >삭제</td></tr>");
    for (int i = 0; i < membersList.size(); i++) { //받아온 데이터 출력
      MemberVO memberVO = (MemberVO) membersList.get(i);
      String id = memberVO.getId();
      String pwd = memberVO.getPwd();
      String name = memberVO.getName();
      String email = memberVO.getEmail();
      Date joinDate = memberVO.getJoinDate();
      out.print("<tr><td>"+id+"</td><td>"+pwd+"</td><td>"+name+"</td><td>"+email+"</td><td>"+joinDate+"</td><td>"+"<a href = '/pro08/member3?command=delMember&id="+id+"' >삭제 </a></td></tr>"); 
    }
    out.print("</table></body></html>");
    out.print("<a href='/pro08/memberForm.html'>새 회원 등록하기</a");
  } // -> 책에는 없으나 오탈자인 것으로 보임
}


톰캣 컨테이너에 따른 객체 생성

  • ServletContext 객체
    컨텍스트당 생성
  • ServletConfig 객체
    각 서블릿마다 생성


ServletContext 인터페이스

javax.servlet.ServletContext

서블릿과 서블릿 컨테이너 간 통신에 활용
서블릿끼리의 자원 공유 가능

기능

서블릿에서의 파일 접근 기능
자원 바인딩 기능
로그 파일 기능
컨텍스트의 설정 정보 제공 기능

생명 주기

톰캣 컨테이너 실행 시 컨텍스트(웹 애플리케이션)마다 ServletContext 객체 1개 생성
톰캣 컨테이너 종료 시 ServletContext 객체 소멸

메소드

  • getAttribute(String name)
    name을 이용해 value 가져오기
  • getAttributeNames()
    바인딩된 모든 name 반환
  • getContext(String uripath)
    uripath에 해당되는 객체 반환
  • getInitParameter(String name)
    name에 해당되는 매개변수 초기화 값 반환
  • getInitParameterNames()
    컨텍스트 초기화 관련 매개변수 이름들 반환
  • getMajorVersion()
    주요 서블릿 API 버전 반환
  • getRealPath(String path)
    지정한 path에 해당하는 실제 경로 반환
  • getResource(String path)
    지정한 path에 해당하는 Resource 반환
  • getServerInfo()
    실행되고 있는 서블릿 컨테이너의 이름, 버전 반환
  • getServletContextName()
    웹 애플리케이션 이름 반환
  • log(String msg)
    로그 기록하기
  • removeAttribute(String name)
    해당 name으로 바인딩된 객체 제거
  • setAttribute(String name, Object object)
    해당 name으로 객체 바인딩
  • setInitParameter(String name, String value)
    value를 주어진 name으로 컨텍스트 초기화 매개변수로 설정

공통 데이터 바인딩

ServletContext 객체에 데이터 바인딩
애플리케이션 전체의 공통 자원이나 정보를 미리 바인딩
ServletContext 바인딩 데이터는 모든 서블릿에서 접근 가능
모든 사용자가 공통으로 사용하는 데이터에 활용

pro08/src/sec05/ex01/SetServletContext.java

  1. getServletContext()로 ServletContext 객체 가져오기
  2. ServletContext 객체에 데이터 바인딩
package sec05.ex01;
...

@WebServlet("/cset")
public class SetServletContext extends HttpServlet {
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html; charset=utf-8");
    PrintWriter out = response.getWriter();
    
    ServletContext context = getServletContext(); //ServletContext 객체 가져오기
    List member = new ArrayList();
    member.add("이순신");
    member.add(30);
    context.setAttribute("member", member); //데이터 바인딩
    
    out.print("<html><body>");
    out.print("데이터 저장 및 바인딩");
    out.print("</body></html>");
    }
}

pro08/src/sec05/ex01/GetServletContext.java

  1. getServletContext()로 ServletContext 객체 가져오기
  2. ServletContext 객체에 바인딩된 데이터 가져오기
package sec05.ex01;
...

@WebServlet("/cget")
public class GetServletContext extends HttpServlet {
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    
    ServletContext context = getServletContext(); //ServletContext 객체 가져오기
    List member = (ArrayList)context.getAttribute("member"); //데이터 가져오기
    String name = (String)member.get(0);
    int age = (Integer)member.get(1);
    
    out.print("<html><body>");
    out.print(name +"<br>");
    out.print(age + "<br>");
    out.print("</body></html>");
  }
}

결과

/*
1. http://localhost:8090/pro08/cset 요청
데이터 바인딩

2. http://localhost:8090/pro08/cget 요청
바인딩된 데이터를 브라우저에 표시
*/

메뉴 설정

pro08/WebContext/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <context-param>
    <param-name>menu_member</param-name>
    <param-value>회원등록 회원조회 회원수정</param-value>
  </context-param>
  <context-param>
    <param-name>menu_order</param-name>
    <param-value>주문조회 주문등록 주문수정 주문취소</param-value>
  </context-param>
  <context-param>
    <param-name>menu_goods</param-name>
    <param-value>상품조회 상품등록 상품수정 상품삭제</param-value>
  </context-param>
  ...
</web-app>

pro08/src/sec05/ex02/ContextParamServlet.java

package sec05.ex02;
...

@WebServlet(/initMenu)
public class ContextParamServlet extends HttpServlet {
  protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    
    /* param-name 값으로 param-value 값 가져오기 */
    ServletContext context = getServletContext(); //ServletContext객체 가져오기
    String menu_member = context.getInitParameter("menu_member");
    String menu_order = context.getInitParameter("menu_order");
    String menu_goods =context.getInitParameter("menu_goods");
    
    /* 출력 */
    out.print("<html><body>");
    out.print("<table border=1 cellspacing=0><tr>메뉴 이름</tr>");
    out.print("<tr><td>" + menu_member + "</td></tr>");
    out.print("<tr><td>" + menu_order + "</td></tr>");
    out.print("<tr><td>" + menu_goods + "</td></tr>");
    out.print("</tr></table></body></html>");
  }
}

파일 입출력

pro08/WebContent/WEB-INF/bin/init.txt

// 메뉴 항목 입력

pro08/src/sec05/ex03/ContextFileServlet.java

package sec05.ex03;
...

@WebServlet("/cfile")
public class ContextFileServlet extends HttpServlet{
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    
    /* 파일 읽기 */
    ServletContext context = getServletContext();
    InputStream is = context.getResourceAsStream("/WEB-INF/bin/init.txt");
    BufferedReader buffer = new BufferedReader(new InputStreamReader(is));

    /* 문자열 나누기 */
    String menu= null;
    String menu_member = null;
    String menu_order = null;
    String menu_goods = null;
    while((menu=buffer.readLine()) !=null){
      StringTokenizer tokens = new StringTokenizer(menu, ",");
      menu_member=tokens.nextToken();
      menu_order=tokens.nextToken();
      menu_goods=tokens.nextToken();
    }
    
    /* 출력 */
    out.print("<html><body>");
    out.print(menu_member + "<br>");
    out.print(menu_order+ "<br>");
    out.print(menu_goods + "<br>");
    out.print("</body></html>");
    out.close();
  }
}


ServletConfig 인터페이스

javax.servlet.ServletConfig

서블릿 객체마다 생성되어 서블릿에 대한 여러가지 기능 제공
각 서블릿에서만 접근 가능, 공유 불가
서블릿과 동일한 생명주기

  • ServletContext 객체 가져오기
  • 서블릿 초기화

서블릿 초기화

방법1. @WebServlet 애너테이션 이용

@WebServlet 구성 요소

urlPatterns: 서블릿 매핑 이름
name: 서블릿 이름
loadOnStartup: 서블릿 로드 순서
initParams: 매개변수 추가
description: 서블릿 설명

pro08/sec06/ex01/InitParamServlet.java

package sec06.ex01;
...

@WebServlet(name ="InitParamServlet",
            // 복수 매핑 이름 설정
            urlPatterns = { "/sInit","/sInit2" },
            // 복수 매개변수 설정
            initParams = { @WebInitParam(name="email", value="admin@jweb.com"),
                           @WebInitParam(name="tel", value="010-1111-2222") })
public class InitParamServlet extends HttpServlet {
  protected void doGet( HttpServletRequest request , HttpServletResponse response) throws SevletException, IOException {
    response.setContentType( "text/html;charset=utf-8" );
    PrintWriter out = response.getWriter();
    
    // 매개변수 name으로 value 가져오기
    String email = getInitParameter("email");
    String tel = getInitParameter("tel");
    
    out.print( "<html><body>" );
    out.print( "<table><tr>");
    out.print( "<td>email: </td><td>"+email+"</td></tr>");
    out.print( "<tr><td>휴대전화: </td><td>"+tel+"</td>");
    out.print( "</tr></table></body></html>" );
  }
}

방법2. web.xml에 설정

현재는 잘 쓰이지 않는 방식

pro08/WebContent/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
	<servlet>
		<servlet-name>sinit</servlet-name>
		<servlet-class>sec06.ex01.initParamServlet</servlet-class>
        	<!-- 매개변수 설정 -->
        	<init-param>
            	<param-name>email</param-name>
        		<param-value>admin@jweb.com</param-value>
      		</init-param>
      		<init-param>
        		<param-name>tel</param-name>
        		<param-value>010-111-2222</param-value>
      		</init-param>
    </servlet>
    
    <servlet-mapping>
    	<servlet-name>sinit</servlet-name>
      	<url-pattern>/first</url-pattern>
    </servlet-mapping>
</web-app>


*자바 웹을 다루는 기술

profile
CS 메모장

0개의 댓글