<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>PSE's blog</title>
    <link>https://mystudyblog-it.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 8 Jun 2026 02:49:11 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>PSEveloper</managingEditor>
    <image>
      <title>PSE's blog</title>
      <url>https://tistory1.daumcdn.net/tistory/3555942/attach/1f48ba76ffd54be89f390b8f9ec7b15d</url>
      <link>https://mystudyblog-it.tistory.com</link>
    </image>
    <item>
      <title>[Spring] ERROR : java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener</title>
      <link>https://mystudyblog-it.tistory.com/227</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;: &lt;span&gt;&amp;gt; Maven &amp;gt; Update Project Configuration 실행시 maven 라이브러리 경로가 삭제되는 현상으로 발생하는 오류&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제 해결&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;: &amp;gt; 프로젝트 우클릭 &amp;gt; properties * Deployment Assembly &amp;gt; Add 버튼 &amp;gt; Java Build Path Entries &amp;gt; Maven Dependencies 선택 &amp;gt; Apply버튼을 클릭하면 &lt;span style=&quot;color: #333333;&quot;&gt;경로가 재설정되어 정상적으로 서버가 시작된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;참고 사이트&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;: &lt;a href=&quot;https://myblog.opendocs.co.kr/archives/1657&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;myblog.opendocs.co.kr/archives/1657&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Backend/Spring</category>
      <category>error</category>
      <author>PSEveloper</author>
      <guid isPermaLink="true">https://mystudyblog-it.tistory.com/227</guid>
      <comments>https://mystudyblog-it.tistory.com/227#entry227comment</comments>
      <pubDate>Wed, 23 Dec 2020 00:52:28 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] ERROR : Cannot find class [org.springframework.web.servlet.view.tiles3.TilesViewResolver]</title>
      <link>https://mystudyblog-it.tistory.com/226</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;: &lt;span style=&quot;color: #000000;&quot;&gt;스프링 프레임워크의 버전이 낮아서 생긴 오류, &lt;span style=&quot;color: #000000;&quot;&gt;3.1.1.RELEASE에서는 tiles3를 사용할 수 없음!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;● pom.xml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608651763780&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
	xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
	&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
	&amp;lt;groupId&amp;gt;com.mypro&amp;lt;/groupId&amp;gt;
	&amp;lt;artifactId&amp;gt;deuqoo&amp;lt;/artifactId&amp;gt;
	&amp;lt;name&amp;gt;Deuqoo&amp;lt;/name&amp;gt;
	&amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;
	&amp;lt;version&amp;gt;1.0.0-BUILD-SNAPSHOT&amp;lt;/version&amp;gt;
	&amp;lt;properties&amp;gt;
		&amp;lt;java-version&amp;gt;1.6&amp;lt;/java-version&amp;gt;
		&amp;lt;org.springframework-version&amp;gt;3.1.1.RELEASE&amp;lt;/org.springframework-version&amp;gt;
		&amp;lt;org.aspectj-version&amp;gt;1.6.10&amp;lt;/org.aspectj-version&amp;gt;
		&amp;lt;org.slf4j-version&amp;gt;1.6.6&amp;lt;/org.slf4j-version&amp;gt;
	&amp;lt;/properties&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;rarr; &lt;span style=&quot;color: #000000;&quot;&gt;3.1.1.RELEASE를 5.2.5.RELEASE로 바꾸었더니 해결되었음&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;참고 사이트 : &lt;a href=&quot;https://myhappyman.tistory.com/82&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;myhappyman.tistory.com/82&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Backend/Spring</category>
      <category>error</category>
      <author>PSEveloper</author>
      <guid isPermaLink="true">https://mystudyblog-it.tistory.com/226</guid>
      <comments>https://mystudyblog-it.tistory.com/226#entry226comment</comments>
      <pubDate>Wed, 23 Dec 2020 00:45:27 +0900</pubDate>
    </item>
    <item>
      <title>[JSP] STUDY 25 - 게시판 만들기(MVC2 패턴) (7) : 글 검색하기</title>
      <link>https://mystudyblog-it.tistory.com/225</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(25) - STUDY 25.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VkxBO/btqQLlMT6DJ/OiZK51y2z9JC1GWdFuRwFk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VkxBO/btqQLlMT6DJ/OiZK51y2z9JC1GWdFuRwFk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VkxBO/btqQLlMT6DJ/OiZK51y2z9JC1GWdFuRwFk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVkxBO%2FbtqQLlMT6DJ%2FOiZK51y2z9JC1GWdFuRwFk%2Fimg.jpg&quot; data-filename=&quot;JSP&amp;amp;Servlet(25) - STUDY 25.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. 글 검색하기&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boardList.jsp (&lt;b&gt;전체&amp;nbsp;페이지&lt;/b&gt;)&amp;nbsp; &amp;rarr;&amp;nbsp; boardSearch.do&amp;nbsp; &amp;rarr;&amp;nbsp;&amp;nbsp;web.xml&amp;nbsp; &amp;rarr;&amp;nbsp;&amp;nbsp;BoardFrontController.java&amp;nbsp; &amp;rarr;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;BoardSearchAction&lt;/span&gt;.java&amp;nbsp; &amp;rarr;&amp;nbsp; BoardDAO.java&amp;nbsp; &amp;rarr;&amp;nbsp; boardMapper.xml (&lt;b&gt;검색한 DTO 배열 반환&lt;/b&gt;)&amp;nbsp; &amp;rarr;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BoardDAO.java&amp;nbsp; &amp;rarr;&amp;nbsp; &lt;span style=&quot;color: #333333;&quot;&gt;BoardSearchAction&lt;/span&gt;.java&amp;nbsp; &amp;rarr; &lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;BoardFrontController.java&amp;nbsp; &amp;rarr;&amp;nbsp;&amp;nbsp;ActionForward.java&amp;nbsp; &amp;rarr;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;boardSearchList.jsp (&lt;b&gt;검색한 글 리스트를 보여주는 화면으로&amp;nbsp;전환&lt;/b&gt;)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1) boardList.jsp&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608379607573&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@page import=&quot;com.hanul.dto.BoardDTO&quot;%&amp;gt;
&amp;lt;%@page import=&quot;java.util.List&quot;%&amp;gt;
&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;%
request.setCharacterEncoding(&quot;utf-8&quot;);
List&amp;lt;BoardDTO&amp;gt; list = (List&amp;lt;BoardDTO&amp;gt;) request.getAttribute(&quot;list&quot;);

%&amp;gt;

&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;boardList&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;div align=&quot;center&quot;&amp;gt;
		&amp;lt;h3&amp;gt;[게시판 전체목록 보기]&amp;lt;/h3&amp;gt;
		&amp;lt;table border=&quot;1&quot; style=&quot;width: 80%&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				 &amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;!-- 1. JSTL core 문법을 이용한 출력 : b_num_seq에 의해서 번호의 순서가 안맞다. --&amp;gt;
			&amp;lt;c:if test=&quot;${empty list} &quot;&amp;gt;
				&amp;lt;tr align=&quot;center&quot;&amp;gt;
					&amp;lt;td colspan=&quot;5&quot;&amp;gt;작성된 글이 없습니다.&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
			&amp;lt;/c:if&amp;gt;
			&amp;lt;%-- 			
			&amp;lt;c:if test=&quot;${list ne null }&quot;&amp;gt;
				&amp;lt;c:forEach var=&quot;i&quot; items=&quot;${list }&quot;&amp;gt;
					&amp;lt;tr align=&quot;center&quot;&amp;gt;
						&amp;lt;td&amp;gt;${i.b_num }&amp;lt;/td&amp;gt;
						&amp;lt;td&amp;gt;${i.b_subject }&amp;lt;/td&amp;gt;
						&amp;lt;td&amp;gt;${i.b_writer }&amp;lt;/td&amp;gt;
						&amp;lt;td&amp;gt;${i.b_date }&amp;lt;/td&amp;gt;
						&amp;lt;td&amp;gt;${i.b_readcount }&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
				&amp;lt;/c:forEach&amp;gt;
			&amp;lt;/c:if&amp;gt; 
			--%&amp;gt;
			
			&amp;lt;!-- 2. 향상된 for문을 이용한 출력 : 번호 순서가 맞지 않다. --&amp;gt;
			&amp;lt;%--
				if(list.size() == 0) {
					out.println(&quot;&amp;lt;tr align='center'&amp;gt;&amp;lt;td colspan='5'&amp;gt;작성된 글이 없습니다.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&quot;);
				} else {
					for(BoardDTO dto : list) {
						out.println(&quot;&amp;lt;tr align='center'&amp;gt;&quot;);
						out.println(&quot;&amp;lt;td&amp;gt; &quot; + dto.getB_num() + &quot;&amp;lt;/td&amp;gt;&quot;);
						out.println(&quot;&amp;lt;td&amp;gt; &quot; + dto.getB_subject() + &quot;&amp;lt;/td&amp;gt;&quot;);
						out.println(&quot;&amp;lt;td&amp;gt; &quot; + dto.getB_writer() + &quot;&amp;lt;/td&amp;gt;&quot;);
						out.println(&quot;&amp;lt;td&amp;gt; &quot; + dto.getB_date() + &quot;&amp;lt;/td&amp;gt;&quot;);
						out.println(&quot;&amp;lt;td&amp;gt; &quot; + dto.getB_readcount() + &quot;&amp;lt;/td&amp;gt;&quot;);
						out.println(&quot;&amp;lt;/tr&amp;gt;&quot;);
					}//for
				}//if-else
			--%&amp;gt;
			
			&amp;lt;%
				if(list.size() == 0) {
					out.println(&quot;&amp;lt;tr align='center'&amp;gt;&amp;lt;td colspan='5'&amp;gt;작성된 글이 없습니다.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&quot;);
				} else {
					for(int i = 0; i &amp;lt; list.size(); i++) {
						out.println(&quot;&amp;lt;tr align='center'&amp;gt;&quot;);
						/* out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_num() + &quot;&amp;lt;/td&amp;gt;&quot;); */
						out.println(&quot;&amp;lt;td&amp;gt; &quot; + (list.size() - i) + &quot;&amp;lt;/td&amp;gt;&quot;);
						out.println(&quot;&amp;lt;td&amp;gt;&amp;lt;a href='boardDetail.do?b_num=&quot; + list.get(i).getB_num() + &quot;'&amp;gt;&quot; 
									+ list.get(i).getB_subject() + &quot;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&quot;);
						out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_writer() + &quot;&amp;lt;/td&amp;gt;&quot;);
						out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_date() + &quot;&amp;lt;/td&amp;gt;&quot;);
						out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_readcount() + &quot;&amp;lt;/td&amp;gt;&quot;);
						out.println(&quot;&amp;lt;/tr&amp;gt;&quot;);
					}//for
				}//if-else				
			%&amp;gt;
			
			&amp;lt;tr align=&quot;center&quot;&amp;gt;
				&amp;lt;td colspan=&quot;5&quot;&amp;gt;
					&amp;lt;form action=&quot;boardSearch.do&quot; method=&quot;post&quot;&amp;gt;
						&amp;lt;select name=&quot;part&quot;&amp;gt;
							&amp;lt;option value=&quot;b_subject&quot;&amp;gt;제목&amp;lt;/option&amp;gt;
							&amp;lt;option value=&quot;b_content&quot;&amp;gt;내용&amp;lt;/option&amp;gt;
							&amp;lt;option value=&quot;b_writer&quot;&amp;gt;작성자&amp;lt;/option&amp;gt;							
						&amp;lt;/select&amp;gt;
						&amp;lt;input type=&quot;text&quot; name=&quot;searchData&quot; required=&quot;required&quot; /&amp;gt;
						&amp;lt;input type=&quot;submit&quot; value=&quot;검색하기&quot; /&amp;gt;
						&amp;lt;input type=&quot;button&quot; value=&quot;글쓰기&quot; onclick=&quot;location.href='boardInsertForm.do'&quot; /&amp;gt;
					&amp;lt;/form&amp;gt;
				&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;- 검색 레이아웃 부분을 form 태그로 감싸고, type이 submit인 버튼을 클릭했을 때 검색 기능이 이루어지도록 한다(action 속성의 값을 boardSearch.do로 설정).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2) BoardFrontController.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608379859282&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.action.Action;
import com.hanul.action.ActionForward;
import com.hanul.action.BoardDeleteAction;
import com.hanul.action.BoardDetailAction;
import com.hanul.action.BoardInsertAction;
import com.hanul.action.BoardListAction;
import com.hanul.action.BoardSearchAction;
import com.hanul.action.BoardUpdateAction;
import com.hanul.action.BoardUpdateFormAction;

@WebServlet(&quot;/BoardFrontController.do&quot;)
public class BoardFrontController extends HttpServlet {

	protected void service(HttpServletRequest request, 
				HttpServletResponse response) 
					throws ServletException, IOException {
		// ① 클라이언트가 어떤 요청을 했는가 파악한다.
		request.setCharacterEncoding(&quot;utf-8&quot;);
		String uri = request.getRequestURI();			//uri-pattern 값 : /mbb/xxx.do
		String ctx = request.getContextPath();			//Context root 값 : /mbb
		String command = uri.substring(ctx.length());	//실제 요청한 페이지 : /xxx.do
		//System.out.println(&quot;uri : &quot; + uri);
		//System.out.println(&quot;ctx : &quot; + ctx);
		//System.out.println(&quot;command : &quot; + command);
		
		// ② 클라이언트 요청(*.do &amp;rarr; command)과 실제 처리할 비즈니스 로직(Action Class)
		//	 servlet(FrontController.java) &amp;rarr; class(Action.java)
		Action action = null;
		ActionForward forward = null;
		
		if (command.equals(&quot;/boardList.do&quot;)) {
			action = new BoardListAction();
			forward = action.excute(request, response);
		} else if(command.equals(&quot;/boardInsertForm.do&quot;)) {	//글쓰기 폼으로 화면 전환
			forward = new ActionForward();
			forward.setPath(&quot;board/boardInsertForm.jsp&quot;);
			forward.setRedirect(false);
			// 가져갈 게 없으므로 sendRedirect로 하면 되지만
			// url이 바뀌지 않아야 하므로 forward방식으로 전달
		} else if(command.equals(&quot;/boardInsert.do&quot;)) {
			action = new BoardInsertAction();
			forward = action.excute(request, response);
			// 여기서 forward에 null이라는 값이 들어오므로 밑의 코드가 실행이 되지 않는다.
		} else if(command.equals(&quot;/boardDetail.do&quot;)) {
			action = new BoardDetailAction();
			forward = action.excute(request, response);
		} else if(command.equals(&quot;/boardDelete.do&quot;)) {
			action = new BoardDeleteAction();
			forward = action.excute(request, response);
		} else if(command.equals(&quot;/boardUpdateForm.do&quot;)) {
			action = new BoardUpdateFormAction();
			forward = action.excute(request, response);
		} else if(command.equals(&quot;/boardUpdate.do&quot;)) {
			action = new BoardUpdateAction();
			forward = action.excute(request, response);
		} else if(command.equals(&quot;/boardSearch.do&quot;)) {
			action = new BoardSearchAction();
			forward = action.excute(request, response);
		}
		
		// ③ 페이지 전환(프리젠테이션 로직 수행) : forward(), sendRedirect
		//	 ActionForward.java가 담당
		if (forward != null) {
			if (forward.isRedirect()) {		//true : sendRedirect() 페이지 전환
				response.sendRedirect(forward.getPath());
			} else {					// false : forward() 페이지 전환
				RequestDispatcher rd = request.getRequestDispatcher(forward.getPath());
				rd.forward(request, response);
			}
		}
		
	}//service()
	
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3) BoardSearchAction.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608379882666&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.action;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.dao.BoardDAO;
import com.hanul.dto.BoardDTO;
import com.hanul.dto.SearchDTO;

public class BoardSearchAction implements Action{

	@Override
	public ActionForward excute(HttpServletRequest request, 
				   HttpServletResponse response)
		throws ServletException, IOException {
		//클라이언트 요청
		request.setCharacterEncoding(&quot;utf-8&quot;);
		String part = request.getParameter(&quot;part&quot;);
		String searchData = request.getParameter(&quot;searchData&quot;);
		
		SearchDTO dto = new SearchDTO();
		dto.setPart(part);
		dto.setSearchData(&quot;%&quot; + searchData + &quot;%&quot;);
		
		//비즈니스 로직
		BoardDAO dao = new BoardDAO();
		List&amp;lt;BoardDTO&amp;gt; list = dao.boardSearch(dto);
		request.setAttribute(&quot;list&quot;, list);
		
		//프리젠테이션 로직
		ActionForward forward = new ActionForward();
		forward.setPath(&quot;board/boardSearchList.jsp&quot;);
		forward.setRedirect(false);
		
		return forward;
	}//excute()
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;- 사용자가 검색창에 입력한 글자를 넘길 때 앞 뒤로 %를 덧붙여 넘김으로써 앞 뒤와 상관없이 검색창에 입력한 글자가 (제목, 내용, 작성자에) 포함된 글을 반환하도록 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;4) SearchDTO.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608379961548&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.dto;

import java.io.Serializable;

// 디폴트 생성자, 생성자 메소드 x &amp;rarr; VO Class
public class SearchDTO implements Serializable{
	private String part;
	private String searchData;
	
	public String getPart() {
		return part;
	}
	public void setPart(String part) {
		this.part = part;
	}
	public String getSearchData() {
		return searchData;
	}
	public void setSearchData(String searchData) {
		this.searchData = searchData;
	}
	
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;5) BoardDAO.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608380202491&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.dao;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.hanul.dto.BoardDTO;
import com.hanul.dto.SearchDTO;

public class BoardDAO {
	private static SqlSessionFactory sqlMapper;
	
	static {
		String resource = &quot;com/hanul/mybatis/SqlMapConfig.xml&quot;;
		
		try {
			InputStream inputStream = Resources.getResourceAsStream(resource);
			sqlMapper = new SqlSessionFactoryBuilder().build(inputStream);
		
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(&quot;SqlSessionFactory Exception&quot;);
		}
	}//static
	
	//전체 목록 검색
	public List&amp;lt;BoardDTO&amp;gt; boardSearchAll() {
		SqlSession session = sqlMapper.openSession();
		
		List&amp;lt;BoardDTO&amp;gt; list = null;
		list = session.selectList(&quot;boardSearchAll&quot;);
		session.close();
		
		return list;
	}//boardSearchAll()
	
	// 글 등록
	public int boardInsert(BoardDTO dto) {
		SqlSession session = sqlMapper.openSession();
		
		// alert 창을 사용할 경우에는 succ를 return 해야한다.(성공/실패 확인)
		// PrintWriter를 이용한 script 코드를 구현한 후 페이지 전환 처리
		int succ = 0;
		succ = session.insert(&quot;boardInsert&quot;, dto);
		session.commit();
		session.close();
		
		return succ;
	}//boardInsert()
	
	//글 검색
	public BoardDTO boardDetail(String b_num) {
		SqlSession session = sqlMapper.openSession();
		
		BoardDTO dto = null;
		dto = session.selectOne(&quot;boardDetail&quot;, b_num);
		session.close();
		
		return dto;
	}//boardDetail()
	
	// 조회수 증가
	public void boardCount(String b_num) {
		SqlSession session = sqlMapper.openSession();
		session.update(&quot;boardCount&quot;, b_num);
		session.commit();
		session.close();
	}//boardCount()
	
	// 글 삭제
	public void boardDelete(String b_num) {
		SqlSession session = sqlMapper.openSession();
		
		// alert 창을 사용하지 않을 경우 succ가 필요 없다.
		// ActionForward를 이용한 페이지 전환
		session.delete(&quot;boardDelete&quot;, b_num);
		session.commit();
		session.close();
		
	}//boardDelete()
	
