본문 바로가기

HTML

240116 HTML, Servlet 홈페이지

Delete 시 아이디 체크, url 로 입장 막기

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 글 삭제하기 / 로그인 한 사용자, 자신의 글 체크하기 추가
    HttpSession session = request.getSession();
    
    // no 값이 숫자면 삭제, 로그인 여부 체크, 아니면 다른 페이지 이동
    if (Util.intCheck(request.getParameter("no")) && session.getAttribute("mid") != null) {
      System.out.println("숫자");
      // 번호 잡기
      int no = Util.str2Int(request.getParameter("no"));
      // DAO 에 일 시키기
      BoardDAO dao = new BoardDAO();
      // board_no, mid 가 같이 있는 DTO 는 boardDTO
      // DTO 에 값 추가하여 던지기
      BoardDTO dto = new BoardDTO();
      dto.setNo(no);
      dto.setMid((String) session.getAttribute("mid"));
      int result = dao.delete(dto);
      // int result = dao.delete(no);
      // 잘 삭제되었는지 값 받기
      System.out.println("삭제 여부 : " + result);
      if (result == 1) {
        // 삭제가 잘 됐을 경우
        response.sendRedirect("./board");
      } else {
        // 삭제가 안 됐을 경우
        response.sendRedirect("./error.jsp");
      }
    } else {
      System.out.println("문자");
      response.sendRedirect("./error.jsp");
    }
  }

 

Delete DAO 에도 member 의 id 를 체크하는 값 추가

public int delete(BoardDTO dto) {
    Connection conn = DBConnection.getInstance().getConn();
    PreparedStatement pstmt = null;
    String sql = "DELETE FROM board WHERE board_no=? AND mno=(SELECT mno FROM c23c_26.member WHERE mid=?)";
    int result = 0;
    try {
      pstmt = conn.prepareStatement(sql);
      pstmt.setInt(1, dto.getNo());
      pstmt.setString(2, dto.getMid());
      result = pstmt.executeUpdate();
      // pstmt.execute();
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      close(conn, pstmt, null);
    }
    return result;

 

 

Update 시 아이디 체크, url 입장 막기

package com.poseidon.web;

import java.io.IOException;

@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 {
    HttpSession session = request.getSession();

    if (session.getAttribute("mid") != null) {
      // 세션이 있으면 정상 작업
      int no = Util.str2Int(request.getParameter("no"));
      
      BoardDAO dao = new BoardDAO();
      BoardDTO dto = dao.detail(no);
      System.out.println(dto.getMid());
      
      if (session.getAttribute("mid").equals(dto.getMid())) {
        request.setAttribute("update", dto);
        RequestDispatcher rd = request.getRequestDispatcher("update.jsp");
        rd.forward(request, response);
      } else {
        System.out.println("update.java 에러");
        response.sendRedirect("./error.jsp");
      }
    } else {
      // 세션이 없으면 로그인 시키기
      response.sendRedirect("./login?noLogin");
    }
    /*
     * if (Util.intCheck(request.getParameter("no"))) { // no 잡기 int no =
     * Util.str2Int(request.getParameter("no")); // DAO 에 넘기기 BoardDAO dao = new
     * BoardDAO(); BoardDTO dto = dao.detail(no); if (!(no == 0) || !(dto.getTitle()
     * == null)) { // JSP 로 넘기기 request.setAttribute("update", dto); //
     * System.out.println("request.setAttribute(\"update\", dto) 완료");
     * RequestDispatcher rd = request.getRequestDispatcher("update.jsp"); //
     * System.out.println("request.getRequestDispatcher(\"update.jsp\") 완료");
     * rd.forward(request, response); // System.out.println("rd.forward 완료"); } else
     * { System.out.println("update.java 에러"); response.sendRedirect("./error.jsp");
     * } }
     */
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");

    HttpSession session = request.getSession();
    
    if ((request.getParameter("title") != null) && (request.getParameter("content") != null)
        && Util.intCheck(request.getParameter("no")) && session.getAttribute("mid") != null) {

      // 수정하기
      BoardDTO dto = new BoardDTO();
      BoardDAO dao = new BoardDAO();
      dto.setContent(request.getParameter("content"));
      dto.setTitle(request.getParameter("title"));
      dto.setNo(Util.str2Int(request.getParameter("no")));
      dto.setMid((String) session.getAttribute("mid"));
      
      int result = dao.update(dto);
      
      /*
       * String title = request.getParameter("title"); String content =
       * request.getParameter("content"); int no =
       * Util.str2Int(request.getParameter("no"));
       * 
       * int result = dao.update(title, content, no);
       */

      if (result == 1) {
        response.sendRedirect("./detail?no=" + request.getParameter("no"));
      } else {
        response.sendRedirect("./error.jsp");
      }
    } else {
      response.sendRedirect("./error.jsp");
    }
  }
}

 

