1.해당 열을 먼저 생성한 후 마우스 우측버튼 클릭해서 새 인덱스 생성-primary key 선택하면 된다

상단 우측에 CREATE 코드 부분에 가면 PRIMARY KEY 열이 생성된 것을 확인할 수 있다.

 

AUTO_INCREMENT는 기본값 누르고 하단에 선택버튼이 있음

 

 

doPost() 를 사용함

get() 메서드가 필요한데 당연히 내 로직엔 없음

 

public class BoardUpdateServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException{

doPost(request, response);

}

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

request.setCharacterEncoding("UTF-8");

response.setContentType("text/html; charset=UTF-8");

 

 

 

 

이 부분을 추가해주면 해결완료

public class BoardUpdateServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException{

doPost(request, response);

}

 

 

 

url 만 입력하면 메서드 get을 기본으로 호출한다고 함

그래서 doGet()~ 부분을 추가해주는 것

혹시 다른 방법이 있나 찾아볼 것

 

 

 

[참고한 블로그]

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=bk2703&logNo=150017613219 

 

HTTP Status 405 - HTTP method GET is not supported by this URL

HTTP Status 405 - HTTP method GET is not supported by this URLtype : Status reportme...

blog.naver.com

 

 

 

BoardPostServlet에서 

 

@WebServlet("/Board/BoardPost")

public class BoardPostServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

request.setCharacterEncoding("UTF-8");

BoardMgr bMgr = new BoardMgr();

bMgr.insertBoard(request);

 

response.sendRedirect("list.jsp");

}

}

list.jsp 페이지로 이동이 안됨

상위 폴더 전부 추가해도 안되길래 같은 폴더명에 넣어주면 될까 싶어서 webcontent 폴더에 Board 폴더 만들어서 list.jsp 파일 넣어주니 잘 된다

 

원래 이렇게 하는 건가.........다른 방법이 없는지 다시 공부해보기

절대경로, 상대경로 공부

 

 

 

 

 

 

좀 더 찾아보니 

 

 

같은 폴더에 있는 경우

 

"list.jsp"

 

 

 

상위 폴더에 있는 경우

 

"../list.jsp"

 

 

 

상위 폴더 / 다른 폴더에 있는 경우

 

"../ch17/write/list.jsp"

 

 

 

하위 폴더에 있는 경우

 

"ch17/write/list.jsp"

 

 

 

 

내 경우에는 하위 폴더에 있는 경우라서 ch17/wrtie/list.jsp 로만 입력했는데

상위 폴더의 다른 폴더에 있는 경우로 입력하니 페이지가 출력되더라 

하위폴더면 해당 위치의 하위폴더를 말하는 건데 순간 헷갈려서 머리가 터질뻔했다.

어쨌든 해결! 앞으로도 파일경로때문에 골치아플 일은 적어지겠지.

제대로 원인을 알고 해결법을 찾으니 너무 신난다~

 

우선 mysql을 연결해주기 위해서 webcontent - wed-inf - lib 폴더에 mysql-connector-java-bin.jar 파일을 넣어줘야 한다

 

1. mysal command line client 에서 데이터 베이스/테이블 생성

 

데이터베이스 생성

create database 데이터베이스명

 

테이블 생성

create table 테이블명(

 

);

 

2. 생성됐는지 확인

 

데이터베이스 사용

use 데이터베이스명

 

생성된 테이블 확인

show tables;

 

테이블 내용확인

desc 테이블명;

 

입력한 데이터 확인

select * from 테이블명;

 

3. DB 연결을 위해 작성된 jsp 파일에 입력

-jdbc 연결을 위한 드라이버

-mysql 데이터베이스 연동을 위한 주소

homepage 부분에 연동할 데이터베이스명을 넣어주면 됨

 

private String _driver = "org.gjt.mm.mysql.Driver",

_url = "jdbc:mysql://localhost:3306/homepage?useUnicode=true&characterEncoding=UTF-8",

_user = "root",

_password = "root";

 

 

 

mysql 데이터베이스 생성했는데 계속

Unknown database 'mydb'

에러가 나면서 내가 생성하지 않은 데이터베이스명이 떴다.

DBConnection.java 파일에서 연결주소의 데이터명을 내가 생성한 데이터베이스명으로 수정해주면 된다.

 

 

 

https://saintclair.tistory.com/67

 

Jsp 게시판 만들기 - 에러 : 게시물 한글만 깨짐(해결중..)

이런식으로 게시물 작성하면 제목과 내용의 한글이 ???로 나온다 1. 설정 전부 UTF-8로 변경해봄 -> 실패 ->해결안됨 2. 톰캣 설치 후 server.xml 파일에 URIEncoding="UTF-8" 을 추가했으면 jsp 파일에 있는 맨