	//글 수정
	public void boardUpdate(BoardDTO dto) {
		SqlSession session = sqlMapper.openSession();
		
		session.update(&quot;boardUpdate&quot;, dto);
		session.commit();
		session.close();
	}//boardUpdate()
	
	//조건 검색
	public List&amp;lt;BoardDTO&amp;gt; boardSearch(SearchDTO dto) {
		SqlSession session = sqlMapper.openSession();
		List&amp;lt;BoardDTO&amp;gt; list = null;
		list = session.selectList(&quot;boardSearch&quot;, dto);
		session.close();
		
		return list;
	}//boardSearch()
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;6) boardMapper.xml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608380230020&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
 PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
 &quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;com.hanul.mybatis.boardMapper.xml&quot;&amp;gt;
	&amp;lt;!-- SQL 문장 작성 --&amp;gt;
	&amp;lt;select id=&quot;boardSearchAll&quot; resultType=&quot;BoardDTO&quot;&amp;gt;
		select * from tblBoard order by b_num desc
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;boardInsert&quot; parameterType=&quot;BoardDTO&quot;&amp;gt;
		insert into tblBoard 
			values(b_num_seq.nextval, 
				   #{b_subject},
				   #{b_pwd},
				   #{b_content},
				   #{b_writer},
				   sysdate,
				   0)
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;select id=&quot;boardDetail&quot; parameterType=&quot;String&quot; resultType=&quot;BoardDTO&quot;&amp;gt;
		select * from tblBoard where b_num = #{b_num}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;update id=&quot;boardCount&quot; parameterType=&quot;String&quot;&amp;gt;
		update tblBoard set b_readcount = b_readcount + 1 where b_num = #{b_num}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;delete id=&quot;boardDelete&quot; parameterType=&quot;String&quot;&amp;gt;
		delete from tblBoard where b_num = #{b_num}
	&amp;lt;/delete&amp;gt;
	
	&amp;lt;update id=&quot;boardUpdate&quot; parameterType=&quot;BoardDTO&quot;&amp;gt;
		update tblBoard 
			set b_writer = #{b_writer},
				b_subject = #{b_subject},
				b_content = #{b_content},
				b_pwd = #{b_pwd} 
			where b_num = #{b_num}	
	&amp;lt;/update&amp;gt;
	
	&amp;lt;select id=&quot;boardSearch&quot; parameterType=&quot;SearchDTO&quot; resultType=&quot;BoardDTO&quot;&amp;gt;
		select * from tblBoard where upper(${part}) like upper(#{searchData})
		&amp;lt;!-- #{part} &amp;rarr; part에만 접근할 뿐 part안에 있는 value 값이 b_subject, b_content, b_writer인
			요소에는 접근하지 못하기 때문 EL 방식으로 접근해야한다.  --&amp;gt;
	&amp;lt;/select&amp;gt;
&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;7) boardSearchList.jsp&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608380313467&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@page import=&quot;com.hanul.dto.BoardDTO&quot;%&amp;gt;
&amp;lt;%@page import=&quot;java.util.List&quot;%&amp;gt;
&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%
request.setCharacterEncoding(&quot;utf-8&quot;);
List&amp;lt;BoardDTO&amp;gt; list = (List&amp;lt;BoardDTO&amp;gt;) request.getAttribute(&quot;list&quot;);
%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;boardSearchList&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;div align=&quot;center&quot;&amp;gt;
		&amp;lt;h3&amp;gt;[검색 결과]&amp;lt;/h3&amp;gt;
		&amp;lt;table border=&quot;1&quot; style=&quot;width: 80%&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				 &amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;%
			if (list.size() == 0) {
				out.println(&quot;&amp;lt;tr align='center'&amp;gt;&amp;lt;td colspan='5'&amp;gt;검색된 글이 없습니다.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&quot;);
			} else {
				for(int i = 0; i &amp;lt; list.size(); i++) {
					out.println(&quot;&amp;lt;tr align='center'&amp;gt;&quot;);
					/* out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_num() + &quot;&amp;lt;/td&amp;gt;&quot;); */
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + (list.size() - i) + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt;&amp;lt;a href='boardDetail.do?b_num=&quot; + list.get(i).getB_num() + &quot;'&amp;gt;&quot; 
								+ list.get(i).getB_subject() + &quot;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_writer() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_date() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_readcount() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;/tr&amp;gt;&quot;);
				}
			}	
			%&amp;gt;
			&amp;lt;tr align=&quot;center&quot;&amp;gt;
				&amp;lt;td colspan=&quot;5&quot;&amp;gt;
					&amp;lt;input type=&quot;button&quot; value=&quot;글쓰기&quot; onclick=&quot;location.href='boardInsertForm.do'&quot; /&amp;gt;
					&amp;lt;input type=&quot;button&quot; value=&quot;목록보기&quot; onclick=&quot;location.href='boardList.do'&quot; /&amp;gt;
				&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;	
	&amp;lt;/div&amp;gt;	
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(25)-1.gif&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;469&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7101r/btqQIaMlVDp/BkKfnsKM7NEavmhuQl0HF0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7101r/btqQIaMlVDp/BkKfnsKM7NEavmhuQl0HF0/img.gif&quot; data-alt=&quot;▲&amp;amp;amp;nbsp; 제목으로 글 검색하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7101r/btqQIaMlVDp/BkKfnsKM7NEavmhuQl0HF0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/b7101r/btqQIaMlVDp/BkKfnsKM7NEavmhuQl0HF0/img.gif&quot; data-filename=&quot;JSP&amp;amp;Servlet(25)-1.gif&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;469&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲&amp;nbsp; 제목으로 글 검색하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(25)-2.gif&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;515&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsQ1f9/btqQNq8gUVl/h6feAGBhfx871wpR2arcNk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsQ1f9/btqQNq8gUVl/h6feAGBhfx871wpR2arcNk/img.gif&quot; data-alt=&quot;▲&amp;amp;amp;nbsp; 내용으로 글 검색하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsQ1f9/btqQNq8gUVl/h6feAGBhfx871wpR2arcNk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bsQ1f9/btqQNq8gUVl/h6feAGBhfx871wpR2arcNk/img.gif&quot; data-filename=&quot;JSP&amp;amp;Servlet(25)-2.gif&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;515&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲&amp;nbsp; 내용으로 글 검색하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(25)-3.gif&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;515&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUljIr/btqQKupL3WF/HBIt1ugAaocsbCTMIqnPn1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUljIr/btqQKupL3WF/HBIt1ugAaocsbCTMIqnPn1/img.gif&quot; data-alt=&quot;▲&amp;amp;amp;nbsp; 작성자로 글 검색하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUljIr/btqQKupL3WF/HBIt1ugAaocsbCTMIqnPn1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bUljIr/btqQKupL3WF/HBIt1ugAaocsbCTMIqnPn1/img.gif&quot; data-filename=&quot;JSP&amp;amp;Servlet(25)-3.gif&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;515&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲&amp;nbsp; 작성자로 글 검색하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/JSP&amp;amp;Servlet</category>
      <author>PSEveloper</author>
      <guid isPermaLink="true">https://mystudyblog-it.tistory.com/225</guid>
      <comments>https://mystudyblog-it.tistory.com/225#entry225comment</comments>
      <pubDate>Mon, 21 Dec 2020 22:31:35 +0900</pubDate>
    </item>
    <item>
      <title>[JSP] STUDY 24 - 게시판 만들기(MVC2 패턴) (6) : 글 수정하기</title>
      <link>https://mystudyblog-it.tistory.com/224</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(24) - STUDY 24.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crJ212/btqQPyStxzM/KZollwTWn7oTyPjJijnsxk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crJ212/btqQPyStxzM/KZollwTWn7oTyPjJijnsxk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crJ212/btqQPyStxzM/KZollwTWn7oTyPjJijnsxk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrJ212%2FbtqQPyStxzM%2FKZollwTWn7oTyPjJijnsxk%2Fimg.jpg&quot; data-filename=&quot;JSP&amp;amp;Servlet(24) - STUDY 24.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 글 수정하기&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 20px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boardDetail.jsp (&lt;b&gt;상세 페이지&lt;/b&gt;)&amp;nbsp; &amp;rarr;&amp;nbsp; boardUpdateForm.do&amp;nbsp; &amp;rarr;&amp;nbsp;&amp;nbsp;web.xml&amp;nbsp; &amp;rarr;&amp;nbsp;&amp;nbsp;BoardFrontController.java&amp;nbsp; &amp;rarr;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BoardUpdateFormAction.java&amp;nbsp; &amp;rarr;&amp;nbsp; BoardDAO.java&amp;nbsp; &amp;rarr;&amp;nbsp; boardMapper.xml (&lt;b&gt;수정할 회원정보 DTO 반환&lt;/b&gt;)&amp;nbsp; &amp;rarr;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BoardDAO.java&amp;nbsp; &amp;rarr;&amp;nbsp; BoardUpdateFormAction.java&amp;nbsp; &amp;rarr;&amp;nbsp;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; BoardFrontController.java&amp;nbsp; &amp;rarr;&amp;nbsp;&amp;nbsp;ActionForward.java&amp;nbsp; &amp;rarr;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boardUpdateForm.jsp (&lt;b&gt;수정 폼 화면 전환&lt;/b&gt;)&amp;nbsp; &amp;rarr;&amp;nbsp; boardUpdate.do&amp;nbsp; &amp;rarr;&amp;nbsp; web.xml&amp;nbsp; &amp;rarr;&amp;nbsp;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; BoardFrontController.java&amp;nbsp; &amp;rarr;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BoardUpdateAction.java&amp;nbsp; &amp;rarr;&amp;nbsp; BoardDAO.java&amp;nbsp; &amp;rarr;&amp;nbsp; boardMapper.xml (&lt;b&gt;회원 정보 수정&lt;/b&gt;)&amp;nbsp; &amp;rarr;&amp;nbsp; BoardDAO.java&amp;nbsp; &amp;rarr;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BoardUpdateAction.java&amp;nbsp; &amp;rarr;&amp;nbsp; BoardFrontController.java&amp;nbsp; &amp;rarr;&amp;nbsp; ActionForward.java&amp;nbsp; &amp;rarr;&amp;nbsp; boardList.do (&lt;b&gt;글 목록 화면 전환&lt;/b&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1)&amp;nbsp;&amp;nbsp;boardDetail.jsp&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608376978041&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@page import=&quot;com.hanul.dto.BoardDTO&quot;%&amp;gt;
&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fn&quot; uri=&quot;http://java.sun.com/jsp/jstl/functions&quot; %&amp;gt;
&amp;lt;%
request.setCharacterEncoding(&quot;utf-8&quot;);
BoardDTO dto = (BoardDTO) request.getAttribute(&quot;dto&quot;);
pageContext.setAttribute(&quot;enter&quot;, &quot;\r\n&quot;);	
// &amp;rarr; JSTL 줄바꿈 처리를 위한 현재 페이지용 객체
%&amp;gt;

&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;boardDetail&amp;lt;/title&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
	function fnDelete(b_pwd) {
		var user_pwd = document.detailForm.user_pwd.value;
		//alert(&quot;User Pw : &quot; + user_pwd + &quot;\nDB Pw : &quot; + b_pwd);
		
		if(user_pwd.trim() == &quot;&quot;) {		//비밀번호 미입력
			alert(&quot;비밀번호를 입력하세요!&quot;);
			document.detailForm.user_pwd.value = &quot;&quot;;
			document.detailForm.user_pwd.focus();
		} else if(user_pwd != b_pwd) {	//비밀번호 불일치
			alert(&quot;비밀번호를 잘못 입력되었습니다!&quot;);
			document.detailForm.user_pwd.value = &quot;&quot;;
			document.detailForm.user_pwd.focus();
		} else {	//비밀번호 일치 &amp;rarr; confirm 창
			if(confirm(&quot;정말 삭제하시겠습니까?&quot;)) {
				location.href=&quot;boardDelete.do?b_num=&quot; + ${dto.b_num };
			} else {
				document.detailForm.user_pwd.value = &quot;&quot;;
				document.detailForm.user_pwd.focus();
			}
		}
	}//fnDelete()
	
	function fnUpdate(b_pwd) {
		var user_pwd = document.detailForm.user_pwd.value;
		
		if(user_pwd.trim() == &quot;&quot;) {		//비밀번호 미입력
			alert(&quot;비밀번호를 입력하세요!&quot;);
			document.detailForm.user_pwd.value = &quot;&quot;;
			document.detailForm.user_pwd.focus();
		} else if(user_pwd != b_pwd) {	//비밀번호 불일치
			alert(&quot;비밀번호를 잘못 입력되었습니다!&quot;);
			document.detailForm.user_pwd.value = &quot;&quot;;
			document.detailForm.user_pwd.focus();
		} else {	//비밀번호 일치 &amp;rarr; confirm 창
			location.href=&quot;boardUpdateForm.do?b_num=&quot; + ${dto.b_num };
		}	
	}//fnUpdate()
	
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;div align=&quot;center&quot;&amp;gt;
		&amp;lt;h3&amp;gt;[글 상세보기]&amp;lt;/h3&amp;gt;
		&amp;lt;table border=&quot;1&quot; style=&quot;width: 80%&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				&amp;lt;td align=&quot;center&quot;&amp;gt;${dto.b_writer }&amp;lt;/td&amp;gt;
				&amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;
				&amp;lt;td align=&quot;center&quot;&amp;gt;${dto.b_readcount }&amp;lt;/td&amp;gt; 
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				&amp;lt;td colspan=&quot;3&quot;&amp;gt;${dto.b_subject }&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;내용&amp;lt;/th&amp;gt;
				&amp;lt;%-- &amp;lt;td colspan=&quot;3&quot;&amp;gt;${dto.b_content }&amp;lt;/td&amp;gt;&amp;lt;!-- 줄바꿈 처리 문제 --&amp;gt; --%&amp;gt;
				&amp;lt;td colspan=&quot;3&quot;&amp;gt;
					&amp;lt;%-- dto.getB_content().replace(&quot;\r\n&quot;, &quot;&amp;lt;br/&amp;gt;&quot;) --%&amp;gt;
					${fn:replace(dto.b_content, enter, &quot;&amp;lt;br/&amp;gt;&quot;) }
				&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr align=&quot;center&quot;&amp;gt;
				&amp;lt;th&amp;gt;비밀번호&amp;lt;/th&amp;gt;
				&amp;lt;td colspan=&quot;3&quot;&amp;gt;
					&amp;lt;!-- script에서 user_pwd에 접근하기 위한 폼 --&amp;gt;
					&amp;lt;form name=&quot;detailForm&quot; onsubmit=&quot;return false;&quot;&amp;gt;
					&amp;lt;!-- onsubmit=&quot;return false;&quot; &amp;rarr; enter키를 눌러도 submit이 안되게 하기 위해 --&amp;gt;
						&amp;lt;input type=&quot;password&quot; name=&quot;user_pwd&quot; /&amp;gt;
						&amp;lt;input type=&quot;button&quot; value=&quot;삭제&quot; onclick=&quot;fnDelete('${dto.b_pwd}');&quot; /&amp;gt;
						&amp;lt;input type=&quot;button&quot; value=&quot;수정&quot; onclick=&quot;fnUpdate('${dto.b_pwd}');&quot; /&amp;gt;
						&amp;lt;input type=&quot;button&quot; value=&quot;목록보기&quot; onclick=&quot;location.href='boardList.do'&quot; /&amp;gt;
					&amp;lt;/form&amp;gt;	
				&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;- 수정할 때는 확인 절차로 비밀번호를 입력받게 한다. 즉, script를 통해 입력한 비밀번호화 DB의 비밀번호가 일치하는 지 확인하는 조건식을 작성한다. (그 전에 먼저 공백을 제출했을 때도 넘어가지 않게 하기 위해 trim() 함수를 써서 조건식에 추가한다.)&lt;/p&gt;
&lt;p&gt;- 비밀번호가 일치하면 boardDelete.do로 경로로 설정하고 b_num의 값도 같이 넘어가게 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(24)-1.gif&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;380&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvmnmZ/btqQPAisiuh/CiVGsEYEWT58qDJ1cxynKK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvmnmZ/btqQPAisiuh/CiVGsEYEWT58qDJ1cxynKK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvmnmZ/btqQPAisiuh/CiVGsEYEWT58qDJ1cxynKK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bvmnmZ/btqQPAisiuh/CiVGsEYEWT58qDJ1cxynKK/img.gif&quot; data-filename=&quot;JSP&amp;amp;Servlet(24)-1.gif&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;380&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2)&amp;nbsp;BoardFrontController.java (Servlet)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608377513853&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.action.Action;
import com.hanul.action.ActionForward;
import com.hanul.action.BoardDeleteAction;
import com.hanul.action.BoardDetailAction;
import com.hanul.action.BoardInsertAction;
import com.hanul.action.BoardListAction;
import com.hanul.action.BoardSearchAction;
import com.hanul.action.BoardUpdateAction;
import com.hanul.action.BoardUpdateFormAction;

@WebServlet(&quot;/BoardFrontController.do&quot;)
public class BoardFrontController extends HttpServlet {

	protected void service(HttpServletRequest request, 
						   HttpServletResponse response) 
					throws ServletException, IOException {
		// ① 클라이언트가 어떤 요청을 했는가 파악한다.
		request.setCharacterEncoding(&quot;utf-8&quot;);
		String uri = request.getRequestURI();			//uri-pattern 값 : /mbb/xxx.do
		String ctx = request.getContextPath();			//Context root 값 : /mbb
		String command = uri.substring(ctx.length());	//실제 요청한 페이지 : /xxx.do
		//System.out.println(&quot;uri : &quot; + uri);
		//System.out.println(&quot;ctx : &quot; + ctx);
		//System.out.println(&quot;command : &quot; + command);
		
		// ② 클라이언트 요청(*.do &amp;rarr; command)과 실제 처리할 비즈니스 로직(Action Class)
		//	 servlet(FrontController.java) &amp;rarr; class(Action.java)
		Action action = null;
		ActionForward forward = null;
		
		if (command.equals(&quot;/boardList.do&quot;)) {
			action = new BoardListAction();
			forward = action.excute(request, response);
		} else if(command.equals(&quot;/boardInsertForm.do&quot;)) {	//글쓰기 폼으로 화면 전환
			forward = new ActionForward();
			forward.setPath(&quot;board/boardInsertForm.jsp&quot;);
			forward.setRedirect(false);
			// 가져갈 게 없으므로 sendRedirect로 하면 되지만
			// url이 바뀌지 않아야 하므로 forward방식으로 전달
		} else if(command.equals(&quot;/boardInsert.do&quot;)) {
			action = new BoardInsertAction();
			forward = action.excute(request, response);
			// 여기서 forward에 null이라는 값이 들어오므로 밑의 코드가 실행이 되지 않는다.
		} else if(command.equals(&quot;/boardDetail.do&quot;)) {
			action = new BoardDetailAction();
			forward = action.excute(request, response);
		} else if(command.equals(&quot;/boardDelete.do&quot;)) {
			action = new BoardDeleteAction();
			forward = action.excute(request, response);
		} else if(command.equals(&quot;/boardUpdateForm.do&quot;)) {
			action = new BoardUpdateFormAction();
			forward = action.excute(request, response);
		} else if(command.equals(&quot;/boardUpdate.do&quot;)) {
			action = new BoardUpdateAction();
			forward = action.excute(request, response);
		} else if(command.equals(&quot;/boardSearch.do&quot;)) {
			action = new BoardSearchAction();
			forward = action.excute(request, response);
		}
		
		// ③ 페이지 전환(프리젠테이션 로직 수행) : forward(), sendRedirect
		//	 ActionForward.java가 담당
		if (forward != null) {
			if (forward.isRedirect()) {		//true : sendRedirect() 페이지 전환
				response.sendRedirect(forward.getPath());
			} else {					// false : forward() 페이지 전환
				RequestDispatcher rd = request.getRequestDispatcher(forward.getPath());
				rd.forward(request, response);
			}
		}
		
	}//service()
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3) BoardUpdateFormAction.java&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608377551980&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.action;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.dao.BoardDAO;
import com.hanul.dto.BoardDTO;

