본문으로 바로가기

스프링부트에서 JSP 사용하기

category 개발 2021. 11. 9. 00:30

스프링부트에서는 템플릿 엔진으로 JSP 사용을 권장하지 않는다. 스프링부트 MVC와 JSP에 익숙한 개발자는 다른 템플릿 엔진을 배우기 위해서는 익숙한 JSP를 포기해야 한다. 하지만 JSP 사용이 가능한 방법이 있어 메모 남긴다.

 

설정 - build.gradle

implementation 'javax.servlet:jstl'
implementation "org.apache.tomcat.embed:tomcat-embed-jasper"

그래들 설정을 변경하면 프로젝트에서 "Refresh Gradle Project"를 해준다.

 

설정 - application.properties

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

 

JSP view 폴더 생성

src/main/webapp 아래 spring.mvc.view.prefix에 설정한 경로에 파일이 위치하면 된다.

컨트롤러 작성

package com.suinautant.LearnAjaxSpringBootJSP.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import com.suinautant.LearnAjaxSpringBootJSP.object.Hobby;

@Controller
public class HobbyController {
	
	@GetMapping("/hobby")
	public String hobby(Model model) {
		Hobby hobby1 = new Hobby(1, "lee", "book");
		Hobby hobby2 = new Hobby(2, "choi", "music");
		Hobby hobby3 = new Hobby(3, "kim", "sports");
		List<Hobby> hobbys = new ArrayList<Hobby>();
		hobbys.add(hobby1);
		hobbys.add(hobby2);
		hobbys.add(hobby3);
		model.addAttribute("hobbys", hobbys);
		return "hobby";
	}

}

Hobby 클래스

package com.suinautant.LearnAjaxSpringBootJSP.object;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class Hobby {
	
	private Integer idx;
	
	private String name;
	
	private String hobby;

	public Hobby(Integer idx, String name, String hobby) {
		this.idx = idx;
		this.name = name;
		this.hobby = hobby;
	}

}

 

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 lang="ko">
<head>
<meta charset="UTF-8">
<title>스프링 부트 / JSP</title>
</head>
<body>
	<h2>스프링부트 model 값 JSP 받기</h2>
	<div>
		<table border="1">
			<tr>
				<th>번호</th>
				<th>이름</th>
				<th>취미</th>
				<th>객체</th>
			</tr>

			<c:forEach items="${hobbys}" var="hobby">
				<tr>
					<th>${hobby.getIdx()}</th>
					<th>${hobby.getName()}</th>
					<th>${hobby.getHobby()}</th>
					<th>${hobby}</th>
				</tr>
			</c:forEach>
		</table>
	</div>

</body>
</html>

결과

오류

2021-11-07 11:37:08.673  WARN 2032 --- [nio-8080-exec-7] o.s.w.s.r.ResourceHttpRequestHandler     : Path with "WEB-INF" or "META-INF": [WEB-INF/views/test.jsp]

2021-11-07 11:41:53.806  WARN 2032 --- [nio-8080-exec-5] o.s.web.servlet.PageNotFound             : No mapping for GET /WEB-INF/views/test.jsp

 

JSP 설정을 마치고 기능 구현 이전에 HELLO WORLD를 먼저 출력해 볼려고 했는데 위치를 찾지 못하는 현상이 있었다. 첫번째는 위처럼 설정을 했을 때 났던 오류이고, 두번째는 스택오버플로우를 참고해 servletview를 작성했을 때 출력 된 오류다. 해결 방법은 이클립스를 재시작하니 정상 작동되었다.