본문 바로가기

java/jsp & sevlet

[jsp& servlet] jsp 스크립트, 내장 객체, 요청 응답

jsp 스크립트


jsp 스크립트는 jsp파일 내에서 자바 코드를 삽입하는 방법이다.

삽입된 스크립트는 웹 컨테이너에서 jsp파일이 servlet으로 컴파일될 때 service 메소드로 삽입된다.

그리고 파싱된 html의 소스코드에서는 소스 코드에서 배제되므로 보안 상으로 안전하다.

 

선언 태그

멤버 변수 혹은 메서드를 선언할 수 있는 태그다.

여기서 선언된 변수는 라이프 사이클 내내 유지된다. 즉, service 메소드의 매 호출 마다 초기화되지 않고 유지된다.

형식 | <%! 코드 %>

 

주석 태그

html 주석 태그

클라이언트 소스 코드 쪽에 남는 일반적인 html 주석이다.

형식 | <!-- html 주석 -->

단축키 | ctrl shift c

 

JSP 주석 태그

서버 단에서만 볼 수 있는 주석 태그다.

형식 | <%-- jsp 주석 --%>

 (<%-- 까지 치면 자동 완성 된다.)

 

스크립트릿 태그

모든 자바 코드가 사용 가능하다.

중간중간에 htm을 넣는 방식도 있는데, 아래 예시와 같다.

 

<body>
	hello jsp
	<%
int num = -1;
if (num > 0) {
%>
	<p>number is big</p>

	<%
	} else {
	%>
	<p>number is small</p>
	<%
	}
	%>

</body>

 


선언 태그와 스크립트릿 태그 간 차이
두 태그는 스크립크 코드 간 변수를 선언하고 값을 공유할 수 있다.
차이는 전자는 전역 변수이자 멤버 변수이고 후자는 지역 변수이다.
또한, 선언 스크립트에서는 메서드 선언이 가능하다.

라이프 사이클의 측면에서 멤버 변수는 jsp 파일이 서버에서 가동되는동안 존속하지만,
지역 변수는 jsp파일이 호출될 때 마다 초기화된다.

그 이유는 jsp는 _jsp.java라는 servlet으로 컴파일되는데, 멤버변수는 init()으로 가고 로컬 변수는 service() 내에 있다. service()는 클라이언트이 요청마다 매번 초기화되므로 로컬 변수도 초기화된다.
// 멤버 변수와 지역 변수간 차이에 대한 예시

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
hello jsp
// 전역 변수 a
<%!
int a=0;
%>

// 로컬 변수 b
<%
int b=0;
a++;
b++;
%>

// a는 jsp가 서버에 올라간 이후로 계속 존속
// b는 로컬 변수로, jsp 파일이 응답될 때 마다 초기화
<%
out.println(a);
out.println(b);
%>
</body>
</html>

 

참고

System.out jsp에서 제대로 작동하지 않으므로, html 코드를 추가할 거면 <% out.println(num); %>을 사용하면 된다.

 

표현식 태그

표현식, 값만 입력가능한 태그다.

html의 태그 내에 값을 동적 삽입하기 용이하다.

형식 | <%=num%>

html 태그 내 동적 삽입 예시 | <p>num is <%=num%></p>

 

주의사항
스크립트 간에는 중첩하여 작성이 안된다. 즉, 스크립트 내에 다른 스크립트를 넣을 수 없다.
또한, 태그 내에서 표현식 태그가 아닌게 들어오면 안될 가능성이 크다. (아직 모든 경우를 찾아보진 못해서 추가 확인이 필요하다)

 

지시어

page의 처리 방법에 대한 지시 사항

jsp에서 라이브러리를 임포트할 때도 사용

형식 | <%@ 처리어 키=벨류%>

 

ex) page : 페이지 기본 설정

<%@page import="java.util.ArrayList"%>

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

 

ex) include : jsp 파일 삽입

<%@include file="/header.jsp" %>

 

ex) taglib: 외부 라이브러리 uri 삽입

<%@taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c" %>