saintclair.tistory.com

 

 

1. main.jsp 코드 추가

 

<div class="container">

<div class="jumbotron">

<div class="container">

<h1>웹사이트 소개</h1>

<p>이 웹 사이트는 부트스트랩으로 만든 JSP 웹 사이트입니다. 최소한의 간단한 로직만을 이용해서 개발했습니다.</p>

<p><a class="btn btn-primary btn-pull" href="#" role="button">자세히 알아보기</a>

</div>

</div>

</div>

<div>

 

위치

 

 

 

 

2. 글씨체 변경을 위해 css 파일 추가생성

[ css 폴더에 custom.css 파일 생성 ]

@import url(http://fonts.googleapis.com/earlyaccess/nanumgothic.css);

@import url(http://fonts.googleapis.com/earlyaccess/hanna.css);

*{

font-family : 'Nanum Gothic';

}

h1{

font-family : 'Hanna';

}

 

 

 

 

 

전체 적용을 위해 Action파일 제외한 모든 jsp 파일에 코드 추가

<link rel="stylesheet" href="css/custom.css">

 

 

 

4. 메인 페이지 이미지 변경

webcontent 폴더에 images 폴더 생성 후 이미지 3개 정도 넣어주기

메인페이지에 이미지 슬라이드 넣어주는 코드 추가

 

 

<div class="container">

<div class="jumbotron">

<div class="container">

<h1>웹사이트 소개</h1>

<p>이 웹 사이트는 부트스트랩으로 만든 JSP 웹 사이트입니다. 최소한의 간단한 로직만을 이용해서 개발했습니다.</p>

<p><a class="btn btn-primary btn-pull" href="#" role="button">자세히 알아보기</a>

</div>

</div>

</div>

<div>

<div class="container">

<div id="myCarousel" class="carousel slide" data-ride="carousel">

<ol class="carousel-indicators">

<li data-target="#myCarousel" data-slide-to="0" class="active"></li>

<li data-target="#myCarousel" data-slide-to="1"></li>

<li data-target="#myCarousel" data-slide-to="2"></li>

</ol>

<div class="carousel-inner">

<div class="item active">

<img src="images/1.jpg">

</div>

<div class="item">

<img src="images/2.jpg">

</div>

<div class="item">

<img src="images/3.jpg">

</div>

</div>

<a class="left carousel-control" href="#myCarousel" data-slide="prev">

<span class="glyphicon glyphicon-chevron-left"></span>  //아이콘 넣어주기

</a>

<a class="right carousel-control" href="#myCarousel" data-slide="next">

<span class="glyphicon glyphicon-chevron-right"></span>

</a>

</div>

</div>

 

 

참고

동빈나 유투브

1. BbsDAO.java 

함수 추가(수정/삭제 기능)

 

package bbs;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.ArrayList;

public class BbsDAO {

 

private Connection conn;

private ResultSet rs;

 

public BbsDAO() { //데이터 접근 객체

try {

String dbURL = "jdbc:mysql://localhost:3306/BBS";

String dbID ="root";

String dbPassword = "1234";

Class.forName("com.mysql.jdbc.Driver");

conn = DriverManager.getConnection(dbURL, dbID, dbPassword );

} catch (Exception e) {

e.printStackTrace();

}

}

 

public String getDate() {

String SQL = "SELECT NOW()";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

rs = pstmt.executeQuery();

if(rs.next()) {

return rs.getString(1);

}

} catch (Exception e) {

e.printStackTrace();

}

return ""; //데이터베이스 오류

}

 

public int getNext() {

String SQL = "SELECT bbsID FROM BBS ORDER BY bbsID DESC";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

rs = pstmt.executeQuery();

if(rs.next()) {

return rs.getInt(1) + 1;

}

return 1; //첫 버째 게시물인 경우

} catch (Exception e) {

e.printStackTrace();

}

return -1; //데이터베이스 오류

}

 

public int write(String bbsTitle, String userID, String bbsContent) {

String SQL = "INSERT INTO BBS VALUES(?, ?, ?, ?, ?, ?)";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setInt(1, getNext());

pstmt.setString(2, bbsTitle);

pstmt.setString(3, userID);

pstmt.setString(4, getDate());

pstmt.setString(5, bbsContent);

pstmt.setInt(6, 1);

return pstmt.executeUpdate();

} catch (Exception e) {

e.printStackTrace();

}

return -1; //데이터베이스 오류

}

public ArrayList<Bbs> getList(int pageNumber){

String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";

ArrayList<Bbs> list = new ArrayList<Bbs>();

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);

