[Java] 답변형 게시판 만들기(2)
지난포스팅에 이어서 계속 진행해 봅시다!
11. 상대 주소 개념 알기
서블렛에서 로직 처리 후 특정 페이지로 보내고 싶을때…
- 가고싶은 페이지가 jsp인 경우
RequestDispatcher rd = request.getRequestDispatcher("boardList.jsp");
rd.include(request, response);
-
가고싶은 페이지가 .do인 경우(타 서블렛)
-
이전 페이지에서 action으로 넘어온 경우
-
response.sendRedirect("../index.jsp?main=board/content.do?num="+ num + "&pageNum=" + pageNum);
-
이전 페이지에서 location.href로 넘어온 경우
-
RequestDispatcher rd = request.getRequestDispatcher("content.do?num=" + num + "&pageNum=" + pageNum); rd.include(request, response);
12. 작성일을 좀 더 심플하게 보여주기
BoardDTO에 변수 추가
private long timediff;
private string simpletime;
list.do에 추가할 것
Date now = new Date();
for(BoardDTO d:list) {
//작성일을 좀더 심플하게 표현하기
long timediff = now.getTime()-d.getWriteday().getTime();
timediff /= 1000*60;
d.setTimediff(timediff);
if(timediff < 1) {
d.setSimpletime("방금전");
}else if(timediff < 60) {
d.setSimpletime(timediff + "분전");
}else if(timediff < 60*24) {
d.setSimpletime(timediff/60 + "시간전");
}else if(timediff < 60*24*30 ) {
d.setSimpletime(timediff/(60*24) + "일전");
}else if(timediff < 60*24*30*12) {
d.setSimpletime(timediff/(60*24*30) + "달전");
}else {
d.setSimpletime(timediff/(60*24*30*12) + "년전");
}
}
list.jsp 수정하기
${dto.writeday} 대신 ${dto.simpletime}으로 주면 됨
만약 fmt 같은거 쓴 경우면 다 지워주고 ${dto.simpletime} 만 남길것!!!!
13. 답글이 달려있는 경우의 글 삭제하기
sql
select count(*) from reboard where groupno=#{groupno} and restep>#{restep} and writeday > (select writeday from reboard where num=#{num})
14. 댓글 삭제하기
sql
<delete id="boardAnswerDelete" parameterType="int">
delete from boardanswer where seq=#{seq}
</delete>
DAO
public void deleteAnswer(int seq)
{
session=getSession();
session.delete("boardAnswerDelete",seq);
session.close();
}
AnswerDeleteServlet
@WebServlet("/board/adelete.do")
public class AnswerDeleteServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
int seq=Integer.parseInt(request.getParameter("seq"));
String num=request.getParameter("num");
String pageNum=request.getParameter("pageNum");
BoardAnswerDao dao=new BoardAnswerDao();
dao.deleteAnswer(seq);
response.sendRedirect("../index.jsp?main=board/content.do?num="
+num+"&pageNum="+pageNum);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
15. 제목 옆에 댓글 개수 표시되게 하기
BoardDto에 추가
private int answercount;
public int getAnswercount() {
return answercount;
}
public void setAnswercount(int answercount) {
this.answercount = answercount;
}
BoardListServlet
BoardAnswerDao adao=new BoardAnswerDao();
for(BoardDto dto:list)
{
File file=new File(realPath+"\\"+dto.getImagename());
if(file.exists())
dto.setImage("yes");
else
dto.setImage("no");
//댓글 갯수 저장하기
dto.setAnswercount(adao.getAnswerList(dto.getNum()).size());
}
boardlist.jsp
<!-- 업로드이미지 여부에 따라 이미지출력 -->
<c:if test="${dto.image=='yes'}">
<img src="image/btn12.gif" width="12">
</c:if>
<!-- 댓글 갯수 출력 -->
<c:if test="${dto.answercount>0}">
<a href="#" style="color: red;">
(${dto.answercount})</a>
</c:if>
16. 원글 삭제하기
- 원글 삭제를 누르면 댓글이 없는경우에는 곧바로 삭제후 목록으로 이동
- 단, 댓글이 있을 경우에는 다이얼로그로 총 몇개의 댓글이 있다는 경고후 삭제(삭제시 댓글부터 먼저 삭제후 원글 삭제해야함- 이때 업로드한 파일도 같이 삭제해야함)
삭제버튼 클릭 시 자바스크립트 함수 호출
<button type="button" onclick="del(${dto.num},${pageNum},${count})">삭제</button>
content.jsp 상단에 자바스크립트 함수 추가
function del(num,pageNum,count)
{
//alert(num+","+pageNum+","+count);
if(count>0){
var ans=confirm(count+"개의 댓글이 있습니다\n모두 삭제하시겠습니까?");
//취소를 누르면 그냥 함수 종료
if(ans==false)
return;
}
location.href="board/delete.do?num="+num+"&pageNum="+pageNum;
}
BoardSql.xml에 삭제 sql 추가
<delete id="boardDelete" parameterType="int">
delete from reboard where num=#{num}
</delete>
<delete id="answerDeleteByNum" parameterType="int">
delete from boardanswer where num=#{num}
</delete>
DAO
public void deleteBoard(int num)
{
session=getSession();
session.delete("boardDelete",num);
session.close();
}
public void deleteAnswerByNum(int num)
{
session=getSession();
session.delete("answerDeleteByNum",num);
session.close();
}
BoardDeleteServlet
@WebServlet("/board/delete.do")
public class BoardDeleteServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//1. num,pageNum 읽기
int num=Integer.parseInt(request.getParameter("num"));
String pageNum=request.getParameter("pageNum");
//2. dao,adao 선언
BoardDao dao=new BoardDao();
BoardAnswerDao adao=new BoardAnswerDao();
//3. 댓글 갯수가 0개 이상이면 num 에 해당하는 글 모두 삭제
if(adao.getAnswerList(num).size()>0)
{
adao.deleteAnswerByNum(num);
}
//4. 업로드한 파일이 save 폴더에 존재하면 파일도 삭제
String realPath=request.getServletContext().getRealPath("/save");
File file=new File(realPath+"\\"+dao.getData(num).getImagename());
System.out.println(realPath+"\\"+dao.getData(num).getImagename());
if(file.exists())
file.delete();
//5. 원글 삭제
dao.deleteBoard(num);
//6. 목록으로 이동(페이지번호 전달)
response.sendRedirect("../index.jsp?main=board/list.do?pageNum="+pageNum);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
17. 제목 앞에 원글이 삭제된 답글 넣기
sql
<select id="getSuperCount" parameterType="bdto" resultType="int">
select count(*) from reboard where restep=(#{restep}-1) and
groupno=#{groupno}
</select>
DAO
public int getSuperCount(BoardDto dto)
{
session=getSession();
int n=session.selectOne("getSuperCount",dto);
session.close();
return n;
}
DTO
private int supercount;
public int getSupercount() {
return supercount;
}
public void setSupercount(int supercount) {
this.supercount = supercount;
}
BoardListServlet
for(BoardDto dto:list)
{
if(dao.getSuperCount(dto)==0)
dto.setSupercount(0);
else
dto.setSupercount(1);
}
boardlist.jsp
<!-- 원글 삭제인경우 출력하기 -->
<c:if test="${dto.supercount==0 and dto.restep!=0}">
<span style="color: red;">[원글이 삭제된 답글]</span>
</c:if>
Comments