JSP
java server pages
html 코드에 java 코드를 넣어 동적웹페이지를 생성하는 웹어플리케이션 도구이다. jsp가 실행되면 자바 서블릿으로 변환되며 web application server 에서 동작되면서 필요한 기능을 수행하고 , 생성된 데이터를 웹페이지와 함께 클라이언트로 응답한다.
jsp 와 서블릿의 차이점
뭐가 다르냐 ?
- jsp 는 html 코드 내부에 자바 코드가 들어가서 html 코드를 작성하기 간편하다는 점 , jsp 파일임
- 서블릿은 자바코드내에 html 코드가 있어서 읽고 쓰기가 굉장히 불편해서 작업효율이 떨어짐. , java 파일이다.
하지만 둘은 같이 알고 있어야한다.
jsp로 작성된 프로그램은 서버로 요청시 서블릿 파일로 변환되어 jsp 태그를 분해하고 추출해서 다시 순수한 html 로 변환한다.
※ 두 종류가 같은 파일이라거나 그런건 아님 ! 서블릿은 자바 파일에서 사용하는 html 코드이다.
대충 동작하는 순서.
-
- 클라이언트가 어떤 동작을 함으로써 hello.jsp 를 요청하였다.
-
- JSP 컨테이너가 JSP 파일을 읽는다.
-
- JSP 컨테이너가 Generete (변환) 작업을 통해 Servlet ( .java ) 파일을 생성한다.
-
- .java 파일은 다시 .class 파일로 컴파일된다.
-
- Execute (실행) 을통해 HTML 파일을 생성하여 JSP 컨테이너 에게 전달한다.
-
- 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