오늘 배울 내용 : 기존에 배웠던 웹페이지 만들기를 다시 복습
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>
–
</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 |