카테고리 없음

24년 10월 21일

DH_PARK 2024. 10. 23. 21:57

 


JSP

java server pages

html 코드에 java 코드를 넣어 동적웹페이지를 생성하는 웹어플리케이션 도구이다. jsp가 실행되면 자바 서블릿으로 변환되며 web application server 에서 동작되면서 필요한 기능을 수행하고 , 생성된 데이터를 웹페이지와 함께 클라이언트로 응답한다.

jsp 와 서블릿의 차이점

뭐가 다르냐 ?

  • jsp 는 html 코드 내부에 자바 코드가 들어가서 html 코드를 작성하기 간편하다는 점 , jsp 파일임
  • 서블릿은 자바코드내에 html 코드가 있어서 읽고 쓰기가 굉장히 불편해서 작업효율이 떨어짐. , java 파일이다.

하지만 둘은 같이 알고 있어야한다.

jsp로 작성된 프로그램은 서버로 요청시 서블릿 파일로 변환되어 jsp 태그를 분해하고 추출해서 다시 순수한 html 로 변환한다.

※ 두 종류가 같은 파일이라거나 그런건 아님 ! 서블릿은 자바 파일에서 사용하는 html 코드이다.

대충 동작하는 순서.

    1. 클라이언트가 어떤 동작을 함으로써 hello.jsp 를 요청하였다.
    1. JSP 컨테이너가 JSP 파일을 읽는다.
    1. JSP 컨테이너가 Generete (변환) 작업을 통해 Servlet ( .java )  파일을 생성한다.
    1. .java 파일은 다시 .class 파일로 컴파일된다.
    1. Execute (실행) 을통해 HTML 파일을 생성하여 JSP 컨테이너 에게 전달한다.
    1. JSP 는 HTTP 프로토콜을 통해 HTML 페이지를 클라이언트 에게 전달한다.

출처:

https://javacpro.tistory.com/43

[버물리의 IT공부:티스토리]


오전

  • <% %> : 스크립틀릿
    • 스크립틀릿은 JspService라는 메서드 안에서 작동이 된다.
  • <%! %> : 선언문
    • jsp 페이지에서 사용하는 전역변수나 메서드를 선언할 때 사용한다.
  • <%=%> : 표현식
    • 화면에 출력하게 해주는 역할을 한다

선언문

자바 코드를 jsp 페이지에 선언할 때 사용하는 문법.

주로 변수나 메서드를 선언할 때 쓰임.

선언문에서 만들어진 변수는 jsp 파일이 웹 컨테이너에 의해 컴파일 될 때 멤버변수로(전역변수)로 인식돼서 jsp 페이지 어느 위치에서도 이 변수를 참조하는것이 가능하다.

요약하면 , 선언문에서 변수만들면 전역변수처럼 사용가능하다는 뜻.

근데 , 스클립틀릿 요소에서 변수를 선언하면 메서드 안에 있는 지역변수로 인식해서 변수를 선언한 범위 밖에서는 참조를 할 수가 없다.

선언문 사용법

사용법 : 자바 코드를 <%! %> 안에 넣으면 된다.

일단은 jsp 내에 자바 코드이기 때문에 자바의 문법에 맞추어서 사용하면 된다.

표현식(Expression)

동적인 jsp 페이지를 브라우저로 표현하기 위한 요소

변수를 출력하거나 메서드의 결과값을 브라우저로 출력할 수 있다.

(out.println() 와 동일한 기능이라고 한다.)

근데 , out 내장 객체를 딱 한번 사용한 것과 같아서(out.write 같은거 아까.) 코드를 한줄 사용하는 것과 같기 때문에 세미콜론을 사용하면 안된다. 사용하면 에러가 난다고함.

*그러니까 전체를 하나의 한 줄로 보는것이다.*

표현식의 사용형식
<%=
    //클라이언트에 출력할 내용(문자열)
    //변수 또는 메서드의 값
%>

스크립틀릿

jsp 스크립트 태그 내<% %> 에서 자바 코드를 사용할 수 있다.

자바코드이기 때문에 마지막에는 세미콜론(;) 으로 끝남.

스크립틀릿은 서버단에서 처리되어 , out객체나 표현식 요소를 통해서 결과만 출력함.

즉 , 브라우저에서 자바 코드를 볼 수 없다는 뜻이다.

