JSTL 기본 문법 1 (param, getter&is 메서드 접근, if)
공용 index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>EL과 JSTL</title>
</head>
<body>
<div class="container pt-3">
<h4>EL과 JSTL : View 영역에 해당되는 jsp 기술</h4>
jsp 내장객체 <br>
request : <%=request %><br>
session : <%=session %><br>
application (ServletContext) : <%=application %><br>
<%-- request 와 session 에 저장된 정보를 표현 --%>
<br>
<a href="Test01Servlet?id=java">EL Test1</a><br>
<a href="Test02Servlet?nick=브레드&age=50">EL Test2</a><br>
<a href="Test03Servlet">EL Test3</a><br>
<a href="Test04Servlet?nick=아이유&age=22">JSTL if</a><br>
</div>
</body>
</html>
param (${param.~})
Test02 Servlet
@WebServlet("/Test02Servlet")
public class Test02Servlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(request.getParameter("nick"));
System.out.println(request.getParameter("age"));
request.setAttribute("menu", new FoodVO("콩나물국밥", 8000));
request.getRequestDispatcher("step02-el-param.jsp").forward(request, response);
}
}
step02-el-param.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>step02-el-param.jsp</title>
</head>
<body>
<div>
client가 전송한 파라미터를 받아와서 출력 <br><br>
<%-- el 은 parseInt 과정 필요없이 적절하게 정수형변환 --%>
${param.nick} ${param.age+1} <br><br>
<%=request.getParameter("nick") %> <%=request.getParameter("age")+1 %><br><br>
음식명 : ${menu.name} 가격 : ${menu.price}원
</div>
</body>
</html>
1. uri에
<a href="Test02Servlet?nick=브레드&age=50">EL Test2</a><br>
이렇게 되어있으면, nick과 age를 가져와서 사용할 수 있습니다.
${param.nick} , ${param.age +1}과 같이요.
그리고 JSTL로 가져온 값은 parseInt 과정 없이 적절하게 정수로도 변환됩니다.
아래와 같이 jsp 문법으로는 변형이 되지 않지만 JSTL은 변환이 됩니다.
2. 또한 model의 VO에 보면 getter. setter, is가 있지 않습니까?
만약 FoodVO에 getName 함수가 있다면,
${menu.name}을 작성했을 때 Name을 알아보고 메뉴의 이름을 가져오는 것입니다. (다음 예제에서 보여드리겠습니다.)
getter & is 메서드 읽어오기
public class FoodVO {
private String name;
private int price;
public FoodVO(String name, int price) {
super();
this.name = name;
this.price = price;
}
public String getName() {
System.out.println("getName()");
return name;
}
public int getPrice() {
System.out.println("getPrice()");
return price;
}
public String showValue() {
return "test";
}
public boolean isExist() {
return true;
}
}
(setter 메서드는 지워놓을게요 공간을 너무 차지하니까요 ㅎㅎ)
여기서 중요한 메서드는 제목에 나와있듯이 get과 is 메서드를 중심으로 확인하면 됩니다.
getName, getPrice, isExist, showValue에 대한 차이를 보여드리겠습니다.
@WebServlet("/Test03Servlet")
public class Test03Servlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("menu", new FoodVO("콩나물국밥", 8000));
request.getRequestDispatcher("step03-el-model.jsp").forward(request, response);
}
}
servlet 파일은 다음과 같습니다.
FoodVO를 request에 넣어서 보내주는 것입니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>step03-el-model.jsp</title>
</head>
<body>
<div class="container pt-3">
<%-- vo의 getter(get method)에 호출해 결과를 출력 --%>
음식명 ${menu.name} <br>
가격 ${menu.price*2} <br>
<%-- vo의 showValue() 에 접근 : error --%>
<%-- ${menu.value} --%>
<%-- vo의 isExist() 에 접근 --%>
${menu.exist}
<%--
el 은 vo 의 get 과 is 메서드에 접근이 가능함
--%>
</div>
</body>
</html>
이런 식으로 JSTL을 이용하면 is와 get으로 된 메서드들은 값을 알아서 처리해서 값을 가져오게 됩니다.
하지만 showValue라는 함수는 ${menu.showValue()}라고 직접적으로 작성해주지 않으면 값이 나오지 않습니다.
JSTL if
if 문에 대해서는 jsp 파일 div 태그만 사용하겠습니다.
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<body>
<div>
<c:if test="true">
jstl if test1
</c:if>
<c:if test="false">
jstl if test2
</c:if>
<br>
<c:if test="${flag}">
jstl if test3
</c:if>
<br>
<c:if test="${param.nick=='아이유'}">
jstl if test4 ${param.nick}
</c:if>
<br>
<c:if test="${param.nick=='아이유' && param.age>18}">
jstl if test5 ${param.nick} ${param.age}
</c:if>
</div>
jsp 상단에 taglib 선언해야 합니다!
태그 라이브러리의 접두어를 c로 지정하겠다는 것이고 uri로 태그 라이브러리를 가져오는 것입니다.
그다음 if 문은 java if 문과 비슷하여 기억하고 있거나 검색해서 사용하면 금방 잘할 것 같습니다.
parameter를 nick=아이유&age=25로 전달해서 if문이 통과되면 값이 나오게 하는 겁니다.
test=""
안에 조건문을 넣으면 완성이 됩니다. 간단하죠?
소감
확실히 오늘 알아본 것으로 확인해 보는데 jsp 문법으로 작성하면 줄 변경해 가지고 <% %>를 막 나눠 쓰고 밖으로 표현해야 하고 아주 번거로웠는데, JSTL 이 친구 하나로 아주 깔끔한 코드가 완성이 되네요.
대신 단점이라면 자동완성이 없어 오타의 위험이 도사린다는 것 빼고는 다 좋습니다.
불평불만을 할 시간에 더 멋진 내일로 나아가는 사람이 돼야 한다고 생각됩니다. 미래지향적이고 긍정적인 삶을 살아가보아요.