웹_프론트_백엔드/JAVA프레임윅기반_풀스택

2020.05.25

shine94 2020. 5. 25. 09:02

1. Expression Language(EL, 표현언어)

 : 표현식 또는 액션 태그를 대신하여 값을 표현하는 언어

 

[주의!] Java도 아니고, JSP도 아니지만 JSP를 보완하는 스크립트 언어!

 

<%= value %> : 표현식(익스프레션) --> ${value} : EL

 

 

2. EL 장점
 : 자바코드로 나타내기 번거로운 값(특히 속성값)의 표현을 단순하게 표현 가능, 
   액션태그, JSTL 등과의 조합에서도 코딩이 간결해진다.

 

 

3. EL의 기본 구문 : ${식}
 : 식 부분에는 EL이 정의한 문법에 따라 값을 표현하는 식이 온다(액션태그 또는 커스텀 태그의 속성값, 표현식), 
   JSP의 스크립트 요소(스크립트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용될 수 있다.

 

 

4. 액션태그로 사용되는 EL은 스크릿트릿의 Java변수값 표현은 안되나, 액션태그 등의 값은 출력 가능하다.

 

 

5. EL의 내장객체

 : 값이 존재하지 않을 경우 null을 출력하지 않고 아무것도 출력하지 않는다

pageContext - JSP의 page 기본 객체와 동일
pageScope - pageContext 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 
requestScope - request 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체  

sessionScope - session 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 
applicationScope - application 기본 객체에 저장된 속성의 <속성, 값> 매핑을 저장한 Map 객체 
param - 요청 파라미터의 <파라미터이름, 값> 매핑을 저장한 Map 객체, 

            타입은 String(request.getParameter(이름)의 결과와 동일)
param Values - 요청 파라미터의 <파라미터이름, 값 배열>매핑을 저장한 Map 객체,

                     타입은 String[] (request.getParameterValues(이름)의 결과와 동일)
header - 요청 정보의 <헤더이름, 값> 매핑을 저장한 Map 객체,

             request.getHeader(이름)의 결과와 동일
headerValues - 요청 정보의 <헤더이름, 값 배열> 매핑을 저장한 Map 객체,

                     request.getHeaders(이름)의 결과와 동일
cookie - <쿠키 이름, Cookie> 매핑을 저장한 Map 객체,

            request.getCookies()로 구한 Cookie 배열로 부터 매핑을 생성
initParam - 초기화 파라미터의<이름, 값> 매핑을 저장한 Map 객체,

                application.getInitParameter(이름)의 결과와 동일

 

 

5. JSP21_EL

** el_1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>EL</title>
</head>
<body>
<h3>Expression Language</h3>
${10}<br>
${99.99}<br>
${"ABC"}<br>
${true}<br>
<hr>
<h3>EL의 연산자</h3>
${1 + 2}<br>
${1 - 2}<br>
${1 * 2}<br>
${1 / 2}<br>
${1 > 2}<br>
${1 < 2}<br>
${(1 < 2) ? 1 : 2}<br>
${(1 > 2) || (1 < 2)}<br>
<hr>

<%
	// 지금 작성한 변수는 자바 변수!
	int num = 10;
%>
<%-- EL은 JAVA 언어가 아니다.
	 JAVA 변수 그대로 표현은 안되나
	  특별히 에러가 아님! 아무것도 출력이 되지 않을뿐! --%>
num: ${num}<br>
num: <%= num %> <%-- 자바변수는 <%= %>로 표현을 해야 출력 가능 --%>
</body>
</html>

 

** el_2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<jsp:useBean id="dto" class="com.lec.beans.WriteDTO" scope="page"/>
<jsp:setProperty name ="dto" property="uid" value="123"/>
<jsp:setProperty name ="dto" property="subject" value="제목입니다."/>
<jsp:setProperty name ="dto" property="name" value="작성자입니다."/>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>EL = ActionTag</title>
</head>
<body>
	uid : <%= dto.getUid() %><br>
	제목 : <%= dto.getSubject() %><br>
	작성자 : <%= dto.getName() %><br>
	<hr>

	uid : <jsp:getProperty name="dto" property="uid"/><br>
	제목 : <jsp:getProperty name="dto" property="subject"/><br>
	작성자 : <jsp:getProperty name="dto" property="name"/><br>
	<hr>
	
	uid : ${dto.uid}<br>
	제목 : ${dto.subject}<br>
	작성자 : ${dto.name}<br>
	댓글 : ${ddd.comment}<br> 
	<hr>
</body>
</html>

 

** el_4

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.lec.beans.WriteDTO" %>  
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>EL request</title>
</head>
<body>
<%
	pageContext.setAttribute("myage", "흥~!");
	request.setAttribute("myage", 30);
	request.setAttribute("mydto", new WriteDTO(100, "제목", "내용", "작성자", 3));
%>
[동일한 name인 경우 우선 순위 : page > request > session > application]<br>
${myage}<br>
${requestScope.myage}<br>
<hr>

${mydto}<br> <%-- toString() 값 --%>
<hr>

<%= ((WriteDTO)request.getAttribute("mydto")).getUid() %><br>
${mydto.uid}<br>

${mydto.subject}<br>
${mydto.content}<br>

</body>
</html>

 

** el_form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>EL 내장객체</title>
</head>
<body>
	<form action="el_ok.jsp" method="get">
		아이디 : <input type="text" name="id"><br>
		비밀번호 : <input type="password" name="pw"><br>
		<input type="checkbox" name="hobby" value="music">음악<br>
		<input type="checkbox" name="hobby" value="sport">운동<br>
		<input type="checkbox" name="hobby" value="game">게임<br>
		<input type="submit" value="login">
	</form>
	
	<% 
		// 내장객체
		application.setAttribute("application_name", "application_value");
		session.setAttribute("session_name", "session_value");
		pageContext.setAttribute("page_name", "page_value");
		request.setAttribute("request_name", "request_value");
	%>

</body>
</html>

 

** el_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>EL 내장객체</title>
</head>
<body>
<%
	String id = request.getParameter("id");
	String pw = request.getParameter("pw");
	String[] hobby = request.getParameterValues("hobby");
%>
아이디 : <%= id %><br>
비밀번호 : <%= pw %><br>
취미 : 
<% for(int i = 0; i < hobby.length; i++) { %>
		<%= hobby[i] %>
<% } %>
<hr>

아이디 : ${param.id}<br>
비밀번호 : ${param.pw}<br>
취미  : ${paramValues.hobby[0]}
	${paramValues.hobby[1]}
	${paramValues.hobby[2]}<br>
<hr>

아이디 : ${param["id"]}<br>
비밀번호 : ${param["pw"]}<br>
취미  : ${paramValues["hobby"][0]}
	${paramValues["hobby"][1]}
	${paramValues["hobby"][2]}<br>
<hr>

applicationScope : ${applicationScope.application_name}<br>
sessionScope : ${sessionScope.session_name}<br>
pageScope : ${pageScope.page_name}<br>
requestScope : ${requestScope.request_name}<br>
<hr>

context 초기화 파라미터<br>
${initParam.con_name}<br>
${initParam.con_id}<br>
${initParam.con_pw}<br>
<hr>

<!-- 프론트 엔드의 /는 도메인 뒤에,
	  백엔드에서의 /는 ContextPath 뒤에 -->
ContextPate<br>
<%= request.getContextPath() %><br>
${pageContext.request.contextPath}<br>

<!-- ContextPate를 직접 기재해도 되나 이런 경우
	 ContextPath명이 변경되면 모두 변경해야한다는 번거로움이 있다.
	  이러한 번거로움을  ${pageContext.request.contextPath}을 이용하면 
	  해소할 수 있다. -->
<a href="/JSP21_EL/el_form.jsp">입력폼</a><br>
<a href="${pageContext.request.contextPath}/el_form.jsp">입력폼</a>

</body>
</html>

 

 

6. JSP 단점

 : HTML 태그 + JSP 태그가 혼재된 형태,
   때문에 가독성이 떨어지고 유지보수 어려움

 

 

7. JSTL(JSP Standard Tag Library)

 : JSP의 단점을 보완하기 위해 개발자가 직접 태그 작성 가능하며 이를 커스텀태그라 한다.

   이러한 커스텀 태그들을 모아 태그 라이브러리의 형태로 배포되고

   이러한 태그 라이브러리 중 가장 많이 사용하는 대표적인 것들을 모아놓은 것이 
   바로 JSTL(JSP Standard Tag Library)이다.(표준화 됨)
   JSTL은 논리적 판단, 반복문 처리, 데이터베이스 등의 처리 가능하며 
   결국 JSTL을 사용하는 궁극적인 목적은 스크립트릿을 대체하기 위함이다.
   JSTL은 Tomcat컨테이너에 기본으로 포함되어 있지 않으므로, 별도의 설치를 한 뒤 사용해야 한다.

 

 

8. JSTL 1.2 다운(서블릿 2.5 이상 다운 가능)

 : search.maven.org/#browse%7C-658715035 검색 > JSTL 클릭

 

> jar 파일로 Download하기

 

> 프로젝트의 lib 폴더( C:\tomcat\apache-tomcat-9.0.35\lib )에 jar 파일 복사

 

 

9. JSTL 라이브러리
 : JSTL에서는 다섯 가지의  태그 라이브러리를 제공( Core, XML Processing, I18N formatting, SQL, Functions )

 

taglib - 주요기능 - URI - Prefix

Core - 변수지원, 흐름제어, URL처리 - java.sun.com/jsp/jstl/core - c

XML Processing - XML코어, 흐름제어, XML변환 - java.sun.com/jsp/jstl/xml - x

I18N formatting - 국제화, 지역, 메세지 형식, 숫자 및 날짜 형식 - java.sun.com/jsp/jstl/fmt - fmt

SQL - 데이터베이스 - java.sun.com/jsp/jstl/sql - sql

Functions - 컬렉션 처리 String 처리 - java.sun.com/jsp/jstl/functions - fn

 

 

10. Core 태그 라이브러리 중 가장 많이 사용하는 태그

set - JSP에서 사용할 변수 설정

remove - 설정한 변수 제거

if - 조건에 따라 내부코드 수행

choose - 다중 조건 처리

forEach - 배열, 컬렉션 처리

 

 

11. JSP22_JSTL

** jstl1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JSTL</title>
</head>
<body>

</body>
</html>

 

** jstl2_core

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ page import="java.util.*" %>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JSTL Core3</title>
</head>

<style>
	table, th, td {
		border: 1px solid black;
		border-collapse: collapse;
	}
</style>

<body>
<h2>if</h2>
	<!-- 스크립트릿만 사용하는 경우 1 -->
	<% if(1 + 2 == 3) { %>
		1 + 2 = 3<br>
	<% } %>
	
	<!-- 스크립트릿만 사용하는 경우 2 -->
	<% 
		if(1 + 2 == 3) {
			out.println("1 + 2 = 3<br>");
		}
	%>
	
	<!-- JSTL 사용 -->
	<c:if test="${1 + 2 == 3}"> <%-- EL 식 사용 --%>
		1 + 2 = 3 : EL식 사용 가능<br>
	</c:if>
	
	<c:if test="true"> <%-- 항상 참 --%>
		true<br>
	</c:if>
	
	<c:if test="<%= 1 + 2 == 3 %>"> <%-- 표현식 사용 --%>
		1 + 2 = 3 : JSP 표현식 가능<br>
	</c:if>
	
	<c:if test="${1 + 2 != 3}">
		1 + 2 != 3<br>
	</c:if>
	
<hr>

<%-- JSTL에서는 c:else는 따로 없다!
	   대신 choose, when을 조합하여 사용 --%>
<h2>choose, when, otherwise</h2>

	<!-- 스크립트릿만 사용하는 경우1 -->
	<%
		switch(10 % 2) {
		case 0:
	%>
		짝수입니다<br>
	<%
			break;
		case 1:
	%>
		홀수입니다<br>
	<%
			break;
		default:
	%>
			이도 저도 아닙니다<br>
	<%
		} // end switch
	%>
	
	<!-- JSTL 사용하는 경우 -->
	<c:choose>
		<c:when test="${10 % 2 == 0}">
			짝수입니다<br>
		</c:when>
		<c:when test="${10 % 2 == 1}">
			홀수입니다<br>
		</c:when>
		<c:otherwise>
			이도 저도 아닙니다<br>
		</c:otherwise>
	</c:choose>
	
<hr>	
<h2>forEach</h2>

	<!-- 스크립트릿만 사용하는 경우 -->
	<%
		for(int i = 0; i <= 30; i += 3) {
	%>
			<span><%= i %></span>
	<%
		}
	%>
	
	<br>
	
	<!-- JSTL을 사용하는 경우 -->
	<c:forEach var="i" begin="0" end="30" step="3">
		<span>${i}</span>
	</c:forEach>

</body>
</html>

 

** jstl3_core

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ page import="java.util.*" %>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JSTL Core3</title>
</head>

<style>
	table, th, td {
		border: 1px solid black;
		border-collapse: collapse;
	}
</style>

<body>
<h2>if</h2>
	<!-- 스크립트릿만 사용하는 경우 1 -->
	<% if(1 + 2 == 3) { %>
		1 + 2 = 3<br>
	<% } %>
	
	<!-- 스크립트릿만 사용하는 경우 2 -->
	<% 
		if(1 + 2 == 3) {
			out.println("1 + 2 = 3<br>");
		}
	%>
	
	<!-- JSTL 사용 -->
	<c:if test="${1 + 2 == 3}"> <%-- EL 식 사용 --%>
		1 + 2 = 3 : EL식 사용 가능<br>
	</c:if>
	
	<c:if test="true"> <%-- 항상 참 --%>
		true<br>
	</c:if>
	
	<c:if test="<%= 1 + 2 == 3 %>"> <%-- 표현식 사용 --%>
		1 + 2 = 3 : JSP 표현식 가능<br>
	</c:if>
	
	<c:if test="${1 + 2 != 3}">
		1 + 2 != 3<br>
	</c:if>
	
<hr>

<%-- JSTL에서는 c:else는 따로 없다!
	   대신 choose, when을 조합하여 사용 --%>
<h2>choose, when, otherwise</h2>

	<!-- 스크립트릿만 사용하는 경우1 -->
	<%
		switch(10 % 2) {
		case 0:
	%>
		짝수입니다<br>
	<%
			break;
		case 1:
	%>
		홀수입니다<br>
	<%
			break;
		default:
	%>
			이도 저도 아닙니다<br>
	<%
		} // end switch
	%>
	
	<!-- JSTL 사용하는 경우 -->
	<c:choose>
		<c:when test="${10 % 2 == 0}">
			짝수입니다<br>
		</c:when>
		<c:when test="${10 % 2 == 1}">
			홀수입니다<br>
		</c:when>
		<c:otherwise>
			이도 저도 아닙니다<br>
		</c:otherwise>
	</c:choose>
	
<hr>	
<h2>forEach</h2>

	<!-- 스크립트릿만 사용하는 경우 -->
	<%
		for(int i = 0; i <= 30; i += 3) {
	%>
			<span><%= i %></span>
	<%
		}
	%>
	
	<br>
	
	<!-- JSTL을 사용하는 경우 -->
	<c:forEach var="i" begin="0" end="30" step="3">
		<span>${i}</span>
	</c:forEach>
	
	<!-- 구구단 3단 
		 3 * 1 = 3
		 3 * 2 = 6
		 ...
		 3 * 9 = 27
	-->
	<ul>
	<c:forEach var="i" begin="1" end="9">
		<li>3 * ${i} = ${3 * i }</li>
	</c:forEach>
	</ul>
	<br>
	
	<c:set var="intArray" value="<%= new int[]{1, 2, 3, 4, 5} %>"/>
	
	<c:forEach var="element" items="${intArray}">
		${element},
	</c:forEach>
	<br>
	
	<!-- intArray 배열 인덱스 2부터 4번째 값 출력 -->
	<c:forEach var="element" items="${intArray}" begin="2" end="4">
		${element},
	</c:forEach>
	<br>
	
	<!-- intArray 배열 인덱스 2 ~ 4번째 loop 정보가 status 변수에 담김 -->
	<c:forEach var="element" items="${intArray}" 
		begin="2" end="4" varStatus="status">
		${element} : 
		** ${status.count} : intArray[${status.index}] = ${element} **<br>
	</c:forEach>
	<br>
	
	<%-- 복수 개의 배열/collection도 다룰 수 있다 --%>
	
	<%
		List<String> myList = new ArrayList<String>();
		myList.add("월");
		myList.add("화");
		myList.add("수");
	%>
	
	<c:set var="arr1" value='<%= new String[] {"SUN", "MON", "TUE"} %>'/>
	<%-- <c:set var="arr2" value='<%= new String[] {"월", "화", "수"} %>'/> --%>
	<c:set var="arr2" value='<%= myList %>'/>
	
	<ul>
	<c:forEach var="element" items="${arr1}" varStatus="status">
		<li>${status.index} : ${element} - ${arr2[status.index]}</li>
	</c:forEach>
	</ul>
	<br>
	
	<%
		HashMap<String, Object> hMap = new HashMap<String, Object>();
		hMap.put("name", "장윤성");
		hMap.put("age", 26);
		hMap.put("today", new Date());  // 오늘날짜
	%>
	
	<c:set var="map1" value="<%= hMap %>"/>
	<table>
		<tr><th>key</th><th>value</th></tr>
		<c:forEach var="item" items="${map1}">
			<tr>
			<td>${item.key}</td>
			<td>${item.value}</td>
			</tr>
		</c:forEach>
	</table>
	
</body>
</html>

 

** jstl4_bean

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="com.lec.beans.*" %>
<%@ page import="java.util.*" %>

<!-- JSTL core 라이브러리 포함 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JSTL & Bean</title>
</head>
<body>
<%
	Person chang = new Person();
	chang.setName("장윤성");
	chang.setAge(27);
%>

<c:set var="dto" value="<%= chang %>"/>
이름: ${dto.name}<br> <%-- 내부적으로 dto.getName() 호출 --%>
나이: ${dto.age}<br>
dto: ${dto}<br>
<hr>

<%-- BL은 bean 객체의 내용을 읽어올 수 있다. --%>
<!-- 기본생성자로 자바 bean이 만들어짐 -->
<jsp:useBean id="p0" class="com.lec.beans.Person">
	<jsp:setProperty name="p0" property="name" value="홍성용"/>
	<jsp:setProperty name="p0" property="age" value="28"/>
</jsp:useBean>

이름: ${p0.name}<br>
나이: ${p0.age }<br>
p0: ${p0}<br>
<hr>

<%-- 빈(bean) 배열인 경우 --%>
<%
	Person p1 = new Person();
	p1.setName("고질라");
	p1.setAge(100);
	Person p2 = new Person();
	p2.setName("킹기도라");
	p2.setAge(200);
	Person p3 = new Person();
	p3.setName("모스라");
	p3.setAge(80);

	Person [] arr = {p1, p2, p3};
%>
<c:set var="dtoArr" value="<%= arr %>"/>
<c:forEach var="p" items="${dtoArr}">
	${p.name}<br>
	${p.age}<br>
	${p}<br>
</c:forEach>
<br>

<%
	ArrayList<Person> list = new ArrayList<Person>();
	list.add(p1);
	list.add(p2);
	list.add(p3);
%>

<c:set var="dtoArr" value="<%= list %>"/>
<c:forEach var="p" items="${dtoArr}">
	${p.name}<br>
	${p.age}<br>
	${p}<br>
</c:forEach>
<hr>

${dtoArr[0].name}<br> <%-- dtoArr은 배열이 아니라 List --%>
${dtoArr[1].name}<br>
${dtoArr[2].name}<br>
${dtoArr[3].name}<br> <%-- Exception 없이 넘어감 --%>

<hr>
<%-- 특정 id의 bean이 있는지 체크 : empty 사용!! --%>
<c:if test="${empty dto}">
	dto는 없습니다<br>
</c:if>

<c:if test="${not empty dto}">
	dto는 있습니다<br>
</c:if>

<br>
<c:if test="${dto == null }">
	dto 는 없습니다<br>
</c:if>

<c:if test="${dto != null }">
	dto 는있습니다<br>
</c:if>

<br>
<c:choose>
	<c:when test="${empty ghost}">
		ghost는 없습니다.<br>
	</c:when>
	<c:when test="${not empty ghost}">
		ghost는 있습니다.<br>
	</c:when>
</c:choose>


<%
	// 값이 비어 있는 레버런스 타입 park 생성
	Person park = null;
%>

<c:set var="v1" value="<%= park %>" /> <%-- null 값 --%>
park: ${v1}<br>

<%-- 없는 것도 empty있고 있지만 null 것도 emty로 판정 --%>
<c:if test="${empty v1}"> <%-- null 값도 empty! --%>
	v1은 empty 입니다<br>
</c:if>

<c:if test="${empty v2}"> <%-- 존재하지 않은 것도 empty! --%>
	v2은 empty 입니다<br>
</c:if>

</body>
</html>

 

 

12. JSTL을 이용하여 기존에 만든 게시판 만들어 보기 

** common > D 클래스

package common;

/*
 * DB 접속 정보, 쿼리문, 테이블명, 컬럼명 등은
 * 별도로 관리하든지
 * XML, 초기화 파라미터 등에서 관리하는 것이 좋다.
 */

public class D {
	public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";  // JDBC 드라이버 클래스
	public static final String URL = "jdbc:oracle:thin:@localhost:1521:XE";  // DB 접속 URL
	public static final String USERID = "scott0316";  // DB 접속 계정 정보
	public static final String USERPW = "tiger0316";
	
	public static final String SQL_WRITE_SELECT = 
			"SELECT * FROM test_write ORDER BY wr_uid DESC"; 

	public static final String SQL_WRITE_INSERT = "INSERT INTO test_write " +
		"(wr_uid, wr_subject, wr_content, wr_name) " +
		"VALUES(test_write_seq.nextval, ?, ?, ?)";

	public static final String SQL_WRITE_INC_VIEWCNT =  // 조회수 증가
			"UPDATE test_write SET wr_viewcnt = wr_viewcnt + 1 WHERE wr_uid = ?";

	public static final String SQL_WRITE_SELECT_BY_UID =  // 글 읽어 오기
			"SELECT * FROM test_write WHERE wr_uid = ?";

	public static final String SQL_WRITE_UPDATE = 
			"UPDATE test_write SET wr_subject = ?, wr_content = ? WHERE wr_uid = ?";

	public static final String SQL_WRITE_DELETE_BY_UID = 
			"DELETE FROM test_write WHERE wr_uid = ?";

}

 

<< DAO, DTO >>
** com.lec.beans > DAO 클래스

package com.lec.beans;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import common.D;

// DAO : Data Access Object
//   DB 에 접속하여 트랜잭션을 수행하는 객체

// 다루는 데이터 소스의 종류에 따라 DAO는 여러개 정의 사용 가능

public class WriteDAO {
	Connection conn = null;
	Statement stmt = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;   // SELECT 결과, executeQuery()
	
	// DAO 객체가 생성될때 Connection 도 생성된다.
	public WriteDAO() {
		
		try {
			Class.forName(D.DRIVER);
			conn = DriverManager.getConnection(D.URL, D.USERID, D.USERPW);
			System.out.println("WriteDAO 생성, 데이터 베이스 연결!");
		} catch(Exception e) {
			e.printStackTrace();
			// throw e;
		}		
		
	} // 생성자

	// DB 자원 반납 메소드,
	public void close() throws SQLException {
		if(rs != null) rs.close();
		if(pstmt != null) pstmt.close();
		if(stmt != null) stmt.close();
		if(conn != null) conn.close();
	} // end close()
	
	// 새글 작성 <-- DTO
	public int insert(WriteDTO dto) throws SQLException {
		String subject = dto.getSubject();
		String content = dto.getContent();
		String name = dto.getName();
		
		int cnt = this.insert(subject, content, name);
		return cnt;
	}
	
	// 새글 작성 <-- 제목, 내용, 작성자 
	public int insert(String subject, String content, String name) throws SQLException {
		int cnt = 0;
		
		try {			
			pstmt = conn.prepareStatement(D.SQL_WRITE_INSERT);
			pstmt.setString(1, subject);
			pstmt.setString(2, content);
			pstmt.setString(3, name);
			
			cnt = pstmt.executeUpdate();
		} finally {
			close();			
		}

		return cnt;
	}
	
	// ResultSet --> DTO 배열로 리턴
	public WriteDTO [] createArray(ResultSet rs) throws SQLException {
		WriteDTO [] arr = null;  // DTO 배열
		
		ArrayList<WriteDTO> list = new ArrayList<WriteDTO>();
		
		while(rs.next()) {
			int uid = rs.getInt("wr_uid");
			String subject = rs.getString("wr_subject");
			String name = rs.getString("wr_name");
			String content = rs.getString("wr_content");
			int viewCnt = rs.getInt("wr_viewcnt");
			Date d = rs.getDate("wr_regdate");
			Time t = rs.getTime("wr_regdate");
			
			String regDate = "";
			if(d != null){
				regDate = new SimpleDateFormat("yyyy-MM-dd").format(d) + " "
						+ new SimpleDateFormat("hh:mm:ss").format(t);
			}
			
			WriteDTO dto = new WriteDTO(uid, subject, content, name, viewCnt);
			dto.setRegDate(regDate);
			list.add(dto);
			
		} // end while
		
		int size = list.size();
		
		if(size == 0) return null;
		
		arr = new WriteDTO[size];
		list.toArray(arr);  // List -> 배열		
		return arr;
	}
	
	// 전체 SELECT
	public WriteDTO [] select() throws SQLException {
		WriteDTO [] arr = null;
		
		try {
			pstmt = conn.prepareStatement(D.SQL_WRITE_SELECT);
			rs = pstmt.executeQuery();
			arr = createArray(rs);
		} finally {
			close();
		}		
		
		return arr;
	} // end select()
	
	// 특정 uid 의 글 내용 읽기, 조회수 증가
	// viewCnt 도 1 증가 해야 하고, 글 읽어와야 한다 --> 트랜잭션 처리
	public WriteDTO [] readByUid(int uid) throws SQLException{
		int cnt = 0;
		WriteDTO [] arr = null;
		
		try {
			// 트랜잭션 처리
			// Auto-commit 비활성화
			conn.setAutoCommit(false);
			
			// 쿼리들 수행
			pstmt = conn.prepareStatement(D.SQL_WRITE_INC_VIEWCNT);
			pstmt.setInt(1, uid);
			cnt = pstmt.executeUpdate();
			
			pstmt.close();
			
			pstmt = conn.prepareStatement(D.SQL_WRITE_SELECT_BY_UID);
			pstmt.setInt(1, uid);
			rs = pstmt.executeQuery();
			
			arr = createArray(rs);
			conn.commit();
			
		} catch(SQLException e) {
			conn.rollback();
			throw e;
		} finally {
			close();
		}
		
		return arr;
	} // end readByUid()
	
	
	// 특정 uid 의 글 만 SELECT (조회수 증가 없슴!)
	public WriteDTO [] selectByUid(int uid) throws SQLException {
		WriteDTO [] arr = null;
		
		try {
			pstmt = conn.prepareStatement(D.SQL_WRITE_SELECT_BY_UID);
			pstmt.setInt(1, uid);
			rs = pstmt.executeQuery();
			arr = createArray(rs);
		} finally {
			close();
		}
		return arr;
	}
	
	
	// 특정 uid 의 글 수정 (제목, 내용)
	public int update(int uid, String subject, String content) throws SQLException {
		int cnt = 0;
		try {
			pstmt = conn.prepareStatement(D.SQL_WRITE_UPDATE);
			pstmt.setString(1, subject);
			pstmt.setString(2, content);
			pstmt.setInt(3, uid);
			
			cnt = pstmt.executeUpdate();
		} finally {
			close();
		}		
		
		return cnt;
	} // end update()
	
	// 특정 uid 글 삭제하기
	public int deleteByUid(int uid) throws SQLException {
		int cnt = 0;
		try {
			pstmt = conn.prepareStatement(D.SQL_WRITE_DELETE_BY_UID);
			pstmt.setInt(1, uid);
			cnt = pstmt.executeUpdate();
		} finally {
			close();
		}		
		return cnt;
	} // end deleteByUid()
	
} // end DAO

 

** com.lec.beans > DTO

package com.lec.beans;

// DTO : Data Transfer Object
//    데이터를 담아 나르기 위한 객체

// 게시글DTO, 회원DTO, ... 필요한 데이터 객체들 만큼 정의
// Bean 객체

public class WriteDTO {
	private int uid;     // wr_uid
	private String subject;   //wr_subject
	private String content;   //wr_content
	private String name;  // wr_name
	private int viewCnt;   // wr_viewcnt
	private String regDate;   // wr_regdate
	
	// 개발시..
	// 다음 3가지 네이밍은 일치시켜주는 것이 좋다 .
	// 클래스 필드명 = DB 필드명  = form 의 name명
	
	// 기본생성자, 매개변수 생성자
	public WriteDTO() {
		super();
		System.out.println("WriteDTO() 객체 생성");
	}
	public WriteDTO(int uid, String subject, String content, String name, int viewCnt) {
		super();
		this.uid = uid;
		this.subject = subject;
		this.content = content;
		this.name = name;
		this.viewCnt = viewCnt;
		System.out.println("WriteDTO(uid, subject, content, name, viewCnt) 객체 생성");
	}
	
	// getter / setter
	public int getUid() {
		System.out.println("getUid() 호출");
		return uid;
	}
	public void setUid(int uid) {
		System.out.println("setUid(" + uid + ") 호출");
		this.uid = uid;
	}
	public String getSubject() {
		System.out.println("getSubject() 호출");
		return subject;
	}
	public void setSubject(String subject) {
		System.out.println("setSubject(" + subject + ") 호출");
		this.subject = subject;
	}
	public String getContent() {
		System.out.println("getContent() 호출");
		return content;
	}
	public void setContent(String content) {
		System.out.println("setContent(" + content + ") 호출");
		this.content = content;
	}
	public String getName() {
		System.out.println("getName() 호출");
		return name;
	}
	public void setName(String name) {
		System.out.println("setName(" + name + ") 호출");
		this.name = name;
	}
	public int getViewCnt() {
		System.out.println("getViewCnt() 호출");
		return viewCnt;
	}
	public void setViewCnt(int viewCnt) {
		System.out.println("setViewCnt(" + viewCnt + ") 호출");
		this.viewCnt = viewCnt;
	}
	public String getRegDate() {
		System.out.println("getRegDate() 호출");
		return regDate;
	}
	public void setRegDate(String regDate) {
		System.out.println("setRegDate(" + regDate + ") 호출");
		this.regDate = regDate;
	}
	
	// 테스트, 개발용으로 toString() 오버라이딩 하면 좋다.
	@Override
	public String toString() {
		return "WriteDTO] " + uid + " : " + subject + " : " 
			+ content + " : " + name + " : " + viewCnt + " : " + regDate;
	}
	
} // end DTO

 

<< Controller >>
** com.controller > WriteController 클래스

package com.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.command.write.*;

@WebServlet("*.do")
public class WriteController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public WriteController() {
        super();
    }

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

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		actionDo(request, response);
	}
	
	protected void actionDo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("actionDo() 호출");
		
		request.setCharacterEncoding("UTF-8");
		
		// 컨트롤러는 다음 두개를 선택해야 한다.
		String viewPage = null;   // 어떠한 뷰? --> 페이지
		Command command = null;   // 어떠한 커맨드? --> 어떠한 로직 수행.
		
		// URL로부터 URI, ContextPath, Command 분리 
		String uri = request.getRequestURI();
		String conPath = request.getContextPath();
		String com = uri.substring(conPath.length());
		
		// 테스트 출력
		System.out.println("uri: " + uri);
		System.out.println("conPath: " + conPath);
		System.out.println("com: " + com);
		
		// 컨트롤러는 커맨드에 따라, 로직을 수행하고
		// 결과를 내보낼 view 를 결정한다
		switch(com) {
		case "/list.do":
			command = new ListCommand();
			command.execute(request, response);
			viewPage = "list.jsp";
			break;
		case "/write.do":
			viewPage = "write.jsp";
			break;
			
		case "/writeOk.do":
			command = new WriteCommand();
			command.execute(request, response);
			viewPage = "writeOk.jsp";
			break;		
			
		case "/view.do":
			command = new ViewCommand();
			command.execute(request, response);
			viewPage = "view.jsp";

			break;			
		case "/update.do":
			command = new SelectCommand();  // '수정' 이지만, 일단 읽어오는것부터 시작이다.
			command.execute(request, response);
			viewPage = "update.jsp";
			break;

		case "/updateOk.do":
			command = new UpdateCommand();
			command.execute(request, response);
			viewPage = "updateOk.jsp";
			break;  // 디버깅 훈련, 이 break를 없애고, 찾아보기

		case "/deleteOk.do":
			command = new DeleteCommand();
			command.execute(request, response);
			viewPage = "deleteOk.jsp";
			break;	
		} // end switch
		
		// request 를 위에서 결정된 view 에 forward 해줌.
		if(viewPage != null) {
			RequestDispatcher dispatcher = request.getRequestDispatcher(viewPage);
			dispatcher.forward(request, response);
		}
		
		
	} // end actionDo()

}

 

