일흔네 번째 수업

정혅·2024년 11월 28일

더 조은 아카데미

목록 보기
75/76

JSP

out 객체

out 객체의 메서드

  • 출력 메서드는 브라우저에 보이는 데이터를 줄바꿈 하는게 아닌, 태그(head, body)를 줄바꿈으로 낼것인지 아닌지 정하는 것이다. 브라우저에 출력할 데이터를 줄바꿈 하고싶다면 br태그를 사용해야 한다.

pageContext 객체

  • pageContext 객체는 jsp 기본 객체로, jsp 페이지에서 따로 선언하지 않아도 참조하여 사용 가능며, jsp 페이지의 컨텍스트를 나타내며, 주로 다른 내장 객체를 구하거나 페이지의 흐름 제어 그리고 에러 데이터를 얻어낼 때 사용된다.

  • 같은 jsp 페이지 내에서는 서로 값을 공유할 수 있으며, 주요 기능은 다른 기본 객체들을 구할 때 사용하거나 페이지 흐름을 제어할 때 사용된다.


내장 객체의 영역

  1. page 영역

    • 한 번의 웹 브라우저(클라이언트)의 요청에 대해 하나의 jsp 페이지가 호출된다.

    • 웹 브라우저의 요청이 들어오면 이때 단 한 개의 페이지만 대응이 된다. > page영역은 객체를 하나의 페이지 내에서만 공유한다.

    • page영역을 pageContext 기본 내장객체를 사용한다.

      • pageContext라는 객체가 메모리에 로딩된다는 의미로, 이렇게 생성된 pageContext 객체에 정보를 저장하면 해당 페이지 내에서만 사용 가능하다.
  2. request 영역

    • request 영역은 한 번의 웹 브라우저(클라이언트)의 요청에 대해 같은 요청을 공유하는 페이지가 대응된다

    • 웹 브라우저의 한번의 요청에 단지 한 개의 페이지만 요청될 수 있고, 때에 따라 같은 request 영역이면 두 개의 페이지가 같은 요청을 공유할 수 있다. > request 영역을 객체를 하나 또는 두 개의 페이지 내에서 공유할 수 있다.

      • 요청한 페이지와, 요청된 페이지 사이에 request 내장 객체에 정보를 저장가능하다. > 브라우저가 요청할 때 마다 새로운 request 객체가 생성되며, 결과를 받으면 그 요청과 관련된 request 내장 객체가 사라진다.
    • include 액션 태그, forward 액션 태그를 사용하면 request 기본 객체를 공유하게 되어서 같은 request 영역이된다.

    • 주로 페이지 모듈화에 사용된다.

  3. session 영역

    • 하나의 웹 브라우저 당 1개의 session 객체가 생성된다.
    • 즐, 같은 웹 브라우저 내에서는 요청되는 페이지들은 같은 객체를 공유하게 된다.
    • 웹 브라우저를 닫기 전 또는 invalidate()를 이용해 소멸시키기 전까지 페이지를 이동하더라도, 사용자의 정보를 잃지 않고 서버에 보관할 수 있도록 하는 객체로 모든 웹 서버에서 제공된다.
  4. application 영역

    • application 영역은 하나의 웹 어플리케이션 당 1개의 application 객체가 생성된다.
    • 즉, 같은 웹 어플리케이션에 요청되는 페이지들은 같은 객체를 공유한다.
      • 하나의 웹 애플리케이션에 속한 모든 페이지, 그 페이지에 대한 요청, 세션은 모두 하나의 application 영역에 속하게 된다.

page 객체

JSP페이지에 대한 정보를 처리하기 위해 사용된다.

  • JSP 인코딩 방식이나 응답 데이터의 인코딩 방식 설정, 출력 버퍼 크기 설정, 에러 페이지 지정 여부 설정 등의 기능이 존재한다.

    • JSP 컨테이너는 JSP 페이지를 Servlet으로 파싱할 때 이러한 page 디렉티브 정보를 참조하게 된다.

+ contetntType 속성

  • jsp 페이지가 생성할 문서의 타입을 지정한다. > 한글을 표현할 수 없고, charset은 대소문자를 구분하지 않는다.

import 속성

  • java의 import문과 마찬가지로 jsp 페이지에서 사용될 클래스의 패키지를 지정해줄 때 사용한다.
  • jsp 는 Servlet으로 변환되므로 변환된 Servlet 소스를 보면 우리가 알고 있는 import문으로 변경되어 있는것을 알 수 있다.

trimDirectiveWhitespaces 속성

  • jsp는 기본적으로 처리 결과를 출력하게 되면 출력 결과의 첫번째 행에 공백 행이 들어가게 된다. > jsp 디렉티브가 있던 자리로 인해 발생하는 공백인 것이다.

  • <% page language="java" contentType="text/html;" pageEncoding="utf-8" trimDirectiveWhitespaces="true%> : 이렇게 true로 주면 첫 번째 행의 공백이 사라지게 된다.

pageEncoding 속성

  • jsp 소스 파일이 저장될 시 사용될 인코딩을 지정한다. jsp 컨테이너는 jsp를 Servlet으로 파싱할 때 분석을 하게 되는데 이 과정에서 어떤 인코딩을 통해 작성했는지 검사해 해당 캐릭터 셋을 이용해 jsp 페이지의 소스를 읽어들인다.
    • pageEncoding 속성이 없다면, contentType 속성값을 사용한다.

requst 객체

하나의 요청을 처리할 때 사용되는 영역

  • 웹 브라우저에서 jsp 페이지로 전달되는 정보의 모임으로 http 헤더와 http 바디로 구성되어 있다.

    • 웹 컨테이너는 요청된 http 메시지를 통해 HttpServletRequest 객체를 얻어내서, 이로부터 사용자의 요구사항을 얻어낸다.

session 객체

하나의 브라우저와 관련된 영역

  • 웹 브라우저의 요청 시, 요청한 웹 브라우저에 관한 정보를 저장하고 관리하는 내장 객체이다.

  • 웹 브라우저(클라이언트)당 1개가 할당된다.

  • 다른 내장 객체들은 물론 session 객체도 별도의 생성 없이 암묵적으로 생성된다. > page 디렉티브의 session 속성이 true로 설정된다.


application 객체

하나의 웹 어플리케이션과 관련된 영역

  • 웹 어플리케이션의 설정 정보를 갖는 context 와 관련있는 객체로, 웹 어플리케이션과 연관이 있다.

  • 웹 어플리케이션이 실행되는 서버의 설정 정보 및 자원에 대한 정보를 얻어내거나 어플리케이션이 실행되고 있는 동안에 발생할 수 있는 이벤트 로그 정보와 관련된 기능들을 제공한다.


Servlet 저장 영역

  1. page 객체 : 현재 페이지 내에서만 사용할 변수를 저장하는 영역

  2. request 객체 : 요청 객체가 유지되는 영역에서 사용할 변수를 저장하는 영역

  3. session 객체 : 웹 브라우저가 종료되기 전까지나, 세션이 끊어지기 전까지 사용할 변수를 저장하는 영역

    • 클라이언트마다 독립적으로 데이터를 저장하고, 관리할 수 있는 최고 범위의 데이터 저장 영역이다. 여기에 저장되는 데이터는 클라이언트가 웹 브라우저를 종료하기 전까지나 세션이 끊어지기 전까지는 사라지지 않는다.
  4. ServletContext 객체 : 서버가 종료되기 전까지 사용할 변수를 저장하는 영역


