반응형

** 파라미터

=>parameter: 클라이언트에서 서버로 넘기는 데이터

=>argument(매개변수): 함수를 호출할 때 넘겨주는 데이터

네트워크 쪽에는 파리미터 함수안에는 매개변수를 많이 사용한다.

1. 파라미터를 만들어주는 방법

1) URL뒤에 ?를 하고 이름과 값을 기재하는 방법

=>여러 개가 있는 경우는 &로 구분

=>검색된 결과에서 제목 등을 클릭해서 제목에 해당하는 데이터를 가져오는 경우 - 상세보기에 많이 사용

 

2) formname속성을 갖는 입력 객체를 만드는 방법

=>데이터를 사용자로부터 입력받아서 전달하는 것이 목적

 

3)ajax나 웹에 요청을 하는 애플리케이션에서 별도로 만들어서 전달하는 방법

=>html을 요청하는 것이 아니고 데이터가 필요한 경우

 

web.xml 배포관리자

 

 

main 페이지 만들기

 

 

네이브 :

사전은 dict

뉴스 ->뉴스

 

1)프로젝트 큰것 만든다음 디렉토리로 하는 것

project  ->사전

           ->뉴스

2)main 프로젝트 여러개 프로젝트 만들어서 하는 것

MainProject     ->사전 SubProject

                       ->뉴스

=>주기적인 데이터 분석이 필요하다.

 

project

배포할 경우는 : web application

개발할 경우는 : web service

application 하고 서비스는 대부분 같은 말이다.

web application <-> web service

web serviceweb site 같지 않다.

web service () 화면이 없을 수 있다.

web site(- 보여지는 것)

 

 

 

2.html페이지 form만들기

<form method="" action="" enctype="" id="">

 

</form>

1)    id: 자바스크립트에서 사용하기 위해서 설정

=>자바스크립트에서 form을 사용할 의도가 없다면 생략 가능

 

2)    action: 폼의 데이터를 전송받을 서버의 url

=>생략하면 현재 url이 그대로 설정

 

3)    method: 파라미터 전송 방식

=>생략하면 get

           =>post put, delete를 사용할 때는 설정을 해야 합니다.

          

4)    enctype: 전송 타입

           =>분할 전송을 하고자 할 때는 multipart/form-data 라고 설정          

분할 전송을 해야 하는 경우는 파일을 업로드 해야 하는 경우

           application만들때 중요하다. 사진올릴때 form이 기것으로 설정해야 한다.

파일은 크서 한번에 전송못한다. 그래서 쪼개서 받는 것이라고 한다. multipart라고 한다.

나누어져있어서 몇프로 받았는지 알고 해서 이어 받는 것을 알 수 있다.

이것을 설정하면 파일을 잘 받을 수 있다.

웹서버로 구축한다.

socket서버 만들면 클라이언트 언어하고 서버 언어 잘 맞추어야 한다.

 

 

**실습1

1.    Dynamic web Project 생성(web.xml 파일을 포함하도록 설정)

2.    tomcat디렉토리 안의 lib 디렉토리에서 servelt-api.jar파일을 프로젝트의 WebContent/WEB-INF/lib 디렉토리에 복사

=>jspservlet을 생성해서 사용할 때 에러 표시를 없애기 위해서

3.     프로젝트의 메인 페이지로 사용할 index.htmlWebContent디렉토리에 만들고 작성

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>java web 2일차</title>

</head>

<body>

           <a href="./param/paraminput.jsp">파라미터 입력</a><br/>

</body>

</html>

 

4.    WebContent디렉토리에 param디렉토리를 생성하고 paraminput.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>

      <!-- 링크에 파라미터 만들기 :직접 파라미터 입역-->

      <a href="./process.jsp?query=korea&name=park">대한민국</a><br/>

     

      <!-- form을 이용한 파라미터 만들기 -->

      <h1>Get 방식 전송</h1>

      <form method ="get" action="get.jsp">

                 이름:<input type="text" name ="name" /><br/>

                 취미:<input type="checkbox" name="hobby" value="game"/> 게임

                 <input type="checkbox" name="hobby" value="reading"/> 독서

                 <input type="checkbox" name="hobby" value="billiard"/> 당구

                 <br/>

                 나이<select name ="age">

                                        <option value ="1">1</option>

                                        <option value ="2">2</option>

                                        <option value ="3">3</option>

                                        <option value ="4">4</option>

                             </select>

                 <br/>

                 <input type="submit" value="전송"/>

      </form>

     

      <h1>Post 방식 전송</h1>

      <form method ="post" action="post.jsp">

                 비밀번호:<input type="password" name ="pw"/> <br/>

                 하고싶은 이야기 :<textarea name ="words" rows="5" cols="20"></textarea>

                 <br/>

                 <input type="submit" value="전송"/>

      </form>

