들어가기 전 

게시판짜는 큰 흐름부터 익히고 가자 !!

 

1. 인터페이스 만들기

src/main/java 안  service패키지 안에 제너릭 인터페이스를 만들어 놓음

 제너릭  인터페이스 : <t> 이걸 쓰는 이유는 안그럼 테이블에 컬럼 개수 만큼 인자들을 만들어야 하는데
제너릭으로 하면 T 인자 하나만 넣으면 (상속받을 때 설정 해 주면 T가 알아서 싹 다 바뀜)
간단 해 짐 ! 인자들 신경을 덜 써도 된다 !!

package service;

import java.util.List;
import java.util.Map;

//제너릭 인터페이스
public interface DaoService<T> {
	void close();   //닫기
	List<T> selectList(Map map);  //모든 목록(총 글) 가져오기
	int getTotalRecordCount(Map map);  //총 레코드 수
	int insert(T dto);  // 입력처리
	T selectOne(String ...one);  // 글 하나 (상세보기용)
	int update(T dto);  //업데이트처리
	int delete(String no); //지우기
}

 

2. DTO 만들기  :

DTO = 글 하나를 저장 할 수 있는 자료 구조로 유저가 데이터를 입력 하면 데이터를 DTO에 넣어서(dto.set~~) 전송한다. 

         데이터를 실어 나르는 아이! 데이터 꺼내 올 때도 dto.get~~ 를 이용해서 가져옴 !

 

public class BBSDto {    //글 한개를 저장할 수 있는 구조
	
    //변수들
    private String no;
	private String id;
	private String title;
	private String content;
	private String hitCount;
	private java.sql.Date postDate;
	private String name; // 이름 저장용 추가한거 
	
	//생성자
	public  BBSDto () {}
	public BBSDto(String no, String id, String title, String content, String hitCount, Date postDate) {
		this.no = no;
		this.id = id;
		this.title = title;
		this.content = content;
		this.hitCount = hitCount;
		this.postDate = postDate;
	}

	//게터,세터 !! 데이터 실어나를(저장/꺼내옴) 메소드들 ! 
	public String getNo() {
		return no;
	}
	public void setNo(String no) {
		this.no = no;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	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 String getHitCount() {
		return hitCount;
	}
	public void setHitCount(String hitCount) {
		this.hitCount = hitCount;
	}
	public java.sql.Date getPostDate() {
		return postDate;
	}
	public void setPostDate(java.sql.Date postDate) {
		this.postDate = postDate;
	}	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}	
}

 

3.DAO  : 데이타에 접근해서 CRUD작업을 수행하는 업무처리 로직을 갖고 있는 객체

              실제로 업무를 처리하기 때문에 제너릭 인터페이스를 상속받고 오버라이딩 해서  메소드들을 하나씩 구현 할 것임 ! 즉 제너릭에 있는 메소드들 +필요한건 더 추가해서 구현

void close();   
List<T> selectList(Map map);
int getTotalRecordCount(Map map);  
int insert(T dto);  
T selectOne(String ...one);  
int update(T dto);  
int delete(String no);

헷깔리니까 구현한 메소드들은 요렇게 처리하면

나중에 볼 때 쉬우려나.....

 

  코드작성 전 오라클과 연동할 계정을 만들고 테이블 만들기 (시험해 볼 회원도 생성)

 

 

 

 

5. DAO 에서 드라이버 로딩하기, 데이터베이스 연결(proerties는 밑에서 파일 생성 후 반영시킨거!)

	private Connection conn;
	private ResultSet rs;
	private PreparedStatement psmt;
	
	//생성자	, 어플리케이션 영역으로 넘길거
	 public BBSDao(ServletContext context) {
		try {
		InputStream is = context.getResourceAsStream("/WEB-INF/resources/database.properties");
		Properties props = new Properties(); //중요연결루트는 숨겨야지
		props.load(is);
		String username=props.getProperty("username");
		String password=props.getProperty("password");
	
		//드라이버 로딩
		Class.forName(context.getInitParameter("ORACLE-DRIVER"));		
		//데이터베이스 연결
		conn = DriverManager.getConnection(context.getInitParameter("ORACLE-URL"),username,password);
		System.out.println("데이 베이스 연결 성공:"+conn);
		}
		catch(ClassNotFoundException |SQLException |IOException  e) {e.printStackTrace();}
	}


