1. 조회수 늘리기
최종완성은 목록에서 상세보기로 들어왔을 때만 조회수 늘리기
view에서 보면 레코드 하나 가져오는 selectOne 메소드를 이용하니
그걸 좀 수정해야 겠음
메소드 수정하기 위해 DAO로 감
//상세보기용 - 레코드 하나 조회
@Override
public BBSDto selectOne(String... one) {
BBSDto dto = null;
try {
//조회수 업데이트용 추가 !
psmt=conn.prepareStatement("UPDATE bbs SET hitcount=hitcount+1 WHERE no=?");
psmt.setString(1, one[0]);
psmt.executeUpdate();
String sql = "SELECT b.*,name FROM bbs b JOIN member m ON b.id=m.id WHERE no=?";
psmt = conn.prepareStatement(sql);
psmt.setString(1, one[0]);
rs=psmt.executeQuery();
if(rs.next()) {
dto = new BBSDto();
dto.setContent(rs.getString(4));
dto.setContent(rs.getString(4));
dto.setHitCount(rs.getString(5));
dto.setId(rs.getString(2));
dto.setName(rs.getString(7));
dto.setNo(rs.getString(1));
dto.setPostDate(rs.getDate(6));
dto.setTitle(rs.getString(3));
}
}
catch(SQLException e) {e.printStackTrace();}
return dto;
}
사용자가 클릭하면 내용 뿌려주기 전에 조회수가 올라가 있어야 하니까 select문 앞에 update를 해준다.
완성은 아님 아까 말한 것 처럼 어떤경로로 들어왔냐에 따라 조회수를 진짜 올린건지 안올린건지 또 수정해야 하니까 그건 우선 넘어가고 다음
넘어가고 수정을 안했네....
개인프로젝트 할 때 찾아보려니 없어서 엄청 고생했다..
결국을 구글링과 선생님 소스로 해결함
아... 진짜 인간승리.. 나란인간 셀프 칭찬함
그리고(String... one)
이거 내가 잘못 이해하고 있었던거 같음 하..
저기서 할 땐 게시판 1방법을 써서 컨트롤러가 없어서 뷰(jsp) 페이지에서 코딩했는데
나는 게시판 2방법을 써서 개인프로젝트를 해야 했기에
view컨트롤러에다가 코드를 추가 작성함
우선 기본적으로 이전 페이지를 얻어오는 코드는
request.getHeader("referer")
리퀘스트 영역 헤더에 url정보가 있다고 배웠던거 같음... 와... 진짜 배운거 다 써먹네 문제는 기억이 안난다는거지만.
(나는 리퀘스트타입 변수명을 req로 해놓음)
System.out.println("이전 페이지"+req.getHeader("referer"));
//이전 페이지 List.jsp에서 뷰로 올 때만 조회 수 증가
String referer=req.getHeader("referer");
http://localhost:8080/ChoiDoWonProj2/DataRoom/List.kosmo 요렇게 나옴 !(이전페이지가 list였음)
String prev = referer.substring(referer.lastIndexOf("/")+1); //페이지 명만 잘라내고
DWroomDto dto = dao.selectOne(no,prev); //이거!!!!!
맨 마지막줄 코드에서 머리를 뙇 쳤음..
args가 막연하게 인자를 여러 개 넣어도 되는 거
라고만 생각했지 이렇게 활용하는 건 지 이제야 좀 알겠음
이렇게 selectOne메소드에 no,prev 라는 두개의 인자를 전달해 줌으로
dao에서 one[0], one[1] 가 셋팅이 됨
이거 톤솔창에 찍어보니
one[0]는 글번호
one[1]는 이전페이지가 아주 정확하게 나옴!!!
그리고 dao에다가도 추가 코드를 작성하면
(기존 sql문 작성한거 바로 위에다가 추가하면 됨)
//조회수 업데이트
//목록에서 넘어온 경우에만 조회수 증가
if(one.length>=2 && one[1].toUpperCase().contains("LIST")) {
psmt =conn.prepareStatement("UPDATE DWTABLE SET hitcount=hitcount+1 WHERE no=?");
psmt.setString(1,one[0]);
psmt.executeUpdate();
System.out.println(one[0]+","+one[1]);
}
이거 찾느라 새벽 2시까지 눈비비면서 있었는데...
다음날 오전에 해결함
역시 사람은... 잠을 잘 자야해
아무튼 해결해서 뿌듯!
2. 이전글/다음글 처리(제목도 같이 뿌려줄거)
이전글 (현재 글 바로 이후에 작성한 글 = 현재 글 번호 보다 큰 값들 중에서 최소값 )
다음글(현재 글 바로전에 작성한 글 = 현재 글 번호 보다 작은 값들 중에서 최대값)
이걸 쿼리로 만들어야 함
SELECT MIN(NO) FROM bbs WHERE NO > 현재글번호;
SELECT MAX(NO) FROM bbs WHERE NO < 현재글번호;
우린 제목도 넘길거 (서브쿼리 이용)
SELECT NO,TITLE FROM bbs WHERE no(SELECT MIN(NO) FROM bbs WHERE NO > 현재글번호);
SELECT NO,TITLE FROM bbs WHERE no(SELECT MAX(NO) FROM bbs WHERE NO < 현재글번호);
view.jsp 로 가서 완성하기
여기서 prevNext() 메소드를 새로 정의해서 사용할 거라
DAO로가서 정의하고 오자!
DAO
//이전글/다음글 조회
public Map<String, BBSDto> prevNext(String currentNo){
Map<String, BBSDto> map = new HashMap<>();
try {
//이전글 얻기
String sql="SELECT NO,TITLE FROM BBS WHERE NO=(SELECT Min(NO) FROM BBS WHERE NO >?)";
psmt = conn.prepareStatement(sql);
psmt.setString(1, currentNo);
rs=psmt.executeQuery();
if(rs.next()) { //이전 글이 있으면
map.put("PREV", new BBSDto(rs.getString(1),null,rs.getString(2), null, null, null));
}
//다음글 얻기
sql="SELECT NO,TITLE FROM BBS WHERE NO=(SELECT MAX(NO) FROM BBS WHERE NO < ? )";
psmt = conn.prepareStatement(sql);
psmt.setString(1, currentNo);
rs=psmt.executeQuery();
if(rs.next()) { //다음글 글이 있으면
map.put("NEXT", new BBSDto(rs.getString(1),null,rs.getString(2), null, null, null));
}
}
catch(SQLException e) {e.printStackTrace();}
return map;
}
View로가기
아 멍청이 가져오다가 view에서 이전글 다음글 ui이를 날려버렸음..
그래도 다시 가져오면 되니까 !
위에 추가
<%
//이전글/다음글 조회
Map<String,BBSDto> map = dao.prevNext(no);
%>
//밑에 ui 추가 및 변경
<table class="table">
<tbody>
<tr>
<td class="border-top-0 bg-info" style="width:7%">이전글</td>
<td class="border-top-0"><%=map.get("PREV")==null? "이전글이 없습니다":String.format("<a href='View.jsp?no=%s'>%s</a>",map.get("PREV").getNo(),map.get("PREV").getTitle()) %></td>
</tr>
<tr>
<td class="bg-info">다음글</td>
<td class="border-top-0"><%=map.get("NEXT")==null? "다음글이 없습니다":String.format("<a href='View.jsp?no=%s'>%s</a>",map.get("NEXT").getNo(),map.get("NEXT").getTitle()) %></td>
</tr>
</tbody>
</table>
map.get("PREV").getNo() 요런거 생소해하지 말라고!!!!
페이징 적용(페이징 로직 추가하기)
**DAO에서 할일**
1.전체 목록 쿼리를 구간 쿼리로 변경
2.총 레코드 수 구하는 메소드 추가
3.list.jsp 에 페이징 관련 코드 추가
DAO에 seletList 메소드 부분 수정/추가
페이징 적용을 위해 sql문을 구간쿼리로 변경함
String sql ="SELCET * FROM (SELECT T.*,ROWNUM R FROM
(SELECT b.*,name FROM bbs b JOIN member m ON b.id=m.id ORDER BY no DESC) T)
WHERE R BETWEEN ? AND ?";
@Override
public List<BBSDto> selectList(Map map) {
List<BBSDto> articles = new Vector<>();
//페이징 적용 前 쿼리- 전체 목록 쿼리
//String sql="SELECT b.*,name FROM bbs b JOIN member m ON b.id=m.id ORDER BY no DESC";
//페이징 적용 - 구간 쿼리
String sql ="SELCET * FROM (SELECT T.*,ROWNUM R FROM (SELECT b.*,name FROM bbs b JOIN member m ON b.id=m.id ORDER BY no DESC) T) WHERE R BETWEEN ? AND ?";
//검색시 추가 시작
if(map.get("searchWord") !=null) {
sql+=" WHERE "+map.get("searchColumn")+" LIKE '%"+map.get("searchWord")+"%'";
}
//검색시 추가 끝
sql+=" ORDER BY no DESC) T) WHERE R BETWEEN ? AND ?";
System.out.println("목록쿼리:"+sql);
try {
psmt = conn.prepareStatement(sql);
//페이징을 위한 시작 및 종료 rownum설정
psmt.setString(1, map.get("start").toString());
psmt.setString(2, map.get("end").toString());
rs = psmt.executeQuery();
while(rs.next()) {
BBSDto dto = new BBSDto();
dto.setContent(rs.getString(4));
dto.setHitCount(rs.getString(5));
dto.setId(rs.getString(2));
dto.setName(rs.getString(7));
dto.setNo(rs.getString(1));
dto.setPostDate(rs.getDate(6));
dto.setTitle(rs.getString(3));
articles.add(dto);
}
}
catch(SQLException e) {e.printStackTrace();}
return articles;
}//////////////
하고
메소드 getTotalRecordCount를 구현하기 !
//총 레코드 수 얻기
@Override
public int getTotalRecordCount(Map map) {
int getTotalRecordCount =0;
String sql = "SELECT COUNT(*) FROM bbs";
try {
psmt = conn.prepareStatement(sql);
rs=psmt.executeQuery();
rs.next();
getTotalRecordCount = rs.getInt(1);
}
catch(SQLException e) {e.printStackTrace();}
return getTotalRecordCount;
}
정리
페이징 로직 추가하기
DAO에서 할일
1.전체 목록 쿼리를 구간 쿼리로 변경
2.총 레코드 수 구하는 메소드 추가
3.list.jsp 에 페이징 관련 코드 추가
게시판에서 한번에 보이게 하는 글 수 변경
컨텐츠 초기화 파라미터 이용
list 파일에
페이지 사이즈 , 블락 페이지 변경
int pageSize = Integer.parseInt(application.getInitParameter("PAGE-SIZE"));
블락페이지
int blockPage= Integer.parseInt(application.getInitParameter("BLOCK-PAGE"));
이거 만들면
web.xml 에다가도 등록 해야 함
<context-param>
<param-name>PAGE-SIZE</param-name>
<param-value>4</param-value>
</context-param>
<context-param>
<param-name>BLOCK-PAGE</param-name>
<param-value>3</param-value>
</context-param>
그럼 밑에 한 페이지 당 4개글이 보여지고 밑에 나오는 숫자는 3개씩 세팅됨
다음 nowpage 처리하기
이건 뭐하는거? 만약 블락페이지 3에있는 글을 보고 목록으로 누르면 3페이지로 넘어와야 하는데
지금은 목록 누르면 어디에 있든지 1페이지로 넘어가게 된다
어 쓰다보니 티스토리는 목록도 없고 .. 이렇게 목록보려면 걍 1페이지부터 다시 들어가야햐는데.... 그래서 이거 건의할라했는데 귀찮.. 아무튼 이런 불편함을 시정하기 위해서
목록으로 이동 시 nowpage를 넘겨주는 처리를 할 것임
이 처리는 목록으로 이동했을 때 이외도 여러가지에다가 넣을 수 있음!
1.목록에 nowpage처리
list페이지에서 상세보기 누르면 헌재 페이지가 같이 넘어갈 수 있기 추가함 list페이지에는 변수선언 해 놨으니까 바로 사용 가능!
<td class="text-left"><a href="View.jsp?no=<%=dto.getNo()%>&nowPage=<%=nowPage %>"><%=dto.getTitle() %></a></td>
여기서 만하면 의미가 없죠
상세보기 view 페이지로 가서 거기서 목록보기에서도 처리해 줌
여긴 nowPage가 없으니 생성자 만들어 주고
String nowPage = request.getParameter("nowPage");
목록누를 때 처리할 거니까 링크걸린 테그에도 추가
<a href="List.jsp?nowPage=<%=nowPage %>" class="btn btn-success">목록</a>
2.view 페이지에 수정버튼에도 nowpage처리
왜냐면 수정하고 나서 다시 돌어온거 보면 여기도 nowPage가 빠져잇음 수정한 후 목록으로 이동할 때 이러면 에러나기 때문에 여기도 처리 해 준다
<a href="Edit.jsp?no=<%=no %>&nowPage=<%=nowPage %>" class="btn btn-success">수정</a>
마찬가지로 edite에다가도 해줘야 에러 안나지
현재 페이지번호 받기
String nowPage = request.getParameter("nowPage"); 생성자 해주고
<input type="hidden" name="no" value="<%=nowPage %>"/> 추가요
editeOk 에도 추가해야지
여기도
현재 페이지번호 받기
String nowPage = request.getParameter("nowPage"); 생성자 해주고
out.println(String.format("Vew.jsp?no=%s&nowPage=%s",no,nowPage));
연결되어있는 페이지는 모두 다 해줘야 한다...
2.삭제할때도 nowPage 처리
view페이지에서도
<script>
function isDelete(){
if(confirm("삭제 하시겠습니까?")){
location.replace("Delete.jsp?no=<%=no%>&nowPage=<%=nowPage%>");
}
}
</script>
Delete페이지 에서도
out.println(String.format("location.replace('List.jsp?nowPage=%s')",nowPage));
페이징의 끝판왕
이 경우 저 마지막 글을 삭제 했을 때 4페이지가 없어지는데 지금상태면 계속 4페이지로 가려고 함
마지막 글을 삭제 했을 때 이전 페이지로 가게 하기 !!
이때는 nowpage가 int 인게 유리하기 때문에 int로 바꿔줌
delete 페이지에 추가 코딩
로직은 이럼
총 페이지수가 nowpage보다 작아지면 (위의 상황)
nowpage에를 총 페이지로 바꾼다 !!!
<%
//파라미터(키값) 받기
String no = request.getParameter("no");
//현재 페이지번호 받기
int nowPage = Integer.parseInt(request.getParameter("nowPage"));
Map map = new HashMap(); // 추가
//crud작업용 dao 계열 객체 생성
BBSDao dao = new BBSDao(application);
int affected = dao.delete(no);
//추가
//마지막 레코드 삭제 시 페이지가 하나 줄어드는 코딩 시작
int totalRecordCount = dao.getTotalRecordCount(map);
int pageSize = Integer.parseInt(application.getInitParameter("PAGE-SIZE"));
//전체 페이지 수
int totalPage =(int)Math.ceil((double)totalRecordCount/pageSize);
if( totalPage < nowPage ) nowPage = totalPage;
//마지막 레코드 삭제 시 페이지가 하나 줄어드는 코딩 끝
dao.close();
%>
천재인 사람들은 참.. 많다.
페이징 시 필요 속성(키)를 저장하는 맵 설정용 메소드
MAP map : 필요한 키와 값을 담을 비어있는 맵
T dao: DAO계열을 받는다
제너릭 메소드로 구현 : DAOService를 상속받은 모든 DAO 계열을 인자로 받기 위해서-중복코딩방지
public static <T extends DaoService> void setMapForPaging(Map map,T dao,HttpServletRequest request) {
//페이징을 위한 로직 시작
//전체 레코드 수
int totalRecordCount = dao.getTotalRecordCount(map);
//페이지 사이즈
int pageSize =Integer.parseInt(request.getServletContext().getInitParameter("PAGE-SIZE"));
//블락 페이지
int blockPage =Integer.parseInt(request.getServletContext().getInitParameter("BLOCK-PAGE"));
//전체 페이지 수
int totalPage =(int)Math.ceil((double)totalRecordCount/pageSize);
//현재 페이지 번호
int nowPage = request.getParameter("nowPage")==null? 1 :Integer.parseInt(request.getParameter("nowPage"));
//시작 및 끝 rownum
int start = (nowPage-1)*pageSize+1;
int end = nowPage*pageSize;
//페이지징을 위한 로직 끝
map.put("start",start);
map.put("end",end);
map.put("totalRecordCount", totalRecordCount);
map.put("pageSize", pageSize);
map.put("blockPage", blockPage);
map.put("totalPage", totalPage);
map.put("nowPage", nowPage);
}///////////////
'학원 > JSP' 카테고리의 다른 글
11/28 52-2 [JSP] EL 의 param 내장객체 (0) | 2022.11.28 |
---|---|
11/28 52-1 [JSP] EL개념 및 연산 (0) | 2022.11.28 |
11/25 51- 게시판 짜기(update/delete) (0) | 2022.11.27 |
11/25 51-2 게시판 짜기(Write,view) (0) | 2022.11.26 |
11/25 51-1 대망의 게시판 짜기 _1,2 (0) | 2022.11.25 |