</body>

</html>

 

페스워드는 쓰면 안보인다.

 

5.    project 실행해서 index.html에서 링크를 눌러서 이동되는 지 확인

 

** 서버 페이지에서 파라미터 읽기

=>String request, getParameter(String name) : name에 해당하는 파라미터를 문자열로 리턴

 

=>String [] request.getPrameterValues(String name) : name에 해당하는 파라미터를 문자열 배열로 리턴

체크박스나 List처럼 여러 개를 선택할 수 있는 경우에 사용

 

 

** 실습

1.    param디렉토리에 process.jps파일을 만들고 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>파라미터 처리 페이지</title>

</head>

<body>

      <%

                 //파라미터 읽기 - 없는  name을 사용하면 null이 리턴되고 입력을 안하면 ""

                 String query = request.getParameter("query");

                 String name = request.getParameter("name");

      %>

      <p>query : <%=query %></p>

      <p>name : <%=name %></p>

</body>

</html>

 

 

 

2.    param 디렉토리에 get.jsp파일을 만들고 파라미터 읽어서 출력하는 코드를 생성

취미:<input type="checkbox" name="hobby" /> 게임

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>get 방식 파라미터 읽기</title>

</head>

<body>

           <%

                       String name = request.getParameter("name");

                       //hobby는 체크박스인데 getParameter을 읽으면 첫번째 선택된 항목 하나만 넘어옵니다.

                       //이런 경우에는 getParameterValues로 읽어서 배열로 리턴받아야 합니다.

                       //String hobby = request.getParameter("hobby");

                       String[] hobby = request.getParameterValues("hobby");

                      

                       String age = request.getParameter("age");

           %>

           <p>name: <%=name%></p>

           <%--

           <p>hobby:

           <% for (String imsi : hobby){

           %>

                        <%=imsi %>

           <%

           }

           %>

           </p>

           --%>

           <!-- 배열을 바로 출력하면 안되고 반복문을 이용해서 출력 -->

           <p>hobby :<%for(String imsi: hobby){out.write(imsi+"\t");} %></p>

           <p>age: <%=age %></p>

</body>

</html>

 

3.    param 디렉토리에 post.jsp파일을 만들고 파라미터 읽어서 출력하는 코드를 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>post 방식 파라미터 읽기</title>

</head>

<body>

      <%

                 String pw = request.getParameter("pw");

                 String words = request.getParameter("words");

      %>

      <p>pw: <%=pw%></p>

      <p>age: <%=words %></p>

</body>

</html>

 

 

**파라미터 한글 처리

1.    파라미터를 만들 때 직접 작성하는 경우 한글이 있으면 인코딩해서 붙여야 합니다.

=>ajax나 애플리케이션에서 요청할 때는 한글이 깨지게 됩니다.

<a href="./process.jsp?query=korea&name=">대한민국</a><br/>

chrome에서는 문제 없읍

eclipse에서 할 경우 오류남

 

chrome:정상 출력

 

 

2.    get 방식의 파라미터를 처리할 때 인코딩은 was가 처리

=>tomcat의 경우 8.0 이상 버전이면 utf-8로 처리

=>8.0보다 낮은 버전이면 한글 인코딩 처리 코드를 직접 삽입해야 합니다.

Connector 태그에 URIEncoding="utf-8" 을 입력해주어야 합니다.

 

 

3.    post 방식의 파라미터를 처리 할 때 인코딩은 서버의 코드가 수행

 

 

=>파라미터 읽기 전에 request.setCharacterEncoding("utf-8"); 호출해서 인코딩 방식을 변경해주어야 합니다.

 

**실습

post.jsp 파일 수정

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>post 방식 파라미터 읽기</title>

</head>

<body>

           <%

                       //파라미터 인코딩 설정

                       request.setCharacterEncoding("utf-8");

                       String pw = request.getParameter("pw");

                       String words = request.getParameter("words");

           %>

           <p>pw: <%=pw%></p>

           <p>age: <%=words %></p>

