학원/JSP SERVLET

2022-01-07 model2 게시판 만들기

링규 2022. 1. 7. 15:56

 

새로운 DynamicWeb 프로젝트  : WEB10_Model2_Board 생성 / jar파일 옮기기 

 

java -> src에 com.borard.controller 패키지 만들고 BoardServlet 서블릿 생성. 별칭은 /board.do

로그인 통합기능의 member.do 역할을 해줄 서블릿이다.

 

doGet 메소드만 수정

 

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {
  request.setCharacterEncoding("UTF-8");
  String command = request.getParameter("command");

  ActionFactory af = ActionFactory.getInstance();
  Action ac = af.getAction;

  if(ac==null) System.out.println("ac가 null입니다. 현재 command : " + command);
  else ac.execute(request, response);
}

 

작성한 후 Action에 마우스를 올린 후 Create interface 'Action' 

 

 

 

com.board.controller.action 패키지에 Action 인터페이스 생성 

이하에 생성될 모든 ~Action 클래스에  implements 해줄 인터페이스이다.

 

package com.board.controller.action;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Action {
	public void excute(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException;
}

 

ActionFactory 

 

package com.board.controller;

import com.board.controller.action.Action;
import com.board.controller.action.IndexAction;

public class ActionFactory {

	//싱글턴 패턴
	private ActionFactory() {}
	private static ActionFactory itc = new ActionFactory();
	public static ActionFactory getInstance() { return itc; }
	
	//getAction 
	public Action getAction(String command) {
		Action ac = null;
		
		if(command.equals("index")) ac = new IndexAction();
		
		return ac;
	}
	
}

 

마찬가지로 기능이 추가될 때 마다 + 필요 시 if~else if 문으로 추가 + 새로운 ~Action 클래스 생성 

 

 

IndexAction

 

package com.board.controller.action;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class IndexAction implements Action {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		String url = "member/loginForm.jsp";
		HttpSession session = request.getSession();
		if(session.getAttribute("loginUser")!=null) url = "main.jsp";
		RequestDispatcher dp = request.getRequestDispatcher(url);
		dp.forward(request, response);
	}

}

 

로그인이 되어있지 않으면 loginForm.jsp로 main.jsp로 보내줄 Action 클래스 

-> 중간 과정을 확인 하기 위해 main.jsp로 작성했지만 나중에 board.do?command=main으로 바꿀 예정

 

 

loginForm.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
<link rel="stylesheet" type="text/css" href="css/board.css">
<script src="script/script.js"></script>
</head>
<body>
<form action="board.do" method="post" name="frm">
<input type="hidden" name="command" value="login">
	<div class="box">LOG IN</div>
	<div class="box">
		<div class="label">아이디</div>
		<div class="item"> 
			<input type="text" name="userid" id="loginid" size="20">
		</div>
	</div>
	<div class="box">
		<div class="label">비밀번호</div>
		<div class="item"> 
			<input type="password" name="pwd" id="loginpwd" size="20">
		</div>
	</div>
	<div class="box">
		<input type="submit" value="로그인" onClick="return loginCheck();">
		<input type="button" value="회원가입" 
		onClick="location.href='board.do?command=joinForm'">
	</div>
	<div class="box">
		${message}
	</div>
</form>
</body>
</html>

 

형식은 같지만 이번에는 css를 적용할 것. css는 새로 폴더와 css파일을 만들어 그쪽에서 작성해준다

script도 마찬가지로 펄더/파일을 생성한다. (class나 jsp말고 새로운 file을 생성하여 파일이름을 파일명.js로 한다)

 

css/board.css

 

@charset "UTF-8";

.box{ 
	position:relative; 
	width:500px; 
	height:50px; 
	margin:0 auto; 
	text-align:center;
	line-height:50px; 
	font-weight:bold;
}

.label{
	position:relative;
	width:248px;
	height:48px;
	float:left;
	background:yellowgreen;
	font-size:110%;
	text-align:left;
	line-height:50px;
	text-align:center;
}

.item{
	position:relative;
	width:248px;
	height:46px;
	float:left;
	border:1px solid yellowgreen;
	font-size:110%;
	text-align:left;
	line-height:50px;
	text-align:center;
}

