2022. 9. 4. 20:37ㆍ코딩/Java
src/main/java
이는 서버측에 관련된 데이터를 모아둔것이다.
commonm은 공통으로 사용되는 사항
controller는 컨트롤을 하기 위한 부분으로써
Servlet으로 만들고 작성시 src/main/webapp/WEB-INF/views/폴더명/jsp명 에서
form태그로 데이터를 전용할때 적어주는 action 주소명이랑 서블릿쪽 명을 맞춰주어야한다.
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);코드로 페이지 이동한다.
전체 코드를 담기에는 분량이 많기때문에
어떤식으로 움직이는지 예시 한가지를 적어보았다.
다른것을 만드는 경우에도 위와같은 순서로 진행이된다.
'코딩 > Java' 카테고리의 다른 글
kh18일차(Server연결 TCP/DNS서버연결, 이를이용한 baseball게임) (0) | 2022.07.13 |
---|---|
kh17일차 InputOutput(WordContorller) (0) | 2022.07.12 |
kh16일차(set,map,PointMgr7,StudentMgr5,Exception,io) (0) | 2022.07.11 |
kh15일차 (Generics,List,studentMgr4,pointMgr5...) (0) | 2022.07.08 |
kh14일차 (0) | 2022.07.07 |