제육's 휘발성 코딩
Published 2022. 3. 25. 01:31
[Web] - Servlet, JSP 정리 🔷 Java/web
반응형

Servlet

  • 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램으로 자바 클래스의 일종
  • HttpServlet 를 상속받아 사용
  • JSP와 비슷한 점이 있지만, JSP가 HTML 문서 안에 자바 코드를 포함하고 있는 반면, 서블릿은 자바 코드 안에 HTML을 포함하고 있다.
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/hs")
public class HelloSsafy extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = "sasca";
        // text를 html로 인식 및 utf-8로 인코딩 설정 , PrintWriter 스트림에 연결하기 전에 바꿔줘야된다.
        response.setContentType("text/html;charset=utf-8");  
        PrintWriter out = response.getWriter();
        out.println("");
        out.println("<html>");
        out.println("<body>");
        out.println("Hello!!!<br>");
        out.println("안녕하세요" + name);
        out.println("</body>");
        out.println("</html>");
    }
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost call!!!!");
//        1. data get
        request.setCharacterEncoding("utf-8");
        String name = request.getParameter("username");
        System.out.println(">>>>>>>>>>>>" + name);
        String id = request.getParameter("userid");
        int area = Integer.parseInt(request.getParameter("area"));

//        2. logic >> 인사의 글자색을 서울 : 파랑, 대전 : 오렌지, 구미 : 핑크, 광주 : 초록, 부울경 : 보라
        String color[] = {"blue", "orange", "pink", "green", "purple"};

//        3. response page
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("    <body>");
        out.println("    <h2 style=\"color:" + color[area] + "\">안녕하세요. " + name + "(" + id + ")님!!!</h2>");
        out.println("    </body>");
        out.println("</html>");
    }
  • post 방식은 내부적으로 IO가 일어나기 때문에 request.setCharacterEncoding("utf-8") 을 설정해줘야 한다.

LifeCycle

image

  • Sevlet class 는 class와 다르게 메인 메서드가 없다. 즉 객체의 생성부터 사용의 주체가 사용자가 아닌 Servlet Container(WAS)에게 있다.
  • request 요청이 오면 Servlet Container는 객체를 한번만 생성하고, 초기화도 한번만 하며 요청에 대한 처리를 하게 된다. 필요없어지면 제거하는 일까지 Container가 담당
public class DeptListServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    // Dept 의 list 정보를 받아올 것이 기 때문에 select 구문 사용 즉, Get 방식을 사용하기 때문에 HttpServlet의 doGet을 재정의 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        DeptService deptService = new DeptService();
        try {        
            List<Dept> list = deptService.getDeptList();
            // 리스트를 request에 포함하여 넘겨줄 것이기 때문에 (포워드 방식으로) setAttribute에 키와 값으로 넘겨준다.
            request.setAttribute("deptList", list);
            // 리스트를 보여줄 화면에 값 전달을 위해 포워드 방식으로 전달
            request.getRequestDispatcher("/dept/list.jsp").forward(request, response);

        } catch (SQLException e) {
            e.printStackTrace();
            // 에러페이지 이동 
            request.setAttribute("exception", e);
            request.setAttribute("errorMsg", "부서 목록 조회에 실패하였습니다.");
            request.getRequestDispatcher("/error.jsp").forward(request, response);
            return;
        }
    }
}
  • 컨트롤러(서블렛) -> 서비스 -> DAO -> DB -> DAO -> 서비스 -> 컨트롤러(서블렛)으로 동작한다. (MVC 패턴)
  • 포워드 방식을 적용할 때는 request에 담아서 보낸다.
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    int deptNo = Integer.parseInt(request.getParameter("deptNo"));
    String dName = request.getParameter("dName");
    String loc = request.getParameter("loc");
    DeptService deptService = new DeptService();
    try {
        deptService.modifyDept(new Dept(deptNo, dName, loc));
        response.sendRedirect(request.getContextPath()+"/index.jsp");
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
  • doPost를 재정의할 경우 Http Header에 값을 넣어서 보내기 때문에 별도의 utf-8 설정이 필요하다.
  • 원하는 서비스 요청 수행 후 별도로 값을 보낼 일이 없으면 response에 리다이렉트로 원하는 뷰를 전달한다.

WebServlet

@WebServlet(value = {"/dept/list.do", "/dept/list.ss"}, loadOnStartup = 1)
public class DeptListServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}
  • WebServlet 어노테이션은 톰캣에서 설정해야 할 servlet, servlet-mapping 기능을 대신 수행 해준다. 프로젝트 버전 4.0(이클립스 다이나믹 웹 프로젝트)이상부터 가능
  • 여러 url 을 지정할 경우 {} 를 통해 설정할 수 있다. loadOnStartUp은 컨테이너 시작할 때 우선순위를 두는설정
