웹 프로그래밍에서의 페이지 이동

1.클라이언트 페이지(html, jsp)에서 서버에게 요청

1) 태그를 이용하는 방법

<a href="서버 URL">텍스트 또는 이미지</a>

<form action="서버 URL">
</form>

2) 스크립트를 이용하는 방법

location.href = "서버 URL";

3) ajax 를 이용하는 방법

  • 1번과 2번은 처리를 해서 결과 페이지로 이동하고자 할 때 주로 이용하고 ajax는 데이터만 받아오고자 할 때 주로 이용

2.서버가 요청을 처리하고 결과 페이지로 이동하도록 하는 방법

1) forwarding

  • 결과 페이지로 이동할 때 요청한 URL을 그대로 가지고 가는 방법으로 요청 흐름이 이어지는 형태로 request 와 reponse 객체가 계속 유지가 됩니다.
  • 결과 페이지에서 새로 고침을 하게되면 서버의 처리가 다시 수행됩니다.
  • jsp 태그를 이용하는 방법 - 전자정부 프레임워크에서 시작 페이지 이동
<jsp:forward page="포워딩할 페이지 경로" />
  • java 코드를 이용하는 방법
RequestDispatcher ? = request.getRequestDispatcher("포워딩 페이지 경로");
?.forward(request객체, response객체);

2) redirect

  • 결과 페이지로 이동할 때 요청 URL은 버리고 결과 페이지의 URL을 가지고 가는 방법으로 요청 흐름이 끊어지고 새로운 요청 흐름을 만드는 형태로 request 와 response 객체가 새로 만들어 집니다.
  • 결과 페이지에서 새로고침을 하게되면 결과 페이지만 다시 출력이 됩니다.
  • 리다이렉트 하는 방법
response.sendRedirect("리다이렉트할 URL");

3) 어떻게 이동할 것인가?

  • 삽입, 삭제, 갱신 작업을 해야 하는 경우는 반드시 리다이렉트로 결과 페이지로 이동
  • 로그인 과 로그아웃 처리도 리다이렉트
  • 새로 고침을 했을 때 이전 작업을 다시 수행하면 안되는 경우는 반드시 리다이렉트
    • 단순 페이지 이동이나 검색된 결과를 보여줄 때는 포워딩을 합니다.
    • 검색된 결과를 새로고침을 했을 때 결과만 보여주고자 할 때는 리다이렉트를 해도 됩니다.
    • 포워딩은 서버에서 다시 처리를 하고 결과를 새로 가져와서 출력을 하기 때문에 트래픽이 많이 발생 합니다.

실습 : 포워딩과 리다이렉트의 차이

1) index.html에 링크 추가

<a href="./result/input.jsp">포워딩과 리다이렉트의 차이</a><br/>

2) WebContent 디렉토리에 result 디렉토리를 생성하고 input.jsp 파일을 만들고 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Forwording 과 Redirect의 차이</title>
</head>
<body>
    <h3>결과 페이지로 포워딩</h3>
    <form action="forward.jsp">
        수1:<input type="text" size="10" name="first"/><br/>
        수2:<input type="text" size="10" name="second"/><br/>
        <input type="submit" value="더하기" />
    </form>
    <h3>결과 페이지로 리다이렉트</h3>
    <form action="redirect.jsp">
        수1:<input type="text" size="10" name="first"/><br/>
        수2:<input type="text" size="10" name="second"/><br/>
        <input type="submit" value="더하기" />
    </form>
</body>
</html>

3) result 디렉토리에 forward.jsp 파일을 만들고 결과 페이지로 포워딩하는 코드를 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        System.out.println("처리");
        //포워딩하기
        RequestDispatcher dispatcher = 
            request.getRequestDispatcher("forwardresult.jsp");
        dispatcher.forward(request, response);
    %>
</body>
</html>

