코딩항해기

[실습/JSP] 댓글 프로그램 만들기 (+풀이 0807) 본문

problem solving/과제&실습 코딩

[실습/JSP] 댓글 프로그램 만들기 (+풀이 0807)

miniBcake 2024. 8. 7. 12:43

 

 

[실습]

배운 내용을 적절히 활용해서 다음 내용 구현하기.

a.jsp에서는방문자의 이름을 등록한다.

a에서 설정한 이름으로 b.jsp에서 댓글을 쓸 수 있다.

c.jsp에서 댓글을 등록하는 로직을 구현하기.

사용자가 a↔b페이지를 이동해도 댓글을 써왔던 목록들은 유지된다.

 

[로직]

  1. a에서 입력받은 이름을 세션에 저장하며 b로 이동한다.
  2. b에서 댓글 내용을 입력받아 c로 이동하며,
  3. c에서는 사용자 명과 함께 댓글이 세션에 저장된다.
  4. b로 이동하여 댓글을 추가 입력받거나 댓글을 보여준다.

 

a.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>a</title>
</head>
<body>
	<h1>A</h1>
	<form action="b.jsp" method="POST">
		<input type="text" name="name" placeholder="사용자 명을 입력하세요." required>
		<input type="submit" value="입장">
	</form>
</body>
</html>

 

 

b.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>b</title>
</head>
<body>
<%
	if(request.getParameter("name") != null){//넘어오는 값이 있다면
		session.setAttribute("user", request.getParameter("name"));//세션 user명 갱신
	}
%>

<h1>B</h1>
<a href="a.jsp">처음으로 돌아가기</a>
<hr>
<form action="c.jsp" method="POST">
	<%= session.getAttribute("user") %>님의 댓글 : 
	<input type="text" name="reply" placeholder="댓글 내용을 입력하세요." required>
	<input type="submit" value="댓글 등록">
</form>
<hr>
<ul>

	<%
	if(session.getAttribute("replyList") != null){ //댓글이 한 개라도 있다면
		try{
			for(String reply : (ArrayList<String>)session.getAttribute("replyList")){
				out.println("<li>"+reply+"</li>"); //댓글 출력
			}
		}
		catch(ClassCastException e){
			e.printStackTrace();
		}
	}
	%>

</ul>
</body>
</html>

 

 

c.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>c</title>
</head>
<body>
<% 
	ArrayList<String> replyList = new ArrayList<>();//댓글리스트
	
	if(session.getAttribute("replyList") != null){ //기존 댓글 내역이 있다면
		try{
			replyList.addAll((ArrayList<String>)session.getAttribute("replyList")); 
			//새 댓글리스트에 옮겨주기
		}
		catch(ClassCastException e){
			e.printStackTrace();
		}
	}
	
	replyList.add(session.getAttribute("user")+"님 >> "+request.getParameter("reply")); //저장할 데이터
	session.setAttribute("replyList", replyList);//세션 댓글리스트 갱신
	
	response.sendRedirect("b.jsp");//페이지 이동
%>
</body>
</html>

 

 

[결과]

 

 

[풀이 후 보완할 점]

가독성을 높이고 하드코딩을 방지하기 위해 변수를 선언해 상단 배치하고 사용하는 것이 좋다.

c.jsp는 V파트가 아니므로 화면이 필요없다. !Document html 태그들이 전부 필요없다.

지금은 댓글이 새로 들어올 때마다 new가 실행되는데 첫 댓글 때만 만들어지도록 하면 new를 줄일 수 있다.

session에서 ArrayList를 받아와서 값을 넣으면 된다. (캐스팅을 해주지 않아 관련 메서드가 뜨지 않았던 것이다.)

더보기

b

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.ArrayList"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>b</title>
</head>
<body>
<%
	String name = request.getParameter("name");
	String user = ""+session.getAttribute("user");
	if(name != null){//넘어오는 값이 있다면
		session.setAttribute("user", name);//세션 user명 갱신
	}
%>

<h1>B</h1>
<a href="a.jsp">처음으로 돌아가기</a>
<hr>
<form action="c.jsp" method="POST">
	<%= user %>님의 댓글 : 
	<input type="text" name="reply" placeholder="댓글 내용을 입력하세요." required>
	<input type="submit" value="댓글 등록">
</form>
<hr>
<ul>

	<%
	ArrayList<String> replyList = (ArrayList<String>)session.getAttribute("replyList");
	if(replyList != null){ //댓글이 한 개라도 있다면
		try{
			for(String reply : replyList){
				out.println("<li>"+reply+"</li>"); //댓글 출력
			}
		}
		catch(ClassCastException e){
			e.printStackTrace();
		}
	}
	else{
		out.println("<div style='color:gray;'>아직 작성된 댓글이 없습니다...</div>");
	}
	%>

</ul>
</body>
</html>

 

c