web mapping - Servlet

  • service는 get과 post 방식 모두에게 호출 가능하다. 최우선순위이다.

    • get과 post와 service를 모두 호출해도 service가 가장 먼저 호출된다.
package com.superman.www;

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("/Test4")
public class Test4 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public Test4() {
        super();
    }

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

        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>out Test</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<p>service 안녕하세요.</p>");
        out.println("</body>");
        out.println("</html>");
    }

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

        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>out Test</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<p>get 안녕하세요.</p>");
        out.println("</body>");
        out.println("</html>");
    }

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

        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>out Test</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<p>post 안녕하세요.</p>");
        out.println("</body>");
        out.println("</html>");
    }

}

에러 사항 - post <> doPost()

  • service 와 get<>doGet() 은 가능하지만 post는 불가능해 404 에러가 발생한다.
package com.superman.www;

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("/Test3")
public class Test3 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public Test3() {
        super();
    }

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

        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>out Test</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<p>post 안녕하세요.</p>");
        out.println("</body>");
        out.println("</html>");
    }

}

Servlet <> jsp Mapping

  • 어노테이션 방식과 xml 방식으로 매핑 가능하다.

WEB-INF > web.xml 방식

  • xml 파일은 주로 WEB-INF 디렉토리안에 web.xml이라는 이름으로 존재한다.
    • 기존에 존재하는 xml 파일이므로, 이 파일에 작성하고 저장한다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>ServletMapping</display-name> <-- 옵션으로, 필수 요소는 아니 -->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
      <servlet-name>ServletMapping</servlet-name>
      <servlet-class>com.superman.ex.ServletMapping</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>ServletMapping</servlet-name>
      <url-pattern>/ServletMapping</url-pattern>
  </servlet-mapping>

</web-app>
  • <servlet>: 서블릿 클래스를 정의한다. 여기서는 "ServletMapping"이라는 이름의 서블릿이 정의되었다. 이 서블릿은 com.superman.ex 패키지의 ServletMapping 클래스를 사용한다.

  • <servlet-name>: 서블릿의 이름을 지정한다. 이 이름은 해당 서블릿을 식별하는 데 사용된다.

  • <servlet-class>: 서블릿 클래스의 패키지 경로를 포함한 클래스 이름을 지정한다.

  • <servlet-mapping>: 서블릿과 URL 패턴 간의 매핑을 정의한다. 여기서는 앞서 정의한 "ServletMapping" 서블릿에 "/ServletMapping"이라는 URL 패턴을 매핑하였다. 이는 클라이언트가 "/ServletMapping" URL로 요청을 보낼 때 해당 서블릿이 처리하도록 지정한 것이다.


ServletMapping.java 어노테이션 방식

package com.superman.ex;

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("/ServletMapping")
public class ServletMapping extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public ServletMapping() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html; charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet Test</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("Servlet Mapping Test!");
        out.println("</body>");
        out.println("</html>");
    }
}

Cookie - 쿠키

  • 클라이언트 측에서 서버에 데이터를 요청하고 난 후 연결이 끊어졌을 때, 정보를 지속적으로 유지하기 위한 수단이다.
    • 서버에서 생성되며, 클라이언트 측에 특정 정보를 저장시킨다.
  • 클라이언트 측에서 관리되는 정보를 의미한다. <> 세션과 비교해 보면 세션은 서버측에서 관리되지만 쿠키는 클라언트에 정보가 저장된다.
  • 쿠키는 하드디스크에 파일로 저장되기 때문에 파일이 존재하는 한 항상 유지된다.
    • 그러나 클라이언트에서 관리되기 때문에 보안적으로 매우 취약하다

확인 방법

  • 사이트에서 f12로 개발자모드를 켜서 application > Storage > Cookies 사이트를 선택해서 확인 가능하다.

-Set : setMaxAge(), setPath(), setValue(), setVersion()
-Get : getMaxAge(), getName(), getPath(), getValue(), getVersion()


  • 쿠키 생성 -> 속성 설정 -> response 객체에 쿠키 탑재

setCookie.jsp

<%
Cookie cookie = new Cookie("id", "hong");
cookie.setMaxAge(60*60);    // 초 단위 - 1시간 
response.addCookie(cookie); // 쿠키 추가
%>

getCookie.jsp

  • 쿠키를 받아오고, 쿠키의 길이만큼 이름값을 검사해줄 수 있다.
  <%
    Cookie[] cookies = request.getCookies(); //쿠키를 받아온다.
    for(int i = 0 ; cookies != null && i < cookies.length; i++){
        String str = cookies[i].getName(); //String 형태로 반환
        if(str.equals("id"){
            out.println("cookies[" + i  + "] name = " + cookies[i].getName());
            out.println("cookies[" + i  + "] value = " + cookies[i].getValue());
        }
    }
  %>

delCookie.jsp

  • setMaxAge(0) : max age를 0으로 설정하면 삭제된다. >> 마지막에 이 변동사항을 다시 response 객체를 통해 갱신해주는 것을 잊지 않아야 한다.
<%
Cookie[] cookies = request.getCookies();
    for(int i = 0 ; cookies != null && i < cookies.length; i++){
        String str = cookies[i].getName();
        if(str.equals("id"){
            cookies[i].setMaxAge(0); //0 으로 max age 를 설정해줘서 삭제해준다.
            response.addCookie(cookies[i]);
        }
}
%>

Cookie를 이용해 아이디 기억하기 옵션 생성

CookieTest01 서블릿을 만들고 이 안에서 아이디, 비밀번호, 그리고 아이디 기억하기 체크 박스를 만든다. 로그인 버튼을 누르면 CookieTest02로 이동하게끔 파일을 만들자.
그리고 CookieTest02 에서 다음과 같이 출력하도록 하고
"hong님 환영합니다.(1234)"
CookieTest01페이지로 갈 수 있는 링크도 같이 만들어주자.
그리고 아이디 기억하기가 체크가 되어있으면 아이디를 쿠키에 저장하도록 하고 쿠키의 유효기간은 1년으로 하자.
아이디 기억하기 체크박스가 체크가 안되어 있으면 쿠키를 만료시키자.

내 풀이

LoginMain.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="javax.servlet.http.Cookie"%>
<%@ page import="javax.servlet.http.HttpServletRequest"%>
<%
    String username = "";
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if ("id".equals(cookie.getName())) {
                username = cookie.getValue();
                break;
            }
        }
    }
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>로그인 화면 - 쿠키</title>
</head>
<body>
    <form action="CookieTest01" method="post">
        아이디 <input type="text" name="id" value="<%= username%>"><br> 비밀번호 <input
            type="password" name="password"><br> <label> <input type="checkbox"
            name="memoryId">아이디 기억하기
        </label> <input type="submit" value="로그인">
    </form>
</body>
</html>
  • 스크립트릿을 이용해서 쿠키를 받아와, Name이 id라면 해당 값을 username에 넣어 로그인 폼에서 아이디 폼 칸에 들어갈 수 있도록, 표현식으로 작성해준다.