public class BoardUpdateFormAction implements Action{

	@Override
	public ActionForward excute(HttpServletRequest request, 
								HttpServletResponse response)
		throws ServletException, IOException {
		//클라이언트 요청
		String b_num = request.getParameter(&quot;b_num&quot;);
		
		//비즈니스 로직
		BoardDAO dao = new BoardDAO();
		BoardDTO dto = dao.boardDetail(b_num);
		request.setAttribute(&quot;dto&quot;, dto);
		
		//프리젠테이션 로직(페이지 전환)
		ActionForward forward = new ActionForward();
		forward.setPath(&quot;board/boardUpdateForm.jsp&quot;);
		forward.setRedirect(false);
		
		return forward;
	}//excute()

}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- dao.boardDetail 메소드를 실행하여 수정할 글 정보 DTO를 받아오고, ActionForward의 setPath() 메소드로 바로 boardUpdateForm.jsp로 넘어가게끔 한다(페이지 전환 시 DTO까지 넘겨준다).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4) boardUpdateForm.jsp&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608377878365&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@page import=&quot;com.hanul.dto.BoardDTO&quot;%&amp;gt;
&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%
request.setCharacterEncoding(&quot;utf-8&quot;);
BoardDTO dto = (BoardDTO) request.getAttribute(&quot;dto&quot;);
%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;boardUpdateForm&amp;lt;/title&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
	function fnSubmit() {
		if (confirm(&quot;정말 수정하시겠습니까?&quot;)) {
			return true;
		} else {
			return false
		}
		
	}//fnSubmit()
	
	function fnReset() {
		if (confirm(&quot;정말 초기화하시겠습니까?&quot;)) {
			return true;
		} else {
			return false
		}
	}//fnReset()
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;div align=&quot;center&quot;&amp;gt;
		&amp;lt;h3&amp;gt;[글 수정하기]&amp;lt;/h3&amp;gt;
		&amp;lt;form action=&quot;boardUpdate.do&quot; method=&quot;post&quot; onsubmit=&quot;return fnSubmit();&quot; onreset=&quot;return fnReset();&quot;&amp;gt;
		&amp;lt;input type=&quot;hidden&quot; name=&quot;b_num&quot; value=&quot;${dto.b_num }&quot; /&amp;gt;
			&amp;lt;table border=&quot;1&quot; style=&quot;width: 80%&quot;&amp;gt;
				&amp;lt;tr&amp;gt;
					&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
					&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;b_writer&quot; value=&quot;${dto.b_writer }&quot; /&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
				&amp;lt;tr&amp;gt;
					&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
					&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;b_subject&quot; value=&quot;${dto.b_subject }&quot; /&amp;gt;&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
				&amp;lt;tr&amp;gt;
					&amp;lt;th&amp;gt;내용&amp;lt;/th&amp;gt;
					&amp;lt;td&amp;gt;
						&amp;lt;textarea rows=&quot;10&quot; cols=&quot;50&quot; name=&quot;b_content&quot;&amp;gt;${dto.b_content }&amp;lt;/textarea&amp;gt;
					&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
				&amp;lt;tr&amp;gt;
					&amp;lt;th&amp;gt;수정할 비밀번호&amp;lt;/th&amp;gt;
					&amp;lt;td&amp;gt;
						&amp;lt;input type=&quot;password&quot; name=&quot;b_pwd&quot; value=&quot;${dto.b_pwd }&quot; /&amp;gt;
						&amp;lt;input type=&quot;submit&quot; value=&quot;수정하기&quot; /&amp;gt;
						&amp;lt;input type=&quot;reset&quot; value=&quot;초기화하기&quot; /&amp;gt;
						&amp;lt;input type=&quot;button&quot; value=&quot;목록보기&quot; onclick=&quot;location.href='boardList.do'&quot; /&amp;gt;
					&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
				
			&amp;lt;/table&amp;gt;
		&amp;lt;/form&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(24)-2.gif&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;562&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zBZpC/btqQIVOVJDE/R7jXKkKG16KoDu900DLWO1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zBZpC/btqQIVOVJDE/R7jXKkKG16KoDu900DLWO1/img.gif&quot; data-alt=&quot;▲ boardDetail.jsp&amp;amp;amp;nbsp; &amp;amp;amp;rarr;&amp;amp;amp;nbsp; boardUpdateForm.jsp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zBZpC/btqQIVOVJDE/R7jXKkKG16KoDu900DLWO1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/zBZpC/btqQIVOVJDE/R7jXKkKG16KoDu900DLWO1/img.gif&quot; data-filename=&quot;JSP&amp;amp;Servlet(24)-2.gif&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;562&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ boardDetail.jsp&amp;nbsp; &amp;rarr;&amp;nbsp; boardUpdateForm.jsp&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 수정하기 버튼을 누르면 script를 통해 다시 한번 수정여부를 확인하는 alert창이 실행된다.&lt;/p&gt;
&lt;p&gt;- alert창의 확인 버튼을 누르면 url이 boardUpdate.do로 바뀌면서 BoardController를 통해 BoardUpdateAction.java로 넘어간다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5) BoardUpdateAction.java&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608378348317&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.action;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.dao.BoardDAO;
import com.hanul.dto.BoardDTO;

public class BoardUpdateAction implements Action{

	@Override
	public ActionForward excute(HttpServletRequest request, 
								HttpServletResponse response)
		throws ServletException, IOException {
		//클라이언트의 요청
		request.setCharacterEncoding(&quot;utf-8&quot;);
		BoardDTO dto = new BoardDTO();
		dto.setB_num(Integer.parseInt(request.getParameter(&quot;b_num&quot;)));
		dto.setB_writer(request.getParameter(&quot;b_writer&quot;));
		dto.setB_subject(request.getParameter(&quot;b_subject&quot;));
		dto.setB_content(request.getParameter(&quot;b_content&quot;));
		dto.setB_pwd(request.getParameter(&quot;b_pwd&quot;));
		
		//비즈니스 로직
		BoardDAO dao = new BoardDAO();
		dao.boardUpdate(dto);
		
		//프리젠테이션 로직
		ActionForward forward = new ActionForward();
		forward.setPath(&quot;boardList.do&quot;);
		forward.setRedirect(true);
		
		return forward;
	}//excute()
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;- dao.boardUpdate() 메소드를 실행하고(글 정보를 수정하고), ActionForward의 setPath() 메소드로 바로 boardList.jsp로 넘어가게끔 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;6)&amp;nbsp;BoardDAO.java&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608377630705&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.dao;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.hanul.dto.BoardDTO;
import com.hanul.dto.SearchDTO;

public class BoardDAO {
	private static SqlSessionFactory sqlMapper;
	
	static {
		String resource = &quot;com/hanul/mybatis/SqlMapConfig.xml&quot;;
		
		try {
			InputStream inputStream = Resources.getResourceAsStream(resource);
			sqlMapper = new SqlSessionFactoryBuilder().build(inputStream);
		
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(&quot;SqlSessionFactory Exception&quot;);
		}
	}//static
	
	//전체 목록 검색
	public List&amp;lt;BoardDTO&amp;gt; boardSearchAll() {
		SqlSession session = sqlMapper.openSession();
		
		List&amp;lt;BoardDTO&amp;gt; list = null;
		list = session.selectList(&quot;boardSearchAll&quot;);
		session.close();
		
		return list;
	}//boardSearchAll()
	
	// 글 등록
	public int boardInsert(BoardDTO dto) {
		SqlSession session = sqlMapper.openSession();
		
		// alert 창을 사용할 경우에는 succ를 return 해야한다.(성공/실패 확인)
		// PrintWriter를 이용한 script 코드를 구현한 후 페이지 전환 처리
		int succ = 0;
		succ = session.insert(&quot;boardInsert&quot;, dto);
		session.commit();
		session.close();
		
		return succ;
	}//boardInsert()
	
	//글 검색
	public BoardDTO boardDetail(String b_num) {
		SqlSession session = sqlMapper.openSession();
		
		BoardDTO dto = null;
		dto = session.selectOne(&quot;boardDetail&quot;, b_num);
		session.close();
		
		return dto;
	}//boardDetail()
	
	// 조회수 증가
	public void boardCount(String b_num) {
		SqlSession session = sqlMapper.openSession();
		session.update(&quot;boardCount&quot;, b_num);
		session.commit();
		session.close();
	}//boardCount()
	
	// 글 삭제
	public void boardDelete(String b_num) {
		SqlSession session = sqlMapper.openSession();
		
		// alert 창을 사용하지 않을 경우 succ가 필요 없다.
		// ActionForward를 이용한 페이지 전환
		session.delete(&quot;boardDelete&quot;, b_num);
		session.commit();
		session.close();
		
	}//boardDelete()
	
	//글 수정
	public void boardUpdate(BoardDTO dto) {
		SqlSession session = sqlMapper.openSession();
		
		session.update(&quot;boardUpdate&quot;, dto);
		session.commit();
		session.close();
	}//boardUpdate()

}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;7)&amp;nbsp;boardMapper.xml&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608378595795&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
 PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
 &quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;com.hanul.mybatis.boardMapper.xml&quot;&amp;gt;
	&amp;lt;!-- SQL 문장 작성 --&amp;gt;
	&amp;lt;select id=&quot;boardSearchAll&quot; resultType=&quot;BoardDTO&quot;&amp;gt;
		select * from tblBoard order by b_num desc
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;boardInsert&quot; parameterType=&quot;BoardDTO&quot;&amp;gt;
		insert into tblBoard 
			values(b_num_seq.nextval, 
				   #{b_subject},
				   #{b_pwd},
				   #{b_content},
				   #{b_writer},
				   sysdate,
				   0)
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;select id=&quot;boardDetail&quot; parameterType=&quot;String&quot; resultType=&quot;BoardDTO&quot;&amp;gt;
		select * from tblBoard where b_num = #{b_num}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;update id=&quot;boardCount&quot; parameterType=&quot;String&quot;&amp;gt;
		update tblBoard set b_readcount = b_readcount + 1 where b_num = #{b_num}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;delete id=&quot;boardDelete&quot; parameterType=&quot;String&quot;&amp;gt;
		delete from tblBoard where b_num = #{b_num}
	&amp;lt;/delete&amp;gt;
	
	&amp;lt;update id=&quot;boardUpdate&quot; parameterType=&quot;BoardDTO&quot;&amp;gt;
		update tblBoard 
			set b_writer = #{b_writer},
				b_subject = #{b_subject},
				b_content = #{b_content},
				b_pwd = #{b_pwd} 
			where b_num = #{b_num}	
	&amp;lt;/update&amp;gt;
&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(24)-3.gif&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;562&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cK4ZJd/btqQLk1wdR3/I1AAXUXoHi7CQGYqQegzz1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cK4ZJd/btqQLk1wdR3/I1AAXUXoHi7CQGYqQegzz1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cK4ZJd/btqQLk1wdR3/I1AAXUXoHi7CQGYqQegzz1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cK4ZJd/btqQLk1wdR3/I1AAXUXoHi7CQGYqQegzz1/img.gif&quot; data-filename=&quot;JSP&amp;amp;Servlet(24)-3.gif&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;562&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;- 위와 같이 수정한 [글 상세 보기] 페이지에 들어가면 글 정보가 수정된 것을 확인할 수 있다.&lt;/p&gt;</description>
      <category>Frontend/JSP&amp;amp;Servlet</category>
      <author>PSEveloper</author>
      <guid isPermaLink="true">https://mystudyblog-it.tistory.com/224</guid>
      <comments>https://mystudyblog-it.tistory.com/224#entry224comment</comments>
      <pubDate>Mon, 21 Dec 2020 21:54:11 +0900</pubDate>
    </item>
    <item>
      <title>[JSP] STUDY 23 - 게시판 만들기(MVC2 패턴) (5) : 글 삭제하기</title>
      <link>https://mystudyblog-it.tistory.com/170</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(23) - STUDY 23.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O2QeK/btqQJFq4sYB/zCzY59OpLzUvPSQ43oNMNK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O2QeK/btqQJFq4sYB/zCzY59OpLzUvPSQ43oNMNK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O2QeK/btqQJFq4sYB/zCzY59OpLzUvPSQ43oNMNK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO2QeK%2FbtqQJFq4sYB%2FzCzY59OpLzUvPSQ43oNMNK%2Fimg.jpg&quot; data-filename=&quot;JSP&amp;amp;Servlet(23) - STUDY 23.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 글 삭제하기&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 87.5581%; height: 205px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boardDetail.jsp&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardDelete.do(*.do)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;web.xml&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardFrontController.java(Servlet)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardDeleteAction.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardDAO.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardMapper.xml&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardDAO.java&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardDeleteAction.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardFrontController.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ActionForward.java&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardList.do&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1) &lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;boardDetail.jsp&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1595771141814&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@page import=&quot;com.hanul.dto.BoardDTO&quot;%&amp;gt;
&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fn&quot; uri=&quot;http://java.sun.com/jsp/jstl/functions&quot; %&amp;gt;
&amp;lt;%
request.setCharacterEncoding(&quot;utf-8&quot;);
BoardDTO dto = (BoardDTO) request.getAttribute(&quot;dto&quot;);
pageContext.setAttribute(&quot;enter&quot;, &quot;\r\n&quot;);	
// &amp;rarr; JSTL 줄바꿈 처리를 위한 현재 페이지용 객체
%&amp;gt;

&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;boardDetail&amp;lt;/title&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
	function fnDelete(b_pwd) {
		var user_pwd = document.detailForm.user_pwd.value;
		//alert(&quot;User Pw : &quot; + user_pwd + &quot;\nDB Pw : &quot; + b_pwd);
		
		if(user_pwd.trim() == &quot;&quot;) {		//비밀번호 미입력
			alert(&quot;비밀번호를 입력하세요!&quot;);
			document.detailForm.user_pwd.value = &quot;&quot;;
			document.detailForm.user_pwd.focus();
		} else if(user_pwd != b_pwd) {	//비밀번호 불일치
			alert(&quot;비밀번호를 잘못 입력되었습니다!&quot;);
			document.detailForm.user_pwd.value = &quot;&quot;;
			document.detailForm.user_pwd.focus();
		} else {	//비밀번호 일치 &amp;rarr; confirm 창
			if(confirm(&quot;정말 삭제하시겠습니까?&quot;)) {
				location.href=&quot;boardDelete.do?b_num=&quot; + ${dto.b_num };
			} else {
				document.detailForm.user_pwd.value = &quot;&quot;;
				document.detailForm.user_pwd.focus();
			}
		}
	}//fnDelete()

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;div align=&quot;center&quot;&amp;gt;
		&amp;lt;h3&amp;gt;[글 상세보기]&amp;lt;/h3&amp;gt;
		&amp;lt;table border=&quot;1&quot; style=&quot;width: 80%&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				&amp;lt;td align=&quot;center&quot;&amp;gt;${dto.b_writer }&amp;lt;/td&amp;gt;
				&amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;
				&amp;lt;td align=&quot;center&quot;&amp;gt;${dto.b_readcount }&amp;lt;/td&amp;gt; 
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				&amp;lt;td colspan=&quot;3&quot;&amp;gt;${dto.b_subject }&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;내용&amp;lt;/th&amp;gt;
				&amp;lt;%-- &amp;lt;td colspan=&quot;3&quot;&amp;gt;${dto.b_content }&amp;lt;/td&amp;gt;&amp;lt;!-- 줄바꿈 처리 문제 --&amp;gt; --%&amp;gt;
				&amp;lt;td colspan=&quot;3&quot;&amp;gt;
					&amp;lt;%-- dto.getB_content().replace(&quot;\r\n&quot;, &quot;&amp;lt;br/&amp;gt;&quot;) --%&amp;gt;
					${fn:replace(dto.b_content, enter, &quot;&amp;lt;br/&amp;gt;&quot;) }
				&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr align=&quot;center&quot;&amp;gt;
				&amp;lt;th&amp;gt;비밀번호&amp;lt;/th&amp;gt;
				&amp;lt;td colspan=&quot;3&quot;&amp;gt;
					&amp;lt;!-- script에서 user_pwd에 접근하기 위한 폼 --&amp;gt;
					&amp;lt;form name=&quot;detailForm&quot; onsubmit=&quot;return false;&quot;&amp;gt;
					&amp;lt;!-- onsubmit=&quot;return false;&quot; &amp;rarr; enter키를 눌러도 
                    				submit이 안되게 하기 위해 --&amp;gt;
						&amp;lt;input type=&quot;password&quot; name=&quot;user_pwd&quot; /&amp;gt;
						&amp;lt;input type=&quot;button&quot; value=&quot;삭제&quot; 
                        				onclick=&quot;fnDelete('${dto.b_pwd}');&quot; /&amp;gt;
						&amp;lt;input type=&quot;button&quot; value=&quot;목록보기&quot; 
                        				onclick=&quot;location.href='boardList.do'&quot; /&amp;gt;
					&amp;lt;/form&amp;gt;	
				&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;- 삭제할 때는 확인 절차로 비밀번호를 입력받게 한다. 즉, script를 통해 입력한 비밀번호화 DB의 비밀번호가 일치하는 지 확인하는 조건식을 작성한다. (그 전에 먼저 공백을 제출했을 때도 넘어가지 않게 하기 위해 trim() 함수를 써서 조건식에 추가한다.)&lt;/p&gt;
&lt;p&gt;- 비밀번호가 일치하면 boardDelete.do로 경로로 설정하고 b_num의 값도 같이 넘어가게 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(5)-1.gif&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;329&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZjR3Y/btqF3S8kTGi/pFUrawJvwLgVb5O6Ve28eK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZjR3Y/btqF3S8kTGi/pFUrawJvwLgVb5O6Ve28eK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZjR3Y/btqF3S8kTGi/pFUrawJvwLgVb5O6Ve28eK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ZjR3Y/btqF3S8kTGi/pFUrawJvwLgVb5O6Ve28eK/img.gif&quot; data-filename=&quot;JSP&amp;amp;Servlet(5)-1.gif&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;329&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2) &lt;span style=&quot;color: #000000;&quot;&gt;BoardFrontController.java (Servlet)&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1595771856577&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.action.Action;
import com.hanul.action.ActionForward;
import com.hanul.action.BoardDeleteAction;
import com.hanul.action.BoardDetailAction;
import com.hanul.action.BoardInsertAction;
import com.hanul.action.BoardListAction;

@WebServlet(&quot;/BoardFrontController.do&quot;)
public class BoardFrontController extends HttpServlet {

