# data[].attributes.body
JSP (JavaServer Pages )

HTML 코드에 JAVA 코드를 넣어 동적웹페이지를 생성하는 웹어플리케이션 도구

JSP 가 실행되면 자바 서블릿(Servlet) 으로 변환되며 웹 어플리케이션 서버에서 동작되면서 필요한 기능을 수행하고 그렇게 생성된 데이터를 웹페이지와 함께 클라이언트로 응답한다

/* 웹 작동방식 및 용어 정리 깔끔히 되어 있는 버튼 경로 설정해둠 */

서블릿(Servlet)

자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램(클래스)

웹용 자바

서블릿를 쓰려면 JSP 또한 알고 넘어가야하는데,

JSP는 서블릿을 쓰기 좋게 포장한 것이라 볼 수 있다.

JSP는 HTML 안의 Java, Servlet은 Java 안의 HTML 이라고 알아두자!!(일단은) <- 설명 인터넷 참조

MVC

M(model) : Oracle DB

V(view) : HTML/CSS/JSP

C(controll) : Servlet = 웹자바를 위해 나중에 나온 패키지

Request 객체

=클라이언트가 보내는 데이터

setParameter() -> 사용못함

getParameter() -> 사용가능

setAttribute() -> 사용가능

Response 객체

=객체에 바인딩하거나 읽어올 때 사용됨

HTTP 응답을 클라이언트에게 전송하는 데 사용되는 객체이기에 아래와 같은 메서드를 지원하지 않는다

getParameter() -> 사용못함

setAttribute() -> 사용못함

Scope 범위

객체가 특정 범위 내에서 얼마나 오래 유지되고, 어디서 접근할 수 있는지를 결정하는 개념

page < request < session < application

1. page(JSP 페이지 범위)

설명: 객체가 현재 JSP 페이지에서만 유효하며, 다른 페이지로 전달되지 않음

생명주기: JSP 페이지가 처리되는 동안에만 객체 존재

사용 예시: JSP 내에서 일시적 데이터 처리할 때 사용

2. request(요청 범위)

설명: 객체가 하나의 HTTP 요청 동안 유효, 요청이 처리되는 동안 여러 JSP 페이지 간에 공유될 수 있음

생명주기: 클라이언트의 HTTP 요청이 서버에서 처리되는 동안 유지

사용예시: 여러 JSP 페이지에서 공통된 데이터 사용할 때, ex) 폼 데이터 처리하거나 forward 또는 include 태그로 다른 JSP 페이지에 데이터 전달할 때 사용

3. session(세션 범위)

설명: 객체가 클라이언트와 서버 간의 세션 동안 유효, 세션이 유지되는 동안 같은 클라이언트로부터 오는 여러 요청에서 공유

생명주기: 사용자의 세션이 유지되는 동안, 사용자가 웹 애플리케이션에 접속해 있는 동안

사용예시: 사용자의 로그인 상태 유지하거나, 장바구니 같은 지속적인 데이터 유지할 때 사용

4. application(애플리케이션 범위 = 다이나믹 프로젝트 폴더)

설명: 객체가 웹 애플리케이션 전역에서 공유되며, 모든 사용자와 모든 세션에서 공통적 접근 가능

생명주기: 웹 애플리케이션이 실행되는 동안 계속 유지

사용예시: 웹 애플리케이션 전체에서 공통된 데이터를 유지하고 공유할 때 사용. 예를 들어, 데이터베이스 연결 풀과 같은 리소스 관리시 유용

자바빈

=재사용 가능한 자바 객체

주로, JSP와 같은 서버 측 애플리케이션에서 데이터를 처리하고 전달하는 데 사용

ex) // 사용할 자바빈 생성

MemberBean mbean = new MemberBean("gimssam","1111","홍길동","indopop@naver.com");

자바빈 특징

1. 캡슐화

객체의 멤버 변수(속성)를 접근제어자 private로 선언하여 외국에서 접근하지 못하며, getter와 setter 메서드를 통해 접근