CookieTest01.java - 쿠키 생성

package com.ironMan.www;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

    public CookieTest01() {
        super();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String remember = request.getParameter("memoryId");
        String id = request.getParameter("id");

        Cookie cookie = new Cookie("id", request.getParameter("id"));// id는 쿠키 이름 / 폼에서 받아온 id는 값으로 저장
        if (remember != null && remember.equals("on")) {
            cookie.setMaxAge(60 * 60 * 24 * 365); // 쿠키 유효기간 1년 설정
            response.addCookie(cookie); // 클라이언트로 쿠키를 전송
        } else {
            cookie.setMaxAge(0); // 아이디 기억하기가 안눌렸으면 쿠키 삭제
        }
        response.addCookie(cookie);
        response.sendRedirect("CookieTest02?id=" + id); // 서블릿으로 리다이렉트
    }

}
  • doPost로 폼을 받아와서, 해당 아이디로 쿠키를 생성해주고, 아이디 기억하기 버튼이 체크되어 있다면, 쿠키 유효기간을 1년으로 설정한 후 클라이언트로 쿠키를 전송한다.
  • 만약 아이디 기억하기에 체크가 되어있지 않다면 생성한 쿠키를 Maxage를 0을 줘서 삭제해 갱신시켜준 후 CookieTest02로 해당 아이디와 함께 보내준다.
  • "CookieTest02?id=" + id : 리다이렉트 할 서블릿을 가리키고, id라는 쿼리 파라미터를 포함 시켜 리다이렉트된 페이지에서 이 파라미터를 사용해 사용자의 아이디를 가져올 수 있게 한다.

CookieTest02.java - 로그인 후 보일 화면

package com.ironMan.www;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

    public CookieTest02() {
        super();
    }

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

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    private void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String userName = "";
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("id")) {
                    userName = cookie.getValue();
                    break;
                }// else {
                   // userName = request.getParameter("id");
                //} > 이렇게 else에 하게되면 id가 아닌 값들은 모두 해당 id로 들어가서 아래 if문으로 사용 
            }
        }
        if(userName == null) { //아이디 기억하기를 체크하지 않았을 때만 
            userName = request.getParameter("id");
        }
        // 화면 출력
        response.setContentType("text/html; charset=UTF-8");//인코딩 설정 

       //PrintWriter를 얻은 후 출력할 때는 별도의 인코딩이 필요없는데 어차피 위에서 인코딩해줬기 때문에 잘 출력된다.
        PrintWriter out = response.getWriter(); 
        out.println("<!DOCTYPE html>");
        out.println("<html lang=\"en\">");
        out.println("<head>");
        out.println("<meta charset=\"UTF-8\">");
        out.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">");
        out.println("<title>Welcome</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>" + userName + "님 환영합니다.(1234)</h1>");
        out.println("<a href=\"LoginMain.jsp\">LoginMain 페이지로 이동</a>");
        out.println("</body>");
        out.println("</html>");
    }

}

선생님 풀이

CookieTest01.java

package come.superman.www;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

    public CookieTest01() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();
        Cookie[] cookies = request.getCookies();


        boolean flag = false;
        String id = null;
        if(cookies != null)
        {
            for(int i=0;i<cookies.length;i++)
            {
                String cookieName = cookies[i].getName();
                if(cookieName.equals("id"))
                {
                    flag = true;
                    id = cookies[i].getValue();
                    break;
                }
            }
        }
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Cookie Test</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<form method='post' action='CookieTest02'>");        
        out.println("<table>");    
        out.println("<tr><td>아이디</td><td><input type='text' name='id'");
        if(flag)
            out.println("value='" + id + "'");
        out.println("></td></tr>");
        out.println("<tr><td>비밀번호</td><td><input type='text' name='pw'></td></tr>");
        out.println("<tr><td colspan='2'><input type='checkbox' name='remID'");
        if(flag)
            out.println("checked");
        out.println("value='rememberID'> 아이디 기억하기</td></tr>");
        out.println("<tr><td colspan='2'><input type='submit' value='로그인'></td></tr>");
        out.println("</table>");        
        out.println("</form>");        
        out.println("</body>");
        out.println("</html>");
    }
}

CookieTest02.java

package come.superman.www;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

    public CookieTest02() {
        super();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();    

        String id = request.getParameter("id");
        String pw = request.getParameter("pw");
        String remID = request.getParameter("remID");    

        if(remID != null && remID.equals("rememberID"))
        {
            Cookie cookie = new Cookie("id", id);
            cookie.setMaxAge(60*60*24*365);
            response.addCookie(cookie);
        }
        else //아이디 기억하기가 체크되어 있지 않다면 쿠키 삭제 
        {
            Cookie[] cookies = request.getCookies();
            if(cookies !=null)
            {
                System.out.println("쿠키삭제"); //디버깅 용도로 콘솔창에 출력 
                for(int i=0;i<cookies.length;i++)
                {
                    String cookieName = cookies[i].getName();
                    if(cookieName.equals("id"))
                    {
                        cookies[i].setMaxAge(0);
                        response.addCookie(cookies[i]);
                        break;
                    }
                }                
            }
        }
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Cookie Test</title>");
        out.println("</head>");
        out.println("<body>");
        out.println(id +"님 " + "환영합니다. (" + pw + ")<br>");
        out.println("<a href='CookieTest01'>CookieTest01 페이지</a>");
        out.println("</body>");
        out.println("</html>");
    }
}

Servlet

  • Servlet을 상속받는 애들이 Servlet

예제 1 - 세션

  • 어노테이션이 없으니 web.xml로 매핑한 것을 알 수 있다.

SesArea_01.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.*;//Calendar 클래스 사용을 위해...

public class Round15_02_SesArea_01 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        request.setAttribute("data1", "홍길동");
        //request scope에 data1이라는 이름으로 문자열 저장

        HttpSession session = request.getSession(true);
        //request 객체로 부터 session 객체 획득
        //매개변수 true는 새로운 Session을 생성하라는 의미
        session.setAttribute("data2", "자바");
        //session scope에 data2라는 이름으로 문자열 저장
        Calendar data3 = Calendar.getInstance();
        //오늘 날짜를 위한 Calendar 객체 생성
        session.setAttribute("data3", data3);
        //session scope에 data3이라는 이름으로 오늘 날짜의 Calendar 객체 저장

        ServletContext context = this.getServletContext();
        RequestDispatcher dispatcher = context.getRequestDispatcher("/Servlet02_02");
        dispatcher.forward(request, response);
        //Servlet02_02 이름으로 맵핑된 주소로 forward
    }
}
  • forward를 이용하면 request, response객체를 가지고이동하기 때문에 모든 값을 가지고 이동 가능 > 주소값은 바뀌지 않는다.

SesArea_02.java

단축키 업데이트 … 202481일 목요일부터 첫 글자를 탐색할 수 있도록 Drive 단축키가 업데이트됩니다.자세히 알아보기
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.*;//Calendar 클래스 사용을 위해...
import java.text.*;//SimpleDateFormat 클래스 사용을 위해...

