07.17 JSTL 실습문제 풀이(07.14파일)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="s" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f" %>
<!-- joinCheck.jsp -->
<!-- 회원가입 처리 -->
<!-- POST - 전달된 한글 처리 -->
<f:requestEncoding value="UTF-8"/>
<c:catch>
<jsp:useBean id="joinMember" class="vo.MemberVO"/>
<jsp:setProperty property="*" name="joinMember"/>
</c:catch>
<c:choose>
<c:when test="${!empty e}">
<script>
alert('잘못된 회원정보입니다.');
history.back();
</script>
</c:when>
<c:otherwise>
<!-- 아이디 중복 검사 -->
<!-- dataSource 직접 만들어도 되고 커넥션풀 name 등록해도 됨 -->
<s:query var="rs" dataSource="java/MySqlDB">
SELECT * FROM digital_member WHERE u_id = ?
<s:param>${joinMember.u_id}</s:param>
</s:query>
<c:choose>
<c:when test="${rs.rowCount > 0}">
<!-- 이미 사용중인 u_id -->
<script>
alert('이미 사용중인 아이디입니다.');
history.go(-1);
</script>
</c:when>
<c:otherwise>
<!-- 중복x 인경우 -->
<s:update var="result" dataSource="java/MySqlDB">
INSERT INTO digital_member(u_id,u_pass,u_age,u_gender)
VALUES(?,?,${joinMember.u_age},?);
<s:param>${joinMember.u_id}</s:param>
<s:param>${joinMember.u_pass}</s:param>
<s:param>${joinMember.u_gender}</s:param>
</s:update>
<script>
/* EL 사용시 값이 없을때를 대비해서 ''로 감싸줘야함.(값이 없으면 오류발생하니까) */
let result = '${result}';
alert(result+"행 삽입완료");
location.href="login.jsp";
</script>
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
스크립트로 쿠키생성하면 보안상으로 안좋음.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="s" %>
<!-- loginCheck.jsp -->
<!--
로그인 요청 처리
로그인 성공한 회원의 정보를 member 를 키값으로 저장
-->
<f:requestEncoding value="UTF-8"/>
<jsp:useBean id="member" class="vo.MemberVO" scope="session"/>
<jsp:setProperty property="u_id" name="member"/>
<jsp:setProperty property="u_pass" name="member"/>
<c:catch var="e">
<s:query var="rs" dataSource="java/MySqlDB">
SELECT * FROM digital_member
WHERE u_join = 'Y' AND u_id = ? AND u_pass = ?
<s:param>${member.u_id}</s:param>
<s:param>${member.u_pass}</s:param>
</s:query>
<c:choose>
<c:when test="${rs.rowCount > 0 }">
<!-- 두 가지 표현방식 다 가능 -->
<jsp:setProperty name="member" property="u_num" value="${rs.rows[0].u_num}" />
<jsp:setProperty name="member" property="u_age" value="${rs.rows[0]['u_age']}" />
<jsp:setProperty name="member" property="u_gender" value="${rs.rows[0]['u_gender']}" />
<jsp:setProperty name="member" property="u_regdate" value="${rs.rows[0]['u_regdate']}" />
<!-- login checkBox 체크 시 -->
<c:if test="${!empty param.login}">
<script>
/*
스크립트로 쿠키 생성도 가능하다
document.cookie 호출 시 쿠키정보 출력. maxAge 0 대입하면 쿠키 삭제.
*/
let maxAge = 60*60*24*7;
let memberUid = '${member.u_id}';
document.cookie = "u_id="+memberUid+"; Max-Age="+maxAge+"; path=/;";
</script>
<%-- <%
/* 쿠키 path를 설정하지 않으면 http://localhost:8080/22_member_jstl_answer/member 에서만 사용이 가능하다 */
Cookie cookie = new Cookie("u_id",member.getU_id());
cookie.setPath("/");
cookie.setMaxAge(60*60*24*7);
response.addCookie(cookie);
%> --%>
</c:if>
<script>
alert('${member.u_id} : 로그인 성공');
location.href='<c:url value="/index.jsp"/>';
</script>
</c:when>
<c:otherwise>
<script>
alert('로그인 실패!');
history.go(-1);
</script>
<c:remove var="member" scope="session"/>
</c:otherwise>
</c:choose>
</c:catch>
<c:if test="${!empty e}">
<script>
alert('로그인 실패!');
history.go(-1);
</script>
<c:remove var="member" scope="session"/>
</c:if>
헤더
request : \${request.cookies} == pageContext.getAttribute('request')
request에서 키값으로 찾음 : 없음
<!-- 모든 영역객체를 가지고 있는 pageContext에서 request를 get해서 cookies를 get함 -->
request : ${request.cookies} <br/> <!-- == pageContext.findAttribute("request").getCookies() -->
cookie : ${pageContext.request.cookies} <br/>
<br/> session id : ${pageContext.session.id}
<br/>
<c:set var="cookies" value="${pageContext.request.cookies}"/>
<c:if test="${!empty cookies}">
<c:forEach var="c" items="${cookies}">
<c:if test="${c.name eq 'u_id'}">
${c.name} - ${c.value} <br/>
</c:if>
</c:forEach>
</c:if>
<br/> cookie [] 정보 : ${cookie}
<br/> cookie [] name값이 u_id 정보 : ${cookie.u_id}
<br/> cookie [] name값이 u_id 정보 : ${cookie['u_id']}
<br/> cookie [] name값이 u_id name 정보 : ${cookie.u_id.name}
<br/> cookie [] name값이 u_id value 정보 : ${cookie['u_id']['value']}
<!--
name이 u_id인 cookie 정보가 존재하고 로그인된 회원 정보가 존재하지 않을 때
자동로그인 요청 처리
-->
${!empty cookie.u_id} <br/>
<c:if test="${!empty cookie.u_id and empty sessionScope.member}">
<h1>Cookie 존재</h1>
<s:query var="rs" dataSource="java/MySqlDB">
SELECT * FROM digital_member WHERE u_id = ?
<s:param>${cookie.u_id.value}</s:param>
</s:query>
<c:if test="${rs.rowCount > 0}">
<h1>검색된 사용자 정보 존재</h1>
<jsp:useBean id="member" class="vo.MemberVO" scope="session"/>
<%-- <c:set target="${member}" property="u_num" value="${rs.rows[0]['u_num']}"/> --%>
<%-- ${rs.columnNames} - SELECT 검색된 테이블의 속성 이름을 저장하는 배열 --%>
<c:forEach var="columnName" items="${rs.columnNames}">
<%-- ${columnName} - <br/> --%>
<c:set target="${member}" property="${columnName}" value="${rs.rows[0][columnName]}"/>
</c:forEach>
</c:if>
${member} <Br/>
</c:if>
</div>
관리자가 아니면 요청 처리할 수 없도록 접근 제한
<c:if test="${empty member or member.u_id ne 'admin'}">
<script>
alert('접근 권한이 없는 사용자입니다.');
history.go(-1);
</script>
</c:if>
관리자 권한이 필요한 페이지에서 jsp:include 활용
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 관리자가 아니면 요청 처리할 수 없도록 함 -->
<c:if test="${empty member or member.u_id ne 'admin'}">
<!--
<script>
alert('접근 권한이 없는 사용자입니다.');
history.go(-1);
</script>
-->
<!-- 두번째 방법 -->
<%
response.sendError(403,"접근 권한이 없습니다.");
%>
</c:if>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="s" %>
<jsp:include page="/common/header.jsp" />
<section class="wrap">
<!-- 접근 권한이 존재하는 사용자 인지 확인 -->
<%@ include file="checkAdmin.jsp" %>
<!-- 관리자가 아니면 요청 처리할 수 없도록 함 -->
<c:if test="${empty member or member.u_id ne 'admin'}">
<script>
alert('접근 권한이 없는 사용자입니다.');
history.go(-1);
</script>
</c:if>
<!-- 페이징 처리 -->
<jsp:useBean id="cri" class="util.Criteria"/>
<c:if test="${!empty param.selectPage}">
<c:set target="${cri}" property="page" value="${param.selectPage}"/>
</c:if>
<s:query var="r" dataSource="java/MySqlDB">
SELECT count(*) AS cnt FROM digital_member
WHERE u_id != 'admin'
</s:query>
<jsp:useBean id="pm" class="util.PageMaker" />
<c:set target="${pm}" property="cri" value="${cri}" />
<c:set target="${pm}" property="totalCount" value="${r.rows[0].cnt}"/>
<s:query var="rs" dataSource="java/MySqlDB">
SELECT * FROM digital_member
WHERE u_id != 'admin' AND u_join= 'Y' ORDER BY u_num DESC
limit ${cri.startRow}, ${cri.perPageNum}
</s:query>
<table border=1>
<tr>
<th colspan="4">회원정보</th>
</tr>
<tr>
<th>회원번호</th>
<th>아이디</th>
<th>회원등록일</th>
<th>기타</th>
</tr>
<!-- 등록된 회원 정보가 있을 시 출력 -->
<c:choose>
<c:when test="${rs.rowCount > 0}">
<!-- 오늘 날짜 정보 불러오기 -->
<jsp:useBean id="now" class="java.util.Date"/>
<f:formatDate var="date" pattern="yyyy-MM-dd" value="${now}"/>
<c:forEach var="row" items="${rs.rows}">
<tr>
<td>${row.u_num}</td>
<td>${row['u_id']}</td>
<!--
오늘 등록된 회원이면 시간만
오늘 이전에 등록된 회원은 날짜만
-->
<f:formatDate var="reg" pattern="yyyy-MM-dd" value="${row.u_regdate}"/>
<td>
<c:choose>
<c:when test="${date eq reg}">
<f:formatDate value="${row.u_regdate}" pattern="HH:mm:ss"/>
</c:when>
<c:otherwise>
<!-- 오늘 이전 -->
${reg}
</c:otherwise>
</c:choose>
</td>
<td>
<a href="<c:url value='/management/memberUpdate.jsp'/>?u_num=${row.u_num}">수정</a> |
<a href="<c:url value='/management/memberDelete.jsp'/>?u_num=${row.u_num}">삭제</a>
</td>
</tr>
</c:forEach>
<c:if test="${!empty pm}">
<tr>
<td colspan="4">
<c:if test="${pm.prev}">
<a href="<c:url value='/management/member.jsp'/>?selectPage=${pm.startPage-1}">[이전]</a>
</c:if>
<c:forEach var="i" begin="${pm.startPage}" end="${pm.endPage}">
<a href="<c:url value='/management/member.jsp'/>?selectPage=${i}">[${i}]</a>
</c:forEach>
<c:if test="${pm.next}">
<a href="<c:url value='/management/member.jsp'/>?selectPage=${pm.endPage + 1}">[다음]</a>
</c:if>
</td>
</tr>
</c:if>
</c:when>
<c:otherwise>
<!-- 등록된 회원 정보가 없을 시 출력 -->
<tr>
<td colspan="4">등록된 회원정보가 없습니다.</td>
</tr>
</c:otherwise>
</c:choose>
</table>
</section>
<jsp:include page="/common/footer.jsp" />
<!-- 요청한 페이지 정보와 한페이지에 보여줄 게시물 개수를 연산하여 게시물 목록 검색 -->
limit(MYSQL에만 존재하는 기능임!)과 동일한 기능 수행
<s:query var="rs" dataSource="java/MySqlDB" startRow="${pm.cri.startRow}" maxRow="${pm.cri.perPageNum}">
SELECT * FROM notice_board
ORDER BY notice_num DESC
</s:query>
공지사항 페이징 처리
<!-- 페이징 처리 -->
<jsp:useBean id="pm" class="util.PageMaker" />
<!-- parameter로 전달된 사용자 요청 페이지 name:page -->
<c:if test="${!empty param.page}">
<c:set target="${pm.cri}" property="page" value="${param.page}"/>
</c:if>
<!-- 한 페이지에 보여줄 게시물 수 name:perPageNum -->
<c:if test="${!empty param.perPageNum}">
<c:set target="${pm.cri}" property="perPageNum" value="${param.perPageNum}"/>
</c:if>
<!-- 요청한 페이지 정보와 한페이지에 보여줄 게시물 개수를 연산하여 게시물 목록 검색 -->
<s:query var="rs" dataSource="java/MySqlDB" startRow="${pm.cri.startRow}"
maxRows="${pm.cri.perPageNum}">
SELECT * FROM notice_board
ORDER BY notice_num DESC
</s:query>
<c:if test="${rs.rowCount > 0}">
<jsp:useBean id="noticeList"
class="java.util.ArrayList"
type="java.util.List<vo.NoticeVO>" />
<c:forEach var="notice" items="${rs.rows}">
<jsp:useBean id="vo" class="vo.NoticeVO" />
<!-- 값채우기 -->
<c:forEach var="c" items="${rs.columnNames}">
<c:set target="${vo}" property="${c}" value="${notice[c]}"/>
</c:forEach>
<c:set var="temp" value="${noticeList.add(vo)}"/>
<c:remove var="vo"/><!-- useBean으로 새로운 객체 생성하도록 삭제해줌 -->
</c:forEach>
</c:if>
useBean으로 반복문 돌려서 리스트에 값넣기
<c:forEach var="notice" item="${rs.rows}">
<jsp:useBean id="vo" class="vo.NoticeVO" />
<c:set var="temp" value="${noticeList.add(vo)}"/>
<c:remove var="vo"/><!-- useBean으로 새로운 객체 생성하도록 삭제해줌 -->
</c:forEach>
!!!!!!! css 수정 후 브라우저 새로고침시 ctrl + F5 !!!!!!!
form태그에 name 지정하면 이름값으로 바로 접근 가능
onchange : 선택값 바뀌면 동작.
<!-- form태그에 name 지정하면 이름값으로 바로 접근 가능 -->
<form name="searchName" action="notice_list.jsp" method="get">
<select name="searchType">
<option value="title">제목</option>
<option value="content">내용</option>
</select>
<input type="text" autofocus name="searchValue" />
<input type="submit" value="검색"/>
<!-- 선택되면 form태그 제출 -->
<select name="perPageNum" onchange="searchName.submit();">
<c:forEach var="i" begin="10" end="25" step="5">
<option value="${i}">${i}개씩 보기</option>
</c:forEach>
</select>
</form>