2. 기본 생성자

기본 생성자(매개변수가 없는 생성자)를 반드시 가져야 함

-> JSP에서 자바빈을 사용할 때 객체를 자동으로 초기화하기 위함

3. 직렬화 기능

직렬화가 가능해야 하며, 객체를 파일이나 네트워크를 통해 전달하거나 세션에 저장할 때 필요한 기능

자바빈 규칙

1. 모든 속성은 private 선언

2. getter/setter 메서드를 통해 속성에 접근

3. 기본 생성자 반드시 필요

4. Seicalizable(직렬화) 인터페이스 구현

표현식

# data[].attributes.body
기본원리 :

클라이언트(브라우저)가 요청하면 server가 응답

응답과정:

클라이언트(브라우저에서)의 요청 REQ(Request) > 서버에서 기계어로 응답 RES(Response) > 써블릿 언어로 자동 변환 > 톰캣을 이용해 써블릿 언어 해석 > 브라우저로 전송

1. 브라우저 -> 요청

GET/hello?username=world HTTP/1.1

Host:localhost8090

request객체 = 요청 localhost8090/hello

2. 서버 -> 응답

HTTP 응답 메세지

HTTP/1.1 200 OK

Content-Type:text/plain;charset=utf-8

Content-Length: 11(문자열수) = 웹애플리케이션 서버가 자동으로 생성

response 객체 = 응답 hello world

브라우저가 (db와 연결되어 있는 서버)에 요청하는 것을 http 요청(GET)방식의/(hello?)사용할 문서명 문서명 뒤에 물음표는 형식 (username=world)키밸류 인풋태그안에 속성명 쓰는거(HTTP/1.1)버전 (Host:localhost:8090) 서버명이라고 한다

주소:

ex) http://localhost:8090/JChap01/index.html

= http://서버경로/어플리케이션(폴더명)/html명

/* 아파치 톰캣 */

= servlet만 해석할 수 있는 서버

메서드 작성시 select 문만 리턴타입을 가질 수 있음

브라우저가 요청을 하게 되면 톰캣에 request와 response 객체 자동 생성

이후, request 객체에 요청 내용이 들어가고, 코딩된 써블릿 내용 중 request와 관련된 내용이 response 객체에 들어가 브라우저로 응답

get 방식

1. 데이터를 URL의 쿼리스트링(query string)에 붙여서 서버로 전송 -> 보안에 취약

2. URL에 쿼리스트링을 통해 데이터를 포함하기 때문에 브라우저에서 캐시될 수 있음

3. 데이터를 URL에 직접 포함하므로 길이 제한 있음

get 방식 사용 목적

주로 데이터를 요청하거나 검색할 때 사용

post 방식

1. 데이터를 HTTP 요청의 본문(body)에 담아 전송

2. URL에는 데이터가 표시되지 않음 -> 보안성 높음

3. 데이터를 본문에 담아 보내므로 데이터 길이에 제한 없음

4. URL에는 데이터가 보이지 않기 때문에, 캐시되지 않음

post 방식 사용 목적

데이터를 서버로 전송하거나 데이터베이스에 저장하는 등 변경이 필요한 작업에서 주로 사용

# data[].attributes.headline
폴더 및 파일 설명 정리

# data[].attributes.subject
폴더 및 파일 설명 정리

# data[].attributes.body
Framework란?

= 틀, 액자

daynamic work도 framework에 포함됨

src/main/java 폴더

= 동적 관련 자바 언어 들어가는 곳

src>main>webapp 폴더

= 작업 뷰 폴더, 가장 중요한 폴더, 정적인 것 들어가는 곳 (ex. html, css)

WEB-INF 폴더

= xml 파일 들어가는 곳

WEB-INF > lib 폴더

= 플러그인들 들어가는 곳

# data[].attributes.body
html 버전 설정하는 영역

= dtd(Doctype)

web

= stand alone(홀로서기)

-> 각 탭마다 탭끼리 간의 데이터를 공유하지 못함