public class Round15_02_SesArea_02 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    //forward에 의한 이동이므로 Get방식 메서드 호출
        String data1 = (String)request.getAttribute("data1");
        //request scope에 data1이라는 이름으로 설정된 데이터 추출
        HttpSession session = request.getSession();
        //request 객체로 부터 session 객체 획득
        String data2 = (String)session.getAttribute("data2");
        //session scope에 data2라는 이름으로 설정된 데이터 추출
        Calendar data3 = (Calendar)session.getAttribute("data3");
        //session scope에 data3이라는 이름으로 설정된 데이터 추출
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //날짜 출력을 위한 format 클래스 객체 생성
        String data4 = format.format(data3.getTime());
        //날짜 출력을 위한 format 변환

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

        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html><body>");

        out.println("data1 = " + data1 + "<br/>");
        out.println("data2 = " + data2 + "<br/>");
        out.println("data3 = " + data4 + "<br/><br/>");
        //각 데이터 출력

        out.println("<a href='Servlet02_03'>다음페이지로</a>");
        //다음 페이지로 이동하여 request scope의 데이터는 더 이상 존재하지 않는다는 것을 확인
        //session scope의 데이터는 웹 페이지가 사라질 때 까지 존재...

        out.println("</body></html>");
    }
}
  • request.response객체가 새로 생성되서 request.getAttribute() 해서 값을 가져오려 하면 null이 될것이다.

  • session.getAttribute() 해서 값을 가져 오는것은 값이 존재한다

    • session 만료의 기준은 메소드로 종료하거나, 브라우저를 껐을 때 만료되기 때문에 위에서 java를 가져올 수 있는 것이다.

SesArea_03.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.*;//Calendar 클래스의 사용을 위해...
import java.text.*;//SimpleDateFormat 클래스의 사용을 위해...

public class Round15_02_SesArea_03 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    //<a> 태그에 의한 호출이므로 doGet() 메서드 호출

        String data1 = (String)request.getAttribute("data1");
        //request scope에 data1이라는 이름으로 설정된 데이터 추출
        HttpSession session = request.getSession();
        //request 객체로 부터 session 객체 획득
        String data2 = (String)session.getAttribute("data2");
        //session scope에 data2라는 이름으로 설정된 데이터 추출
        Calendar data3 = (Calendar)session.getAttribute("data3");
        //session scope에 data3이라는 이름으로 설정된 데이터 추출
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //날짜 출력을 위한 format 클래스 객체 생성
        String data4 = format.format(data3.getTime());
        //날짜 출력을 위한 format 변환

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

        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html><body>");

        out.println("data1 = " + data1 + "<br/>");
        //null 값 출력
        out.println("data2 = " + data2 + "<br/>");
        out.println("data3 = " + data4 + "<br/><br/>");
        //각 데이터 출력

        out.println("</body></html>");
    }
}

예제 2 : 애플리케이션 영역

  • 서버를 종료하기 전까지 어플리케이션 영역은 살아있다. > 세션은 브라우저를 닫으면 소멸 또는 invalidate() 를 이용해 소멸

  • ServletContext는 웹 애플리케이션 영역의 일부로써, 웹 애플리케이션 전체에 대한 정보를 제공한다. > 웹 애플리케이션의 생명주기 동안 유지되며, 모든 서블릿 및 jsp 파일에서 공유된다.

    • Servlet은 SetvletContext를 통해서 웹 애플리케이션 영역의 리소스에 액세스 할 수 있다. > 초기화 매개변수를 읽거나, 리소스를 로드하거나, 다른 서블릿에 데이터를 전달할 수 있다.

ServletContext_01.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Round15_04_ServletContext_01 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        String intro = "안녕하세요! 우리 서버에 오신것을 환영합니다.";
        //서버에 접속하는 모든 이들을 위한 인사 메시지이다.

        ServletContext context = this.getServletContext();
        //ServletContext의 객체를 생성한다.
        context.setAttribute("intro", intro);
        //ServletContext 영역에 intro 객체를 저장한다.
        //이렇게 저장된 데이터는 이 서버에 접속된 사용자 누구나 볼수 있게 된다.
        //서버가 종료 되어야 비로소 사라지게 된다.        

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

        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html><body>");
        out.println("ServletContext 데이터 생성 완료!");
        out.println("</body></html>");
    }
}

ServletContext_02.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Round15_04_ServletContext_02 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

        ServletContext context = this.getServletContext();
        //ServletContext 객체를 생성한다.
        String intro = (String)context.getAttribute("intro");
        //ServletContext 영역에서 intro라는 key로 저장된 객체를 획득한다.

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

        PrintWriter out = response.getWriter();

        out.println("<!DOCTYPE html>");
        out.println("<html><body>");
        out.println("서버의 인사말 = " + intro);
        //intro로 저장된 내용을 출력해 본다.
        //이 예제를 여러 대의 컴퓨터에서 실행해 보면 동일한 값을 출력한다는 사실을 알수 있을 것이다.
        out.println("</body></html>");
    }
}

위 예제에서 사용한 web.xml

  • servlet-class 는 패키지 이름까지 포함한 풀 네임으로 가져와야 한다. > 위 예제들은 패키지 이름 생성을 안해서 없는 것임
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>TestArea</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

    <servlet>
        <servlet-name>My01_01</servlet-name>
        <servlet-class>Round15_01_ReqArea_01</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>My01_02</servlet-name>
        <servlet-class>Round15_01_ReqArea_02</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>My02_01</servlet-name>
        <servlet-class>Round15_02_SesArea_01</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>My02_02</servlet-name>
        <servlet-class>Round15_02_SesArea_02</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>My02_03</servlet-name>
        <servlet-class>Round15_02_SesArea_03</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>My03_01</servlet-name>
        <servlet-class>Round15_03_Cookie_01</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>My03_02</servlet-name>
        <servlet-class>Round15_03_Cookie_02</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>My04_01</servlet-name>
        <servlet-class>Round15_04_ServletContext_01</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>My04_02</servlet-name>
        <servlet-class>Round15_04_ServletContext_02</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>My01_01</servlet-name>
        <url-pattern>/Servlet01_01</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>My01_02</servlet-name>
        <url-pattern>/Servlet01_02</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>My02_01</servlet-name>
        <url-pattern>/Servlet02_01</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>My02_02</servlet-name>
        <url-pattern>/Servlet02_02</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>My02_03</servlet-name>
        <url-pattern>/Servlet02_03</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>My03_01</servlet-name>
        <url-pattern>/Servlet03_01</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>My03_02</servlet-name>
        <url-pattern>/Servlet03_02</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>My04_01</servlet-name>
        <url-pattern>/Servlet04_01</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>My04_02</servlet-name>
        <url-pattern>/Servlet04_02</url-pattern>
    </servlet-mapping>  
</web-app>