<< Command >>

** com.command.write > Command 인터페이스

package com.command.write;

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

public interface Command {
	void execute(HttpServletRequest request, HttpServletResponse response);
}

 

** com.command.write > WriteCommand 클래스

package com.command.write;

import java.sql.SQLException;

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

import com.lec.beans.WriteDAO;
import com.sun.org.apache.xerces.internal.impl.xpath.regex.REUtil;

public class WriteCommand implements Command {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		
		int cnt = 0;
		WriteDAO dao = new WriteDAO();
		
		// 매개변수 받아오기
		String name = request.getParameter("name");
		String subject = request.getParameter("subject");
		String content = request.getParameter("content");
		
		if(name != null && subject != null &&
				name.trim().length() > 0 && subject.trim().length() > 0) {
			
			try {
				cnt = dao.insert(subject, content, name);
			} catch(SQLException e) {
				e.printStackTrace();
			}
			
		} // end if
			
		request.setAttribute("result", cnt);

	} // end execute()

} // end Command

 

** com.command.write > ListCommand 클래스

package com.command.write;

import java.sql.SQLException;

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

import com.lec.beans.WriteDAO;
import com.lec.beans.WriteDTO;

public class ListCommand implements Command {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		
		WriteDAO dao = new WriteDAO();  // DAO 객체 생성
		WriteDTO [] arr = null;  
		
