Search

12. 스프링부트 Controller HTML 응답

http 요청을 file로 응답하기

(1) .txt 파일 응답하기(기본경로는 resources/static)
(2) 스프링부트가 지원하는 .mustache 파일 응답하기
(3) 스프링부트가 버린 .jsp 파일 응답하기
.jsp 와 .mustache 파일은 템플릿 엔진을 가지고 있다
템플릿 엔진이란 html 파일에 java 코드를 쓸 수 있는 친구들이다.
html파일에 자바코드를 넣으면 응답할때 html에 그대로 자바소스가 보여지게된다

실습

HttpRespController.java 생성
package com.cos.controllerdemo.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller //파일을 리턴할 것이기 때문에 public class HttpRespController { @GetMapping("/txt") public String txt() { return "a.txt"; } }
Java
복사
파일을 리턴할 @Controller
a.txt file 생성
서버 켜주고
주소로 들어가면 이렇게 잘 나온다.
브라우저가 파일안의 내용을 읽어온건데
근데 경로가 /src/main/resources/static/a.txt 이렇게 되냐면 프레임워크를 사용하고 있기 때문이다
package com.cos.controllerdemo.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller //파일을 리턴할 것이기 때문에 public class HttpRespController { @GetMapping("/txt") public String txt() { return "a.txt"; //프레임워 사(틀이 이 정해져 있음) - 일반 정적 파일들은 resources/static 폴더 내부가 디폴트 경로이다. } }
Java
복사

.mustache 파일을 응답해보자