rs = pstmt.executeQuery();

while (rs.next()) {

Bbs bbs = new Bbs();

bbs.setBbsID(rs.getInt(1));

bbs.setBbsTitle(rs.getString(2));

bbs.setUserID(rs.getString(3));

bbs.setBbsDate(rs.getString(4));

bbs.setBbsContent(rs.getString(5));

bbs.setBbsAvailable(rs.getInt(6));

list.add(bbs);

}

} catch (Exception e) {

e.printStackTrace();

}

return list;

}

public boolean nextPage(int pageNumber) {

String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);

rs = pstmt.executeQuery();

if(rs.next()) {

return true;

}

} catch (Exception e) {

e.printStackTrace();

}

return false;

 

}

 

public Bbs getBbs(int bbsID) {

String SQL = "SELECT * FROM BBS WHERE bbsID = ?";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setInt(1, bbsID);

rs = pstmt.executeQuery();

if(rs.next()) {

Bbs bbs = new Bbs();

bbs.setBbsID(rs.getInt(1));

bbs.setBbsTitle(rs.getString(2));

bbs.setUserID(rs.getString(3));

bbs.setBbsDate(rs.getString(4));

bbs.setBbsContent(rs.getString(5));

bbs.setBbsAvailable(rs.getInt(6));

return bbs;

}

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

 

 

//여기부터 추가(수정/삭제)

 

public int update(int bbsID, String bbsTitle, String bbsContent) {

String SQL = "UPDATE BBS SET bbsTitle = ?, bbsContent = ? WHERE bbsID = ?";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setString(1, bbsTitle);

pstmt.setString(2, bbsContent);

pstmt.setInt(3, bbsID);

return pstmt.executeUpdate();

} catch (Exception e) {

e.printStackTrace();

}

return -1; //데이터베이스 오류

}

 

public int delete(int bbsID) {

String SQL = "UPDATE BBS SET bbsAvailable = 0 WHERE bbsID = ?"

//글을 삭제하더라도 글에 대한 정보가 남아 있을 수 있도록 bbsAvailable 값만 0으로 바꾸는 걸로 delete함수 구현

// 뭔 말인지 모르겠음 다시 찾아서 정보 추가

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setInt(1, bbsID);

return pstmt.executeUpdate();

} catch (Exception e) {

e.printStackTrace();

}

return -1; //데이터베이스 오류

}

}

}

}

 

 

2. Update.jsp 생성(Write.jsp 내용복사해서 수정)

글수정 

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ page import="java.io.PrintWriter" %>

<%@ page import="bbs.Bbs" %>

<%@ page import="bbs.BbsDAO" %>

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<meta name="viewport" content="width=device-width", initial-scale="1">

<link rel="stylesheet" href="css/bootstrap.css">

<link rel="stylesheet" href="css/custom.css">

<title>JSP 게시판 웹 사이트</title>

</head>

<body>

<%

String userID = null;

if (session.getAttribute("userID") !=null){

userID = (String) session.getAttribute("userID");

}

if(userID == null){

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("alert('로그인을 하세요. ')");

script.println("location.href = 'login.jsp'");

script.println("</script>");

}

int bbsID = 0;

if(request.getParameter("bbsID") !=null){

bbsID=Integer.parseInt(request.getParameter("bbsID"));

}

if(bbsID == 0){

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("alert('유효하지 않은 글입니다.')");

script.println("location.href = 'bbs.jsp'");

script.println("</script>");

}

Bbs bbs = new BbsDAO().getBbs(bbsID);

if(!userID.equals(bbs.getUserID())){

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("alert('권한이 없습니다. ')");

script.println("location.href = 'bbs.jsp'");

script.println("</script>");

}

%>

<nav class="navbar navbar-default">

<div class="navbar-header">

<button type="button" class ="navbar-toggle collapsed"

data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">

<span class="icon-bar"></span>

<span class="icon-bar"></span>

<span class="icon-bar"></span>

</button>

<a class="navbar-brand" href="main.jsp">JSP 게시판 웹 사이트</a>

</div>

<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">

<ul class="nav navbar-nav">

<li><a href="main.jsp">메인</a></li>

<li class="active"><a href="bbs.jsp">게시판</a></li>

</ul>

<ul class="nav navbar-nav navbar-right">

<li class="dropdown">

<a href="#" class="dropdown-toggle"

data-toggle="dropdown" role="button" aria-haspopup="true"

aria-expanded="false">회원관리<span class="caret"></span></a>

<ul class="dropdown-menu">

<li><a href="logoutAction.jsp">로그아웃</a></li>

</ul>