		try {
			// 트랜잭션 수행
			arr = dao.select();
			
			// "list" 란 name 으로 request 에 arr 값 전달
			// 즉 request 에 담아서 컨트롤러에 전달되는 셈.
			request.setAttribute("list", arr);
			
		} catch(SQLException e) {
			// 만약 CP 사용한다면
			// NamingException 도 처리 해야 함.
			
			e.printStackTrace();
		}
	}
}

 

** com.command.write > ViewCommand 클래스

package com.command.write;

import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.lec.beans.*;
public class ViewCommand implements Command {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		WriteDAO dao = new WriteDAO();
		WriteDTO [] arr = null;
		int uid = Integer.parseInt(request.getParameter("uid"));  // 매개변수 검증 필요

		try {
			arr = dao.readByUid(uid);  // 읽기 + 조회수 증가
			request.setAttribute("list", arr);
		} catch (SQLException e) { // 만약 ConnectionPool 을 사용한다면 여기서 NamingException 도 catch 해야 한다  
			e.printStackTrace();
		}

	}

}

 

** com.command.write > UpdateCommand 클래스

package com.command.write;

import java.sql.SQLException;

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

import com.lec.beans.WriteDAO;

public class UpdateCommand implements Command {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		int cnt = 0;

		WriteDAO dao = new WriteDAO();

