ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 서블릿(Servlet) 예제
    Web/Servlet 2018. 9. 4. 17:00

    java와 jsp 두가지 언어가 혼합되어 있는 코드 작성 방식을 Model 1이라고 한다. 코드가 길어지면 굉장히 복잡해져 알아보기 힘들어지는 경우가 빈번하다. 이를 극복하기 위해 jsp와 java를 분리하려는 시도를 했고, 그 결과 등장한 객체가 서블릿(servlet)이다.


    Client는 URL을 통해 원하는 파일의 정보를 요청(Request)한다. 이때 Tomcat은 
    Client로부터 받은 URL을 통해 서버에 요청한 파일이 있는지 없는지 확인하고 그에 대한 결과를 Client에 반환(Response)하는 역할을 한다. 이것이 HTTP의 기본 동작 원리이다. 이러한 요청들 중 특정 url들에 대해서 Web.xml에 등록을 해놓으면 해당 url에 대해서는 Tomcat이 아닌 Servlet을 통해 브라우저에 반환할 내용을 처리해주는 절차를 거치도록 한다. 예제를 통해 확인.

    1. src/main/java의 패키지에서 Servlet 클래스 생성한다.
    패키지 마우스 오른쪽 버튼 - New - Others  클릭

    2. servlet 검색 후 Next

    3. 서블릿 의미에 맞도록 클래스명 짓는다. 작명법은 [기능명]Servlet의 형대를 Camel case로

    4. 해당 서블릿에서 서비스를 담당할 url을 선택해준다. 오늘날 url은 소문자만 사용하는 것이 보통이다. 따라서 url 클릭 후 Edit 버튼 눌러 소문자로 변경해준다.

    5. Pattern을 /list로 설정. "요청 url 중 /list로 끝나는 패턴의 요청이 온다면 해당 서블릿에서 처리를 하겠다"라는 의미이다. OK 눌러 닫은 후 Next

    6. 다음 창은 기본값으로 Finish 클릭. 가장 기본적으로 사용할 메소드들의 골격을 작성해주게 한다. doGet(), doPost() 메소드가 서블릿에 작성되어 있을 것이다. 이를 수정해준다.




    package blog.naver.com.board.web;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ListServlet extends HttpServlet {
    	
    	private static final long serialVersionUID = 1L;
    
        public ListServlet() {
            super();
        }
        
        // url, Link 등을 통해 접속하는 경우 doGet 실행됨.
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setCharacterEncoding("UTF-8"); // 응답의 encoding을 utf-8로 변경
    		
    		request.setAttribute("name", "minwoo"); // 데이터가 jsp 파일에 전달된다.
    		
    		// servlet에서 jsp를 보여주기 위한 절차
    		RequestDispatcher dispatcher = request.getRequestDispatcher("/list.jsp"); // context root에서 해당 파일 
    		// 읽어옴 서비스 수행할 jsp 파일 매핑시켜준다.
    		
    		dispatcher.forward(request, response); // 모든 브라우저에서 jsp 파일 볼 수 있게 돕는 메소드
    	}
    	
    	// 글쓰기, 로그인하기, 댓글 달기등의 요청
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    }
    

    ListServlet 클래스. 이해가 필요한 메소드 및 클래스 설명

    setAttribute : 요청 정보 중 jsp 파일에서 참조해야 할 값이 있다면 그 값을 request 객체에 key, value 형태로 저장할 수 있도록 돕는 메소드. 
    "name"이란 키에 "minwoo" 스트링 value를 담음.
    jsp에서는 EL을 사용해 key인 name으로 값을 가져온다.

    RequestDispatcher : 요청시 부가 정보를 저장해 다시 전송할 수 있도록 돕는 클래스. jsp 파일 등의 브라우저 화면 관련 정보를 설정해 forward 메소드를 통해 전송.




    <%@ page language="java" contentType="text/html; charset=UTF-8" 
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
    </head>
    <body>
    <h1> ${ name } </h1> <%-- name을 key로 가지고 있는 value 값. getAttribute를 의미--%>
    
    <table>
    			<tr>
    				<th>번호</th>
    				<th>제목</th>
    				<th>작성자</th>
    				<th>작성일</th>
    				<th>좋아요</th>
    			</tr>
    </table>
    </body>
    </html>
    

    list.jsp 파일. h1 태그의 ${ name }에 해당하는 값을 서블릿에서 가져와 보여준다. ${ } 는 EL(Expression Language)로 jsp 내에서 사용하면 내부의 키에 해당하는 value를 가져온다. 해당 jsp 파일이 수행되는 서블릿에 key값 중 "name"이 있는지 확인해 그 값이 있으니 그에 해당하는 value 값으로 출력하는 것이다. 이를 통해 jsp에서 Scriptlet을 통해 자바 문법을 사용하는 일을 없앴다. 반복문을 사용하고 싶은 경우 (대표적으로 게시판 목록이 있다) jstl을 사용해 반복문 태그 등을 사용한다.

    http://localhost:8080/board/list 접속 결과. jsp 파일에서 name의 키값인 minwoo가 출력되었고, 이는 Servlet 객체가 처리해줬다. 자바와 jsp 코드가 분리된 것이다.
    중요한 점은 jsp 파일이 Servlet에서 값을 가져와 페이지를 완성시킨다는 것이다. 웹페이지는 다른 페이지의 정보를 가져와 jsp 페이지를 완성시키는 방식으로 구동되는 경우가 빈번하다. 대표적인 경우가 기사 목록에서 하나를 클릭해 그 내용을 보는 경우이다. 서버는 기사 목록 중 유저가 클릭한 정보에 따른 데이터를 읽어와 그에 해당하는 기사를 기반으로 웹페이지 출력의 내용을 바꿔야 한다. 서블릿에 작성해 request 객체에 설정한 값들을  RequestDispatcher에 추가해 전송하는 것이다.




Designed by Tistory.