jsp 파일에서 자동완성을 위한 템플릿 추가 방법
window- preference – web- jsp file - templates

 

 

 

JSP 내장객체와 config 객체 및 aplication 객체(데이터 공유)


내장 객체란, 리퀘스트, 리스폰스처럼, import 없이 바로 사용가능한 객체를 말한다.

내장 객체는 파일 내에 자동으로 선언되어 있으므로 선언 스크립트에서 의도치 않은 중복을 주의해야 한다.

 

JSP request, response

  • jsp는 servlet으로 컴파일되므로 request,response 객체를 사용할 수 있다.
  • jsp form은 특정 페이지 경로 외에도 다른 파일로 직접 전송이 가능하다.

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

// 경로 사용하는 부분에 대한 추가 공부가 필요하다.

 

JSP를 컴파일하는 과정에서 HTML 문법상 이상하다 싶은 부분은 알아서 변경되기도 한다.

예컨대, p태그 내에 p 태그를 넣으면 이를 잘못된 것으로 판단해서 내부의 p를 바깥으로 빼낸다.

 

config 객체( 특정한 파일에서만 공유 )

config 객체는 지정된 파일 간에 데이터를 공유할 수 있도록 설정한 것을 말한다.

주로 adminid 같은 값을 빌드 단계에서 jsp 간에 공유할 수 있는 값으로 설정할 때 사용한다.

 

형식

web.xml에서 공유할 jsp를 선택하고 데이터 공유

<!--@web.xml-->
<servlet>
		<servlet-name>adminHome</servlet-name>
		<jsp-file>/adminHome.jsp</jsp-file>
		<init-param>
			<param-name>adminId</param-name>
			<param-value>taey</param-value>

		</init-param>
		<init-param>
			<param-name>adminPassword</param-name>
			<param-value>1234</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>adminHome</servlet-name>
		<url-pattern>/admin/home</url-pattern>
	</servlet-mapping>

 

 

jsp 파일에서 config 내장 객체를 이용하여 접근 가능하다.

주의사항으로는 선언 태그에서는 config 내장 객체에 접근할 수 없다.

그 이유는 선언 태그가 컴파일되어 들어가는 init 메소드에서는 아직 config 내장 객체가 생성되지 않았기 때문이다.

(다만, 이 부분은 좀 더 공부해봐야 알 것 같다.)

<%@ page language="java" contentType="text/html; charset=EUC-KR"
	pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<p>this is admin page</p>
	<%!String adminId;
	String adminPassword;%>
	<%
	adminId = config.getInitParameter("adminId");
	adminPassword = config.getInitParameter("adminPassword");
	%>

	<p>
		admin id :
		<%=adminId%></p>
	<p>
		admin password
		<%=adminPassword%></p>

</body>
</html>

 

application 객체( 모든 파일에서 공유하기 )

이 객체에서 데이터를 공유하면 앱 내 모든파일에서 사용가능하다.

보편적으로 사용하는 이미지 정적 데이터 경로나 서버 ip 등을 공유할 때 사용한다.

 

형식

web.xml 파일에서 공유 설정

<!--web.xml-->
<context-param>
	<param-name>imgDir</param-name>
	<param-value>/static/img</param-value>
</context-param>

 

jsp, servlet 파일에서 읽어오기

<%@ page language="java" contentType="text/html; charset=EUC-KR"
	pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<p>this is admin page</p>
	<%!
	String imgDir;
	String serverPort;%>
	<%
	imgDir = application.getInitParameter("imgDir");
	serverPort = getServletContext().getInitParameter("serverPort");
	%>

	<p>
		imgDir :
		<%=imgDir%></p>
	<p>
		serverPort
		<%=serverPort%></p>

</body>
</html>

 

추가로 속성 설정하기

다른 곳에서 application 객체에 속성을 추가하거나 변경하면, 다른 파일에서 그것을 받아 볼 수 있다.

<%
	getServletContext().setAttribute("videoDir", "/dir/video");
%>

<%
	String a = (String)application.getAttribute("videoDir");
%>

 

참고자료

config 객체의 생명주기

https://codevang.tistory.com/202