Spring

Spring 일지 #61 (exam) 시험 대비6(상세 페이지, 이미지 불러오기)

uni5948 2021. 10. 7. 23:51

61. 상세 페이지, 이미지 불러오기

-상세 페이지

 * /select_one get 생성(BoardController.java)

 

@GetMapping(value = "/select")

    public String selectGET(Model model,

        @RequestParam(name = "title"defaultValue = ""required = falseString title,

        @RequestParam(name = "writer"defaultValue = ""required = falseString writer,

        @RequestParam(name = "page"defaultValue = "0"required = falseint page){

        if(page == 0){

            return "redirect:/board/select?page=1";

        }

        PageRequest pageRequest = PageRequest.of(page -110);

        List<Boardlist = 

            bRepository.findByTitleOrWriterContainingOrderByNoDesc(titlewriterpageRequest);

        long pages = bRepository.countByTitleOrWriterContaining(titlewriter);

 

        model.addAttribute("list"list);

        model.addAttribute("pages", (pages-1)/10+1);

        return "board_select";

    }

 

    @GetMapping(value="/select_one")

    public String selecOneGET(Model model,

        @RequestParam("no"long no) {

            Optional<Boardboard = bRepository.findById(no);

            model.addAttribute("board"board.orElse(null));

 

        return "board_select_one";

    }

 

 

 * 상세 페이지 생성(board_select_one.jsp)

board_select_one.jsp

 

 * 상세 페이지 구현(board_select_one.jsp)

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>상세 페이지</title>

</head>

<body>

    <h3>상세 페이지</h3>

    <hr/>

    글번호 : <div style="display: inline-block;" th:text="${board.no}"></div><br/>

    글제목 : <div style="display: inline-block" th:text="${board.title}"></div><br />

    글내용 : <div style="display: inline-block" th:text="${board.content}"></div><br />

    작성자 : <div style="display: inline-block" th:text="${board.writer}"></div><br />

    조회수 : <div style="display: inline-block" th:text="${board.hit}"></div><br />

    날짜 : <div style="display: inline-block" th:text="${board.regdate}"></div><br />

</body>

</html>

 

* 화면 확인 

상세 페이지

 

-이미지 불러오기

 * 이미지 링크 생성(board_select_one.jsp)

<h3>상세 페이지</h3>

    <hr/>

    글번호 : <div style="display: inline-block;" th:text="${board.no}"></div><br/>

    글제목 : <div style="display: inline-block" th:text="${board.title}"></div><br />

    글내용 : <div style="display: inline-block" th:text="${board.content}"></div><br />

    작성자 : <div style="display: inline-block" th:text="${board.writer}"></div><br />

    조회수 : <div style="display: inline-block" th:text="${board.hit}"></div><br />

    날짜 : <div style="display: inline-block" th:text="${board.regdate}"></div><br />

    이미지 : <img th:src="@{/board/select_image(no=${board.no})}" style="width: 50px; height: 50px;"></div><br />

    <hr/>

 

 * 디폴트 이미지 추가

 * 이미지를 첨부하지 않은 글에 사용하기 위함

 * resources - css, images 폴더 생성 후 images 폴더에 디폴트 이미지 저장

 

디폴트 이미지 저장

 

 * /select_image 생성(BoardController.java)

 

    @RequestMapping(value = "/select_image"method = RequestMethod.GET)

    public ResponseEntity<byte[]> selectImage(@RequestParam("no"long nothrows Exception {

        try {

            Board board = bRepository.getById(no);

 

            if (board.getImage().length > 0) {

                HttpHeaders headers = new HttpHeaders();

                if (board.getImagetype().equals("image/jpeg")) {

                    headers.setContentType(MediaType.IMAGE_JPEG); // gif, png 도 추가할 것(else if 이용)

                } else if (board.getImagetype().equals("image/gif")) {

                    headers.setContentType(MediaType.IMAGE_GIF);

                } else if (board.getImagetype().equals("image/png")) {

                    headers.setContentType(MediaType.IMAGE_PNG);

                }

 

                // 클래스명 response = new 클래스명(생성자 선택)

                ResponseEntity<byte[]> response = 

                    new ResponseEntity<>(board.getImage(), headersHttpStatus.OK);

                return response;

            }

            else{// 이미지를 읽을 수 없을 경우 defualt 이미지 출력

                InputStream is = resourceLoader.getResource("classpath:/static/images/default.jpg").getInputStream();

                HttpHeaders headers = new HttpHeaders();

                headers.setContentType(MediaType.IMAGE_JPEG);

                ResponseEntity<byte[]> response = new ResponseEntity<>(is.readAllBytes(), headersHttpStatus.OK);

                return response;

            }

        } 

        catch (Exception e) { // 이미지를 읽을 수 없을 경우 defualt 이미지 출력

            InputStream is = resourceLoader.getResource("classpath:/static/images/default.jpg").getInputStream();

 

            HttpHeaders headers = new HttpHeaders();

            headers.setContentType(MediaType.IMAGE_JPEG);

            ResponseEntity<byte[]> response = new ResponseEntity<>(is.readAllBytes(), headersHttpStatus.OK);

            return response;

        }

    }

 

* 상세 페이지 확인

상세 페이지