</li>

</ul>

</div>

</nav>

<div class="contatiner">

<div class="row">

<form method="post" action="updateAction.jsp?bbsID=<%= bbsID %>">

<table class="table table-striped" style="text-align:center; border: 1px solid #dddddd">

<thead>

<tr>

<th colspan="2" style="background-color: #eeeeee; text-align: center;">게시판 글수정 양식</th>

</tr>

</thead>

<tbody>

<tr>

<td><input type="text" class="form-control" placeholder="글 제목" name="bbsTitle" maxlength="50" value="<%= bbs.getBbsTitle() %>"></td>   //수정 전 제목을 볼 수 있게 해줌

</tr>

<tr>

<td><textarea class="form-control" placeholder="글 내용" name="bbsContent" maxlength="2048" style="height:350px;"><%= bbs.getBbsContent()%></textarea></td>  ///수정 전 내용을 볼 수 있께

</tr>

</tbody>

</table>

<input type="submit" class="btn btn-primary pull-right" value="글수정">

</form>

</div>

</div>

<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>

<script src="js/bootstrap.js"></script>

</body>

</html>

}3. 

 3. updateAction.jsp 생성(writeAction.jsp 내용복사 후 수정)

글수정 기능 

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ page import = "bbs.BbsDAO" %>

<%@ page import = "bbs.Bbs" %>

<%@ page import = "java.io.PrintWriter" %>

<% request.setCharacterEncoding("UTF-8"); %>

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>JSP 게시판 웹 사이트</title>

</head>

<body>

<%

 

String userID = null;

if(session.getAttribute("userID") !=null){

userID = (String) session.getAttribute("userID");

}

if(userID == null){

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("alert('로그인을 하세요. ')");

script.println("location.href = 'login.jsp'");

script.println("</script>");

}

int bbsID = 0;

if(request.getParameter("bbsID") !=null){

bbsID=Integer.parseInt(request.getParameter("bbsID"));

}

if(bbsID == 0){

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("alert('유효하지 않은 글입니다.')");

script.println("location.href = 'bbs.jsp'");

script.println("</script>");

}

Bbs bbs = new BbsDAO().getBbs(bbsID);

if(!userID.equals(bbs.getUserID())){

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("alert('권한이 없습니다. ')");

script.println("location.href = 'bbs.jsp'");

script.println("</script>");

} else{

if(request.getParameter("bbsTitle") == null || request.getParameter("bbsContent") == null

|| request.getParameter("bbsTitle").equals("") || request.getParameter("bbsContent").equals("")){

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("alert('입력되지 않은 항목이 있습니다.')");

script.println("history.back()");

script.println("</script>");

} else{

BbsDAO bbsDAO = new BbsDAO();

int result = bbsDAO.update(bbsID, request.getParameter("bbsTitle"), request.getParameter("bbsContent"));

if(result == -1){

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("alert('글 수정에 실패했습니다.')");

script.println("history.back()");

script.println("</script>");

}

else {

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("location.href = 'bbs.jsp'");

script.println("</script>");

}

}

}

%>

</body>

</html>

 

 

 

 

 

4. deleteAction.jsp 생성

글 삭제 기능 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ page import = "bbs.BbsDAO" %>

<%@ page import = "bbs.Bbs" %>

<%@ page import = "java.io.PrintWriter" %>

<% request.setCharacterEncoding("UTF-8"); %>

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>JSP 게시판 웹 사이트</title>

</head>

<body>

<%

 

String userID = null;

if(session.getAttribute("userID") !=null){

userID = (String) session.getAttribute("userID");

}

if(userID == null){

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("alert('로그인을 하세요. ')");

script.println("location.href = 'login.jsp'");

script.println("</script>");

}

int bbsID = 0;

if(request.getParameter("bbsID") !=null){

bbsID=Integer.parseInt(request.getParameter("bbsID"));

}

if(bbsID == 0){

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("alert('유효하지 않은 글입니다.')");

script.println("location.href = 'bbs.jsp'");

script.println("</script>");

}

Bbs bbs = new BbsDAO().getBbs(bbsID);

if(!userID.equals(bbs.getUserID())){

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("alert('권한이 없습니다. ')");

script.println("location.href = 'bbs.jsp'");

script.println("</script>");

} else{

BbsDAO bbsDAO = new BbsDAO();

int result = bbsDAO.delete(bbsID);

if(result == -1){

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("alert('글 삭제에 실패했습니다. ')");

script.println("history.back()");

script.println("</script>");

}

else {

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("location.href = 'bbs.jsp'");

script.println("</script>");

}

}

%>

</body>

</html>

 

 

