DAY_044[국비] 자바 웹프로그래밍 과정

Bona의 블로그 입니다.·2022년 11월 29일
0

국비과정

목록 보기
44/99

 ⛅ Day 044 

  • JSP, Servlet

 🎁 Calendar 

  1. 달력이될 table 만들기

  2. 빈칸+첫째주
    (1) 1일 바로 전까지
       for(date=1; date<START_WEEK; date++)

    (2) 1일부터 1주 토요일까지
       for(date=1; date<=8-START_WEEK;date++)

  3. 2~5주 채우기
    (1) 출력하는 달의 마지막 날까지
       : date변수를 계속 사용하여 1주 토요일 다음 일부터 말일까지
       if(date <= eDay.get(Calendar.DATE))

  4. 이전달, 다음달
    (1) a태그의 href에 파라미터를 추가한 주소를 넣어서 전달한다.
        이 때 jsp를 이용해서 전달한다.
        받을 때 request를 이용하여 변수를 이용할 수 있도록
        href="07_Calendar.jsp?sYear=<%=sYear %>&sMonth=
        <%=sMonth-1 %>"
        sMonth는 이전달은 -1 다음달은 +1을 해서 보낸다.

    (2) 같은 jsp파일로 돌아오기때문에 "이전달"이나 "다음달"을 클릭하고
        이동해서 왔을 때 파라미터를 받을 jsp 코드를 추가한다.
        파라미터를 받았을 때만 적용되어야 하므로 if문을 사용해서
        변수를 선언한 코드 바로 아래에 작성한다.

  1. 오늘날짜에 배경색 추가
    (1) 오늘의 년도, 월, 일을 받을 객체와 변수 추가

    (2) 오늘의 년도, 월, 일이 일치하면 배경색이 추가된 td태그 생성
    • date를 이용하여 "일"을 추가하는 for문 안에 위 블럭의 if문을 추가한다. 1주의 for문에도 추가한다.

 🎁 Operator 

  • JSP에서도 +, -, *, / 연산자 사용이 가능

  • out.print()
    : System.out.print()와 비슷해보이지만 이 메서드는 웹페이지에서 출력하는 메서드이다.

  • System.out.println()
    : jsp 영역 안에서 여전히 사용가능하다, 콘솔창 출력


 🎁 Declare 

  • 위 코드 블럭에서 변수 c는 브라우저를 새로고침하거나 다시 켜도 11이다.
    그러나 a는 새로고침하거나 심지어 브라우저를 껐다가 다시켜도
    (서버를 끄거나 재시작하지 않는 한) 값이 점점 늘어난다.

  • 선언부(Declare)에 선언된 변수는 전역변수처럼 사용되어,
    jsp페이지 어디에서나 사용 가능하며, 값도 일관되게 유지된다.
    또한 페이지를 새로고침해도, 이전 값이 유지되는 특성이 있으며,
    이는 나중에 공부하게 될 세션값과 비슷하게 작용되어 서버가 재설정 될 때까지 값이 유지되는 특성이 있다.


 🎁 Import 

  • JSP파일에서 import하는 방법
    • <%@ page import="java.text.SimpleDateFormat"%>
    • <%@ page import="java.util.Calendar"%>
    • <%@ page import="java.util.Date"%>

 🎁 Request 

  • Request
    : 주로 서버에서 정보를 요청할 때 사용하는 객체이며,
    객체의 각 정보들을 이용하여 사이트에 유용한 설정 및 실행에 이용한다.
  • Request 객체가 담고 있는 정보들
    • 컨텍스트 패스 : <%=request.getContextPath() %>
      /WEB07_JSP_SERVLET
    • 요청방식 : <%=request.getMethod() %>
      GET
    • 요청한 URL : <%=request.getRequestURL() %>
      http://localhost:8090/WEB07_JSP_SERVLET/02/04_Request.jsp
    • 요청한 URI : <%=request.getRequestURI() %>
      /WEB07_JSP_SERVLET/02/04_Request.jsp
    • 서버의 이름 : <%=request.getServerName() %>
      localhost
    • 프로토콜 : <%=request.getProtocol() %>
      HTTP/1.1

 🎁 Include 

  • 탬플릿 같은.. 반복 코드를 줄일 수 있는 방법

  • 호출(?!) 하는 쪽

  • footer로 사용할 jsp파일의 코드




 🎄 Login - jsp파일을 사용한 


 🎁 loginForm 

  • form태그와 input으로 입력받은 정보를 062_login_do.jsp파일로 post방식으로 보낸다.

  1. 로그인폼에 아이디와 패스워드를 입력 후 로그인버튼(submit) 클릭

  2. action 으로 지정된 페이지에 가서 아이디와 패스워드를 검증
    (유효한 아이디인가, 그 아이디에 맞는 정확한 패스워드 인가)

  3. 검증을 마친 결과(로그인 성공 or 아이디가 없습니다. or 패스워드가 틀립니다.)를 갖고 결과 페이지로 이동

  4. 아이디와 패스원드 검증은 보통 서버 내부에서 실행되는 JAVA 프로그래밍으로 이루어진다. (별도의JAVA클래스 생성)

  5. 그 자바프로그램의 시작을 서블릿이라고 하며, 외부에는 노출되지 않는다.

  6. 아직 그부부까지 학습하기 전이기때문에 이번 예시는 062_login_do.jsp파일안에서 그 작업을 실행(코드외부 노출가능)


 🎁 login_do 

  • 아이디와 비밀번호의 유효성 검사하는 파일

  • response.sendRedirect("063_loginOk.jsp?name=" + URLEncoder.encode("홍길동","UTF-8"));
    로그인이 성공할 경우 보여질 페이지로 정보를 전달한다.

 🎁 login_ok 

  • 로그인이 성공할 경우 보여질 파일

  • request.getParameter("name")로 login_do에서 보낸 정보를 받아서 사용할 수 있다.




 🎄 Forward 


 🎁 ForwardForm 

