일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- instancenotfoundexception
- 포트포워딩 안될때
- 배열빈도수
- 유니캐스트
- ubuntu
- dbeaver
- 오름차순
- 배열복사
- 포트포워딩
- name=springapplication
- docker
- 배열최소값최대값
- 백준1946
- 우분투
- Decapsulation
- 페이로드
- 브로드캐스트
- 도커
- javax.management.instancenotfoundexception: org.springframework.boot:type=admin
- springboot
- jmx
- 리눅스환경
- SpringApplication
- 모래시계출력
- 네트워크모델
- wan
- 리눅스계열
- 백준
- 도커권한설정
- 디비버
- Today
- Total
다잘하고싶어
JSP 본문
목차
- JSP 구성요소
- JSP 태그 종류
- 스크립트릿 <% %>
- 선언부<%! %>
- Q. 스트립트릿으로 선언한 변수와 선언부로 선언한 변수의 차이?
- 표현식
- 지시자 page, include
- JSP 기본 객체 영역 ( scope)
- 페이지 이동
- 포워드
- 리다이렉트
- JSP 기본 객체 영역 메서드
- 코드실습
JSP
- Servlet 표준을 기반으로 작성된 웹 어플리케이션 개발 언어
- HTML 내에 Java 를 작성하여 동적으로 웹페이지를 생성하여 브라우저에게 돌려주는 페이지
- 실행 시 Servlet 으로 변환된 후 실행
서블릿은 자바코드 내에 HTML 을 작성, JSP는 HTML 내에 자바코드를 작성
JSP 구성요소
지시자
- JSP 에 대한 설정 정보를 지정하기 위해서 사용
스크립트 요소 : 스트립트릿(Scriptlet), 표현식, 선언부
- JSP에서 문서의 내용을 동적으로 생성하기 위해 사용
JSP 기본 객체
- 요청 및 응답 관련 정보를 얻거나
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>
<h2>스크립트릿 연습</h2>
<%
int a = 10;
int b = 20;
int sum = a + b;
out.print(a+"+"+b+"="+sum);
%>
</body>
</html>
선언부 <%! %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!String name = "랄랄라";
//두 정수를 더하는 메서드
public int add(int a, int b) {
return a + b;
}
//절대값을 반환하는 메서드
public int abs(int a) {
return a > 0 ? a : -a;
}
int a = 10;
int b = -20;%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% out.print(add(a,b));%> <br>
<% out.print(abs(a));%> <br>
<% out.print(abs(b));%> <br>
</body>
</html>
Q. 스트립트릿으로 선언한 변수와 선언부로 선언한 변수의 차이는 뭘까?
스트립트릿에서도 자바코드로 변수를 선언할 수 있는데 왜 굳이 선언부로 변수를 선언하지?
파일을 확인해보면
→ 자바파일을 살펴보면 스크립트릿으로 선언한 변수들은 jspService 라고 하는 메서드 안에 생성되어있다.
→ 자바에서는 메서드 안에 메서드 정의할 수 없다!
→메서드 안에 변수를 선언했다면 그것은 지역변수(local value)
선언부로 선언한 변수들은 jsp라고 이름이 바뀐 클래스의 멤버변수로 생성되어있다. 메서드와 무관하게 클래스 영역에 작성된 변수들. 서블릿은 한번 생성한 것을 계속해서 사용하니까 클래스변수로 생각할 수 있다. 따라서 서비스(다른 메서드)에서 불러서 사용할 수도 있다!
선언한 애들은 클래스 밑에 바로 생성되는 거고 스크립트로 생성된 애들은 서비스(메서드) 안에 생성된 지역변수이다.
그렇다면? 아래 코드를 실행한 후 계속해서 새로고침하면 값은 어떻게 나올까?
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
int cnt1 = 0;
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
int cnt2 = 0;
out.print("cnt1 : ");
out.print(++cnt1);
out.print("<br>");
out.print("cnt2 : ");
out.print(++cnt2);
out.print("<br>");
%>
</body>
</html>
새로고침을 반복할수록 cnt1은 계속해서 증가하지만 cnt2는 계속 1 이 나온다. 왜?
서블릿은 사라질 때까지 계속 사용할 수 있음
즉, cnt1은 계속 사용할 수 있는 변수이고, cnt2는 요청할때마다 새롭게 만들어지는 지역변수이다.
위의 예시와 서블릿의 생명주기 이해하기!
원래는 JVM에 서블릿이 없는 상황( 요청이 왔지만 서블릿이 없음) ⇒ 그러면 class를 메모리에 올린다. (ex. count.class) ⇒ 톰캣에 있는 서블릿 컨테이너가 생성자를 생성해준다 (우리가 new 해서 만들지 않음, 대신해줘) ⇒ init() 메서드 동작 해서 초기화를 하고 ⇒ 내부적으로 service 라는 메서드가 동작한다.
즉, 서블릿은 한번 만들어지면 계속해서 사용한다. 따라서 init 메서드를 통해 만들어진 cnt1 변수는 계속해서 살아있으니까 cnt가 누적해서 올라가는 것이고, 서비스메서드 안에 있는 cnt2는 메서드 종료 시 삭제되니까 요청이 들어올때마다 매번 새로운 변수로 초기화되기때문에 1 값만 나오는 것
표현식
- 변수의 값이나 계산식 혹은 함수를 호출한 결과를 문자열 형태로 출력
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!String name = "아아아";%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
out.print(name);
%>
<br>
<%=name %>
</body>
</html>
결과는 같다! 두개의 차이는?
<%out.print(name);%>
<%=name %>
⇒ 세미콜론이 없음
왜? <%= 안의 값은 파라미터로 그대로 들어간다! 파라미터안에 ; 있을 수 없으니까 제외
HTML 주석만 보인다!
지시자(1) → page
- 웹 컨테이너(톰캣)가 JSP 번역하고 실행하는 방법을 서술
- page : 해당 JSP 전반적으로 환경을 설정할 내용 지정
- include : 현재 페이지에 다른 파일의 내용을 삽입할 때 사용
- taglib : 태그 라이브러리에서 태그를 사용할 수 있는 기능 제공
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page errorPage="error.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>강제로 0으로 나눠</title>
</head>
<body>
0으로 나누는 것은 불가능!!!
<%=2 / 0%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>에러페이지</title>
</head>
<body>
<%= exception.getMessage() %>
</body>
</html>
지시자(2) → include
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>인클루드 써보자</title>
</head>
<body>
<%@ include file="/template/
header.jsp" %>
<h3>메인내용입니다</h3>
<p>가나다라마바사</p>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<header>head 수정 혹은 메뉴가 들어갈 내용입니다.</header>
JSP 기본 객체 영역( Scope )
페이지 이동
포워드 방식
- 요청이 들어오면 요청을 받은 JSP 또는 Servlet 이 직접 응답을 작성하지 않고, 요청을 서버 내부에서 전달하여 해당 요청을 처리하게 하는 방식( url 안바뀜)
- request, response 객체가 전달되어 사용되기 때문에 ( 통로 유지) 객체가 사라지지 않고, 브라우저에는 최초 요청한 주소가 표시
- 프로젝트 내부적으로만 토스 가능
리다이렉트 방식
- 요청이 들어오면 내부 로직을 실행, 브라우저의 url 을 변경하도록 하여 새로운 요청을 생성함으로써 페이지를 이동.
- 브라우저가 새로운 요청을 만들어내기 때문에 최초 요청 주소와 다름
- 새롭게 요청을 날리는 거니까 다양하게 사용 가능,
⇒ 포워드 = 날 가지고가, 리다이렉트 = 새롭게 요청 보내
JSP 기본 객체 영역 메서드
서블릿과 페이지간 정보를 공유하기 위한 메서드
코드실습
import java.util.ArrayList;
import java.util.List;
import com.ssafy.dto.Person;
//사람의 목록 관리를 하는 매니저
//싱글턴으로 만들고 싶어요!!
public class PersonManager {
//사람 목록
private List<Person> list = new ArrayList<>();
private static PersonManager manager = new PersonManager();
//기본생성자막기
private PersonManager() {
}
//외부에서 그래도 만들어진 매니저를 가져다 써야되니까~~~
public static PersonManager getInstance() {
return manager;
}
//사람을 등록하는 기능
public void regist(Person p) {
list.add(p);
}
//사람의 목록을 반환하는 기능
public List<Person> getAll(){
return list;
}
//... 다양하게 분류를 지어 가져오도록 만들어 볼수도있음...
}
RequestDispatcher 인터페이스
WEB-INF 는 특별한 영역이라서 주소를 쳐서는(url로는) 접근할 수 없다. 외부에서 접근할 수 없게끔 막아져 있는 공간. 여기 안에는 요청을 통해서만 접근이 가능.
'이론학습 > Servlet&JSP' 카테고리의 다른 글
서블릿 (0) | 2023.04.10 |
---|---|
이클립스에 톰캣 등록하기 (0) | 2023.04.10 |