5. 삭제 여부를 다시 한번 묻는 창 띄우기

 view.jsp 수정

"return confirm('정말로 삭제하시겠습니까?')"

추가

 

 

 

 

 

 

 

}

<td><a href="view.jsp?bbsID=<%=list.get(i).getBbsID() %>"><%= list.get(i).getBbsTitle().replaceAll(" ", "&nbsp;").replaceAll("<","&lt;").replaceAll("\n", "<br>") %></a></td>

 

1. BbsDAO.jsp 코드수정

package bbs;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.ArrayList;

public class BbsDAO {

 

private Connection conn;

private ResultSet rs;

 

public BbsDAO() { //데이터 접근 객체

try {

String dbURL = "jdbc:mysql://localhost:3306/BBS";

String dbID ="root";

String dbPassword = "1234";

Class.forName("com.mysql.jdbc.Driver");

conn = DriverManager.getConnection(dbURL, dbID, dbPassword );

} catch (Exception e) {

e.printStackTrace();

}

}

 

public String getDate() {

String SQL = "SELECT NOW()";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

rs = pstmt.executeQuery();

if(rs.next()) {

return rs.getString(1);

}

} catch (Exception e) {

e.printStackTrace();

}

return ""; //데이터베이스 오류

}

 

public int getNext() {

String SQL = "SELECT bbsID FROM BBS ORDER BY bbsID DESC";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

rs = pstmt.executeQuery();

if(rs.next()) {

return rs.getInt(1) + 1;

}

return 1; //첫 버째 게시물인 경우

} catch (Exception e) {

e.printStackTrace();

}

return -1; //데이터베이스 오류

}

 

public int write(String bbsTitle, String userID, String bbsContent) {

String SQL = "INSERT INTO BBS VALUES(?, ?, ?, ?, ?, ?)";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setInt(1, getNext());

pstmt.setString(2, bbsTitle);

pstmt.setString(3, userID);

pstmt.setString(4, getDate());

pstmt.setString(5, bbsContent);

pstmt.setInt(6, 1);

return pstmt.executeUpdate();

} catch (Exception e) {

e.printStackTrace();

}

return -1; //데이터베이스 오류

}

public ArrayList<Bbs> getList(int pageNumber){

String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";

ArrayList<Bbs> list = new ArrayList<Bbs>();

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);

rs = pstmt.executeQuery();

while (rs.next()) {

Bbs bbs = new Bbs();

bbs.setBbsID(rs.getInt(1));

bbs.setBbsTitle(rs.getString(2));

bbs.setUserID(rs.getString(3));

bbs.setBbsDate(rs.getString(4));

bbs.setBbsContent(rs.getString(5));

bbs.setBbsAvailable(rs.getInt(6));

list.add(bbs);

}

} catch (Exception e) {

e.printStackTrace();

}

return list;

}

public boolean nextPage(int pageNumber) {

String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);

rs = pstmt.executeQuery();

if(rs.next()) {

return true;

}

} catch (Exception e) {

e.printStackTrace();

}

return false;

 

}

 

//하나의 글 내용을 불러오는 함수 추가

public Bbs getBbs(int bbsID) {  

String SQL = "SELECT * FROM BBS WHERE bbsID = ?"//특정한 아이디에 해당하는 글을 가져오도록 

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setInt(1, bbsID);

rs = pstmt.executeQuery();

if(rs.next()) {

Bbs bbs = new Bbs();

bbs.setBbsID(rs.getInt(1));

bbs.setBbsTitle(rs.getString(2));

bbs.setUserID(rs.getString(3));

bbs.setBbsDate(rs.getString(4));

bbs.setBbsContent(rs.getString(5));

bbs.setBbsAvailable(rs.getInt(6));

return bbs;   //결과로 나온 6개 변수를 bbs 인스턴스에 넣어 이 함수를 불러온 대상에게 반환

}

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

 

}

 

 

2. view.jsp 생성

실제로 특정한 게시글의 내용을 보여주는 페이지

 

특수문자, 공백 글에 표시되게 기능 구현

로그인 했을 때 수정/삭제 버튼 구현

 

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ page import="java.io.PrintWriter" %>

<%@ page import="bbs.Bbs" %> //데이터베이스를 사용할 수 있게 Bbs를 그대로 가져올 수 있도록 해줌

<%@ page import="bbs.BbsDAO" %>

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<meta name="viewport" content="width=device-width", initial-scale="1">

<link rel="stylesheet" href="css/bootstrap.css">

<title>JSP 게시판 웹 사이트</title>

</head>

<body>

<%

String userID = null;

if (session.getAttribute("userID") !=null){

userID = (String) session.getAttribute("userID");

}

