교육 (Today I Learned)/SeSAC

SeSAC 36일차 / Web Application Programming, Form 태그를 이용한 서블릿 개발, JSP 표준 action

Bay Im 2023. 9. 5. 19:25
SeSAC 36일차(2023-09-05)
Web Application Programming, Form 태그를 이용한 서블릿 개발, JSP 표준 action


 

Web Application Programming

  • 서블릿(Servlet)
    • 서블릿을 Server Side Applet이라 한다.
    • 서블릿은 서버에서 운영된다.
    • javax.servlet.Servlet 인터페이스를 구현하는 객체이다.

 

  • 서블릿 기본 개념도
    • Browser —(request)→ Web Server - DB
    • Browser ←(response)— Web Server - DB

 

  • 서블릿의 API 구조도(HttpServlet)
    • Servlet interface
      • destroy()
      • init()
      • service()
      • getServletInfo()
      • getServletConfig()
    • GenericServlet implements Servlet
      • getInitParameter()
      • getInitParameterNames()
      • getServletContext()
      • getServletName()
    • HttpServletExtends Generic Servlet
      • doGet()
      • doPost()
      • doDelete()
      • deOptions
      • doPut()
      • doTrace()

 

  • Servlet & http package list
    • HttpServlet은 http에 쓰기 편리하도록 만든 GenericServlet을 상속 받은 클래스이다.

 

  • 서블릿의 Life Cycle
    • Servlet Loading
    • init() (자원할당)
      • DB 커넥션을 연다.
      • 파일을 오픈한다.
      • 로그 파일에 로딩된 Servlet 이름을 추가한다.
      • ServletConfig 형의 객체를 받아서 디폴트 설정 값을 저장한다.
    • service() (클라이언트 요청 처리)
      • 한번의 클라이언트 요구마다 하나의 스레드가 생겨서 service() 메소드를 이용
      • service(ServletRequest req, ServletResponse res)
    • destroy() (서비스 중지)
      • 자원 반납(DB 커넥션, 파일 등)

 

  • ServletRequest API
    • 클라이언트의 요청 정보를 가지고 있는 인터페이스
    • 클라이언트의 요청 정보를 얻을 수 있는 메소드 제공
    • 서블릿 엔진은 클라이언트의 요청을 ServletRequest의 객체로 변환해서 서블릿의 service() 메소드의 매개변수로 전달한다. 그리고 ServletRequest 인터페이스를 상속받은 HttpServletRequest 인터페이스는 HTTP 프로토콜을 사용한 클라이언트 요청 정보를 위해 사용된다.
    • ServletRequest 객체에 속성을 저장하고 얻어 오기 위한 메소드
      • void setAttribute(String name, Object o)
        • 이름과 값의 형태로 ServletRequest 객체 내의 속성을 저장
      • Object getAttribute(String name)
        • 주어진 이름의 속성을 객체로 되돌려 준다. 없으면 null 리턴
      • Enumeration getAttributeNames()
        • ServletRequest 객체에 등록된 모든 attribute 들의 이름을 가지고 있는 Enumeration 객체 리턴
      • void removeAttribute(String name)
        • 주어진 이름의 속성을 삭제
    • ServletRequest 객체에서 클라이언트의 요청 정보를 얻을 수 있는 메소드
      • int getContentLenth()
      • String getContentType()
      • String getParameter(String name)
      • Enumeration getParameterNames()
      • String[] getParameter getInputStream()
      • BufferReader getReader()
    • 클라이언트와 서버에 관련된 메소드
      • String getProtocol()
      • String getServerName()
      • int getServerPort()
      • String getRemoteAddr()
      • String getRemoteHost()

 

  • ServletResponse API
    • 서블릿이 클라이언트의 요청을 처리하고 응답을 보내기 위한 인터페이스
    • 출력 스트림 객체 이용 서블릿 실행 결과 response
    • 클라이언트의 요청에 응답하기 위한 메소드 제공
    • 서블릿 엔진은 자동적으로 ServletResponse 인터페이스를 implements 한 객체를 서블릿의 service() 메소드의 매개변수로 제공한다. 그리고 ServletResponse 인터페이스를 상속 받은 HttpServletResponse 인터페이스는 HTTP 프로토콜을 사용하여 클라이언트의 요청에 응답할 때 사용된다.
    • ServletResponse의 주요 메소드
      • void flushBuffer()
        • 버퍼에 있는 내용을 클라이언트에 전송
      • int getBufferSize()
        • 전송할 문자들을 담을 버퍼의 크기 리턴
      • String getCharacterEncoding()
        • 전송할 문자들의 encoding을 리턴
      • ServletOutputStream getOutputStream()
        • Servlet 응답 데이터를 binary 타입으로 보내기 위한 ServletOutputStream 객체가 리턴
      • PrintWriter getWriter()
        • 응답 데이터를 문자로 보내기 위한 PrintWriter 객체가 리턴
      • 그 외 메소드
        • boolean isCommitted()
          • 버퍼에 있는 응답 데이터들이 전송되었으면 true 리턴
        • void reset()
          • 버퍼에 있는 데이터들을 제거
        • void setBufferSize()
          • 버퍼의 크기를 size로 지정
        • void setContentLength(int len)
          • 클라이언트로 전달되는 내용의 크기를 len으로 설정
        • void setContentType(String type)
          • 클라이언트로 전송되는 내용의 MINE 타입을 설정
      <HTML><!-- login.html -->
      <HEAD><TITLE>로그인</TITLE></HEAD>
      <BODY>
      <FORM METHOD=“GET” ACTION=“/test/servlet/ParamTest”>
      이름 <INPUT TYPE=“text” NAME=“name”><BR>
      암호 <INPUT TYPE=“text” NAME=“password”><BR>
      <INPUT TYPE=“submit” VALUE=“로그인”>
      <INPUT TYPE=“reset” VALUE=“취소”>
      </FORM>
      </BODY>
      </HTML>
      
      /* 홍길동, 111 입력 후 전송시 <http://127.0.0.1:8080/test/servlet/ParamTest?name=홍>
      길동&password=111 URL을 통해 넘어온 파라미터 들의 값을 얻기 위하여
      ServletRequest에 정의되어 있는 getParameter(String name) 메소드 사용
      
      public void service(ServletRequest req, ServletResponse res) {
      	…
      	String name = req.getParameter(“name”);
      	int passwd = Integer.parseInt(req.getParameter(“password”));
      	…
      }
      
  • HttpServlet API
    • HttpServlet
      • HTTP 서블릿을 생성할 수 있도록 기능을 제공해주는 추상 클래스
        • ex) class HelloHttpServlet extends HttpServlet{}
      • HttpServlet은 일반적으로 웹 클라이언트로부터 온 요청을 받아서 처리하고, 그 결과를 다시 웹 클라이언트에게 되돌려 주는 작업 수행
    • HttpServlet 메소드
      • HttpServlet 클래스를 상속하는 하위클래스를 작성할 때는 아래의 메소드 중 하나를 반드시 재정의 해줘야 한다.
      • doGet
        • 서블릿이 HTTP GET 요청을 처리하기 위해 재정의한다.
      • doPost
        • 서블릿이 HTTP POST 요청을 처리하기 위해 재정의 한다.
      • doPut
        • 서블릿이 HTTP PUT 요청을 처리하기 위해 재정의한다.
      • doDelete
        • 서블릿이 HTTP DELETE 요청을 처리하기 위해 재정의한다.

 

 

Form 태그를 이용한 서블릿 개발

  • Form 태그
    • Form 태그의 정의
      • 사용자로부터 정보를 얻기 위한 데이터를 받아 들이는 폼을 구성
      • 폼으로 입력된 데이터는 서블릿 또는 CGI 프로그램에서 처리
    • Form의 기능
      • 웹 어플리케이션의 작성의 기초가 되는 부분이며 사용자 인터페이스 제공
      • 사용자로부터 텍스트 데이터를 입력받는다.
      • 몇 개의 선택 사항 중 하나의 선택을 요구
      • 다수개의 정보 항목들을 동시에 수집 가능
      • 사용자가 입력할 수 있는 정보를 제한 가능

 

  • Form 태그 문법
    • <form>~</form>
    • ACTION
      • 폼을 이용하여 사용자가 입력한 데이터를 처리할 서블릿 프로그램(JSP or cgi)을 지정
    • METHOD
      • 서블릿 프로그램에 데이터를 보내는 방법을 지정(get or post)
    • NAME
      • 한 페이지 내에 폼이 여러 개일 경우 각 폼마다 이름을 지정
    <HTML>
    <BODY>
    <H1>회원입력정보</H1>
    	<FORM ACTION="servlet/MemberRegister" METHOD="post">
    		이름: <INPUT TYPE="text" NAME="name">
    		<BR>
    		<INPUT TYPE="submit" value="입력">
    		<INPUT TYPE="reset" value="취소">
    	</FORM>
    </BODY>
    </HTML> 
    

 

  • Form 관련 Input 태그
    • <input> 태그를 이용하여 다양한 입력 사항 결정 가능
    • 태그의 type 속성 지정 가능
      • TEXT
        • 한 줄로 된 텍스트 필드
      • SUBMIT
        • 폼에 채워진 내용을 서버에게 전송
      • RESET
        • 폼의 입력 내용을 디폴트 설정 값으로 채우기
      • PASSWORD
        • 텍스트 박스에 사용자가 입력한 내용이 *로 표시
      • RADIO
        • 라디오 버튼
      • CHECKBOX
        • 체크 박스
      • HIDDEN
        • 화면에 표시되지 않는다. 다음 실행 프로그램에 데이터를 넘겨주기 위해 사용
      • IMAGE
        • 이미지 전송에 쓰인다.
  • <input> 문법
    • type
      • 이 속성에 값으로 지정될 수 있는 타입은 위의 타입이 와야한다.
    • name
      • 입력된 데이터 구분하기 위한 이름으로써 폼데이터 서블릿 전송 http request에서 데이터 구분
    • value
      • 페이지가 제일 처음 브라우저에 호출될 때 기본적으로 설정하고 있는 데이터 지정
    <input 
    	TYPE="gui component type"
    	NAME="폼파라미터 이름"
    	VALUE="디폴트 값">
    </input> 
    
    // ex
    <FORM ACTION="servlet\\MemberRegister" METHOD="POST">
    이름 : <INPUT TYPE="TEXT" NAME="name" VALUE="이름 입력“>
    </FORM>
    
    • text
      • 한 줄의 사용자 정보를 입력받을 수 있는 컴포넌트 표시
    • submit
      • 사용자가 입력한 데이터를 서블릿 프로그래밍으로 전송
    • reset
      • 페이지가 처음 로딩될 때의 기본 설정 값으로 되돌린다.
    <HTML>
    <BODY>
    <H3>회원입력정보</H3>
    	<FORM ACTION="servlet\\MemberRegister" METHOD="POST">
    		이름: <INPUT TYPE="TEXT" NAME="name" VALUE="이름 입력"><BR>
    		나이: <INPUT TYPE="TEXT" NAME="age" VALUE="0"><BR>
    		주소: <INPUT TYPE="TEXT" NAME="address" VALUE="서울시"><BR>
    		<INPUT TYPE="submit" value=입력>
    		<INPUT TYPE="reset" value=취소>
    	</FORM>
    </BODY>
    </HTML>
    

 

실습

  • loginForm
  • loginAction
    1. request.getParameter(”id”, “pwd”)
    2. new Board(id, pwd), new BoardDAO()
    3. db.select(board)
    4. result = 3번의 리턴
    5. viewLogin.jsp ← /jsp:forward
    6. login 완료 (id: ybyb@mt.co.kr, pwd: 1111)

 

JSP 표준 action

JSP에서 자바 소스 코드를 삽입하기 위하여 스크립트 태그 이용

스크립트 태그 종류는 <% %>, <%! %>, <%= %>, <%@ %>이 있다.

  • jsp:useBean
    • Bean 객체를 생성하는 기능 제공
    • 형태
    <jsp:useBean id="name"
    scope="page|request|session|application"
    class="className"
    type="typeName"/>
    
    • type 속성은 class 타입의 객체를 만든 후 다른 형태로 형 변환하고자 할 때 사용할 수 있다. type 값으로는 부모 클래스가 구현하고 있는 인터페이스면 가능
      • ex) Employee emp = new SalesManager(); ⇒ <jsp:useBean id=“emp” scope=“page class=“SalesManager” type=“Employee”/>

 

  • jsp:setPropertyjsp:getProperty
    • Bean 객체의 set 또는 get 메소드를 호출하는 기능 제공
    • 형태
    <jsp:setProperty name="beanName"
    	property="propertName"
    	param="paramName"
    	value="paramValueTestTest"/>
    
    <jsp:getProperty name="beanName"
    	property="propertyName"/>
    

 

  • jsp Bean 만드는 법
    • 클래스 내의 멤버필드는 소문자로 시작
      • public String name=””;
    • 멤버필드에 값을 set하거나 get하는 메소드는 public
      • public void setName(…);
    • 값을 set하는 메소드의 이름은 set+대문자로 시작하는 멤버필드이름
      • public void setName(…);
    • 값을 get하는 메소드의 이름은 get+대문자로 시작하는 멤버필드이름
      • public String getName();
    • 인자가 없는 생성자 메소드를 가지고 있어야 한다. (default 생성자)

 

  • jsp:param
    • 애플릿등의 코드가 실행 시에 참조할 인자들의 이름과 값을 설정하기 위하여 쓰인다.
    • 형태
    <jsp:param name="paramName"
    	value="paramValueTestTest"/>
    
    // ex)
    <jsp:params>
    	<jsp:param name="paramval"
    		value="Hello!! jsp:param" />
    </jsp:params> 
    

 

  • jsp:forword
    • 클라이언트에게서 받은 요청 정보를 다른 jsp에게 넘겨준다.
    • 형태
    <jsp:forword page="path"/>
    
    // ex)
    <jsp:forword page="path">
    	{<jsp:param.../>}
    </jsp:forword> 
    

 

  • jsp:include
    • 다른 jsp의 실행 결과를 포함한다.
    • 형태
    <jsp:include page="path"
    	flush="true"/>
    
    // ex)
    <jsp:include page="path" flush="true">
    	{
    		<jsp:param name="name" value="value"/>
    	}
    </jsp:include>
    
  • jsp:include - 다른 자원 포함
    • <%@ include file=”top.html”%>
      • include 지시자는 해당 파일의 내용을 그대로 삽입한다.
      • 반복적으로 나타내려는 문자들을 간단하게 삽입하려 할 때 사용한다.
    • <jsp:include page=”check.jsp”/>
      • <jsp: include/> action은 해당 자원의 실행 결과를 가져온다.

 

 

오늘의 실습 코드

https://github.com/yubin-im/SeSAC/tree/d8077de746641dfad220bd9ab85f971175c97a3a/20230905

 

728x90