Java/JSP

07.17 JSTL 실습문제 풀이(07.14파일)

amungstudy 2023. 7. 17. 10:38

 

<%@ 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="검색"/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

<!-- 선택되면 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>