쌓고 쌓다

서블릿 애플리케이션과 템플릿 엔진 본문

프로그래밍/JSP & Servlet

서블릿 애플리케이션과 템플릿 엔진

승민아 2023. 7. 24. 13:03

Member (회원 도메인)

@Getter
@Setter
public class Member {

    private Long id;
    private String username;
    private int age;

    public Member() {
    }

    public Member(String username, int age) {
        this.username = username;
        this.age = age;
    }
}

생성자로 이름, 나이를 받는다. 기본 생성자도 존재.

id는 저장소에서 할당함.

 

MemberRepository

public class MemberRepository {

    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;

    private static final MemberRepository instance = new MemberRepository();

    public static MemberRepository getInstance() {
        return instance;
    }

    private MemberRepository() {

    }
    
    ...
}

 

싱글톤 패턴을 위해 MemberRepository의 생성자는 private으로 막아놨다.

이 클래스의 인스턴스는 static으로 하나 생성되며, 접근은 getInstance로만 가져올 수 있다.

 

서블릿 회원 등록 폼

@WebServlet(name="memberFormServlet", urlPatterns = "/servlet/members/new-form")
public class MemberFormServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");

        PrintWriter w = response.getWriter();
        w.write("<!DOCTYPE html>\n" +
                "<html>\n" +
                "<head>\n" +
                " <meta charset=\"UTF-8\">\n" +
                " <title>Title</title>\n" +
                "</head>\n" +
                "<body>\n" +
                "<form action=\"/servlet/members/save\" method=\"post\">\n" +
                " username: <input type=\"text\" name=\"username\" />\n" +
                " age: <input type=\"text\" name=\"age\" />\n" +
                " <button type=\"submit\">전송</button>\n" +
                "</form>\n" +
                "</body>\n" +
                "</html>\n");

    }
}

자바 코드로 HTML을 만들어서 작성해야함으로 번거롭다.

응답의 ContentType은 body에 대한 정보를 설명하는것으로 "text/html"로. 인코딩 타입도 지정해주자.

 

서블릿 회원 저장

@WebServlet(name="memberSaveServlet", urlPatterns = "/servlet/members/save")
public class MemberSaveServlet extends HttpServlet {

    private MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age")); // request.getParameter의 반환은 문자열이다. 변환 필요.

        Member member = new Member(username, age);
        memberRepository.save(member);

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");

        PrintWriter w = response.getWriter();
        w.write("<html>\n" +
                "<head>\n" +
                " <meta charset=\"UTF-8\">\n" +
                "</head>\n" +
                "<body>\n" +
                "성공\n" +
                "<ul>\n" +
                " <li>id="+member.getId()+"</li>\n" +
                " <li>username="+member.getUsername()+"</li>\n" +
                " <li>age="+member.getAge()+"</li>\n" +
                "</ul>\n" +
                "<a href=\"/index.html\">메인</a>\n" +
                "</body>\n" +
                "</html>");
    }
}

Form 데이터로 넘어온 것 또한 쿼리스트링 파라미터 형식이라 getParameter 메서드를 사용할 수 있다.

이때 getParameter의 반환은 문자이므로 age 필드에 저장하기위해 int로 변환이 필요하다.

 

서블릿 회원 목록

@WebServlet(name="memberListServlet", urlPatterns = "/servlet/members")
public class MemberListServlet extends HttpServlet {

    MemberRepository memberRepository = MemberRepository.getInstance();
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Member> members = memberRepository.findAll();

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");

        PrintWriter w = response.getWriter();

        w.write("<html>");
        w.write("<head>");
        w.write(" <meta charset=\"UTF-8\">");
        w.write(" <title>Title</title>");
        w.write("</head>");
        w.write("<body>");
        w.write("<a href=\"/index.html\">메인</a>");
        w.write("<table>");
        w.write(" <thead>");
        w.write(" <th>id</th>");
        w.write(" <th>username</th>");
        w.write(" <th>age</th>");
        w.write(" </thead>");
        w.write(" <tbody>");
        for (Member member : members) {
            w.write(" <tr>");
            w.write(" <td>" + member.getId() + "</td>");
            w.write(" <td>" + member.getUsername() + "</td>");
            w.write(" <td>" + member.getAge() + "</td>");
            w.write(" </tr>");
        }
        w.write(" </tbody>");
        w.write("</table>");
        w.write("</body>");
        w.write("</html>");
    }
}

자바 코드를 사용하여 동적으로 HTML을 생성이 가능하다.

 

 

자바 코드로 HTML을 동적으로 생성하는 방법보다

HTML 문서에 동적으로 바꿀 부분만 자바 코드를 넣는 방법이 더 효율적일 것 같다.

그 방법이 템플릿 엔진이다.

템플릿 엔진은 HTML 필요한 부분에만 코드를 작성하여 동적으로 HTML을 생성할 수 있다.

템플릿 엔진으로 JSP, Thymeleaf 등이 있다.

'프로그래밍 > JSP & Servlet' 카테고리의 다른 글

서블릿, JSP로 MVC 패턴 만들기  (0) 2023.07.29
JSP 애플리케이션과 MVC 패턴  (0) 2023.07.25
HTTP 응답 데이터  (0) 2023.07.22
HTTP 요청 데이터  (0) 2023.07.20
서블릿  (0) 2023.07.19
Comments