<servlet>
    <servlet-name>DeptListServlet</servlet-name>
    <servlet-class>com.ssafy.controller.DeptListServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>DeptListServlet</servlet-name>
    <url-pattern>/dept/list.do</url-pattern>
    <url-pattern>/dept/list.ss</url-pattern>
</servlet-mapping>
  • 톰캣에 직접 정의하고 싶은 경우 프로젝트 - WebContent - WEB-INF - lib - web.xml에서 정의 가능

JSP

  • JavaServerPage : HTML내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지를 생성하여 웹 브라우저에 돌려주는 언어. (웹 애플리케이션 서버에서 동작)
  • JSP는 실행 시 자바 서블릿으로 변환된 후 동작하므로 서블릿과 유사. JSTL 등 태그 라이브러리를 사용하면 자바 코딩 없이 태그만으로 사용이 가능하므로 생산성을 높일 수 있다.

JSP 문법

  • Expression, Scriptlet, Declaration, Comment, Directive 총 5가지 방식이 존재

Expression

<td><input type="text" name="deptNo" placeholder="부서번호를 입력하세요" required="required" readonly ="readonly" value="<%=dept.getDeptno()%>"/></td>
  • Expression은 String으로 변환되어 Servlet의 출력에 삽입된다.
  • 동적인 페이지를 생성할 수 있으며, 끝에 세미콜론을 붙이지 않는다.

Scriptlet

<% Dept dept = (Dept) request.getAttribute("dept"); %>
  • 간단한 값이 아닌 조금 복잡한 기능을 수행하고자 할 때 Scriptlet을 사용한다.
  • 임의의 자바 코드를 삽입하여 사용 (세미콜론 사용)
  • 메서드가 아닌 변수만 선언할 수 있다.

Declaration

<%! int age = 0; %>
<%= ++age %>
  • 서블릿 클래스에 삽입되는 메서드나 필드를 정의할 수 있다.

Comment

<%-- comment --%>
  • 주석 처리 방식

Directive

<%@ page attr1="val1" attr2="val2" %>
  • page Directive (<%@ %>) : 컨테이너에게 현재 JSP 페이지를 어떻게 처리할 것인가에 대한 정보
<%@ include file="/template/header.jsp" %>
  • include Directive : 특정 jsp 파일을 페이지에 포함 (정적)
  • 여러 jsp 페이지에서 반복적으로 사용하는 부분을 include (헤더, 푸터 등)
  • jsp:page 도 동일 기능이나, 동적으로 사용 가능하다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • JSTL 또는 커스텀 태그를 이용할 때 사용되며 불필요한 자바 코드를 줄일 수 있다.

예제

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.ssafy.guestbook.model.MemberDto"%>
<%@ include file="/template/header.jsp" %>
    <div align="center">
        <h3>방명록</h3>

<%
    MemberDto memberDto = (MemberDto) session.getAttribute("userInfo");
    if(memberDto == null) {
%>
        <a href="<%= root %>/user?act=mvregister">회원가입</a>
        <a href="<%= root %>/user?act=mvlogin">로그인</a>
<%
    } else { 
%>        
        <strong><%= memberDto.getUserName()%>(<%= memberDto.getUserId() %>)</strong>님 안녕하세요
        <a href="<%= root %>/user?act=logout">로그아웃</a>
        <br>
        <a href="<%= root %>/article?act=list">글목록</a>
<%
    }
%>
    </div>
<%@ include file="/template/footer.jsp" %>
반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^