단 하나의 맥락
: 각 질문 상세페이지 내 답변 등록 form을 설정하고, post된 답변을 표시한다
Semiflow Bundle
- 등록 form(submit button) 만들기
- AnswerController를 만들고 Post URL 매핑
- AnswerService를 통해 답변 저장하기(컨트롤러에 연결)
- 질문 상세페이지에 답변 표시하기
자각
-
질문 create form과 버튼은
- question_detail.html 질문 단 아래에
- <form th:action="@{|/answer/create/${question.id}|}" method="post"></form> 사이에
- <textarea name="content" id="content" rows="15"></textarea>
- <input type="submit" value="답변등록"> 을 넣어 form을 완성한다
-
답변등록 Post 요청을 처리하기 위해
- AnswerController를 신규 작성
- public String createAnswer() 메소드에
- @PostMapping("/create/{id}") 적용
- signal로는 (Model model, @PathVariable("id") Integer id, @RequestParam String content) 가 필요
- A1 : Question question = this.questionService.getQuestion(id);
- A2 : 서비스에 답변을 만들어 저장하고
- A3 : return String.format("redirect:/question/detail/%s", id); 로 리다이렉팅
package com.mysite.sbb.answer;
import com.mysite.sbb.question.Question;
import com.mysite.sbb.question.QuestionService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@RequestMapping("/answer")
@RequiredArgsConstructor
@Controller
public class AnswerController {
private final QuestionService questionService;
@PostMapping("/create/{id}")
public String createAnswer(Model model, @PathVariable("id") Integer id, @RequestParam String content) {
Question question = this.questionService.getQuestion(id);
// TODO: 답변을 저장한다.
return String.format("redirect:/question/detail/%s", id);
}
}
-
답변을 저장하기 위해
> AnswerService에
- public void create()를 작성
- signal로는 (Question question, String content)가 들어가며
- Question은 "import com.mysite.sbb.question.Question;" 으로 P/I 가 필요하다
- A1 : Answer answer = new Answer();
- A2 : answer.setContent(content);
- A3 : answer.setCreateDate(LocalDateTime.now());
- A4 : setQuestion(question);
- A5 : this.answerRepository.save(answer);
package com.mysite.sbb.answer;
import com.mysite.sbb.question.Question;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@RequiredArgsConstructor
@Service
public class AnswerService {
private final AnswerRepository answerRepository;
public void create(Question question, String content) {
Answer answer = new Answer();
answer.setContent(content);
answer.setCreateDate(LocalDateTime.now());
answer.setQuestion(question);
this.answerRepository.save(answer);
}
}
- 만들어진 서비스를 컨트롤러에 기재한다
- 답변은 QuestionService와 AnswerService 두 가지가 필요하다
(... 생략 ...)
public class AnswerController {
private final QuestionService questionService;
private final AnswerService answerService;
@PostMapping("/create/{id}")
public String createAnswer(Model model, @PathVariable("id") Integer id, @RequestParam String content) {
Question question = this.questionService.getQuestion(id);
this.answerService.create(question, content);
return String.format("redirect:/question/detail/%s", id);
}
}
Create된 답변을 표시하기 위해
> question_detail.html 에
- 답변은 질문 제목과 내용, 추가 답변 등록 폼 사이에 기재된다
- <h5 th:text="|${#lists.size(question.answerList)}개의 답변이 있습니다.|"></h5>
- <div></div> 공간 안에
- <ul></ul> 리스트를 넣고
- <li th:each="answer : ${question.answerList}" th:text="${answer.content}"></li> 로 답변들을 갯수만큼 표시한다
'포트폴리오 > SPRINGBOOT 옛날' 카테고리의 다른 글
2-13 : BootStrap (2) | 2022.10.02 |
---|---|
2-12 : Static Directory and CSS (1) | 2022.10.02 |
2-10 : 질문 리스트 > 질문 상세 (1) | 2022.10.01 |
2-09 : Service (4) | 2022.10.01 |
2-08 : redirecting to ROOT URL (1) | 2022.10.01 |