가수면
JSP 본문
StringBuffer
문자열을 그대로 return하면 효율이 안 좋기 때문에 StringBuffer 사용
@RequestMapping("say-hello-html")
@ResponseBody
public String sayHelloHtml() {
StringBuffer sb = new StringBuffer();
sb.append("<html>");
sb.append("<head>");
sb.append("<title> StringBuffer 테스트 </title>");
sb.append("</head>");
sb.append("<body>");
sb.append("StringBuffer 테스트");
sb.append("</body>");
sb.append("</html>");
return sb.toString();
}
JSP
StringBuffer를 이용해 HTML을 그리는 것 보다 더 효율적으로 코드를 작성할 수 있음
방식
jsp파일에 html을 그린 뒤 거기로 리디렉션 시킴
jsp 파일은 스프링 부트 프로젝트 내 다음 경로에 위치시켜야 함
/src/main/resources/META-INF/resources/WEB-INF/jsp/sayHello.jsp
1. say-hello-jsp로 요청 보냄
2. 요청 처리 메소드가 jsp 이름을 return 함
3. spring MVC의 뷰 리졸버를 설정 (접두어, 접미어 설정)
4. return 값에 접두어, 접미어가 붙은 jsp로 리디렉션 됨
구현
package com.in28minutes.springboot.mtfirstwebapp.hello;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class SayHelloController {
@RequestMapping("say-hello-jsp")
public String sayHelloJsp() {
return "sayHello";
}
}
// application.properties
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
// ECLIPSE
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
// INTELLIJ
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
Params 적용하기
RequestParam를 이용해 메소드에 요청 파라미터를 전달해줄 수 있고, ModelMap을 이용해 뷰에 전달할 수 있음
package com.in28minutes.springboot.mtfirstwebapp.login;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class LoginController {
@RequestMapping("login")
public String gotoLoginPage(@RequestParam String name, ModelMap model) {
model.put("name", name);
return "login";
}
}
<html>
<head>
<title>Login Page</title>
</head>
<body>
<h1>Heading 1</h1>
<h2>Heading 2</h2>
${name} Login Page
</body>
</html>
JSP Fragment
헤더 등 겹치는 태그들을 컴포넌트처럼 사용 가능
예시)
// header.jspf
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<link href="webjars/bootstrap/5.1.3/css/bootstrap.min.css" rel="stylesheet" >
<link href="webjars/bootstrap-datepicker/1.9.0/css/bootstrap-datepicker.standalone.min.css" rel="stylesheet" >
<title>Manage Your Todos</title>
</head>
<body>
// listTodos.jsp
<%@ include file="common/header.jspf" %>
<%@ include file="common/navigation.jspf" %>
<div class="container">
<h1>Your Todos</h1>
.
.
.
HTTP 요청에 따른 분기
요청에 따라 showNewTodoPage와 addNewTodo로 분기
@RequestMapping("list-todos")
public String listAllTodos(ModelMap model) {
List<Todo> todos = todoService.findByUsername("in28minutes");
model.addAttribute("todos", todos);
return "listTodos";
}
@RequestMapping(value="add-todo", method = RequestMethod.GET)
public String showNewTodoPage() {
return "todo";
}
@RequestMapping(value="add-todo", method = RequestMethod.POST)
public String addNewTodo() {
return "redirect:list-todos";
}
만약 리다이렉트 시키고자 listTodos.jsp로 바로 리다이렉트 시키게 되면 model의 값이 지정되어 있지 않아 todo가 텅텅 비어서 나오게 된다.
이 경우 "redirect:"를 사용해 RequestMapping로 지정한 url를 지정해 원하는 메소드를 다시 return하게 할 수 있음
'Java' 카테고리의 다른 글
[Java] 심화 (0) | 2023.12.12 |
---|---|
JSTL (0) | 2023.12.12 |
어노테이션 정리 (0) | 2023.12.02 |
H2, JDBC, JPA, Hibernate (2) | 2023.12.02 |
[Spring Boot] 기본 (0) | 2023.12.01 |
Comments