본문 바로가기

웹 개발/JSP

[Web_JSP] 24

실습(MVC(board))

- [Web_JSP] 23 이어서

 

1. web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>board</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet> 
  	<servlet-name>MemberFrontController</servlet-name>
  	<servlet-class>com.board.app.member.MemberFrontController</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>MemberFrontController</servlet-name>
  	<url-pattern>*.me</url-pattern>
  </servlet-mapping>
  
    <servlet>
  	<servlet-name>BoardFrontController</servlet-name>
  	<servlet-class>com.board.app.board.BoardFrontController</servlet-class>
  </servlet>

  <servlet-mapping>
  	<servlet-name>BoardFrontController</servlet-name>
  	<url-pattern>*.bo</url-pattern>
  </servlet-mapping>
  
  <servlet>
  	<servlet-name>ReplyFrontController</servlet-name>
  	<servlet-class>com.board.app.reply.ReplyFrontController</servlet-class>
  </servlet>

  <servlet-mapping>
  	<servlet-name>ReplyFrontController</servlet-name>
  	<url-pattern>*.re</url-pattern>
  </servlet-mapping>
</web-app>

 

 

 

2. header.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<header id="header">
	<a href="index.html" class="logo">Altitude <span>by Pixelarity</span></a>
	<nav>
		<ul>
			<li><a href="#menu">Menu</a></li>
		</ul>
	</nav>
</header> 

<!-- Nav -->
<nav id="menu">
	<ul class="actions stacked">
		<c:choose>
			<c:when test="${memberNumber eq null}">
				<li><a href="${pageContext.request.contextPath }/member/MemberJoin.me" class="button primary fit">회원가입</a></li>
				<li><a href="${pageContext.request.contextPath }/member/MemberLogin.me" class="button fit">로그인</a></li>
			</c:when>
			<c:otherwise>
				<li><a href="${pageContext.request.contextPath }/member/MemberLogout.me" class="button fit">로그아웃</a></li>
			</c:otherwise>
		</c:choose>
	</ul>
</nav>

 

 

 

3. MemberFrontController.java

package com.board.app.member;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.board.app.action.ActionInfo;

public class MemberFrontController extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}

	protected void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String requestURL = req.getRequestURI();
//		String command = requestURL.substring(requestURL.lastIndexOf("/") + 1);
		String command = requestURL.substring(req.getContextPath().length());
		ActionInfo actionInfo = null;
		System.out.println(command);
		
		if(command.equals("/member/MemberCheckIdOk.me")) {
			new MemberCheckIdOk().execute(req, resp);
		}else if(command.equals("/member/MemberJoinOk.me")) {
			actionInfo = new MemberJoinOk().execute(req, resp);
		}else if(command.equals("/member/MemberLogin.me")) {
			actionInfo = new MemberLogin().execute(req, resp);
		}else if(command.equals("/member/MemberLoginOk.me")) {
			actionInfo = new MemberLoginOk().execute(req, resp);
		}else if(command.equals("/member/MemberLogout.me")) {
			actionInfo = new MemberLogout().execute(req, resp);
		}
		
		if(actionInfo != null) {
			if(actionInfo.isRedirect()) {
				resp.sendRedirect(actionInfo.getPath());
			}else {
				RequestDispatcher dispatcher = req.getRequestDispatcher(actionInfo.getPath());
				dispatcher.forward(req, resp);
			}
		}
	}
}

 

 

 

4. MemberLogout.java

package com.board.app.member;

import java.io.IOException;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.board.app.action.Action;
import com.board.app.action.ActionInfo; 

public class MemberLogout implements Action {

	@Override
	public ActionInfo execute(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		ActionInfo actionInfo = new ActionInfo();
		HttpSession session = req.getSession();
		
		session.invalidate();
		
		if(req.getHeader("Cookie") != null) {
			Cookie[] cookies = req.getCookies();
			for(Cookie cookie : cookies) {
				cookie.setMaxAge(0);
				resp.addCookie(cookie);
			}
		}
		
		actionInfo.setRedirect(true);
		actionInfo.setPath(req.getContextPath() + "/member/MemberLogin.me");
		
		return actionInfo;
	}

}

 

 

 

