다이나믹 웹 프로젝트 진행순서,방식

2022. 9. 4. 20:37코딩/Java

src/main/java

이는 서버측에 관련된 데이터를 모아둔것이다.

commonm은 공통으로 사용되는 사항

 

controller는 컨트롤을 하기 위한 부분으로써 

Servlet으로 만들고 작성시 src/main/webapp/WEB-INF/views/폴더명/jsp명 에서

form태그로 데이터를 전용할때 적어주는 action 주소명이랑 서블릿쪽 명을 맞춰주어야한다.

jsp에서 form태그

Class name을 맞추고 끝이 아니라 Next를 누르고

Name에 Servlet을 빼고 URL mappings 를 내가 form에 지정한 URL과 맞춘다.

이때 중요한건 mapping과 form의 URL을 맞추는 것이고 앞의 이름 지정은 내가 알아보기 쉽게하기위해 이름을 맞춰주는 것이다.

 

dao,service,vo는 기존의 java 프로젝트할때와 개념이 같다.

 

하단부 src/main/webapp

index.jsp는 웹페이지 접속했을때 가장 먼저 보이는 페이지이다.

common은 header,footer 같이 공통사항을 넣어둔 폴더이다.

member는 유저정보에 관련된 데이터를

notice는 게시판에 관련된 데이터를 모아두었다.

 

 

 

이동순서 예시

index.jsp 가  첫화면 이때 header.jsp 부분의 SIGN UP 을 누르면 

컨트롤러 부분의 SignupFrmServlet 으로 이동

헤더에서 값을 따로 추출하고 로직을 돌려서 무언가를 전송할려는것이 아닌

단순히 페이지를 /WEB-INF/views/member/signupFrm.jsp로 이동시킬려는것이다.

WEB-INF안쪽으로는 a나 form태그로 바로 이동할수가 없고 Servlet을 이용해서

forward를 이용해 이동해야한다.

 

signupFrm은 가입하기위한 페이지로써

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>

<style>
	.input-wrap{
		padding: 15px;
	}
	.input-wrap>label{
		font-size : 1.1em;
		margin-bottom: 10px;
		display: block
	}
	.submit-btn{
		padding: 15px;
		margin: 20px 0px;
	}
	.input-wrap>.id-wrap{
		display: flex;
	}
	.input-wrap>.id-wrap>#memberId{
		width:80%;
	}
	.input-wrap>.id-wrap>#idChkBtn{
		width:20%;
	}
</style>

</head>
<body>
	<%@include file="/WEB-INF/views/common/header.jsp" %>
	<div class="page-content">
		<div class="page-title">회원가입</div>
		
		<form name="checkIdFrm" action="/checkId.do">
			<input type = "hidden" name="checkId">
		</form>
		
		<form action="/signup.do" method ="post">
			<div class="input-wrap">
				<label for="memberId">아이디</label>
				<div class="id-wrap">
					<input type="text" name="memberId" id="memberId" class="input-form">
					<button type="button" id="idChkBtn" class="btn bc2">중복체크</button>
				</div>
			</div>
			
			<div class="input-wrap">
				<label for="memberPw">비밀번호</label>
					<input type="password" name="memberPw" id="memberPw" class="input-form">
			</div>
			
			<div class="input-wrap">
				<label for="memberName">이름</label>
					<input type="text" name="memberName" id="memberName" class="input-form">
			</div>
			
			<div class="input-wrap">
				<label for="memberPhone">전화번호</label>
					<input type="text" name="memberPhone" id="memberPhone" class="input-form">
			</div>
			
			<div class="input-wrap">
				<label for="memberAddr">주소</label>
					<input type="text" name="memberAddr" id="memberAddr" class="input-form">
			</div>
			
			<div class="submit-btn">
			<!-- btn 버튼모양 bc66버튼색상 bs4 버튼사이즈 -->
				<button type="submit" class="btn bc66 bs4">회원가입</button>
			</div>
		</form>
	</div>
	<script>
		//직접할때는 스크립트는 따로빼서할것 선생님이랑 하니까 보기편하라고 여기다함
		$("#idChkBtn").on("click",function(){
			//멤버아이디는 누른이것의 이전요소의 값
			const memberId = $(this).prev().val();
			if(memberId == ""){
				alert("아이디를 입력하세요");
				return;
			}
			//이름이 체크아이디 인놈의 값에 memberId 입력
			$("[name=checkId]").val(memberId);
			const popup = window.open("","checkId","left=700px,top=300px,width=300px,height=200px,menubar=no,status=no,scrollbars=yes")
				//새창에서 from태그를 전송하기위한 연결작업
			$("[name = checkIdFrm]").attr("target","checkId");
			$("[name = checkIdFrm]").submit();
		});
	</script>
	<%@include file="/WEB-INF/views/common/footer.jsp" %>
</body>
</html>

form태그로 데이터를 받아서 전송해줄 요소를 감싸고 있고 name으로 구분해서 전달을 한다.

