본문 바로가기

웹 개발 한걸음

[JSP] 10강을 쬐끔 수정해보기

 


 

** 현재 날짜 구하는 메서드 삭제 해보기

 

//등록 날짜를 위한 현재 날짜 반환 메서드 
public String getDate() {
		
	String sql = "SELECT NOW()"; 
	try {
		PreparedStatement pst = conn.prepareStatement(sql);
		rs = pst.executeQuery();
		if(rs.next()) {
			return  rs.getString(1);
		}			
	} catch (Exception e) {
		e.printStackTrace();
	}
	return "";
}
  • 이건 등록 날짜 시간을 위해 db의 함수를 이용하는 메서드였는데 이렇게 따로 메서드를 만들기보다는 그냥 insert문에 직접 함수를 꽂아주는 것이 좋다고 생각해서 수정하였다.
  • 물론 모든 DB가 NOW() 함수를 가지고 있는 것은 아닐테고 프로젝트 중간에 DBMS를 바뀌는 경우에 유지 보수상 이렇게 하는 게 용이하겠지만 그럴 일은 별로 없을 것 같다는 생각이기도 하고 DB에 자주 접근하는 게 괜찮은가 싶은 생각이기도 했다.
  •  위 코드 대신
public int write(String bbstitle, String userID, String content) {
			
	String sql = "INSERT INTO BBS VALUES( ? , ? , ? , now() , ? , ?) "; 
	try {
		PreparedStatement pst = conn.prepareStatement(sql);
		pst.setInt(1, getNext());
		pst.setString(2, bbstitle);
		pst.setString(3, userID);
		//pst.setString(4, getDate());
		//pst.setString(5, content);
	  	//pst.setInt(6, 1);
		pst.setString(4, content);
		pst.setInt(5, 1);
		//insert는 업데이트시 1이상의 수를 반환함.
		return pst.executeUpdate();
	} catch (Exception e) {
		e.printStackTrace();
	}
	return -1; //데이터베이스 오류
}
  • now()함수를 insert문에 바로 꽂아주었다. 잘 작동된다.

 

 

 


 

** 로그인 없이 글쓰기 페이지 접근 불가 추가하기

 

	//login이 안됐을 경우
	if(userID == null){
		PrintWriter script = response.getWriter();
		script.println("<script>");
		script.println("alert('먼저 로그인 하세요.')");
		script.println("location.href = 'login.jsp'");
		script.println("</script>");
	}   
  • 위의 코드가 writeAction.jsp 그러니까 제목과 글을 쓰고 나서 글쓰기 버튼을 눌렀을 때 나오도록 했는데 이러면 안될 것 같다.
  • 로그인 여부를 이 때가 아닌 아예 글쓰기 화면으로 들어오기 전에 뒤로 돌려보내야한다. 왜냐하면 글을 열심히 썼을텐데 로그인 안됐다고 뒤로 가져버리면 힘들게 쓴 회원의 글이 다 날아가버리기 때문이다. 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ page import = "java.io.PrintWriter" %>   
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!--  부트스트랩은 디바이스의 해상도에 맞게 맞게 변경되는 템플릿임. 반응형 웹의 메타 태그 -->
<meta name = "viewport" content="width=device-width", initial-scale="1">
<!-- css를 참조하는 링크. bootstrap.css 경로를 링크한다.-->
<link rel="stylesheet" href="css/bootstrap.css">
<title>Hello World!</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>");
		}	
	%>
	<!-- 네비게이션 바 -->
	<nav class="navbar navbar-default">
		<div class="navbar-header">
			<!-- 햄버거 버튼 큰화면에서는 x 좁은 화면에서는 o -->
			<button type="button" class="navbar-toggle collapsed"
				data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
				aria-expanded="false">
				<!-- 햄버거의 갯수. 3개라서 3개. 1개면 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 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="logoutAction.jsp">로그아웃</a></li> 
					</ul>
				</li>
			</ul>
			<%
				}
			%>
		</div>
	</nav>
	
	<!-- 게시판 부분 -->
	<div class="container">
		<div class="row">
				<form action="writeAction.jsp" method="post">
				<table class = "table table-striped" style="text-align : center; border: 1px solid #dddddd">
					<thead> <!-- 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"></td>			
						</tr>
						<tr>	
							<td><textarea class="form-control" placeholder="글 내용" name="bbsContent" maxlength="2048" style="height:350px;"></textarea></td>			
						</tr>
					</tbody>
				</table>
				<input type="submit" class="btn btn-primary pull-right" value="글쓰기">
			</form>
		</div>
	</div>
	
	
</body>
<!-- Jquery를 해당 주소에서 가져와 사용할 수 있게 해주는 스크립트  -->
<script src="http://code.jquery.com/jquery-3.1.1.min.js"></script>
<!-- 해당 경로의 부스트스트랩의 자바스크립트를 사용하게 해주는 스크립트 -->
<script src="js/bootstrap.js"></script>
</html>
  • 그래서 세션 확인을 writeAction.jsp가 아닌 wirte.jsp 접근할 때, 그러니까 글쓰기 버튼을 눌렀을 때 하여 로그인없이 글을 못쓰게, 로그인 하도록 유도하였다. 잘 된다.