1. 검색
<boardListView.jsp>
<div id="search-area">
<form action="search.bo" method="get">
<input type="hidden" name="currentPage" value="1">
<select name="condition">
<option value="writer">작성자</option>
<option value="title">제목</option>
<option value="content">내용</option>
</select>
<input name="keyword" type="text" value="${keyword }">
<button type="submit">검색</button>
</form>
</div>
condition을 선택하고, 검색 keyword를 입력해 검색버튼을 누르면, 요청이 감
<BoardSearchController> : /search.bo
String condition = request.getParameter("condition");
String keyword = request.getParameter("keyword");
- writer, title, content중 하나 !
- "사용자가 입력한 키워드값"
Sevice는 값을 하나만(묶어서라도) 들고가는데, 값을 담을 곳이 없다?!
억지로 담기엔, VO는 값과 매핑되지 않는건 쓰지 않는 것이 좋음
개발 시점에서는 List가 더 쉬울 수 있음(값이 추가될 수 있으므로)
BUT List를 썼을 때 단점으로 1. 메모리 낭비, 2. 순서대로 출력되므로 잊어버릴 수 있음
=> HashMap을 이용하자.
HashMap<String, String>map = new HashMap();
map.put("condition", condition);
map.put("keyword", keyword);
다형성을 이용해서 객체 선언&생성해주기
BoardService boardService = new BoardServiceImpl();
검색값에 해당하는 페이징바처리를 위해 다시 만들기
int searchCount = boardService.selectSearchCount(map);
int currentPage = Integer.parseInt(request.getParameter("currentPage"));
int pageLimit = 10;
int boardLimit = 5;
PageInfo pi = Pagination.getPageInfo(searchCount, currentPage, pageLimit, boardLimit);
- 서비스로 요청보내기
ArrayList<Board> list = boardService.selectSearchList(map, pi);
- 받아온 결과값을 request의 attribute에 담아주기 & 포워딩해주기
request.setAttribute("pi", pi);
request.setAttribute("list", list);
request.setAttribute("condition", condition);
request.setAttribute("keyword", keyword);
request.getRequestDispatcher("WEB-INF/views/board/boardListView.jsp").forward(request, response);
<BoardServiceImpl>
@Override
public ArrayList<Board> selectSearchList(HashMap<String, String> map, PageInfo pi) {
SqlSession sqlSession = getSqlSession();
ArrayList<Board> list = boardDao.selectSearchList(sqlSession, map, pi);
sqlSession.close();
return list;
}
<BoardDao>
public ArrayList<Board> selectSearchList(SqlSession sqlSession, HashMap<String, String> map, PageInfo pi) {
int offset = (pi.getCurrentPage()-1)*pi.getBoardLimit();
RowBounds rowBounds = new RowBounds(offset, pi.getBoardLimit());
return (ArrayList)sqlSession.selectList("boardMapper.selectSearchList", map , rowBounds);
}
<board-mapper.xml>
<select id="selectSearchList" parameterType="hashMap" resultMap="boardResultSet">
SELECT
BOARD_NO,
BOARD_TITLE,
USER_ID,
COUNT,
CREATE_DATE
FROM
BOARD
JOIN
MEMBER ON(BOARD_WRITER = USER_NO)
WHERE
BOARD.STATUS = 'Y'
<choose>
<when test="condition == 'writer'">
AND USER_ID
</when>
<when test="condition == 'title'">
AND BOARD_TITLE
</when>
<otherwise>
AND BOARD_CONTENT
</otherwise>
</choose>
like '%' || #{keyword} || '%'
ORDER
BY
BOARD_NO DESC
</select>
SQL쿼리문 내에서도 choose-when-otherwise구문 사용가능.
* 참고
https://mybatis.org/mybatis-3/ko/dynamic-sql.html
동적 SQL 엘리먼트들은 JSTL이나 XML기반의 텍스트 프로세서를 사용해 본 사람에게는 친숙할 것이다
<boardListView.jsp>
**고려해야할 점
검색을 할 때마다 페이징바가 달라짐
검색영역 클릭 :
/mybatis/search.bo?currentPage=1&condition=writer&keyword=ad
검색 후 페이징 바 클릭 시 :
/mybatis/search.bo?currentPage=2&condition=writer&keyword=ad
따라서 페이징바를 condition가 존재할 때/존재하지 않을 때 따로 지정을 해야함
<div id="paging-area">
<c:if test="${pi.currentPage != 1 }">
<a href="list.bo?currentPage=${pi.currentPage-1}"><</a>
</c:if>
<c:forEach var="p" begin="${pi.startPage}" end="${pi.endPage }" step="1">
<c:choose>
<c:when test="${empty condition }">
<a href="list.bo?currentPage=${p }">${p}</a>
</c:when>
<c:otherwise>
<a href="search.bo?currentPage=${p }&condition=${condition}&keyword=${keyword}">${p}</a>
</c:otherwise>
</c:choose>
</c:forEach>
<c:if test="${pi.currentPage != pi.endPage }">
<a href="list.bo?currentPage=${pi.currentPage+1}">></a>
</c:if>
</div>
**고려해야할 점2
input에 남아있지 않음 => Attribute에 담아주기(condition, keyword)
value="${keyword }" EL구문으로 적으면 없으면 안적히고 있을 때만 적힘
<c:if test="${not empty condition }">
<script>
${function(){
$('#search-area option[name=${codition}]').attr('selected', true);
}}
</script>
</c:if>
return false 기본이벤트가 실행 안됨
https://cobalt-blue-sunset.tistory.com/32
JavaScript - 요소가져오기(접근하기), 변수와 자료형, 문자열과 숫자, 배열, 함수, 객체1, 객체2, windo
3. HTML요소에 접근하기(해당 요소 객체 가져오기) 1) 아이디로 접근하기 아이디로 요소에 접근할 때, document라는 객체가 요소들의 정보를 가지고 있음(접근해야 함) var 변수명 = document.getElementById('
cobalt-blue-sunset.tistory.com
참고하기
2. filter
filter기능(common에 폴더 만들기) > new > filter >'EncodingFilter'
- 어노테이션 변경
@WebFilter(urlPatterns="/*") => 모든 서블릿이 실행되기 전에 이 필터를 거쳐가겠다.
- doFilter에 내가 할 작업 써주기
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
//현재 필터가 최종일 경우 서블릿 필터 호출, 아닐 경우 다른 필터 호출
//더이상 인코딩을 하지않아도 자동으로 인코딩해줌
}
'클라우드 융합 Full-stack 웹 개발자 양성과정 > Spring' 카테고리의 다른 글
Spring - 마이페이지(수정), 회원탈퇴, 게시글리스트조회 (0) | 2022.12.23 |
---|---|
Spring - 로그인, 로그아웃, 회원가입 (0) | 2022.12.20 |
Spring - 개발환경구성 (0) | 2022.12.20 |
MyBatis - 환경구성, 로그인, 회원가입기능, 게시글리스트 조회, 게시글 상세조회 (0) | 2022.12.17 |
EL표현언어, JSTL (9) | 2022.12.13 |