아까 수업했을 때 무슨 파일로 보여준것을 생각했을 때 jsp 페이지가 서블릿으로 변환되어 요청될 때 , _jspService 메서드 안에 선언되어서 지역변수로 지정이 된다.

(_jspService 라는 메서드 안에 있었다. 즉 여기서 변수 선언해도 메서드 안 지역변수로 처리되는듯)

그리고 메서드이기 때문에 스크립틀릿 안 내부에서 메서드를 선언할 수 없다.

정리해보면

선언문은 자바 코드를 jsp 페이지에서 선언할 때 사용

페이지 전체에서 사용할 변수를 선언하거나 자바 메서드를 사용할 때 사용.

전역에서 사용하는 변수나 메서드를 정의할 때 쓴다.

표현식은 뷰에 표현할 때 사용

계산 결과나 변수의 값을 HTML 페이지에 직접 보여줄 때 사용.

이거는 말 그대로 페이지에 나타내는 출력 코드 ? 그런거

스크립틀릿은 service 라는 메서드 안에서 실행되는 자바 코드 로직.

자바 코드를 실행해서 로직을 처리해야 할 때. 출력은 안함.

이거는

선언문이랑 스크립틀릿의 차이

  • *선언문 (<%! %>)**은 JSP 페이지의 클래스 멤버처럼 동작하며, JSP 페이지 전체에서 사용할 변수를 선언하거나 메서드를 정의하는데 사용됨. JSP가 컴파일될 때 한 번만 실행되며, 이후 페이지에서 그 값을 계속 참조할 수 있음.
  • *스크립틀릿 (<% %>)**은 JSP가 요청될 때마다 동적으로 실행되는 자바 코드를 작성하는 데 사용됨. 조건문, 반복문 등의 로직 처리, 변수 값 변경 등 매번 다른 결과를 만들어내는 코드를 작성하는 데 주로 쓰임.

jstl ?

jsp 표준 라이브러리

외부평가는 jstl 안되서 기본 jsp 문법에 익숙해져야한다고 하신다.


쿼리스트링 : 파라미터를 url 에 담아서 보내는

Get , Post 개념

  • get : 서버로부터 정보를 요청할 때 사용되는 http 메서드
    • 데이터를 Body 에 담지않고 쿼리스트링을 통해 전송한다. 쿼리 스트링은 값이 그대로 나오는 파라미터값
    • 불필요한 요청을 제한하기 위해 요청이 캐시될 수 있다.
    • get 요청은 브라우저 히스토리에 남아서 중요한 정보를 다루면 안된다
  • post : 데이터를 서버에 전송하거나 서버 상태를 변경하는 작업에 사용된다.
    • Get 과 다르게 전송 데이터를 http 메세지의 Body 에 담아서 전송한다.
  • 이클립스에서 톰캣으로 실행하는게 일종의 post 인듯 ?

payload : 요청할 때 body 부분

js 에서 jsp 로 보낼 때

form 전송이 필요함


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<!-- 
		col1 , col2 , col3 , col4를 03Result.jsp 에서 받아서
		NavBar 를 만들어보셈
		03Ex 에서 전달하는 컬럼명을 적용해서 nav 를 만듭니다
		style 로 전달받은 스타일링코드를 그대로 적용시켜보셈
	 -->
	
	
	<form action="03Result.jsp">
		<input name="col1" placeholder="열이름1"> 
		<input name="col2" placeholder="열이름2"> 
		<input name="col3" placeholder="열이름3"> 
		<input name="col4" placeholder="열이름4"> 
		<input name="style" placeholder="Nav기본 스타일 Code"> 
		<button>페이지 생성 요청</button>
		</form>
</body>
</html>

html 파일에서 열 이름을 입력받는다. form 을 03result.jsp 파일에 전달한다.

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

<%
String col1 = request.getParameter("col1"); //받아온 name 의 값들을 변수에 담는다
String col2 = request.getParameter("col2");
String col3 = request.getParameter("col3");
String col4 = request.getParameter("col4");
String style = request.getParameter("style"); //css 속성을 입력한다
%>

<%
java.util.Scanner sc = new java.util.Scanner(System.in);
System.out.print("행열 입력 :");
int col = sc.nextInt();
int row = sc.nextInt();

sc.close();
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
nav { <%=style%>  //nav 속성을 style 변수에 담아서 보낸다. (표현식)
	
}
</style>

