① 웹 브라우저를 실행 해 주었을 때 처음으로 보이는 index 페이지를 생성해준다. 해당 파일은 jsp 형식으로 작성 되었다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!-- 서브릿 페이지와 비슷하지만 이건 html 처럼 뷰페이지를 보여준다. -->
<!-- jsp는 자바 기반이라 자바에서 검색한 결과를 줘도 인식한다는 점이 html과 다르다 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h3>홈페이지 메인 페이지 같은 느낌 </h3>
<a href = "/webApp2/join">회원가입</a>
<!-- webApp2의 멤버패키지의 조인 -->
<!-- 회원 가입을 누르면 해당 링크가 join.jsp로 이동 할 것이다. -->
<!-- 이동한 jsp에서 클라이언트가 입력을 하면 해당 입력값을 join servlet 페이지로 보낼 것이다 -->
<!-- 링크로 이동 하는건 get 방식이라 서브릿의 doGet이 호출 된다. -->
<!-- 고객은 회원가입을 누르면 회원가입 폼이 나타날꺼라 예상한다. -->
<!-- 그러면 서브렛은 doGet 방식을 통해 회원가입 폼을 주어야한다. -->
<form action = "/webApp2/MyInfo" method = "post">
<!-- 검색이라는 버튼을 누르면 input type = "submit" 에 의해
form action = "/webApp2/MyInfo"으로 이동하게 된다. -->
검색할 id: <input type = "text" name = "id">
<input type = "submit" value = "검색">
</form>
<!-- 현재 /webApp2/MyInfo 에서는 테이블 형식으로 form 을 구현 해 놓았다.
그렇게 때문에 서브렛에서 따로 값을 불러와서 형식을 구현 해줄 필요가 없다. -->
</body>
</html>
② 회원가입을 누르게 되면 나타날 화면 구현 하기
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h3>회원가입</h3>
<!-- 서브렛 경로를 나타내고 있으며 input type = "submit"을 누르면
form action = "/webApp2/join"이동하여 post 방식으로 진행한다 -->
<form action = "/webApp2/join" method = "post">
//테이블을 이용해서 입력 형식을 깔끔하게 만들어 주었다
<table border = "1">
<tr><th>ID</th><td><input type = "text" name = "id"></td></tr>
<tr><th>PWD</th><td><input type = "password" name = "pwd"></td></tr>
<tr><th>NAME</th><td><input type = "text" name = "name"></td></tr>
<tr><th>EMAIL</th><td><input type = "text" name = email"></td></tr>
<tr><th>가입</th><td><input type = "submit" value = "가입"></td></tr>
</form>
</table>
</body>
</html>
③ 회원 가입 폼을 주고 입력 값 받기
doGet 으로만 구현을 했기 때문에 가입을 누르면 아무 일도 일어나지 않는다.
데이터 베이스에 저장 되어 가입이 완료 되었다는 것을 안내 해 줄 doPost는 ④에 있다.
package memeber.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 member.MemberService;
import member.memberVo;
/**
* Servlet implementation class join
*/
//이 페이지에 접근 할 수 있는 경로
@WebServlet("/join") //요청을 받는 애가 이 서브렛 프로젝트 이름 밑에 경로.
public class join extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public join() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
//get 요청 시 회원가입 폼을 준다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("euc-kr");
response.setCharacterEncoding("euc-kr");
response.setContentType("text/html; charset = EUC-KR");
response.getWriter().append("Served at: ").append(request.getContextPath());
RequestDispatcher dis = request.getRequestDispatcher("member/join.jsp");
dis.forward(request, response);
}
//doPost 도 있는데 그건 밑에서 다시 설명
}
● @WebServlet("/join")
join.jsp의 요청을 받아 수행함으로 join.jsp 의 경로를 나타낸 것이다.
● protected void doGet
index의 <a href = "/webApp2/join"> 이 링크 클릭을 통해 이루어지는 행위로 get을 요청 한 것이고 회원가입 폼을 클라이언트의 뷰에 보여준다. 그 회원가입 폼은 join.jsp에 있다.
● request.setCharacterEncoding("euc-kr");
response.setCharacterEncoding("euc-kr");
response.setContentType("text/html; charset = EUC-KR");
한글인코딩이 깨지는 것을 방지 하기 위해 작성 해준 코드이다.
● RequestDispatcher dis = request.getRequestDispatcher("member/join.jsp");
RequestDispatcher는 다른 페이지로 이동한다는 forwar() 와 include() 메소드를 가지고 있는 객체이다.
여기서 '이동'이란 다른 뷰 페이지이 파일을 출력해 주는 것이다. 또한 RequestDispatcher 객체를 생성 할때는 new 를 이용하는 것이 아니라 HttpServletRequest 객체의 request 를 이용 하며 인자값으로 이동할 페이지의 경로를 지정한다.
● dis.forward(request, response);
그렇게 생성 된 ids 라는 이름을 가진 RequestDispatcher 객체는 forward() 를 통해 페이지를 이동하는데 이동하면서 내장 객체인 request 와 response 를 이동 하는 페이지에 넘겨 주고 있다.
④ 사용자가 입력한 데이터로 처리를 완료 해주기
join.jsp를 통해 입력한 내용이 request 객체에 담겨져서 toPost로 넘어 온다. 따라서 사용자가 입력한 name 에 해당 하는 내용들을 request.getParameter() 로 추출 해 내야 한다.
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
String name = request.getParameter("name");
String email = request.getParameter("email");
MemberService service = new MemberService();
service.join(new memberVo(id,pwd,name,email));
// RequestDispatcher dis = request.getRequestDispatcher("/index.jsp");
// dis.forward(request, response);
//여기서 회원가입 후 ("/index.jsp"); 여기로 돌아오고 리프레시 누르면 오류가 뜨는데 그건 다시 회원가입폼을 전달하기 때문이다.
//이렇게 중복이 불가한 내용을 사용할때는 forword 보다는 redircet 방식이 더 적합하다 .
response.sendRedirect("/webApp2/index.jsp")
}
}
● 입력 값을 작성하고 가입 버튼을 누르 면 join.jsp 의 <form action = "/webApp2/join" method = "post"> 과 <input type = "submit" 에 의하여 join servlet 의 protected void doPost로 이동한다.
● String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
String name = request.getParameter("name");
String email = request.getParameter("email");
getParameter()를 이용해 입력한 요청(request) 값을 파라미터로 넣어준다. 각 () 안에 들어가 있는 것들은 join.jsp에서 입력한 name 에 해당하며 입력 값이 value 로 넘어와 선언해준 변수 String 에 할당 된다.
● MemberService service = new MemberService();
클라이언트는 '가입'이라는 버튼을 눌렀을 때 기대했던 건 자신이 입력한 정보가 저장 되어 해당 웹 브라우저를 사용 할 수 있게 하는 것이다. 가입하는 메서드는 MemberService에 구현 해 두었음으로 MemberService를 객체로 생성 시켜준다.
● service.join(new memberVo(id,pwd,name,email));
객체로 생성 한 MemberService 의 service 안에 있는 join 메서드를 실행 시켜 받아온 변수들을 파라미터로 넣어준다.
● response.sendRedirect("/webApp2/index.jsp");
response.sendRedirect 매서드는 클라이언트가 요청한 페이지가 아닌 sendRedirect()로 주어진 url로 재전송 한다. 이 메소드는 주로 서버의 특정 자원이 다른 url로 이동할 떄 사용 할 수 있는 메서드이다.
그렇다면 왜 RequestDispatcher() 의 forward() 를 안쓰고 sendRedirect() 를 쓰는 것 일까?
예를 들어 내가 친구한테 백만원을 전송했는데 다시 forward()매서드를 이용해 페이지에 돌아오면 다시 또 백만원을 전송하게 된다. 이말은 forward()는 서버내에서 같은 페이지를 계속해서 불러올 수 있다는 의미이고 이런 것을 방지 하기 위해 서버를 한번 나갔다가 다시 경로를 요청 하는 것이 Redirect라고 할 수 있다.
'MVC > jsp & servlet' 카테고리의 다른 글
[jsp와 servlet] jsp와 servlet을 이용한 회원 탈퇴 (0) | 2023.03.27 |
---|---|
[jsp와 servlet] jsp와 servlet을 이용한 내 정보 수정 하기 (0) | 2023.03.27 |
[jsp와 servlet] jsp와 servlet를 이용한 내 정보 검색 (0) | 2023.03.27 |
[jsp와 servlet] 오라클과 연동 후 service 페이지 구현 (0) | 2023.03.27 |
JSP 와 Servlet (0) | 2023.03.27 |