KOSTA 28일차) request, response, forward, RequestDispatcher, sendRedirect

해버니·2023년 4월 10일
0

KOSTA

목록 보기
22/32
post-thumbnail

webApp2 프로젝트 새로 만들기


new Project로 프로젝트를 만들고
Dynamic web module version은 3.1로 만들어주기










라이브러리 폴더는 WEB_INF에다가 넣어주면 된다.

conn, member 패키지는 옛날에 쓰던 파일을 가져왔다.

나의 ojdbc6.jar의 위치
C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib 이다.











webApp2 > src/main/java > member 안에 서블릿 만들기
이름은 Join으로 만들었음









html은 자바의 언어를 인식 못한다.
jsp는 자바의 언어를 인식할 수 있기 때문에 이걸로 만드는 것이다.
src/main/java폴더에는 .java의 자바 파일을 넣어주는 곳이고
webApp 폴더에는 view단의 파일을 넣어주는 것이다.








Join.java 에서

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	RequestDispatcher dis = request.getRequestDispatcher("/index.jsp");
	dis.forward(request, response);
}

위와같이 하면 index로 안넘어가지고 join 상태로 남아있어 새로고침을 하게 되면 기존 회원가입의 정보들을 다시 데이터베이스에 넣는것과 같아진다 => ❗ 오류 발생 ❗
그래서 밑처럼 바꿔야 한다.






protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	response.sendRedirect("/webApp2/index.jsp");
}

쓰기에서는(제출하는 방식에서는) Redirect 방식으로 해준다.



















만약에 서블릿 만들었는데 빨간줄이 뜬다면


프로젝트 우클릭 > Properties > Project Facets > 오른쪽에 Runtimes 클릭 > Apache Tomcat 체크해주기










왜 안 되는겨 : Periodic workspace save.


계속 'Periodic workspace save.' has encountered a problem. 이 떠가지고
찾아본 다음에 파일을 하나 생성해줬다.
과연 다음엔 안뜰런지..





그래도 뜬다.. 다른 방법을 찾아봐야겠어



이걸 삭제해도 해결이 안되네.. 흑흑
뭐 때문에 그럴까...

근데 컴퓨터 끄고 다음날에 다시 해보니까 저런 에러는 더이상 뜨지 않았다고 한다...


















webApp2

member 패키지 (server)

Join.java

회원가입하는 서블릿

package member;

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;