</body>

</html>

 

 

=>서버에서 처리하는 부분을 잘 만들어서 어디에서든지 동일한 요청은 동일한 url을 갖고 처리할 수 있도록 하자는 것이 Restful API의 가장 큰 목적입니다.

동일한 url을 여러개 로 만들지 말고

 

**클라이언트의 헤더(header)읽기

=>header:클라이언트가 서버에게 요청을 할 때 파라미터 이외의 데이터가 필요한 경우 숨겨서 전송하기 위해서 사용

post방식으로 전송을 하면 파라미터가 header에 숨겨져서 번송합니다.

Open API(데이터나 라이브러리를 가진 곳에서 데이터나 라이브러리를 다운도르 받아서 사용할 수 있도록 제공하는 것)에서 예전에는 KEY를 발급해서 KEY를 파라미터 형태로 전송하도록 했는데 이 방식을 이용하면 URLKEY가 노출됩니다.

최근에는 KEYHEADER에 숨겨서 전송하도록 하는 방식이 사용이 됩니다.

우리나라 공공 데이터 Open API는 아직도 URLkey값을 입력하는 구조이고 다른 곳은 대부분 keyheader에 숨기는 방식을 이용합니다.

Open API가 무료로 데이터를 사용하도록 하기는 하지만 어떤 유저가 얼만큼의 데이터나 라이브러리를 사용하는지 파악하고 제한을 가하기 위해서 KEY를 발급합니다.

Open API배포를 하려면 허락을 받아야 한다.

 

1.읽는 메소드

String request.getHeader(String name) : 이름에 해당하는 헤더의 값을 문자열로 리턴

long request.getDateHader(String name) :이름에 해당하는 해더의 값을 epoch time에 해당하는 정수로 리턴

얼마시간에 사용할 수 있다.

팝업창 15일 동안 읽지 않기 언제 읽었는지 알아야 한다. 팝업창 을 15일 후 보여주기 그래서 날자가 와야 한다.

 

**response객체

=>클라이언트의 출력을 만들어주는 객체로 응답 객체라고 합니다.

=>jsp 파일에서는 reponse라는 이름으로 제공되고 servlet에서는 doGet메소드와 doPost메소드의 2번째 매개변수입니다.

 

 

 

1.헤더 설정 메소드

추가하는 것

void addDateHeader(String name, long date)

void addHeader(String name , String value)

void addIntHeader(String name , String value)

바꾸는 것

void setDateHeader(String name, long date)

void setHeader(String name , String value)

void setntHeader(String name , String value)

 

2.캐시 만료 날 따 설정

=>현재 페이지를 읽어서 브라우저에 저장하고 있다가 다음에 요청하면 브라우저에 있는 페이지를 읽도록 해주는 기능이 캐싱입니다.

=>캐싱을 하고자 할 때는 Expires라는 헤더를 추가하고 197011일 자정 이후의 시간을 1/1000초 단위로 설정하면 됩니다.

현재 시간을 5일 동안 보여주세요

//현재 페이지를 5일 동안 캐싱

int long = System.currentTimeMillise();

response.setDateHeader("Expires", long + 5* 24* 60*60 * 1000);

 

=>예전에는 네트워크 사정이 별로 좋기 않기 때문에 캐싱 기능을 많이 사용

 

 

=>캐싱을 삭제

response.setHeader("Pragma","no-cache")

response.setHeader("Cache-Control","no-cache")

response.setHeader("Cache-Control","no-store")

response.setHeader("Expires",1L);

브라우저 마다 방법이 달라서 4개의 코드를 모두 작성해야 합니다.

 

 

3.sendRedirect(String url)

=>url로 리다이렉트

=>리다이렉트는 현재 까지의 요청 흐름을 끝내고 새로운 요청을 만들어서 url로 이동하는 것

브라우저 창의 url이 변경되고 requestresponse객체가 새로 만들어 집니다.

url이 바꿔진다.

리다이렉트는 모든 URL로 이동이 가능

새로고침을 하면 결과만 다시 출력

 

이와 반대로 현재 효청 흐름을 유지하고 url로 이동하는 것 을 forwarding이라고 합니다.

forwarding을 하게 되면 URL이 변경되지 않고 requestresponse도 계속 유지

