4. 레코드 상세 내용 출력 부분 작성 -3

미려김·2024년 3월 8일

JSP 프로그래밍

목록 보기
12/14

4.2.2 레코드 상세 내용 출력 문서 작성

  • BoardList.jsp 문서에서 선택한 레코드의 RcdNo 필드 값이 BoardContent.jsp 문서로 전달되어야 함 -> BoardList.jsp 문서 수정

BoardList.jsp 문서 수정

  • BoardList.jsp 문서가 BoardContent.jsp 문서로 출력하고자 하는 레코드의 식별자를 정확하게 전달
  • BoardContent.jsp 문서는 전달 받은 식별자를 사용해 DB로부터 해당 레코드 추출
  • 따라서 BoardList.jsp 문서에서 추출했던 레코드의 식별자인 RcdNo 필드 ㄱ밧이 BoardContent.jsp 문서로의 하이퍼링크에 추가되어야 함
  • 기존 내용
<TD WIDTH=395 ALIGN=LEFT>
	<A HREF="BoardContent.jsp"><%=subject%></A>
</TD>
  • 변경한 구문
<TD WIDTH=395 ALIGN=LEFT>
	<A HREF="BoardContent.jsp?rno=<%=rno%>"><%=subject%></A>
</TD>
  • RcdNo 필드 값을 추출 -> 변수 rno에 대입 -> 이 변수의 값을 다시 변수 rno에 대입 -> BoardContent.jsp 문서에 전달
  • 전달되는 변수의 이름은 반드시 rno를 사용하지 않아도 됨, 하지만 변수의 혼돈을 피하기 위해 -> 실제 전달한 데이터를 포함하는 변수의 이름과 그 값을 전달하기 위한 변수의 이름 동일하게 사용
  • BoardList.jsp 문서에 존재하는 모든 레코드의 제목에 rno 값 지정 확인
    • 하이퍼링크 수정 후 마우스를 레코드 제목 위로 올리면 이클립스 좌측 하단의 주소 표시줄에 변수 rno가 적용되었는지 확인 가능
    • 마우스를 레코드 위로 움직여 보면 각 레코드마다 변수 rno의 값이 변경 되는 것을 확인할 수 있음
    • 만약 변수 rno가 나타나지 않거나 rno 값이 변경 X -> 변수 rno 존재 X / 하이퍼링크 잘못 지정
    • 이게 맞나...

