본문 바로가기

HTML

240108

오늘 배울 내용 : 기존에 배웠던 웹페이지 만들기를 다시 복습

 

index 부터 다시 만들고, DB 에 접속하는 페이지를 싱글톤으로 변화 시키기

 

package com.poseidon.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnection {
  // 싱글톤으로 변경하기
  // static 으로 하나만 존재해야 함
  private static DBConnection dbConn = new DBConnection();
  
  // 생성자 만들기, 나만 호출할 수 있는 생성자 : 생성자 잠금
  private DBConnection() {}
  
  // 인스턴스 호출에 대응하는 메소드 : getInstance 로 주로 사용
  public static DBConnection getInstance() {
    return dbConn;
  }
  
  public Connection getConn() {
    Connection conn = null;
    
    try {
      Class.forName("org.mariadb.jdbc.Driver");
      String url = "jdbc:mariadb:";
      conn = DriverManager.getConnection(url, "", "");
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (SQLException e) {
      e.printStackTrace();
    }

    return conn;
  }
}

 

DAO 와 DTO 생성, 이번에는 DTO 를 만들어서 작성

public List<BoardDTO> boardList() {
    List<BoardDTO> list = null;
    // DB 정보
    DBConnection dbConn = DBConnection.getInstance();
    // Conn 객체
    Connection conn = null;
    // pstmt
    // Statement 를 사용하면 SQL 인젝션 공격에 통할 수 있음
    PreparedStatement pstmt = null;
    // rs
    ResultSet rs = null;
    // sql
    String sql = "SELECT * FROM boardview";

    conn = dbConn.getConn();

    try {
      pstmt = conn.prepareStatement(sql);
      rs = pstmt.executeQuery();
      list = new ArrayList<BoardDTO>();

      // rs 에 받은 값을 list 에 저장
      while (rs.next()) {
        BoardDTO dto = new BoardDTO();

        dto.setNo(rs.getInt("board_no"));
        dto.setTitle(rs.getString("board_title"));
        dto.setWrite(rs.getString("board_write"));
        dto.setDate(rs.getString("board_date"));
        dto.setCount(rs.getInt("board_count"));
        list.add(dto);
      }
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      close(conn, pstmt, rs);
    }

    return list;
  }

  private void close(Connection conn, PreparedStatement pstmt, ResultSet rs) {
    if (conn != null) {
      try {
        conn.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if (pstmt != null) {
      try {
        pstmt.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if (rs != null) {
      try {
        rs.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }

 

xml 에서 파일 ALIAS 설정하기

<?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>jav08web</display-name>
  <welcome-file-list>
  <!-- 하나씩 통과하면서 있는 파일 먼저 오픈, 페이지가 없을 경우 다음 것으로 넘어감 -->
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>

  <servlet>
    <!-- board.jsp 를 board 라는 이름으로 변경 -->
    <servlet-name>board</servlet-name>
    <jsp-file>/board.jsp</jsp-file>
  </servlet>

  <servlet-mapping>
  <!-- /board 라는 요청이 들어왔을 때 board 파일을 엶 -->
    <servlet-name>board</servlet-name>
    <url-pattern>/board</url-pattern>
  </servlet-mapping>
  
</web-app>

 

Servlet 을 통과 해야만 값이 나오게 설정

package com.poseidon.web;

import java.io.IOException;
import java.util.List;

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

import com.poseidon.dao.BoardDAO;
import com.poseidon.dto.BoardDTO;

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	  // DAO 와 연결
	  BoardDAO dao = new BoardDAO();
	  List<BoardDTO> list = dao.boardList();
	  
	  request.setAttribute("list", list);
	  
	  RequestDispatcher rd = request.getRequestDispatcher("board.jsp");
	  rd.forward(request, response);
	}

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

}

 

board.jsp 는

<%@page import="com.poseidon.dto.BoardDTO"%>
<%@page import="java.util.List"%>
<%@page import="com.poseidon.dao.BoardDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
</head>
<body>
  <%
  // 웹에서는 값이 넘어갈 때 Object 타입으로 넘어가 형 변환이 필요
  List<BoardDTO> lists = (List<BoardDTO>) request.getAttribute("list");
  %>
  <div class="container">
    <header>머리글</header>
    <div class="main">
      <div>
        <article>
          <table>
            <tr>
              <th>번호</th>
              <th>제목</th>
              <th>글쓴이</th>
              <th>날짜</th>
              <th>읽음</th>
            </tr>
            <%
            for (BoardDTO dto : lists) {
            %>
            <tr>
              <td><%=dto.getNo()%></td>
              <td><%=dto.getTitle()%></td>
              <td><%=dto.getWrite()%></td>
              <td><%=dto.getDate()%></td>
              <td><%=dto.getCount()%></td>
            </tr>
            <%
            }
            %>
          </table>
        </article>
      </div>
      &ndash;
    </div>
    <footer>바닥글</footer>
  </div>
</body>
</html>

 

web.xml 을 수정하여 .jsp url 주소에 접근 불가하게 막기

<?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>jav08web</display-name>
  <welcome-file-list>
    <!-- 하나씩 통과하면서 있는 파일 먼저 오픈, 페이지가 없을 경우 다음 것으로 넘어감 -->
    <welcome-file>index</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>

  <!-- 별칭 정하는 내용들은 오류 발생으로 삭제 -->

  <!-- 하단 내용은 .jsp 가 들어간 url 입력 시 들어가지 않게 하는 방법 -->
  <security-constraint>
    <display-name>JSP Protection</display-name>
    <web-resource-collection>
      <web-resource-name>SecureJSPPages</web-resource-name>
      <url-pattern>*.jsp</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>nobody</role-name>
    </auth-constraint>
  </security-constraint>

  <security-role>
    <description>
Nobody should be in this role so JSP files are protected
from direct access.
</description>
    <role-name>nobody</role-name>
  </security-role>
</web-app>

 

index 서블릿 생성

package com.poseidon.web;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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("/index")
public class Index extends HttpServlet {
  private static final long serialVersionUID = 1L;

  public Index() {
    super();
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    RequestDispatcher rd = request.getRequestDispatcher("index.jsp");
    rd.forward(request, response);
  }

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

}

 

web.xml 에 에러페이지 설정하기

<!-- 에러 페이지 설정하기 -->
  <error-page>
    <error-code>403</error-code>
    <location>/error.jsp</location>
  </error-page>
  
  추가

 

 

'HTML' 카테고리의 다른 글

240112 HTML 홈페이지 만들기  (0) 2024.01.12
240109 HTML  (0) 2024.01.09
240104 VScode 를 이용하기  (0) 2024.01.04
240102 HTML, Servlet 등  (2) 2024.01.02
231229 HTML  (0) 2023.12.29