	protected void service(HttpServletRequest request, 
				HttpServletResponse response) 
		throws ServletException, IOException {
		// ① 클라이언트가 어떤 요청을 했는가 파악한다.
		request.setCharacterEncoding(&quot;utf-8&quot;);
		String uri = request.getRequestURI();			//uri-pattern 값 : /mbb/xxx.do
		String ctx = request.getContextPath();			//Context root 값 : /mbb
		String command = uri.substring(ctx.length());	//실제 요청한 페이지 : /xxx.do
		
		// ② 클라이언트 요청(*.do &amp;rarr; command)과 실제 처리할 비즈니스 로직(Action Class)
		//	 servlet(FrontController.java) &amp;rarr; class(Action.java)
		Action action = null;
		ActionForward forward = null;
		
		if (command.equals(&quot;/boardList.do&quot;)) {
			action = new BoardListAction();
			forward = action.excute(request, response);
		} else if(command.equals(&quot;/boardInsertForm.do&quot;)) {	//글쓰기 폼으로 화면 전환
			forward = new ActionForward();
			forward.setPath(&quot;board/boardInsertForm.jsp&quot;);
			forward.setRedirect(false);
			// 가져갈 게 없으므로 sendRedirect로 하면 되지만
			// url이 바뀌지 않아야 하므로 forward방식으로 전달
		} else if(command.equals(&quot;/boardInsert.do&quot;)) {
			action = new BoardInsertAction();
			forward = action.excute(request, response);
			// 여기서 forward에 null이라는 값이 들어오므로 밑의 코드가 실행이 되지 않는다.
		} else if(command.equals(&quot;/boardDetail.do&quot;)) {
			action = new BoardDetailAction();
			forward = action.excute(request, response);
		} else if(command.equals(&quot;/boardDelete.do&quot;)) {
			action = new BoardDeleteAction();
			forward = action.excute(request, response);
		}
        
		// ③ 페이지 전환(프리젠테이션 로직 수행) : forward(), sendRedirect
		//	 ActionForward.java가 담당
		if (forward != null) {
			if (forward.isRedirect()) {		//true : sendRedirect() 페이지 전환
				response.sendRedirect(forward.getPath());
			} else {				// false : forward() 페이지 전환
				RequestDispatcher rd = request.getRequestDispatcher(forward.getPath());
				rd.forward(request, response);
			}
		}
		
	}//service()	
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3) &lt;span style=&quot;color: #000000;&quot;&gt;BoardDeleteAction.java&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1595771981498&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.action;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.dao.BoardDAO;

public class BoardDeleteAction implements Action{

	@Override
	public ActionForward excute(HttpServletRequest request, 
				   HttpServletResponse response)
		throws ServletException, IOException {
		String b_num = request.getParameter(&quot;b_num&quot;);
		
		//비즈니스 로직
		BoardDAO dao = new BoardDAO();
		dao.boardDelete(b_num);
		
		//프리젠테이션 로직(페이지 전환)
		ActionForward forward = new ActionForward();
		forward.setPath(&quot;boardList.do&quot;);
		forward.setRedirect(true);	//true : sendRedirect() ▶  url 변경
		
		return forward;
	}//excute()
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;- dao.boardDelete() 메소드를 실행한 후(해당 글을 삭제한 후), ActionForward의 setPath() 메소드로 바로 boardList.jsp로 넘어가게끔 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4) &lt;span style=&quot;color: #000000;&quot;&gt;BoardDAO.java&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1595772048457&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.dao;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.hanul.dto.BoardDTO;
import com.hanul.dto.SearchDTO;

public class BoardDAO {
	private static SqlSessionFactory sqlMapper;
	
	static {
		String resource = &quot;com/hanul/mybatis/SqlMapConfig.xml&quot;;
		
		try {
			InputStream inputStream = Resources.getResourceAsStream(resource);
			sqlMapper = new SqlSessionFactoryBuilder().build(inputStream);
		
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(&quot;SqlSessionFactory Exception&quot;);
		}
	}//static
	
	//전체 목록 검색
	public List&amp;lt;BoardDTO&amp;gt; boardSearchAll() {
		SqlSession session = sqlMapper.openSession();
		
		List&amp;lt;BoardDTO&amp;gt; list = null;
		list = session.selectList(&quot;boardSearchAll&quot;);
		session.close();
		
		return list;
	}//boardSearchAll()
	
	// 글 등록
	public int boardInsert(BoardDTO dto) {
		SqlSession session = sqlMapper.openSession();
		
		// alert 창을 사용할 경우에는 succ를 return 해야한다.(성공/실패 확인)
		// PrintWriter를 이용한 script 코드를 구현한 후 페이지 전환 처리
		int succ = 0;
		succ = session.insert(&quot;boardInsert&quot;, dto);
		session.commit();
		session.close();
		
		return succ;
	}//boardInsert()
	
	//글 검색
	public BoardDTO boardDetail(String b_num) {
		SqlSession session = sqlMapper.openSession();
		
		BoardDTO dto = null;
		dto = session.selectOne(&quot;boardDetail&quot;, b_num);
		session.close();
		
		return dto;
	}//boardDetail()
	
	// 조회수 증가
	public void boardCount(String b_num) {
		SqlSession session = sqlMapper.openSession();
		session.update(&quot;boardCount&quot;, b_num);
		session.commit();
		session.close();
	}//boardCount()
	
	// 글 삭제
	public void boardDelete(String b_num) {
		SqlSession session = sqlMapper.openSession();
		
		// alert 창을 사용하지 않을 경우 succ가 필요 없다.
		// ActionForward를 이용한 페이지 전환
		session.delete(&quot;boardDelete&quot;, b_num);
		session.commit();
		session.close();
		
	}//boardDelete()

}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;- DAO에서 boardDelete() 메소드는 Sqlsession으로 넘어가게 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;(아이디가&lt;span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;boardDelete&lt;/span&gt;&lt;/span&gt;이고 입력값의 타입이 String인 delete 태그로 이동)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5) &lt;span style=&quot;color: #000000;&quot;&gt;boardMapper.xml&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1595772261457&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
 PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
 &quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;com.hanul.mybatis.boardMapper.xml&quot;&amp;gt;
	&amp;lt;!-- SQL 문장 작성 --&amp;gt;
	&amp;lt;select id=&quot;boardSearchAll&quot; resultType=&quot;BoardDTO&quot;&amp;gt;
		select * from tblBoard order by b_num desc
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;boardInsert&quot; parameterType=&quot;BoardDTO&quot;&amp;gt;
		insert into tblBoard 
			values(b_num_seq.nextval, 
				   #{b_subject},
				   #{b_pwd},
				   #{b_content},
				   #{b_writer},
				   sysdate,
				   0)
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;select id=&quot;boardDetail&quot; parameterType=&quot;String&quot; resultType=&quot;BoardDTO&quot;&amp;gt;
		select * from tblBoard where b_num = #{b_num}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;update id=&quot;boardCount&quot; parameterType=&quot;String&quot;&amp;gt;
		update tblBoard set b_readcount = b_readcount + 1 where b_num = #{b_num}
	&amp;lt;/update&amp;gt;
	
	&amp;lt;delete id=&quot;boardDelete&quot; parameterType=&quot;String&quot;&amp;gt;
		delete from tblBoard where b_num = #{b_num}
	&amp;lt;/delete&amp;gt;
&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(5)-2.gif&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;428&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C0JYv/btqF3aPaaFZ/u3kRO757lInAR6d9zllcK0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C0JYv/btqF3aPaaFZ/u3kRO757lInAR6d9zllcK0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C0JYv/btqF3aPaaFZ/u3kRO757lInAR6d9zllcK0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/C0JYv/btqF3aPaaFZ/u3kRO757lInAR6d9zllcK0/img.gif&quot; data-filename=&quot;JSP&amp;amp;Servlet(5)-2.gif&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;428&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;- 위와 같이 비밀번호가 일치하면 해당 글이 삭제됨을 [전체 목록 보기] 페이지(boardList.jsp)에서 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/JSP&amp;amp;Servlet</category>
      <author>PSEveloper</author>
      <guid isPermaLink="true">https://mystudyblog-it.tistory.com/170</guid>
      <comments>https://mystudyblog-it.tistory.com/170#entry170comment</comments>
      <pubDate>Sun, 20 Dec 2020 23:25:22 +0900</pubDate>
    </item>
    <item>
      <title>[JSP] STUDY 22 - 게시판 만들기(MVC2 패턴) (4) : 글 상세보기</title>
      <link>https://mystudyblog-it.tistory.com/169</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(22) - STUDY 22.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w0DGP/btqQKuphNJN/nANL99KVDlSQATKTsdI0j1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w0DGP/btqQKuphNJN/nANL99KVDlSQATKTsdI0j1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w0DGP/btqQKuphNJN/nANL99KVDlSQATKTsdI0j1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw0DGP%2FbtqQKuphNJN%2FnANL99KVDlSQATKTsdI0j1%2Fimg.jpg&quot; data-filename=&quot;JSP&amp;amp;Servlet(22) - STUDY 22.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 글 상세보기 + 조회수 증가&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 93.2558%; height: 248px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boardList.jsp&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardDetail.do(*.do)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;web.xml&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardFrontController.java(Servlet)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardDetailAction.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardDAO.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardMapper.xml&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardDAO.java(&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내용보기)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardDetailAction.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardDAO.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardMapper.xml&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardDAO.java(&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;조회수증가&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardDetailAction.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardFrontController.java&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ActionForward.java &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardDetail.jsp&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) boardList.jsp&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595766271065&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@page import=&quot;com.hanul.dto.BoardDTO&quot;%&amp;gt;
&amp;lt;%@page import=&quot;java.util.List&quot;%&amp;gt;
&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;%
request.setCharacterEncoding(&quot;utf-8&quot;);
List&amp;lt;BoardDTO&amp;gt; list = (List&amp;lt;BoardDTO&amp;gt;) request.getAttribute(&quot;list&quot;);

%&amp;gt;

&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;boardList&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;div align=&quot;center&quot;&amp;gt;
		&amp;lt;h3&amp;gt;[게시판 전체목록 보기]&amp;lt;/h3&amp;gt;
		&amp;lt;table border=&quot;1&quot; style=&quot;width: 80%&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				 &amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;c:if test=&quot;${empty list} &quot;&amp;gt;
				&amp;lt;tr align=&quot;center&quot;&amp;gt;
					&amp;lt;td colspan=&quot;5&quot;&amp;gt;작성된 글이 없습니다.&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
			&amp;lt;/c:if&amp;gt;
			
			&amp;lt;%
			if(list.size() == 0) {
				out.println(&quot;&amp;lt;tr align='center'&amp;gt;&amp;lt;td colspan='5'&amp;gt;&quot; + 
							&quot;작성된 글이 없습니다.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&quot;);
			} else {
				for(int i = 0; i &amp;lt; list.size(); i++) {
					out.println(&quot;&amp;lt;tr align='center'&amp;gt;&quot;);
					/* out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_num() + &quot;&amp;lt;/td&amp;gt;&quot;); */
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + (list.size() - i) + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt;&amp;lt;a href='boardDetail.do?b_num=&quot; 
								+ list.get(i).getB_num() + &quot;'&amp;gt;&quot; 
								+ list.get(i).getB_subject() + &quot;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_writer() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_date() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_readcount() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;/tr&amp;gt;&quot;);
				}//for
			}//if-else				
			%&amp;gt;
			
			&amp;lt;tr align=&quot;center&quot;&amp;gt;
				&amp;lt;td colspan=&quot;5&quot;&amp;gt;
					&amp;lt;input type=&quot;button&quot; value=&quot;글쓰기&quot; 
							onclick=&quot;location.href='boardInsertForm.do'&quot; /&amp;gt;
				&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;- 글 제목에 a 태그를 달고 href속성에 값을 boardDetail.do로 주고 b_num값까지 같이 가져가게 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(4)-1.png&quot; data-origin-width=&quot;1109&quot; data-origin-height=&quot;333&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhLJ5V/btqF3GUAlLQ/x2vk3fOOjEK1BVFcKHVbY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhLJ5V/btqF3GUAlLQ/x2vk3fOOjEK1BVFcKHVbY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhLJ5V/btqF3GUAlLQ/x2vk3fOOjEK1BVFcKHVbY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhLJ5V%2FbtqF3GUAlLQ%2Fx2vk3fOOjEK1BVFcKHVbY0%2Fimg.png&quot; data-filename=&quot;JSP&amp;amp;Servlet(4)-1.png&quot; data-origin-width=&quot;1109&quot; data-origin-height=&quot;333&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) &lt;span style=&quot;color: #000000;&quot;&gt;BoardFrontController.java (Servlet)&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595766824216&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.action.Action;
import com.hanul.action.ActionForward;
import com.hanul.action.BoardDetailAction;
import com.hanul.action.BoardInsertAction;
import com.hanul.action.BoardListAction;

@WebServlet(&quot;/BoardFrontController.do&quot;)
public class BoardFrontController extends HttpServlet {

	protected void service(HttpServletRequest request, 
				HttpServletResponse response) 
					throws ServletException, IOException {
		// ① 클라이언트가 어떤 요청을 했는가 파악한다.
		request.setCharacterEncoding(&quot;utf-8&quot;);
		String uri = request.getRequestURI();			//uri-pattern 값 : /mbb/xxx.do
		String ctx = request.getContextPath();			//Context root 값 : /mbb
		String command = uri.substring(ctx.length());		//실제 요청한 페이지 : /xxx.do
		
		// ② 클라이언트 요청(*.do &amp;rarr; command)과 실제 처리할 비즈니스 로직(Action Class)
		//	 servlet(FrontController.java) &amp;rarr; class(Action.java)
		Action action = null;
		ActionForward forward = null;
		
		if (command.equals(&quot;/boardList.do&quot;)) {
			action = new BoardListAction();
			forward = action.excute(request, response);
		} else if(command.equals(&quot;/boardInsertForm.do&quot;)) {	//글쓰기 폼으로 화면 전환
			forward = new ActionForward();
			forward.setPath(&quot;board/boardInsertForm.jsp&quot;);
			forward.setRedirect(false);
			// 가져갈 게 없으므로 sendRedirect로 하면 되지만
			// url이 바뀌지 않아야 하므로 forward방식으로 전달
		} else if(command.equals(&quot;/boardInsert.do&quot;)) {
			action = new BoardInsertAction();
			forward = action.excute(request, response);
			// 여기서 forward에 null이라는 값이 들어오므로 밑의 코드가 실행이 되지 않는다.
		} else if(command.equals(&quot;/boardDetail.do&quot;)) {
			action = new BoardDetailAction();
			forward = action.excute(request, response);
		}
        
		// ③ 페이지 전환(프리젠테이션 로직 수행) : forward(), sendRedirect
		//	 ActionForward.java가 담당
		if (forward != null) {
			if (forward.isRedirect()) {		//true : sendRedirect() 페이지 전환
				response.sendRedirect(forward.getPath());
			} else {				// false : forward() 페이지 전환
				RequestDispatcher rd = request.getRequestDispatcher(forward.getPath());
				rd.forward(request, response);
			}
		}
		
	}//service()	
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) BoardDetailAction.java&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595767193779&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.action;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.dao.BoardDAO;
import com.hanul.dto.BoardDTO;

public class BoardDetailAction implements Action{

	@Override
	public ActionForward excute(HttpServletRequest request, 
					HttpServletResponse response)
		throws ServletException, IOException {
		// 클라이언트의 요청을 받는다.
		String b_num = request.getParameter(&quot;b_num&quot;);
		
		// 비즈니스 로직 : 글 검색
		BoardDAO dao = new BoardDAO();
		
		dao.boardCount(b_num); 	//조회수 증가
		// &amp;rarr; 조회수를 증가시킨 다음에 글 검색을 해야 변경된 조회수를 조회할 수 있다.
		// &amp;rarr; [글 상세보기] 페이지에도 올라간 조회수를 보여주기 위해
		
		BoardDTO dto = dao.boardDetail(b_num);		//글 검색
		request.setAttribute(&quot;dto&quot;, dto);
		
		// 프리젠테이션 로직
		ActionForward forward = new ActionForward();
		forward.setPath(&quot;board/boardDetail.jsp&quot;);
		forward.setRedirect(false);
		
		return forward;
	}//excute()	
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;- 조회수를 증가하게 해주는 boardCount() 메소드는 순서가 중요하다.&lt;/p&gt;
&lt;p&gt;- 만약 dao.boardDetail() 메소드&amp;nbsp; 다음에 dao.boardCount() 메소드가 나온다면, 해당 글을 클릭했을 때 [글 상세보기] 페이지에서는 조회수가 증가하지 않고 [전체 목록보기] 페이지에서만 증가된 조회수가 출력된다.&lt;/p&gt;
&lt;p&gt;- 즉, &lt;span style=&quot;color: #333333;&quot;&gt;boardCount()는 &lt;span style=&quot;color: #333333;&quot;&gt;boardDetail() 보다 먼저 호출되어야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4) BoardDAO.java&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595767581748&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.dao;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.hanul.dto.BoardDTO;
import com.hanul.dto.SearchDTO;

public class BoardDAO {
	private static SqlSessionFactory sqlMapper;
	
	static {
		String resource = &quot;com/hanul/mybatis/SqlMapConfig.xml&quot;;
		
		try {
			InputStream inputStream = Resources.getResourceAsStream(resource);
			sqlMapper = new SqlSessionFactoryBuilder().build(inputStream);
		
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(&quot;SqlSessionFactory Exception&quot;);
		}
	}//static
	
	//전체 목록 검색
	public List&amp;lt;BoardDTO&amp;gt; boardSearchAll() {
		SqlSession session = sqlMapper.openSession();
		
		List&amp;lt;BoardDTO&amp;gt; list = null;
		list = session.selectList(&quot;boardSearchAll&quot;);
		session.close();
		
		return list;
	}//boardSearchAll()
	
	// 글 등록
	public int boardInsert(BoardDTO dto) {
		SqlSession session = sqlMapper.openSession();
		
		// alert 창을 사용할 경우에는 succ를 return 해야한다.(성공/실패 확인)
		// PrintWriter를 이용한 script 코드를 구현한 후 페이지 전환 처리
		int succ = 0;
		succ = session.insert(&quot;boardInsert&quot;, dto);
		session.commit();
		session.close();
		
		return succ;
	}//boardInsert()
	
	//글 검색
	public BoardDTO boardDetail(String b_num) {
		SqlSession session = sqlMapper.openSession();
		
		BoardDTO dto = null;
		dto = session.selectOne(&quot;boardDetail&quot;, b_num);
		session.close();
		
		return dto;
	}//boardDetail()
	
