게시판5) 게시판 화면 구성

  • 드디어 본론, 게시판을 만들 것이다. 화면은 다음과 같다

    게시판 화면

  • 이 포스트에서는 1~4번 노란 박스까지 보도록 할 것이다. 글번호와 페이징은 다음 포스트에서 다룰 것이다.

1. home 버튼 누르면 index로 돌아가기

  • 맞다. 당신이 생각하는 바로 그것… image 태그를 a태그로 감싸서 이미지를 클릭하면 index페이지로 돌아가게 한다.
  • 그러나 틀리다. 당신이 생각한 바로 그것… a href = “/” 를 주려고 하지 않았는가? 아님말구
    • 만약 “/” 게 보내면, http://localhost:8089/board/ 여기가 아니라 http://localhost:8089/ 여기로 돌려보낸다.
  • a href = “/board”를 준 당신도 틀렸다.
  • 이렇게 하면 배포하는 시점에서 문제가 생겨버린다. (deep 한 설명은 담번에..?)
  • ${pageContext.request.contextpath}/ 이렇게 서버에서 직접 page 컨텍스트 패스를 가져와야한다.
<div class= "home">
    <!-- spring - appservlet 에 servelt-context에서 설정을 해주어서 이렇게 해줄 수 있다. -->
    <a href="${pageContext.request.contextPath}/"><image src = "images/home.jpg" style = "width : 30px; height : 30px;"></a></div>

2. DB에서 받은 정보 출력

  • controller에서 다음과 같이 DB에서 받은 객체들을 model 에 “list”로 저장해준다.

  • repository.boardList(searchItem,searchWord);의 args는 3번에서 설명할 예정이니 지금은 스킵!

    List<Board> list = repository.boardList(searchItem,searchWord);//글 목록 조회
    model.addAttribute("list",list);
    
  • jstl core library를 이용해 <c:forEach 문 사용

    <!--헤더 빼먹지 말고 쓰기-->
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    <!-- 형식은 다음과 같다.-->
    <c:forEach var= "i" items="${list}">
    </c:forEach>
    
  • forEach 문에서 list 안 board 객체들을 하나씩 꺼낸다. 제목을 클릭하면 그 글을 확인할 수 있게 해야함으로, 게시글 title에는 a href를 걸어준다.

  • 아래처럼 a href = “javascript:함수명(args)” 를 사용하면 js 함수를 부를 수 있다.

    <a href="javascript:boardDetail(${board.boardseq})">${board.title}</a>
    
  • 요로케..테이블 형식으로 만들어준다.

    boardlist.jsp

    <table border="1">
        <tr>
            <th>번호</th>
            <th class="title">글제목</th>
            <th>글쓴이</th>
            <th>글쓴날</th>
            <th>조회수</th>
        </tr>
        <c:forEach var= "board" items="${list}" varStatus="status">
            <tr>
                <!--일단 글 번호대신 boardseq을 넣어놓음.페이징 포스트에서 변경예정-->
                <td>${board.boardseq}</td>
                <td>
                    <!-- javascript 호출하는걸로 바꾼다... -->
                    <a href="javascript:boardDetail(${board.boardseq})">${board.title}</a>
                </td>
                <td>${board.userid }</td>
                <td>${board.regdate} </td>
                <td>${board.hitcount}</td>
            </tr>
        </c:forEach>
    </table>
    

3. 글 검색

주요 개념

1. ${ 조건 ? 값1:값2 }의 실사용. ${searchItem=='title' ? 'selected' : ' '}
2. @RequestParam(value="변수명", defaultValue ="기본값") String 변수명,
3. 쿼리 choose when 구문

1. ${ 조건 ? 값1:값2 }

  • ${searchItem==’title’ ? ‘selected’ : ‘ ‘} 이런 형식으로 사용해 서버에 저장된 변수 값을 읽어와 화면에 설정이 남아있게 할 수 있다.
  1. form 이 submit 되면서, select option 의 value값이 controller로 날아간다. (searchItem = “userid” 이런 식으로)

  2. jsp에서 온 searchItem 와 searchWord의 변수값을 controller에서 받아 model에 저장한다.

  3. jsp에서 ${searchItem==’title’ ? ‘selected’ : ‘ ‘} 이렇게 확인해서 selected를 넣어준다.

    그럼 페이지가 바뀌더라도 검색창에 키워드와 option 이 리셋되지 않고 남아있게된다.

