본문 바로가기

Back-end & Server/Spring Boot with Kotlin

[Spring Boot] JSP(Java Server Pages)

728x90
반응형

 

JSP(Java Server Pages)는 동적인 웹 페이지를 생성하기 위한 서버 사이드 스크립트 언어이다.

 

Java를 기반으로 하며, HTML 안에 Java 코드를 삽입하는 방식으로 웹 페이지를 생성하고, 이렇게 생성된 JSP 파일은 웹 서버에서 Servlet으로 변환되어 실행된다.

JSP 실행 과정

 

동적인 데이터를 웹 페이지에 쉽게 표현할 수 있도록 해주며 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 파일을 찾는다.

 

 

728x90
반응형

'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