내용은 바꿔는데 주소가 안 바꿔는 것 forwarding

서버에 갔다 오는데 처리도 다하는데 주소가 안 바뀐다.

forwarding은 서버를 갔다 온다.

자신의 도메인 내에서만 이동이 가능

새로고침을 하면 서버에 다시 요청을 해서 처리를 하고 결과를 다시 출력

 

node

python -장고

-플라스크

redirect

 

 

php asp.net

redirect

 

 

java ruby on rails =>web program

redirect,forwarding

 

 

 

게시물 목록 조회

 

 

 

하나 입력 -> 서버에서 분석하고 -> 나한테 출력

서버에서 -> 출력할 때

redirect  :새로고침하면 출력만 변한다. 기존에 있던 것만 다시 출력한다. 변경이 하지 않는 것

           서버에 갔다오면 안되는 것 =>삽입 , 삭제 , 수정

새로고침했을 때 데이터가 변경이 안된다.

 

forwarding : 분석 -> 출력이 다시 된다. 데이터가 바꾸면 서버가 다시 한다음 다시 들고 온다. 수시로 변경시 하면 된다.  =>검색

트래픽 증가할 가능성이 높다.

 

네이브는 똑같은 컴퓨터에서 2번 밖에 안된다.

 

네이브는 ip가 두개 혹은 3개 있다.

트래픽이 넘으면 다른 서버로 간다.

 

java -> android

 

java web -> web service

 

spring

 

spring 설계 ->

spring 문제 해결 ->

spring 책 한권 보는 것 ->

 

 

데이터가 안 변하면 cashing하면 된다., 새로고침 안해도 된다.

서버 개발자가 되면 글때는 중요할 것이다.

 

 

** out 객체

=>html출력을 위한 객체

=>jsp에서는 처음부터 제공이 되고 servlet에서는 response.getWriter() 를 호출해서 생성

=>Modle1(jsp에서 처리와 출력을 모두 수행)에서는 Model2(처리는 서블릿과 자바가 수행하고 출력만 msp가 담당 -eljstl을 이용해서 출력)에서는 중요하지 않음

=>출력 스트림이므로 PrintWriter클래스의 메소드를 사용해서 출력

 

 

1.    index.html 파일에 실습 파일 링크 설정

<a href="./out/out.jsp">out 객체 이용</a><br/>

 

2.    webContent디렉토리에 out디렉토리를 생성하고 out.jsp파일을 만들어서 작성

 

소스보기에서

javascript는 코드가 보인다. 보안이 취악

java는 옵션을 만든 것처럼 보인다.

 

보안이 중요한 것 서버에서 처리

보안이 중요하지 않으면 스크립트에서 하는 것이 좋다.

출력속도는 javascript 클라이언트에서 하는 것이 빠르다. 서버에 안 갔다 와도 되니깐

 

서버에서 만든 것과 클라이언트에서 만든 것 차이점 기억하기

<%@ 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("<h2>out을 이용한 출력</h2>");

                       out.println("<p>나이 <select name = 'age'>");

                       //자바스크립트 ,자바는 반복문 사용가능 하지만 html반복 불가

                       //<option value = "1">1</option>

                       for(int i = 1; i<100 ;i++){

                                  out.println("<option value="+i+">"+i+"</option>");

                       }

                       out.println("</select></p>");

           %>

          

           <div id = "disp"></div>

           <script>

                       //스크립트는 소스보기를 하면 코드 확인 가능 - 보안에 취약

                       //java 또는 소스보기를 하면 결과만 보이지 소스 코드가 보이지 않음 - 보안에 스크립트보다 우수

                       var disp = document.getElementById("disp");

                       var html = "<select name ='year'>";

                       for(var i = 1900; i< 2021 ; i++){

                                  html = html+"<option  value= "+i+">"+i+"</option>";

                       }

                       html = html +"</select>";

                       disp.innerHTML = html;

           </script>

</body>

</html>

 

**pageContext

=>jsp 페이지 1개와 매칭이 되는 객체

=>이 객체는 다른 내장 객체를 가져와서 사용할 수 있도록 해주는 메소들 소유

=>request 객체를 가져와서 사용하고자 하면 HttpServletRequest request = pageContext.getRequest();

 

**web.xml

=>반드시 webContent(webapp)/WEB-INF/디렉토리에 존재해야 하는 웹 애플리케이션 설정 파일

