아하
  • 토픽

  • 스파링

  • 잉크

  • 미션


신중한수염고래10

신중한수염고래10

jsp로 커뮤니티를 구성중인데 문의드립니다.

안녕하세요. java + mysql + jsp로 간단한 커뮤니티를 구성하고 있습니다.

전체 코드는 너무 많고, 간략하게 표현하면

게시글 전체는 document 테이블에 저장하고, 개별 document 별로 Board 번호를 지정하여, 해당 Board의 번호를 request.getParameter을 통해 가져오면 해당 번호를 Board 번호로 갖고 있는 document만을 출력하는 방식입니다.

1. documentDAO의 게시글 정보를 불러오는 부분 (document에 관한 DTO는 있습니다)

public DocumentDTO getDocument(int documentNo) {

String SQL = "SELECT * FROM document WHERE documentno = ?";

try{

PreparedStatement pstmt = connection.prepareStatement(SQL);

pstmt.setInt(1, documentNo);

result = pstmt.executeQuery();

if(rs.next()){

DocumentDTO document = new DocumentDTO();

document.setDocumentNo(rs.getInt(1));

document.setDocWriter(rs.getString(2));

document.setBoardNo(rs.getInt(3));

document.setDocTitle(rs.getString(4));

document.setDocContent(rs.getString(5));

}

return document;

} catch(Exception e){

e.PrintStackTrace();

}

return null;

}

2. BoardDAO의 게시판 설정을 불러오는 부분 (Board에 관한 DTO는 있습니다)

아래 ListPermission, ViewPermission, WritePermission에는 각각 1-4에 해당하는 정수형 자료가 들어가 있으며, 회원 DB에는 각 회원의 type을 1-4로 분류하여 저장하고 있습니다. 그리고 회원의 type이 각각의 Permission보다 작으면 각각을 실행하지 못하도록 하려고 합니다.

public BoardDTO getBoardInfo(int BoardNo) {

String SQL = "SELECT * FROM board WHERE boardno = ?";

try{

PreparedStatement pstmt = connection.prepareStatement(SQL);

pstmt.setInt(1, boardNo);

result = pstmt.executeQuery();

if(rs.next()){

BoardDTO board = new BoardDTO();

board.setBoardNo(rs.getInt(1));

board.setListPermission(rs.getInt(2));

board.setViewPermission(rs.getInt(3));

board.setWritePermission(rs.getInt(4));

}

return board;

} catch(Exception e){

e.PrintStackTrace();

}

return null;

}

3. view.jsp (게시글을 출력하는 부분, PrintWriter등 필요한 라이브러리는 import 되어 있음)

게시판의 html 서식에 맞추어 출력되는 부분 앞에 다음과 같이 코드가 작성되어 있습니다. 로그인시 로그인한 user의 회원번호를 session에 저장하고 있습니다.

<% int userNo = 0;

if(session.getAttribute("userNo") != null){

userNo = (int) session.getAtrribute("userNo");

} else {

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("location.href='login.jsp';");

script.println("</script>");

}

int documentno = 0;

int boardno = 0;

if(request.getParameter("documentno") != null && request.getParameter("boardno") != null) {

documentno = Integer.parseInt(request.getParameter("documentno"));

boardno =Integer.parseInt(request.getParameter("boardno"));

} else {

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("alert('유효하지 않은 요청입니다');");

script.println("history.back();");

script.println("</script>");

}

UserDAO userDAO = new UserDAO();

DocumentDAO documentDAO = new DocumentDAO();

BoardDAO boardDAO = new BoardDAO();

if(userDAO.getUserInfobyUserNo(userNo).getUserType() < boardDAO.getBoardInfo(boardno).getViewPermission()){

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("alert('게시글을 열람할 권한이 없습니다.');");

script.println("history.back();");

script.println("</script>");

}

------------------------------------------------------

이상과 같이, 로그인 세션의 유무를 먼저 확인한 뒤 세션이 확인되지 않으면 login.jsp로 보내고, boardno와 documentno를 getParameter을 통해서 받아오되 해당 값이 null이면 유효하지 않은 요청으로 보고 이전페이지로 보내며, 회원의 type을 가져온 뒤 위 getParameter을 통해서 받아온 boardno에 해당하는 board를 정보를 db에서 가져온 뒤, 해당 정보 중 View Permission 값이 회원 type보다 크면 게시글을 열람할 권한이 없다는 알림을 띄우고 이전페이지로 보내는 식으로 구성하였습니다. 그런데 실제로 위 오류가 각 발생하도록 실행을 해보면(예컨대 view.jsp?boardno=&documentno=1 등 parameter을 누락하고 접속한다든지), 위 순서대로 실행되지 않는 것으로 확인됩니다.

---------------------------------------------------------

java.lang.NumberFormatException: For input string: ""

java.lang.NullPointerException: Cannot invoke "document.BoardDTO.getViewPermission()" because the return value of "document.BoardDAO.getBoardInfo(int)" is null

---------------------------------------------------------

즉, getParameter("boardno")가 null이면 PrintWriter를 호출하여 스크립트를 실행하여야 하는데, 그 이하의 권한체크 부분까지 실행하여 NullPointerException을 뱉어내는 것입니다.

JAVA의 경우 C나 javascript와 달리 그 실행 순서에 정한 것이 있는지 찾아보아도, jsp 내에서 작성한 순서에 따라서 순차로 실행된다는 이야기가 있어 굉장히 혼란스럽습니다. 즉 위와 같은 오류를 뱉어내는 이유를 모르겠습니다.

    1개의 답변이 있어요!

    • 탈퇴한 사용자

      탈퇴한 사용자

      안녕하세요.

      jsp는 순차적으로 실행됩니다. if / else를 처리하고 아래에 있는 코드도 처리하기 때문인데요.

      중간에 더 이상 실행이 필요 없을 때에는 "return"을 사용하시면 됩니다.

      if(session.getAttribute("userNo") != null){ userNo = (int) session.getAtrribute("userNo"); } else { PrintWriter script = response.getWriter(); script.println("<script>"); script.println("location.href='login.jsp';"); script.println("</script>"); // else 일 때에는 아래 코드 실행 안함 return; }