[JSTL] DB 연결, 외부 페이지 로드

2025. 3. 20. 12:22·Web
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="cr" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL 기초 문법5 - 데이터베이스 연결</title>
</head>
<body>

<!-- JSTL DB는 보안 다뚫려서 안씀 -->

<sql:setDataSource var="db" driver="com.mysql.cj.jdbc.Driver" 
url="?" user="?" password="?"/>
<!-- ddl1 -->
<%-- 
<sql:query var="ps" sql="select * from event" dataSource="${db}"></sql:query>
--%>

<!-- 
ddl2 
게시판의 형태가 모두 같고 테이블만 다르다면 아래처럼 사용 (인자값을 이용)
-->
<cr:set vat="tables" value="event"/>
<sql:query var="ps" dataSource="${db}">
select * from ${tables}
</sql:query>

<!-- 
rows : Database의 rows의 전체값 (DB select 결과뜰때 밑에 뜨던거)
fn : 결과값에 옵션 형태로 함수를 적용하여 결과에 대한 사항을 변화 시킴 (태그가 없음) 
	fn:substring() 이런식으로 fn 함수는 $안에 직접 사용 !!
-->
<cr:forEach var="row" items="${ps.rows}">
고객명 : ${row['ename']}, 이메일 : ${row['email']}, 등록일 : ${fn:substring(row['ejoin'],0,10)}<br>
</cr:forEach>

</body>
</html>

[JSTL로 DB 활용]

1. 데이터베이스 연결 설정

JSTL <sql:setDataSource> 태그를 이용해 데이터베이스 연결 정보를 설정

<sql:setDataSource var="db" driver="com.mysql.cj.jdbc.Driver" 
    url="?" user="project" password="?"/>
  • var="db": 데이터베이스 연결 정보를 저장할 변수명
  • driver="?": MySQL 드라이버 지정
  • url="?": 데이터베이스 연결 URL
  • user / password: DB 접속 계정 정보

2. SQL 조회 (테이블명 변수화)

게시판 등 동일한 형태의 테이블을 다룰 때, 테이블명을 변수로 설정하여 코드 중복을 줄일 수 있음

<cr:set var="tables" value="event"/>
<sql:query var="ps" dataSource="${db}">
    select * from ${tables}
</sql:query>
  • <cr:set>: JSTL에서 변수를 설정하는 태그
  • ${tables}: 테이블명을 동적으로 변경할 수 있도록 설정

3. 조회 결과 출력

<sql:query> 태그를 통해 데이터 조회 후, <cr:forEach>를 활용해 결과를 반복 출력

<cr:forEach var="row" items="${ps.rows}">
    고객명: ${row['ename']}, 이메일: ${row['email']}, 등록일: ${fn:substring(row['ejoin'],0,10)}<br>
</cr:forEach>
  • ${ps.rows}: 조회된 전체 데이터 목록
  • ${row['ename']}: ename 컬럼 값 출력
  • ${fn:substring(row['ejoin'], 0, 10)}: ejoin 날짜 값에서 앞 10자리(YYYY-MM-DD)만 출력

실무에서는 JSTL <sql> 태그보다는 JDBC, MyBatis, JPA 등의 기술을 활용하는 것이 일반적
이 방식은 보안 문제로 인해 사용이 권장되지 않으며, 학습 목적으로 참고하는 것이 좋음


[JSTL을 활용한 외부 페이지 로드 및 데이터 처리]

jstl6.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="cr" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%
String subject = "공지사항 3월 이벤트가 진행되었습니다. 많은 관심 부탁드립니다.";;
String data = "냉장고,에어컨,김치냉장고,서랍";

//jsp에서 생성된 값을 top.jsp에 출력할 경우 attribute로 셋팅 후 전달 가능
String mid = "hong";
request.setAttribute("mid", mid);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL 기초 문법5 - 외부 페이지 로드</title>
</head>
<cr:set var="a" value="연습"/>
<body>

