저번 시간에 변수를 사용해서 url을 통해 화면에 출력했다.
이번엔 변수를 여러개 사용해서 출력해보자
@GetMapping("/hello-name-id")
public String setHelloNameId(Model model,
@RequestParam(defaultValue = "") String name,
@RequestParam(defaultValue = "") String id
) {
model.addAttribute("name", name);
model.addAttribute("id", id);
return "exam03/hello_name_id.jsp";
}
RequestParam를 하나 더 추가했다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container">
<h2>URL 매개변수 2개를 jsp로 전달</h2>
<p>이름 : ${name}</p>
<p>ID : ${id}</p>
</div>
</body>
</html>
여러개의 매개변수를 사용할때는 "&"를 이용해서 적어줘야한다. 이것말고는 큰 차이가 없다.
@GetMapping("/hello-array")
public String setHelloArray (Model model, @RequestParam String name, @RequestParam String id){
List<String> list = new ArrayList<>();
list.add(name);
list.add(id);
model.addAttribute("list", list);
return "/exam03/hello_array.jsp";
}
변수들을 list에 담아서 model로 list를 jsp로 보낼것이다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><%--이 태그를 걸어줘야 jspl표현식(반복문 조건문)을 사용할 수 있다. --%>
<html>
<head>
<title>Title</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container">
<h2>URL 매개변수 2개를 배열을 이용해 출력</h2>
<p>${list}</p><%--타입을 같이 넣어주어야한다.--%>
<table class="table">
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">ID</th>
</tr>
</thead>
<tbody>
<tr>
<c:forEach var="data" items="${list}"> <%--jsp의 향상된 for문으로 배열에서 값을 하나씩 꺼내어 data라는 변수로 넣어준다.--%>
<td>${data}</td> <%--이것을 반복하여 출력한다.--%>
</c:forEach>
</tr>
</tbody>
</table>
</div>
</body>
</html>
jsp에서 반복문과 조건문은 jspl이라고한다. 이것을 사용하려면 import처럼 태그를 하나 걸어줘야한다. 그리고 추가적인 api도 땡겨와야한다.
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' // 추가
implementation 'jakarta.servlet:jakarta.servlet-api' //스프링부트 3.0 이상
implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api' //스프링부트 3.0 이상
implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl' //스프링부트 3.0 이상
이것을 다하면 foreach를 이용하여 반복문을 사용할 수 있다. var에 변수를 정의해주고 items에 변수에 넣을 값을 넣고 출력할 곳에 변수를 넣어주면 반복문이 실행된다.
위에선 열을 반복했지만 행을 반복할려면 tr태그를 foreach문 안으로 집어넣으면 된다.
url로 매개변수를 받아서 조건에 따라 값을 출력해보자.
@GetMapping("/condition")
public String setCondition (Model model, @RequestParam String name, @RequestParam String color, @RequestParam String kind){
model.addAttribute("name",name);
model.addAttribute("color",color);
model.addAttribute("kind",kind);
return "/exam03/condition.jsp";
}
조건문에서는 코드에서는 달라지는 것이 없다.
<%--
Created by IntelliJ IDEA.
User: GGG
Date: 2024-03-12
Time: 오후 2:06
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--TODO: jstl 표현식 사용을 위한 import : 반복문/조건문 등 사용 --%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>Title</title>
<%-- bootstrap css cdn --%>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container">
<h2>매개변수 전달받아 출력 : 조건문</h2>
<%-- name = 삼식이 --%>
<p>${name}</p>
<%-- color=brown --%>
<p>${color}</p>
<%-- kind=dog --%>
<p>${kind}</p>
<%-- TODO: jsp 조건문 #1 : jstl 표현식(taglib 임포트) --%>
<%-- 뷰(vue)의 조건문 : 조건식이 참이면 태그가 화면에 보임 --%>
<%-- jsp의 조건문 : 조건식이 참이면 태그가 화면에 보임 --%>
<%-- 사용법: <c:if test="${변수명 == '값'}"> --%>
<%-- 사용법: <c:if test="${조건식}"> --%>
<c:if test="${name == '삼식이'}">
<p>삼식이가 맞습니다.</p>
</c:if>
<%-- TODO: choose 조건문으로 출력 #2 : else if, else 키워드 있음 --%>
<%-- 사용법 : <c:choose> --%>
<%-- <c:when test="${조건식1}"> --%>
<%-- 태그1 --%>
<%-- </c:when> --%>
<%-- ... --%>
<%-- <c:otherwise> --%>
<%-- 태그2 --%>
<%-- </c:otherwise> --%>
<%-- </c:choose> --%>
<%-- 해석 : 조건식1이 참이면 태그1 이 보이고 모두 거짓이면 태그2가 보임 --%>
<c:choose>
<c:when test="${color == 'brown'}">
<p>갈색입니다.</p>
</c:when>
<c:when test="${color == 'yellow'}">
<p>노란색입니다.</p>
</c:when>
<c:otherwise>
<p>다른색깔입니다.</p>
</c:otherwise>
</c:choose>
</div>
</body>
</html>
jsp에서 조건문을 사용하는데 방법에는 2가지가 있다.
c태그를 걸고 if test문이 참이면 c태그안의 태그들이 실행된다. 이 조건문은 조건이 하나일 경우 사용하는 것이좋다. 즉 else가 나오지 않을 경우
c태그 안에 다 사용하면된다. choose태그를 가장 큰 태그로 보고 그안에 when과 otherwise를 사용하면된다.
다음과 같이 결과가 나온다.
이 어노테이션은 객체를 전달받아서 jsp를 전송하는 어노테이션이다.