getInitParameter("ORACLE-DRIVER") 
"ORACLE-DRIVER"은 
 WEB.xml 파일에 초기화 파라미터 등록되어있는거 !
context.getInitParameter("ORACLE-URL") 
이거 초기화 파라미터
유지보수에 좋음 나중에 주소등이 바뀌면  web.xml 파일에서만 바꾸기만하면 됨

web.xml 파일


6. propertise 만들기  : 오라클 주소나 내 아이피주소가 노출되는걸 막기 위해 파일에다

key:name(주소 등 보안이 필요한것) 으로 숨기고

key값으로만 꺼내 오기 위함

resources/database.properties



7. DAO 에서 자원반납용 메소드 구현(close)

  //자원반납용
	@Override
	public void close() {
		try {
		if(rs != null) rs.close();
		if(psmt != null) psmt.close();
		if(conn != null) conn.close();	
		}
		catch(SQLException e) {e.printStackTrace();}
	}



8. session06/LoginProcess.jsp 파일에

아이디 가정한 것 실제 회원 테이블과 연동하기
(원래는 회원가입용  memberdao/dto도 만들어야함)

	//입력값 받기
	String id = request.getParameter("id");
	String pwd = request.getParameter("pwd");
	//아이디 가정(KIM,1234)  실제 회원연동 전
	//if("KIM".equals(id.trim()) && "1234".equals(pwd.trim())){
		//실제 회원 테이블과 연동하기
		BBSDao dao = new BBSDao(application);
		boolean flag = dao.isMember(id,pwd);
		dao.close();
		if(flag){
		//1.로그인 = 세션이용
		session.setAttribute("USER-ID",id);		
		//2.마이페이지로
		response.sendRedirect("MyPage.jsp");		
	}
	else{
		//리퀘스트 영역 필요
		request.setAttribute("NOT-LOGIN","아이디와 비밀번호가 불일치");
		//로그인 포워드로 이동! 입력값들 request로 받았잖아! 그대로 전달 해줘야지! 
		request.getRequestDispatcher("Login.jsp").forward(request,response);
	}


9. DAO로 가서  
회원여부 판단용  isMember 메소드 만듦
쿼리실행문 만들기!

public boolean isMember(String username,String password) {
		String sql = "SELECT COUNT(*) fROM member WHERE id=? AND pwd =?";
		try {		
			psmt=conn.prepareStatement(sql);
			psmt.setString(1,username);
			psmt.setString(2,password);
			rs=psmt.executeQuery();
			rs.next();
			if(rs.getInt(1)==0) return false;
		}
		catch(SQLException e){
			e.printStackTrace();
			return false;
		}		
			return true;
	}/////////



10 login.jsp 로그인 /아웃 해보기

로그인 전/ 회원 불일치 시
로그인 후


11.bbs08폴더 생성에서 List파일 생성

목록을 뿌려주는 목적(SELECT) 게시판 basic !!
네브 상단에 게시판을 누르면 이동되는 페이지임
(login파일 복붙 내용 지우고 사용)
템플릿 top폴더에 a태그 href 복사해와

게시판 오픈입니당 !!

경로할 때 <%=request.getContextPath()=>/폴더/파일.jsp  잊지마소!

 


12. List에서 처리
회원제 게시판이기 때문에 회원만 게사판 보기/글작성 가능
인클루드 경로 삽입 common/ismember (직접코드작성)

<jsp:include page="/common/IsMember.jsp" /> 

로그인 여부 판단 후 전체 글 목록 가져오기

 

***글전체 목록 가져오기(list계열로)*** 

BBSDao에서 메소드 구현 처리 (selectList)  여기서 만들어서 List에다 뿌려줄거임

