Programming Language/Javascript, ...

웹페이지 만들기(4) - 공지사항

Ma_Sand 2022. 5. 6. 18:45
반응형

menubar

<div class="menu"><a href="<%=contextPath%>/list.no">공지사항</a></div>

div 태그로 구역 잡아놓고, 공지사항을 클릭했을 때 해당 페이지로 넘어가도록 a 태그를 사용해서 링크를 걸어준다. 이때 list.no라고 매핑값을 설정하고 처음에 만들어놓은 변수 contextPath로 해당 프로젝트 Path 경로를 설정해준다.

 

 

 

 

Notice

- SQL Developer에 있는 notice 테이블의 컬럼명과 데이터타입을 VO에서 private 접근제한자로 필드를 선언한다.

- 기본 생성자와 매개변수 생성자, setter/getter 메소드, toString 메소드를 생성한다.

public class Notice {
	private int noticeNo;
	private String noticeTitle;
	private String noticeContent;
	private String noticeWriter;   //	조회 시 작성자 이름 / 작성할 떈 로그인 회원 번호
	private int count;	
	private Date createDate;
	private String status;
	
	public Notice() {
		super();
	}
    
	public Notice(int noticeNo, String noticeTitle, String noticeContent, String noticeWriter,
                  int count, Date createDate, String status) 
    {
		super();
		this.noticeNo = noticeNo;
		this.noticeTitle = noticeTitle;
		this.noticeContent = noticeContent;
		this.noticeWriter = noticeWriter;
		this.count = count;
		this.createDate = createDate;
		this.status = status;
	}
	
	public Notice(int noticeNo, String noticeTitle, String noticeWriter, int count, 
                  Date createDate) 
    {
		super();
		this.noticeNo = noticeNo;
		this.noticeTitle = noticeTitle;
		this.noticeWriter = noticeWriter;
		this.count = count;
		this.createDate = createDate;
	}
	
	public int getNoticeNo() {
		return noticeNo;
	}
	public void setNoticeNo(int noticeNo) {
		this.noticeNo = noticeNo;
	}
	public String getNoticeTitle() {
		return noticeTitle;
	}
	public void setNoticeTitle(String noticeTitle) {
		this.noticeTitle = noticeTitle;
	}
	public String getNoticeContent() {
		return noticeContent;
	}
	public void setNoticeContent(String noticeContent) {
		this.noticeContent = noticeContent;
	}
	public String getNoticeWriter() {
		return noticeWriter;
	}
	public void setNoticeWriter(String noticeWriter) {
		this.noticeWriter = noticeWriter;
	}
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
	public Date getCreateDate() {
		return createDate;
	}
	public void setCreateDate(Date createDate) {
		this.createDate = createDate;
	}
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
    
	@Override
	public String toString() {
		return "Notice [noticeNo=" + noticeNo + ", noticeTitle=" + noticeTitle 
                + ", noticeContent=" + noticeContent + ", noticeWriter=" + noticeWriter 
                + ", count=" + count + ", createDate=" + createDate + ", status=" + status 
                + "]";
	}
}

 

 

 

 

noticeListView

- 화면을 보여야 하므로 jsp 파일로 작성한다.

- 사용자에게 공지 목록을 보여준다.

- 일반 사용자가 아닌 관리자가 로그인했을 때에 공지사항 화면에서 글 작성 버튼이 보이도록 한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList, com.cd.notice.model.vo.Notice"%>
<!-- 아래 ArrayList<Notice>를 가져오려면 
     위에서 ArrayList와 Notice를 import 해야 한다. -->
<%
	ArrayList<Notice> list = (ArrayList<Notice>)request.getAttribute("list");
%>

<!-- body 영역 -->
<%@ include file="../common/menubar.jsp" %>

<h2 align="center">공지사항</h2>
    
<div class="outer">
    <table align="center" class="table table-bordered">
        <thead>
            <tr>
                <th width="10%">글번호</th>
                <th width="50%">글제목</th>
                <th width="15%">작성자</th>
                <th width="10%">조회수</th>
                <th width="15%">작성일</th>
            </tr>
        </thead>
        <tbody>
        <!-- 리스트가 비어있는 경우 -->
        <%if(list.isEmpty()) {%>
            <tr>
                <td colspan="5">공지사항이 없습니다.</td>
            </tr>
        <%} else{%>
            <%for(Notice n : list) {%>
                <tr>
                    <td><%=n.getNoticeNo() %></td>
                    <td><%=n.getNoticeTitle() %></td>
                    <td><%=n.getNoticeWriter() %></td>
                    <td><%=n.getCount() %></td>
                    <td><%=n.getCreateDate() %></td>
                </tr>
            <%} %>
        <%} %>
        </tbody>
    </table>
    <br>
    <!-- 로그인 안된 상태에서 getUserId를 먼저 하면 nullPointerException이 발생한다.
         null인지 아닌지 먼저 비교 후에 아이디가 admin인지 비교해야 한다. -->
    <%if(loginUser != null && loginUser.getUserId().equals("admin")) {%>
        <div id="writeBtn" align="right">
            <a href="<%=contextPath %>/enrollForm.no" class="btn btn-outline-info">글작성</a>
        </div>
    <%} %>
</div>

 

 

 

 

noticeEnrollForm

- 화면을 보여야 하므로 jsp 파일로 작성한다.

- 관리자가 공지사항을 작성할 수 있는 폼을 보여준다.

<%@ include file="/views/common/menubar.jsp"%>