		//입력한 값을 받아오기
		int uid = Integer.parseInt(request.getParameter("uid"));
		String subject = request.getParameter("subject");
		String content = request.getParameter("content");

		// 유효성 체크  null 이거나, 빈문자열이면 이전화면으로 돌아가기
		if(subject != null && subject.trim().length() > 0){			
			try {			
				cnt = dao.update(uid, subject, content);
			} catch (SQLException e) {
				e.printStackTrace();
			}

		} // end if

		request.setAttribute("result", cnt);

	}

}

 

** com.command.write > SelectCommand 클래스

package com.command.write;
import java.sql.SQLException;

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

import com.lec.beans.WriteDAO;
import com.lec.beans.WriteDTO;
public class SelectCommand implements Command {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		WriteDAO dao = new WriteDAO();
		WriteDTO [] arr = null;
		int uid = Integer.parseInt(request.getParameter("uid"));  // 매개변수 검증 필요

		try {
			arr = dao.selectByUid(uid);  // 읽기 only
			request.setAttribute("list", arr);
		} catch (SQLException e) { // 만약 ConnectionPool 을 사용한다면 여기서 NamingException 도 catch 해야 한다  
			e.printStackTrace();
		}
	}

}

 

** com.command.write > DeleteCommand 클래스

package com.command.write;

