:: 질문 상세 페이지
질문 상세로 이동할 HTML
th:href
링크 주소
- @{|문자열로된 링크 주소 + ${question의 id}}
- 타임리프는 문자열을 연결할 때
|
을 사용한다.
- 문자열과, 자바 객체의 값을 더할 때에는 | | 로 감싸야 오류가 없다.
<td>
<a th:href="@{|/question/detail/${question.id}|}" th:text="${question.subject}"></a>
</td>
Controller
- 변하는 id값을 얻을 때에는 @PathVariable을 사용
(value = "/question/detail/{id}")
의 id와 @PathVariable("id")
의 매개변수 이름이 동일해야 한다.
@GetMapping(value = "/question/detail/{id}")
public String detail (Model model, @PathVariable("id") Integer id) {
return "question_detail"
}
Service
public Question getQuestion(Integer id) {
Optional<Question> question = this.questionRepository.findById(id);
if (question.isPresent()) {
return question.get();
} else {
throw new DataNotFoundException("question not found");
}
}
DataNotFoundException
- 존재하지 않는 id값 넣으면 404 오류가 나오게끔
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "entity not found")
public class DataNotFoundException extends RuntimeException {
private static final long serialVersionUID = 1L;
public DataNotFoundException(String message) {
super(message);
}
}
Controller에 추가
Question question = this.questionService.getQuestion(id);
model.addAttribute("question", question);
질문 상세 HTML
<h1 th:text="${question.subject}"></h1>
<div th:text="${question.content}"></div>
:: URL 프리픽스(prefix)
- url 시작을 같은 것으로 시작할 때 하나로 통일
@RequestMapping("/question")
- 필수 사항은 아니다.