<div class="outer">
    <br> <h2 align="center">공지글 작성</h2>
    <form action="<%=contextPath%>/insert.no" method="post">
    <input type="hidden" name="userNo" value="<%=loginUser.getUserNo()%>">
        <table align="center" id="enrollForm">
            <tr>
                <th width="10%">제목</th>
                <td><input type="text" name="title" required></td>
            </tr>
            <tr>
                <th>내용</th>
                <td></td>
            </tr>
            <tr>
                <td colspan="2">
                    <textarea name="content" id="" cols="50" rows="20" style="resize:none;" 
                    required></textarea>
                </td>
            </tr>
        </table>
            
        <div align="center">
            <button type="submit">등록</button>
            <button type="button" onclick="history.back();">취소</button>
            <!-- history.back(): 뒤로가기 전용 함수 -->
        </div>
    </form>
</div>

 

 

 

 

 

NoticeListController

- menubar에서 공지사항 클릭 시 servlet

- 매핑값 list.no

@WebServlet("/list.no")
public class NoticeListController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public NoticeListController() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 공지사항 조회 메소드
		ArrayList<Notice> list = new NoticeService().selectNoticeList();
		// 응답페이지: 공지사항 리스트 페이지(noticeListView.jsp)
		request.setAttribute("list", list);
		request.getRequestDispatcher("/views/notice/noticeListView.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

 

 

 

 

NoticeEnrollFormController

- 공지사항 글 작성 클릭 시 servlet

- 매핑값 enrollForm.no

@WebServlet("/enrollForm.no")
public class NoticeEnrollFormController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public NoticeEnrollFormController() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("views/notice/noticeEnrollForm.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

 

 

 

 

NoticeInsertController

- 공지사항 등록 클릭 시 servlet

- 매핑값 insert.no

@WebServlet("/insert.no")
public class NoticeInsertController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public NoticeInsertController() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		
		String userNo = request.getParameter("userNo");
		String noticeTitle = request.getParameter("title");
		String noticeContent = request.getParameter("content");
		
		// 매개변수 생성자를 만들어 해당 위치에 값을 넣는 방법
		// Notice n = new Notice(noticeTitle, noticeContent, userNo);
		
		// 매개변수 생성자 만들지 않고도 setter로 가능
		Notice n = new Notice();
		n.setNoticeTitle(noticeTitle);
		n.setNoticeContent(noticeContent);
		n.setNoticeWriter(userNo);
		
		int result = new NoticeService().insertNotice(n);
		
		if(result > 0) {
			request.getSession().setAttribute("alertMsg", "공지글이 등록되었습니다.");
			response.sendRedirect(request.getContextPath()+"/list.no");
		} else {
			request.setAttribute("errorMsg", "공지글 등록에 실패했습니다.");
			request.getRequestDispatcher("views/common/errorPage.jsp").forward(request, response);
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

 

 

 

 

NoticeService

- 공지사항 목록 조회

import static com.cd.common.JDBCTemplate.*;
// 위에서 미리 JDBCTemplate를 static으로 import 해놓으면 밑의 메소드에서 따로 JDBCTemplate를
// 작성하지 않아도 된다.

public ArrayList<Notice> selectNoticeList() {
    Connection conn = getConnection();
    ArrayList<Notice> list = new NoticeDao().selectNoticeList(conn);
    close(conn);
    return list;
}

 

- 공지사항 작성

public int insertNotice(Notice n) {
    Connection conn = getConnection();
		
    int result = new NoticeDao().insertNotice(conn, n);
		
    if(result > 0) {
        commit(conn);
    } else {
        rollback(conn);
    }
    close(conn);
    return result;
}

 

 

 

 

NoticeDao

public class NoticeDao {

    private Properties prop = new Properties();
	
    public NoticeDao() {
        String fileName = NoticeDao.class.getResource("/db/notice/notice-mapper.xml").getPath();
        try {
            prop.loadFromXML(new FileInputStream(fileName));
        } catch (IOException e) {
            e.printStackTrace();
    }
}

여기에 추가 작성한다.

 

- 공지사항 목록 조회

public ArrayList<Notice> selectNoticeList(Connection conn) {
    // SELECT문 -> ResultSet 객체(여러 행)
    ArrayList<Notice> list = new ArrayList<>();
		
    PreparedStatement pstmt = null;
    ResultSet rset = null;
		
    String sql = prop.getProperty("selectNoticeList");
		
    try {
        pstmt = conn.prepareStatement(sql);
        rset = pstmt.executeQuery();
        while(rset.next()) {
            list.add(new Notice(rset.getInt("NOTICE_NO")
                              , rset.getString("NOTICE_TITLE")
                              , rset.getString("USER_NAME")
                              , rset.getInt("COUNT")
                              , rset.getDate("CREATE_DATE")));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        close(rset);
        close(pstmt);
    }
    return list;
}

 

- 공지사항 작성

public int insertNotice(Connection conn, Notice n) {
    int result = 0;
    PreparedStatement pstmt = null;
    String sql = prop.getProperty("insertNotice");
    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, n.getNoticeTitle());
        pstmt.setString(2, n.getNoticeContent());
        pstmt.setString(3, n.getNoticeWriter());
			
        result = pstmt.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        close(pstmt);
    }
    return result;
}

 

 

 

 

notice-mapper

- xml 파일로 작성한다.

 

- selectNoticeList

<entry key="selectNoticeList">
    SELECT NOTICE_NO, NOTICE_TITLE, USER_NAME, COUNT, CREATE_DATE
    FROM NOTICE N
    JOIN MEMBER ON (NOTICE_WRITER=USER_NO)
    WHERE N.STATUS='Y'
    ORDER BY CREATE_DATE DESC
</entry>

 

- insertNotice

<entry key="insertNotice">
    INSERT INTO NOTICE(NOTICE_NO
                     , NOTICE_TITLE
                     , NOTICE_CONTENT
                     , NOTICE_WRITER) 
    VALUES (SEQ_NNO.NEXTVAL, ?, ?, ?)
</entry>
반응형