	// 조회수 증가
	public void boardCount(String b_num) {
		SqlSession session = sqlMapper.openSession();
		session.update(&quot;boardCount&quot;, b_num);
		session.commit();
		session.close();
	}//boardCount()
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;- DAO에서 boardDetail() 메소드와 boardCount() 메소드는 는 Sqlsession으로 넘어간다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;(아이디가 &lt;span style=&quot;color: #333333;&quot;&gt;boardDetail&lt;/span&gt;이고 입력값의 타입이 String, 결과값의 타입이 DTO인 select 태그로 이동)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;(아이디가 &lt;span style=&quot;color: #333333;&quot;&gt;boardCount이고 입력값의 타입이 String인 update 태그로 이동&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5) boardMapper.xml&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595767709245&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
 PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
 &quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;com.hanul.mybatis.boardMapper.xml&quot;&amp;gt;
	&amp;lt;!-- SQL 문장 작성 --&amp;gt;
	&amp;lt;select id=&quot;boardSearchAll&quot; resultType=&quot;BoardDTO&quot;&amp;gt;
		select * from tblBoard order by b_num desc
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;boardInsert&quot; parameterType=&quot;BoardDTO&quot;&amp;gt;
		insert into tblBoard 
			values(b_num_seq.nextval, 
				   #{b_subject},
				   #{b_pwd},
				   #{b_content},
				   #{b_writer},
				   sysdate,
				   0)
	&amp;lt;/insert&amp;gt;
	
	&amp;lt;select id=&quot;boardDetail&quot; parameterType=&quot;String&quot; resultType=&quot;BoardDTO&quot;&amp;gt;
		select * from tblBoard where b_num = #{b_num}
	&amp;lt;/select&amp;gt;
	
	&amp;lt;update id=&quot;boardCount&quot; parameterType=&quot;String&quot;&amp;gt;
		update tblBoard set b_readcount = b_readcount + 1 where b_num = #{b_num}
	&amp;lt;/update&amp;gt;

&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6) boardDetail.jsp&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595769788044&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@page import=&quot;com.hanul.dto.BoardDTO&quot;%&amp;gt;
&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;fn&quot; uri=&quot;http://java.sun.com/jsp/jstl/functions&quot; %&amp;gt;
&amp;lt;%
request.setCharacterEncoding(&quot;utf-8&quot;);
BoardDTO dto = (BoardDTO) request.getAttribute(&quot;dto&quot;);
pageContext.setAttribute(&quot;enter&quot;, &quot;\r\n&quot;);	
// &amp;rarr; JSTL 줄바꿈 처리를 위한 현재 페이지용 객체
%&amp;gt;

&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;boardDetail&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;div align=&quot;center&quot;&amp;gt;
		&amp;lt;h3&amp;gt;[글 상세보기]&amp;lt;/h3&amp;gt;
		&amp;lt;table border=&quot;1&quot; style=&quot;width: 80%&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				&amp;lt;td align=&quot;center&quot;&amp;gt;${dto.b_writer }&amp;lt;/td&amp;gt;
				&amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;
				&amp;lt;td align=&quot;center&quot;&amp;gt;${dto.b_readcount }&amp;lt;/td&amp;gt; 
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				&amp;lt;td colspan=&quot;3&quot;&amp;gt;${dto.b_subject }&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;내용&amp;lt;/th&amp;gt;
				&amp;lt;%-- &amp;lt;td colspan=&quot;3&quot;&amp;gt;${dto.b_content }&amp;lt;/td&amp;gt;&amp;lt;!-- 줄바꿈 처리 문제 --&amp;gt; --%&amp;gt;
				&amp;lt;td colspan=&quot;3&quot;&amp;gt;
					&amp;lt;%-- dto.getB_content().replace(&quot;\r\n&quot;, &quot;&amp;lt;br/&amp;gt;&quot;) --%&amp;gt;
					${fn:replace(dto.b_content, enter, &quot;&amp;lt;br/&amp;gt;&quot;) }
				&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr align=&quot;center&quot;&amp;gt;
				&amp;lt;th&amp;gt;비밀번호&amp;lt;/th&amp;gt;
				&amp;lt;td colspan=&quot;3&quot;&amp;gt;
					&amp;lt;input type=&quot;button&quot; value=&quot;목록보기&quot; 
                    				onclick=&quot;location.href='boardList.do'&quot; /&amp;gt;
				&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 만약 내용 부분을 &lt;b&gt;&amp;lt;td&amp;gt;&amp;lt;td colspan=&quot;3&quot;&amp;gt;${dto.b_content }&amp;lt;/td&amp;gt;&lt;/b&gt;로 작성한다면 등록했을 때 줄바꿈 한 것이 제대로 출력되지 않는다 (아래 사진 참고).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(4)-3.png&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;332&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhCSda/btqF151PQY4/qUBtraStQHXQjxUVnvTXPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhCSda/btqF151PQY4/qUBtraStQHXQjxUVnvTXPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhCSda/btqF151PQY4/qUBtraStQHXQjxUVnvTXPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhCSda%2FbtqF151PQY4%2FqUBtraStQHXQjxUVnvTXPK%2Fimg.png&quot; data-filename=&quot;JSP&amp;amp;Servlet(4)-3.png&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;332&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 그러나 JSTL 태그를 이용하여 출력하면&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(4)-2.png&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;395&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rftdf/btqF3bHiREd/PJYxMZx44jffmcDt8RCBp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rftdf/btqF3bHiREd/PJYxMZx44jffmcDt8RCBp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rftdf/btqF3bHiREd/PJYxMZx44jffmcDt8RCBp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frftdf%2FbtqF3bHiREd%2FPJYxMZx44jffmcDt8RCBp1%2Fimg.png&quot; data-filename=&quot;JSP&amp;amp;Servlet(4)-2.png&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;395&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;- 이렇게 입력했을 때 줄바꿈한 그대로 출력된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(4)-2.gif&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;438&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1CNVx/btqF3FahXnU/AsLPMhoGDcGSoela4goF50/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1CNVx/btqF3FahXnU/AsLPMhoGDcGSoela4goF50/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1CNVx/btqF3FahXnU/AsLPMhoGDcGSoela4goF50/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/1CNVx/btqF3FahXnU/AsLPMhoGDcGSoela4goF50/img.gif&quot; data-filename=&quot;JSP&amp;amp;Servlet(4)-2.gif&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;438&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;- 그리고 이와 같이 [글 상세보기] 페이지와 [게시판 전체목록 보기] 페이지 둘 다 조회수가 올라간 상태로 출력됨을 알 수 있다.&lt;/p&gt;</description>
      <category>Frontend/JSP&amp;amp;Servlet</category>
      <author>PSEveloper</author>
      <guid isPermaLink="true">https://mystudyblog-it.tistory.com/169</guid>
      <comments>https://mystudyblog-it.tistory.com/169#entry169comment</comments>
      <pubDate>Sun, 20 Dec 2020 23:24:38 +0900</pubDate>
    </item>
    <item>
      <title>[JSP] STUDY 21 - 게시판 만들기(MVC2 패턴) (3) : 글 쓰기</title>
      <link>https://mystudyblog-it.tistory.com/168</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(21) - STUDY 21.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgsmVB/btqQKtRvDQf/WWKS1LdOYdge1YVD4kbTOk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgsmVB/btqQKtRvDQf/WWKS1LdOYdge1YVD4kbTOk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgsmVB/btqQKtRvDQf/WWKS1LdOYdge1YVD4kbTOk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgsmVB%2FbtqQKtRvDQf%2FWWKS1LdOYdge1YVD4kbTOk%2Fimg.jpg&quot; data-filename=&quot;JSP&amp;amp;Servlet(21) - STUDY 21.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 글에 대한 정보 입력 후 출력하기&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 92.907%; height: 249px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boardList.jsp&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardInsertForm.do(*.do)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;web.xml&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardFrontController.java(Servlet)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardInsertForm.jsp(&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;입력화면&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardInsert.do(*.do)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;web.xml&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardFrontController.java(Servlet)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardInsertAction.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardDAO.java&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardMapper.xml&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardDAO.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardInsertAction.java&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardFrontController.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ActionForward.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardList.do&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) boardList.jsp&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595762017478&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@page import=&quot;com.hanul.dto.BoardDTO&quot;%&amp;gt;
&amp;lt;%@page import=&quot;java.util.List&quot;%&amp;gt;
&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;%
request.setCharacterEncoding(&quot;utf-8&quot;);
List&amp;lt;BoardDTO&amp;gt; list = (List&amp;lt;BoardDTO&amp;gt;) request.getAttribute(&quot;list&quot;);

%&amp;gt;

&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;boardList&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;div align=&quot;center&quot;&amp;gt;
		&amp;lt;h3&amp;gt;[게시판 전체목록 보기]&amp;lt;/h3&amp;gt;
		&amp;lt;table border=&quot;1&quot; style=&quot;width: 80%&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				 &amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;c:if test=&quot;${empty list} &quot;&amp;gt;
				&amp;lt;tr align=&quot;center&quot;&amp;gt;
					&amp;lt;td colspan=&quot;5&quot;&amp;gt;작성된 글이 없습니다.&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
			&amp;lt;/c:if&amp;gt;
			
			&amp;lt;%
			if(list.size() == 0) {
				out.println(&quot;&amp;lt;tr align='center'&amp;gt;&amp;lt;td colspan='5'&amp;gt;작성된 글이 없습니다.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&quot;);
			} else {
				for(int i = 0; i &amp;lt; list.size(); i++) {
					out.println(&quot;&amp;lt;tr align='center'&amp;gt;&quot;);
					/* out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_num() + &quot;&amp;lt;/td&amp;gt;&quot;); */
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + (list.size() - i) + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt;&quot; + list.get(i).getB_subject() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_writer() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_date() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_readcount() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;/tr&amp;gt;&quot;);
				}//for
			}//if-else				
			%&amp;gt;
			