BoardContent.jsp 문서 수정

  • 클래스의 지정
    • BoardList.jsp 문서로부터 전달받은 변수 rno를 사용해 DB로부터 해당 레코드를 추출해야함 -> JDBC 사용한 DB 접속을 위해 java.sql 패키지의 클래스 import
    • BoardList.jsp 문서로부터 전달받은 키워드가 한글일 경우, 다른 문서에 전달할 때 encoder()메소드 사용해서 인코딩 해야 함 -> java.net.URLEncoder 클래스 import
    <%@ page import="java.sql.*" %>
    <%@ page import="java.net.URLEncoder" %>
  • 전달된 RcdNo 필드 값 추출
    • 변수 rno에 실려 전달된 RcdNo 필드 값을 가지는 레코드 DB에서 추출
    • request 기본 객체를 통해 전달된 변수 rno 먼저 추출
    • 추출하는 변수 rno의 값은 정수 => Integer.parseInt()메소드 사용
      int rno = Integer.parseInt(request.getParameter("rno"));
  • 객체와 변수의 선언
    • BoardContent.jsp 문서는 JDBC를 사용 -> DB 접속 -> DB로부터 레코드 추출하는 질의 수행
      • Connection 객체, PreparedStatement 객체, ResultSet 객체 선언
    • 한글 키워드 전달 -> 키워드 인코딩해서 다른 문서 전달
      • encoded_key : encode()메소드 사용 -> 인코딩된 키워드 저장하는 변수
      Connection conn = null;
      PreparedStatement pstmt = null;
      ResultSet rs1 = null;

      String encoded_key="";
  • JDBC 설정
    • BoardContent.jsp 문서는 JDBC를 사용 -> DB 접속 -> 레코드 추출
    try{
        //------------------------ JDBC 설정
        String jdbcUrl = "jdbc:sqlserver://(localhost):(port);encrypt=false;DatabaseName=(name);";
        String jdbcId = "id";
        String jdbcPw = "pw";

        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        conn = DriverManager.getConnection(jdbcUrl, jdbcId, jdbcPw);
  • UsrRefer 필드 값 증가
    • UsrRefer 필드 : 레코드의 참조 횟수
      • UsrRefer 필드 값은 BoardContent.jsp 문서가 수행될 때마다 1씩 증가됨
     String Query1 = "UPDATE dbo.board SET UsrRefer=UsrRefer+1 WHERE RcdNo=?";
     pstmt = conn.prepareStatement(Query1);

     pstmt.setInt(1, rno);
     pstmt.executeUpdate();
     // BoardList.jsp 문서로부터 전달받은 rno 값을 사용함
  • BoardContent.jsp 문서에 출력할 레코드의 추출과 필드 값 추출
    • BoardList.jsp 문서로부터 전달받은 rno 값 사용 → DB로부터 해당 레코드 추출 → 추출한 레코드의 각 필드 값 BoardContent.jsp 문서에 출력
    • 참고 블로그
    String Query2 = "SELECT UsrName, UsrMail, UsrSubject, UsrContent FROM dbo.board WHERE RcdNo=?";
    pstmt = conn.prepareStatement(Query2);
    pstmt.setInt(1, rno);
    rs1 = pstmt.executeQuery(); // Query2 질의의 수행 결과로 추출된 레코드의 집합으로 구성
    rs1.next();

    String name = rs1.getString(1); // UsrName
    String mail = rs1.getString(2); // UsrMail
    String subject = rs1.getString(3).trim(); // UsrSubject
    String content = rs1.getString(4).trim(); // UsrContent 
    // trim() : 문자열 좌우에 존재하는 공백 제거, 반드시 사용하는 것 아님
    content = content.replaceAll("\r\n","<BR>");
    // \r\n이 존재할 경우 <BR> 태그로 대체
    // \r\n : Windows에서 줄 바꾸기 문자로 사용
    // <BR> : HTML 개행 문자
    // HTML은 \r\n 인식 X -> <BR> 대체
  • 추출한 필드 값 출력
    • ResultSet 객체로부터 추출한 각각의 필드 값을 브라우저에 출력
    • 기존의 가상 데이터를 ResultSet 객체 rs1으로부터 추출한 실제 필드 값으로 대체
    • 기존내용
        <TR>
          <TD WIDTH=120 ALLIGN=CENTER><B>이름</B></TD>
          <TD WIDTH=500>김미려</TD>
        </TR>
    • 변경
        <TR>
          <TD WIDTH=120 ALLIGN=CENTER><B>이름</B></TD>
          <TD WIDTH=500><%=name%></TD>
        </TR>
  • 예외 처리와 객체의 제거
    • 발생할 수 있는 오류에 대한 처리 구문과 생성된 객체를 제거하는 구문 BoardContent.jsp 문서 하단에 추가
  <%
  } // ---- end of try
  catch (SQLException e){
      e.printStackTrace();
  } finally{
      if (conn != null) {
          //---------------------- 생성된 객체의 제거와 페이지 이동
          rs1.close();
          pstmt.close();
          conn.close();
      }
  }
  %>
  </body>

