Servlet 생성 시 나오는 항목들 알아보기
super() 는 어떤 역할일까
MyInfo 페이지에 자신이 봤던 글 목록 출력하기 - 아직 LIMIT 은 안해둠
내가 DTO 는 BoardDTO 그대로 가져가도 충분하여 BoardDTO 로 사용한 것과
선생님이 Map 으로 그냥 만든 것 두가지
// 자신이 읽은 글 목록 출력하기, 내가 만든 것
List<BoardDTO> readList = bdao.readList((String)session.getAttribute("mid"));
request.setAttribute("readList", readList);
// 자신이 읽은 글 목록 출력하기, 선생님이 해주는 거
List<Map<String, Object>> readData = dao.readData(dto);
request.setAttribute("readData", readData);
내가 BoardDAO 에 새로 method 생성
public List<BoardDTO> readList(String mid) {
List<BoardDTO> list = null;
Connection conn = dbConn.getConn();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "SELECT * FROM visitview WHERE mno=(SELECT mno FROM c23c_26.member WHERE mid=?)";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, mid);
rs = pstmt.executeQuery();
list = new ArrayList<BoardDTO>();
while (rs.next()) {
BoardDTO dto = new BoardDTO();
dto.setNo(rs.getInt("board_no"));
dto.setTitle(rs.getString("board_title"));
dto.setDate(rs.getString("vdate"));
dto.setMno(rs.getInt("mno"));
list.add(dto);
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("BoardDAO - readList 오류");
}
return list;
}
DB 에도 따로 view 생성
출력문 -> myInfo.jsp
<article class="visitTable">
<h3>내가만든거</h3>
<table>
<thead>
<tr>
<th>글번호</th>
<th>글제목</th>
<th>방문시각</th>
</tr>
</thead>
<tbody>
<c:forEach items="${readList }" var="read">
<tr>
<td>${read.no }</td>
<td class="visitTitle"><a href="./detail?no=${read.no }">${read.title }</a></td>
<td>${read.date}</td>
</tr>
</c:forEach>
</tbody>
</table>
</article>
선생님이 작성한 내용의 DAO
public List<Map<String, Object>> readData(MemberDTO dto) {
List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
Connection conn = dbConn.getConn();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "SELECT v.vno, v.board_no, v.mno, "
+ "v.vdate, b.board_title FROM visitcount v "
+ "JOIN board b ON v.board_no = b.board_no "
+ "WHERE v.mno=(SELECT mno FROM c23c_26.member "
+ "WHERE c23c_26.member.`mid`=?)"
+ "ORDER BY v.vdate desc;";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, dto.getMid());
rs = pstmt.executeQuery();
while (rs.next()) {
Map<String, Object> map = new HashMap<>();
map.put("vno", rs.getInt("vno"));
map.put("board_no", rs.getInt("board_no"));
map.put("board_title", rs.getString("board_title"));
// map.put("mno", rs.getInt("mno"));
map.put("vdate", rs.getString("vdate"));
data.add(map);
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("MemberDAO - readData 오류");
} finally {
close(conn, pstmt, rs);
}
return data;
}
SQL 쿼리문에 JOIN 과 서브쿼리를 사용하여 작성
선생님꺼 출력문, 시간도 따로 세팅하는 것을 시연
<article class="teacherTable">
<h3>선생님꺼따라하기</h3>
<table>
<thead>
<tr>
<th>번호</th>
<th>글번호</th>
<th>제목</th>
<th>조회 시간</th>
</tr>
</thead>
<tbody>
<c:forEach items="${readData }" var="readData">
<tr>
<td>${readData.vno }</td>
<td>${readData.board_no }</td>
<td onclick="location.href='./detail?no=${readData.board_no }'">${readData.board_title }</td>
<fmt:parseDate value="${readData.vdate }" var="date" pattern="yyyy-MM-dd HH:mm:ss"/>
<td><fmt:formatDate value="${date }" pattern="yy년 MM월 dd일 HH시 mm분"/></td>
<%-- <td>${readData.vdate }</td> --%>
</tr>
</c:forEach>
</tbody>
</table>
</article>
현재 내용쓰는 칸은 summernote 로 인해 </div> 등 잘 막히지만
제목이나 댓글은 </div> 등 다른 태그를 작성하면 먹힘
해당 내용 막아보기 -> Util.java 에서 막는 것 만들기
public static String removeTag(String str) {
str = str.replaceAll("<", "<");
str = str.replaceAll(">", ">");
return str;
}
단지 <, > 기호를 HTML 에서 사용하는 코드로 변경할 뿐
다음은 엔터 처리해주기
public static String addBR(String str) {
return str.replaceAll("(\r\n|\r|\n|\n\r)", "<br>");
}
코드 중 엔터 처리하는 것들은 다 br 태그로 변경
중요한 것은 특수기호 처리한 후에 적어야 함 -> 처리를 미리 해버리면 br태그도 <br> 로 변경됨
commentContent = Util.addBR(commentContent);
title 에는 엔터 안넣음
게시글에 IP 출력하기
DB board 와 comment 쪽에 ip 넣음
이후 게시글과 댓글 불러오기 때에도 ip 불러오기
public BoardDTO detail(int no) {
BoardDTO dto = new BoardDTO();
Connection conn = DBConnection.getInstance().getConn();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "SELECT b.board_no, b.board_title, b.board_content, m.mname, m.mid,"
+ "b.board_date, b.board_ip, "
+ "(SELECT COUNT(*) FROM visitcount WHERE board_no=b.board_no) AS board_count "
+ "FROM board b JOIN member m "
+ "ON b.mno = m.mno WHERE board_no=?";
// boardCountPlus(no, conn);
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, no);
rs = pstmt.executeQuery();
if (rs.next()) {
dto.setNo(rs.getInt("board_no"));
dto.setTitle(rs.getString("board_title"));
dto.setContent(rs.getString("board_content"));
dto.setDate(rs.getString("board_date"));
dto.setCount(rs.getInt("board_count"));
dto.setIp(rs.getString("board_ip"));
// dto.setWrite(rs.getString("board_write"));
dto.setWrite(rs.getString("mname"));
dto.setMid(rs.getString("mid"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(conn, pstmt, rs);
}
return dto;
}
DB 에 저장되는 IP를 중간에 마킹한 IP로 하고싶지만
나중에 ip를 조회할 일이 있을 경우 전체 ip가 필요하여 출력만 마킹된 ip로 하기로 함
Util 쪽에 ip 를 마킹해주는 메소드 생성
나는 substring 과 indexOf 를 사용하여 하였지만
ChatGPT 는 split 을 이용하여 진행, 이것이 더 좋은 듯
.
public static String changeIp(String str) {
str = str.substring(0, str.indexOf(".") + 1) + "○" + str.substring(str.indexOf(".",4));
return str;
}
public static String changeIp2(String ip) {
if (ip.indexOf(".") != -1) {
String[] temp = ip.split("\\."); // . 은 무작위라는 뜻이 있지만 \. 은 실제 . 을 찾음
temp[1] = "○"; // \ 을 입력하기 위해서는 앞에 \ 를 붙여줘야 함 그래서 \\. 입력
ip = String.join(".", temp); // 배열을 합쳐주는 메소드, 배열 사이에 . 입력
}
return ip;
}
리턴된 문자열을 따로 request.setAttribute 로 세팅해줌
String ip = Util.changeIp(dto.getIp());
request.setAttribute("ip", ip);
JSP 에서 ip는 따로 출력
<span class="visitIP">${ip }</span> <span>${detail.count }</span>
-> 이렇게 출력됨
기존에 작성된 게시글이나 댓글들은 IP 가 null 일 경우 처리하는 방법을 알고 싶었으나
내 실력 부족으로,, 실패..
'HTML' 카테고리의 다른 글
240125 HTML 홈페이지 만들기 (0) | 2024.01.25 |
---|---|
240124 HTML 홈페이지 만들기 (0) | 2024.01.24 |
240122 HTML 홈페이지 (0) | 2024.01.22 |
240120 HTML 공부 (0) | 2024.01.20 |
240119 HTML 홈페이지 이어 만들기 (0) | 2024.01.19 |