본문 바로가기

HTML

240102 HTML, Servlet 등

저번 주 금요일 처리 하던 것 생성

먼저 글 쓰기

<%@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>Servlet 으로 변경 예정</title>
</head>
<body>
	<!-- 데이터베이스에 값 전달하고 종료 -->
	<%
	request.setCharacterEncoding("UTF-8"); // request 의 값을 UTF-8 로 인코딩
	String title = request.getParameter("title");
	String content = request.getParameter("content");
	// 필요한 일
	// DAO 호출
	BoardDAO dao = new BoardDAO();

	// int write(title, content);
	// write 가 정상으로 작동되면 정수 1 반환, 올바른 페이지로 이동
	// 작동되지 않으면 0 반환, 오류 페이지로 이동
	int result = dao.write(title, content);

	// 페이지 이동
	if (result == 1) {
		response.sendRedirect("./index.jsp");
	} else {
		response.sendRedirect("./error.jsp");
	}
	/*
	페이지 이동하는 방법
  <jsp:forward page="./main.jsp" />
  줄에 닿자마자 페이지 이동, 액션 태그
  
  <script type="text/javascript">
    location.href = "./main.jsp";
  </script>
	*/
	%>

</body>
</html>

 

글 쓰는 DAO 도 생성

// 글 작성하기, 2024-01-02
  public int write(String title, String content) {
    int result = 0;

    PreparedStatement pstmt = null;
    String sql = "INSERT INTO board (board_title, board_content, board_write) VALUES (?, ?, ?)";
    String name = "내가씀"; // 나중에 세션에서 받아오기

    try {
      pstmt = dbConn.getConn().prepareStatement(sql);
      pstmt.setString(1, title); // 첫 번째 물음표에 값 넣기
      pstmt.setString(2, content);
      pstmt.setString(3, name);

      // execute(); 실행, boolean 타입 = update, insert, delete
      // executeQuery(); 실행, ResultSet = select
      // executeUpdate(); 실행, 숫자 = update, insert, delete

      // 결과를 숫자로 되돌려 줌, 변경된 레코드 수
      result = pstmt.executeUpdate();
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      close(null, pstmt);
    }
    return result;
  }

 

post 로 전송할 경우 jsp 의 자바로 할 필요 없이 servlet 으로 바로 생성

package com.poseidon.web;

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;

import com.poseidon.dao.BoardDAO;

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

  public Write() {
    super();
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.getWriter().append("Served at: ").append(request.getContextPath());
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8"); // request 의 값을 UTF-8 로 인코딩
    String title = request.getParameter("title");
    String content = request.getParameter("content");
    // 필요한 일
    // DAO 호출
    BoardDAO dao = new BoardDAO();

    // int write(title, content);
    // write 가 정상으로 작동되면 정수 1 반환, 올바른 페이지로 이동
    // 작동되지 않으면 0 반환, 오류 페이지로 이동
    int result = dao.write(title, content);

    // 페이지 이동
    if (result == 1) {
      response.sendRedirect("./index.jsp");
    } else {
      response.sendRedirect("./error.jsp");
    }

    // response.setContentType("text/html;charser=UTF-8");
    // 내보내는 데이터 인코딩 방식 설정
  }
}

 

write 페이지의 action 도 수정

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글쓰기</title>
<link rel="stylesheet" type="text/css" href="./css/write.css">

</head>
<body>
  <h3>글쓰기</h3>
  <!-- form 글 제목, 글 내용-->
  <form action="./write" method="post">
    <input type="text" name="title"> <br>
    <textarea name="content"></textarea>
    <button type="submit">글쓰기</button>
  </form>

</body>
</html>

 

틈새 SQL 강의

DATE_FORMAT(date, format[, locale])
-- DATE 가 들어오면 해당 형식으로 변경하여 보여줌

NOW()
-- 현재 시간을 출력해주는 명령어

-- 연, 월, 일
-- 시, 분, 초
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d') FROM DUAL; -- 2024-01-02
-- Y : 2024, y : 24
-- M : January, m : 01
-- D : 2nd, d : 02

-- 현재 시각 : AM 11:18
SELECT DATE_FORMAT(NOW(), '%H-%I-%S') FROM DUAL; -- 11:11:18
SELECT DATE_FORMAT(NOW(), '%h-%i-%s') FROM DUAL; -- 11:18:18
-- H : 00 ~ 23 시 표시
-- h, I : 01 ~ 12 시 표시
-- S, s : 시간의 초 출력

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %h:%i:%s') FROM DUAL;
SELECT DATE_FORMAT(board_date, '%Y-%m-%d') FROM DUAL;
SELECT DATE_FORMAT(board_date, '%h:%i:%s') FROM DUAL;