int bbsID = 0;

if(request.getParameter("bbsID") !=null){     //매개변수로 넘어온 bbsID라는 매개변수가 존재한다면

bbsID=Integer.parseInt(request.getParameter("bbsID")); //bbsID가 정상적으로 넘어왔다면 bbsID에 담아 처리할 수 있게 함

}

if(bbsID == 0){

PrintWriter script = response.getWriter();

script.println("<script>");

script.println("alert('유효하지 않은 글입니다.')");

script.println("location.href = 'bbs.jsp'");

script.println("</script>");

}

Bbs bbs = new BbsDAO().getBbs(bbsID);    //해당 글의 구체적인 정보를 가져올 수 있도록 함

유효한 정보라면 getBbs라는 구체적인 정보를 bbs에 담을 수 있도록 함

%>

<nav class="navbar navbar-default">

<div class="navbar-header">

<button type="button" class ="navbar-toggle collapsed"

data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">

<span class="icon-bar"></span>

<span class="icon-bar"></span>

<span class="icon-bar"></span>

</button>

<a class="navbar-brand" href="main.jsp">JSP 게시판 웹 사이트</a>

</div>

<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">

<ul class="nav navbar-nav">

<li><a href="main.jsp">메인</a></li>

<li class="active"><a href="bbs.jsp">게시판</a></li>

</ul>

<%

if(userID == null){

%>

<ul class="nav navbar-nav navbar-right">

<li class="dropdown">

<a href="#" class="dropdown-toggle"

data-toggle="dropdown" role="button" aria-haspopup="true"

aria-expanded="false">접속하기<span class="caret"></span></a>

<ul class="dropdown-menu">

<li><a href="login.jsp">로그인</a></li>

<li><a href="join.jsp">회원가입</a></li>

</ul>

</li>

</ul>

<%

} else {

%>

<ul class="nav navbar-nav navbar-right">

<li class="dropdown">

<a href="#" class="dropdown-toggle"

data-toggle="dropdown" role="button" aria-haspopup="true"

aria-expanded="false">회원관리<span class="caret"></span></a>

<ul class="dropdown-menu">

<li><a href="logoutAction.jsp">로그아웃</a></li>

</ul>

</li>

</ul>

<%

}

%>

</div>

</nav>

<div class="container">

<div class="row">

<table class="table table-striped" style="text-align:center; border: 1px solid #dddddd">

<thead>

<tr>

<th colspan="3" style="background-color: #eeeeee; text-align: center;">게시판 글 보기</th>

</tr>

</thead>

<tbody>

<tr>

<td style="width: 20%;">글 제목</td>

<td colspan="2"><%= bbs.getBbsTitle().replaceAll(" ", "&nbsp;").replaceAll("<","&lt;").replaceAll("\n", "<br>")%></td>

</tr>

<tr>

<td>작성자</td>

<td colspan="2"><%= bbs.getUserID() %></td>

</tr>

<tr>

<td>작성일자</td>

<td colspan="2"><%= bbs.getBbsDate().substring(0,11) + bbs.getBbsDate().substring(11,13) + "시" + bbs.getBbsDate().substring(14,16) + "분" %></td>

</tr>

<tr>

<td>내용</td>

<td colspan="2" style="min-height: 200px; text-align: left;"><%= bbs.getBbsContent().replaceAll(" ", "&nbsp;").replaceAll("<","&lt;").replaceAll("\n", "<br>") %></td>

</tr>

</tbody>

</table>

<a href="bbs.jsp" class="btn btn-primary">목록</a>

<%

if(userID !=null && userID.equals(bbs.getUserID())){     //현재 접속자가 해당 글의 작성자와 동일하다면

%>

<a href="update.jsp?bbsID=<%= bbsID %>" class="btn btn-primary">수정</a>

<a onclick="return confirm('정말로 삭제하시겠습니까?')" href="deleteAction.jsp?bbsID=<%= bbsID %>" class="btn btn-primary">삭제</a>

<%

}

%>

</div>

</div>

<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>

<script src="js/bootstrap.js"></script>

</body>

</html>

실제로 작성된 글 목록을 게시판 메인화면에 출력해보는 기능 구현

1. BbsDAO.java 코드수정

데이터베이스에서 글의 목록을 가져오는 소스코드 작성

 

package bbs;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.ArrayList;