-> 그래서 get 방식으로 데이터를 넘겨주고는 했었더라~

# data[].attributes.headline
이클립스 플러그인 emmet 설치하기

# data[].attributes.subject
이클립스 플러그인 emmet 설치하기

# data[].attributes.body
설치 이유

이클립스에서 HTML 확장자 파일을 사용할때 VSCode처럼 Tab버튼으로 자동완성 할 수 있게 만들기 위해 설치

/* emmet 설치법 경로 걸어둠 */

# data[].attributes.attachment_link.title
서블릿_폴더_세팅_및_삭제

# data[].attributes.body
노션에도 적어뒀지만

로그인 연동하기2의 사진 속

@WebServlet("/Hohoho")는 어노테이션이라고 부르며, 서블릿과 html을 연동시키는 역할을 한다

연동하는 법:

html의 action 명 = 서블릿의 어노테이션 명

참고예시)

로그인 연동하기1의 form action명과 로그인 연동하기2의 어노테이션명 일치

어노테이션 없는 ver. :

어노테이션을 사용하지 않는다면 직접

다이나믹 워크 프로젝트 > src > main > webapp > WEB-INF > lib 우클릭 > new > other.. > XML > XML file을 생성해 해당 사진과 같이 세팅 해야하는 번거로움이 있음

사진처럼 오류났다고 뜨면 그냥 오류났다는 부분 ctrl x 한 다음 다시 붙여넣기 해주면 되고, 굳이 안해도 지장은 없음

# data[].attributes.body
// 두줄 쓰기

적용하고자하는 객체의 인스턴스.setContentType("text/html");

적용하고자하는 객체의 인스턴스.setCharacterEncoding("utf-8");

// 한줄 쓰기

response.setContentType("text/html;charset=utf-8");

# data[].attributes.body
ex) public class A01HelloWorld extends HttpServlet {}

예시처럼 서블릿 파일은 항상 HttpServlet 을 상속받아야 함

해당 사진은 서블릿의 response를 이용해 마치 html과 같은 효과를 보여준 모습이다

PrintWriter

=자바(Java)에서 문자 출력 스트림을 다루기 위한 클래스

=텍스트 데이터를 파일, 콘솔 또는 다른 출력 대상에 출력하는 데 사용

getWriter() 메소드

=Java Servlet에서 HTTP 응답 객체인 HttpServletResponse에서 사용되는 메서드로, 클라이언트로 데이터를 출력하는 데 사용

=서블릿이 응답을 작성할 때, 텍스트 형식의 데이터를 클라이언트(예: 웹 브라우저)로 전송할 수 있는 PrintWriter 객체를 반환

=주로 텍스트 데이터를 클라이언트에게 전달할 때 사용

print()

데이터를 출력하지만 개행(줄바꿈)은 하지 않음.

println()

데이터를 출력하고 줄바꿈을 추가.

prinln메서드로 html 태그를 하나하나씩 써야 한다는 게 단점이며, 값을 다 입력했으면 가장 마지막에 .close()메소드로 (굳이 막지 않더라도 작동은 되지만)더미값이 혹시라도 생기지 않게 막아준다

# data[].attributes.body
데이터를 브라우저로 출력하는 방법 중 하나는 println()메서드로 출력하는 것과, 사진처럼 데이터를 HTML 형식으로 만들어 출력하는 방법 등이 있다

해당 사진에서는 문자열 값이 들어갈 수 있는 data라는 변수에 증감연산자 +=를 활용하여 HTML의 태그를 하나하나 입력해나가는 방식이다

그러나 브라우저 출력시 핵심은 PrintWriter 클래스와 getWriter() 메서드로, 증감연산자를 활용해 입력한 HTML 데이터를 브라우저에 보여주는 역할을 하기 때문이다

한마디로, 증감연산자 활용한 건 그저 브라우저에 노출할 HTML형식 생성한 것 뿐 !

# data[].attributes.body
그림과 같이 html 작성 후 Run 버튼 눌러 크롬에 띄운 결과