=>웹 서버가 구동될 때 자신의 설정 파일을 읽고 그 다음 웹 애플리케이션을 실행할 때 가장 먼저 읽어내는 설정 파일

이 파일이 프로젝트 내에 없으면 서버 디렉토리에서 파일을 찾아서 읽습니다.

=>설정 내용

1. 시작 페이지 (welcome file)

2. 에러 페이지

3. 서블릿 , 필터, 리스터 설정

4. 세션

5. 초기화 파라미터 정보

 

=>시작 페이지 설정 : 맨 위에 있는 파일을 찾아보고 있으면 출력하고 없으면 그 아래 파일을 찾아봅니다.

<welcome-file-list>

    <welcome-file>index.html</welcome-file>

    <welcome-file>index.htm</welcome-file>

    <welcome-file>index.jsp</welcome-file>

    <welcome-file>default.html</welcome-file>

    <welcome-file>default.htm</welcome-file>

    <welcome-file>default.jsp</welcome-file>

</welcome-file-list>

마이크로 소프트가 default.html 이것 먼저 나온다.

 

=>초기화 파라미터 설정

<context-param>

         <param-name>파라미터이름</param-name>

         <param-value>파라미터값</ param-value>

</context-param>

 

웹 애플리케이션을 시작할 때 읽을 수 있는 파라미터

 

어떤 데이터가 처음 한 번 읽으면 애플리케이션내에서는 다시는 변하지 않는 경우 그리고 이 데이터는 애플리케이션이 실행되는 환경마다 변해야 하는 경우가 있습니다.

대표적인 데이터가 데이터베이스 URL 이나 id또는 password같은 데이터입니다

개발환경과 운영환경이 다른 경우 개발환경에서 사용하는 데이터베이스 URL은 로컬이 될 가능성이 높고 실제 개발이 끝나고 운영을 하는 경우에는 로컬이 아니고 실제 데이터베이스 url로 변경이 되어야 합니다.

이런 데이터를 자바 코드안에 입력해서 사용하면 개발이 끝나고 운영환경으로 이행할 때 자바코드를 수정해서 컴파이를 다시하고 빌드를 다시해서 운영해야 합니다.

컴파일을 다시 하면 얘기치 않은 오류가 발생할 수 있습니다.

이런 경우에는 데이터베이스 URL을 파일이나 데이터베이스에 기록해두고 불러와서 사용하는 형태로 만들어야 이행을 할 때 소스 코드를 수정하지 않습니다.

그 방법 중의 하나로 WEB.XML파일의 초기화 파라미터를 이용합니다.

 

 

web.xml을 읽는 방법을 알아야 한다.

**application객체

=>웹 애플리케이션이 매핑이 되는 객체

=>웹 애플리케이션 전체에 1개만 생성됩니다.

 

1.    초기화 파라미터 읽어내기

String getInitParameter(String name):web.xml파일에 만든 context-param중에서 name에 해당하는 value를 리턴

 

2.    log디렉토리에 만들어진 오늘 날짜에 해당하는 log파일에 기록

void log(String msg)

C:\project\Tomcat 8.5\logs 날짜 별로 생긴다.

 

application.log해서 기록하면 된다.

 

 

3.    프로젝트 내의 존재하는 파일의 경로를 절대 경로 변경해주는 메소드

String getRealPath(String 프로젝트 내의 경로)

=>servlet 3.0 아래 버전에는 이 메소드가 없습니다.

이 경우는 request.getRealPath(String 프로젝트 내의 경로)이용

 

4.    application 객체는 jsp페이지에서는 처음부터 존재하고 servletㅇ에서는 request.getServletContext()로 해서 찾아와야 합니다.

 

**초기화 파라미터 읽기 실습

1.    초기화 파라미터 생성 - web.xml에서 작성

<!-- 초기화 파라미터 -->

  <context-param>

     <param-name>dburl</param-name>

     <param-value>localhost:1521/xe</param-value>

  </context-param>

2.    index.html파일에 링크를 설정

<a href ="./app/application.jsp" >application 객체 </a><br/>

 