.mustache 파일을 응답 할려면 템블릿 엔진 라이브버리가 필요하다.
요 사이트로 가면 java관련된 라이브버리가 다 모여 있다.
검색 후 밑으로 내리다 보면
클릭 후 제일 최신버전으로 클릭
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mustache --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mustache</artifactId> <version>3.1.2</version> </dependency>
XML
복사
해당 부분을 복사해서
pom.xml 파일 안에
<dependencies> 밑에 넣어주자
넣어주고 저장해주면 우측하단에 라이브러리 다운이 진행된다
그리고
<version>3.1.2</version>
버전부분은 필요없기 때문에 지워주자.
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mustache --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mustache</artifactId> </dependency>
XML
복사
라이브러리를 새로 넣어줬기 때문에 서버는 컸다가 다시 켜주는게 좋다.
mustache파일이 없기 때문에 html로 우선 만들어준다
생성하고
생성된 파일 f2 눌러서 파일확장자를 .html에서 .mustache 로 변경해주자
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> </body> </html>
HTML
복사
body 태그 안에다가
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>This is mustache</h1> </body> </html>
HTML
복사
추가
HttpRespController.java 파일에
@GetMapping("/mus") public String mus() { return "b.mustache"; }
Java
복사
추가
http://localhost:8080/mus
치면 파일이 다운이 된다.
그 이유는 브라우저가 mustache파일은 내가 모르는 파일인데 해석이안되서 다운로드 시켜버리는거다.
이미지에서 웹서버가
바로 응답하면서 일어나는 현상하고 같다.
코드 해석이 안된거다.
파일을 templates로 옮겨준다
@GetMapping("/mus") public String mus() { return "b"; }
Java
복사
확장자를 지우고 저장해주고 다시 불러보자
@GetMapping("/mus") public String mus() { return "b"; //머스태치 템플릿 엔진 라이브러리 등록 완료 - templates 폴더안에 .mustache을 나두면 확장자 없이 파일명만 적으면 자동으로 찾아감. }
Java
복사
정확히 말하자면 확장자가 존재하면 → static 폴더를 찾아간다
확장자가 없으면 → templates 폴더를 찾아간다.

.jsp 파일을 응답해보자

jasper 로 검색
jsp 탬플릿 엔진이다
버전이 11까지 있는데 최근꺼는 다운수가 처참해서 제일 많이 받은 최근꺼다
9.0.74다 오른쪽 23이 다운수
복사
pom.xml의
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mustache --> <!-- <dependency>--> <!-- <groupId>org.springframework.boot</groupId>--> <!-- <artifactId>spring-boot-starter-mustache</artifactId>--> <!-- </dependency>--> <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jasper --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper</artifactId> <version>9.0.74</version> </dependency>
XML
복사
근데 두개의 템플릿이 공존 할 수는 없다.
mustache 라이브러리로 넣어준거는 주석처리해주자
(command+ shift + c 눌러주면 선택한 줄 주석처리된다.)
저장 후 라이브러리 설치 후 서버 재기동
서버를 킬 수 없다는 에러가 뜬다.. ㅎㅎ 저기요??

ClassNotFoundException 오류 해결

에러 원인인
에러 내용을 구글링하고 서블릿 라이브러리 추가도 해보고 이짓저짓 다 해봐도 안돼서 설마하고
최근 버전으로 바꿔서 해보니까 잘된다…ㅎㅎ
<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jasper --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper</artifactId> <version>10.0.27</version> </dependency>
XML
복사
요 버전으로 다시 바꿔서 저장하고 서버 재기동 해주자.
저번처럼 스프링부트 신규 프로젝트 만드는 창으로 가면
라이브러리를 선택 할 수 있는 창이 있는데
이렇게 4가지 종류는 있지만 jsp는 없다..
기본 경로가 template가 아니라
src > main > Folder
webapp/WEB-INF/views
c.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>This is c.jsp</h1> </body> </html>
HTML
복사
HttpRespController.java에
@GetMapping("/jsp") public String jsp() { return "c"; }
Java
복사
추가
http://localhost:8080/jsp
는 505 에러가 뜨면 안되는데… 뜬다..

505 에러 오류 해결

pom.xml에 줬던 톰캣 제스퍼 메이븐을 톰캣 임베디드 제스퍼 메이븐으로 변경
(jsp를 로드하는데 필요한 종속성이 없어서 생기는 문제였다. 그래서 톰캣 임베디드 제스퍼로 변경)
<!--https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>10.1.10</version> </dependency>
Java
복사
다시 접속하니 원래 보고 싶었던 화면이 나왔다.. !!
현재 jsp 를 못 찾고 있는거다
그래서 찾을 수 있게 설정을 더 해줘야한다.
f2 눌러서 properties를 yml으로 변경해주자
spring.mvc.view.prefix 자동완성 뜨는거 클릭하면은
spring: mvc: view: prefix: suffix:
Java
복사
이렇게 형태로 만들어준다.
spring: mvc: view: prefix: /WEB-INF/views/ suffix: .jsp
Java
복사
추가해주고
저장 후 다시 주소로 접속
드디어 뜬다. 지금 이렇게 잡아준게 View Resolver 설정이다
지금 우리가 jsp 템플릿 엔진을 사용하고 있기 때문에 src/main/webapp 폴더가 디폴트 경로가 된거다.
@GetMapping("/jsp") public String jsp() { return "c"; //jsp 엔진 사용 :src/main/webapp 폴더가 디폴트 경로!! // /WEB-INF/views/c.jsp (ViewResolver) }
Java
복사
/WEB-INF/views/c.jsp로 셋팅 되게 만들어주는게 View Resolver 다.
이때는 json을 리턴될때 MessageConverter가 발동됐는데
지금은 view resolver가 발동
리턴하는 파일명 앞에 prefix
뒤에 suffix
이렇게 앞뒤로 붙여서 해당 파일을 찾아준다.

잠깐! why 머스태치 할때는 그냥 됐는데 jsp는 이렇게 설정해줘야하냐?

머스태치는 스프링부트가 지원해줘서 이미 설정되어 있고 jsp는 스프링부트가 버렸다. (한국에서만 지금 jsp를 사용하는곳이 많다) 그래서 우리가 직접 설정해줘야한다.

*참고