클래스는 보통 model패키지에 만들고 mvc의 m에 해당하는 것으로 정보를 저장, 수정, 삭제 등을 한다.
public class Member {
private String id;
private String name;
public Member(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
id와 name 그리고 생성자와 각 변수의 setter, getter을 만들어 주었다. 이것도 코드가 굉장히 많은데 lombok은 이것을 어노테이션으로 만들수 있게 지원해준다. 그래서 코드가 짧아지고 가독성이 증가한다.
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
@AllArgsConstructor
public class Member {
private String id;
private String name;
}
getter, setter어노테이션은 직관적으로 알 수 있고, 생성자를 만들어주는 어노테이션은AllArgsConstructor이다. 위의 코드를 보면 알 수 있듯이 굉장히 줄어든 것을 확인할 수 있다. 뿐만 아니라 toString도 어노테이션으로 가능하다.
@GetMapping("/object-param")
public String getObjectParm(@ModelAttribute Member member){
return "/exam04/object_param.jsp";
}
변수에 Model 대신 ModelAttribute어노테이션을 이용해서 객체를 전달하게된다. RequstParam을 사용하지 않아도 url을 통해 변수 전달이 된다. 단 객체에 해당하는 변수만 가능하다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<%-- bootstrap css cdn --%>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container">
<h2>객체 전달받기</h2>
<p>${member}</p>
<p>${member.id}</p>
<p>${member.name}</p>
</div>
</body>
</html>
addAttribute함수를 이용할때와 같이 ${}를 이용해 member객체를 적어주기만 하면 객체가 전달받아서 사용된다.

지금까지 쿼리스트링 방법을 통해 url에 변수를 입력하여 출력하였다. 이번에는 다른 방법인 패스 베이어블을 알아보자.
@Controller
@RequestMapping("/exam05")
public class PathVariableController { // 쿼리스트링은 ?로 변수를 전달하여 출력했다. 이것은
// 함수 : getPathVariable
// url : /path-variable/{name}
// jsp : exam05/path_variable.jsp
@GetMapping("/path-variable/{name}")
public String getVariable(@PathVariable String name, Model model){
model.addAttribute("name", name);
return "/exam05/path_variable.jsp";
}
}
쿼리스트링과는 다르게 getMapping에 변수가 들어가게 된다. 이 변수는 우리가 함수의 PathVariable에 줄 변수와 같은 변수가 와야한다. 나머지는 지금까지 한 것과 같다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<%-- bootstrap css cdn --%>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container">
<h2>PathVariabl 전달방식</h2>
<p>${name}</p>
</div>
</body>
</html>
jsp에서도 달라지는 것은 없다.
url입력에서의 차이는 ?를 사용하지 않고 "/"뒤에 변수를 바로 적어주면된는 것이다. getMapping에서 중괄호에 변수를 넣어준 이유가 바로 그것이다.