[Java] 답변형 게시판 만들기(2)

지난포스팅에 이어서 계속 진행해 봅시다!

11. 상대 주소 개념 알기

서블렛에서 로직 처리 후 특정 페이지로 보내고 싶을때…

  1. 가고싶은 페이지가 jsp인 경우
RequestDispatcher rd = request.getRequestDispatcher("boardList.jsp");
rd.include(request, response);
  1. 가고싶은 페이지가 .do인 경우(타 서블렛)

  2. 이전 페이지에서 action으로 넘어온 경우

  3. response.sendRedirect("../index.jsp?main=board/content.do?num="+ num + "&pageNum=" + pageNum);
    
  4. 이전 페이지에서 location.href로 넘어온 경우

  5. 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>

Categories:

Updated:

Comments