			&amp;lt;tr align=&quot;center&quot;&amp;gt;
				&amp;lt;td colspan=&quot;5&quot;&amp;gt;
					&amp;lt;input type=&quot;button&quot; value=&quot;글쓰기&quot; 
                    				onclick=&quot;location.href='boardInsertForm.do'&quot; /&amp;gt;
				&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;- 테이블 하단에 글쓰기 버튼을 추가한 후 태그안에 onclick 속성을 통해 boardInsertForm.do라는 경로로 값을 설정한다. (.do이므로 &lt;span style=&quot;color: #000000;&quot;&gt;BoardFrontController로 연결된다.&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;293&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(3)-1.png&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQKIGh/btqF00AyBiI/81IgDlpVU46aDUbulmRKJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQKIGh/btqF00AyBiI/81IgDlpVU46aDUbulmRKJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQKIGh/btqF00AyBiI/81IgDlpVU46aDUbulmRKJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQKIGh%2FbtqF00AyBiI%2F81IgDlpVU46aDUbulmRKJ1%2Fimg.png&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;293&quot; data-filename=&quot;JSP&amp;amp;Servlet(3)-1.png&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) &lt;span style=&quot;color: #000000;&quot;&gt;BoardFrontController.java (Servlet)&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595762367022&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.action.Action;
import com.hanul.action.ActionForward;
import com.hanul.action.BoardListAction;

@WebServlet(&quot;/BoardFrontController.do&quot;)
public class BoardFrontController extends HttpServlet {

	protected void service(HttpServletRequest request, 
				HttpServletResponse response) 
					throws ServletException, IOException {
		// ① 클라이언트가 어떤 요청을 했는가 파악한다.
		request.setCharacterEncoding(&quot;utf-8&quot;);
		String uri = request.getRequestURI();			//uri-pattern 값 : /mbb/xxx.do
		String ctx = request.getContextPath();			//Context root 값 : /mbb
		String command = uri.substring(ctx.length());		//실제 요청한 페이지 : /xxx.do
		
		// ② 클라이언트 요청(*.do &amp;rarr; command)과 실제 처리할 비즈니스 로직(Action Class)
		//	 servlet(FrontController.java) &amp;rarr; class(Action.java)
		Action action = null;
		ActionForward forward = null;
		
		if (command.equals(&quot;/boardList.do&quot;)) {
			action = new BoardListAction();
			forward = action.excute(request, response);
		} else if(command.equals(&quot;/boardInsertForm.do&quot;)) {	//글쓰기 폼으로 화면 전환
			forward = new ActionForward();
			forward.setPath(&quot;board/boardInsertForm.jsp&quot;);
			forward.setRedirect(false);
			// 가져갈 게 없으므로 sendRedirect로 하면 되지만
			// url이 바뀌지 않아야 하므로 forward방식으로 전달
		}
		
		// ③ 페이지 전환(프리젠테이션 로직 수행) : forward(), sendRedirect
		//	 ActionForward.java가 담당
		if (forward != null) {
			if (forward.isRedirect()) {		//true : sendRedirect() 페이지 전환
				response.sendRedirect(forward.getPath());
			} else {				// false : forward() 페이지 전환
				RequestDispatcher rd = request.getRequestDispatcher(forward.getPath());
				rd.forward(request, response);
			}
		}
		
	}//service()
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- boardInsertForm.jsp는 글 쓸 정보를 입력받는 글쓰기 입력 화면 역할을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 그러므로 따로 Action~ 객체를 만들지 않고 바로 ActionForward의 setPath 메소드를 통해 &lt;span style=&quot;color: #000000;&quot;&gt;boardInsertForm.jsp로 바로 넘어가게 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3) &lt;span style=&quot;color: #000000;&quot;&gt;boardInsertForm.jsp&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595762934843&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot;
    pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;boardInsertForm&amp;lt;/title&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
	function fnLoad() {
		document.regForm.b_writer.focus();
	}
	
	function fnSubmit() {
		if(confirm(&quot;작성하신 글을 등록하시겠습니까?&quot;)) {
			return true;
		}
		return false;
	}
	
	function fnReset() {
		if (confirm(&quot;입력하신 내용이 초기화 됩니다.\n진행하시겠습니까?&quot;)) {
			fnLoad();
			return true;
		}
		return false;
	}
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body onload=&quot;fnLoad();&quot;&amp;gt;
	&amp;lt;div align=&quot;center&quot;&amp;gt;
		&amp;lt;h3&amp;gt;[게시판 글쓰기]&amp;lt;/h3&amp;gt;
		&amp;lt;form action=&quot;boardInsert.do&quot; method=&quot;post&quot; name=&quot;regForm&quot; 
        		onsubmit=&quot;return fnSubmit();&quot; onreset=&quot;return fnReset();&quot;&amp;gt;
			&amp;lt;table border=&quot;1&quot; style=&quot;width: 80%&quot;&amp;gt;
				&amp;lt;tr&amp;gt;
					&amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
					&amp;lt;td&amp;gt;
						&amp;lt;input type=&quot;text&quot; name=&quot;b_writer&quot; maxlength=&quot;20&quot; 
                        				required=&quot;required&quot; /&amp;gt;
					&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
				&amp;lt;tr&amp;gt;
					&amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
					&amp;lt;td&amp;gt;
						&amp;lt;input type=&quot;text&quot; name=&quot;b_subject&quot; maxlength=&quot;50&quot; 
                        				required=&quot;required&quot; /&amp;gt;
					&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
				&amp;lt;tr&amp;gt;
					&amp;lt;th&amp;gt;내용&amp;lt;/th&amp;gt;
					&amp;lt;td&amp;gt;
						&amp;lt;textarea rows=&quot;10&quot; cols=&quot;50&quot; name=&quot;b_content&quot; 
                        				required=&quot;required&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
					&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
				&amp;lt;tr&amp;gt;
					&amp;lt;th&amp;gt;비밀번호&amp;lt;/th&amp;gt;
					&amp;lt;td&amp;gt;
						&amp;lt;input type=&quot;password&quot; name=&quot;b_pwd&quot; maxlength=&quot;20&quot; 
                        				required=&quot;required&quot; /&amp;gt;
					&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
				&amp;lt;tr align=&quot;center&quot;&amp;gt;
					&amp;lt;td colspan=&quot;2&quot;&amp;gt;
						&amp;lt;input type=&quot;submit&quot; value=&quot;등록하기&quot; &amp;gt;
						&amp;lt;input type=&quot;reset&quot; value=&quot;내용 지우기&quot;&amp;gt;
						&amp;lt;input type=&quot;button&quot; value=&quot;목록보기&quot; 
                        				onclick=&quot;location.href='boardList.do'&quot;&amp;gt;
					&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
			&amp;lt;/table&amp;gt;
		&amp;lt;/form&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 글쓰기 버튼을 누르면 아래와 같은 화면(&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardInsertForm.jsp&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)으로 넘어가게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(3)-2.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;481&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb4VQO/btqF3clQvb5/K2pjqWTskcq3kuXwpyt2aK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb4VQO/btqF3clQvb5/K2pjqWTskcq3kuXwpyt2aK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb4VQO/btqF3clQvb5/K2pjqWTskcq3kuXwpyt2aK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb4VQO%2FbtqF3clQvb5%2FK2pjqWTskcq3kuXwpyt2aK%2Fimg.png&quot; data-filename=&quot;JSP&amp;amp;Servlet(3)-2.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;481&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;- 일단 type속성이 reset인 input태그로 작성된 '내용 지우기' 버튼을 클릭하면 작성한 내용이 다 지워지고 첫번째 input 태그에 focus를 주는 기능을 script를 통해 구현하였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(3)-3.gif&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;550&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hx2yk/btqF142SaBg/9E96wM8HpfEHC7FLmuP6u0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hx2yk/btqF142SaBg/9E96wM8HpfEHC7FLmuP6u0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hx2yk/btqF142SaBg/9E96wM8HpfEHC7FLmuP6u0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/Hx2yk/btqF142SaBg/9E96wM8HpfEHC7FLmuP6u0/img.gif&quot; data-filename=&quot;JSP&amp;amp;Servlet(3)-3.gif&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;550&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;- 또 &lt;span style=&quot;color: #333333;&quot;&gt;type속성이 submit인 input태그로 작성된 '등록하기' 버튼을 클릭하면 confirm창을 띄운 후(script),&amp;nbsp; &amp;nbsp; &amp;nbsp;boardInsert.do(action 속성)로 넘어가게끔 설정했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4) &lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardFrontController.java (Servlet)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595764537315&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.action.Action;
import com.hanul.action.ActionForward;
import com.hanul.action.BoardInsertAction;
import com.hanul.action.BoardListAction;

@WebServlet(&quot;/BoardFrontController.do&quot;)
public class BoardFrontController extends HttpServlet {

	protected void service(HttpServletRequest request, 
				HttpServletResponse response) 
					throws ServletException, IOException {
		// ① 클라이언트가 어떤 요청을 했는가 파악한다.
		request.setCharacterEncoding(&quot;utf-8&quot;);
		String uri = request.getRequestURI();			//uri-pattern 값 : /mbb/xxx.do
		String ctx = request.getContextPath();			//Context root 값 : /mbb
		String command = uri.substring(ctx.length());		//실제 요청한 페이지 : /xxx.do
		
		// ② 클라이언트 요청(*.do &amp;rarr; command)과 실제 처리할 비즈니스 로직(Action Class)
		//	 servlet(FrontController.java) &amp;rarr; class(Action.java)
		Action action = null;
		ActionForward forward = null;
		
		if (command.equals(&quot;/boardList.do&quot;)) {
			action = new BoardListAction();
			forward = action.excute(request, response);
		} else if(command.equals(&quot;/boardInsertForm.do&quot;)) {	//글쓰기 폼으로 화면 전환
			forward = new ActionForward();
			forward.setPath(&quot;board/boardInsertForm.jsp&quot;);
			forward.setRedirect(false);
			// 가져갈 게 없으므로 sendRedirect로 하면 되지만
			// url이 바뀌지 않아야 하므로 forward방식으로 전달
		} else if(command.equals(&quot;/boardInsert.do&quot;)) {
			action = new BoardInsertAction();
			forward = action.excute(request, response);
			// 여기서 forward에 null이라는 값이 들어오므로 밑의 코드가 실행이 되지 않는다.
		}
		
		// ③ 페이지 전환(프리젠테이션 로직 수행) : forward(), sendRedirect
		//	 ActionForward.java가 담당
		if (forward != null) {
			if (forward.isRedirect()) {		//true : sendRedirect() 페이지 전환
				response.sendRedirect(forward.getPath());
			} else {				// false : forward() 페이지 전환
				RequestDispatcher rd = request.getRequestDispatcher(forward.getPath());
				rd.forward(request, response);
			}
		}
		
	}//service()	
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;5) BoardInsertAction.java&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595764836207&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.action;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.dao.BoardDAO;
import com.hanul.dto.BoardDTO;

public class BoardInsertAction implements Action{

	@Override
	public ActionForward excute(HttpServletRequest request, 
				   HttpServletResponse response)
		throws ServletException, IOException {
		//클라이언트의 요청을 받는다 : 매개변수의 정보를 가져온다  ▶   DTO 묶어준다
		request.setCharacterEncoding(&quot;utf-8&quot;);
		
		String b_writer = request.getParameter(&quot;b_writer&quot;);
		String b_subject = request.getParameter(&quot;b_subject&quot;);
		String b_content = request.getParameter(&quot;b_content&quot;);
		String b_pwd = request.getParameter(&quot;b_pwd&quot;);
		
		/*
		BoardDTO dto = new BoardDTO();
		dto.setB_writer(b_writer);
		dto.setB_subject(b_subject);
		dto.setB_content(b_content);
		dto.setB_pwd(b_pwd);
		*/
		
		BoardDTO dto = new BoardDTO(b_subject, b_pwd, b_content, b_writer);
		// &amp;rarr; 생성자 메소드 오버로딩을 통해 값 전달
		
		//비즈니스 로직 : DAO 연동(DB 접속, SQL 쿼리 수행)
		BoardDAO dao = new BoardDAO();
		int succ = dao.boardInsert(dto);
		
		// 프리젠테이션 로직 : alert창 사용  ▶  PrintWriter를 이용한 script 코드를 구현
		response.setContentType(&quot;text/html; charset=utf-8&quot;);
		PrintWriter out = response.getWriter();
		if (succ &amp;gt; 0) {
			out.println(&quot;&amp;lt;script&amp;gt;alert('등록완료!');&quot;);
			out.println(&quot;location.href='boardList.do';&amp;lt;/script&amp;gt;&quot;);
		} else {
			out.println(&quot;&amp;lt;script&amp;gt;alert('등록실패!');&quot;);
			out.println(&quot;location.href='boardList.do';&amp;lt;/script&amp;gt;&quot;);			
		}
		
		//위의 코드에서 페이지 전환이 이루어지므로 , 
		//ActionForward가 필요하지 x  &amp;rarr; null을 리턴한다.
		return null;
	}//excute()
	
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;- &lt;span style=&quot;color: #000000;&quot;&gt;boardInsertForm.jsp에서 입력받은 값을 request.getParameter() 메소드로 받아와 DTO에 저장한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 또 아래의 DAO의 boardInsert 메소드를 통해 sql 문장을 실행하고 데이터 입력이 성공하면 alert 창을 띄우고 boardList.jsp로 넘어가게 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6) BoardDAO.java&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595765295721&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.dao;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.hanul.dto.BoardDTO;
import com.hanul.dto.SearchDTO;

public class BoardDAO {
	private static SqlSessionFactory sqlMapper;
	
	static {
		String resource = &quot;com/hanul/mybatis/SqlMapConfig.xml&quot;;
		
		try {
			InputStream inputStream = Resources.getResourceAsStream(resource);
			sqlMapper = new SqlSessionFactoryBuilder().build(inputStream);
		
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(&quot;SqlSessionFactory Exception&quot;);
		}
	}//static
	
	//전체 목록 검색
	public List&amp;lt;BoardDTO&amp;gt; boardSearchAll() {
		SqlSession session = sqlMapper.openSession();
		
		List&amp;lt;BoardDTO&amp;gt; list = null;
		list = session.selectList(&quot;boardSearchAll&quot;);
		session.close();
		
		return list;
	}//boardSearchAll()
	
	// 글 등록
	public int boardInsert(BoardDTO dto) {
		SqlSession session = sqlMapper.openSession();
		
		// alert 창을 사용할 경우에는 succ를 return 해야한다.(성공/실패 확인)
		// PrintWriter를 이용한 script 코드를 구현한 후 페이지 전환 처리
		int succ = 0;
		succ = session.insert(&quot;boardInsert&quot;, dto);
		session.commit();
		session.close();
		
		return succ;
	}//boardInsert()
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;- DAO에서 boardInsert() 메소드는 Sqlsession으로 넘어간다. (아이디가 boardInsert이고 입력값의 타입이 dto인 insert 태그로 이동)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7) boardMapper.xml&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595765334391&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
 PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
 &quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;com.hanul.mybatis.boardMapper.xml&quot;&amp;gt;
	&amp;lt;!-- SQL 문장 작성 --&amp;gt;
	&amp;lt;select id=&quot;boardSearchAll&quot; resultType=&quot;BoardDTO&quot;&amp;gt;
		select * from tblBoard order by b_num desc
	&amp;lt;/select&amp;gt;
	
	&amp;lt;insert id=&quot;boardInsert&quot; parameterType=&quot;BoardDTO&quot;&amp;gt;
		insert into tblBoard 
			values(b_num_seq.nextval, 
				   #{b_subject},
				   #{b_pwd},
				   #{b_content},
				   #{b_writer},
				   sysdate,
				   0)
	&amp;lt;/insert&amp;gt;
&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(3)-5.gif&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;550&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4xLuT/btqF3btHYbH/UAeo8U4NR8E0PUokTfDQrK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4xLuT/btqF3btHYbH/UAeo8U4NR8E0PUokTfDQrK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4xLuT/btqF3btHYbH/UAeo8U4NR8E0PUokTfDQrK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/4xLuT/btqF3btHYbH/UAeo8U4NR8E0PUokTfDQrK/img.gif&quot; data-filename=&quot;JSP&amp;amp;Servlet(3)-5.gif&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;550&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;- 위와 같이 전체 목록 보기 페이지(boardList.jsp)에 입력한 데이터가 업로드된 것을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/JSP&amp;amp;Servlet</category>
      <author>PSEveloper</author>
      <guid isPermaLink="true">https://mystudyblog-it.tistory.com/168</guid>
      <comments>https://mystudyblog-it.tistory.com/168#entry168comment</comments>
      <pubDate>Sun, 20 Dec 2020 23:22:57 +0900</pubDate>
    </item>
    <item>
      <title>[JSP] STUDY 20 - 게시판 만들기(MVC2 패턴)  (2) : 전체 목록 보기</title>
      <link>https://mystudyblog-it.tistory.com/167</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(20) - STUDY 20.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbhgys/btqQBHKPM9n/8fw84jydvVDMXeFfH6KlK0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbhgys/btqQBHKPM9n/8fw84jydvVDMXeFfH6KlK0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbhgys/btqQBHKPM9n/8fw84jydvVDMXeFfH6KlK0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbhgys%2FbtqQBHKPM9n%2F8fw84jydvVDMXeFfH6KlK0%2Fimg.jpg&quot; data-filename=&quot;JSP&amp;amp;Servlet(20) - STUDY 20.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 전체 목록 보기(데이터 베이스 연결)&lt;/b&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 85%; height: 218px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BoardMain.html&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardList.do(*.do)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;web.xml&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardFrontController.java(Servlet)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardListAction.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardDAO.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardMapper.xml&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardDAO.java&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardListAction.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BoardFrontController.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ActionForward.java&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;boardList.jsp&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) Action.java, ActionForward.java&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595747714078&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Action.java : Servlet 역할을 수행하는 파일들의 공통적인 코드의 집합
package com.hanul.action;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Action {
	public abstract ActionForward excute(HttpServletRequest request, 
					     HttpServletResponse response) 
			throws ServletException, IOException;
	// 접근제어자 protected : 같은 패키지 안에 있는 파일안에서만 접근 가능
	// abstract : 추상 메소드(구현부는 없고 선언부만 작성, 
	//			해당 class를 상속받으면 무조건 오버라이드 해야하는 메소드)	
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1595747823397&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//페이지 전환(프리젠테이션 로직 수행)을 수행하는 클래스
package com.hanul.action;

public class ActionForward {
	private String path;			//View Page(*.jsp)의 경로와 파일명
	private boolean isRedirect;		//페이지 전환 방식  ▶   true : redirect() 방식 
	//								false : forward() 방식
	
	public String getPath() {
		return path;
	}
	public void setPath(String path) {
		this.path = path;
	}
	public boolean isRedirect() {
		return isRedirect;
	}
	public void setRedirect(boolean isRedirect) {
		this.isRedirect = isRedirect;
	}	
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) &lt;span style=&quot;color: #000000;&quot;&gt;BoardMain.html&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595747024399&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Board Main&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
		location.href = &quot;boardList.do&quot;;
	&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;- &lt;span style=&quot;color: #000000;&quot;&gt;BoardMain.html가 실행하자마자 boardList.do로 연결한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3) web.xml&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595747122282&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;web-app xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; 
		 xmlns=&quot;http://xmlns.jcp.org/xml/ns/javaee&quot; 
		 xsi:schemaLocation=&quot;http://xmlns.jcp.org/xml/ns/javaee 
		 			http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd&quot; 
		 id=&quot;WebApp_ID&quot; version=&quot;3.1&quot;&amp;gt;
  &amp;lt;display-name&amp;gt;06.MyBatisBoard&amp;lt;/display-name&amp;gt;
  &amp;lt;welcome-file-list&amp;gt;
    &amp;lt;welcome-file&amp;gt;index.html&amp;lt;/welcome-file&amp;gt;
    &amp;lt;welcome-file&amp;gt;index.htm&amp;lt;/welcome-file&amp;gt;
    &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;
    &amp;lt;welcome-file&amp;gt;default.html&amp;lt;/welcome-file&amp;gt;
    &amp;lt;welcome-file&amp;gt;default.htm&amp;lt;/welcome-file&amp;gt;
    &amp;lt;welcome-file&amp;gt;default.jsp&amp;lt;/welcome-file&amp;gt;
  &amp;lt;/welcome-file-list&amp;gt;
  &amp;lt;servlet&amp;gt;
  	&amp;lt;display-name&amp;gt;BoardFrontController&amp;lt;/display-name&amp;gt;
  	&amp;lt;servlet-name&amp;gt;BoardFrontController&amp;lt;/servlet-name&amp;gt;
  	&amp;lt;servlet-class&amp;gt;com.hanul.controller.BoardFrontController&amp;lt;/servlet-class&amp;gt;
  &amp;lt;/servlet&amp;gt;
  &amp;lt;servlet-mapping&amp;gt;
  	&amp;lt;servlet-name&amp;gt;BoardFrontController&amp;lt;/servlet-name&amp;gt;
  	&amp;lt;url-pattern&amp;gt;*.do&amp;lt;/url-pattern&amp;gt;
  &amp;lt;/servlet-mapping&amp;gt;
&amp;lt;/web-app&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;- web.xml 파일을 통해 &lt;span style=&quot;color: #333333;&quot;&gt;BoardFrontController를 Servlet을 등록하고, &lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;.do로 끝나는 모든 경로&lt;/b&gt;&lt;/span&gt;를 BoardFrontController.java로 연결하게끔 설정한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) &lt;span style=&quot;color: #333333;&quot;&gt;BoardFrontController.java&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595747516021&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.action.Action;
import com.hanul.action.ActionForward;
import com.hanul.action.BoardListAction;

@WebServlet(&quot;/BoardFrontController.do&quot;)
public class BoardFrontController extends HttpServlet {

	protected void service(HttpServletRequest request, 
				HttpServletResponse response) 
		throws ServletException, IOException {
		// ① 클라이언트가 어떤 요청을 했는가 파악한다.
		request.setCharacterEncoding(&quot;utf-8&quot;);
		String uri = request.getRequestURI();		//uri-pattern 값 : /mbb/xxx.do
		String ctx = request.getContextPath();		//Context root 값 : /mbb
		String command = uri.substring(ctx.length());	//실제 요청한 페이지 : /xxx.do
		//System.out.println(&quot;uri : &quot; + uri);
		//System.out.println(&quot;ctx : &quot; + ctx);
		//System.out.println(&quot;command : &quot; + command);
		
		// ② 클라이언트 요청(*.do &amp;rarr; command)과 실제 처리할 비즈니스 로직(Action Class)
		//	 servlet(FrontController.java) &amp;rarr; class(Action.java)
		Action action = null;
		ActionForward forward = null;
		
		if (command.equals(&quot;/boardList.do&quot;)) {
			action = new BoardListAction();
			forward = action.excute(request, response);
		} 
        
		// ③ 페이지 전환(프리젠테이션 로직 수행) : forward(), sendRedirect
		//	 ActionForward.java가 담당
		if (forward != null) {
			if (forward.isRedirect()) {		//true : sendRedirect() 페이지 전환
				response.sendRedirect(forward.getPath());
			} else {				// false : forward() 페이지 전환
				RequestDispatcher rd = request.getRequestDispatcher(forward.getPath());
				rd.forward(request, response);
			}
		}
		
	}//service()
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5) &lt;span style=&quot;color: #000000;&quot;&gt;BoardListAction.java&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595748075546&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.action;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.dao.BoardDAO;
import com.hanul.dto.BoardDTO;

public class BoardListAction implements Action{
	// interface를 상속받음으로써 Controller 역할을 대신
	@Override
	public ActionForward excute(HttpServletRequest request, 
								HttpServletResponse response)
		throws ServletException, IOException {
		// 게시판 테이블의 전체 목록을 가져오는 작업을 수행 : 비즈니스 로직
		BoardDAO dao = new BoardDAO();
		
		List&amp;lt;BoardDTO&amp;gt; list = dao.boardSearchAll();
		request.setAttribute(&quot;list&quot;, list);
		// &amp;rarr; dao의 boardSearchAll() 메소드에서 생성한 
		//  무한 배열 list를 boardList.jsp로 넘기기 위해
		
		//BoardListAction 작업을 마무리 했다  &amp;rarr; 프리젠테이션 로직(페이지 전환) 
		// : ActionForward.java : path, isRedirect
		// ① View Page(path) : board/boardList.jsp
		// ② 페이지 전환방식(isRedirect) : forward()
		ActionForward forward = new ActionForward();
		forward.setPath(&quot;board/boardList.jsp&quot;);
		forward.setRedirect(false);		//true : sendRedirect(), false : forward()
		
		return forward;
	}//excute()
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6) BoardDAO.java&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595748287202&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.dao;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.hanul.dto.BoardDTO;

public class BoardDAO {
	private static SqlSessionFactory sqlMapper;
	
	static {
		String resource = &quot;com/hanul/mybatis/SqlMapConfig.xml&quot;;
		
		try {
			InputStream inputStream = Resources.getResourceAsStream(resource);
			sqlMapper = new SqlSessionFactoryBuilder().build(inputStream);
		
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(&quot;SqlSessionFactory Exception&quot;);
		}
	}//static
	
	//전체 목록 검색
	public List&amp;lt;BoardDTO&amp;gt; boardSearchAll() {
		SqlSession session = sqlMapper.openSession();
		List&amp;lt;BoardDTO&amp;gt; list = null;
		list = session.selectList(&quot;boardSearchAll&quot;);
		session.close();
		
		return list;
	}//boardSearchAll()
    
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7) boardList.jsp&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1595749120349&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@page import=&quot;com.hanul.dto.BoardDTO&quot;%&amp;gt;
&amp;lt;%@page import=&quot;java.util.List&quot;%&amp;gt;
&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;%
request.setCharacterEncoding(&quot;utf-8&quot;);
List&amp;lt;BoardDTO&amp;gt; list = (List&amp;lt;BoardDTO&amp;gt;) request.getAttribute(&quot;list&quot;);

%&amp;gt;

&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;boardList&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;div align=&quot;center&quot;&amp;gt;
		&amp;lt;h3&amp;gt;[게시판 전체목록 보기]&amp;lt;/h3&amp;gt;
		&amp;lt;table border=&quot;1&quot; style=&quot;width: 80%&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				 &amp;lt;th&amp;gt;번호&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;제목&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;작성자&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;작성일&amp;lt;/th&amp;gt;
				 &amp;lt;th&amp;gt;조회수&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;!-- 1. JSTL core 문법을 이용한 출력 : b_num_seq에 의해서 번호의 순서가 안맞다. --&amp;gt;
			&amp;lt;c:if test=&quot;${empty list} &quot;&amp;gt;
				&amp;lt;tr align=&quot;center&quot;&amp;gt;
					&amp;lt;td colspan=&quot;5&quot;&amp;gt;작성된 글이 없습니다.&amp;lt;/td&amp;gt;
				&amp;lt;/tr&amp;gt;
			&amp;lt;/c:if&amp;gt;
			&amp;lt;%-- 			
			&amp;lt;c:if test=&quot;${list ne null }&quot;&amp;gt;
				&amp;lt;c:forEach var=&quot;i&quot; items=&quot;${list }&quot;&amp;gt;
					&amp;lt;tr align=&quot;center&quot;&amp;gt;
						&amp;lt;td&amp;gt;${i.b_num }&amp;lt;/td&amp;gt;
						&amp;lt;td&amp;gt;${i.b_subject }&amp;lt;/td&amp;gt;
						&amp;lt;td&amp;gt;${i.b_writer }&amp;lt;/td&amp;gt;
						&amp;lt;td&amp;gt;${i.b_date }&amp;lt;/td&amp;gt;
						&amp;lt;td&amp;gt;${i.b_readcount }&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
				&amp;lt;/c:forEach&amp;gt;
			&amp;lt;/c:if&amp;gt; 
			--%&amp;gt;
			
			&amp;lt;!-- 2. 향상된 for문을 이용한 출력 : 번호 순서가 맞지 않다. --&amp;gt;
			&amp;lt;%--
			if(list.size() == 0) {
				out.println(&quot;&amp;lt;tr align='center'&amp;gt;&amp;lt;td colspan='5'&amp;gt;작성된 글이 없습니다.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&quot;);
			} else {
				for(BoardDTO dto : list) {
					out.println(&quot;&amp;lt;tr align='center'&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + dto.getB_num() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + dto.getB_subject() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + dto.getB_writer() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + dto.getB_date() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + dto.getB_readcount() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;/tr&amp;gt;&quot;);
				}//for
			}//if-else
			--%&amp;gt;
			
			&amp;lt;%
			if(list.size() == 0) {
				out.println(&quot;&amp;lt;tr align='center'&amp;gt;&amp;lt;td colspan='5'&amp;gt;작성된 글이 없습니다.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&quot;);
			} else {
				for(int i = 0; i &amp;lt; list.size(); i++) {
					out.println(&quot;&amp;lt;tr align='center'&amp;gt;&quot;);
					/* out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_num() + &quot;&amp;lt;/td&amp;gt;&quot;); */
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + (list.size() - i) + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt;&quot; + list.get(i).getB_subject() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_writer() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_date() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt; &quot; + list.get(i).getB_readcount() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;/tr&amp;gt;&quot;);
				}//for
			}//if-else				
			%&amp;gt;

		&amp;lt;/table&amp;gt;
	&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;- 데이터 베이스에 데이터가 하나도 없을 경우 &quot;작성된 글이 없습니다.&quot;라고 표시하고,&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 그렇지 않다면 테이블을 통해 데이터를 아래와 같이 화면에 출력한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(2)-1.png&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;291&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzhfde/btqF0ZhgKi9/kkUyEfhe9Op2cU04kQfZu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzhfde/btqF0ZhgKi9/kkUyEfhe9Op2cU04kQfZu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzhfde/btqF0ZhgKi9/kkUyEfhe9Op2cU04kQfZu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzhfde%2FbtqF0ZhgKi9%2FkkUyEfhe9Op2cU04kQfZu1%2Fimg.png&quot; data-filename=&quot;JSP&amp;amp;Servlet(2)-1.png&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;291&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/JSP&amp;amp;Servlet</category>
      <author>PSEveloper</author>
      <guid isPermaLink="true">https://mystudyblog-it.tistory.com/167</guid>
      <comments>https://mystudyblog-it.tistory.com/167#entry167comment</comments>
      <pubDate>Sun, 20 Dec 2020 23:22:03 +0900</pubDate>
    </item>
    <item>
      <title>[JSP] STUDY 19 - 게시판 만들기(MVC2 패턴) (1) : 기초 작업</title>
      <link>https://mystudyblog-it.tistory.com/166</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(19) - STUDY 19.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNf3e7/btqQBHRymll/1pWW4fWGAjRKeJzWzhqzxK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNf3e7/btqQBHRymll/1pWW4fWGAjRKeJzWzhqzxK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNf3e7/btqQBHRymll/1pWW4fWGAjRKeJzWzhqzxK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNf3e7%2FbtqQBHRymll%2F1pWW4fWGAjRKeJzWzhqzxK%2Fimg.jpg&quot; data-filename=&quot;JSP&amp;amp;Servlet(19) - STUDY 19.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. MVC 패턴&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;: MVC 패턴은 &lt;/span&gt;Model , View , Controller 의 합성어로 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- Model : 백그라운드에서 동작하는 로직을 처리합니다.&lt;/p&gt;
&lt;p&gt;- View : 사용자가 보게 될 결과 화면을 출력합니다.&lt;/p&gt;
&lt;p&gt;- Controller : 사용자의 입력처리와 흐름 제어를 담당합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;JSP 웹사이트 구조는 크게 모델1 방식과 모델2 방식으로 나뉜다.&lt;/p&gt;
&lt;p&gt;간단하게 분류하자면 JSP에서 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;출력과 로직을&lt;/b&gt;&lt;/span&gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전부&lt;/b&gt;&lt;/span&gt; 처리하느냐(MVC1) JSP에서 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;출력만&lt;/span&gt;&lt;/b&gt; 처리하느냐(&lt;span style=&quot;color: #333333;&quot;&gt;MVC&lt;/span&gt;2)로 분류할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. MVC2 방식&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;- 웹브라우저 사용자의 요청을 Servlet이 받는다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- Servlet은 &lt;/span&gt;웹브라우저의 요청을 받아 View로 보여줄것인지 Model로 보내줄것인지 정하여 전송한다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- View페이지는 사용자에게 보여주는 역할만 담당 / 실질적인 기능의 부분은 Model에서 담당합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- 모델2 방식의 경우 실질적으로 보여지는 HTML과 JAVA 소스를 분리 해놓았기 때문에 모델1방식에 비해 개발을 확장시키기도 쉽고 유지보수하기도 쉽다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;- MVC1은 요청한 페이지마다 각각 Controller가 생성되었지만, MVC2는 하나의 Controller가 요청 처리한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;3. MyBatisBoard Web Project (MVC2 게시판 만들기) &lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;1) 작업 지시서&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 88.2559%; height: 390px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;○&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JAVA&lt;/span&gt;&lt;/b&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- com.hanul.mybatis : board.sql, db.properties, SqlMapConfig.xml, boardMapper.xml&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- com.hanul.dto : BoardDTO.java, SearchDTO.java&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- com.hanul.dao : BoardDAO.java&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- com.hanul.controller : BoardFrontController.java&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;▶&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Servlet : web.xml&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Mapping&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- com.hanul.action : Action.java(Interface), ActionForward.java, Boardxxx.java&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;○&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;WebContent&lt;/span&gt;&lt;/b&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- BoardMain.html&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- board\ : *.jsp&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- css\ : *.css&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- js\ : *.js&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- images\ : *.png, *.gif, *.jpg&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 라이브러리 삽입&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;514&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bym0UY/btqFOiIflRy/RvQowR8dvwTkq9K9ErmNI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bym0UY/btqFOiIflRy/RvQowR8dvwTkq9K9ErmNI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bym0UY/btqFOiIflRy/RvQowR8dvwTkq9K9ErmNI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbym0UY%2FbtqFOiIflRy%2FRvQowR8dvwTkq9K9ErmNI1%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;514&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위의 4개의 jar파일을 WebContent &amp;gt; WEB-INF &amp;gt; lib에 복사 &amp;amp; 붙여 넣어야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) SQL 문서 작성&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;① 데이터베이스와 연결&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(2)-1.png&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;355&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNRHrE/btqF2RhLq0P/d9mPXWoiU5Fl2HKNkNlMIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNRHrE/btqF2RhLq0P/d9mPXWoiU5Fl2HKNkNlMIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNRHrE/btqF2RhLq0P/d9mPXWoiU5Fl2HKNkNlMIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNRHrE%2FbtqF2RhLq0P%2Fd9mPXWoiU5Fl2HKNkNlMIk%2Fimg.png&quot; data-filename=&quot;JSP&amp;amp;Servlet(2)-1.png&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;355&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;② sql 문서 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;- 밑의 속성 설정도 반드시 해야한다(그래야 작성한 sql 문장을 execute할 수 있다).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(1)-3.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;628&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lj6Od/btqF1n2ZjQP/eCOXH7aznKbh9kWdbJg4v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lj6Od/btqF1n2ZjQP/eCOXH7aznKbh9kWdbJg4v1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lj6Od/btqF1n2ZjQP/eCOXH7aznKbh9kWdbJg4v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flj6Od%2FbtqF1n2ZjQP%2FeCOXH7aznKbh9kWdbJg4v1%2Fimg.png&quot; data-filename=&quot;JSP&amp;amp;Servlet(1)-3.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;628&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;번호&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;제목&lt;/td&gt;
&lt;td style=&quot;width: 10.2907%;&quot;&gt;작성일&lt;/td&gt;
&lt;td style=&quot;width: 12.9651%;&quot;&gt;작성자&lt;/td&gt;
&lt;td style=&quot;width: 14.2442%;&quot;&gt;내용&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;비밀번호&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;조회수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;Name&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;num&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;subject&lt;/td&gt;
&lt;td style=&quot;width: 10.2907%;&quot;&gt;date&lt;/td&gt;
&lt;td style=&quot;width: 12.9651%;&quot;&gt;writer&lt;/td&gt;
&lt;td style=&quot;width: 14.2442%;&quot;&gt;content&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;pwd&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;readcount&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;JAVA DATA TYPE&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;int&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;String&lt;/td&gt;
&lt;td style=&quot;width: 10.2907%;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;String&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.9651%;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;String&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2442%;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;String&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;String&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;int&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;DB DATE TYPE&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;number&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;varchar2(50)&lt;/td&gt;
&lt;td style=&quot;width: 10.2907%;&quot;&gt;sysdate&lt;/td&gt;
&lt;td style=&quot;width: 12.9651%;&quot;&gt;varchar2(20)&lt;/td&gt;
&lt;td style=&quot;width: 14.2442%;&quot;&gt;varchar2(2000)&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;varchar2(20)&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;DTO Class&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;b_num&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;b_subject&lt;/td&gt;
&lt;td style=&quot;width: 10.2907%;&quot;&gt;b_date&lt;/td&gt;
&lt;td style=&quot;width: 12.9651%;&quot;&gt;b_writer&lt;/td&gt;
&lt;td style=&quot;width: 14.2442%;&quot;&gt;b_content&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;b_pwd&lt;/td&gt;
&lt;td style=&quot;width: 12.5%;&quot;&gt;b_readcount&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;● board.sql&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1595250858415&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- Eclipse와 DB연동 시 오류 발생할 때 해결 방법
-- D:\Study_Web\workspace\.metadata\.plugins\org.eclipse.datatools.sqltools.result
-- 위의 폴더 안의 파일 모두 삭제

--테이블 생성
create table tblBoard(
	b_num number primary key not null,
	b_subject varchar2(50),
	b_pwd varchar2(20),
	b_content varchar2(2000),
	b_writer varchar2(20),
	b_date varchar2(20),
	b_readcount number
);

-- 전체 레코드 검색
select * from tblBoard order by b_num desc;

--자동 증가값을 설정 : b_num &amp;rarr; b_num seq 변수를 만들어 변수값이 자동으로 올라가게끔 설정
create sequence b_num_seq start with 1;

--임의의 레코드 삽입
insert into tblBoard values(b_num_seq.nextval, 'subject', 'pwd', 'content',
							'writer', sysdate, 0);
							
--전체 레코드 삭제
delete from tblBoard;

--테이블 삭제
drop table tblBoard;
-- 테이블을 삭제 시키더라도 sequence는 아직도 남아있음
-- 테이블을 삭제되거나 데스크톱이 셧다운이 된다면, sequence에 insert를 하게 되면 21부터 시작
-- sequence는 20을 단위로 새로 시작하기 때문

--자동 증가 값 삭제
drop sequence b_num_seq;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) db.properties&amp;nbsp;생성&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;: DB 접속하기 위한 기본 정보(url, user)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1595251017753&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;driver = oracle.jdbc.driver.OracleDriver
url = jdbc:oracle:thin:@127.0.0.1:1521:XE
username = hanul
password = 0000&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;4) BoardDTO.java 생성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1595251136998&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.dto;

import java.io.Serializable;

public class BoardDTO implements Serializable{
	private int b_num;
	private String b_subject;
	private String b_pwd;
	private String b_content;
	private String b_writer;
	private String b_date;
	private int b_readcount;
	
	public BoardDTO() {}
	
	public BoardDTO(int b_num, String b_subject, String b_pwd, 
			String b_content, String b_writer, 
			String b_date, int b_readcount) {
		super();
		this.b_num = b_num;
		this.b_subject = b_subject;
		this.b_pwd = b_pwd;
		this.b_content = b_content;
		this.b_writer = b_writer;
		this.b_date = b_date;
		this.b_readcount = b_readcount;
	}

	public int getB_num() {
		return b_num;
	}

	public void setB_num(int b_num) {
		this.b_num = b_num;
	}

	public String getB_subject() {
		return b_subject;
	}

	public void setB_subject(String b_subject) {
		this.b_subject = b_subject;
	}

	public String getB_pwd() {
		return b_pwd;
	}

	public void setB_pwd(String b_pwd) {
		this.b_pwd = b_pwd;
	}

	public String getB_content() {
		return b_content;
	}

	public void setB_content(String b_content) {
		this.b_content = b_content;
	}

	public String getB_writer() {
		return b_writer;
	}

	public void setB_writer(String b_writer) {
		this.b_writer = b_writer;
	}

	public String getB_date() {
		return b_date;
	}

	public void setB_date(String b_date) {
		this.b_date = b_date;
	}

	public int getReadcount() {
		return b_readcount;
	}

	public void setReadcount(int b_readcount) {
		this.b_readcount = b_readcount;
	}

}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5) SqlMapConfig.xml 생성&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;pre id=&quot;code_1595251257200&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE configuration
 PUBLIC &quot;-//mybatis.org//DTD Config 3.0//EN&quot;
 &quot;http://mybatis.org/dtd/mybatis-3-config.dtd&quot;&amp;gt;
&amp;lt;configuration&amp;gt;
	&amp;lt;properties resource=&quot;com/hanul/mybatis/db.properties&quot;/&amp;gt;
	&amp;lt;typeAliases&amp;gt;
		&amp;lt;typeAlias type=&quot;com.hanul.dto.BoardDTO&quot; alias=&quot;BoardDTO&quot;/&amp;gt;
	&amp;lt;/typeAliases&amp;gt;
	&amp;lt;environments default=&quot;development&quot;&amp;gt;
		&amp;lt;environment id=&quot;development&quot;&amp;gt;
			&amp;lt;transactionManager type=&quot;JDBC&quot; /&amp;gt;
			&amp;lt;dataSource type=&quot;POOLED&quot;&amp;gt;
				&amp;lt;property name=&quot;driver&quot; value=&quot;${driver}&quot; /&amp;gt;
				&amp;lt;property name=&quot;url&quot; value=&quot;${url}&quot; /&amp;gt;
				&amp;lt;property name=&quot;username&quot; value=&quot;${username}&quot; /&amp;gt;
				&amp;lt;property name=&quot;password&quot; value=&quot;${password}&quot; /&amp;gt;
			&amp;lt;/dataSource&amp;gt;
		&amp;lt;/environment&amp;gt;
	&amp;lt;/environments&amp;gt;
	&amp;lt;mappers&amp;gt;
		&amp;lt;mapper resource=&quot;com/hanul/mybatis/boardMapper.xml&quot; /&amp;gt;
	&amp;lt;/mappers&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6) boardMapper.xml 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1595251348560&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
 PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
 &quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;com.hanul.mybatis.boardMapper.xml&quot;&amp;gt;
	&amp;lt;!-- SQL 문장 작성 --&amp;gt;
&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7) BoardDAO.java 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1595251839421&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.dao;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class BoardDAO {
	private static SqlSessionFactory sqlMapper;
	
	static {
		String resource = &quot;com/hanul/mybatis/SqlMapConfig.xml&quot;;
		
		try {
			InputStream inputStream = Resources.getResourceAsStream(resource);
			sqlMapper = new SqlSessionFactoryBuilder().build(inputStream);
		
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(&quot;SqlSessionFactory Exception&quot;);
		}
	}//static
	
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8) BoardFrontController Servlet 파일 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHPSZt/btqFPGuGkqP/n6oQjjhgwmNkt39Q4K0oJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHPSZt/btqFPGuGkqP/n6oQjjhgwmNkt39Q4K0oJ0/img.png&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;543&quot; style=&quot;width: 37.703%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHPSZt/btqFPGuGkqP/n6oQjjhgwmNkt39Q4K0oJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHPSZt%2FbtqFPGuGkqP%2Fn6oQjjhgwmNkt39Q4K0oJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;710&quot; height=&quot;543&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ct4hnV/btqFQaCkuDK/8vDnfhS3vSuBDadCbU2Kc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ct4hnV/btqFQaCkuDK/8vDnfhS3vSuBDadCbU2Kc1/img.png&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;718&quot; style=&quot;width: 29.8388%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ct4hnV/btqFQaCkuDK/8vDnfhS3vSuBDadCbU2Kc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fct4hnV%2FbtqFQaCkuDK%2F8vDnfhS3vSuBDadCbU2Kc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;743&quot; height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GFKPp/btqFQKpAo4T/6fgJkIoRPHOFSFl3UVOTx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GFKPp/btqFQKpAo4T/6fgJkIoRPHOFSFl3UVOTx0/img.png&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;711&quot; style=&quot;width: 30.1326%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GFKPp/btqFQKpAo4T/6fgJkIoRPHOFSFl3UVOTx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGFKPp%2FbtqFQKpAo4T%2F6fgJkIoRPHOFSFl3UVOTx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;743&quot; height=&quot;711&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1595252094414&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(&quot;/BoardFrontController.do&quot;)
public class BoardFrontController extends HttpServlet {