정리 문제

  1. 서블릿에서 데이터를 저장하는 영역? 그리고 그 범위에 대해 설명하시오.

    • page 객체 : 현재 페이지 내에서만 사용할 변수를 저장하는 영역

    • request 객체 : request 객체가 유지되는 영역에서 사용할 변수를 저장하는 영역

    • session 객체: 웹 브라우저가 종료되기 전까지나 세션이 끊어지기 전까지(invalidate()) 사용할 변수를 저장하는 영역

    • ServletContext 객체 : 서버가 종료되기 전까지 사용하라 변수를 저장하는 영역이다.

    이들 각 영역에 저장된 데이터를 사용해서 여러 페이지에 걸쳐 필요한 범위까지 변수를 선언할 수 있다.

  2. 쿠키(Cookie)에 대해 설명하시오.

    • 쿠키 데이터는 위에서 말한 데이터 저장 영역의 데이터와는 달리 클라이언트에 저장하는 데이터이다.

    • 사용자별로 관리해야 하는 데이터 중 비중이 낮은 데이터를 굳이 서버에서 관리하여 부하를 늘릴 필요가 없다. > 이런 데이터를 서버는 클라이언트의 Cookies 폴더에 저장했다가 필요할 때 다시 꺼내서 사용한다.

      • ex) 사용자의 로그인 ID를 쿠키로 저장했다가 사이트에 접속할 때 사용자 정보를 꺼내서 사용하는 것이다.
  3. request.getSeesion(true); <> request.getSession(false); <> request.getSession(); 이 세 메소드의 차이점은?

    • getSession(true)getSeesiont() : 세션이 이미 있는지 확인해, 이미 있다면 해당 세션을 HttpSession 객체로 반환시키고, 없으면 새로운 세션을 생성한다.

    • getSession(false) : 세션이 있다면 그 세션을 리턴하지만 세션이 존재하지 않는다면 null을 반환한다.

    인자에 true를 주면 기존의 세션이든 새로운 세션이든 무조건 세션을 받아오지만, false를 주게되면, 세션이 있을 경우에만 세션을 리턴하므로 반드시 null을 체크해야한다.


  1. 요청 객체자체에 data1에 문자열 "java"를 저장하고 data2에 Vector<String>을 저장하고 그 Vector 객체에 "C"와 "C++"를 추가하도록 하자. 그리고 요청 객체에 질의로 data3에 "string"과 data4에 "ok"를 forward로 보내자. 서블릿 클래스 이름은 RequestSend라고 하고 forward 되는 곳의 클래스 이름은 RequestReceive 로 하도록 하자.
    그리고 RequestReceive에서 모든 Data 들의 값을 출력하자.

    중요 : 요청 객체의 질의로는 문자열만 전송할 수 있지만 요청 객체 자체에는 객체를 저장할 수 있다는 것이다.

//RequestSend.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.*;//Vector 사용을 위해...

public class RequestSend extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        //여기는 웹 페이지의 내용 작성 없이 바로 다음 페이지로 넘어 간다.

        String data1 = new String("java!");
        //문자열 데이터를 작성한다.
        Vector<String> data2 = new Vector<String>();
        //Vector 객체를 생성하고
        data2.add("c");        
        data2.add("c++");
        //두개의 문자열을 추가한다.

        request.setAttribute("data1", data1);
        //request scope에 data1 이라는 이름으로 문자열 데이터를 저장한다.
        request.setAttribute("data2", data2);
        //request scope에 data2 라는 이름으로 Vector 데이터를 저장한다.

        ServletContext context = this.getServletContext();
        //ServletContext 객체를 생성한 후
        RequestDispatcher dispatcher = context.getRequestDispatcher("/RequestReceive?data3=string&data4=ok");
        //forward를 위한 RequestDispatcher 객체를 생성한다. 
        //객체 생성시 주소줄에 Query String으로 data3=string&data4=ok 라는 문자열을 넣어 준다.(문자열만 가능하다.)
        dispatcher.forward(request, response);
        //Servlet01_02 라는 주소로 forward 이동한다.
        //forward 이동은 sendRedirect와는 다르게 저장된 모든 값을 가지고 이동한다.
    }
}

//RequestReceive.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.*;//Vector를 사용하기 위해..

public class RequestReceive extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    //forward 전송을 받기 위해서 doGet 메서드를 사용해야 한다.(Get 방식의 전송이다.) 

        String data1 = (String)request.getAttribute("data1");
        //request scope에 data1이라는 이름으로 저장된 문자열 데이터 추출
        Vector<String> data2 = (Vector<String>) request.getAttribute("data2");
        //request scope에 data2라는 이름으로 저장된 Vector 데이터 추출
        String data3 = request.getParameter("data3");
        //Query String으로 넘어온 data3이라는 이름의 문자열
        String data4 = request.getParameter("data4");
        //Query String으로 넘어온 data4라는 이름의 문자열

        response.setContentType("text/html;charset=utf-8");
        //출력 객체에 대한 Encoding 처리
        response.setCharacterEncoding("utf-8");        

        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<body>");

        out.println("data1 = " + data1 + "<br/>");

        out.println("data2 = ");
        for(int i = 0; i < data2.size(); ++i) {
            out.println(data2.get(i) + "  ");
        }
        //Vector 속에 들어 있는 모든 데이터 출력...
        //Generic으로 인해 String 형변환 필요 없이 출력 가능...

        out.println("<br/>");
        out.println("data3 = " + data3 + "<br/>");
        out.println("data4 = " + data4 + "<br/>");

        out.println("</body>");
        out.println("</html>");
    }
}

  1. SessionSend라는 서블릿에서 request 객체를 이용하여 속성이름을 data1, "홍길동"이라고 준다. 세션 객체를 이용해서 속성을 부여하는 데 data2, "자바" 그리고 Calendar에 대한 객체를 생성하고 그 객체의 주소를 data3에 각각 저장하도록 하자.
    그리고 forward로 SessionReceive1로 이동하여 각각의 값을 출력하도록 하자. 그런 후에 SessionReceive1 에 다음페이지로라는 a 태그 링크를 삽입하고 그 링크를 클릭했을 시에 SessionReceive2 으로 이동하도록 하여 각각의 값을 다시 출력해 보자.
//SessionSend.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.*;//Calendar 클래스 사용을 위해...

public class SessionSend extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        request.setAttribute("data1", "홍길동");
        //request scope에 data1이라는 이름으로 문자열 저장

        HttpSession session = request.getSession(true);
        //request 객체로 부터 session 객체 획득
        //매개변수 true는 새로운 Session을 생성하라는 의미
        session.setAttribute("data2", "자바");
        //session scope에 data2라는 이름으로 문자열 저장
        Calendar data3 = Calendar.getInstance();
        //오늘 날짜를 위한 Calendar 객체 생성
        session.setAttribute("data3", data3);
        //session scope에 data3이라는 이름으로 오늘 날짜의 Calendar 객체 저장

        ServletContext context = this.getServletContext();
        RequestDispatcher dispatcher = context.getRequestDispatcher("/SessionReceive1");
        dispatcher.forward(request, response);
        //Servlet02_02 이름으로 맵핑된 주소로 forward
    }
}

//SessionReceive1.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.*;//Calendar 클래스 사용을 위해...
import java.text.*;//SimpleDateFormat 클래스 사용을 위해...