가입버튼을 누를시 form 태그 action 부분에 있는 signup.do 로 이동

컨트롤러 부분에 SignupServlet 를 생성하고 연결시켜 이동시킨다.

 

package kr.or.iei.member.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.or.iei.member.model.service.MemberService;
import kr.or.iei.member.model.vo.Member;

/**
 * Servlet implementation class SignupServlet
 */
@WebServlet(name = "Signup", urlPatterns = { "/signup.do" })
public class SignupServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public SignupServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.인코딩
		request.setCharacterEncoding("utf-8");
		//2.값추출
		String memberId = request.getParameter("memberId");
		String memberPw = request.getParameter("memberPw");
		String memberName = request.getParameter("memberName");
		String memberPhone = request.getParameter("memberPhone");
		String memberAddr = request.getParameter("memberAddr");
		
		Member m = new Member();
		m.setMemberId(memberId);
		m.setMemberPw(memberPw);
		m.setMemberName(memberName);
		m.setMemberPhone(memberPhone);
		m.setMemberAddr(memberAddr);
		
		//3.비즈니스로직
		MemberService service = new MemberService();
		int result = service.insertMember(m);
		//4.결과처리
		 RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
	      if(result>0) {
	         request.setAttribute("title", "회원가입성공");
	         request.setAttribute("msg", "환영합니다!");
	         request.setAttribute("icon","success");
	      }else {
	         request.setAttribute("title", "회원가입실패");
	         request.setAttribute("msg", "관리자에게 문의하세요!");
	         request.setAttribute("icon","error");
	      }
	      request.setAttribute("loc","/");
	      view.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

위의 SignupFrmServlet 과는 달리

페이지를 이동시키기만 하기위한 Servlet이 아닌 데이터를 처리하기 위한 Servlet이기 때문에

인코딩, 값추출,비지니스로직,결과처리를 한뒤 페이지를 이동해야한다.

 

1. 인코딩에서

request.setCharacterEncoding("utf-8");

로 인코딩 한 후에

2.값추출에서

signupFrm 에서 form태그로 묶여있는

아이디,비밀번호,이름,전화번호,주소 값을

request.getParameter("지정한name명"); 식으로 추출 해서  Member 타입 변수로 저장

String memberId = request.getParameter("memberId");
		String memberPw = request.getParameter("memberPw");
		String memberName = request.getParameter("memberName");
		String memberPhone = request.getParameter("memberPhone");
		String memberAddr = request.getParameter("memberAddr");
		
		Member m = new Member();
		m.setMemberId(memberId);
		m.setMemberPw(memberPw);
		m.setMemberName(memberName);
		m.setMemberPhone(memberPhone);
		m.setMemberAddr(memberAddr);

3.비즈니스 로직 에서

서비스 생성

MemberService service = new MemberService();
		int result = service.insertMember(m);

3-2 . 서비스에서 dao 생성

public int insertMember(Member m) {
		Connection conn = JDBCTemplate.getConnection();
		int result = dao.insertMember(conn,m);
		if(result>0) {
			JDBCTemplate.commit(conn);
		}else {
			JDBCTemplate.rollback(conn);
		}
		JDBCTemplate.close(conn);
		return result;
	}

3-3. 생성된 dao에서 데이터베이스에서 실행할 쿼리문 작성

?는 위치홀더이고

pstmt = conn.prepareStatement(query);

쿼리문 실행

pstmt.setString(1, m.getMemberId());

1번 위치홀더에 얻은 MemberId 값을 넣겠다는 의미이다.

result = pstmt.executeUpdate();

쿼리문이 실행되고 성공하면 1행성공했습니다의 1값을 받고 실패하면 0을 받는다.

Servlet,Service,Dao에서 result를 int 형식으로 받는 이유이다.

public int insertMember(Connection conn, Member m) {
		PreparedStatement pstmt = null;
		int result = 0;
		String query = "insert into member_tbl values(member_seq.nextval,?,?,?,?,?,3,to_char(sysdate,'yyyy-mm-dd'))";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, m.getMemberId());
			pstmt.setString(2, m.getMemberPw());
			pstmt.setString(3, m.getMemberName());
			pstmt.setString(4, m.getMemberPhone());
			pstmt.setString(5, m.getMemberAddr());
			result = pstmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCTemplate.close(pstmt);
		}
		return result;
	}

성공하면 result가 0보다 초과인지 아닌지로 구분하여

Service에서 성공시 commit 실패하면 rollback 을 실행한다음 결과를 서블릿으로 전달

 

4.결과처리

Service에서 전달된 값으로 성공 실패를 확인후 유저에게 알려준다.

 

결과 처리후 request.setAttribute("loc", "/"); 코드로 이동할 경로를 지정해준다음

view.forward(request, response);코드로 페이지 이동한다.

 

전체 코드를 담기에는 분량이 많기때문에

어떤식으로 움직이는지 예시 한가지를 적어보았다.

 

다른것을 만드는 경우에도 위와같은 순서로 진행이된다.