하이퍼링크 작성

  • BoardContent.jsp : 4개의 문서의 하이퍼링크 존재

    • 목록 / 수정 / 답변 / 삭제
    • 키워드 검색 기능 여부에 관계없이
      • BoardContent.jsp 문서 : BoardList.jsp 문서의 레코드 제목에 작성된 하이러링크에 의해 실행
      • 레코드의 수정 / 삭제 / 답변 레코드 작성을 수행하는 모든 문서 : BoardContent.jsp 문서의 하이퍼링크에 의해 실행
      • 사실상 게시판의 모든 문서는 BoardList.jsp 문서에서부터 출발
    • BoardContent.jsp 문서 실행 -> 다시 BoardList.jsp 문서로 돌아옴, 이때 BoardList.jsp 문서는 이전의 상태를 그대로 유지해야 함
      • ex. 키워드 검색 기능 사용한 상태에서 BoardContent.jsp 문서 수행 -> 다시 BoardList.jsp 문서로 되돌아 옴 -> 이때 BoardList.jsp는 키워드 검색 결과를 계속해서 출력해야 함
      • 그러기 위해서는 BoardList.jsp -> BoardContent.jsp로 갈 때 rno 뿐 만 아니라 column, key 변수를 함께 전달 => 다시 BoardContent.jsp -> BoardList.jsp 이동 할 대 column, key 변수 활용하여 키워드 검색 결과 출력
      • 하지만 사실 BoardContent.jsp 문서가 레코드의 상세 내용을 출력하기 위해 column&key 변수가 반드시 필요한 것은 아님
      • BoardList.jsp 문서가 column&key 변수를 BoardContent.jsp문서로 전달하는 이유 : 단지 두 변수를 다시 되돌려 받기 위함
      • BoardContent.jsp 문서는 전달받은 rno를 다시 BoardList.jsp 문서로 전달할 필요 X
      • rno는 레코드 리스트를 출력하는 BoardList.jsp 문서에 반드시 필요 X + BoardList.jsp 문서 실행될 때 rno Db로부터 다시 추출됨
  • BoardList.jsp 문서의 수정

    • BoardContent.jsp 문서로의 하이퍼링크 수정
      • 검색 기능 사용 -> BoardContent.jsp 문서는 BoardList.jsp 문서로 부터 변수 rno, column(검색 대상), key(키워드)를 전달 받아야 함
      • BoardList.jsp 문서에서 BoardContent.jsp 문서를 실행하는 하이퍼링크 변결
      • 기존
        <TD WIDTH=395 ALIGN=LEFT>
            <A HREF="BoardContent.jsp?rno=<%=rno%>"><%=subject%></A>
        </TD>
      • 변경
        <TD WIDTH=395 ALIGN=LEFT>
        	<A HREF="BoardContent.jsp?rno=<%=rno%>&column=<%=column%>&key=<%=encoded_key%>"><%=subject%></A>
        </TD>
        // encode() 메소드에 의해 인코딩된 키워드가 저장된 encoded_key 변수가 key에 실려 전송됨
        // 다른 문서로 이동하는 것이기 때문에 인코딩해줘야함
          ```
    • [신규] 버튼의 하이퍼링크 수정
      • 키워드 검색 기능 사용 -> 일부 레코드 출력 중 -> 신규 버튼 클릭 -> BoardWrite.jsp 문서 실행 -> 글쓰기 중단 -> 다시 BoardList.jsp 문서로 돌아감 => 이때도 키워드 검색 결과가 나와야 함
      • BoardWrite.jsp 문서의 [취소] 버튼 클릭 -> BoardWrite.jsp 문서가 BoardList.jsp 문서로 column과 key 변수를 전달할 수 있도록 BoardList.jsp 문서로부터 column, key 전달받아야 함
      • BoardWrite.jsp 문서 : column, key 전달하기 위해 BoardList.jsp 문서의 [신규] 버튼의 하이퍼링크 변경
      • 기존
        <TD ALIGN=LEFT WIDTH=100>
            <IMG SRC="../images/btn_new.gif" onClick="javascript:location.replace('BoardWrite.jsp')"; STYLE=CURSOR:HAND>
        </TD>
      • 변경
        <TD ALIGN=LEFT WIDTH=100>
          <IMG SRC="../images/btn_new.gif" onClick="javascript:location.replace('BoardWrite.jsp?column=<%=column%>&key=<%=encoded_key%>')"; STYLE=CURSOR:HAND>
        </TD>
          ```
  • BoardWrite.jsp 문서의 수정

    • BoardWirte.jsp 문서는 키워드 검색을 위해 column, key를 BoardList.jsp 문서로부터 전달 받음 -> BoardWrite.jsp 문서 내에 키워드 검색을 처리하기 위한 구문이 추가 되어야함

    • 클래스의 지정

      • BoardList.jsp 문서로부터 한글 키워드가 전달된 경우 -> 키워드 인코딩 하기 위해 java.net.URLEncoder 클래스 import => 전달 받은 key 값을 다시 인코딩하여 전달하기 위해 아래 추가
        <%@ page import="java.net.URLEncoder"%>
          ```
    • 검색 기능을 위한 변수 지정 및 추출

      • BoardList.jsp 문서에서 전달된 column, key 값 추출

      • 만약 key =/= null -> encode()메소드 사용 -> 키워드 인코딩 -> 변수 encoded_key에 저장

      • key == null -> 키워드 검색 사용 X -> column, key 빈 문자열 지정

        <%
        String encoded_key = "";
        
        //------------------------------- 키워드 데이터 추출
        String column = request.getParameter("column");
        if (column == null) column="";
        
        String key = request.getParameter("key");
        if (key!=null) {
            encoded_key = URLEncoder.encode(key, "UTF-8");
        } else{
            key="";
        }
    • [목록] 버튼의 하이퍼링크 수정

      • BoardWrite.jsp 문서의 [목록] 버튼 클릭 -> BoardList.jsp 실행 : BoardList.jsp 문서는 이전 상태를 유지해야 함
      • BoardList.jsp 문서로부터 전달 받은 column, key 다시 BoardLust.jsp 문서로 전달
      • 기존
        <TD WIDTH=110 ALIGN=LEFT>
          <IMG SRC="../images/btn_list.gif" onClick="javascript:location.replace('BoardList.jsp')" STYLE=CURSOR:HAND>
        </TD>
      • 변경
        <TD WIDTH=110 ALIGN=LEFT>
          <IMG SRC="../images/btn_list.gif" onClick="javascript:location.replace('BoardList.jsp?column=<%=column%>&key=<%=encoded_key%>')" STYLE=CURSOR:HAND>
        </TD>
          ```
    • [취소] 버튼의 하이퍼링크 수정

      • BoardWrite.jsp 문서의 [취소] 버튼 : 레코드의 입력 취소, BoardList.jsp 문서 실행
      • 이 경우에도 BoardList.jsp 문서는 이전의 상태를 유지해야 함
      • BoardWrite.jsp 문서의 [취소] 버튼의 하이퍼링크 수정 → 변수 column, key를 BoardList.jsp 문서로 전달
      • 기존
        <TD WIDTH=400 ALIGN=CENTER>
          <IMG SRC="../images/btn_save.gif" STYLE=CURSOR:HAND onClick="javascript:CheckForm(BoardWrite)">&nbsp;&nbsp;
          <IMG SRC="../images/btn_cancle.gif"  STYLE=CURSOR:HAND>
        </TD>
      • 변경
        <TD WIDTH=400 ALIGN=CENTER>
          <IMG SRC="../images/btn_save.gif" STYLE=CURSOR:HAND onClick="javascript:CheckForm(BoardWrite)">&nbsp;&nbsp;
          <IMG SRC="../images/btn_cancle.gif" onClick="javascript:location.replace('BoardList.jsp?column=<%=column%>&key=<%=encoded_key%>')" STYLE=CURSOR:HAND>
        </TD>
          ```
          
    • 저장은 변경할 필요 X -> 검색 기능 사용 여부에 관계 없이 새로 입력된 레코드는 제일 먼저 나타나야 함

  • BoardContent.jsp 문서의 수정

    • BoardContent.jsp 문서는 BoardList.jsp 문서로부터 column(검색 대상), key(키워드)를 전달 받음 → 아래와 같은 구문들 추가

    • 키워드 데이터 추출

      • 키워드 검색에 사용할 column, key 전달 받음 → 추출 해야함

      • key가 한글일 경우 대비 → encode()메소드 사용 → 키워드 인코딩 → encoded_key에 저장

      • 검색 기능 사용 X → column, key 존재 X → 빈 문자열 지정

        <%
        String encoded_key = "";
        
        //------------------------------- 키워드 데이터 추출
        String column = request.getParameter("column");
        if (column == null) column="";
        
        String key = request.getParameter("key");
        if (key!=null) {
            encoded_key = URLEncoder.encode(key, "UTF-8");
        } else{
            key="";
        }
    • BoardList.jsp 문서로의 하이퍼링크 수정

      • BoardList.jsp 문서가 이전 상태를 유지하기 위해 → BoardList.jsp로 부터 전달받은 column, key 다시 BoardList.jsp로 전달
      • 기존
        <TD WIDTH="310" ALIGN=LEFT>
          <IMG SRC="../images/btn_list.gif" STYLE=CURSOR:HAND onClick="javascript:location.replace('BoardList.jsp')">
        </TD>
      • 변경
        <TD WIDTH="310" ALIGN=LEFT>
          <IMG SRC="../images/btn_list.gif" STYLE=CURSOR:HAND onClick="javascript:location.replace('BoardList.jsp?column=<%=column%>&key=<%=encoded_key%>')">
        </TD>
          ```
          
    • BoardReply.jsp 문서로의 하이퍼링크 수정

      • BoardContent.jsp 문서의 [답글] 버튼 이미지의 하이퍼링크에 의해 실행, 답변 레코드를 입력 받음
      • 입력된 답변 레코드의 내용 BoardReplyProc.jsp 문서에 전달
      • BoardReplyProc.jsp 문서는 전달받은 답변글 DB에 저장 → BoardList.jsp 문서 실행
      • 이때 BoardList.jsp 이전 상태 유지 ⇒ BoardReplyProc.jsp 문서로부터 column, key 전달 받아야 함
      • BoardList.jsp → 전달 : column&key → BoardContent.jsp → 전달 : column&key&부모레코드의 RcdNo→ BoardReply.jsp → 전달 : column&key&부모레코드의 RcdNo→ BoardReplyProc.jsp
      • 기존
        <IMG SRC="../images/btn_reply.gif" STYLE=CURSOR:HAND onClick="javascript:location.replace('BoardReply.jsp')">
        </TD>
      • 변경
        <IMG SRC="../images/btn_reply.gif" STYLE=CURSOR:HAND onClick="javascript:location.replace('BoardReply.jsp?rno=<%=rno%>&column=<%=column%>&key=<%=encoded_key%>')">
          ```
      • BoardReply.jsp 문서에서 rno, column, key 변수가 BoardReplyProc.jsp 문서로 전달되는 구문은 답변 레코드 작성 부분 개발할 때 작성할 것
    • BoardModify.jsp 문서로의 하이퍼링크 수정

      • BoardContent.jsp 문서의 [수정]버튼 이미지의 하이퍼링크에 의해 실행됨
      • 레코드의 수정을 위한 필드 값들과 패스워드 입력 받음
      • BoardModify.jsp → 전달 : 수정을 위해 입력된 내용 → BoardModifyProc.jsp 문서
      • BoardModifyProc.jsp 문서는 전달받은 패스워드 일치 → 전달받은 내용으로 DB 갱신 → BoardContent.jsp 실행
      • BoardContent.jsp에서 목록 클릭할 경우 BoardList.jsp 이전 상태 유지 → BoardContent.jsp 문서로부터 column, key 전달 받아야 함
      • BoardList.jsp → 전달 : column&key → BoardContent.jsp → 전달 : column&key&rno→ BoardModify.jsp → 전달 : column&key&rno→ BoardModifyProc.jsp
      • 기존
        <IMG SRC="../images/btn_mdfy.gif" STYLE=CURSOR:HAND onClick="javascript:location.replace('BoardModify.jsp')">
      • 변경
        <IMG SRC="../images/btn_mdfy.gif" STYLE=CURSOR:HAND onClick="javascript:location.replace('BoardModify.jsp?rno=<%=rno%>&column=<%=column%>&key=<%=encoded_key%>')">
          ```
      • BoardModify.jsp 문서에서 rno, column, key 변수가 BoardModifyProc.jsp 문서로 전달되는 구문은 수정 부분 개발할 때 작성할 것
    • BoardDelete.jsp 문서로의 하이퍼링크 수정

      • BoardContent.jsp 문서의 [삭제]버튼 이미지의 하이퍼링크에 의해 실행됨
      • 레코드의 삭제를 위한 패스워드 입력 받음
      • BoardDelete.jsp → 전달 : 입력된 패스워드 → BoardDeleteProc.jsp 문서
      • BoardDeleteProc.jsp 문서는 전달받은 패스워드 일치 → DB에서 해당 레코드 제거 → BoardContent.jsp 실행
      • BoardContent.jsp에서 목록 클릭할 경우 BoardList.jsp 이전 상태 유지 → BoardContent.jsp 문서로부터 column, key 전달 받아야 함
      • BoardList.jsp → 전달 : column&key → BoardContent.jsp → 전달 : column&key&rno→ BoardDelete.jsp → 전달 : column&key&rno→ BoardDeleteProc.jsp
        - 기존
        <IMG SRC="../images/btn_del.gif" STYLE=CURSOR:HAND onClick="javascript:location.replace('BoardDelete.jsp')">
      • 변경
        <IMG SRC="../images/btn_del.gif" STYLE=CURSOR:HAND onClick="javascript:location.replace('BoardDelte.jsp?rno=<%=rno%>&column=<%=column%>&key=<%=encoded_key%>')">
          ```
      • BoardDelete.jsp 문서에서 rno, column, key 변수가 BoardModifyProc.jsp 문서로 전달되는 구문은 수정 부분 개발할 때 작성할 것
profile
안녕하세요.

0개의 댓글