public SessionReceive1rea_02  extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    //forward에 의한 이동이므로 Get방식 메서드 호출
        String data1 = (String)request.getAttribute("data1");
        //request scope에 data1이라는 이름으로 설정된 데이터 추출
        HttpSession session = request.getSession();
        //request 객체로 부터 session 객체 획득
        String data2 = (String)session.getAttribute("data2");
        //session scope에 data2라는 이름으로 설정된 데이터 추출
        Calendar data3 = (Calendar)session.getAttribute("data3");
        //session scope에 data3이라는 이름으로 설정된 데이터 추출
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //날짜 출력을 위한 format 클래스 객체 생성
        String data4 = format.format(data3.getTime());
        //날짜 출력을 위한 format 변환

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

        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html><body>");

        out.println("data1 = " + data1 + "<br/>");
        out.println("data2 = " + data2 + "<br/>");
        out.println("data3 = " + data4 + "<br/><br/>");
        //각 데이터 출력

        out.println("<a href='SessionReceive2'>다음페이지로</a>");
        //다음 페이지로 이동하여 request scope의 데이터는 더 이상 존재하지 않는다는 것을 확인
        //session scope의 데이터는 웹 페이지가 사라질 때 까지 존재...

        out.println("</body></html>");
    }
}

//SessionReceive2.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.*;//Calendar 클래스의 사용을 위해...
import java.text.*;//SimpleDateFormat 클래스의 사용을 위해...

public class SessionReceive2 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    //<a> 태그에 의한 호출이므로 doGet() 메서드 호출

        String data1 = (String)request.getAttribute("data1");
        //request scope에 data1이라는 이름으로 설정된 데이터 추출
        HttpSession session = request.getSession();
        //request 객체로 부터 session 객체 획득
        String data2 = (String)session.getAttribute("data2");
        //session scope에 data2라는 이름으로 설정된 데이터 추출
        Calendar data3 = (Calendar)session.getAttribute("data3");
        //session scope에 data3이라는 이름으로 설정된 데이터 추출
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //날짜 출력을 위한 format 클래스 객체 생성
        String data4 = format.format(data3.getTime());
        //날짜 출력을 위한 format 변환

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

        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html><body>");

        out.println("data1 = " + data1 + "<br/>");
        //null 값 출력
        out.println("data2 = " + data2 + "<br/>");
        out.println("data3 = " + data4 + "<br/><br/>");
        //각 데이터 출력

        out.println("</body></html>");
    }
}

  1. 크롭에 저장된 쿠키 보는 방법은?

    • 해당 브라우저에서 개발자 모드에 들어가(F12) > 애플리케이션 > 쿠키 에서 볼 수 있다.

    Cookies 폴더에는 서버가 클라이언트와의 네트워크 통신에 필요한 멸 가지 데이터를 파일로 남길 수 있다. > 서버 자신이 남긴 파일에 한해 접근 가능

    이 폴더에 있는 파일의 데이터를 쿠키 라고 부른다.

    쿠키 데이터는 남겨질 때 사용할 수 있는 시간을 기록하는데 이 시간이 경과하면 더 이상 쿠키 데이터를 사용할 수 없다.


  1. Round15_04_ServletContext_01에 "안녕하세요! 우리 서버에 오신 것을 환영합니다."라는 말을 ServletContext에 저장하고 저장이 완료되면 "ServletContext 데이터 생성 완료!"라고 출력하자. Round15_04_ServletContext_02에 접속하는 모든 클라이언트에게 서버의 인사말을 출력하도록 하자.

ServletContext_01.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Round15_04_ServletContext_01 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        String intro = "안녕하세요! 우리 서버에 오신것을 환영합니다.";
        //서버에 접속하는 모든 이들을 위한 인사 메시지이다.

        ServletContext context = this.getServletContext();
        //ServletContext의 객체를 생성한다.
        context.setAttribute("intro", intro);
        //ServletContext 영역에 intro 객체를 저장한다.
        //이렇게 저장된 데이터는 이 서버에 접속된 사용자 누구나 볼수 있게 된다.
        //서버가 종료 되어야 비로소 사라지게 된다.        

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

        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html><body>");
        out.println("ServletContext 데이터 생성 완료!");
        out.println("</body></html>");
    }
}

ServletContext_02.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Round15_04_ServletContext_02 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

        ServletContext context = this.getServletContext();
        //ServletContext 객체를 생성한다.
        String intro = (String)context.getAttribute("intro");
        //ServletContext 영역에서 intro라는 key로 저장된 객체를 획득한다.

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

        PrintWriter out = response.getWriter();

        out.println("<!DOCTYPE html>");
        out.println("<html><body>");
        out.println("서버의 인사말 = " + intro);
        //intro로 저장된 내용을 출력해 본다.
        //이 예제를 여러 대의 컴퓨터에서 실행해 보면 동일한 값을 출력한다는 사실을 알수 있을 것이다.
        out.println("</body></html>");
    }
}

JSP /Servlet - RequestDispatcher 로 include하기

  • RequestDispatcher의 멧드 중 하나인 include() 메서드는 처리 흐름 제어를 특정 대상에게 넘기고 대상이 처리한 결과를 현재 페이지에서 처리한 결과에 포함시키는 기능을 한다.

  • 매개변수로, include() 메서드 호출시에 ServletRequest객체와 ServletResponse 객체를 넘겨주면 된다.

    • public void include(ServletRequest request, ServletResponse response) throws ServletException

forward <> include 차이점

  • include() : 제어를 넘긴 대상 페이지의 처리가 완료된 이후 결과와 함께 원래 페이지로 제어가 되돌아오고 이후 나머지 처리를 하게 된다. >>최초 흐름이 시작된 페이지가 브라우저로 최종 결과를 출력한다.

    • 호출 시 HttpServletRequest / HttpServletResponse 를 매개변수로 넘겨주는데 이 두 개의 객체를 호출하는 페이지와 호출받는 쪽에서 공유하기 때문에 서로 데이터를 이 두개의 객체에 담아 공유할 수 있다.

    • include()는 출력 버퍼를 비우지 않기 때문에 호출하는 페이지에서는 출력하는 내용에 이어서 호출되는 페이지에서 출력하는 내용까지 포함시킬 수 있다.

  • forward() : 포워딩된 대상 페이지가 최종 결과를 출력

    • 브라우저로 데이터를 출력하는 출력 스트림(PrintWriter out 객체)도 하나의 객체를 공유하므로, 출력 결과를 포함하는것처럼 보이지만, forward() 메서드에서는 제어를 호출하는 페이지로 넘기기 전에 출력 버퍼의 내용을 비워버리고 제어를 넘긴다.

requestDispatcher/Include 예제

예제 1

  • sendRedirect.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
    <%
    request.setAttribute("name", "홍길동");
    response.sendRedirect("result.jsp");
%>
</body>
</html>
  • result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
    이름 :
    <%=(String)request.getAttribute("name") %>
</body>
</html>
  • 위 결과는 이름 : null 이 출력된다. 그 이유는 sendRedirect.jsp에 있다.
  1. Request Scope : request.setAttribute()로 현재 요청 객체에 name이라는 속성을 석정했다 >> request객체의 속성은 해당 요청 동안만 유효하다.

  2. Send Redirect : 클라이언트에게 새로운 url로 이동하라는 응답을 보낸다. >> 이 응답을 받는 클라이언트(브라우저)는 result.jsp로 새로운 요청을 보낸다. >>> 이렇게 요청이 생성되면, 이전 요청에 설정된 속성들은 새로운 요청으로 전달되지 않는다.