	protected void service(HttpServletRequest request, 
						   HttpServletResponse response) 
					throws ServletException, IOException {
		// ① 클라이언트가 어떤 요청을 했는가 파악한다.
		request.setCharacterEncoding(&quot;utf-8&quot;);
		String uri = request.getRequestURI();			//uri-pattern 값 : /mbb/xxx.do
		String ctx = request.getContextPath();			//Context root 값 : /mbb
		String command = uri.substring(ctx.length());	//실제 요청한 페이지 : /xxx.do

		
		// ② 클라이언트 요청(*.do &amp;rarr; command)과 실제 처리할 비즈니스 로직(Action Class)
		//	 servlet(FrontController.java) &amp;rarr; class(Action.java)
		
		
		
		// ③ 페이지 전환(프리젠테이션 로직 수행) : forward(), sendRedirect
		//	 ActionForward.java가 담당
		
	}//service()
	
}//class
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Frontend/JSP&amp;amp;Servlet</category>
      <author>PSEveloper</author>
      <guid isPermaLink="true">https://mystudyblog-it.tistory.com/166</guid>
      <comments>https://mystudyblog-it.tistory.com/166#entry166comment</comments>
      <pubDate>Sun, 20 Dec 2020 23:17:03 +0900</pubDate>
    </item>
    <item>
      <title>[JSP] STUDY 18 - MyBatis를 이용한 회원 정보 관리 구현</title>
      <link>https://mystudyblog-it.tistory.com/223</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(18) - STUDY 18.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJpZJy/btqQzRtfdtq/p6VKgKBEB98huBCvLR97K1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJpZJy/btqQzRtfdtq/p6VKgKBEB98huBCvLR97K1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJpZJy/btqQzRtfdtq/p6VKgKBEB98huBCvLR97K1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJpZJy%2FbtqQzRtfdtq%2Fp6VKgKBEB98huBCvLR97K1%2Fimg.jpg&quot; data-filename=&quot;JSP&amp;amp;Servlet(18) - STUDY 18.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;● MemberMain.html (회원가입 입력 화면)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608295960201&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
		&amp;lt;title&amp;gt;Member Main&amp;lt;/title&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;div align=&quot;center&quot;&amp;gt;
			&amp;lt;h3&amp;gt;회원가입 입력화면&amp;lt;/h3&amp;gt;
			&amp;lt;form action=&quot;memberInsert.jsp&quot; method=&quot;post&quot;&amp;gt;
				&amp;lt;table border=&quot;1&quot;&amp;gt;
					&amp;lt;tr&amp;gt;
						&amp;lt;th&amp;gt;이름&amp;lt;/th&amp;gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; required=&quot;required&quot; /&amp;gt;&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
					&amp;lt;tr&amp;gt;
						&amp;lt;th&amp;gt;아이디&amp;lt;/th&amp;gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;id&quot; required=&quot;required&quot;&amp;gt;&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
					&amp;lt;tr&amp;gt;
						&amp;lt;th&amp;gt;비밀번호&amp;lt;/th&amp;gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&quot;password&quot; name=&quot;pw&quot; required=&quot;required&quot;&amp;gt;&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
					&amp;lt;tr&amp;gt;
						&amp;lt;th&amp;gt;나이&amp;lt;/th&amp;gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&quot;number&quot; name=&quot;age&quot; required=&quot;required&quot;&amp;gt;&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
					&amp;lt;tr&amp;gt;
						&amp;lt;th&amp;gt;주소&amp;lt;/th&amp;gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;addr&quot; required=&quot;required&quot;&amp;gt;&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
					&amp;lt;tr&amp;gt;
						&amp;lt;th&amp;gt;전화번호&amp;lt;/th&amp;gt;
						&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;tel&quot; required=&quot;required&quot;&amp;gt;&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
					&amp;lt;tr&amp;gt;
						&amp;lt;td colspan=&quot;2&quot; align=&quot;center&quot;&amp;gt;
							&amp;lt;input type=&quot;submit&quot; value=&quot;회원가입&quot; /&amp;gt;
							&amp;lt;input type=&quot;reset&quot; value=&quot;다시작성&quot; /&amp;gt;
							&amp;lt;input type=&quot;button&quot; value=&quot;목록보기&quot; onclick=&quot;location.href='memberList.jsp'&quot; /&amp;gt;
						&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
				&amp;lt;/table&amp;gt;
			&amp;lt;/form&amp;gt;
		&amp;lt;/div&amp;gt;	
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;● memberMapper.xml (SQL문을 작성하는 곳)&lt;span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608296035028&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE mapper
 PUBLIC &quot;-//mybatis.org//DTD Mapper 3.0//EN&quot;
 &quot;http://mybatis.org/dtd/mybatis-3-mapper.dtd&quot;&amp;gt;