dao가서 메소드 구현시키기(추가로 필요한 name은 dto에 추가로 만들기 가능)
오라클 컬럼을 dto에 연결 ,담고 dto를 article 리스트계열로 담는다.

	@Override
	public List<BBSDto> selectList(Map map) {
		List<BBSDto> articles = new Vector<>();
		//페이징 적용 前 쿼리- 전체 목록 쿼리(이름을 가져와야해 join문 활용한다..)
		String sql ="SELECT b.*,name FROM bbs b JOIN member m ON b.id=m.id ORDER BY no DESC";
		try {
			psmt = conn.prepareStatement(sql);
			rs=psmt.executeQuery();
			while(rs.next()) {
				BBSDto dto = new BBSDto();
				dto.setContent(rs.getString(4));
				dto.setHitCount(rs.getString(5));
				dto.setId(rs.getString(2));
				dto.setName(rs.getString(7));   //이건 나중에 필요에 의해서 추가한 거라 dto에 추가 후 getter/setter 만들면 나옴 !!
				dto.setNo(rs.getString(1));
				dto.setPostDate(rs.getDate(6));
				dto.setTitle(rs.getString(3));
				articles.add(dto);				
			}
		}
		catch(SQLException e) {e.printStackTrace();}
		return articles;
	}



***12. list.jsp  
글전체 목록 뿌려주기  

list컬렉션이랑 확장for문쓰는것 위주로 잘 보기!

%>
<!-- 로그인 여부 판단 -->
<jsp:include page="/common/IsMember.jsp" />
<%
  //전체 글 목록 가져오기(CRUD작업을 하는 DAO와 연결)
	BBSDao dao = new BBSDao(application);
  //가져와서 LIST계열에 담을거  우선 null 해놓고 나중에 또 처리할거
    List<BBSDto> articles = dao.selectList(null);  
	dao.close();
%>

<jsp:include page="/template/Top.jsp"/> 
    <div class="container" style="margin-top:65px;"> 
        <div class="jumbotron bg-warning">
            <h1>목록 페이지</h1>
        </div>
         <div class="text-right mb-2">
	   <a href="Write.jsp" class="btn btn-danger">글등록</a>
	   </div>
	   <table class="table table-dark table-hover text-center">	
		<thead>
			<tr>
				<th class="col-1">번호</th>
				<th>제목</th>
				<th class="col-2">작성자</th>
				<th class="col-1">조회수</th>
				<th class="col-2">작성일</th>
			</tr>
		</thead>
		<tbody class="table-sm">
	<%      if(articles.isEmpty()){    //글이 없을 때 %>
                <tr>
                    <td colspan="5">등록된 글이 없습니다.</td>
                </tr>	
    <%}     else{     //글이 있을 때
				for(BBSDto dto : articles){  // 확장for으로 리스트컬렉션에서 하나씩 꺼내기					
    %>
			<tr>
				<td><%=dto.getNo() %></td>	
				<td class="text-left"><a href="View.jsp"><%=dto.getTitle() %></a></td>
				<td><%=dto.getName() %></td>	
				<td><%=dto.getHitCount() %></td>	
				<td><%=dto.getPostDate() %></td>	
			</tr>
	  <% 
		  }///for
			}////else
       %>
			
		</tbody>
	</table>
	<!-- 검색 UI -->
	<form class="form-inline justify-content-center" method="post">
       <select class="form-control" name="searchColumn">
	    <option value="title">제목</option>
	    <option value="content">내용</option>
	    <option value="name">작성자</option>	   
	   </select>
       <input type="text" class="form-control mx-2 my-2" 
      		 placeholder="검색어를 입력하세요" name="searchWord"/>
       <button type="submit" class="btn btn-primary">검색</button>
    </form>          	  	
  </div>
    
  <jsp:include page="/template/Footer.jsp"/>

 

 

복습하기 바빠서 그냥 정리 안 할까하다가...

오늘 과제하면서 블로그참고가 도움이 되어

그냥 정리하기로 했다

아.. 아직 구현할 메소드가 많이 남았는데

시간이 너무 없어 ㅠㅠㅠㅠㅠ 

+ Recent posts