import java.sql.SQLException;

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

import com.lec.beans.WriteDAO;


public class DeleteCommand implements Command {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {
		int cnt = 0;

		WriteDAO dao = new WriteDAO();

		//입력한 값을 받아오기
		int uid = Integer.parseInt(request.getParameter("uid"));

		try {			
			cnt = dao.deleteByUid(uid);
		} catch (SQLException e) {
			e.printStackTrace();
		}

		request.setAttribute("result", cnt);
	}

}

 

<< View >>
** write.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>글작성</title>
</head>
<script>
function chkSubmit(){  // 폼 검증
	frm = document.forms["frm"];
	
	var name = frm["name"].value.trim();
	var subject = frm["subject"].value.trim();
	
	if(name == ""){
		alert("작성자 란은 반드시 입력해야 합니다");
		frm["name"].focus();
		return false;
	}
	if(subject == ""){
		alert("제목은 반드시 작성해야 합니다");
		frm["subject"].focus();
		return false;
	}
	return true;
}

</script>
<body>
<h2>글작성</h2>
<%-- 글 내용이 많을수 있기 때문에 POST 방식 사용 --%>
<form name="frm" action="writeOk.do" method="post" onsubmit="return chkSubmit()">
작성자:
<input type="text" name="name"/><br>
제목:
<input type="text" name="subject"/><br>
내용:<br>
<textarea name="content"></textarea>
<br><br>
<input type="submit" value="등록"/>
</form>
<br>
<button type="button" onclick="location.href='list.do'">목록으로</button>

