들어가기 전
게시판짜는 큰 흐름부터 익히고 가자 !!
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 파일에서만 바꾸기만하면 됨
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"/>
복습하기 바빠서 그냥 정리 안 할까하다가...
오늘 과제하면서 블로그참고가 도움이 되어
그냥 정리하기로 했다
아.. 아직 구현할 메소드가 많이 남았는데
시간이 너무 없어 ㅠㅠㅠㅠㅠ
'학원 > JSP' 카테고리의 다른 글
11/25 51- 게시판 짜기(update/delete) (0) | 2022.11.27 |
---|---|
11/25 51-2 게시판 짜기(Write,view) (0) | 2022.11.26 |
11/24 50-2 [JSP] Action Tag(Param) (0) | 2022.11.24 |
11/24 50-2 [JSP] Action Tag(속성명을 일치시키자) (0) | 2022.11.24 |
11/24 50-1 [JSP] Action Tag(useBean) (0) | 2022.11.24 |