Update DAO 에서 게시글의 정보를 받아와 저장

게시글 UPDATE SET 을 실행하고 실행이 정상적으로 됐으면 게시글로 이동

아니면 error 페이지로 이동

public BoardDTO detail(int no) {
    BoardDTO dto = new BoardDTO();
    Connection conn = DBConnection.getInstance().getConn();
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    String sql = "SELECT b.board_no, b.board_title, b.board_content, m.mname, m.mid,"
        + "b.board_date, b.board_count "
        + "FROM board b JOIN member m "
        + "ON b.mno = m.mno WHERE board_no=?";

    try {
      pstmt = conn.prepareStatement(sql);
      pstmt.setInt(1, no);
      rs = pstmt.executeQuery();

      if (rs.next()) {
        dto.setNo(rs.getInt("board_no"));
        dto.setTitle(rs.getString("board_title"));
        dto.setContent(rs.getString("board_content"));
        dto.setDate(rs.getString("board_date"));
        dto.setCount(rs.getInt("board_count"));
        // dto.setWrite(rs.getString("board_write"));
        dto.setWrite(rs.getString("mname"));
        dto.setMid(rs.getString("mid"));
      }
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      close(conn, pstmt, rs);
    }
    return dto;
  }

 

수정 후 저장 버튼 클릭 시 한번 더 체크하기

-> 상단의 dopost 에서 다시 한번 더 session 의 id 가 있는 지 여부 체크

 

내 정보보기 페이지 만들기

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>내정보</title>
<link href="./css/index.css" rel="stylesheet" />
</head>
<body>
  <%
  if (session.getAttribute("mid") == null) {
    response.sendRedirect("./login");
  }
  %>
  <div class="container">
    <header>
      <jsp:include page="menu.jsp"></jsp:include>
    </header>
    <div class="main">
      <div class="mainStyle">
        <article>
          <h1>내 정보 보기</h1>
          ${myInfo.mname } / ${myInfo.mid } / ${myInfo.mpw } <br>
          ${myInfo.mno } / ${myInfo.mgrade } / ${myInfo.mdate }

          <div>
            <form action="./myInfo" method="post" onsubmit="return check()">
              <input type="password" name="newPW" id="newPW"
                placeholder="변경할 암호 입력" value="${myInfo.mpw }" required />
              <button type="submit">수정</button>
            </form>
          </div>
        </article>
      </div>
    </div>
  </div>
  <script type="text/javascript">
  function check() {
    var pw = document.querySelector("#newPW");
    // alert(pw.value);
    // 비밀번호 특수문자 체크하는 정규식
    // let reg = /^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,15}$/
    if (pw.value.length < 5) {
      alert("암호는 5자 이상");
      return false;
    }
  }
  </script>
</body>
<footer>
  <c:import url="./footer.jsp" />
</footer>
</html>

 

내 정보 보기 서블릿 만들기, 비밀번호 변경도 실행

package com.poseidon.web;

import com.poseidon.dao.MemberDAO;
import com.poseidon.dto.MemberDTO;

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

  public MyInfo() {
    super();
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    HttpSession session = request.getSession();
    if (session.getAttribute("mid") != null) {
      // mid 를 데이터베이스에 질의
      MemberDTO dto = new MemberDTO();
      dto.setMid((String) session.getAttribute("mid"));
      
      MemberDAO dao = new MemberDAO();
      // DTO 에 담음
      dto = dao.myInfo(dto);
      // myInfo.jsp 으로 넘겨 출력하기
      request.setAttribute("myInfo", dto);
      RequestDispatcher rd = request.getRequestDispatcher("myInfo.jsp");
      rd.forward(request, response);
    } else {
      response.sendRedirect("./login");
    }
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    HttpSession session = request.getSession();
    
    if (session.getAttribute("mid") != null) {
      MemberDAO dao = new MemberDAO();
      MemberDTO dto = new MemberDTO();
      
      // 로그인 한 세션의 mid 값 가져오기
      dto.setMid((String) session.getAttribute("mid"));
      // 로그인 한 세션의 mno 값 가져오기
      dto.setMno((int) session.getAttribute("mno"));
      // jsp 에서 보내온 값 받기, Attribute 와 Parameter 의 차이점 인식하기
      dto.setMpw((String) request.getParameter("newPW"));
      
      int result = dao.pwUpdate(dto);
      
      if (result == 1) {
        System.out.println("비밀번호 변경 성공 : " + dto.getMid());
        response.sendRedirect("./index");
      } else {
        System.out.println("비밀번호 변경 실패 : " + dto.getMid());
        response.sendRedirect("./error.jsp?pwChange=error");
      }
    }
  }
}

 

내 정보 보기와 비밀번호 업데이트하는 DAO