</body>
</html>


** writeOk.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  

<c:choose>
	<c:when test="${result == 0}">
		<script>
			alert("등록 실패!!!!!!");
			history.back();   // 브라우저가 기억하는 직전 페이지(입력중 페이지로)
		</script>
	</c:when>
	<c:otherwise>
		<script>
			alert("등록 성공, 리스트를 출력합니다");
			location.href = "list.do";
		</script>
	</c:otherwise>
</c:choose>


** list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>     
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>   
<%-- JSTL 버전으로 바뀌니, 
	 import의 번잡함도 사라진다. 
	 JAVA 변수 선언도 사라진다 --%>
	 
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>글 목록</title>
<style>
table {width: 100%;}
table, th, td {
	border: 1px solid black;
	border-collapse: collapse;
}
</style>
</head>
<body>

<hr>
<h2>리스트</h2>
<table>
	<tr>
		<th>UID</th>
		<th>제목</th>
		<th>작성자</th>
		<th>조회수</th>
		<th>등록일</th>
	</tr>

	<c:choose>
		<c:when test="${empty list || fn:length(list) == 0}">
		</c:when>
		
		<c:otherwise>	
			<c:forEach var="dto" items="${list}">
				<tr>
					<td>${dto.uid}</td>
					<td><a href="view.do?uid=${dto.uid}">${dto.subject}</a></td>
					<td>${dto.name}</td>
					<td>${dto.viewCnt}</td>
					<td>${dto.regDate}</td>
				</tr>
			</c:forEach>
		</c:otherwise>
		
	</c:choose>