-- if(조건, 참, 거짓)

SELECT 
if(DATE_FORMAT(NOW(), '%Y-%m-%d') = DATE_FORMAT(board_date, '%Y-%m-%d')
	, DATE_FORMAT(board_date, '%h:%i')
	, DATE_FORMAT(board_date, '%m-%d'))
FROM board;

-- 번호, 제목, 글쓴이, 조회수 + 정렬(역순) + 10 개 씩 보기
CREATE VIEW boardview AS
SELECT
board_no, board_title, board_write,
if(DATE_FORMAT(NOW(), '%Y-%m-%d') = DATE_FORMAT(board_date, '%Y-%m-%d')
	, DATE_FORMAT(board_date, '%h:%i')
	, DATE_FORMAT(board_date, '%m-%d')) AS board_date
	, board_count
FROM board
ORDER BY board_no DESC
LIMIT 0, 10;

 

게시글 상세보기 detail 에서 수정 버튼 추가

<%@page import="java.util.Map"%>
<%@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>
<style>
.delete_letter {
  cursor: pointer;
}
</style>
<head>
<meta charset="UTF-8">
<title>제목</title>
</head>
<body>
  <h1>보기</h1>
  
  <%
  String no = request.getParameter("no");
  BoardDAO dao = new BoardDAO();
  Map<String, String> detail = dao.detail(no);
  %>
  
  글 번호 : <%=detail.get("board_no")%> <br>
  
  <h3>
    제목 :
    <%=detail.get("board_title")%>
  </h3>
  
  <a href="./delete.jsp?no=<%=detail.get("board_no")%>"> <img
    alt="삭제" src="./image/scissor_picture.png"
    title="버튼을 누르면 삭제됩니다. (a 태그 이용)">
  </a>
  <br>

  <img class="delete_letter" onclick="del(<%=detail.get("board_no")%>)"
    alt="삭제" src="./image/scissor_picture.png"
    title="버튼을 누르면 삭제됩니다. (js 이용)">

  <%-- <button onclick="location.href='./delete.jsp?no=<%=detail.get("board_no") %>'">
	<img alt="삭제" src="./image/scissor_picture.png" title = "버튼을 누르면 삭제됩니다."><br>
	</button> --%>

  <img onclick="update()" alt="수정" src="./image/modify.png">
  <br>
  
  글쓴이 : <%=detail.get("board_write")%> <br>
  날짜 : <%=detail.get("board_date")%> <br>
  조회수 : <%=detail.get("board_count")%> <br>
  
  <hr>
  
  <%=detail.get("board_content")%> <br>
  <!-- html 문서에서 간혹 click, onclick 버튼 = 자바스크립트 -->
  <button onclick="location.href='./index.jsp'">돌아가기</button>
  <br>
  <button onclick="what()">눌러보세요</button>
  <br>

  <script type="text/javascript">
	function update() {
	  var check = confirm("수정하시겠습니까?");
	  if (check) {
	    // alert("글을 수정합니다.");
	    location.href="./update?no=<%=detail.get("board_no")%>";
	    // 위 문장은 서버에서 계산하여 처리됨
	    // 이후 html/css/js 에서 처리
	    // 실행 순서
	    // 1. 자바 코드를 먼저 실행 : 서버에서 처리
	    // 2. html/css/js 실행 : 클라이언트에서 처리
	  }
	}	
  function what() {
		for (var i = 0; i < 3; i++) {
			alert("메롱"); /* 메롱 이 써진 팝업창이 생김, 3 번 반복*/
		}
	}
	function del(no){
		if(confirm("삭제하시면 복구가 불가능합니다.\n삭제 하시겠습니까?")) {
		 location.href="./delete.jsp?no=" + no;
		}
	}
	</script>
</body>
</html>

 

update Servlet 생성

package com.poseidon.web;

import java.io.IOException;
import java.util.Map;

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;

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

  public Update() {
    super();
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // DAO 호출하기
    BoardDAO dao = new BoardDAO();
    // return 되는 번호 잡기 : "./update?no=<%=detail.get("board_no")%>"
    String no = request.getParameter("no");
    // DB 에 질의하여 레코드 1개 가져오기
    Map<String, String> detail = dao.detail(no);
    // update.jsp 에 돌려주기 : 페이지 이동
    request.setAttribute("detail", detail); // 변수명, 값
    // "detail" 이라는 이름으로 detail 을 보냄
    
    // jsp 부르기
    RequestDispatcher rd = request.getRequestDispatcher("update.jsp");
    rd.forward(request, response);
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    String title = request.getParameter("title");
    String content = request.getParameter("content");
    String no = request.getParameter("no");
    
    BoardDAO dao = new BoardDAO();
    dao.update(no, title, content);
    
    response.sendRedirect("./detail.jsp?no="+no);
  }
}

 