# data[].attributes.body
생성한 서블릿에 값 입력

/* 해당 사진은 get 방식으로 작성된 코드 */

1. 클라이언트(브라우저)에서 로그인 버튼을 누름을 통해 서버에 아이디, 비밀번호 정보 요청

2. 이때, 자동으로 서블릿 언어를 해석해주는 톰캣에 HttpServletRequest와 HttpServletResponse 객체 생성

사진 속, HttpServletRequest 옆 request는 HttpServletRequest 객체의 인스턴스와도 같다고 볼 수 있음

ex)
HttpServletRequest request = new HttpServletRequest

이와 같은 과정을 톰캣에서 자동처리하며 생략 후 HttpServletRequest request 라고만 뜨는 것!

-> HttpServletResponse도 같은 원리

->따라서, request이든 req든 인스턴스명은 변경되어도 상관없음

3. 한글이 깨지지 않게 인코딩 메소드 활용해 utf-8 설정

request.setCharacterEncoding("utf-8");

->요청받은 데이터가 깨지지 않게끔 하기 위해 인스턴스명 request에 할당

4. 로그인 연동하기1 페이지에서 input name 명이었던 user_id와 user_pw에 각각 getParmeter() 메서드로 속성값 받아옴

-> 브라우저에서 사용자가 아이디와 비밀번호를 입력하면 해당 메서드에 전송됨

5. input type="text"와 type="password"는 기본적으로 String 타입이기에 해당 사진 속 서블릿에서도 String 타입으로 변수명 user_id(변수명이기에 꼭 user_id라고 쓰지 않아도 됨)를 지정한 모습이다

-> 그 예시로 변수명 user_id와 user_pw를 그냥 id와 pw로 변경했을때도 똑같이 적용되는 모습을 확인할 수 있었다

# data[].attributes.attachment_caption
post 방식으로 데이터 값 입력한 모습. 주소창에 데이터값이 노출되지 않음

# data[].attributes.body
post 방식이란?

브라우저에서 입력한 동적 데이터 값이 get 방식은 주소창에 노출 되어 보안이 우려될 가능성이 있다면 post 방식은 데이터 값을 숨겨 주소창에 데이터 값이 뜨지 않음

get 방식과 post 방식의 차이점

간단하게도 get 방식은 doGet() 메서드 안에 코드 작성했다면 post 방식은 doPost() 메서드 안에 작성한다는 정도의 차이 점이 있다

# data[].attributes.headline
로그인 연동하기 4 - 3 예시 스크립트 해석

# data[].attributes.subject
로그인 연동하기 4 - 3 예시 스크립트 해석

# data[].attributes.body
validate() 메서드

여러 프로그래밍 언어에서 데이터의 유효성을 검사하기 위해 사용

웹 애플리케이션이나 데이터 입력 시 사용자가 제공한 데이터가 형식이나 조건에 맞는지 확인하는 데 자주 사용

|| 논리 연산자

or의 의미를 가지며 A || B 일때 둘 중 하나의 값이라도 참이면 true

***

해석

if문 -> ID나 비밀번호의 데이터 갯수가 하나도 없거나, 값이 없다면 '아이디와 비밀번호를 입력해주세요' 경고창을 띄운다

만일 값이 둘 다 있다면 formLogin의 method(전송방식)은 post방식으로 하고 action 이름도 loginPost로 지정하며, formLogin을 submi() 제출 하겠다는 뜻

***

헷갈렸던 점

Q. 이미 html 창에 폼의 method와 action 명 등이 이미 지정되어 있는데 왜 굳이 script 에 또 다시 작성해줘야 했을까? else{}칸이 비어있어도 괜찮지 않았을까?

A. validate() 메서드로 유효성 검사를 하고 있는 지금 else{} 칸을 비워두게 되면 유효성 검사를 통과해도 아무런 작업을 하지 않게 됨

서버로 데이터값이 전송되더라도 action과 method는 기본 설정된 값(method같은 경우 기본 방식이 get방식)으로 전송되기에 정확한 명시성을 위해 작성