public class BbsDAO {

 

private Connection conn;

private ResultSet rs;

 

public BbsDAO() { //데이터 접근 객체

try {

String dbURL = "jdbc:mysql://localhost:3306/BBS";

String dbID ="root";

String dbPassword = "1234";

Class.forName("com.mysql.jdbc.Driver");

conn = DriverManager.getConnection(dbURL, dbID, dbPassword );

} catch (Exception e) {

e.printStackTrace();

}

}

 

public String getDate() {

String SQL = "SELECT NOW()";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

rs = pstmt.executeQuery();

if(rs.next()) {

return rs.getString(1);

}

} catch (Exception e) {

e.printStackTrace();

}

return ""; //데이터베이스 오류

}

 

public int getNext() {

String SQL = "SELECT bbsID FROM BBS ORDER BY bbsID DESC";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

rs = pstmt.executeQuery();

if(rs.next()) {

return rs.getInt(1) + 1;

}

return 1; //첫 버째 게시물인 경우

} catch (Exception e) {

e.printStackTrace();

}

return -1; //데이터베이스 오류

}

 

public int write(String bbsTitle, String userID, String bbsContent) {

String SQL = "INSERT INTO BBS VALUES(?, ?, ?, ?, ?, ?)";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setInt(1, getNext());

pstmt.setString(2, bbsTitle);

pstmt.setString(3, userID);

pstmt.setString(4, getDate());

pstmt.setString(5, bbsContent);

pstmt.setInt(6, 1);

return pstmt.executeUpdate();

} catch (Exception e) {

e.printStackTrace();

}

return -1; //데이터베이스 오류

}

 

//여기부터 추가

 

public ArrayList<Bbs> getList(int pageNumber){  //특정한 리스트를 담아서 반환할 수 있도록 만들어 줌

//ArrayList import 하기 - 외부 라이브러리로써 가져올 수 있도록 해줌

String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";

//특정한 숫자보다 작을 때/ 삭제가 되지 않아서 Available 1인 글들만 가져오기 / 내림차순 정렬. 위에서 10개까지만 가져오기

ArrayList<Bbs> list = new ArrayList<Bbs>();

//Bbs 클래스에서 나오는 인스턴스를 보관할 수 있는 리스트 만들기

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);  //다음으로 작성될 글번호를 의미 -  getNext 

rs = pstmt.executeQuery();

while (rs.next()) {

Bbs bbs = new Bbs();

bbs.setBbsID(rs.getInt(1));

bbs.setBbsTitle(rs.getString(2));

bbs.setUserID(rs.getString(3));

bbs.setBbsDate(rs.getString(4));

bbs.setBbsContent(rs.getString(5));

bbs.setBbsAvailable(rs.getInt(6));

list.add(bbs);  //리스트에 해당 인스턴스를 넣어서 반환하도록 해줌

}

} catch (Exception e) {

e.printStackTrace();

}

return list;

}

public boolean nextPage(int pageNumber) {    //페이징 처리를 위해 존재하는 함수

게시글 10-페이지 1 / 게시글 11-페이지2 /게시글 20 - 페이지2 / 게시글 21 - 페이지 3 / 이런식 이니까

특정한 페이지가 존재하는지 함수를 이용해 물어보는 것

String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);

rs = pstmt.executeQuery();

if(rs.next()) {

return true;   //다음페이지로 넘어갈 수 있다

}

} catch (Exception e) {

e.printStackTrace();

}

return false;

 

}

 

/// 여기까지

 

public Bbs getBbs(int bbsID) {

String SQL = "SELECT * FROM BBS WHERE bbsID = ?";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setInt(1, bbsID);

rs = pstmt.executeQuery();

if(rs.next()) {

Bbs bbs = new Bbs();

bbs.setBbsID(rs.getInt(1));

bbs.setBbsTitle(rs.getString(2));

bbs.setUserID(rs.getString(3));

bbs.setBbsDate(rs.getString(4));

bbs.setBbsContent(rs.getString(5));

bbs.setBbsAvailable(rs.getInt(6));

return bbs;

}

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

 

public int update(int bbsID, String bbsTitle, String bbsContent) {

String SQL = "UPDATE BBS SET bbsTitle = ?, bbsContent = ? WHERE bbsID = ?";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setString(1, bbsTitle);

pstmt.setString(2, bbsContent);

pstmt.setInt(3, bbsID);

return pstmt.executeUpdate();

} catch (Exception e) {

e.printStackTrace();

}

return -1; //데이터베이스 오류

}

 

public int delete(int bbsID) {

String SQL = "UPDATE BBS SET bbsAvailable = 0 WHERE bbsID = ?";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setInt(1, bbsID);

return pstmt.executeUpdate();

} catch (Exception e) {

e.printStackTrace();

}

return -1; //데이터베이스 오류

}

}

 

}

2. bbs.jsp 코드수정

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ page import="java.io.PrintWriter" %>

<%@ page import="bbs.BbsDAO" %>