3.    WebContent 디렉토리에 app디렉토리를 만들고 application.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>

      <%

                 //초기화 파라미터 읽기

                 String url = application.getInitParameter("dburl");

                 out.println("<h3>초기화 파라미터 url:"+url+"</h3>");

                

                 //프로젝트 내의 경로의 절대 경로를 확인

                 //파일을 업로드할 때나 특정 디렉토리에 파일을 생성할 때는 절대 경로가 필요

                 //현재 프로젝트가 실행되고 있는 디렉토리를 확인하고자 할 때 사용해도 됩니다.

                 String path = application.getRealPath("/app");

                 out.println("<h3>app의 절대경로 :"+path+"</h3>");

      %>

</body>

</html>

4.    html이나 jsp만 수정한 것이 아니고 web.xml도 수정했기 때문에 웹 애플리케이션을 다시 실행시켜야 적용이 됩니다.

재시작해서도 안되면 파라미터 값 확인

 

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

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

1)    태그를 이용하는 방법

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

 

<form actoin ="서버 URL">

</form>

 

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

location.href ="서버 URL";

 

3)    ajax를 이용하는 방법

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

 

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

1)    forwarding

=>결과 페이지로 이동할 때 요청한 URL을 그래도 가지고 가는 방법으로 요청 흐름이 이어지는 형태로 requestresponse객체가 계속 유지가 됩니다.

=>결과 페이지에서 새로 고침을 하게 되면 서버의 처리가 다시 수행됩니다.

=>jsp태그를 이용하는 방법 - 전자정부 프레임워크에서 시작 페이지 이동

<jsp:forward page="포워딩할 페이지 경로"/>

 

=>java코드를 이용하는 방법

RequestDipatcher ? = request.getRequestDipatcher("포워딩 페이지 경로");

?.forward(request객체 , response객체);

 

2)    redirect

=>결과 페이지로 이동할 때 요청 URL은 버리고 결과 페이지의 URL을 가지고 가는 방법으로 요청 흐름이 끊어지고 새로운 요청 흐름을 만드는 형태로 requestresponse객체가 새로 만들어 집니다.

=>결과 페이지에서 새로고침을 하게 되면 결과 페이지만 다시 출력이 됩니다.

=>리다이렉트 하는 방법

response.sendRedirect("리다이렉트할 URL")

 

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

삽입 , 삭제 , 갱신 작업을 해야 하는 경우는 반드시 리다이렉트로 결과 페이지로 이동

로그인 과 로그아웃 처리도 리다이렉트

=>새로 고침을 했을 때 이전 작업을 다시 수행하면 안되는 경우는 반드시 리다이렉트

단순 페이지 이동이나 검색된 결과를 보여 줄 때는 포워딩을 합니다.

검색된 결과를 새로고침을 했을 때 결과만 보여주고자 할 때는 리다이렉트를 해도 됩니다.

포워딩은 서버에서 다시 처리를 하고 결과를 새로 가져와서 출력을 하기 때문에 트래픽이 많이 발생합니다.

 

뉴스는 forwarding해야 한다. 잘 안변하는 데이터는 많은 고민을 해야 한다.

ajax는 전체를 갱신하지 않고 일부분만 하는 것

 

아래 같은 경우는 ajax로 사용할 필요 없다. 대부분의 데이터가 만들 기 때무네 f5하면 새로 바뀐다.

 

여러가지 containts에는 ajax가 중요하고

 

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

1.indext.html에 링크 추가

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

 

2.WebContentresult디렉토리를 생성하고  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/javaweb/result/forward.jsp?first=10&second=10

화면에 출력되는 페이지는 forwardresult.jsp이지만 URLforward.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>결과 페이지</title>

</head>

<body>

           <%

                       out.println("<h3>리다이렉트 결과를 보여주는 페이지</h3>");

           %>

</body>

</html>

 

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

새로고침을 하면 결과 페이지만 새로고침이 됩니다.

서버의 처리를 다시 수행하지 않습니다.

URL: http://localhost:9000/javaweb/result/redirectresult.jsp

새로고침했을 경우 콘솔에 내용이 없다.

 

 

 

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에 데이터를 저장하지만 forwaringredirect를 호출할 때 request에 저장하면 소멸됩니다.

redirect 할 떄 데이터를 전달하고자 ㅎ면 ression에 저장해야 합니다.

모든 클래이언트가 공유해야 하는데 데이터가 있다면 이 경우 applicatin에 저장

=>korial같은 팬 웹사이트에 서 전체 접속자는 application 에 저장

 

 