그러나 해당 사진에서는 이미 html에 method 방식과 action명을 지정해두었기 때문에 당장은 else{}칸을 비워도 작동하기는 하겠지만, 추후 변경 사항이 생겼을 경우 HTML 자체를 수정해야 할 수도 있음

# data[].attributes.body
인터넷에 찾아도 잘 안나오기는 한데(챗gpt도 못알려줌).. 사용방법은 get방식이 doGet() 메서드를 사용하고, post 방식이 doPost() 방식을 사용했던 것처럼 doGetPost() 메서드 사용한다

get방식과 post방식을 구분하기 귀찮아서 쓰는 야매 방식이라고 일단 이해함

get 방식으로 데이터가 들어오든 post 방식으로 데이터가 들어오든 다 doGetPost() 메서드로 전송되게끔 각각의 doGet() 과 doPost()에 아래 코드를 작성한다

doGetPost(request, response);

내용은 doGet()에 쓰는 것대로 doPost()에 썼던 것처럼 방식만 다른거고 쓰는 거는 같음

# data[].attributes.headline
다양한 폼 데이터 받기

# data[].attributes.subject
다양한 폼 데이터 받기

# data[].attributes.body
multiple 속성

사용자가 여러 개의 값을 선택할 수 있게끔 하는 속성

주로 select 태그와 input 태그에서 사용됨

여러 값을 동시에 선택(ctrl, shift)하거나 업로드 할 수 있게 함

<select name="five" multiple size="7">
  <option value="">선택해주세요</option>
  <option value="두산">두산</option>
  <option value="Samsung">Samsung</option>				</select>

해당 사진에서 인기구단은 같은 select 태그로 작성된 폼임에도 불구하고 위에거는 단독으로만 선택이 가능하고 아래거는 ctrl을 활용하여 다중 선택이 된 모습이다

# data[].attributes.headline
JSP에 자바스크립트 넣기

# data[].attributes.subject
JSP에 자바스크립트 넣기

# data[].attributes.attachment_link.readable_text
SQL
11번 부터~

서블릿 컨테이너 종류 중 하나가 톰캣

wrapper 클래스 > 기본형을 객체로 바꿔놓는 것?


포워딩 - get 방식
웹 브라우저를 이용해 주소창 변경

쿼리스트링?

***

오류날때 콘솔창 우클릭 clear 하면 이전에 오류났던 내역 지워줌

***

[포워드 방식]

1. ReqestDispatcher 객체
: 서버에서 포워딩 진행 -> 웹 주소창 변경x

2. sendRedirect() 메서드
: get 방식으로 데이터 전송, 쿼리스트링 사용 -> 웹주소창 변경 o

3. location.href='경로지정'
: 쿼리문사용 x , 어노테이션명만 지정, 주소창 변경 o

***

HttpServletRequest, HttpSession, ServletContext
= 스코프(일반적으로 범위나 영역을 뜻하는 용어, 변수나 함수 등이 유효한 범위를 의미)

Session 
= 스코프 범위

Context
= 프로젝트(애플리케이션) 전체
= 범위가 크기 때문에 보안에 취약

***

object o 의 의미 무엇이든 올 수 있다(?)

***

웹데이터 기본공유 방식
= 같은 창(탭)에서만 공유 가능
= 그래서 get방식으로 데이터 넘어가는 바인딩은 주소창이 변경되기에
   포워딩을 통해 넘긴 데이터 값이 null로 치환되어나옴

***

JSP
=mvc중 vc가 같이 있는거

# data[].attributes.body
바인딩이란?

객체를 특정 범위(request, session, application)에 저장하는 것을 의미

JSP나 서블릿에서 자바 객체를 클라이언트 요청 또는 세션 같은 범위에 저장할 때, 이를 바인딩한다고 한다

request에 바인딩한 모습

request.setAttribute("name", "홍길동");

=홍길동이라는 속성값을 가진 name 객체(속성)을 request 범위에 저장