<form id = "search" action = "boardlist" method = "GET">
    <select name = "searchItem">
        <option value = "title"  ${searchItem=='title' ? 'selected' : ' '}>제목</option>
        <option value = "userid" ${searchItem=='userid' ? 'selected' : ' '}>작성자 </option>
        <option value = "message" ${searchItem=='message' ? 'selected' : ' '}>글내용 </option>
    </select>
    <input type= "text" name = "searchWord" value = "${searchWord }">
    <input type= "submit" value = "검색">
</form>

2. @RequestParam

  • boardList 함수의 param 은 좀 다르다. String 변수명의 형식이 아니라.

    @RequestParam(value="변수명", defaultValue ="변수값") String 변수명
    

    의 형식을 가진다. 의미는 어렵지 않다. 만약 jsp 파일에서 해당 변수명이 넘어오지 않을 때, defaultValue로 “변수값”을 해라 라는 뜻이다.

  • 이렇게 쓰인다.

    public String boardList(
        @RequestParam(value="searchItem", defaultValue ="title") String searchItem,
        @RequestParam(value="searchWord", defaultValue ="") String searchWord,
        Model model){}
    
  • 코드의 재사용을 위해서 이렇게 한다. index 페이지에서 게시판을 넘어올 때와 글 검색한 후 확인을 누를 때 페이지 코드가 거의 똑같다. 다른 점은 전자의 경우,

  • model 에 search item 과 word 저장해 줘서 jsp에서 가져올 수 있도록 한다. searchItem과 searchWord가 존재하지 않아 넘어오지 않고 후자는 searchItem과 searchWord와 변수값이 넘어온다는 점이다. 이렇게 @RequestParam을 사용하면 전자 후자의 경우를 하나의 메소드로 처리할 수 있어 좋다.

@RequestMapping("/boardlist")
public String boardList(
    @RequestParam(value="searchItem", defaultValue ="title") String searchItem,
    @RequestParam(value="searchWord", defaultValue ="") String searchWord,
    Model model) {

    List<Board> list = repository.boardList(searchItem,searchWord);//글 목록 조회
    model.addAttribute("list",list);
    model.addAttribute("searchItem", searchItem);
    model.addAttribute("searchWord", searchWord);

    return "board/boardList";
}

3. 쿼리 choose when 구문

  • choose when 으로 조건을 걸어준다. (switch case 문 처럼 사용하면 된다.)

  • LIKE ‘%’ #{searchWord} ’%’ (SQL 다 까묵어부렀..)
  • xml 문법에서는, 서버에 저장된 정보를 꺼내올 때 ${}이렇게 사용하지 않고, #{} 이렇게 사용한다.

  • 또한 태그 안에 넣는 변수면

    <when test = "searchItem=='title'">
    

    이런식으로 그냥 “” 안에 넣어서 사용한다.

<select id = "boardList" resultType="Board" parameterType = "map">
    SELECT
    boardseq,userid, title,message,to_char(regdate,'YYYY-MM-DD') as regdate
    ,hitcount, originalfile, savedfile
    FROM
    BOARD
    WHERE
    <choose>
        <when test = "searchItem=='title'">title</when>
        <when test = "searchItem=='userid'">userid</when>
        <when test = "searchItem=='message'">message</when>
    </choose>
    LIKE '%' ||  #{searchWord} || '%'
    ORDER BY boardseq DESC
</select>

repository

public List<Board> boardList(String searchItem, String searchWord) {
    Map<String,String> map = new HashMap<String,String>();
    BoardMapper mapper =  session.getMapper(BoardMapper.class);

    map.put("searchItem",searchItem);
    map.put("searchWord",searchWord);
    List<Board> list = mapper.boardList(map);
    return list;
}

4.로그인 했을시에만 글쓰기 가능

  • 저번 포스트에서 로그인 시 httpsession 에 loginId를 저장했다. 그게 httpsession 에 저장되어있고, sessionScope.loginId 로 loginId를 get할 수 있다.

  • <c: if test 를 이용해 sessionScope.logId가 not empty면 보이게 한다.
  • ${sessionScope.loginId}
<c:if test = "${not empty sessionScope.loginId }">
    <div class = "write">
        <a href = "boardwrite">글쓰기</a>
    </div>
</c:if>

◇ Spring 게시판 포스팅 시리즈 ◇

  1. Spring 과 DB 연결하기
  2. 회원 가입 화면 구성
  3. ID 중복 확인 하기
  4. 로그인 페이지 만들기
  5. 게시판 화면 구성하기 - 현재 글
  6. 글 쓰기 기능 구현
  7. 글 확인 기능 구현
  8. 글 수정 기능 구현
  9. 게시판 페이징
  10. 파일 첨부 기능
  11. 파일 다운 기능
  12. MIME 타입
  13. 글 수정시 파일 변경

© 2018. All rights reserved.

Powered by Hydejack v8.5.2