4) result 디렉토리에 forwardresult.jsp 파일을 만들고 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과 페이지</title>
</head>
<body>
    <%
        out.println("<h3>포워딩 결과를 보여주는 페이지</h3>");
    %>
</body>
</html>

5) 실행

  • 브라우저 창의 URL을 확인하고 새로고침을 했을 때 콘솔창의 메시지를 확인
  • URL:http://localhost:9000/javaweb0212/result/forward.jsp?first=&second=
  • 화면에 출력되는 페이지는 forwardresult.jsp 이지만 URL은 forward.jsp 입니다.
  • 새로고침을 하면 forward.jsp에 작성한 내용이 다시 수행

6) result 디렉토리에 redirect.jsp 페이지를 만들고 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
        System.out.println("리다이렉트 처리");
        //리다이렉트 하기
        response.sendRedirect("redirectresult.jsp");
    %>
</body>
</html>

7) result.jsp 파일에 redirectresult.jsp 파일을 만들고 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
        out.println("<h3>리다이렉트 결과를 보여주는 페이지</h3>");
    %>
</body>
</html>

8) 실행하고 리다이렉트 했을 때의 URL 과 새로고침을 했을 때 콘솔을 확인

  • 새로고침을 하면 결과 페이지만 새로고침이 됩니다.
  • 서버의 처리를 다시 수행하지 않습니다.

9) 웹 프로그래밍의 처리 절차

  • 요청페이지 -> 서버에서 처리 -> 결과페이지
  • 요청 페이지에서 서버에게 요청할 때 a, form, 자바스크립트를 이용
  • 서버에서 처리할 때는 서버언어로 처리
  • 서버의 처리가 끝나면 서버언어의 페이지 이동 방법으로 결과 페이지로 이동
    • 포워딩 할 것인지 리다이렉트 할 것인지 결정

10) 서버에서 처리한 후 결과 페이지에게 데이터 전달

  • 자바에서는 서버에서 결과 페이지에게 전달하는 데이터를 Attribute 라고 합니다.

1> Attribute를 저장할 수 있는 객체

객체 내용
page 현재 페이지에서만 사용할 수 있는 데이터를 저장
request forwarding으로 이동할 때만 데이터가 유지, redirect 하게되면 소멸
session 브라우저를 종료하거나 직접 삭제하기 전까지는 계속 유지
application 모든 클라이언트가 공유, 1개만 생성

2> 저장 관련 메소드

  • void setAttribute(String name, Object value): 데이터 저장
  • Object getAttribute(String name) : 저장한 데이터 가져오기
    • 가져온 데이터를 사용할 때는 원래의 자료형으로 형변환해서 사용해야 합니다.
  • void removeAttribute(String name) : 저장한 데이터 제거하기
  • getAttribute 했을 때 null이 리턴되면 name으로 저장한 적이 없거나 삭제한 데이터

3> forwarding 할 때 일반적으로 request에 데이터를 저장하지만 redirect 할 때 request에 저장하면 소멸됩니다.

  • redirect 할 때 데이터를 전달하고자 하면 session에 저장해야 합니다.
  • 모든 클라이언트가 공유해야 하는 데이터가 있다면 이 경우는 application에 저장
  • korail 같은 웹 사이트에서 전체 접속자수는 application에 저장

실습

1) forward.jsp 파일의 내용을 수정

<%
        //요청 페이지에서 전달한 파라미터 읽기
        String first = request.getParameter("first");
        String second = request.getParameter("second");

        int s1 = 0;
        int s2 = 0;
        try{
            s1 = Integer.parseInt(first);
            s2 = Integer.parseInt(second);
        }catch(Exception e){}

        int result = s1 + s2;

        //포워딩을 하는 경우 데이터 저장
        request.setAttribute("result", result);

        //포워딩하기
        RequestDispatcher dispatcher = 
            request.getRequestDispatcher("forwardresult.jsp");
        dispatcher.forward(request, response);
    %>

2) forwardresult.jsp 파일을 수정

  • forward.jsp에서 넘겨준 데이터를 출력