session에 바인딩한 모습

session.setAttribute("address", "서울시 성동구");

application에 바인딩한 모습

application.setAttribute("email", "ezen@ezen.com");

***

주의해야할 점

각 범위(Scope)에 따라 우선순위가 달라진다

범위는

page < request < session < application

이지만 우선순위는 좁은 것이 먼저 우선되므로

1순위 page, 2순위 request, 3순위 session, 4순위가 application이다

사진 속 address 속성은 session 범위에 하나,

request 범위 2개에 모두 각기 다른 속성값으로 총 세번 부여되었다

이때, 아래 표현식과도 같이 작성하게 되면 범위가 지정되어 있으므로 session에 주어진 address값 "서울시 성동구"가 출력되고,

<%=session.getAttribute("address") %>

아래 표현언어에 다음과 같이 작성되었을 경우에는 우선순위에 따라 session이 밀리고, 남은 request 둘 중 Top-down 형식에 의해 가장 마지막으로 쓰인 request에 부여된 address값 "제주도 제주시"가 출력된다

${address }

***

일반적으로 request 객체에 데이터를 바인딩 할때는 주로 setAttribute() 메서드를 사용하거나, JSP와 서블릿에서 request 객체에 데이터를 저장하거나 넘기기도 한다

그러나 request 객체의 파라미터 자체가 클라이언트가 보내는 데이터를 의미하기에 거기에 수정하거나 추가하는 setParameter() 메서드는 사용할 수 없다

대신 읽기 용으로 request.getParameter()로만 접근이 가능하다

서버 측에서 파라미터 값 수정하거나 추가하는 기능은 제공하지 않음!!!

# data[].attributes.body
세션이란?

웹 자바에서의 세션은 주로 HTTP 세션(HttpSettion 객체 사용)을 의미하며, 서버와 브라우저간 상태를 유지하기 위한 메커니즘이다.

HTTP는 본래 상태를 유지하지 않는 프로토콜이기 때문에, 세션을 통해 사용자가 사이트를 방문하는 동안 발생하는 여러 요청들이 동일 사용자로부터 온 것임을 식별 가능

세션을 사용하는 이유

1. 상태유지

HTTP는 비상태적인 프로토콜이기에, 세션을 사용하지 않으면 서버는 각 요청이 동일 사용자로부터 왔는지 알 수가 없다

로그인 정보, 장바구니 상태 등을 유지

2. 보안

민감한 사용자 데이터를 서버에 저장 후 쿨러아온트에 보내지 않으므로 보다 안전하게 데이터 처리 가능

세션 주요 특징

브라우저당 한개씩 생성(=사용자가 한개 생성)

브라우저 종료시 세션 해제)

세션을 이용한 웹 페이지 연동

웹 페이지들간의 공유 정보를 서버에 저장 -> 웹 페이지들 매개해 주는 방법

서버의 메모리에 생성되어 정보 저장

로그인처럼 보안이 요구되는 정보는 대부분 세션 사용

세션 API(Application Programming Interface - 응용 프로그램 간의 상호작용을 위한 인터페이스)

1. HttpSession 객체

2. HttpServletRequest의 getSession() 메서드 호출

getSession() 메서드:

기본 세션 객체가 존재하면 반환, 없으면 새로 생성

세션 실행 과정

A. 클라이언트 브라우저 => 서버에 최초 접속

a. 서버의 서블릿은 세션 객체를 생성

b. 세션 객체에 대한 세션 id를 브라우저에 전송

c. 브라우저는 서버로부터 받은 세션 id를 브라우저가 사용하는 (세션쿠키)에 저장

=> 서버로부터 전송된 세션 id도 일종의 쿠키임

B. 클라이언트 브라우저 => 재접속시

a. 세션 쿠키에 저장된 세션 id를 다시 서버로 전송

b. 서버에서는 전송된 세션 id를 이용

c. 브라우저 세션 객체에 접근하여, 브라우저에 대한 작업수행(예.로그인성공!! 로그인실패!!)

