jsp

[jsp] JSTL

lee_zo.o 2023. 6. 11. 01:27

JSTL?

  •  jsp 페이지에서 스크립트 요소로 인한 코드의 복잡합을 해결하기 위한 사용자 정의 태그의 표준이다.
  • JSP 스크립트 요소들과 HTML 코드를 혼용하면, 편리하게 개발할 수는 있으나 코드의 복잡성이 증가하는 것이 문제이다. 따라서 JSP의 로직을 담당하는 부분인 it, for, while, 데이터베이스 처리 등과 관련된 코드를 JSTL로 대치하여 코드를 깔끔하게, 가독성 좋게 만든다.
  • JSP내장 객체에 쉽게 접근할 수 있을 뿐 아니라 파라미터, 헤더, 쿠키 등의 복잡한 코드를 사용하지 않고 쉽게 직관적으로 사용가능하다.
  • 객체 간 비교를 equals() 메소드로 처리하는 대신 == 와 같은 간단한 연산자로 구현이 가능하다.

 

JSTL 이 제공하는 태그의 종류

Core태그 변수 선언, 삭제 등 변수와 관련된 작업 및 if문, for문과 같은 제어 기능, URL 처리로 페이지 이동 기능을 제공함
-> 프로그램 언어에 있는 명령어를 태그로 바꾼다.
Formatting태그 문자열이나 컬렉션을 처리하는 함수 태그로 숫자, 날짜, 시간 등을 형식화 하는 기능. 국제화, 다국어 기능 제공
sql 태그 데이터베이스와 상호작용하기 위해 사용하는 태그로, 데이터베이스의 데이터삽입,수정,삭제,조회 기능을 제공함
Functions 태그 문자열을 처리하는 함수를 제공함
String을 어떻게 쪼갤건지??

사용방법?

  • JSTL이 제공하는 태그를 사용하려면, JSP 페이지에 <%@ taglib ... %> 디렉티브 태그를 사용해야 한다.
<%@ taglib prefix="태그 식별 이름" uri ="태그 지원 URL" %>
  • prefix 속성은 uri 속성에 명시된 값 대신 해당 페이지에서 prefix 속성 값으로 명시된 값(접두사)를 사용한다는 의미이다.

 

Core 태그

<c:out> 출력하기
<c:set> 변수 설정
<c:remove> 설정한 변수 제거
<c:choose> 다중 조건문 처리 , 스위치 문
<c:when> <choose>의 서브 태그로 조건문이 참일 때 수행
<c:otherwise> <choose>의 서브 태그로 조건문이 거짓일 때 수행
<c:forEach> 반복문 처리
<c:if> 조건문 처리
<c:import> URL을 사용하여 다른 리소스의 결과를 삽입한다.
웹 브라우저 헤더값을 가져와 변수를 설정하고, 출력한 후,  설정한 변수 삭제하기
<%@ page contentType ="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
<title>JSTL</title>
</head>
<body>
	browser 변수 값 설정
    <c:set var = "browser" value="${header['User-Agent']}" />
    <br>
    <c:out value="${browser}" /> //Mozilla.5.0~~~~~ 츌력
    browser 변수 값 제거 후
    	<c:remove var="browser" />
        <c:out value="${browser}" /> //출력 없음
</body>
</html>
숫자가 짝수 또는 홀수인지 판단하기
<%@ page contentType ="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
<title>JSTL</title>
</head>
<body>
	<%
    	String number = request.getParameter("number");
    %>
    
    <c:set var="number" value="<%=number%>" />
    <c:choose>
    	<c:when test="${number%2==0}">
        	<c:out value="${number}" />은 짝수입니다.
        </c:when>
        <c:when test="${number%2==1}">
        	<c:out value="${number}" />은 홀수입니다.
        </c:when>
        <c:otherwise>
        	숫자가 아닙니다
        </c:otherwise>
    </c:chosse>
    	
</body>
</html>
구구단 출력하기

 

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

<html>
<head>
<title>JSTL</title>
</head>
<body>
	<table>
    	<c:forEach var="i" begin="1" end="9">
        	<tr>
            	<c:forEach var="j" begin="1" end="9">
                	<td width=100>${i}*${j} = ${i*j} </td>
                </c:forEach>
            </tr>
            
        </c:forEach>
    </table>
    	
</body>
</html>

 

SQL 태그

<sql:query> SELECT 사용
<sql:update> INSET, UPDATE, DELETE 사용
<sql:setDateSource> 드라이버 로드하고 커넥션 설정
<sql:param> 쿼리문에 문자열 형식의 파라미터 설정
<sql:query> 태그로 SELECT 실행하기   sql01.jsp
<%@ page contentType ="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

<html>
<head>
<title>JSTL</title>
</head>
<body>
	<sql:setDataSource var = "dataSource" url="jdbc:mysql://localhost:3306/JSPBookDB"
    	driver="com.mysql.jdbc.Driver" user="root" password="1234" />
    
    <sql:query var ="resultSet" dataSources="${dataSource}">
    	select *from member
    </sql:query>
    
    <table>
    	<tr>
        	<c:forEach var="columnName" items="${resultSet.columnNames}">
            	<th><c:out value="${columnName}" /></th>
            </c:forEach>
        </tr>
            <c:forEach var="row" items="${resultSet.rowsByIndex}">
            <tr>
            	<c:forEach var="column" items="${row}" varStatus="i>
                <td>
                	<c:if test="${column != null}">
                    	<c:out value="${column}" />
                    </c:if>
                    <c:if test="${column == null}">
                    	&nbsp;
                    </c:if>
                </td>
            	</c:forEach>
            </tr>
            </c:forEach>
     </table>
            
    	
