JSP(Java Server Pages)는 동적인 웹 페이지를 생성하기 위한 서버 사이드 스크립트 언어이다.
Java를 기반으로 하며, HTML 안에 Java 코드를 삽입하는 방식으로 웹 페이지를 생성하고, 이렇게 생성된 JSP 파일은 웹 서버에서 Servlet으로 변환되어 실행된다.
동적인 데이터를 웹 페이지에 쉽게 표현할 수 있도록 해주며 MVC 디자인 패턴에서 View 부분을 담당하는데 주로 사용된다.
HTML과 같이 태그를 사용하여 작성하지만, <% ... %>와 같은 스크립트 요소를 사용하여 Java 코드를 삽입할 수 있고, JSTL(JSP Standard Tag Library)와 같은 태그 라이브러리를 사용해 로직을 표현할 수도 있다.
JSP의 기본 구조
다음 예시를 살펴보자
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Page Title</title>
</head>
<body>
<%-- This is a comment --%>
<%
// This is a scriptlet
String name = "Spring";
%>
<!-- Expression to print variable -->
Hello, <%= name %>!
<%!
int counter =0;
String name = "Spring"l
public String getName(){
return name;
}
%>
<jsp:include page="header.jsp"/>
Hello, ${user.name}
<c:out value="${message}" />
<c:forEach var="item" items="${list}">
<c:out value="${item}" />
</c:forEach>
</body>
</html>
Directives(지시자)
- <%@ %> 태그로 둘러싸인 부분
- 페이지의 전반적인 설정을 담당
- page 지시자를 통해 페이지의 언어, 콘텐츠 타입, 인코딩 등을 설정
Scriptlets(스크립틀릿)
- <% %> 태그로 둘러싸인 부분
- 임의의 자바 코드를 작성할 수 있음
- 스크립틀릿 내부에서 선언된 변수는 JSP 페이지 내에서 사용될 수 있음
Expressions(표현식)
- <%= %> 태그로 둘러싸인 부분
- 자바 코드의 결과값을 문자열로 변환하여 출력할 수 있음
- 스크립틀릿에서 선언된 변수를 HTML에 출력하는 데 주로 사용
Comments(주석)
- <%-- --%> 태그로 둘러싸인 부분
- 주석을 작성할 수 있음
- 이 주석은 HTML 주석과 달리 클라이언트에게 전송되지 않음
Declarations(선언)
- <%! %>태그로 둘러싸인 부분
- 변수나 메소드를 선언하는 데 사용
Action(액션)
- <jsp:include ~>, <jsp:useBean ~>
- 특정 동작을 수행하는 데 사용하거나 클라이언트에게 다른 페이지로 리다이렉트하는 JSP forward 등의 기능 수행
EL(Expression Language)
- ${} 문법을 사용해서 JSP 스코프(ServletContext, HttpSession, HttpServletRequest, PageContext)에 저장된 객체에 쉽게 접근할 수 있음
- JSP의 간결성과 가독성을 높이는 데 도움을 줌
JSTL(JSP Standard Tag Library)
- 공통적으로 웹 애플리케이션에서 필요로 하는 기능들을 태그 형태로 제공.
- 조건문(if, choose), 반복문(forEach), 변수 지원(set), 국제화 지원 등의 기능을 제공
- JSTL 기초 정리
JSP 사용 예시
build.gradle.kts에 다음과 같은 의존성을 추가한다.
// springframework.boot version 3.2.4 기준
// jsp
implementation("org.apache.tomcat.embed:tomcat-embed-jasper")
implementation("jakarta.servlet:jakarta.servlet-api:6.0.0")
implementation("jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api:3.0.0")
implementation("org.glassfish.web:jakarta.servlet.jsp.jstl:3.0.0")
application.properties에 다음과 같이 설정을 추가한다.
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
그 다음은 JSP 파일을 추가하고 작성한다.
src/main/webapp/WEB-INF/views/index.jsp
<!-- index.jsp -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>Users</title>
</head>
<body>
<h1>Users</h1>
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Email</th>
</tr>
<c:forEach var="user" items="${users}" varStatus="status">
<tr>
<td>${status.count}</td>
<td>${user.name}</td>
<td>${user.email}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
Controller를 수정한다.
package com.springboot.kotlinexample.controller
import org.springframework.web.bind.annotation.GetMapping
// JSP 인식을 못하고 그냥 문자열 index 반환
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.PutMapping
import org.springframework.web.bind.annotation.DeleteMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.PathVariable
// jsp
import org.springframework.ui.Model
import org.springframework.stereotype.Controller
// dto
import com.springboot.kotlinexample.dto.UserDto
// service
import com.springboot.kotlinexample.service.UserService
//@RestController
@Controller
@RequestMapping("/users")
class UserController(private val userService: UserService) {
@GetMapping
fun getAllUsers(model:Model):String{
model.addAttribute("users",userService.findAllUsers())
return "index"
}
@PostMapping
fun addUser(@RequestBody userDto: UserDto): UserDto = userService.addUser(userDto)
@PutMapping("/{id}")
fun updateUser(@PathVariable id: Long, @RequestBody userDto: UserDto): UserDto = userService.updateUser(id, userDto)
@DeleteMapping("/{id}")
fun deleteUser(@PathVariable id: Long) = userService.deleteUser(id)
}
@Controller로 수정해야 return index시 servlet이 자동으로 문자열에 해당하는 이름을 가진 jsp 파일을 찾는다.
'Back-end & Server > Spring Boot with Kotlin' 카테고리의 다른 글
[Spring Boot] Testing (0) | 2024.03.28 |
---|---|
[Spring Boot] Thymeleaf (0) | 2024.03.28 |
[Spring Boot] JPA(Java Persistence API) (0) | 2024.03.27 |
[Spring Boot] DAO, DTO (0) | 2024.03.27 |
[Spring Boot] MVC(Model, View, Controller) (0) | 2024.03.25 |