mno  는 필요가 없긴 한데 굳이굳이 한번 더 넣어보았음 혹시나 하는 마음

public MemberDTO myInfo(MemberDTO dto) {
    // MemberDTO dto = new MemberDTO();
    Connection conn = dbConn.getConn();
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    String sql = "SELECT mno, mname, mpw, mdate, mgrade FROM c23c_26.member WHERE mid=?";

    try {
      pstmt = conn.prepareStatement(sql);
      pstmt.setString(1, dto.getMid());
      rs = pstmt.executeQuery();

      if (rs.next()) {
        dto.setMno(rs.getInt("mno"));
        dto.setMname(rs.getString("mname"));
        dto.setMpw(rs.getString("mpw"));
        dto.setMdate(rs.getString("mdate"));
        dto.setMgrade(rs.getInt("mgrade"));
        // dto.setMid(rs.getString("mid"));
      }
    } catch (SQLException e) {
      System.out.println("MemberDAO, info 오류");
    } finally {
      close(conn, pstmt, rs);
    }
    return dto;
  }

  public int pwUpdate(MemberDTO dto) {
    int result = 0;
    Connection conn = dbConn.getConn();
    PreparedStatement pstmt = null;
    String sql = "UPDATE c23c_26.member SET mpw=? WHERE mid=? AND mno=?";
    
    try {
      pstmt = conn.prepareStatement(sql);
      pstmt.setString(1, dto.getMpw());
      pstmt.setString(2, dto.getMid());
      pstmt.setInt(3, dto.getMno());
      result = pstmt.executeUpdate();
      
    } catch (SQLException e) {
      System.out.println("MemberDAO - pwUpdate 오류");
      e.printStackTrace();
    }
    return result;
  }

 

getAttribute 와 getParameter 의 차이점

Attribute 는 미리 setAttribute 로 세팅을 해야만 get 이가능

getParameter 는 페이지에서 보낸 값을 받아 사용

 

페이지 만들기

기존 board 화면에 게시글 페이지를 만듦, 게시글의 개수를 체크하여 페이지 버튼 갯수 만들기

자바스크립트를 이용하여 url 에 페이지를 추가

${totalCount } 개가 있음 <br>
페이지 수 : <c:set var="totalPage" value="${totalCount / 10 }" />
<fmt:parseNumber integerOnly="true" value="${totalPage }"
  var="totalPage" />
<c:if test="${totalCount % 10 gt 0 }">
  <c:set var="totalPage" value="${totalPage + 1 }" />
</c:if>
<c:out value=" ${totalPage }" />
<div class="paging">
  <c:forEach begin="1" end="${totalPage }" var="p">
    <button onclick="paging(${p})" class="pageBtn">${p}</button>
  </c:forEach>
</div>

<script type="text/javascript">
    function paging(no) {
      location.href="./board?page=" + no;
    }
</script>

 

기존 board 에 page 값을 넘겨받아 해당 값을 넘김

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	  int page;
	  
	  page = request.getParameter("page") == null ? 1 : Util.str2Int2(request.getParameter("page"));
	  
//	  if (request.getParameter("page") == null) {
//	    page = 1;
//	  } else {
//	    page = Util.str2Int2(request.getParameter("page"));
//	  }

	  // DAO 와 연결
	  BoardDAO dao = new BoardDAO();
	  List<BoardDTO> list = dao.boardList(page);
	  int totalCount = dao.totalCount();
	  
	  request.setAttribute("list", list);
	  request.setAttribute("totalCount", totalCount);
//	  int totalPage;
//	  if (totalCount % 10 == 0) {
//	    totalPage = totalCount / 10;
//	  } else {
//	    totalPage = totalCount / 10 + 1;
//	  }
//	  request.setAttribute("totalPage", totalPage);
	  
	  // url 은 그대로 있지만 화면만 변경
	  // sendrequest 는 url 을 새로 변경하여 새로고침
	  RequestDispatcher rd = request.getRequestDispatcher("board.jsp");
	  rd.forward(request, response);
	}

 

게시글 목록을 가져오는 DAO

기존 DAO 에서 page 값을 추가하여 LIMIT 값을 변경, page 의 값마다 보여지는 게시글이 바뀜

public List<BoardDTO> boardList(int page) {
    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 LIMIT ?, 10";

    conn = dbConn.getConn();

    try {
      pstmt = conn.prepareStatement(sql);
      pstmt.setInt(1, (page - 1) * 10);
      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.setWrite(rs.getString("mname"));
        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;
  }

'HTML' 카테고리의 다른 글

240119 HTML 홈페이지 이어 만들기  (0) 2024.01.19
240118 홈페이지 만들기  (0) 2024.01.18
240115 홈페이지 만들기  (0) 2024.01.15
240112 HTML 홈페이지 만들기  (0) 2024.01.12
240109 HTML  (0) 2024.01.09