<body>
  입장하려면 나이를 입력하세요<br>
  <form action="072_Forward_do.jsp">
      <input type="text" name="age">
      <input type="hidden" name="abc" value="가나다라">
      <input type="submit" value="입장">
  </form>
</body>

 🎁 Forward_do 

  • request 객체에는 Attribute라는 저장소(HashMap형식과 비슷한 멤버변수)가 있다.

  • 전달할 데이터를 Attribute에다가 각 자료의 이름과 값을 같이 정하고. forward(이동)하면 목적지에 해당 데이터가 같이 적용된다.

  • Attirbute 라는 저장소에 name이라는 이름으로 "홍길동"이라는 값을 저장해두고 073_ForwardResult로 이동(forward)한다.
    이 때 현재 페이지 존재하면서 보내고자하는 내용을 저장한다.

  • request와 response도 같이 이동한다.
    073_ForwardResult에서는 이전 페이지에서 보내준 request와 reponse를 이용하여 저장해둔 name 값을 꺼내 사용할 수 가 있다.

  • 저장 메서드 : setAttribute()
    추출메서드 : getAttribute()

  • 파라미터 저장
    request.setAttribute("name", "홍길동");
    forward를 사용하면 Attribute에 넣은 한글이 깨질 걱정을 하지 않아도 된다.
    forward가 UTF-8로 자동 인코딩한다.

  • requestDispatcher (Forward 객체)
    : 전송하려는 값을 갖고 있는 request를 가지고 원하는 페이지로 이동하는 객체

  • 포워드를 위한 requestDispatcher 객체를 생성하고
    request.getRequestDispatcher()메서드를 이용해서 이동할 페이지를 설정한다.
    RequestDispatcher dp = request.getRequestDispatcher("073_ForwardResult.jsp");

  • 현재의 request와 response를 갖고 목적지로 이동
    dp.forward(request, response);
    dp는 requestDispatcher 객체

  • 현재페이지의 request 객체의 수명은 forward로 전달될 다음 페이지까지 이다.

  • 보통 파라미터를 통해서 정보를 전달하고 request.getParameter()를 사용하여 전달된 값을 추출하여 사용하지만, 위의 RequestDispatcher는 전달인수 대신 request 내부의 Attribute를 사용하여 전달인자를 저장하고,
    그냥 놔두면 수명을 다해 없어질 현재 페이지의 request와 response가 함께 forward라는 명령으로 페이지를 이동한다.

  • 이동한 페이지에서 Attribute를 사용하게 한다.


 🎁 ForwardResult 

  • 첫페이지에서 전송된 abc=가나다라 라는 파라미터가 request에 아직 파라미터로 담겨있다.(hidden 태그로 전송)

  • 이전페이지에서 그 request를 그대로 전송되어 왔기 때문에 현재페이지에서도 사용이 가능하다.

  • Attribute에 저장형식은 모든 클래스의 부모클래스인 Object 형태로 저장되므로, 다시 값을 추출할 때 강제 캐스팅이 필요하다.




 🎄 ServerObject 