/**
 * 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요청시 회원가입 폼을 준다. 
    // 보여주면 사용자는 회원가입 폼을 채우겠지
    // 그럼 post가 되겠지
	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());
		// 작업하는 순서
		// 1. 요청받음
		// 2. 서비스 메서드 요청을 처리
		// 3. 처리 결과 페이지로 이동
        
		RequestDispatcher dis = request.getRequestDispatcher("/member/Join.jsp");
		dis.forward(request, response);
		// RequestDispatcher : request와 response 객체를 가지고 페이지 이동
        //같은 서버내 이동이기 때문에 webApp2/member/Join.jsp라고 안써줘도 된다.
		// 근데 response.sendRedireact는 말그래도 redirect이기 때문에 다시 접근을 해야해서 
        // /webApp2/index.jsp 라고 써줘야 하는 것이다. 
        
        
		// dis.foward()는 생성자 파람으로 이동할 뷰 페이지 경로. 
		// 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
		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));
		
		response.sendRedirect("/webApp3/index.jsp");
		// 클라이언트에 페이지를 새로 요청하도록 시킴
		// 뭐가 달라요? request 객체가 새것이다. 
		// request가 새 객체이므로 이전에 저장한 데이터 모두 없어짐 
		
        
		//RequestDispatcher dis = request.getRequestDispatcher("/index.jsp");
		//dis.forward(request, response);
		// forward 방식이 쓰기에서는 적절하지 않다.
		// 새로고침하면 회원가입 한 것을 다시 보내게 되어 오류가 발생함
		// 왜냐하면 아이디는 중복될수없기 대문에?
		// 그래서 바로 주는 것이 아니라 redirect 방식으로 보내야 한다. 
	}

}









member.controller 패키지 (server)

Del.java

탈퇴하는 서블릿


	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		String id = request.getParameter("id");
		
		MemberService service = new MemberService();
		service.delMember(id);
		
		response.sendRedirect("/webApp2/index.jsp");
		
		//RequestDispatcher dis = request.getRequestDispatcher("")
		//dis.forward(request, response);
		// post나 get이나 아무거나해도 상관없다.
		// 그냥 삭제하면 되는것이기 때문에 
		
	}

	/**
	 * @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);
	}

}













Editmyinfo.java

나의 정보 변경하는 서블릿

변경하기 전 정보를 보여주고
변경해주기

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
     // 정보 보여주고
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String id = request.getParameter("id");
		// 현재의 id를 불러준다.
        
		MemberService service = new MemberService();
		MemberVo vo= service.getMember(id);
		// id로 service에서 만든 id로 vo 객체를 불러온다.
        
		request.setAttribute("m", vo);
		//vo 객체를 뷰페이지에서는 m이라는 변수명(?) 으로 지정해줬다.
		
		// a href="/webApp2/Editmyinfo?id=${m.id } 여기의 아이디를 받아오는 것 (myinfo.jsp)
		// 그럼 위에있는 id로 검색해서 검색 결과를 request에 담아서 forward방식으로 (/member/edit.jsp) 뷰페이지로 이동 
		RequestDispatcher dis= request.getRequestDispatcher("/member/edit.jsp");
		dis.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
		String id = request.getParameter("id");
		String pwd = request.getParameter("pwd");
		String name = request.getParameter("name");
		
		MemberService service = new MemberService();
		service.editMyInfo(new MemberVo(id , pwd, name, ""));
		
		response.sendRedirect("/webApp2/MyInfo?id=" + id);
	}

}





























webapp/member (client)

edit.jsp

<%@ 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>
<table border="1">
	<tr><th>ID</th><td>${m.id }</td></tr>
</table>
<br/>


<form action="/webApp3/Editmyinfo" method="post">
	<table border="1">
		<tr><th>ID</th><td><input type="text" name="id" value="${m.id } " readonly></td></tr>
<!-- 		readonly쓰면 값을 고치지 못한다. -->
		<tr><th>PWD</th><td><input type="text" name="pwd" value="${m.pwd }"></td></tr>
		<tr><th>NAME</th><td><input type="text" name="name" value="${m.name }"></td></tr>
		<tr><th>EMAIL</th><td><input type="text" name="email" value="${m.email }" readonly></td></tr>
		<tr><th>수정</th>
		<td><input type="submit" value="수정">
		<input type="button" value="취소" onclick="javascript:location.href='/webApp3/index.jsp'">
		</td></tr>
	</table>
</form>
</body>
</html>













join.jsp

<%@ 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>
<form action="/webApp3/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="text" 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" name="가입"></td></tr>
	</table>
</form>

</body>
</html>













myinfo.jsp

<%@ 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>
<%-- ${} : el표현식  --%>
<!-- 이 el은 자바에서 쓰던 변수를 가져와서 뷰페이지에서 쓸 수 있다. -->
<!-- m.getId() 라고 하지 않고 m.id라고만 써도 get을 인식해서 getter을 호출해서 값을 가져온다. -->
<!-- 그래서 getter setter 작성을 잘해야한다. 안하면 저 값을 가져오지 못함 -->


<h3>${m.id}님의 정보</h3>
id : ${m.id} <br/>
pwd : ${m.pwd} <br/>
name : ${m.name} <br/>
email : ${m.email} <br/>
<a href="/webApp3/Editmyinfo?id=${m.id }">내 정보 수정</a>
수정폼을 보여주고
입력받고
다시 업데이트하기

</body>
</html>













webapp

index.jsp

<%@ 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>webApp2</h3>
	<a href="/webApp3/Join">회원가입</a>

	<!-- a로 이동하는 것은 get 방식 -->
	<!-- 그러면 doGet이 실행이 된다. -->

	<form action="/webApp3/MyInfo" method="post">
		검색할 id <input type="text" name="id">
		<input type="submit" value="검색">
	</form>
	
	<form action="/webApp3/Del" method="post">
		탈퇴할 id <input type="text" name="id">
		<input type="submit" value="검색">
 	</form>
</body>
</html>













궁금

form 태그의 method 속성 (GET & POST)


method 속성은 속성값으로는 GET과 POST 두 가지 중 하나를 선택할 수 있다.




GET 방식

GET 방식은 URL에 폼 데이터를 추가하여 서버로 전달하는 방식
GET 방식은 보통 쿼리 문자열에 포함되어 전송되므로, 길이의 제한이 있다.
따라서 보안상 취약점이 존재하므로, 중요한 데이터는 POST 방식을 사용하여 요청하는 것이 좋다.

(엽서를 보내는 방식과 유사한 전송)
전송할 데이터를 문자열 형태(Query String)로 URL 뒤에 인수로 붙여서 전송하는 방식이다.
URL 뒤에 인수로 붙어 있는 내용을 누구나 볼 수 있고 이로 인해 보안성이 취약하다고 할 수 있다.
여러 가지 형태를 통해 간편한 데이터 전송이 가능하다.








POST

POST 방식은 폼 데이터를 별도로 첨부하여 서버로 전달하는 방식
POST 방식의 HTTP 요청은 브라우저에 의해 캐시되지 않으므로, 브라우저 히스토리에도 남지 않는다.
또한 POST 방식의 HTTP 요청에 의한 데이터는 쿼리 문자열과는 별도로 전송된다.
따라서 데이터 길이에 대한 제한도 없으며, GET 방식보다 보안성이 높다.
파일의 형태로 전송되기 때문에 URL 상에서는 내용이 나타나지 않는다.
POST 방식은 HTTP Body 안에 숨겨져서 전송된다.












requestdispatcher, forward()

forword() : 페이지 출력, 페이지 전환
sendRedirect() : 특정 url로 재요청






RequestDispatcher

RequestDispatcher 객체는 다른 페이지로 이동하는 forward() 또는 include() 메소드를 가지고 있는 객체이다.
(두 가지가 있다 ① forward(), ② include())

forward(ServletRequest reques, ServletResponse response) : 요청을 다른 자원으로 넘긴다.
include(ServletRequest request, ServletResponse response) : 다른 자원의 처리 결과를 현재 페이지에 포함시킨다.









protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String id = request.getParameter("id");
		MemberService service = new MemberService();
		MemberVo m = service.getMember(id);
		// 페이지 이동하면 데이터는 사라지기 때문에 request에 담아준다.
		// 검색한 결과를 request에 담는다.
		// setAttribute(view 페이지에서 부를 이름, 값);
		
		request.setAttribute("m", m);
		// 객체, 문자, 숫자 등 아무거나 넣어도 된다. 
		
		RequestDispatcher dis=request.getRequestDispatcher("/member/myinfo.jsp");
		dis.forward(request, response);
	}

getRequestDispatcher()메소드의 인자값으로 이동할 페이지의 경로를 지정해준다.
내장된 객체엔 request를 통해 메서드를 호출하고 있다.









🎈forward

forward(request, response)

두 객체는 해당 주소에 대해 요청하고 응답하라 라는 뜻이 담겨있다.


🎈 request.setAttribute

request.setAttribute("키이름", 값)

에 의한 키이름에 저장된 값을 유지한다.


🎈 session.setAttribute

session.setAttribute("키이름", 값)

로그인 인증한 세션 아이디값도 유지한다.












response.sendRedirect()

response.sendRedirect("/webApp2/MyInfo?id=" + id);

응답을 클라이언트가 요청한 URL이 아니라 sendRedirect()에 주어진 URI로 재전송한다.

redirect : 재요청
redirect는 요청과 응답을 완료한 후 재요청을 한다.
기본적으로 요청을 할 때는 request(요청)와 response(응답)객체를 사용한다.
재요청할 때는 request와 response 객체를 사용하고 재요청을 하게 되면서 request 객체를 한 번 더 만들어 처리한다.

가끔 때로는 redirect처리를 해야할 때가 있다.
예를들어 글쓰기 요청이 끝난 후에 바로 글목록 페이지가 뜰 수 있도록~!
그니까 레코드를 저장/수정/삭제 후 변경된 디비 레코드 값을 다시 확인하고자 하는 경우 redirect를 사용한다.






0개의 댓글