본문 바로가기
개발자의 공부방/TO-DO

랜덤값을 뽑아보자 (Math.random)

by 쌈빡한 쥬니준 2019. 2. 12.



오늘은 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

'개발자의 공부방 > TO-DO' 카테고리의 다른 글

향후계획] 정리를하자.  (0) 2020.08.06
ajax 로 시간 데이터를 javascript로 갖고와서 출력  (0) 2019.11.06
php소스  (0) 2019.07.03
printf 를 써보자  (0) 2019.03.11
랜덤값을 뽑아보자 (Math.random)  (0) 2019.02.12

댓글0