update 하는 HTML

<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글쓰기</title>
<link rel="stylesheet" type="text/css" href="./css/write.css">

</head>
<body>
  <%
  Map<String, String> detail = (Map<String, String>) request.getAttribute("detail");
  %>
  <h3>글 수정</h3>
  <!-- write 를 복사하여 사용, 이후 내용만 수정 -->
  <form action="./update" method="post">
    <!-- value 는 텍스트박스 안에 들어 갈 값을 처리 -->
    <input type="text" name="title" value="<%=detail.get("board_title")%>"> <br>
    <!-- textarea 태그 사이에 내용 값을 집어 넣음 -->
    <textarea name="content"><%=detail.get("board_content")%></textarea>
    <button type="submit">완료</button>
    <input type="text" name="no" value="<%=detail.get("board_no") %>">
  </form>
</body>
</html>

 

update DAO 작성

public void update(String no, String title, String content) {
    PreparedStatement pstmt = null;
    String sql = "UPDATE board SET board_title=?, board_content=? where board_no=?";
    
    try {
      pstmt = dbConn.getConn().prepareStatement(sql);
      pstmt.setString(1, title);
      pstmt.setString(2, content);
      pstmt.setString(3, no);
      pstmt.execute();
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      close(null, pstmt);
    }
  }

 

write.jsp 의 글자 수 제한 및 글 작성 막기

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글쓰기</title>
<link rel="stylesheet" type="text/css" href="./css/write.css">
  <script type="text/javascript">
  function check() {
    // alert("!");
    // var title = document.getElementsByName("title");
    // alert(title[0].value);
    var title = document.getElementById("title");
    // alert(title.value);
    if (title.value.length < 5) {
      alert("제목은 5 글자 이상으로 작성해야 합니다.")
      title.focus(); // 커서의 위치를 title 쪽으로 이동
      return false;
    }
    
    var content = document.getElementsByClassName("content");
    // alert(content[0].value.length);
    if(content[0].value.length < 3) {
      alert("내용은 3 글자 이상으로 작성해야 합니다.")
      content[0].focus(); // 커서의 위치를 content 쪽으로 이동
      return false;
    }
  }
  </script>
</head>
<body>
  <h3>글쓰기</h3>
  <!-- form 글 제목, 글 내용-->
  <form action="./write" method="post">
    <input type="text" name="title" id="title"> <br>
    <textarea name="content" class = "content"></textarea>
    <button type="submit" onclick="return check()">글쓰기</button>
  </form>

</body>
</html>

 

글 수정하는 update 에도 글자 수 체크 집어넣기

<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글쓰기</title>
<link rel="stylesheet" type="text/css" href="./css/write.css">
<script type="text/javascript">
  function check() {
    // alert("!");
    // var title = document.getElementsByName("title");
    // alert(title[0].value);
    var title = document.getElementById("title");
    // alert(title.value);
    if (title.value.length < 5) {
      alert("제목은 5 글자 이상으로 작성해야 합니다.")
      title.focus(); // 커서의 위치를 title 쪽으로 이동
      return false;
    }
    
    var content = document.getElementsByClassName("content");
    // alert(content[0].value.length);
    if(content[0].value.length < 3) {
      alert("내용은 3 글자 이상으로 작성해야 합니다.")
      content[0].focus(); // 커서의 위치를 content 쪽으로 이동
      return false;
    }
  }
  </script>
</head>
<body>
  <%
  Map<String, String> detail = (Map<String, String>) request.getAttribute("detail");
  %>
  <h3>글 수정</h3>
  <!-- write 를 복사하여 사용, 이후 내용만 수정 -->
  <form action="./update" method="post">
    <!-- value 는 텍스트박스 안에 들어 갈 값을 처리 -->
    <input type="text" name="title" id = "title" value="<%=detail.get("board_title")%>"> <br>
    <!-- textarea 태그 사이에 내용 값을 집어 넣음 -->
    <textarea name="content" class = "content"><%=detail.get("board_content")%></textarea>
    <button type="submit" onclick = "return check()">완료</button>
    <input type="text" name="no" value="<%=detail.get("board_no") %>">
  </form>
</body>
</html>

'HTML' 카테고리의 다른 글

240108  (0) 2024.01.08
240104 VScode 를 이용하기  (0) 2024.01.04
231229 HTML  (0) 2023.12.29
231228 HTML  (1) 2023.12.28
231220 HTML  (0) 2023.12.20