<%
        out.println("<h3>포워딩 결과를 보여주는 페이지</h3>");
        Object result = request.getAttribute("result");
        out.print("<p>연산결과:" + result + "</p>");
    %>

3) redirect.jsp 파일을 수정

<%
        //요청 페이지에서 전달한 파라미터 읽기
        String first = request.getParameter("first");
        String second = request.getParameter("second");    
        int s1 = 0;
        int s2 = 0;
        try{
            s1 = Integer.parseInt(first);
            s2 = Integer.parseInt(second);
        }catch(Exception e){}

        int result = s1 + s2;

        //리다이렉트를 하는 경우 데이터 저장
        //리다이렉트를 할 때 request에 데이터를 저장하면 데이터는 소멸됩니다.
        session.setAttribute("result", result);

        //리다이렉트 하기
        response.sendRedirect("redirectresult.jsp");
    %>

4) redirectresult.jsp 파일을 수정

<%
        out.println("<h3>리다이렉트 결과를 보여주는 페이지</h3>");
        Object result = session.getAttribute("result");
        out.println("<p>결과:" + result + "</p>");
    %>

웹 프로그래밍 연습을 할 때 가장 먼저 해볼 프로젝트

입력받는 페이지를 만들어서 데이터를 입력 -> 서버가 입력된 데이터를 읽어서 처리를 하고 결과를 생성 -> 출력하는 페이지를 만들어서 처리한 결과를 출력

  • 처음 연습을 할 때 부터 3개의 페이지를 별도로 만들어서 처리
  • 처리 내용이 없어서 단순하게 페이지 이동만 하더라도 지금처럼 수행
    할 수 있으면 매 페이지마다 접속한 클라이언트의 아이피 주소와 페이지 URL을 파일에 기록합니다.
    파일에 기록된 내용을 읽어서 분석하는 작업에 활용
    어떤 아이피가 접속해서 입력페이지나 결제페이지에서 종료하는 경우가 많은 UI를 개선

웹 프로젝트를 할 때 분석 공부를 같이

  • 웹 사이트에서 이동한 경로 와 아이피 그리고 아이디를 기록해 놓는 것은 매우 중요
  • 이런 정보를 바탕으로 UI 분석을 해서 UI를 개선하고 추천 시스템 같은 것을 만들 수 있습니다.

실습 : log 파일 생성 IP + 페이지

<%@ page import="java.io.*, java.sql.*"%>
    <%
    //오늘 날짜를 문자열로 생성
    long d = System.currentTimeMillis();

    //java.sql.Date 는 날짜만 저장하고 toString을 호출하면 날짜만 문자열로 리턴 
    Date today = new Date(d);
    String filename = today.toString();

    //파일에 기록할 수 있는 객체를 생성 
    //파일이 없으면 생성하고 있으면 뒤에 이어붙이도록 생성 
    PrintWriter pw = new PrintWriter(
                     new FileOutputStream("/Users/jw/javalab/WebPro/WebContent/log/" + filename + ".log", true));

    String ip = request.getRemoteAddr();        //접속한 IP주소 가져오기 
    String requestURI = request.getRequestURI();        //요청한 URL 가져오기 - 전체요청 경로     
    String contextPath = request.getContextPath();        //루트 경로 
    String url = requestURI.substring(contextPath.length() + 1);    // 전체 요청 경로에서 루트 경로 제외하기

    //파일에 기록
    pw.println(ip + "-" + url + "\n");
    pw.flush();
    pw.close();
    %>

실습 : java에서 log 파일 열기

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) {

        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    new FileInputStream("/Users/jw/javalab/WebPro/WebContent/log2020-02-12.log")));

            while (true) {
                String line = br.readLine();
                if (line == null) {
                    break;
                }
                System.out.println(line);
            }
            br.close();
        } catch (Exception e) {
        }
    }
}

results matching ""

    No results matching ""