따라서, result.jsp에서 request.getAttribute("name")을 호출하면, 이는 새로운 요청 객체에서 속성을 가져오려고 하므로 null이 반환된다.

Session속성을 사용해 setAttribute() 하거나, Forwarding-dispatcher을 사용하면 문제 없이 기능을 수행할 수 있다.


예제 2 - include

  • include시킨 파일을 하나로 만들어 java, class 각 하나씩의 파일만 생성된다.

  • directiveInclude.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
    <h1>이 페이지는 directiveInclude.jsp 입니다.</h1>
    <hr>
    <%@ include file="good.jsp"%>
</body>
</html>
  • good.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<h1>good.jsp 입니다.</h1>

예제 3 - dispatcher - forward 를 이용한 include

  • RequestDispatcher : 서블릿에서 다른 서블릿이나 jsp로 요청을 전달하거나 포함하기위해 사용되는 객체이다. dispatcher.include(request, response) 는 현재 서블릿이나 jsp의 내용을 다른 서블릿이나 jsp에 포함시키기 위해 사용된다.

    • 각각 자바 파일로 만들어서 컴파일 시킨다. > request에 있는 객체를 공유할 수 있다.
  • requestDispatcherInclude.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
requestDispatcherInclude.jsp 입니다.
<hr>
<% //이부분은 jsp 스크립트릿으로, 자바 코드를 포함하여 서버에서 실행한다.
    //flush() : out 버퍼에 있는 내용을 클라이언트로 강제로 전송한다. > 이후에 포함될 내용이 현재까지의 출력 내용과 잘 섞이도록 하기 위함 
    out.flush();
    //hello.jsp파일에 대한 RequestDispatcher 객체 생성 
    RequestDispatcher dispatcher = request.getRequestDispatcher("hello.jsp");
    //hello.jsp에서도, request, reaponse객체들을 사용할 수 있고, 현재 서블릿의 실행을 중지하고, hello.jsp 파일이 완료되면 현재 서블릿의 실행이 계속 된다. 
    dispatcher.include(request, response);
%>
</body>
</html>
  • include() 메서드를 호출하면, hello.jsp의 출력이 현재 jsp의 출력에 포함된다. > requestDispatcherInclude.jsp의 출력 내용 뒤에 hello.jsp 의 출력 내용이 추가된다.

  • hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>


<h1>hello.jsp 입니다.</h1>

스크린샷 2024-05-28 104132.png


예제 4 - setAttribute - dispatcher - forward

  • request 객체에 설정된 속성을 유지하여 다른 jsp 파일에 전달한다.

  • requestDispatcher.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
<% //request 객체에 name 속성을 설정 
    request.setAttribute("name", "홍길동");
    RequestDispatcher dispatcher = request.getRequestDispatcher("result.jsp");
    dispatcher.forward(request, response);    //현재 jsp의 처리는 중단되고, result.jsp로 전달해 해당 파일이 요청을 처리한다. 
%>
</body>
</html>
  • result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
</head>
<body>
    이름 :
    <%=(String)request.getAttribute("name") %>

result.jsp에서 requestDispatcher.jsp 파일에 설정한 name속성을 접근할 수 있다.

forward 메서드를 사용해 요청을 전달하면, 요청 속성과 파라미터가 그대로 전달되기 때문에, 속성을 사용할 수 있다.


DTO, DAO 객체를 이용한 데이터 가져오기

  • DTO(Data Transfer Object) / DAO(Data Access Object) : 소프트웨어 개발에서 데이터 처리를 담당하는 두 가지 패턴이다.

    • DTO : 데이터 전송 객체로, 계층 간 데이터를 주고받을 때 사용하는 객체다. > 데이터 필드와 그에 대한 getter / setter 메서드만을 포함한다.

      • 주로 네트워크 호출 또는 애플리케이션의 다양한 계층 간에 데이터를 전달할 때 사용된다.
    • DAO : 데이터베이스나 다른 저장소와의 상호작용을 담당하는 객체이다. 주로 CRUD 작업을 수행한다.

      • 데이터베이스 연결, SQL 쿼리 실행, 결과 처리 등의 작업을 처리한다.

별도의 파일에 작성해, DTO 클래스는 데이터 전송 객체를 정의하는 데 사용, DAO 클래스는 데이터베이스와의 상호작용을 담당


  • board.sql
CREATE TABLE board
(
no int AUTO_INCREMENT PRIMARY KEY,
title varchar(200),
name varchar(20),
password varchar(20),
email varchar(20),
contents text,
wtime datetime default CURRENT_TIMESTAMP,
rcnt int DEFAULT 0
);
  • BoardDAO.java - db에서 값 가져오기
package com.superman.www;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class BoardDAO {
    private String driver = "com.mysql.cj.jdbc.Driver";
    private String url = "jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC";
    private String user = "root";
    private String password = "1234";

    public BoardDAO() {
        try {
            Class.forName(driver);
        } catch(ClassNotFoundException e) {
            System.out.println("드라이버 로드 실패");
        }
    }

    public ArrayList<BoardDTO> selectBoard()
    {
        String sql = "SELECT no, title, name, wtime, rcnt FROM board ORDER BY no DESC";
        ArrayList<BoardDTO> list = new ArrayList<BoardDTO>();
        try(Connection conn = DriverManager.getConnection(url, user, password);
                PreparedStatement pstmt = conn.prepareStatement(sql);
                ResultSet rs = pstmt.executeQuery()) 
        {

            while(rs.next())
            {
                BoardDTO dto = new BoardDTO();
                dto.setNo(rs.getInt("no"));// 데이터베이스에서 no 값을 가져와서 설정;
                dto.setTitle(rs.getString("title"));
                dto.setName(rs.getString("name"));
                dto.setWtime(rs.getString("wtime"));
                dto.setRcnt(rs.getInt("rcnt"));
                list.add(dto);
            }
        } catch(SQLException e) {
            e.printStackTrace();
        } 
        return list;        
    }    
}
  1. 데이터베이스에 연결해 쿼리를 실행하여 데이터를 가져온다.
  1. 쿼리 결과(ResultSet)에서 데이터를 읽어와 DTO객체의 필드에 저장한다.
  1. ResultSet에서 데이터를 읽어올 때 getter메소드를 사용해, DTO객체의 필드에 setter메소드를 통해 값을 설정한다.
  • BoardDTO.java - 값을 객체에 저장하고 사용하기
package com.superman.www;