# data[].attributes.body
포워드와 리다이렉트란?

포워드

클라이언트(브라우저)의 요청을 다른 서블릿이나 JSP 페이지로 전달하는 기능

데이터를 추가하는 것도 가능

클라이언트로써는 한 자원에서 다른 자원으로 요청이 전달되었음을 알 수 없으며 주소창도 변경되지 않음

서버 내부에서 처리가 이루어지기에 속도가 빠름

클라이언트와 서버 간 요청은 한 번만 이루어짐

리다이렉트

서버는 클라이언트에게 다른 URL로 이동하라는 응답을 보내고, 클라이언트가 다시 그 URL로 새로운 요청을 보냄

클라이언트와 서버 간 요청이 두 번 발생하며, URL 주소 변경됨

통신이 두 번이나 이루어지므로 포워드보다 느릴 수 있음

***

어떨때 사용하는가?

포워드를 사용하는 경우

데이터 유지하면서 페이지 전환 -> 후속 작업 진행에 용이

로그인 처리 후 -> 사용자의 정보를 특정페이지로 전달해 사용자 환영 메시지나 계정 정보 보여주기 가능

에러 처리 -> 요청 처리 중 오류 발생시 에러 페이지로 포워딩하여 사용자에게 적절한 에러 메시지 표시 가능

리다이렉트를 사용하는 경우

로그인 처리 후 -> 사용자가 로그인 처리를 완료한 후, 홈 페이지나 대시보드와 같은 다른 페이지로 이동시키는 경우

다른 웹 애플리케이션 또는 외부 사이트로의 이동 -> ex) 결제 시스템 이용하기 위해 외부 결제 페이지로 이동시키는 경우

# data[].attributes.body
RequestDispatcher를 이용한 포워딩

RequestDispatcher 객체 생성:

request.getRequestDispatcher(String path) 메서드를 사용하여 자원에 대한 RequestDispatcher 객체를 생성

forward() 메서드 :

dis.forward(request, response)를 호출하면 클라이언트의 요청을 지정한 다른 자원(서블릿이나 JSP)으로 전달

원래 요청 객체 req와 res가 그대로 전달되기 때문에, 새로 요청을 생성할 필요 x

RequestDispatcher dis = request.getRequestDispatcher("dispatcher2?name=ezen");

dis.forward(request, response);

# data[].attributes.body
액션 태그란?

JSP(Java Server Pages)에서 사용되는 태그로, 특정 작업을 수행하거나 자바 객체를 JSP 페이지에 전달하는 등의 기능 제공

목적

자바코드를 JSP파일에서 없애는 것

: 화면이 점차 복잡해짐에 따라 프론트엔드 개발자(=퍼블리셔)들도 자바코드를 써야하는 문제로 이슈 발생

그래서 JSP는 스크립틀릿(<% %>)의 자바 코드 제거, 더 쉽고 편리하게 작업할 수 있는 태그 형태로 기능 제공

= 액션 태그

종류

인클루드 액션태그

jsp:include page="인클루드할 페이지.jsp"

포워드 액션태그(서블릿 RequestDispatcher 클래스의 포워딩 기능을 대신하는 태그)

jsp:forward

유즈빈 액션태그(객체 생성용 태그)

jsp:useBean

셋프로퍼티 액션태그(setter를 대신하는 태그)

jsp:setProperty

겟프로퍼티 액션태그(getter를 대신하는 태그)

jsp:getProperty

기능

자바빈(JavaBean)관리

페이지 간의 제어 흐름 관리

XML 및 HTML과 함께 표현

# data[].attributes.body
자바 코드가 들어가는 표현식을 좀 더 편안하게 사용하기 위해 표현언어 등장

페이지 디렉티브에 isELIgnored false로 설정해 주는 것이 기본이나 JSP 2.0 버전 이상부터는 기본적으로 내장되어 있어서 따로 지정해주지는 않아도 됨

특징