</body>
</html>
<sql:update> 태그로 INSERT 실행하기

  //post 방식일 때, jsp -> servlet으로 데이터가 넘어오는 경우 servlet에서 한글을 지원받으려면, 아래와 같은 코드를 넣어주어야한다.

        request.setCharacterEncoding("UTF-8");

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

<html>
<head>
<title>JSTL</title>
</head>
<body>
	<%
    	request.setCharacterEncoding("utf-8");
        
        String id= request.getParameter("id");
        String passwd= request.getParameter("passwd");
        String name= request.getParameter("name");
	%>
      
        
        
	<sql:setDataSource var = "dataSource" url="jdbc:mysql://localhost:3306/JSPBookDB"
    	driver="com.mysql.jdbc.Driver" user="root" password="1234" />
    
    <sql:update dataSource="${dataSource}" var="resultSet">
    	INSERT member(id,name,passwd) VALES (?,?,?)
        <sql:param value="<%=id%>" />
        <sql:param value="<%=name%>" />
        <sql:param value="<%=passwd%>" />
    </sql:update>
    <c:import var="url" url="sql01.jsp"/> //sql01.jsp 파일 내용 가져와 -> SELECT해서 테이블보여주는 페이지 내용을 가져와서 url변수에 저장하고
    ${url} //출력해라
            
    	
</body>
</html>
<sql:update> 태그로 UPDATE 실행하기
<%@ page contentType ="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

<html>
<head>
<title>JSTL</title>
</head>
<body>
	<%
    	request.setCharacterEncoding("utf-8");
        
        String id= request.getParameter("id");
        String passwd= request.getParameter("passwd");
        String name= request.getParameter("name");
	%>
      
        
        
	<sql:setDataSource var = "dataSource" url="jdbc:mysql://localhost:3306/JSPBookDB"
    	driver="com.mysql.jdbc.Driver" user="root" password="1234" />
    
    <sql:update dataSource="${dataSource}" var="resultSet">
    	UPDATE member SET name= ? where id=? and passwd=?
        <sql:param value="<%=id%>" />
        <sql:param value="<%=name%>" />
        <sql:param value="<%=passwd%>" />
    </sql:update>
    <c:import var="url" url="sql01.jsp"/> //sql01.jsp 파일 내용 가져와 -> SELECT해서 테이블보여주는 페이지 내용을 가져와서 url변수에 저장하고
    ${url} //출력해라
            
    	
</body>
</html>
<sql:update> 태그로 DELETE 실행하기
<%@ page contentType ="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

<html>
<head>
<title>JSTL</title>
</head>
<body>
	<%
    	request.setCharacterEncoding("utf-8");
        
        String id= request.getParameter("id");
        String passwd= request.getParameter("passwd");
        String name= request.getParameter("name");
	%>
      
        
        
	<sql:setDataSource var = "dataSource" url="jdbc:mysql://localhost:3306/JSPBookDB"
    	driver="com.mysql.jdbc.Driver" user="root" password="1234" />
    
    <sql:update dataSource="${dataSource}" var="resultSet">
    	DELETE FROM member where id=? and passwd=?
        <sql:param value="<%=id%>" />
       
        <sql:param value="<%=passwd%>" />
    </sql:update>
    <c:import var="url" url="sql01.jsp"/> //sql01.jsp 파일 내용 가져와 -> SELECT해서 테이블보여주는 페이지 내용을 가져와서 url변수에 저장하고
    ${url} //출력해라
            
    	
</body>
</html>

Functions 태그

fn:contains() 검색 대상 문자열의 포함 여부를 확인.
fn:containsIngnoreCase() 대.소문자와 관계없이 포함 여부 확인
fn:split() 설정한 구부나졸 문자열을 분리하여 배열 형태로 반환
fn:join() 배열 형태의 문자열을 설정한 구분자로 연결
fn:length() 문자열의 길이 반환
<fn:contains()> , <fn:containsIgnoreCase> 태그로 문자열 검색하기
<%@ page contentType ="text/html; charset=utf-8"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>


<html>
<head>
<title>JSTL</title>
</head>
<body>
	java 문자열 검색
    Hello, Java Server Pages ! => ${fn:contains("Hello,Java Server Pages!", "java")}
    //Hello,Java Server Pages! 에 java가 포함되어있니? false출력
    hello, java server pages ! -> ${fn:containsIgnoreCase("hello,java Server Pages!", "java")}
    //hello,javaServer Pages!에 java 포함되어있니? 대소문자 구분하지말고 ~ true출력
            
    	
</body>
</html>

<fn:split> <fn:join>태그로 문자열 분리하고 연결하기

<%@ page contentType ="text/html; charset=utf-8"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/fcore" %>


<html>
<head>
<title>JSTL</title>
</head>
<body>
	<c:set var="texts" value="${fn:split('Hello, Java Server Pages!', ' ')}"/>
    //공백 단위로 끊어서 texts배열 형태로 반환해라
    <c:forEach var="i" begin="0" end="${fn:length(texts)}
    	<p>text[${i}] = "${fn:join(texts, '-')}" />
        // '-'로 다시 합쳐라
            
    	
</body>
</html>