public class BoardDTO {
    private int no;
    private String title;
    private String name;
    private String password;
    private String email;
    private String contents;
    private String wtime;
    private int rcnt;
    public int getNo() {
        return no;
    }
    public void setNo(int no) {
        this.no = no;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getContents() {
        return contents;
    }
    public void setContents(String contents) {
        this.contents = contents;
    }
    public String getWtime() {
        return wtime;
    }
    public void setWtime(String wtime) {
        this.wtime = wtime;
    }
    public int getRcnt() {
        return rcnt;
    }
    public void setRcnt(int rcnt) {
        this.rcnt = rcnt;
    }    
}
  1. db에서 가져온 값을 BoardDTO 객체에 저장한다. setter 메소드를 사용해, 각 필드에 값을 설정하는 과정이다.
  1. BoardDTO 객체에 저장된 값을 필요에 따라 getter 메소드를 사용해 읽어온다.
  • list.jsp - 가져온 값들을 화면에 출력
<%@page import="java.util.ArrayList"%>
<%@page import="com.superman.www.*"%>
<%@ page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>게시판 목록</title>
</head>
<body>
<h3>목록</h3>
<%
    BoardDAO dao = new BoardDAO();
    ArrayList<BoardDTO> list = dao.selectBoard();
    for(int i=0;i<list.size();i++)
    {
        BoardDTO dto = list.get(i);
        out.print("번호 " + dto.getNo()+"<br>");
        out.print("제목 " + dto.getTitle()+"<br>");
        out.print("작성자 " + dto.getName()+"<br>");
        out.print("작성일 " + dto.getWtime()+"<br>");
        out.print("조회수 " + dto.getRcnt()+"<br><br>");
    }
%>
<a href="write.jsp">글쓰기</a>
</body>
</html>

BoardDAO 객체를 생성해, selectBoard() 메소드를 호출해 BoardDTO 객체들의 리스트를 가져온다.

for 루프를 사용하여 리스트의 각 BoardDTO 객체의 정보를 출력한다.


DAO / DTO 게시판 목록보기와 쓰기 구현 문제

  • write.jsp 작성

  • WriteOK 서블릿을 만든다.

  • 2-1. WriteOK에서 dto 객체를 만든다.
    2-2. WriteOK에서 dao 객체를 만든다.
    2-3. WriteOK에서 dto 객체에 넘어온 값을 저장한다.
    2-4. WriteOK에서 dao로 객체로 dto객체를 넘겨준다.(호출)

  • dao 객체에 public int insertBoardDAO(BoardDTO dto) 메소드를 만든다.

  • dao에서 WriteOK에서 넘겨받은 데이터를 삽입한다.

  • WriteOK에서 결과값에 따라 list.jsp로 이동한다.

  1. write.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>게시판 글쓰기</title>
</head>
<body>
    <form method="post" action="WriteOK">
        <table>
            <caption>글 쓰 기</caption>
            <tr>
                <td><label for="title">제목</label></td><td><input type="text" name="title" id="title" size="40" required></td>
            </tr>
            <tr>
                <td><label for="name">이름</label></td><td><input type="text" name="name" id="name" size="40"  required></td>
            </tr>
            <tr>
                <td><label for="pw">비밀번호</label></td><td><input type="password" name="pw" id="pw" size="40"  required></td>
            </tr>
            <tr>
                <td><label for="email">E-mail</label></td><td><input type="email" name="email" id="email" size="40"  required></td>
            </tr>
            <tr>
                <td colspan="2"><textarea cols="50" rows="10" name="contents"  required></textarea></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="등록"> <a href="list.jsp"><input type="button" value="목록"></a></td>
            </tr>
        </table>
    </form>
</body>
</html>
  1. WriteOK.java
package com.ironMen.www;

import java.io.IOException;

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("/WriteOK")
public class WriteOK extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public WriteOK() {
        super();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        BoardDTO dto = new BoardDTO();
        BoardDAO dao = new BoardDAO();
        int result = 0;
        dto.setTitle(request.getParameter("title"));
        dto.setName(request.getParameter("name"));
        dto.setPassword(request.getParameter("pw"));
        dto.setEmail(request.getParameter("email"));
        dto.setContents(request.getParameter("contents"));
        result = dao.insertBoardDAO(dto);
        if(result > 0) response.sendRedirect("list.jsp");
    }
}
  1. list.jsp
<%@page import="java.util.ArrayList"%>
<%@page import="com.ironMen.www.*"%>
<%@ page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="description" content="HTML Study">
<meta name="keywords" content="HTML,CSS,XML,JavaScript">
<meta name="author" content="Bruce">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>게시판 목록</title>
</head>
<body>
<h3>목록</h3>
<%
    BoardDAO dao = new BoardDAO();
    ArrayList<BoardDTO> list = dao.selectBoard();
    for(int i=0;i<list.size();i++)
    {
        BoardDTO dto = list.get(i);
        out.print("번호 " + dto.getNo()+"<br>");
        out.print("제목 " + dto.getTitle()+"<br>");
        out.print("작성자 " + dto.getName()+"<br>");
        out.print("작성일 " + dto.getWtime()+"<br>");
        out.print("조회수 " + dto.getRcnt()+"<br><br>");
    }
%>
<a href="write.jsp">글쓰기</a>
</body>
</html>
  1. BoardDAO.java
package com.ironMen.www;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class BoardDAO {
    private String driver = "com.mysql.cj.jdbc.Driver";
    private String url = "jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC";
    private String user = "root";
    private String password = "1234";

    public BoardDAO() {
        try {
            Class.forName(driver);
        } catch(ClassNotFoundException e) {
            System.out.println("드라이버 로드 실패");
        }
    }

    public ArrayList<BoardDTO> selectBoard()
    {
        String sql = "SELECT no, title, name, wtime, rcnt FROM board ORDER BY no DESC";
        ArrayList<BoardDTO> list = new ArrayList<BoardDTO>();
        try(Connection conn = DriverManager.getConnection(url, user, password);
                PreparedStatement pstmt = conn.prepareStatement(sql);
                ResultSet rs = pstmt.executeQuery()) 
        {

            while(rs.next())
            {
                BoardDTO dto = new BoardDTO();
                dto.setNo(rs.getInt("no"));
                dto.setTitle(rs.getString("title"));
                dto.setName(rs.getString("name"));
                dto.setWtime(rs.getString("wtime"));
                dto.setRcnt(rs.getInt("rcnt"));
                list.add(dto);
            }
        } catch(SQLException e) {
            e.printStackTrace();
        } 
        return list;        
    }

    public int insertBoardDAO(BoardDTO dto)
    {
        String sql = "INSERT INTO board (title, name, password, email, contents) VALUES(?, ?, ?, ?, ?)";
        int result = 0;
        try(Connection conn = DriverManager.getConnection(url, user, password);
                PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, dto.getTitle());
            pstmt.setString(2, dto.getName());
            pstmt.setString(3, dto.getPassword());
            pstmt.setString(4, dto.getEmail());
            pstmt.setString(5, dto.getContents());
            result = pstmt.executeUpdate();
        } catch(SQLException e) {
            e.printStackTrace();
        }
        return result;
    }
}
  1. BoardDTO.java
package com.ironMen.www;

public class BoardDTO {
    private int no;
    private String title;
    private String name;
    private String password;
    private String email;
    private String contents;
    private String wtime;
    private int rcnt;
    public int getNo() {
        return no;
    }
    public void setNo(int no) {
        this.no = no;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getContents() {
        return contents;
    }
    public void setContents(String contents) {
        this.contents = contents;
    }
    public String getWtime() {
        return wtime;
    }
    public void setWtime(String wtime) {
        this.wtime = wtime;
    }
    public int getRcnt() {
        return rcnt;
    }
    public void setRcnt(int rcnt) {
        this.rcnt = rcnt;
    }    
}

0개의 댓글