실습

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

           <%

                       //요청 페이지에서 전달한 파라미터 읽기1

                       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);

                                             

                       //System.out.println("처리");

                       //포워딩하기

                       RequestDispatcher dispatcher = request.getRequestDispatcher("forwardresult.jsp");

                       dispatcher.forward(request, response);

      %>

2.    forward.jsp.에서 넘겨준 데이터를 출력 forwardresult.jsp

 

      <%

                 out.println("<h3>포워딩 결과를 보여주는 페이지</h3>");

                 Object result = request.getAttribute("result");

                 out.print("<p>연산결과 :" +result+"</p>");

      %>

3.    redirect.jsp수정

      <%

                 //요청 페이지에서 전달한 파라미터 읽기1

                 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에 데이터를 저장하면 데이터는 소멸됩니다.

                 //request.setAttribute("result", result);

                 session.setAttribute("result", result);

                 //System.out.println("리다이렉트 처리");

                 //리다이렉트 하기

                 response.sendRedirect("redirectresult.jsp");

      %>

 

4.    redirect.jsp에서 넘겨준 데이터를 출력 redirectresult.jsp수정

      <%

                 out.println("<h3>리다이렉트 결과를 보여주는 페이지</h3>");

                 Object result = request.getAttribute("result");

                 out.print("<p>연산결과 :" +result+"</p>");

      %>

 

 

=======>변경

 

           <%

                       out.println("<h3>리다이렉트 결과를 보여주는 페이지</h3>");

                       Object result = session.getAttribute("result");

                       out.print("<p>연산결과 :" +result+"</p>");

%>

 

 

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

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

=>처음 연습을 할 때 부터 3개의 페이지를 별도로 만들어서 처리

=>처리 내용이 없어서 단순하게 페이지 이동만 하더라도 지금처럼 수행

할 수 있으면 매 페이지마다 접속한 클라이언트의 아이피 주소와 페이지 URL을 파일에 기록합니다.

파일에 기록된 내용을 읽어서 분석하는 작업에 활용

어떤 아이피가 접속해서 입력페이지나 결제페이지에서 종료하는 경우가 많은 UI를 개선

 

로그인 했으면 아이디 기록하고

로그인안했으면 아이피와 같이 기록해야 한다.

거래 계산해서 ip매칭하는 게임을 해는 것이 좋다. 가까운 사람들 끼리 해야만 원활히 할 수 있다. ->게임

링크를 유사한 링크를 누르는 것 추천 =>유사한 추천

 

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

=>웹 사이트에서 이동한 경로와 아이피 그리고 아이디를 기록해 놓는 것은 매우 중요

이런 정보를 바탕으로 ui분석을 해서 ui를 개선하고 추천 시스템 같은 것을 만들 수 있다.

 

index.jsp

<%@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("C:\\project\\eclipse-workspace\\javaweb\\WebContent\\log\\"+filename+".log",true));                      

//PrintWriter pw = new PrintWriter(new FileOutputStream("./"+filename+".log",true));

                       System.out.println(filename+".log");

                       //접속한 ip주소 가져오기

                       String ip = request.getRemoteAddr();

                       //요청한 url가져오기 -전체 요청 경로

                       String requestURI = request.getRequestURI();//프로젝트 이름부터

                       //루트 경로

                       String contextPath = request.getContextPath();

                       //전체 요청 경로에서 루트 경로 제외하기

                       String url = requestURI.substring(contextPath.length()+1);

                      

                       //파일에 기록

                       pw.println(ip+"-"+url+"\n");

                       pw.flush();

                      

                      

                       pw.close();

           %>

 

각페이지마다 추가하고 클릭해서 로그 파일 추가하기  

 

 

 

DataReading ->java프로젝트 생성

Main.java

public class Main {

           public static void main(String[] args) {

                       try {

                                  BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\admin\\Documents\\2021-02-13.log")));

                                  while(true) {

                                              String line = br.readLine();

                                              if(line == null) {

                                                         break;

                                              }

                                              System.out.println(line);

                                  }

                                  br.close();

                       }catch(Exception e) {

                                 

                       }

           }

}

반응형

'Study > javawebapplication' 카테고리의 다른 글

javawebapplication-4  (0) 2020.10.20
javawebapplication-3  (0) 2020.10.19
javawebapplication-1  (0) 2020.10.15

+ Recent posts