오늘은 JSP 서블릿 포워드와 난수를 뽑아내는 함수 Math.random 을 이용한 간단한 로직을 해봤습니다.
리다이렉트와 포워드 그리고 JSP의 라이프사이클을 천천히 그리고 알아가보면서 세삼 6개월동안 뻘짓했구나 라는 걸 다시 한번 느낍니다.
(망할 강사 같으니..)
확실히 뭘 배우든 첫 단추가 중요하고 가르침을 제대로 줄 멘토가 필요합니다.
아무튼 이렇게 알아보았습니다!!
FrontServlet
package com.forwardServlet.www;
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 FrontServlet
*/
@WebServlet("/Front")
public class FrontServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public FrontServlet() {
super();
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* Front 라고 요청이 들어왔을 때 WAS는 요청을 추상화한 객체에 HttpServletRequest와
* 응답에 필요한 부분을 추상화한 객체에 HttpServletResponse 만들어냈다.
* 그런 다음에 이 서블릿이 실행될 때 service 메서드가 호출할 때
* 각각의 인자값(request, response)에 넣어서 보내준다.
*
*/
int diceValue1 = (int)(Math.random()*6)+1;
//Math 메소드는 0.0 과 같거나 크고 1.0 보다는 작은 값을 출력해낸다.
//0.0 <= x & <1.0
//그렇지만 우리는 1부터 6까지 난수를 뽑으려고 하는 것과 동시에 실수형이라서 int 라는 형변환을 해줘야 한다.
double diceValue2 = ((Math.random()*0.99)+0.1);
/*double diceValue2 = (int)((double)(Math.random()*0.99)+0.1);
//이렇게 하면 0.0 , 1.0 이 두개 밖에 안나온다. 왜그럴까??? */
// diceValue의 값을 NextServlet 한테 넘겨서 출력하게 할 것이다.
// 1. diceValue 의 값을 request한테 맡김. 그렇지 않으면 NextServlet에서 해당 값을 쓸 수 없다.
request.setAttribute("dice1",diceValue1);
// setAttribute를 이용해서 맡길 것 이다.
// String arg0 은 문자열인데 세탁소를 생각하면 쉬울 것 이다.
// 이름으로 맡기고 이름으로 찾는다고 생각하면 쉬운데...지금 여기서의 이름은 dice1 로 정했고 옷은 diceValue1 라는 옷이다!
request.setAttribute("dice2", diceValue2);
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next");
//RequestDispatcher 객체는 request객체로부터 얻어낼 수 있다.
// 이때 인자()는 어디로 이동할지를 적는 것이다. 그리고 반드시 / 를 넣어서 시작.
// 같은 웹 어플리케이션 안에서만 가능하다. 서버가 서버내에서 움직이는 것.
requestDispatcher.forward(request, response);
//forward를 수행할 때 반드시 넘겨줘야할 값은 request와 response이다.
// 왜냐면 처음 요청할때 받아왔던 request, response 객체이기 때문이다.
// 그래야지 해당 요청과 응답을 사용할 수 있다. 그래서 결과를 얻어낼 것이다.
}
}
NextServlet
package com.forwardServlet.www;
import java.io.IOException;
import java.io.PrintWriter;
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 NextServlet
*/
@WebServlet("/next")
//request.getRequestDisoatcher("/next") url을 next 라고 FrontServlet에서 명명해줬기에
//이 쪽으로 넘어올 수 있었던 것. URL 매핑부분
public class NextServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public NextServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//printWriter 객체는 그냥 단순히 출력을 하기 위해서 사용되는 객체
//그렇다면 response.getWriter() 은 뭘까?
//자바에서 웹으로 데이터를 출력하기 위해서 사용되는 것이다.
//response는 응답의 결과를 받아서 클라이언트한테 보여줘야하기 때문에 .getWriter을 쓰는 것이다.
//요청할때 받았던 응답을 이용해서 응답의 결과들을 만들어내고
out.println("");
out.println("form");
out.println("");
int dice1 = (Integer)request.getAttribute("dice1");
double dice2 = (Double)request.getAttribute("dice2");
//아까 세탁소에 맡겼는데 이제는 찾아와야 한다!
//FrontServlet 에서 dice 값을 갖고 있었던 주체는 request 이다.
//FrontServlet 에서 이름을 dice1 이라고 맡겼는데 그럼 찾을땐? 당연히 이름을 넣으면 된다.
//그리고 알아야할 것이 request.setAttribute(String arg0, Object arg1);
//이렇게 되어 있는데 Object 타입이다.
/*
오브젝트 타입은 String, StringBuffer, Boolean, Character, Number
이렇게 있는데 Object는 모든 클래스의 최상위 클래스이다. 그래서 오브젝트를 쓴 것이다.
그렇지만 여기서는 숫자형 즉 int 를 적용했기에 Integer 로 형변환을 해줘야한다.
*/
for (int i=0; i<=dice1; i++) {
out.println("안녕? ");
//i가 dice 보다 작거나 같을 때 까지.
}
for (int b=0; b<=dice2; b++) {
out.print("안녕! ");
// b가 dice2 보다 작을 때 까지.
}
out.println("주사위 값1: "+dice1+"
");
out.println("주사위 값2: "+dice2);
out.println("");
out.println("");
System.out.println("");
//FrontServlet 에서 포워딩을 /next 로 했는데 NextServlet이 실행이 되면 URL은 전혀 변화없이
// /Front 라고 되어 있는 것을 볼 수 있다. 이게 바로 리다이렉트와 포워드의 차이이다.
}
}
}
※ 형변환 Casting 참고 사이트
출처 : https://coding-factory.tistory.com/130