ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JSP - 게시판 만들기 연습2 (게시판 끼리 연결해보자)
    기타/Servlet 2020. 12. 21. 16:53

    2020/12/15 - [JSP/Servlet] - JSP - 게시판 만들기 연습

     

    저번에는 한 개의 데이터베이스 테이블에 관한 게시판을 생성했다.

    이번에는 여러개의 테이블이 서로 연결되어 정보를 주고 받아 뿌려주는 게시판들을 만들어보자.

     

    전과 반복되는 작업 내용은 건너뛰고 새롭게 추가된 작업만 정리할 예정이다.

     

     

    일단 이렇게 3개의 테이블을 만들어준다.

    각각 회원게시판, 일반게시판, 가계부게시판이 될 예정이다.

    일반 게시판은 모든 회원이 글작성, 답글을 달 수 있고 가계부 계시판은 본인이 쓴 가계부만 보이는 공간이다.

     

     

     

    SMC.xml은 이렇게 작성된다.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD config 3.0//EN"
    "http://mybatis.apache.org/dtd/mybatis-3-config.dtd">
    
    <configuration>
    
    	<typeAliases>
    		<typeAlias type="com.memberboard.beans.MvcBoard" alias="board" />
    		<typeAlias type="com.memberboard.beans.MyMember" alias="member" />
    		<typeAlias type="com.memberboard.beans.HomeBook" alias="book" />
    	</typeAliases>
    	
    	<environments default="development">
    		<environment id ="development">
    			<transactionManager type="JDBC" /> 
    			
    			<dataSource type = "UNPOOLED">
    				<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
    				<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
    				<property name="username" value="mvcboard"/>
    				<property name="password" value="mvcboard"/>
    			</dataSource>
    
    		</environment>
    	</environments>
    	
    	<mappers>
    		<mapper resource = "com/memberboard/xml/MvcBoard.xml" />
    		<mapper resource = "com/memberboard/xml/MyMemder.xml" />
    		<mapper resource = "com/memberboard/xml/HomeBook.xml" />
    	</mappers>
    
    </configuration>

    typeAlias와 mapper는 늘어난 member와 homebook 값을 추가해준다.

     

     

    여기에서 일반게시판의 dao, xml은 크게 주의할 점이 없지만 

    가계부인 경우 로그인한 아이디의 게시물 목록만 보여야 하기 때문에 아래와 같은 select 지문을 사용해준다.

    public List<HomeBook> list(String mid); //가계부 목록

    mid값은 문자열이므로 String을 사용해준다

     

    <select id="list"  parameterType="string" resultMap="result">
    	SELECT * FROM HOMEBOOK
    	WHERE MID = #{mId}
    	ORDER BY DAY DESC
    </select>

    parameterType은 mid를 받아오니까 String을 써주고

    where로 mid의 게시물 목록만 걸러서

    day desc로 날짜의 내림차순으로 출력해준다.

     

     

    그 다음 목록을 출력할 HBListCommand.java를 만들어 준다.

    public class HBListCommand implements BCommand {
    
    	@Override
    	public void execute(HttpServletRequest request, HttpServletResponse response) {
    		SqlSession mysession = MBUtils.getSession();
    		HttpSession session = request.getSession();
    		HomeBookDAO dao = mysession.getMapper(HomeBookDAO.class);
    		MyMember bean = (MyMember)session.getAttribute("member");
    		List<HomeBook> beans = dao.list(bean.getId());
    		request.setAttribute("list", beans);
    		mysession.close();
    
    	}
    	
    }
    

    작업하면서 시간을 정말 많이 잡아먹은 부분 ㅋㅋ

    나중에 보니 조합을 하나씩 빼먹으면서 했던거였다 

     

    나같은 경우 mid 값이 계속 넘어가지 않아 원인을 찾아보니 

     

    1. 링크 오류

    가계부 목록을 눌렀을때 연결한 링크가 xxx.do가 아닌 .jsp로 해놔서 .do로 sql질의와 값을 따오기 전에 값이 없는 빈페이지로 가니 값들이 null 이라며 에러가 났다.

     

    2. mid의 변수 값이 넘어가지 않는 문제

    이건 진짜 이유를 몰랐다.

    sql 질의에 다이렉트로 where mid = 'test'

    이렇게 하면 목록이 쫙 뿌려지는데 #{mid}를 넣으면 null 값이 계속 나왔다.

    그래서 list안에 값도 넣어보고 오만가지 다했는데 안되었는데 알고보니 member랑 연결되지 않아서다.

    mid는 회원 id라서 member에서 값을 가져와야지 인식되는 걸 몰랐던 것.

    그러고 보니 write로 글 작성할때는 member를 불러왔다.

    웃긴게 내가 이 두 가지를 같이 시도해볼 생각을 못하고 따로하면서 삽질을 하고 있었던것 ㅋㅋㅋ

    풀리고 너무 허탈했는데 하나 배웠다.

     

     

    그래서 homebookList.jsp도 이렇게 작성해주어야 한다.

    <body>
    	<h1>가계부</h1>
    	<ul>
    		<li><a href="list.jsp">게시판 목록</a> /</li>
    		<li><a href="memberList.jsp">회원 리스트</a> /</li>
    		<li><a href="homebook_list.do">가계부 게시판</a></li>
    	</ul>
    	<%
    		MyMember bean = (MyMember)session.getAttribute("member");
    	%>
    	<%
            List<HomeBook> list = (List<HomeBook>) request.getAttribute("list");
            if (list == null) {
                SqlSession mysession = MBUtils.getSession();
                HomeBookDAO dao = mysession.getMapper(HomeBookDAO.class);
                request.setAttribute("list", list);
                mysession.close();
            }
        %>
    	<table class="tc">
    		<colgroup>
    			<col width="10%" />
    			<col width="15%" />
    			<col width="10%" />
    			<col width="10%" />
    			<col width="*" />
    			<col width="10%" />
    			<col width="10%" />
    			<col width="5%" />
    		</colgroup>
    		<tr>
    			<th class="hidden">시리얼넘버</th>
    			<th>게시자</th>
    			<th>날짜</th>
    			<th>수지구분</th>
    			<th>계정과목</th>
    			<th>적요</th>
    			<th>수입</th>
    			<th>지출</th>
    			<th>수정</th>
    		</tr>
    		<%
                for (HomeBook x : list) {
            %>
    		<tr>
    			<td class="hidden"><%=x.getSerialno()%></td>
    			<td><%=x.getmId()%></td>
    			<td><%=x.getDay()%></td>
    			<td><%=x.getSection()%></td>
    			<td><%=x.getAccounttitle()%></td>
    			<td class="subject"> <%=x.getRemark()%></td>
    			<td><%=x.getRevenue()%></td>
    			<td><%=x.getExpense()%></td>
    			<td><a class="point"href="HBcontent_view.do?serialno=<%=x.getSerialno()%>">수정</a></td>
    		</tr>
    		<%
                }
            %>
    	</table>
    
    	<div class="tc pdt50">
    		<a href="homebook_write.jsp">글작성</a>&nbsp;&nbsp; 
    		<a href="index.html">로그인 화면</a>
    	</div>
    </body>
    </html>

    이건 앞으로도 안까먹을듯 ㅋㅋ

    무려 6시간을 삽질했어...;ㅁ;

     

     

    그리고 회원게시판!

    회원 게시판은 로그인에 사용해야하기 때문에 컨트롤러 부분에 로그인을 제어해주는 소스코드가 삽입된다.

    joinOk.do는 memberJoin.html form을 post로 값을 넘겼을때 넘김 받은 값이 처리되는 소스코드이다.

    } else if (command.equals("joinOk.do")) {
    	request.setCharacterEncoding("UTF-8");
    	response.setContentType("text/html; charset=UTF-8");
    	SqlSession mysession = MBUtils.getSession();
    	MyMemberDAO dao = mysession.getMapper(MyMemberDAO.class);
    	MyMember bean = new MyMember();
    	
    	String pw1 = request.getParameter("password");
    	String pw2 = request.getParameter("password2");
    	
    	if(pw1.equals(pw2)) {
    		bean.setPassword(pw1);
    		bean.setId(request.getParameter("id"));
    		bean.setJoindate(new Timestamp(System.currentTimeMillis()));
    		
    		String phone1 = request.getParameter("phone1");
    		String phone2 = request.getParameter("phone2");
    		String phone3 = request.getParameter("phone3");
    		
    		bean.setPhone(phone1+ "-" + phone2+ "-" + phone3);
    		bean.setIswithrew("JOINED");
    		System.out.println("등록할 bean 정보: " + bean);
    		
    		try{
    			int res = dao.insert(bean);
    			if(res==1) {
    				System.out.println("Inset 성공");
    				response.sendRedirect("joinResult.jsp");
    			}else{
    				System.out.println("Inset 실패");
    				response.sendRedirect("memberJoin.html");
    			}
    		}catch(SQLException e) {
    			System.out.println("Inset 실패");
    			response.sendRedirect("memberJoin.html");
    		}
    	}else {
    		System.out.println(request.getParameter("id") + "님 패스워드 확인!");
    		response.sendRedirect("memberJoin.html");
    	}
    	
    	return;

     

    회원가입할 때 반드시 있는 비밀번호 확인!

    String pw1 = request.getParameter("password");
    String pw2 = request.getParameter("password2");
    
    if(pw1.equals(pw2)) { 
    
    
    }else {
    	System.out.println(request.getParameter("id") + "님 패스워드 확인!");
    	response.sendRedirect("memberJoin.html");
    }

    일단 입력한 두 개의 값이 같은지 확인해준다.

    만약 같지 않을 경우 'ㅇㅇ님 패스워드 확인!' 이란 문구가 뜨며 다시 회원가입 창으로 돌아간다.

     

    만약 패스워드가 같으면 아래에 작성한 값을 insert해준다.

    bean.setPassword(pw1);
    bean.setId(request.getParameter("id"));
    bean.setJoindate(new Timestamp(System.currentTimeMillis()));
    
    String phone1 = request.getParameter("phone1");
    String phone2 = request.getParameter("phone2");
    String phone3 = request.getParameter("phone3");
    
    bean.setPhone(phone1+ "-" + phone2+ "-" + phone3);
    bean.setIswithrew("JOINED");
    System.out.println("등록할 bean 정보: " + bean);

     

    그리고 try / catch문으로 결과값 res가 트루인지 확인

    try{
    	int res = dao.insert(bean);
    	if(res==1) {
    		System.out.println("Inset 성공");
    		response.sendRedirect("joinResult.jsp");
    	}else{
    		System.out.println("Inset 실패");
    		response.sendRedirect("memberJoin.html");
    	}
    }catch(SQLException e) {
    	System.out.println("Inset 실패");
    	response.sendRedirect("memberJoin.html");
    }

    값이 참이면 회원가입에 성공!

    정보를 retrun해준다.

    리턴을 해주는 이유는 아래에 있는 else if로 흘러가지 않고 멈추게 하기 위해서이다.

    이 방법은 좋지 않으니 다른 방법을 쓸 수 있는지 찾아봐야함

     

    무엇 하나가 잘못되서 거짓이면 실패되어 다시 값을 입력해야하니 memberJoin.html로 돌아간다.

     

     

    회원가입이 되면 이제 멤버를 로그인 시키는 작업이 필요하다

    이것을 LoginOkCommand.java에서 작업해준다.

    public class LoginOkCommand implements BCommand {
    
    	@Override
    	public void execute(HttpServletRequest request, HttpServletResponse response) {
    		HttpSession session = null;
    		SqlSession mysession = null;
    		try {
    			request.setCharacterEncoding("UTF-8");
    			response.setContentType("text/html;charset=UTF-8");
    			mysession = MBUtils.getSession();
    			MyMemberDAO dao = mysession.getMapper(MyMemberDAO.class);// new BookDAO()
    			
    			String id = request.getParameter("id");
    			String pw = request.getParameter("password");
    			
    			MyMember bean = dao.selectById(id);
    			session = request.getSession();
    			
    			if (bean.getPassword().equals(pw)) {
    				session.setAttribute("id", id);
    				session.setAttribute("pass", "ok");
    				session.setAttribute("member", bean);
    			} else {
    				session.setAttribute("pass", "no");
    			}
    			
    		} catch (Exception e) {
    			session.setAttribute("pass", "no");
    		}
    		mysession.close();
    	}
    }

    파라미터 값 id, password를 가져온다.

    입력한 값이 저장된 값과 같으면 넘어가고 아니면 넘어가지 않는다.

     

    나머지는 전에 했던 것처럼 command파일과 html 파일을 만들어서 코딩해주면 된다.

    물론 아직 자잘하게 손봐야 하는 부분이 많지만 대략적으로 완성된 게시판이다.

     

    다음에 내가 원하는 구성으로 꾸리면 더 잘 만들수 있을 것 같다

     

     

    '기타 > Servlet' 카테고리의 다른 글

    Command 패턴  (0) 2020.12.16
    request, response, doPost(), doGet() 설명  (0) 2020.12.16
    MyBatis에 대한 설명  (0) 2020.12.15
    JSP - 게시판 만들기 연습  (0) 2020.12.15
    JSP-JDBC/mybatis 연습예제  (0) 2020.12.11

    댓글

Designed by Tistory.