반응형
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>
반응형