기존 표현식보다 편리하게 데이터 출력 가능

변수와 여러가지 연산자 포함 가능

JSP 내장 객체에 저장된 속성 및 자바의 빈 속성도 출력가능

ex)
${id }
${member.id }
${param.id }

표현언어 자체의 내장객체도 제공

JSP 기본 설정시 표현언어를 사용할 수 없으므로 페이지 디렉티브에 저장

# data[].attributes.headline
액션 태그 & 표현 언어 활용

# data[].attributes.subject
액션 태그 & 표현 언어 활용

# data[].attributes.headline
표현 언어 & 배열 활용

# data[].attributes.subject
표현 언어 & 배열 활용

# data[].attributes.body
JSTL 태그란?

JSP(Java Server Page)에서 자주 사용하는 기능들을 태그 형식으로 제공하는 라이브러리

JSP 2.0 규약부터 추가되어 톰캣에서는 기본적으로 제공하지 않음

=> 따라서, lib에 JSTL jar파일을 다운로드하여 사용해야 함

1. Core태그(c 태그)

: 조건문, 반복문, URL 조작 등 기본적 기능 제공

<c:if> : 조건문 작성시 사용

<c:forEach> : 리스트나 배열같은 데이터 반복 처리시 사용

<c:set> : 변수 설정시 사용

<c:choose> : 여러 조건문 사용 가능

<c:param> : <import><redirect><url>의 서브태그로, 매개변수 전송을 처리

요청 파라미터 추가 하는 방식 2가지

1. URL에 직접 입력

2. <c:param>을 이용해서 입력

<c:import> : 말그대로 페이지 통째로 import하는 기능 액션태그의 include와 유사하며 include가 JSP 파일과 HTML에 파일의 내용을 포함할때 사용되지만 c:import는 JSP, HTML, 외부리소스까지 포함할 수 있는 조금 더 유연하다는 특징이 있다

<c:redirect> : 쿼리 스트링 형태로 다른 페이지로 전송시킴

<c:url> : 경로를 지정할 수 있지만 이동은 안됨. 따로 출력해서 이동시켜야 함

<c:out> : JSP 페이지에서 변수를 출력할 때 사용, ${}와 비슷한 역할을 하며, HTML/XML 특수 문자가 포함된 데이터(<h3></h3>같은 태그 등)를 안정하게 출력하기 위해 이스케이프 처리(escapeXml) 지원

2. Format태그(fmt 태그)

:

<fmt:formatDate> : 날짜를 지정할때 사용

# data[].attributes.headline
스코프 객체 & 컨텍스트 객체

# data[].attributes.subject
스코프 객체 & 컨텍스트 객체

# data[].attributes.body
JSP에 있는 4가지 스코프

Page Scope

Request Scope

Session Scope

Application Scope

사용예시

아래 코드처럼 표현언어 EL에 값을 출력할때 해당페이지의 변수 id를 출력하는 방법이다

해당 코드에서는 scope의 기본 설정이 page이기에 pageScope를 생략하고 쓴 모습이다

<th>${id }</th><!-- ${pageScope.id} 앞에 스코프 영역 생략된거 -->

조금 다르지만 자바에서 전역변수 선언하는 것과 비슷하다고도 볼 수 있다

컨텍스트(Context) 객체

웹 애플리케이션에서 데이터를 관리하고, 서로 다른 스코프에서 변수를 저장하거나 공유하는데 중요한 역할을 함

=스코프별 변수 저장 or 가져올 수 있음

데이터의 유효범위(Scope)에 따라 다르게 설정하고, 각 스코프에서 변수를 관리할 수 있게 해줌

pageContext

requestContext

sessionContext

applicationContext

사용예시

예시)

pageContext.setAttribute("data", data);

pageScope에 data 객체 속성값을 가진 속성명 data 변수를 저장한 모습. 해당 data객체 속성값은 아래와 같이 데이터를 이어받았음

ArrayList data = new ArrayList();
data.add("강백호");
data.add("채소연");
data.add("송태섭");