</table>
<br>
<button onclick="location.href='write.do'">신규등록</button>

</body>
</html>


** view.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>     
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>   

<c:choose>
	<c:when test="${empty list || fn:length(list) == 0}">
		<script>
			alert("해당 정보가 삭제되거나 없습니다");
			history.back();
		</script>
	</c:when>
	<c:otherwise>
	
		<!DOCTYPE html>
		<html lang="ko">
		<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<title>읽기 ${list[0].subject}</title> <!-- title에 글제목 넣기 -->
		</head>
		<script>
		function chkDelete(uid){
			// 삭제 여부, 다시 확인 하고 진행하기
			var r = confirm("삭제하시겠습니까?");
			if(r){
				location.href = 'deleteOk.do?uid=' + uid;
			}
		}
		</script>
		<body>
		<h2>읽기 ${list[0].subject}</h2>
		<br>
		UID : ${list[0].uid}<br>
		작성자 : ${list[0].name}<br>
		제목 : ${list[0].subject}<br>
		등록일 : ${list[0].regDate}<br>
		조회수 : ${list[0].viewCnt}<br>
		내용: <br>
		<hr>
		<div>
		${list[0].content}
		</div>
		<hr>
		<br>
		<button onclick="location.href='update.do?uid=${list[0].uid}'">수정하기</button>
		<button onclick="location.href = 'list.do'">목록보기</button>
		<button onclick="chkDelete(${list[0].uid})">삭제하기</button>
		<button onclick="location.href = 'write.do'">신규등록</button>
		
		</body>
		</html>

	</c:otherwise>
