JSP 게시판 글 등록을 누르면 오류가 발생합니다.
본문
게시판등록 프로그램(editboard.jsp)에서 이름, 전자메일, 제목, 내용, 비밀번호를 입력 후 등록 버튼을 클릭하면 java.sql.SQLIntegrityConstraintViolationException: Column 'name' cannot be null 이라는 오류가 발생합니다. 분명히 이름을 입력했는데 왜 이런 오류가 발생하는건가요? 어느 부분이 잘못되었는지 못찾겠습니다.
listboard.jsp (게시글 목록 보는 화면)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판 기본 예제 : 게시 목록 표시</title>
</head>
<body>
<h2>게시판 목록 표시 프로그램</h2>
<hr>
<center>
<%@ page import="java.util.ArrayList, univ.BoardEntity, java.text.SimpleDateFormat"%>
<jsp:useBean id="brddb" class="univ.BoardDBCP" scope="page"/>
<%
// 게시 목록을 위한 리스트를 자바빈즈를 이용하여 확보
ArrayList<BoardEntity> list = brddb.getBoardList();
int counter = list.size();
int row = 0;
if (counter > 0) {
%>
<table width=800 border=0 cellpadding=1 cellspacing=3>
<tr>
<th><font color=blue><b>번호</b></font></th>
<th><font color=blue><b>제목</b></font></th>
<th><font color=blue><b>작성자</b></font></th>
<th><font color=blue><b>작성일</b></font></th>
<th><font color=blue><b>전자메일</b></font></th>
</tr>
<%
//게시 등록일을 2010.3.15 10:33:21 형태로 출력하기 위한 클래스
SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
for( BoardEntity brd: list) {
// 홀짝으로 다르게 색상 지정
String color = "papayawhip";
if ( ++row % 2 == 0 ) color = "white";
%>
<tr bgcolor=<%=color%>
onmouseover="this.style.backgroundColor='SkyBlue'"
onmouseout="this.style.backgroundColor='<%=color%>'">
<!-- 수정과 삭제를 위한 링크로 id를 전송 -->
<td align=center><a href="editboard.jsp?id=<%= brd.getId()%>"><%= brd.getId()%></a></td>
<td align=left><%= brd.getTitle() %></td>
<td align=center><%= brd.getName() %></td>
<!-- 게시 작성일을 2010.3.15 10:33:21형태로 출력 -->
<td align=center><%= df.format(brd.getRegdate()) %></td>
<td align=center><%= brd.getEmail() %></td>
</tr>
<%
}
%>
</table>
<% }
%>
<hr width=90%>
<p>조회된 게시판 목록 수가 <%=counter %>개 입니다.
</center><hr>
<center>
<form name=form method=post action=editboard.jsp>
<input type=submit value="게시등록">
</form>
</center>
</body>
</html>
editboard.jsp (게시글 작성하는 화면)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판 기본 예제 : 게시 폼 작성</title>
</head>
<!-- 파일 boardform.js : 폼의 각 입력 값이 있는지를 검토하는 함수 구현 -->
<script language=JavaScript src="boardform.js"></script>
<body>
<%@ page import="univ.*" %>
<%
String name = "";
String email = "";
String title = "";
String content = "";
String headline = "등록";
String id = request.getParameter("id");
if(id != null){
// 등록이 아닌 경우, 출력을 위해 선택한 게시의 각 필드 내용을 저장
int idnum = Integer.parseInt(id);
BoardDBCP brddb = new BoardDBCP();
BoardEntity brd = brddb.getBoard(idnum);
name = brd.getName();
email = brd.getEmail();
title = brd.getTitle();
content = brd.getContent();
headline = "수정 삭제";
};
%>
<h2>게시판 <%=headline %> 프로그램 </h2><hr>
<center><form name=boardform method=post action="processboard.jsp">
<!-- menu : 등록, 수정 또는 삭제 구분을 위한 매개변수로 이용 -->
<input type=hidden name="menu" value="insert">
<!-- 수정 또는 삭제를 위한 게시 id를 hidden으로 전송 -->
<input type=hidden name="id" value=<%=id %>>
<table width=100% border=0 cellspacing=0 cellpadding=7>
<tr><td align=center>
<table border=0>
<tr> <td colspan=2>
<table>
<tr>
<td width=80 >이 름 : </td>
<td width=100>
<input type=text name=name value="<%=name%>" size=30 maxlength=20></td>
<td width=80>전자메일 : </td>
<td width=100>
<input type=text name=email size=30 value="<%=email%>" maxlength=30></td>
</tr>
<tr>
<td width=80>제 목 : </td>
<td colspan= 3>
<input type=text name=title size=80 value="<%=title%>" maxlength=100></td>
</tr>
</table>
</td></tr>
<tr><td colspan=2>
<textarea name=content rows=10 cols=90><%=content%></textarea></td></tr>
<tr>
<td colspan=2>비밀번호 :
<input type=password name=passwd size=20 maxlength=15><font color=red>
현재 게시 내용을 수정 또는 삭제하려면 이미 등록한 비밀번호가 필요합니다.</font></td>
</tr>
<tr>
<td colspan=2 height=5><hr size=2></td>
</tr>
<tr>
<td colspan=2>
<% if(id == null) { %>
<!-- 버튼을 누르면 boardform.js의 함수를 실행하여 processboard.jsp로 이동 -->
<input type=button value="등록" onClick="insertcheck()">
<% } else { %>
<!-- 버튼을 누르면 boardform.js의 함수를 실행하여 processboard.jsp로 이동 -->
<input type="button" value="수정완료" onClick="updatecheck()">
<input type="button" value="삭제" onClick="deletecheck()">
<% } %>
<!-- 목록보기 버튼은 listboard.jsp로 이동 -->
<input type="button" value="목록보기" onClick="location.href='listboard.jsp'">
<input type="reset" value="취소">
</td>
</tr>
</table>
</td></tr>
</table>
</form>
</center>
</body>
</html>
boardform.js (조건 확인하는 함수가 있는 js)
/**
*
*/
function deletecheck(){
if (document.boardform.passwd.value==""){
alert("암호를 입력해 주세요.");
document.boardform.passwd.focus();
return;
}
ok = confirm("삭제하시겠습니까?");
if (ok){
document.boardform.menu.value="delete";
document.boardform.submit();
} else{
return;
}
}
function insertcheck() {
if (document.boardform.name.value="") {
alert("이름을 입력해 주세요.");
document.boardform.name.focus();
return;
}
if (document.boardform.passwd.value=="") {
alert("암호를 입력해 주세요.");
document.boardform.passwd.focus();
return;
}
document.boardform.menu.value='insert';
document.boardform.submit();
}
function updatecheck() {
if (document.boardform.name.value=""){
alert("이름을 입력해 주세요.");
document.boardform.name.focus();
return;
}
if (document.boardform.passwd.value=="") {
alert("암호를 입력해 주세요.");
document.boardform.passwd.focus();
return;
}
document.boardform.menu.value='update';
document.boardform.submit();
}
processboard.jsp (내용을 저장하기 위해 있음)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="brd" class="univ.BoardEntity" scope="page" />
<jsp:useBean id="brddb" class="univ.BoardDBCP" scope="page"/>
<%
//한글 처리를 위해 문자인코딩 지정
request.setCharacterEncoding("euc-kr");
//등록(insert), 수정(update), 삭제(delete) 중 하나를 저장
String menu = request.getParameter("menu");
//등록 또는 수정 처리 모듈
if (menu.equals("delete") || menu.equals("update")) {
String id = request.getParameter("id");
String passwd = request.getParameter("passwd");
int idnum = Integer.parseInt(id);
//데이터베이스 자바빈즈에 구현된 메소드 isPasswd()로 id와 암호가 일치하는지 검사
if (!brddb.isPasswd(idnum, passwd)) {
%>
<!-- 암호가 틀리면 이전 화면으로 이동 -->
<script>alert("비밀번호가 다릅니다."); history.go(-1);</script>
<%
} else {
if (menu.equals("delete")){
//삭제를 위해 데이터베이스 자바빈즈에 구현된 메소드 deleteDB() 실행
brddb.deleteDB(idnum);
} else if(menu.equals("update")) {
%>
<!-- 수정 시 BoardEntity에 지정해야 하는 필드 id -->
<jsp:setProperty name="brd" property="id"/>
<jsp:setProperty name="brd" property= "name"/>
<jsp:setProperty name="brd" property="title"/>
<jsp:setProperty name="brd" property="email"/>
<jsp:setProperty name="brd" property= "content" />
<%
//수정을 위해 데이터베이스 자바빈즈에 구현된 메소드 updateDB() 실행
brddb.updateDB(brd);
}
//기능 수행 후 다시 게시 목록 보기로 이동
response.sendRedirect("listboard.jsp");
}
} else if (menu.equals("insert")) {
%>
<!-- 등록 시 BoardEntity에 지정해야 하는 필드 passwd -->
<jsp:setProperty name="brd" property= "name"/>
<jsp:setProperty name="brd" property="title"/>
<jsp:setProperty name="brd" property="email"/>
<jsp:setProperty name="brd" property="content" />
<jsp:setProperty name="brd" property="passwd"/>
<%
//등록을 위해 데이터베이스 자바빈즈에 구현된 메소드 insertDB() 실행
brddb.insertDB(brd);
//기능 수행 후 다시 게시 목록 보기로 이동
response.sendRedirect("listboard.jsp");
}
%>
</body>
</html>
BoardDBCP.java (DB에 실질적인 동작을 위해 있음)
package univ;
import java.sql.*;
import java.util.ArrayList;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class BoardDBCP {
// 데이터베이스 연결관련 변수 선언
private Connection con = null;
private PreparedStatement pstmt = null;
private DataSource ds = null;
// JDBC 드라이버 로드 메소드
public BoardDBCP() {
try {
InitialContext ctx = new InitialContext();
ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
}catch(Exception e) {
e.printStackTrace();
}
}
public void connect() {
try {
con = ds.getConnection();
}catch(Exception e) {
e.printStackTrace();
}
}
public void disconnect() {
if(pstmt != null) {
try {
pstmt.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
if(con != null) {
try {
con.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
}
public ArrayList<BoardEntity> getBoardList(){
connect();
ArrayList<BoardEntity> list = new ArrayList<BoardEntity>();
String SQL = "select * from board";
try {
pstmt = con.prepareStatement(SQL);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
BoardEntity brd = new BoardEntity();
brd.setId(rs.getInt("id"));
brd.setName(rs.getString("name"));
brd.setPasswd(rs.getString("passwd"));
brd.setTitle(rs.getString("title"));
brd.setEmail(rs.getString("email"));
brd.setRegdate(rs.getTimestamp("regdate"));
brd.setContent(rs.getString("content"));
list.add(brd);;
}
rs.close();
} catch(SQLException e) {
e.printStackTrace();
}
finally {
disconnect();
}
return list;
}
public BoardEntity getBoard(int id) {
connect();
String SQL = "select * from board where id = ?";
BoardEntity brd = new BoardEntity();
try {
pstmt = con.prepareStatement(SQL);
pstmt.setInt(1, id);
ResultSet rs = pstmt.executeQuery();
rs.next();
brd.setId(rs.getInt("id")); //세터 호출
brd.setName(rs.getString("name"));
brd.setPasswd(rs.getString("passwd"));
brd.setTitle(rs.getString("title"));
brd.setEmail(rs.getString("email"));
brd.setRegdate(rs.getTimestamp("regdate"));
brd.setContent(rs.getString("content"));
rs.close();
} catch(SQLException e) {
e.printStackTrace();
}
finally {
disconnect();
}
return brd;
}
public boolean insertDB(BoardEntity board) {
boolean success = false;
connect();
String sql = "insert into board values(0, ?, ?, ?, ?, sysdate(), ?)";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, board.getName());
pstmt.setString(2, board.getPasswd());
pstmt.setString(3, board.getTitle());
pstmt.setString(4, board.getEmail());
pstmt.setString(5, board.getContent());
pstmt.executeUpdate();
success = true;
} catch(SQLException e) {
e.printStackTrace();
return success;
}
finally {
disconnect();
}
return success;
}
public boolean updateDB(BoardEntity board) {
boolean success = false;
connect();
String sql = "update board set name=?, title=?, email=?, content=? where id=?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, board.getName());
pstmt.setString(2, board.getTitle());
pstmt.setString(3, board.getEmail());
pstmt.setString(4, board.getContent());
pstmt.setInt(5, board.getId());
int rowUdt = pstmt.executeUpdate();
if(rowUdt == 1) success = true;
} catch(SQLException e) {
e.printStackTrace();
return success;
}
finally {
disconnect();
}
return success;
}
public boolean deleteDB(int id) {
boolean success = false;
connect();
String sql = "delete from board where id=?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, id);
pstmt.executeUpdate();
success = true;
} catch(SQLException e) {
e.printStackTrace();
return success;
}
finally {
disconnect();
}
return success;
}
public boolean isPasswd(int id, String passwd) {
boolean success = false;
connect();
String sql = "select passwd from board where id=?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, id);
ResultSet rs = pstmt.executeQuery();
rs.next();
String orgPasswd = rs.getString(1);
if(passwd.equals(orgPasswd)) success = true;
System.out.println(success);
rs.close();
} catch(SQLException e) {
e.printStackTrace();
return success;
}
finally {
disconnect();
}
return success;
}
}
BoardEntity.java (setter, getter)
package univ;
import java.util.Date;
public class BoardEntity {
private int id;
private String name;
private String passwd;
private String title;
private String email;
private Date regdate;
private String content;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getRegdate() {
return regdate;
}
public void setRegdate(Date regdate) {
this.regdate = regdate;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
boardform.js에서 함수가 실행됐을때 이름을 입력하라는 창이 뜨지 않는것을 보아 그 이후에 name에 저장된 내용이 사라지는것같은데 찾지 못하겠습니다. 도와주세요.
!-->!-->!-->!-->!-->!-->답변 1
<!-- 등록 시 BoardEntity에 지정해야 하는 필드 passwd -->
<jsp:setProperty name="brd" property= "name"/>
...
<jsp:setProperty name="brd" property="name" value="<%=request.getParameter("name")%>"/>
...
이런 식으로 해 보세요.
https://stackoverflow.com/questions/24770183/javabean-property-in-jsp
참고하세요.
답변을 작성하시기 전에 로그인 해주세요.