</head>
<body>

	

	<nav>
	
		<h2>내비게이션 바</h2>
		 Col1 =<%=col1%><br>
		 Col2 =<%=col2%><br> 
		 Col3 =<%=col3%><br> 
		 Col4 =<%=col4%><br>

	</nav>

	<table> //테이블 생성
		<%
		for (int i = 0; i < col; i++) {
		%>
		<tr>
			<%
			for (int j = 0; j < row; j++) {
			%>
			<td>테이블</td>
			<%
			}
			%>
					</tr>
			
			<% 
			}
			%>
//이렇게 java 코드를 사용할 때는 <% %> 스크립틀릿에 담고 다시 html 코드를 사용할 때는 
//스크립틀릿을 닫아주고 다시 html 을 사용한다.
	</table>
	<script>
		const col1 = '<%=col1%>';
		const col2 = '<%=col2%>';
		const col3 = '<%=col3%>';
		const col4 = '<%=col4%>';

		console.log(col1);
		console.log(col2);
		console.log(col3);
		console.log(col4);
	</script>

</body>
</html>

HttpServletRequest : http 의 서블릿 요청을 받는 객체

request 정보를 서블릿에게 전달하기 위한 목적으로 사용한다.

HttpServletResponse : request 에서 받은 servlet 을 response 객체에 응답코드 , 메시지 등을 담아 전송함.


오후

JSP 지시자 :

클라이언트의 요청에 jsp 페이지가 실행될 때 필요한 정보를 jsp 컨테이너에게 알리는 역할

  • page : jsp 페이지에 지원되는 속성들을 정의.
    • import 속성 : jsp 페이지 내에서 package 이름을 지정하지 않고 다른 클래스를 가져와서 사용하는 경우 지정
    • errorpage : jsp 페이지에 오류가 발생했을 때 보여줄 오류페이지를 설정
    • 대충 말해 불러올 페이지 명시하는거임
  • include : 여러 페이지에서 특정 파일의 내용을 삽입하고자 할 때 사용
    • 특정 파일들의 코드 내용만 가져옴
  • taglib : 태그 라이브러리

500 번대 오류 : 서버에 문제가 있음

400 번대 : 클라이언트 오류

include 는 다른 파일의 뷰의 내용 만 가져옴(태그 조각만가져옴)


JSP 액션 태그 :

특정 동작이 일어나는 시점에 원하는 처리를 할 수 있도록 하는 기능

어떤 행동을 하도록 명령하는 태그

include 액션태그는 수행 결과를 가져옴

페이지를 넘어가게 하는 방식을 정하는 방식

forward 와 redirect 의 차이

  • forward :

Request 내용은 유지한 채 또 다른 page 경로로 이동. 이 때 , 창이 새로 뜨지 않고 page 가 전환이 되는 방식으로 이동한다.

클라이언트의 URL 경로는 최초 요청시의 URL 로 그대로 유지됨.

예) Start.jsp 페이지에서 id,pw를 입력후에 01page.jsp 에서 정보를 받아 값을 request 에 담아 최종적으로 03page.jsp 까지 forward 했을 때 URL 에는 01page.jsp 가 그대로 유지된다.

URL 이 그대로 유지되는 이유는 서버내부에서 처리가 일어나기 때문이다.

RequestDispatcher란
RequestDispatcher는 클라이언트로부터 최초에 들어온 요청을 JSP/Servlet 내에서 원하는 자원으로 요청을 넘기는(보내는) 역할을 수행하거나, 특정 자원에 처리를 요청하고 처리 결과를 얻어오는 기능을 수행하는 클래스입니다. 즉 /a.jsp 로 들어온 요청을 /a.jsp 내에서 RequestDispatcher를 사용하여 b.jsp로 요청을 보낼 수 있습니다. 또는 a.jsp에서 b.jsp로 처리를 요청하고 b.jsp에서 처리한 결과 내용을 a.jsp의 결과에 포함시킬 수 있습니다.

  • redirect :
    • 서버가 클라이언트에게 새로운 요청 URL 경로를 전달.
    • 클라언트는 서버가 제시한 URL 경로로 새롭게 페이지 요청.
    • Request 객체와 Response 객체는 redirect 회수만큼 새로운 값으로 대체
       redirect 를 하기 위해서는 sendRedirect 메서드를 사용한다.
       이때 주소는 새로운 주소값으로 바뀐다.
       response.sendRedirect("main.jsp");  // main.jsp로 redirect