<header>
<nav>
<!-- fn (length, substring, indexOf, replace, trim, contains-->
<cr:set var="subject" value="<%=subject %>"/>
<cr:set var="sub" value="${fn:length(subject)}"/>
<cr:if test="${sub > 10 }">
<cr:set var="jum" value="..."/>
</cr:if>
<!-- 10글자 이상이 아니면 jum이 안생겨서 안찍힘 ! -->
게시판 제목 : ${fn:substring(subject,0,10)} ${jum } <br>
<!-- 
import : 외부페이지 로드	
		url(속성) : 외부페이지 경로 및 파일명
해당 페이지에서 set으로 생성한 jstl 변수는 top.jsp로 이관되지 않음 => param 이용
param : 파라미터 이름으로 해당 페이지에 전달하는 방식 (name으로 핸들링) 	
		import 속성 태그 안에만 적용됨 !
-->
<cr:import url="./top.jsp">
<cr:param name="user" value="홍길동"/>
<cr:param name="z" value="${a}"/>
</cr:import>
</nav>
</header>

<main>
<!-- 
fn에 jsp 변수값을 직접 적용하지 못함 
cr:set으로 거쳐서 써야함 ㅠ 
-->
<cr:set var="data" value="<%=data%>"/>
<cr:set var="product" value="${fn:split(data,',') }"/>
<cr:forEach var="pd" items="${product}">
${pd}<br>
</cr:forEach>
<cr:import url="./main.jsp"></cr:import>
</main>

<footer>
<cr:import url="./bottom.jsp"></cr:import>
</footer>

</body>
</html>

top.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<style>
.menu{
width:500px;
height: 30px;
display: flex;
flex-direction: row;
justify-content: center;
align-content: center;
}
.menu>span{
display:block;
border:1px solid black;
width: 100px;
height: inherit;
text-align: center;
line-height: 30px;
}
</style>
<title>상단</title>
<!-- 퍼블리싱이 다 된 상태에서 form태그를 사용할땐 스타일시트를 잘 보면서 form 위치를 정해야함 -->
<form>
<%--
<cr:set id="mid" value="<%=mid %>"/>
 --%>
아이디 : ${mid }, 레벨 : ${level}<br>
고객명 : ${param.user}
<div class="menu">
<span>수강신청</span>
<span>학습지원센터</span>
<span>나의강의실${param.z}</span>
</div>
</form>

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<title>중간 컨텐츠 페이지</title>
<div style="border:1px solid black; width:1000px; height: 800px;">
</div>

bottom.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<title>하단 카피라이터</title>
<div>
회사명 : ${corp }<br>
회사연락처 : ${tel}<br>
대표자 : <br>
개인정보담당자 : <br>
Copyright ⓒ 2025 Develop by Gunayeong AllRight Reserved.
</div>

 

1. 외부 페이지 로드 <cr:import>

JSP에서 다른 페이지를 가져올 때 <cr:import> 태그를 사용할 수 있음

<cr:import url="./top.jsp">
    <cr:param name="user" value="홍길동"/>
    <cr:param name="z" value="연습"/>
</cr:import>
  • url="./top.jsp": top.jsp 파일을 현재 페이지로 불러옴
  • <cr:param>: 불러온 페이지에 파라미터 값을 전달할 때 사용
  • <cr:set>을 통해 생성한 JSTL 변수는 다른 JSP 파일로 전달되지 않음 따라서 값을 넘길 때는 <cr:param>을 활용해야 함

 

2. 문자열 길이 제한 fn:length, fn:substring

JSP에서 특정 문자열이 길 경우, fn 태그를 사용하여 길이를 조절할 수 있음

<cr:set var="subject" value="공지사항 3월 이벤트가 진행되었습니다. 많은 관심 부탁드립니다."/>
<cr:set var="sub" value="${fn:length(subject)}"/>
<cr:if test="${sub > 10}">
    <cr:set var="jum" value="..."/>
</cr:if>
게시판 제목 : ${fn:substring(subject, 0, 10)} ${jum}
  • ${fn:length(subject)}: 문자열의 길이를 반환
  • ${fn:substring(subject, 0, 10)}: 문자열의 처음 10글자만 출력
  • ${jum}: 글자가 10개 이상이면 ...을 추가

 

3. 문자열 분할 fn:split

fn:split을 사용하면 특정 구분자로 문자열을 나눌 수 있음

<cr:set var="data" value="냉장고,에어컨,김치냉장고,서랍"/>
<cr:set var="product" value="${fn:split(data, ',')}"/>
<cr:forEach var="pd" items="${product}">
    ${pd}<br>
</cr:forEach>
  • ${fn:split(data, ',')}: data 문자열을 , 기준으로 나누어 배열로 변환
  • <cr:forEach>: 분할된 데이터를 반복 출력

 

게시판 제목 : ${fn:substring(subject, 0, 10)} ${jum} ${pd}


JSTL의 <cr:import>와 fn 태그를 활용하면 외부 페이지 로드 및 문자열 처리를 간편하게 할 수 있지만

JSP는 유지보수와 보안상의 이유로 최근에는 많이 사용되지 않으며,

실무에서는 Spring MVC + Thymeleaf 또는 React/Vue 등의 프론트엔드 프레임워크와 함께 사용하는 것이 일반적

저작자표시 비영리 변경금지 (새창열림)
'Web' 카테고리의 다른 글
  • [Ajax] 파일로드, setTimeOut
  • [Spring] 미니프로젝트 세팅 - 부동산
  • [JSTL] 반복문 - forEach
  • [JSTL] 조건문 - if문, choose문
9na0
9na0
응애
  • 9na0
    구나딩
    9na0
  • 전체
    오늘
    어제
    • 분류 전체보기 (211)
      • Web (118)
      • Java (28)
      • 데이터베이스 (14)
      • 세팅 (12)
      • 과제 (3)
      • 쪽지시험 (2)
      • 정보처리기사 (4)
      • 서버 (25)
  • 블로그 메뉴

    • 링크

      • 포폴
      • 구깃
    • 공지사항

    • 인기 글

    • 태그

      java_io1~10
      datalist
      noticewriteok
      net1
      file25
      ab1
      spring-boot
      file25_t
      net5~10
      re2
      macbook pro m4
      net3
      exam1_1~10
      Oracle
      net2
      re_java10
      notice_writer
      file24
      net4
      io_dto
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    9na0
    [JSTL] DB 연결, 외부 페이지 로드
    상단으로

    티스토리툴바