&amp;lt;mapper namespace=&quot;com.hanul.mybatis.memberMapper.xml&quot;&amp;gt;
	&amp;lt;!-- SQL 문장 작성 --&amp;gt;
	&amp;lt;!-- 
		&amp;lt;insert | delete | update | select 속성=&quot;값&quot; 속성=&quot;값&quot; ~~&amp;gt;
			- id 속성 : DAO에서 설정한 값   ▶   session.insert(&quot;memberInsert&quot;, dto);
			- parameterType 속성 : 매개변수 타입(클래스 타입, 기본 데이터 타입)
			- 입력 값 표기 : dto.getName() &amp;rarr; #{dto 內  속성명}    ▶    #{name}
			- SQL 문자의 마지막에 세미콜론(;)은 입력하지 않는다.
			- resultType 속성 : select 쿼리를 수행했을 때 결과 타입
		&amp;lt;/insert | delete | update | select&amp;gt;
	 --&amp;gt;
	 &amp;lt;insert id=&quot;memberInsert&quot; parameterType=&quot;MemberDTO&quot;&amp;gt;
	 	insert into Member values(#{name}, #{id}, #{pw}, #{age}, #{addr}, #{tel})
	 &amp;lt;/insert&amp;gt;
	 
	 &amp;lt;select id=&quot;memberSearchAll&quot; resultType=&quot;MemberDTO&quot;&amp;gt;
	 	select * from Member
	 &amp;lt;/select&amp;gt;
	 
	 &amp;lt;delete id=&quot;memberDelete&quot; parameterType=&quot;String&quot;&amp;gt;
	 	delete from Member where id = #{id}
	 &amp;lt;/delete&amp;gt;
	 
	 &amp;lt;select id=&quot;getById&quot; parameterType=&quot;String&quot; resultType=&quot;MemberDTO&quot;&amp;gt;
	 	select * from Member where id = #{id}
	 &amp;lt;/select&amp;gt;
	 
	 &amp;lt;update id=&quot;memberUpdate&quot; parameterType=&quot;MemberDTO&quot;&amp;gt;
	 	update Member 
	 	set name = #{name}, pw = #{pw}, age = #{age}, addr = #{addr}, tel = #{tel}
	 	where id = #{id}
	 &amp;lt;/update&amp;gt;
&amp;lt;/mapper&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;● MemberDAO.java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608296308796&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.hanul.study;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MemberDAO {
	// 기존 JDBC 모델에서는 Connection(DB 연결)을 먼저 만들었지만,
	//myBatis 경우 SqlSessionFactory 객체를 먼저 생성
	private static SqlSessionFactory sqlMapper;
	
	// static(초기화 블럭 : 가장 먼저 실행되는 코드)
	static {
		String resource = &quot;com/hanul/mybatis/SqlMapConfig.xml&quot;;
		
		try {
			InputStream inputStream = Resources.getResourceAsStream(resource);
			sqlMapper = new SqlSessionFactoryBuilder().build(inputStream);
			
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(&quot;SqlSessionFactory Exception&quot;);
		}
	}//static
	
	//회원 가입
	public int memberInsert(MemberDTO dto) {
		SqlSession session = sqlMapper.openSession();
		// &amp;rarr; SqlSessionFactory(sqlMapper)에서 SqlSession session 활성화
		
		int succ = 0;
		
		succ = session.insert(&quot;memberInsert&quot;, dto);		
		// &amp;rarr; SQL insert 쿼리 : memberMapper.xml
		
		session.commit();	//커밋
		session.close(); 	//session 비활성화
		
		return succ;
	}//memberInsert()
	
	// 전체 회원 검색
	public List&amp;lt;MemberDTO&amp;gt; memberSearchAll() {
		 SqlSession session = sqlMapper.openSession();
		 
		 List&amp;lt;MemberDTO&amp;gt; list = null;
		 // List&amp;lt;&amp;gt; &amp;rarr; ArrayList&amp;lt;&amp;gt;를 대신
		 
		 list = session.selectList(&quot;memberSearchAll&quot;);
		 // &amp;rarr; SQL select 쿼리 : memberMapper.xml
		 // selectList &amp;rarr; 검색된 결과가 몇 개가 나올지 모를 때
		 // selectOne &amp;rarr; 검색된 결과가 하나가 나올 떼
		 
		 session.close();
		 
		 return list;
	}//memberSearchAll()
	
	// 회원 정보 삭제
	public int memberDelete(String id) {
		SqlSession session = sqlMapper.openSession();
		int succ = 0;
		succ = session.delete(&quot;memberDelete&quot;, id);
		session.commit();
		session.close();
		
		return succ;
	}//memberDelete()
	
	// ID 검색
	public MemberDTO getById(String id) {
		SqlSession session = sqlMapper.openSession();
		
		MemberDTO dto = null;
		dto = session.selectOne(&quot;getById&quot;, id);
		// &amp;rarr; 검색된 결과가 하나이므로
		// &amp;rarr; SQL select 쿼리 : memberMapper.xml
		session.close();
		
		return dto;
	}//getById()
	
	// 회원 정보 수정하기
	public int memberUpdate(MemberDTO dto) {
		SqlSession session = sqlMapper.openSession();
		int succ = 0;
		succ = session.update(&quot;memberUpdate&quot;, dto);
		session.commit();
		session.close();
		
		return succ;
	}//memberUpdate()
}//class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(19)-1.png&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;486&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZIX2W/btqQIbxdQRe/ctfgkbvv4E5YOkvl1ZHaDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZIX2W/btqQIbxdQRe/ctfgkbvv4E5YOkvl1ZHaDK/img.png&quot; data-alt=&quot;▲ 회원가입 입력 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZIX2W/btqQIbxdQRe/ctfgkbvv4E5YOkvl1ZHaDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZIX2W%2FbtqQIbxdQRe%2Fctfgkbvv4E5YOkvl1ZHaDK%2Fimg.png&quot; data-filename=&quot;JSP&amp;amp;Servlet(19)-1.png&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;486&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 회원가입 입력 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;● memberList.jsp&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608296483739&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@page import=&quot;com.hanul.study.MemberDTO&quot;%&amp;gt;
&amp;lt;%@page import=&quot;java.util.List&quot;%&amp;gt;
&amp;lt;%@page import=&quot;com.hanul.study.MemberDAO&quot;%&amp;gt;
&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot; %&amp;gt;
&amp;lt;%
request.setCharacterEncoding(&quot;utf-8&quot;);
MemberDAO dao = new MemberDAO();
List&amp;lt;MemberDTO&amp;gt; list = dao.memberSearchAll();
pageContext.setAttribute(&quot;list&quot;, list);
%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Member List JSP&amp;lt;/title&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
	function fnDelete(id) {
		//alert(&quot;id : &quot; + id);
		if(confirm(&quot;정말 삭제하시겠습니까?&quot;)) {
			location.href = &quot;memberDelete.jsp?id=&quot; + id;
		}
	}//fnDelete()
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;div align=&quot;center&quot;&amp;gt;
		&amp;lt;h3&amp;gt;[전체 회원 목록 보기]&amp;lt;/h3&amp;gt;
		&amp;lt;table border=&quot;1&quot; style=&quot;width: 80%&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;이름&amp;lt;/th&amp;gt;
				&amp;lt;th&amp;gt;아이디&amp;lt;/th&amp;gt;
				&amp;lt;th&amp;gt;비밀번호&amp;lt;/th&amp;gt;
				&amp;lt;th&amp;gt;나이&amp;lt;/th&amp;gt;
				&amp;lt;th&amp;gt;주소&amp;lt;/th&amp;gt;
				&amp;lt;th&amp;gt;전화번호&amp;lt;/th&amp;gt;
				&amp;lt;th&amp;gt;삭제&amp;lt;/th&amp;gt;
				&amp;lt;th&amp;gt;수정&amp;lt;/th&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;%-- 1. for문을 이용한 출력 (자바코드)
				for(int i = 0; i &amp;lt; list.size(); i++) {
					out.println(&quot;&amp;lt;tr align='center'&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt;&quot; + list.get(i).getName() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt;&quot; + list.get(i).getId() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt;&quot; + list.get(i).getPw() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt;&quot; + list.get(i).getAge() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt;&quot; + list.get(i).getAddr() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt;&quot; + list.get(i).getTel() + &quot;&amp;lt;/td&amp;gt;&quot;);
					out.println(&quot;&amp;lt;/tr&amp;gt;&quot;);
				}
			--%&amp;gt;
			
			&amp;lt;%-- 2. forEach문을 이용한 출력 (자바코드)
				for(MemberDTO dto : list) {
					out.println(&quot;&amp;lt;tr align='center'&amp;gt;&quot;);
					out.println(&quot;&amp;lt;td&amp;gt;&quot; + dto.getName() + &quot;&amp;lt;/td&amp;gt;&quot;);					
					out.println(&quot;&amp;lt;td&amp;gt;&quot; + dto.getId() + &quot;&amp;lt;/td&amp;gt;&quot;);					
					out.println(&quot;&amp;lt;td&amp;gt;&quot; + dto.getPw() + &quot;&amp;lt;/td&amp;gt;&quot;);					
					out.println(&quot;&amp;lt;td&amp;gt;&quot; + dto.getAge() + &quot;&amp;lt;/td&amp;gt;&quot;);					
					out.println(&quot;&amp;lt;td&amp;gt;&quot; + dto.getAddr() + &quot;&amp;lt;/td&amp;gt;&quot;);					
					out.println(&quot;&amp;lt;td&amp;gt;&quot; + dto.getTel() + &quot;&amp;lt;/td&amp;gt;&quot;);					
					out.println(&quot;&amp;lt;/tr&amp;gt;&quot;);
				}
			--%&amp;gt;
			
			&amp;lt;%-- 3. JSTL core와 EL을 이용한 출력 --%&amp;gt;
			&amp;lt;c:forEach var=&quot;i&quot; items=&quot;${list }&quot;&amp;gt;
				&amp;lt;tr align=&quot;center&quot;&amp;gt;
					&amp;lt;td&amp;gt;${i.name }&amp;lt;/td&amp;gt;
					&amp;lt;td&amp;gt;${i.id }&amp;lt;/td&amp;gt;
					&amp;lt;td&amp;gt;${i.pw }&amp;lt;/td&amp;gt;
					&amp;lt;td&amp;gt;${i.age }&amp;lt;/td&amp;gt;
					&amp;lt;td&amp;gt;${i.addr }&amp;lt;/td&amp;gt;
					&amp;lt;td&amp;gt;${i.tel }&amp;lt;/td&amp;gt;
					&amp;lt;td&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;삭제&quot; onclick=&quot;fnDelete('${i.id}');&quot; /&amp;gt;&amp;lt;/td&amp;gt;
					&amp;lt;td&amp;gt;&amp;lt;input type=&quot;button&quot; value=&quot;수정&quot; onclick=&quot;location.href='memberDetail.jsp?id=${i.id }'&quot; /&amp;gt;&amp;lt;/td&amp;gt;
					&amp;lt;!-- 문자 id도 인식하기 위해 EL 표기법을 작은 따옴표('')로 묶어야 한다. --&amp;gt;
				&amp;lt;/tr&amp;gt;			
			&amp;lt;/c:forEach&amp;gt;
			
			&amp;lt;tr align=&quot;center&quot;&amp;gt;
				&amp;lt;td colspan=&quot;8&quot;&amp;gt;
					&amp;lt;input type=&quot;button&quot; value=&quot;회원가입&quot; onclick=&quot;location.href='MemberMain.html'&quot; /&amp;gt;
				&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;	
		&amp;lt;/table&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(19)-5.png&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;327&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rphDM/btqQIbxdVeU/jm9H4xKFmQF4pw2kDwLx5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rphDM/btqQIbxdVeU/jm9H4xKFmQF4pw2kDwLx5K/img.png&quot; data-alt=&quot;▲ 목록보기 버튼 클릭시 나오는 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rphDM/btqQIbxdVeU/jm9H4xKFmQF4pw2kDwLx5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrphDM%2FbtqQIbxdVeU%2Fjm9H4xKFmQF4pw2kDwLx5K%2Fimg.png&quot; data-filename=&quot;JSP&amp;amp;Servlet(19)-5.png&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;327&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 목록보기 버튼 클릭시 나오는 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;●&lt;span&gt;&amp;nbsp;&lt;/span&gt;memberInsert.jsp&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608296591189&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@page import=&quot;com.hanul.study.MemberDAO&quot;%&amp;gt;
&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%
request.setCharacterEncoding(&quot;utf-8&quot;);
%&amp;gt;

&amp;lt;jsp:useBean id=&quot;dto&quot; class=&quot;com.hanul.study.MemberDTO&quot;&amp;gt;
	&amp;lt;jsp:setProperty property=&quot;*&quot; name=&quot;dto&quot;/&amp;gt;
&amp;lt;/jsp:useBean&amp;gt;

&amp;lt;%
MemberDAO dao = new MemberDAO();
int succ = dao.memberInsert(dto);

if(succ &amp;gt; 0) {
	out.println(&quot;&amp;lt;script&amp;gt;alert('회원가입 성공!');&quot;);
	out.println(&quot;location.href='memberList.jsp';&amp;lt;/script&amp;gt;&quot;);
} else {
	out.println(&quot;&amp;lt;script&amp;gt;alert('회원가입 실패!');&quot;);
	out.println(&quot;location.href='memberList.jsp';&amp;lt;/script&amp;gt;&quot;);	
}
%&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WFTOv/btqQCzexQDJ/Jl6FgM2GhCvcLECEoPV1M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WFTOv/btqQCzexQDJ/Jl6FgM2GhCvcLECEoPV1M0/img.png&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(19)-2.png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;330&quot; style=&quot;width: 50.0492%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WFTOv/btqQCzexQDJ/Jl6FgM2GhCvcLECEoPV1M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWFTOv%2FbtqQCzexQDJ%2FJl6FgM2GhCvcLECEoPV1M0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb08Pw/btqQJD7QucN/V8prHmN4YoFEy601QXbbN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb08Pw/btqQJD7QucN/V8prHmN4YoFEy601QXbbN1/img.png&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(19)-3.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;362&quot; style=&quot;width: 48.788%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb08Pw/btqQJD7QucN/V8prHmN4YoFEy601QXbbN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb08Pw%2FbtqQJD7QucN%2FV8prHmN4YoFEy601QXbbN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1018&quot; height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;▲ 회원정보 입력 후 회워가입 버튼 클릭 시 결과 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;●&lt;span&gt;&amp;nbsp;&lt;/span&gt;memberDelete.jsp&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608296724083&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@page import=&quot;com.hanul.study.MemberDAO&quot;%&amp;gt;
&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%
request.setCharacterEncoding(&quot;utf-8&quot;);
String id = request.getParameter(&quot;id&quot;);
MemberDAO dao = new MemberDAO();
int succ = dao.memberDelete(id);

if(succ &amp;gt; 0) {
	out.println(&quot;&amp;lt;script&amp;gt;alert('삭제 성공!');&quot;);
	out.println(&quot;location.href='memberList.jsp';&amp;lt;/script&amp;gt;&quot;);
} else {
	out.println(&quot;&amp;lt;script&amp;gt;alert('삭제 실패!');&quot;);
	out.println(&quot;location.href='memberList.jsp';&amp;lt;/script&amp;gt;&quot;);	
}
%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;memberDelete&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xdxfq/btqQKtYaVcd/4IdEX2u1n9JIXBxIPkkIIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xdxfq/btqQKtYaVcd/4IdEX2u1n9JIXBxIPkkIIk/img.png&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;240&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(19)-4.png&quot; style=&quot;width: 54.3089%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xdxfq/btqQKtYaVcd/4IdEX2u1n9JIXBxIPkkIIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXdxfq%2FbtqQKtYaVcd%2F4IdEX2u1n9JIXBxIPkkIIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;905&quot; height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLXlez/btqQzQ2gYrM/NZoHsebSlkxJ0pEdhdbB50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLXlez/btqQzQ2gYrM/NZoHsebSlkxJ0pEdhdbB50/img.png&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;327&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(19)-5.png&quot; style=&quot;width: 44.5284%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLXlez/btqQzQ2gYrM/NZoHsebSlkxJ0pEdhdbB50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLXlez%2FbtqQzQ2gYrM%2FNZoHsebSlkxJ0pEdhdbB50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1011&quot; height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;▲ 회원정보 삭제 후 결과 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;●&lt;span&gt;&amp;nbsp;&lt;/span&gt;memberDetail.jsp (회원정보 수정 폼 화면)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608296824821&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@page import=&quot;com.hanul.study.MemberDTO&quot;%&amp;gt;
&amp;lt;%@page import=&quot;com.hanul.study.MemberDAO&quot;%&amp;gt;
&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%
request.setCharacterEncoding(&quot;utf-8&quot;);
String id = request.getParameter(&quot;id&quot;);
MemberDAO dao = new MemberDAO();
MemberDTO dto = dao.getById(id);
pageContext.setAttribute(&quot;dto&quot;, dto);
%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;memberDetail&amp;lt;/title&amp;gt;
&amp;lt;style type=&quot;text/css&quot;&amp;gt;
	.in {
		background-color: pink;
	}
&amp;lt;/style&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
	function fnSubmit() {
		if(confirm(&quot;정말 수정하시겠습니까?&quot;)) {
			return true;
		} else {
			return false;
		}
	}//fnSubmit
	
	function fnReset() {
		if (confirm(&quot;정말 초기화하시겠습니까?&quot;)) {
			return true;
		} else {
			return false;
		}
	}//fnReset()

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div align=&quot;center&quot;&amp;gt;
	&amp;lt;h3&amp;gt;[회원 정보 수정]&amp;lt;/h3&amp;gt;
	&amp;lt;form action=&quot;memberUpdate.jsp&quot; method=&quot;post&quot; onsubmit=&quot;return fnSubmit();&quot; onreset=&quot;return fnReset();&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;id&quot; value='${dto.id}'/&amp;gt;
		&amp;lt;table border=&quot;1&quot;&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;이름&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;name&quot; value=&quot;${dto.name}&quot; class=&quot;in&quot; required=&quot;required&quot;/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;아이디&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;${dto.id}&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;비밀번호&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;pw&quot; value=&quot;${dto.pw}&quot; class=&quot;in&quot; required=&quot;required&quot;/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;나이&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;age&quot; value=&quot;${dto.age}&quot; class=&quot;in&quot; required=&quot;required&quot;/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;주소&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;addr&quot; value=&quot;${dto.addr}&quot; class=&quot;in&quot; required=&quot;required&quot;/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr&amp;gt;
				&amp;lt;th&amp;gt;전화번호&amp;lt;/th&amp;gt;
				&amp;lt;td&amp;gt;&amp;lt;input type=&quot;text&quot; name=&quot;tel&quot; value=&quot;${dto.tel}&quot; class=&quot;in&quot; required=&quot;required&quot;/&amp;gt;&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
			&amp;lt;tr align=&quot;center&quot;&amp;gt;
				&amp;lt;td colspan=&quot;2&quot;&amp;gt;
					&amp;lt;input type=&quot;submit&quot; value=&quot;수정하기&quot; /&amp;gt;
					&amp;lt;input type=&quot;reset&quot; value=&quot;초기화하기&quot; /&amp;gt;
					&amp;lt;input type=&quot;button&quot; value=&quot;목록보기&quot; onclick=&quot;location.href='memberList.jsp'&quot; /&amp;gt;
				&amp;lt;/td&amp;gt;
			&amp;lt;/tr&amp;gt;
		&amp;lt;/table&amp;gt;
	&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;●&lt;span&gt;&amp;nbsp;&lt;/span&gt;memberUpdate.jsp (회원정보 수정)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1608296865247&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@page import=&quot;com.hanul.study.MemberDAO&quot;%&amp;gt;
&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%
request.setCharacterEncoding(&quot;utf-8&quot;);
%&amp;gt;

&amp;lt;jsp:useBean id=&quot;dto&quot; class=&quot;com.hanul.study.MemberDTO&quot;&amp;gt;
	&amp;lt;jsp:setProperty property=&quot;*&quot; name=&quot;dto&quot;/&amp;gt;
&amp;lt;/jsp:useBean&amp;gt;

&amp;lt;%
MemberDAO dao = new MemberDAO();
int succ = dao.memberUpdate(dto);
	
if(succ &amp;gt; 0) {
	out.println(&quot;&amp;lt;script&amp;gt;alert('회원 정보 수정 성공!');&quot;);
	out.println(&quot;location.href='memberList.jsp';&amp;lt;/script&amp;gt;&quot;);
} else {
	out.println(&quot;&amp;lt;script&amp;gt;alert('회원정보 수정 실패!');&quot;);
	out.println(&quot;location.href='memberList.jsp';&amp;lt;/script&amp;gt;&quot;);	
}
%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;JSP&amp;amp;amp;Servlet(19)-7.gif&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;491&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uuMxd/btqQCzexYtX/Yo9xIKtkVR8tbH8zwFGkHk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uuMxd/btqQCzexYtX/Yo9xIKtkVR8tbH8zwFGkHk/img.gif&quot; data-alt=&quot;▲ 회원정보 수정 후 결과 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uuMxd/btqQCzexYtX/Yo9xIKtkVR8tbH8zwFGkHk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/uuMxd/btqQCzexYtX/Yo9xIKtkVR8tbH8zwFGkHk/img.gif&quot; data-filename=&quot;JSP&amp;amp;Servlet(19)-7.gif&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;491&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 회원정보 수정 후 결과 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Frontend/JSP&amp;amp;Servlet</category>
      <author>PSEveloper</author>
      <guid isPermaLink="true">https://mystudyblog-it.tistory.com/223</guid>
      <comments>https://mystudyblog-it.tistory.com/223#entry223comment</comments>
      <pubDate>Sun, 20 Dec 2020 23:09:51 +0900</pubDate>
    </item>
  </channel>
</rss>