<%@ page import="bbs.Bbs" %>

<%@ page import="java.util.ArrayList" %>  //게시판 목록을 출력하기 위해 필요 ArrayList 가져오기

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<meta name="viewport" content="width=device-width", initial-scale="1">

<link rel="stylesheet" href="css/bootstrap.css">

<link rel="stylesheet" href="css/custom.css">

<title>JSP 게시판 웹 사이트</title>

<style type="text/css">

a, a:hover{

color: #000000;

text-decoration: none;

}

</style>

</head>

<body>

<%

String userID = null;

if (session.getAttribute("userID") !=null){

userID = (String) session.getAttribute("userID");

}

int pageNumber = 1;         //현재 게시판이 몇 번째 페이지인지 알려주기 위해

if(request.getParameter("pageNumber") != null){

pageNumber = Integer.parseInt(request.getParameter("pageNumber"));

}

%>

<nav class="navbar navbar-default">

<div class="navbar-header">

<button type="button" class ="navbar-toggle collapsed"

data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">

<span class="icon-bar"></span>

<span class="icon-bar"></span>   

<span class="icon-bar"></span>

</button>

<a class="navbar-brand" href="main.jsp">JSP 게시판 웹 사이트</a>

</div>

<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">

<ul class="nav navbar-nav">

<li><a href="main.jsp">메인</a></li>

<li class="active"><a href="bbs.jsp">게시판</a></li>

</ul>

<%

if(userID == null){

%>

<ul class="nav navbar-nav navbar-right">

<li class="dropdown">

<a href="#" class="dropdown-toggle"

data-toggle="dropdown" role="button" aria-haspopup="true"

aria-expanded="false">접속하기<span class="caret"></span></a>

<ul class="dropdown-menu">

<li><a href="login.jsp">로그인</a></li>

<li><a href="join.jsp">회원가입</a></li>

</ul>

</li>

</ul>

<%

} else {

%>

<ul class="nav navbar-nav navbar-right">

<li class="dropdown">

<a href="#" class="dropdown-toggle"

data-toggle="dropdown" role="button" aria-haspopup="true"

aria-expanded="false">회원관리<span class="caret"></span></a>

<ul class="dropdown-menu">

<li><a href="logoutAction.jsp">로그아웃</a></li>

</ul>

</li>

</ul>

<%

}

%>

</div>

</nav>

<div class="container">

<div class="row">

<table class="table table-striped" style="text-align:center; border: 1px solid #dddddd">

<thead>

<tr>

<th style="background-color: #eeeeee; text-align: center;">번호</th>

<th style="background-color: #eeeeee; text-align: center;">제목</th>

<th style="background-color: #eeeeee; text-align: center;">작성자</th>

<th style="background-color: #eeeeee; text-align: center;">작성일</th>

</tr>

</thead>

<tbody>

<%

BbsDAO bbsDAO = new BbsDAO();      //게시글을 뽑아올 수 있도록 인스턴스 생성

ArrayList<Bbs> list = bbsDAO.getList(pageNumber);  //리스트 생성 - 현재의 페이지에서 가져온 목록

for(int i = 0; i < list.size(); i++){  //현재의 페이지에서 가져온 목록 출력

%>

<tr>

//현재 게시글에 대한 정보 가져올 수 있게 한다

<td><%= list.get(i).getBbsID() %></td>  

<td><a href="view.jsp?bbsID=<%=list.get(i).getBbsID() %>"><%= list.get(i).getBbsTitle().replaceAll(" ", "&nbsp;").replaceAll("<","&lt;").replaceAll("\n", "<br>") %></a></td>

<td><%= list.get(i).getUserID() %></td>

<td><%= list.get(i).getBbsDate().substring(0,11)+list.get(i).getBbsDate().substring(11,13) + "시" + list.get(i).getBbsDate().substring(14,16) + "분" %></td>

</tr>

<%

}

%>

</tbody>

</table>

<%

if(pageNumber !=1){     //페이지 넘버가 1이 아니라면 

%>

<a href="bbs.jsp?pageNumber=<%=pageNumber -1%>" class="btn btn-success btn-arraw-left">이전</a>

<%

} if(bbsDAO.nextPage(pageNumber + 1)){ //다음 페이지가 존재 한다면

%>

<a href="bbs.jsp?pageNumber=<%=pageNumber +1%>" class="btn btn-success btn-arraw-left">다음</a>

<%

}

%>

<a href="write.jsp" class="btn btn-primary pull-right">글쓰기</a>

</div>

</div>

<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>

<script src="js/bootstrap.js"></script>

</body>

</html>

 

참고

동빈나 유투브

+ Recent posts