5. boardDetail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!DOCTYPE HTML>
<!--
   Altitude by Pixelarity
   pixelarity.com | hello@pixelarity.com
   License: pixelarity.com/license
-->
<html>
   <head>
      <title>게시글 상세보기</title>
      <meta charset="utf-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
      <link rel="stylesheet" href="${pageContext.request.contextPath}/assets/css/main.css" />
      <style>
         form textarea{
            border-radius:0; 
            resize:none;
            color:black !important;
         }
         
         form div#reply{
            display:flex;
            margin-bottom:3%;
         }
         
         input[type='submit']:not(#register), input[type='button'] {border-radius:0;}
         
         ul.actions li {
             padding: 0 0 0 0.2em;
         }
         
         p.content{
            width:63%;
         }
         
         p.writer{
            width:20%;
            font-weight:bold;
         }
         
      </style>
   </head>
   <body class="is-preload">
   		<c:set var="board" value="${board}"/>
   		<c:set var="files" value="${files}"/>
   		<c:set var="page" value="${page}"/>
      <!-- Page Wrapper -->
         <div id="page-wrapper">

            <!-- Wrapper -->
               <div class="wrapper">
                  <div class="inner">
                     <jsp:include page="/app/fix/header.jsp"/>
                  </div>
               </div>

            <!-- Wrapper -->
               <div class="wrapper">
                  <div class="inner">

                     <!-- Main -->
                     <section class="main">
                        <a href="#" class="image main"><img src="${pageContext.request.contextPath}/images/boardView.png" alt="" /></a>
                        <div class="col-12">
                           <ul class="actions" style="display:flex; justify-content:flex-end;">
                              <li><input type="button" value="글쓰기" class="primary" onclick="location.href = '${pageContext.request.contextPath}/board/BoardWrite.bo?page=${page}'"/></li>
                              <li><input type="button" value="목록" class="primary" onclick="location.href = '${pageContext.request.contextPath}/board/BoardListOk.bo?page=${page}'"/></li>
                              <c:if test="${memberNumber eq board.getMemberNumber()}">
	                              <li><input type="button" value="수정" onclick="location.href = '${pageContext.request.contextPath}/board/BoardUpdate.bo?boardNumber=${board.getBoardNumber()}&page=${page}'"/></li>
	                              <li><input type="button" value="삭제" onclick="location.href = '${pageContext.request.contextPath}/board/BoardDeleteOk.bo?boardNumber=${board.getBoardNumber()}'"/></li>
	                          </c:if>
                           </ul>
                        </div>
                        <header class="major">
                        
                           <h2 style="text-align:left;">${board.getBoardTitle()}</h2>
                           <p style="text-align:left; margin-bottom:1%">작성자 : ${board.getMemberId()}</p>
                        </header>
						<hr style="margin-top:0;">
                           <div>
                              첨부파일
                           </div>
                           <!-- 첨부파일 목록 -->
                           <c:choose>
                           	<c:when test="${files != null and fn:length(files) > 0}">
	                           <c:forEach var="file" items="${files}">
		                           <a href="${pageContext.request.contextPath}/board/FileDownloadOk.bo?fileName=${file.getFileName()}&fileNameOriginal=${file.getFileNameOriginal()}">
		                           	<c:out value="${file.getFileNameOriginal()}"/>
		                           </a>
		                           <br>
	                           </c:forEach>
	                       	</c:when>
	                       	<c:otherwise>
	                       		<br>
	                       		첨부파일이 없습니다.
	                       	</c:otherwise>
                           </c:choose>
                        <hr />
                        <!-- 내용 -->
                        <h3><pre>${board.getBoardContent()}</pre></h3>
                     </section>
                     <section class="main accent2" style="padding:3%">
                        <header class="major" style="text-align:left;">
                           <h2>댓글</h2>
                           <p>여러분의 소중한 댓글을 작성해주세요.</p>
                        </header>
                        <form method="post" action="#" class="combined" style="width:auto;">
                           <textarea name="content" id="content" placeholder="비속어를 사용하지 말아주세요." class="invert" rows="5" style="border-radius:0; resize:none;"></textarea>
                           <input id="register" type="button" class="primary" value="등록" onclick="insert()"/>
                        </form>
                        <form action="#" id="replies" class="combined" style="flex-direction:column; margin:0; display:contents;">
                        </form>
                     </section>
                  </div>
               </div>

            <!-- Wrapper -->
               <div class="wrapper">
                  <div class="inner">

                     <!-- Footer -->
                        <footer id="footer">
                           <section class="links">
                              <div>
                                 <h3>Magna</h3>
                                 <ul class="plain">
                                    <li><a href="#">Aliquam tempus</a></li>
                                    <li><a href="#">Ultrecies nul</a></li>
                                    <li><a href="#">Gravida ultricies</a></li>
                                    <li><a href="#">Commodo etiam</a></li>
                                 </ul>
                              </div>
                              <div>
                                 <h3>Feugiat</h3>
                                 <ul class="plain">
                                    <li><a href="#">Morbi sem lorem</a></li>
                                    <li><a href="#">Praes sed dapi</a></li>
                                    <li><a href="#">Sed adipis nullam</a></li>
                                    <li><a href="#">Fus dolor lacinia</a></li>
                                 </ul>
                              </div>
                              <div>
                                 <h3>Tempus</h3>
                                 <ul class="plain">
                                    <li><a href="#">Donecnec etiam</a></li>
                                    <li><a href="#">Aapibus sedun</a></li>
                                    <li><a href="#">Namnulla tempus</a></li>
                                    <li><a href="#">Morbi set amet</a></li>
                                 </ul>
                              </div>
                              <div>
                                 <h3>Aliquam</h3>
                                 <ul class="plain">
                                    <li><a href="#">Lorem prasent dia</a></li>
                                    <li><a href="#">Nellentes ipsum</a></li>
                                    <li><a href="#">Diamsed arcu dolor</a></li>
                                    <li><a href="#">Sit amet cursus</a></li>
                                 </ul>
                              </div>
                           </section>
                           <ul class="contact-icons">
                              <li class="icon solid fa-home">1234 Fictional Street #5432 Nashville, TN 00000-0000</li>
                              <li class="icon solid fa-phone"><a href="#">(000) 000-0000</a></li>
                              <li class="icon solid fa-envelope"><a href="#">info@untitled.tld</a></li>
                           </ul>
                           <p class="copyright">&copy; Untitled. All rights reserved.</p>
                        </footer>

                  </div>
               </div>

         </div>

      <!-- Scripts -->
         <script src="${pageContext.request.contextPath}/assets/js/jquery.min.js"></script>
         <script>
         	let contextPath = "${pageContext.request.contextPath}";
         	let boardNumber = "${board.getBoardNumber()}";
         	let memberNumber = "${memberNumber}";
         </script>
         <script src="${pageContext.request.contextPath}/assets/js/browser.min.js"></script>
         <script src="${pageContext.request.contextPath}/assets/js/breakpoints.min.js"></script>
         <script src="${pageContext.request.contextPath}/assets/js/util.js"></script>
         <script src="${pageContext.request.contextPath}/assets/js/main.js"></script>
         <script src="${pageContext.request.contextPath}/assets/js/reply.js"></script>
   </body>
</html>

 

 

 

 

 

 

'웹 개발 > JSP' 카테고리의 다른 글

[Web_JSP] 23  (0) 2022.06.11
[Web_JSP] 22  (0) 2022.06.10
[Web_JSP] 21  (0) 2022.06.09
[Web_JSP] 20  (0) 2022.06.08
[Web_JSP] 19  (0) 2022.06.07