728x90
반응형
오늘은 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 참고 사이트
반응형
'멍청멍청기록 > TO-DO' 카테고리의 다른 글
향후계획] 정리를하자. (0) | 2020.08.06 |
---|---|
ajax 로 시간 데이터를 javascript로 갖고와서 출력 (0) | 2019.11.06 |
php소스 (0) | 2019.07.03 |
printf 를 써보자 (0) | 2019.03.11 |