캐싱
브라우저는 캐싱을 한다
톰캣은 캐싱을 하지 않는다
------------------------------
보통 데이터베이스 테이블에는
createDate와 updateDate가 있어야 한다!
------------------------------
join.js를 만들고 join.jsp 안의 자바스크립트를 넣기
백틱 사용
join.jsp 아래쪽에 자바스크립트주소를 넣는다.
-----------------------------------
글쓰기 기능
nav.jsp
BoardController.java
Script.java
메시지만 출력하는 기능추가
BoardWriteAction.java
write.jsp 만들기
nav와 footer를 포함해준다
부트스트랩에서 디자인 찾기
write.jsp
----------------------------------
잘못된 접근 막기
authentication.jsp 생성
잘못된 접근을 막기 위함
write.jsp
authentication 추가
-----------------------------------
섬머노트 추가하기
BoardController
boardWriteProcAction
package com.cos.blog.action.board;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.cos.blog.action.Action;
import com.cos.blog.model.Board;
import com.cos.blog.model.Users;
import com.cos.blog.repository.BoardRepository;
import com.cos.blog.util.Script;
public class BoardWriteProcAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 0번 인증 확인
HttpSession session = request.getSession();
if (session.getAttribute("principal") == null) {
Script.getMessage("잘못된 접근입니다.", response);
return;
}
;
// 1번 request에 title값과 content값 null인지 공백인지확인
if (request.getParameter("title") == null || request.getParameter("title").equals("")) {
Script.back("제목을 입력해주세요.", response);
return;
} else if (request.getParameter("content") == null || request.getParameter("content").equals("")) {
Script.back("내용을 입력해주세요.", response);
return;
}
// 2번 request에 title값과 content, principal.getId()값 받기
String title = request.getParameter("title");
String content = request.getParameter("content") != null ? request.getParameter("content") : "";
Users user = (Users) session.getAttribute("principal");
int userId = user.getId();
Board board = Board.builder().title(title).content(content).userId(userId).build();
// 3번 BoardRepository 연결해서 save(board객체) 함수 호출
BoardRepository boardRepository = BoardRepository.getInstance();
int result = boardRepository.save(board);
if (result == 1) {
Script.href("글 등록에 성공하였습니다.", "/blog/board?cmd=home", response);
} else {
Script.back("글 등록에 실패하였습니다. 제목과 내용을 확인하세요.", response);
}
}
}
nav.jsp
섬머노트 관련 스크립트 추가
writeSummer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@include file="../include/nav.jsp"%>
<%@include file="../include/authentication.jsp"%>
<div class="container">
<form action="/blog/board?cmd=writeProc" method="post" onsubmit="return validate()">
<div class="form-group">
<label for="title">Title:</label>
<input type="text" class="form-control" placeholder="title" id="title" name="title" required>
</div>
<div class="form-group">
<label for="content">Content:</label>
<textarea class="form-control" rows="5" placeholder="내용을 입력하세요" id="content" name="content"></textarea>
</div>
<button type="submit" class="btn btn-primary">글쓰기</button>
</form>
</div>
<script>
$('#content').summernote({
placeholder : 'Hello Bootstrap 4',
tabsize : 2,
height : 400
});
</script>
<script>
function validate() {
var test = $("#title").val();
var test1 = $("#content").text();
if (test == null || test == "") {
alert("제목을 입력해주세요.");
return false;
} else if (test1 == null || test1 == "") {
alert("내용을 입력해주세요.");
return false;
}
return true;
}
</script>
<%@include file="../include/footer.jsp"%>
BoardRepository
package com.cos.blog.repository;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.cos.blog.db.DBConn;
import com.cos.blog.model.Board;
import com.cos.blog.model.Users;
public class BoardRepository {
private static final String TAG = "BoardRepository : "; // TAG 생성 (오류 발견시 용이)
private static BoardRepository instance = new BoardRepository();
private BoardRepository() {
}
public static BoardRepository getInstance() {
return instance;
}
private Connection conn = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
// 글쓰기
public int save(Board board) { // object 받기(안에 내용 다 받아야 하니까)
final String SQL = "INSERT INTO board(id, userid, title, content, createDate) "
+ "VALUES(BOARD_SEQ.nextval,?,?,?,sysdate)";
try {
conn = DBConn.getConnection(); // DB에 연결
pstmt = conn.prepareStatement(SQL);
pstmt.setInt(1, board.getUserId());
pstmt.setString(2, board.getTitle());
pstmt.setString(3, board.getContent());
// 물음표 완성하기
return pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
System.out.println(TAG + "save : " + e.getMessage());
} finally {
DBConn.close(conn, pstmt, rs);
}
return -1; // 실패시
}
// 회원정보 수정
public int update(Board board) { // object 받기(안에 내용 다 받아야 하니까)
final String SQL = "";
try {
conn = DBConn.getConnection(); // DB에 연결
pstmt = conn.prepareStatement(SQL);
// 물음표 완성하기
return pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
System.out.println(TAG + "Update : " + e.getMessage());
} finally {
DBConn.close(conn, pstmt, rs);
}
return -1; // 실패시
}
// 회원정보 삭제
public int deleteById(int id) { // object 받기(안에 내용 다 받아야 하니까)
final String SQL = "";
try {
conn = DBConn.getConnection(); // DB에 연결
pstmt = conn.prepareStatement(SQL);
// 물음표 완성하기
return pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
System.out.println(TAG + "Delete : " + e.getMessage());
} finally {
DBConn.close(conn, pstmt, rs);
}
return -1; // 실패시
}
// 회원정보 다 찾기
public List<Board> findAll() { // object 받기(안에 내용 다 받아야 하니까)
final String SQL = "";
List<Board> boards = new ArrayList<>();
try {
conn = DBConn.getConnection(); // DB에 연결
pstmt = conn.prepareStatement(SQL);
// 물음표 완성하기
// while 돌려서 rs -> java오브젝트에 집어넣기
return boards;
} catch (SQLException e) {
e.printStackTrace();
System.out.println(TAG + "findAll : " + e.getMessage());
} finally {
DBConn.close(conn, pstmt, rs);
}
return null; // 실패시
}
// 회원정보 한 건 찾기
public Board findById(int id) { // object 받기(안에 내용 다 받아야 하니까)
final String SQL = "";
Board board = new Board();
try {
conn = DBConn.getConnection(); // DB에 연결
pstmt = conn.prepareStatement(SQL);
// 물음표 완성하기
// if 돌려서 rs -> java오브젝트에 집어넣기
return board;
} catch (SQLException e) {
e.printStackTrace();
System.out.println(TAG + "findById : " + e.getMessage());
} finally {
DBConn.close(conn, pstmt, rs);
}
return null; // 실패시
}
}
결과
------------------------------------
홈화면에 미리보기 출력하기
BoardRepository
package com.cos.blog.repository;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.cos.blog.db.DBConn;
import com.cos.blog.model.Board;
import com.cos.blog.model.Users;
public class BoardRepository {
private static final String TAG = "BoardRepository : "; // TAG 생성 (오류 발견시 용이)
private static BoardRepository instance = new BoardRepository();
private BoardRepository() {
}
public static BoardRepository getInstance() {
return instance;
}
private Connection conn = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
// 글쓰기
public int save(Board board) { // object 받기(안에 내용 다 받아야 하니까)
final String SQL = "INSERT INTO board(id, userid, title, content, createDate) "
+ "VALUES(BOARD_SEQ.nextval,?,?,?,sysdate)";
try {
conn = DBConn.getConnection(); // DB에 연결
pstmt = conn.prepareStatement(SQL);
pstmt.setInt(1, board.getUserId());
pstmt.setString(2, board.getTitle());
pstmt.setString(3, board.getContent());
// 물음표 완성하기
return pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
System.out.println(TAG + "save : " + e.getMessage());
} finally {
DBConn.close(conn, pstmt, rs);
}
return -1; // 실패시
}
// 회원정보 수정
public int update(Board board) { // object 받기(안에 내용 다 받아야 하니까)
final String SQL = "";
try {
conn = DBConn.getConnection(); // DB에 연결
pstmt = conn.prepareStatement(SQL);
// 물음표 완성하기
return pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
System.out.println(TAG + "Update : " + e.getMessage());
} finally {
DBConn.close(conn, pstmt, rs);
}
return -1; // 실패시
}
// 회원정보 삭제
public int deleteById(int id) { // object 받기(안에 내용 다 받아야 하니까)
final String SQL = "";
try {
conn = DBConn.getConnection(); // DB에 연결
pstmt = conn.prepareStatement(SQL);
// 물음표 완성하기
return pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
System.out.println(TAG + "Delete : " + e.getMessage());
} finally {
DBConn.close(conn, pstmt, rs);
}
return -1; // 실패시
}
// 회원정보 다 찾기
public List<Board> findAll() { // object 받기(안에 내용 다 받아야 하니까)
final String SQL = "SELECT id, userid, title, content, readcount, createdate FROM board ORDER BY id DESC";
List<Board> boards = new ArrayList<>();
try {
conn = DBConn.getConnection(); // DB에 연결
pstmt = conn.prepareStatement(SQL);
rs = pstmt.executeQuery();
// while 돌려서 rs -> java오브젝트에 집어넣기
while (rs.next()) {
System.out.println(rs.getInt(1));
Board board = Board.builder()
.id(rs.getInt(1))
.userId(rs.getInt(2))
.title(rs.getString(3))
.content(rs.getString(4))
.readCount(rs.getInt(5))
.createDate(rs.getTimestamp(6))
.build();
boards.add(board);
}
return boards;
} catch (SQLException e) {
e.printStackTrace();
System.out.println(TAG + "findAll : " + e.getMessage());
} finally {
DBConn.close(conn, pstmt, rs);
}
return null; // 실패시
}
// 회원정보 한 건 찾기
public Board findById(int id) { // object 받기(안에 내용 다 받아야 하니까)
final String SQL = "";
Board board = new Board();
try {
conn = DBConn.getConnection(); // DB에 연결
pstmt = conn.prepareStatement(SQL);
// 물음표 완성하기
// if 돌려서 rs -> java오브젝트에 집어넣기
return board;
} catch (SQLException e) {
e.printStackTrace();
System.out.println(TAG + "findById : " + e.getMessage());
} finally {
DBConn.close(conn, pstmt, rs);
}
return null; // 실패시
}
}
home.jsp
<%@page import="com.cos.blog.model.Users"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@include file="include/nav.jsp"%>
<div class="container">
<c:forEach var="board" items="${boards}">
<div class="card m-2" style="width: 100%">
<div class="card-body">
<h4 class="card-title">${board.title}</h4>
<p class="card-text">${board.content}</p>
<a href="#" class="btn btn-primary">상세보기</a>
</div>
</div>
</c:forEach>
</div>
<%@include file="include/footer.jsp"%>
BoardHomeAction.java
package com.cos.blog.action.board;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.cos.blog.action.Action;
import com.cos.blog.model.Board;
import com.cos.blog.repository.BoardRepository;
public class BoardHomeAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
BoardRepository boardRepository = BoardRepository.getInstance();
List<Board> boards = boardRepository.findAll();
if(boards != null) {
for (Board board : boards) {
String preview = board.getContent();
preview = preview.substring(0, preview.length())+"...";
board.setContent(preview);
}
}
request.setAttribute("boards", boards);
RequestDispatcher dis = request.getRequestDispatcher("home.jsp");
dis.forward(request, response);
}
}
'낙서장' 카테고리의 다른 글
부트스트랩과 비슷한 사이트 (0) | 2020.06.04 |
---|---|
이클립스 자동 import (0) | 2020.06.04 |
이클립스 JSP 키세팅 변경하기 // 정렬 // 주석 // 단축키 //키맵 // 자동완성 (0) | 2020.06.02 |
크롬 F12 network (0) | 2020.06.01 |
I/O를 줄이는 법 // 서버와 DB이용 // 암호화 (0) | 2020.06.01 |