각 객체 별 수명

  • 081

  • 082

  • 083

  • 결론 : 각 객체의 수명
    pageContext: 현재페이지까지
    request : 다음페이지까지 - forward에 의해 연장될 수 있다.
    session : 브라우저가 닫힐때까지
    application : 서버가 꺼지거나 리셋 될 때까지




 🎄 UseServlet 

 🎁 Forward_UseServlet 

  • 정보입력 페이지(jsp) ➡️ 정보처리페이지(XXXX_do.jsp)
    ➡️ 처리결과페이지(jsp)
    이 세단계를 거친 자료처리방식은 옛날 방식

  • 다른 방식으로 JAVA&JSP로 넘어오면서, 자바 프로그램 코드가 실행가능해지는 WAS 서버를 사용하고, (대표적으로 톰캣서버)
    이 서버에서는 정보처리페이지(jsp)를 사용하지 않는 대신,
    Servlet 이라는 웹용 클래스(서버에 생성하고 서버에서 실행하는)를 생성하여 정보처리 명령을 실행하게 한다.

  • 서블릿을 사용한다는 의미는 앞선 예제(071~073, 081~083 ...)의 XXX_do.jsp파일의 역할을 서버 내부에 감춰져서 공개되지 않을 웹클래스에 일임하는 것과 같다.

  • 프로그래밍 명령등의 로직과 알고리즘이 공개되는 것이 부담스럽거나, 자료이동을 감추고 싶다면 위와 같은 서블릿에 그 동작을 일임하듯 이름 불러 사용한다.

  • form의 action 속성에서 호출한다.

  • 사용할 서블릿의 위치는 파일들이 저장되는 최상단 위치한 것으로 인식하기 때문에 현재 페이지에서의 상대 위치는(../)로 연결하여 지정한다.


 🎁 Forward_useServlet (클래스) 

  • jsp만들던 webapp폴더말고 위에 src/main/java폴더 안에 servlet을 만들 것
  • 이클립스에서 서블릿을 생성하면 기본적인 것들이 다 생성되어짐
  • doGet, doPost 메서드의 내용만 작성하였음


 🎁 Forward_UseServlet_ok 

  • <%=request.getAttribute("name")%>
    서블릿에서 Attribute에 보낸 name-"홍길동"을 꺼내서 사용할 수 있다.

  • request와 response도 그대로 사용 가능




 🎄 Servlet Ex 

 🎁 Servlet_Ex01 : 보내는 쪽 

  • Join_Servlet 서블릿을 제작하여 101_Servlet_Ex01.jsp파일에서 전송한 항목들을 파라미터로 받고 request에 담아서 현재 파일로 포워딩한다.

  • 그리고 request의 각 내용들을 꺼내서 변수에 저장하고
    출력(102_Servlet_Ex02.jsp에서)이 에러없이 실행되도록 코딩하기

  • value가 숫자로 오는 것은 한글로 웹페이지에 표시되도록 하기


 🎁 Join_Servlet : 서블릿 

  • 내가 처음 만든 서블릿
    : input의 값들 특히 radio나 체크박스의 value들은 숫자로 보내지는 데 그 숫자들을 변환하지 않고 그대로 보내버림

  • 해답 : 서블릿에서 value값에 따라 변환해서 보내줌


 🎁 Servlet_Ex02 : 받는 쪽 

  • 내가 처음에 만든 코드 : 받아서 변환

  • 해답 : 서블릿에서 변환된 상태로 받음


 ✨ 정리 

  • 서블릿은 서버에서 움직이는 웹전용 클래스, 받는 jsp파일에서 변환하는 것이아니라 서버에서(서블릿에서) 미리 필요한 정보로 변환해서 보내야 했다.





profile
제가 공부하고 공유하고 싶은 글을 올리고 있습니다.

0개의 댓글