Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발자입니다

IT BANK) JSP 20일차 - JSP(회원관리 페이지(SQL)2), EL, JSTL 본문

JSP/IT BANK - JSP

IT BANK) JSP 20일차 - JSP(회원관리 페이지(SQL)2), EL, JSTL

끈기JK 2022. 10. 5. 16:24

221005

 

 

// BoardDAO.java 추가
	public void delete(int num) {
		String sql = "DELETE FROM session_quiz_board WHERE num=?";
		PreparedStatement ps = null;
		
		try {
			ps = con.prepareStatement(sql);
			ps.setInt(1, num);
			ps.executeQuery();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}

 

-검색 기능 코딩

<option> 태그의 selected 속성은 페이지가 로드될 때 옵션 중에서 미리 선택되어지는 옵션을 명시한다.

<form action=""> : 값 비우면 자기 자신의 페이지가 기본이다.

// boardForm.jsp 수정
<%@page import="java.util.ArrayList"%>
<%@page import="session_quiz.BoardDAO"%>
<%@page import="session_quiz.BoardDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>boardForm</title>
</head>
<body>
<%@ include file="/session_quiz/header.jsp" %>
	<%
    		// 검색 코드 추가 부분
		request.setCharacterEncoding("utf-8");
		String select = request.getParameter("select");
		String search = request.getParameter("search");
		
		if(select == null)
			select = "";
		if(search == null)
			search = "";
           	 // 추가 종료
	
		String cp = request.getParameter("currentPage");
		int currentPage = 0;
		
		try{
			currentPage = Integer.parseInt(cp);
		}catch(Exception e){
			currentPage = 1;
		}
		
		if(currentPage < 1)
			currentPage = 1;

		int pageBlock = 3;
		int end = currentPage * pageBlock;
		int begin = end - pageBlock + 1;
        
		BoardDAO boardDao = new BoardDAO();
		
		int totalCount;  // 수정
		ArrayList<BoardDTO> boards;  // 수정
		
        // 검색 코드 추가 및 수정 부분
		if(select == "" || search == ""){
			boards = boardDao.list(begin, end);
			totalCount = boardDao.count();
		}else{
			boards = boardDao.list(begin, end, select, search);
			totalCount = boardDao.count(select, search);
		}
        // 추가 및 수정 종료
		
	 	int totalPage = totalCount / pageBlock;
		boardDao.disconnection();
		
		if(boards.isEmpty() == true){
			out.print("<h1> 등록된 데이터가 존재하지 않습니다. </h1>");
			return;
		}else{
	%>	<form >  // 추가
				<table border=1 align="center">
					<caption><h2>게시글 목록</h2></caption>  // 추가
					<tr>
						<th width="50">No.</th>
						<th width="250">제목</th>
						<th width="150">작성자</th>  // width 수정
						<th width="150">작성일</th>  // width 수정
						<th width="50">조회수</th>
					</tr>
					<%for(BoardDTO board : boards){ %>
					<tr>
						<td><%=board.getNum() %></td>
						<td onclick="location.href='content.jsp?num=<%=board.getNum()%>'"> <%=board.getTitle() %></td>
						<td><%=board.getId() %></td>
						<td><%=board.getWriteTime() %></td>
						<td><%=board.getHit() %></td>
					</tr>
					<%} %>
					<tr>
						<td colspan=2>  // colspan 수정
						<%
				
					if(totalCount % pageBlock > 0) 
						totalPage++;
					
					if(currentPage <= 1){
						out.print("<a href='#'>[이전] </a>");
					}else{
						int tmp = currentPage - 1;
						out.print("<a href='boardForm.jsp?currentPage="+tmp+"&select="+select+"&search="+search+"'>[이전] </a>");  // select, search 추가
					}
			
					for(int i = 1; i <= totalPage; i++){
						if(i == currentPage){
							out.print("<b> " + i + "</b>");
						}else{
							out.print("<a href='boardForm.jsp?currentPage=" + i + "&select="+select+"&search="+search+"'> " + i + " </a>");    // select, search 추가
						}
					}
					
					if(currentPage >= totalPage){
						out.print("<a href='#'> [다음] </a>");
					}else{
						int tmp = currentPage + 1;
						out.print("<a href='boardForm.jsp?currentPage="+tmp+"&select="+select+"&search="+search+"'> [다음] </a>");    // select, search 추가
					}
				%>
						
						</td>
						
                        				// 검색 코드 추가 부분
							<td colspan=2>
								<select name="select">
								<%if(select == null || select == "") {%>
									<option value="">전체</option>
									<option value="title">제목</option>
									<option value="id">작성자</option>
								<%}else if(select.equals("title")) {%>
									<option value="">전체</option>
									<option value="title" selected="selected">제목</option>
									<option value="id">작성자</option>
								<%} else if(select.equals("id")){ %>
									<option value="">전체</option>
									<option value="title" >제목</option>
									<option value="id" selected="selected">작성자</option>
								<%} %>
								</select>
								<input type="text" name="search" value=<%=search %>>
								<input type="submit" value="검색">
							</td>
                           		 		// 추가 종료
						
						<td>
							<input type="button" value="글쓰기" onclick="location.href='boardWrite.jsp'">
						</td>
					</tr>
				</table>
			</form>  // 추가
		<%} %>
<%@ include file="/session_quiz/footer.jsp" %>
</body>
</html>

 

WHERE id like '%te%' : 부분 일치 코드는 = 대신 like 사용한다. %를 앞뒤로 사용하면 모든 문자를 대체한다.

// BoardDAO.java 추가
public ArrayList<BoardDTO> list(int begin, int end, String select, String search){
		String sql;
		if(select.equals("title")) {
			sql = "SELECT B.* FROM "
					+ "(SELECT ROWNUM rn, A.* FROM "
					+ "(SELECT num, id, title, writetime, hit FROM session_quiz_board WHERE title like ? ORDER BY num  DESC)A"
					+ ")B "
					+ "WHERE rn >= ? AND rn <= ?";
		}else {
			sql = "SELECT B.* FROM "
					+ "(SELECT ROWNUM rn, A.* FROM "
					+ "(SELECT num, id, title, writetime, hit FROM session_quiz_board WHERE id like ? ORDER BY num  DESC)A"
					+ ")B "
					+ "WHERE rn >= ? AND rn <= ?";
		}
	
		PreparedStatement ps = null;
		ResultSet rs = null;
		ArrayList<BoardDTO> boards = new ArrayList<>();
		try {
			ps = con.prepareStatement(sql);
			ps.setString(1, "%"+search+"%");
			ps.setInt(2, begin);
			ps.setInt(3, end);
			rs = ps.executeQuery();
			while(rs.next()) {
				BoardDTO board = new BoardDTO();
				board.setNum( rs.getInt("num") );
				board.setId(rs.getString("id") );
				board.setTitle(rs.getString("title"));
				board.setWriteTime(rs.getString("writetime"));
				board.setHit(rs.getInt("hit"));
				boards.add(board);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return boards;
	}
    
	public int count(String select, String search){
		String sql;
		if(select.equals("id")) {
			sql = "SELECT count(*) as cnt FROM session_quiz_board WHERE id like ?";
		}else {
			sql = "SELECT count(*) as cnt FROM session_quiz_board WHERE title like ?";
		}
		PreparedStatement ps = null;
		ResultSet rs = null;
		int cnt = 0;
		try {
			ps = con.prepareStatement(sql);
			ps.setString(1, "%"+search+"%");
			rs = ps.executeQuery();
			if(rs.next()) {
				cnt = rs.getInt(1);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return cnt;
	}

 


 

■ EL(표현 언어(Expression Language))

 

Dynamic Web Project - el_jstl 폴더 생성

 

// ex1.jsp
<body>
	<%="표현식으로 출력" %> <br>
	<% out.print("메서드로 출력"); %> <br>
	${"표현 언어(Expression Language)로 출력" } <br>
</body>

 

null은 빈 문자로 나온다.

// ex2.jsp
	정수형 : ${10 } <br>
	실수형 : ${10.123 } <br>
	문자열형 : ${"홍길동" } <br>
	논리형 : ${true } <br>
	null데이터 : ${null } <br>
	연산 : ${10 + 123 } <br>

 

/는 div, %는 mod로 쓸 수 있다.

// ex3.jsp
	\${5 + 2 } : ${5 + 2 } <br>
	\${5 - 2 } : ${5 - 2 } <br>
	\${5 * 2 } : ${5 * 2 } <br>
	
	\${5 / 2 } : ${5 / 2 } <br>
	\${5 div 2 } : ${5 div 2 } <br>
	
	\${5 % 2 } : ${5 % 2 } <br>
	\${5 mod 2 } : ${5 mod 2 } <br>

 

eq : equal, ne : not equal

lt : less than, gt : greater than

le : less or equal, ge : greater or equal

// ex4.jsp
	\${5 == 2 } : ${5 == 2 } => \${5 eq 5 } : ${5 eq 5 }<br>
	\${5 != 2 } : ${5 != 2 } => \${5 ne 5 } : ${5 ne 5 }<br>
	\${5 < 2 } : ${5 < 2 } => \${5 lt 5 } : ${5 lt 5 }<br>
	\${5 > 2 } : ${5 > 2 } => \${5 gt 5 } : ${5 gt 5 }<br>
	\${5 <= 2 } : ${5 <= 2 } => \${5 le 5 } : ${5 le 5 }<br>
	\${5 >= 2 } : ${5 >= 2 } => \${5 ge 5 } : ${5 ge 5 }<br>

 

// ex5.jsp
\${(5>2) || (5<2) } : ${(5>2) || (5<2) } => \${false or true } : ${false or true } <br>  
\${(5>2) && (5<2) } : ${(5>2) && (5<2) } => \${false and true } : ${false and true } <br>  
\${ !(5>2) } : ${ !(5>2) } => \${ not false }: ${ not false } <br>

 

// ex6_result.jsp
<%
	request.setCharacterEncoding("utf-8");
%>

아이디 : <%=request.getParameter("id") %> <br>
비밀번호 : <%=request.getParameter("pw") %> <br>

아이디 : ${param.id} <br>
비밀번호 : ${param.pw} <br>

 

${data } : pageContext, request, session, application 지정하지 않고 사용하면 좁은 범위부터 data라는 key가 있는지 찾아보고 있으면 value 가져온다.

// ex7_A.jsp
<%
	// ex7_A.jsp
	
	pageContext.setAttribute("data", "pageContext");
	request.setAttribute("data", "request");
	session.setAttribute("data", "session");
	application.setAttribute("data", "application");
%>
범위 지정 없음 : ${data } <br>
pageContext : ${pageScope.data } <br>
request : ${requestScope.data } <br>
session : ${sessionScope.data } <br>
application : ${applicatoinScope.data } <br>

<a href="ex7_b.jsp">이동</a>
<!-- ex7_B.jsp -->
범위 지정 없음 : ${data } <br>
pageContext : ${pageScope.data } <br>
request : ${requestScope.data } <br>
session : ${sessionScope.data } <br>
application : ${applicatoinScope.data } <br>

 


 

■ JSTL

: JSP에서 사용 가능한 표준 라이브러리이다. 가독성을 위해 사용한다. 제어문도 사용 가능하다.

EL은 출력만 가능하다.

 

jstl 폴더 생성

 

라이브러리 2개 파일 해당 폴더에 복사한다.

 

JSTL 사용하기 위해서는 jsp 페이지 내 맨 앞에 다음 코드 삽입한다.

prefix="c" 코드로 <c:> 사용 가능하다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c" %>
// ex1.jsp
	<%="표현식으로 출력" %> <br>
	<% out.print("메서드로 출력"); %> <br>
	${"표현 언어(Expression Language)로 출력" } <br>
	<c:out value="JSTL로 출력" />

 

// ex2.jsp
	<c:set var="data1" value="JSTL TEST" />
	<c:set var="data2">
		value 속성 대신해서 태그 사이에 변수에 입력할 값을 넣을 수 있다.
	</c:set>
	data1 : <c:out value="${data1 }" /> <br>
	data1 : ${data1 } <br>
	data2 : ${data2 } <br>

 

if 조건문

// ex3.jsp
	<%
		String data1 = "자바 변수의 데이터";
	%>
	data1 : <%=data1 %> <br>
	
	<c:set var="data2" value="<%=data1 %>"/>
	data2 : ${data2 } <br>
	
	<%--
		<c:if test="조건식">
			종속문장
		</c:if>
	--%>
    
    	// 아래는 나오지 않는다. 스크립트릿 안의 내용이 먼저 실행된다.
	<c:if test="${'자바 변수의 데이터' == data1 }">
		<h3>두 데이터는 같아요</h3>
	</c:if>
	<c:if test="${'자바 변수의 데이터' == data2 }">
		<h3>두 데이터는 같아요</h3>
	</c:if>

 

forEach로 for문을 대체한다.

// ex4.jsp
	<%
		String data[] = {"김변수", "이상수", "박객체"};
	%>
	
	<c:set var="names" value="<%=data %>" />
	이름 목록 : ${names[0] }, ${names[1] }, ${names[2] } 
	<br>
	
	이름 목록 : 
	<c:forEach var="i" begin="0" end="2" step="1">
		${names[i] },
	</c:forEach>
	<br>
	
	이름 목록 : 
	<c:forEach var="name" items="${names }">
		${name },
	</c:forEach>

 

if ~ else if ~ else, switch ~ case ~ default 와 비슷하다.

// ex5.jsp
	<c:set var="name" value="김상수"/>
	<c:choose>
		<c:when test="${name == '김변수' }">
			<h3>이름은 김변수입니다.</h3>
		</c:when>
		<c:when test="${name == '이상수' }">
			<h3>이름은 이상수입니다.</h3>
		</c:when>	
		<c:otherwise>
			<h3>이름은 홍길동입니다.</h3>
		</c:otherwise>
	</c:choose>

 

// ex6_form.jsp
	<form action="ex6_result.jsp" method="post">
		<input type="text" name="id"  placeholder="아이디"><br>
		<input type="password" name="pw" placeholder="비밀번호"><br>
		<input type="password" name="confirmPw"placeholder="비밀번호 확인"><br>
		<input type="text" name="name"  placeholder="이름"><br>
		<input type="text" name="email" placeholder="이메일"><br>
		<input type="submit" value="회원 가입">
		<input type="reset" value="취소">
	</form>

uri와 prefix가 다르다.

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

<fmt:requestEncoding value="UTF-8"/>

아이디 : ${param.id} <br>
비밀번호 : ${param.pw} <br>
비밀번호 확인 : ${param.confirmPw} <br>
이름 : ${param.name} <br>
이메일 : ${param.email} <br>

 


 

java - jsp - spring 등 하나를 잘하고 나서 다른 걸 하면 따라잡기 쉽다.

php -> jsp 넘어가게 되면 변경된 사항들만 적용하면 금방한다.