#loginid{
	width:200px;
	height:20px;
	border:0px;
	font-size:110%;
	outline:none;
}

#loginpwd{
	width:200px;
	height:20px;
	border:0px;
	font-size:110%;
	outline:none;
}

 

script/script.js

 

//new file 

function loginCheck(){
	if( document.frm.userid.value.length==0 ){
		alert("아이디를 입력하세요");
		document.frm.userid.focus();
		return false;
	}
	if( document.frm.pwd.value.length==0 ) {
		alert("비밀번호를 입력하세요");
		document.frm.pwd.focus();
		return false;
	}
	return true;
}

 

여기까지 하면 로그인 페이지에서 아이디, 비밀번호 입력 확인까지 가능

 

 

 

board.sql 작성

 

속성은 글번호, 비밀번호, 아이디, 이메일, 글제목, 글내용, 조회수, 작성일 이다.

글번호는 sequence를 이용한다. 

 

CREATE TABLE BOARD(
	NUM NUMBER(5) PRIMARY KEY,
	PASS VARCHAR2(30), --게시물 수정 삭제를 위한 비밀번호 
	USERID VARCHAR2(30),
	EMAIL VARCHAR2(30),
	TITLE VARCHAR2(50),
	CONTENT VARCHAR2(1000),
	READCOUNT NUMBER(4) DEFAULT 0, --조회수 
	WRITEDATE DATE DEFAULT SYSDATE --작성일자
)

CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT BY 1;

INSERT INTO BOARD(NUM, USERID, EMAIL, PASS, TITLE, CONTENT)
VALUES(BOARD_SEQ.NEXTVAL, 'SOMI', 'SOMI@NAVER.COM', '1234', '공지사항', '공지사항입니다.');

...

 

 

 

일단 기본 출력용 데이터 

 

 

MemberDto

-> 로그인 할때와 같음 

 

package com.board.dto;
public class MemberDto {

	private String name;
	private String userid;
	private String pwd;
	private String email;
	private String phone;
	private int admin;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getUserid() {
		return userid;
	}
	public void setUserid(String userid) {
		this.userid = userid;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public int getAdmin() {
		return admin;
	}
	public void setAdmin(int admin) {
		this.admin = admin;
	}
}

 

 

BoardDto

->Timestamp는 java.sql.Timestamp를 import 할 것 

 

package com.board.dto;

import java.sql.Timestamp;

public class BoardDto {

	private int num;
	private String pass;
	private String userid;
	private String email;
	private String title;
	private String content;
	private int readcount;
	private Timestamp writedate;
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getPass() {
		return pass;
	}
	public void setPass(String pass) {
		this.pass = pass;
	}
	public String getUserid() {
		return userid;
	}
	public void setUserid(String userid) {
		this.userid = userid;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public int getReadcount() {
		return readcount;
	}
	public void setReadcount(int readcount) {
		this.readcount = readcount;
	}
	public Timestamp getWritedate() {
		return writedate;
	}
	public void setWritedate(Timestamp writedate) {
		this.writedate = writedate;
	}
	
	
}

 

기능 분리를 위해 DB 연결과 단절을 담당해줄 클래스를 새로 생성한다

 

com.board.util -> Dbman.java

 

package com.board.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Dbman {
	
	//static 메소드는 인스턴스변수를 사용할 수 없기 때문에
	//driver와 url도 static 선언한다.
	static String driver = "oracle.jdbc.driver.OracleDriver";
	static String url = "jdbc:oracle:thin:@localhost:1521:xe";
	
	public static Connection getConnection() {
		Connection con = null;
		try {
			Class.forName(driver);
			con = DriverManager.getConnection(url,"scott", "tiger");
		} catch (ClassNotFoundException e) { e.printStackTrace();
		} catch (SQLException e) { e.printStackTrace(); }
		
		return con;

	}
	
	public static void close(Connection con, PreparedStatement pstmt, ResultSet rs) {
		try {
			if(rs!=null) rs.close();
			if(pstmt!=null) pstmt.close();
			if(con!=null) con.close();
		} catch (SQLException e) {e.printStackTrace();}
	}
	
}

 

이 클래스는 DB의 연결과 단절만을 담당

 

 

중간에 잘라서 올리기가 힘들어서 내일 이어서 쭉 ... 올릴 것....