확장 프로그램 중에 code Spell Checker 은 영단어가 틀릴 경우 알려주는 프로그램임
답변 등록 폼을 만든다.
<h1 th:text="${question.subject}"></h1>
<div th:text="${question.content}"></div>
<!-- 1) __${}__ 2)'/answer/create/'+${question.id} 3)|/answer/create/${question.id}|-->
<form th:action="@{|/answer/create/${question.id}|}" method="post">
<textarea name="content" id="content" rows="10"></textarea>
<input type="submit" value="답변등록" />
</form>
action 의 @안의 주소에서 id값(변수)을 넣기 위해서 세 가지 방법정도가 있다.
1) __${question.id}__
2)'/answer/create/'+${question.id}
3)|/answer/create/${question.id}|
http://localhost:8080/answer/create/2
AnswerController 생성
package com.mysite.sbb.answer;
import org.springframework.beans.factory.annotation.Autowired;
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;
import com.mysite.sbb.question.Question;
import com.mysite.sbb.question.QuestionService;
@Controller
@RequestMapping("/answer")
public class AnswerController {
@Autowired
private QuestionService qService;
@PostMapping("/create/{id}") //주소에 있는 변수 { }안에 넣기
public String createAnswer(Model model, @PathVariable("id") Integer id,
@RequestParam String content) {
Question question = this.qService.getQuestion(id);
//TODO:답변을 저장한다
return String.format("redirect:/question/detail/%s", id);
}
}
AnswerService 생성
package com.mysite.sbb.answer;
import java.time.LocalDateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mysite.sbb.question.Question;
@Service
public class AnswerService {
@Autowired
private AnswerRepository aRepo;
//답변 저장 시 질문 객체와 답변 내용을 입력받아서 답변을 등록
public void create(Question question,String content ) {
Answer answer = new Answer(); //답변 객체 만드릭
answer.setContent(content);
answer.setCreateDate(LocalDateTime.now());//오늘날짜
answer.setQuestion(question);
this.aRepo.save(answer);//새 답변 입력
}
}
AnswerController 수정
//답변 저장
@PostMapping("/create/{id}") //주소에 있는 변수 { }안에 넣기
public String createAnswer(Model model, @PathVariable("id") Integer id,
@RequestParam String content) {
Question question = this.qService.getQuestion(id);
//답변 저장
aService.create(question, content);
return String.format("redirect:/question/detail/%s", id);//질문 상세보기 페이지로 리다이렉트
}
DB에 잘 저장되는지 테스트해보기
그리고
question_detail 에 등록된 답변 확인 할 수 있게 수정
</head>
<body>
<h1 th:text="${question.subject}"></h1>
<div th:text="${question.content}"></div>
<!-- 답변 출력 -->
<h5
th:text="${#lists.size(question.answerList)+'개의 답변이 있습니다.'}"
></h5>
<div>
<ul>
<li
th:each="answer : ${question.answerList}"
th:text="${answer.content}"
></li>
</ul>
</div>
<!-- 1) __${}__ 2)'/answer/create/'+${question.id} 3)|/answer/create/${question.id}|-->
<form th:action="@{|/answer/create/${question.id}|}" method="post">
<textarea name="content" id="content" rows="10"></textarea>
<input type="submit" value="답변등록" />
</form>
</body>
#lists.size(question.answerList)}는 답변 개수를 의미한다.
#lists.size(이터러블객체)는 타임리프가 제공하는 유틸리티로 객체의 길이를 반환한다.
답변은 question 객체의 answerList를 순회하여 <li> 엘리먼트로 표시했다.
테스트하기
'BACKEND > SpringBoot' 카테고리의 다른 글
질문 목록/상세보기 - 부트스트랩 적용 (0) | 2023.11.09 |
---|---|
스태틱 디렉터리와 스타일시트 (0) | 2023.11.09 |
Question 서비스 생성 및 상세보기 페이지 (0) | 2023.11.08 |
Question 컨트롤러 생성 (0) | 2023.11.08 |
패키지 도메인 별 분리하기 (0) | 2023.11.08 |