</c:choose>


** update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>     
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>   

<c:choose>
	<c:when test="${empty list || fn:length(list) == 0}">
		<script>
			alert("해당 정보가 삭제되거나 없습니다");
			history.back();
		</script>
	</c:when>
	
	<c:otherwise>
		<!DOCTYPE html>
		<html lang="ko">
		<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<title>수정 ${list[0].subject}</title>
		</head>
		<script>
		function chkSubmit(){
			frm = document.forms['frm'];
			var subject = frm['subject'].value.trim();
			
			if(subject == ""){
				alert("제목은 반드시 작성해야 합니다");
				frm['subject'].focus();
				return false;
			}
			return true;
		}
		</script>
		<body>
		<h2>수정</h2>
		<form name="frm" action="updateOk.do" method="post" onsubmit="return chkSubmit()">
		<input type="hidden" name="uid" value="${list[0].uid}"/>
		작성자 : ${list[0].name}<br> <%-- 작성자 이름 변경 불가 --%>
		제목 : 
		<input type="text" name="subject" value="${list[0].subject}"/><br>
		내용: <br>
		<textarea name="content">${list[0].content}</textarea>
		<br>
		<input type="submit" value="수정"/>
		</form>
	</c:otherwise>
</c:choose>

<button onclick="history.back()">이전으로</button>
<button onclick="location.href='list.do'">목록보기</button>

</body>
</html>


** updateOk.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

<c:choose>
	<c:when test="${result == 0}">
		<script>
			alert('수정 실패');
			history.back();
		</script>
	</c:when>
	<c:otherwise>
		<script>
			alert('수정 성공');
			// 내부함수 param을 사용하면 uid 값을 받아 올 수 있음...!!
			location.href = "view.do?uid=${param.uid}";
		</script>
	</c:otherwise>

</c:choose>


** deleteOk.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

<c:choose>

	<c:when test="${result == 0}">
		<script>
			alert('삭제 실패');
			history.back();
		</script>
	</c:when>
	
	<c:otherwise>
		<script>
			alert('삭제 성공');
			location.href = "list.do";  <%-- 삭제후에는 list 로 가자 --%>
		</script>
	</c:otherwise>

</c:choose>

'웹_프론트_백엔드 > JAVA프레임윅기반_풀스택' 카테고리의 다른 글

2020.05.27  (0) 2020.05.27
2020.05.26  (0) 2020.05.26
2020.05.22  (0) 2020.05.22
2020.05.21  (0) 2020.05.21
2020.05.20  (0) 2020.05.20