스크립트 태그 : html 안에 수행 기능하는 자바코드 넣기
디렉티브 태그 : 어떤 식으로 처리할 지를 설정
액션 태그 : 클라이언트 / 서버에 작동 방식 명령
: <% ... %> 모양을 사용한다
: jsp 컨테이너가 자바 코드와 함께 있는 스크립트 태그를 처리하고,
나머지는 HTML 코드나 일반 텍스트로 간주한다
: jsp파일을 java로 자동으로 생성해준다
<body>
<h2> Scripting tag </h2>
<!-- 스크립트 태그 세가지 -->
<!-- 1. 선언문 : 변수나 메소드 정의 -->
<%!
int count = 3, cnt = 0;
String name = "홍길동";
boolean ox = true;
String marketLower(String data) {
return data.toLowerCase();
}
%>
<!-- 2.스크립틀릿 : 자바 로직코드 작성, 자바 문법의 제어문 -->
<%
for(int i=0; i<=count; i++) {
cnt = cnt+i;
out.println("Java Server Pages " + cnt + " <br>");
}
%>
<!-- 표현문 : 호출 결과를 문자열 형태로 출력-->
<%= marketLower("HELLO World") %> <br>
<%= name + " " + ox %>
</body>
위와 같이 작성해주었는데. 실행시
이런식으로 작동되는 것을 확인할 수 있었다.
또한
...\Jsp_Study.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\JspBook\org\apache\jsp\Ch02...
-> 이런식으로 쭉 경로를 따라가보면 스크립트 태그를 이용해 작성했던 코드가 자동으로
...생략...
out.write("\t<!-- 스크립트 태그 세가지 -->\r\n");
out.write("\t<!-- 1. 선언문 : 변수나 메소드 정의 -->\r\n");
out.write("\t");
out.write("\r\n");
out.write("\t<!-- 2.스크립틀릿 : 자바 로직코드 작성, 자바 문법의 제어문 -->\r\n");
out.write("\t");
for(int i=0; i<=count; i++) {
cnt = cnt+i;
out.println("Java Server Pages " + cnt + " <br>");
}
out.write("\r\n");
out.write("\t<!-- 표현문 : 호출 결과를 문자열 형태로 출력-->\r\n");
...생략...
이런 모양으로 .java되어 저장되어있는 모습을 확인할 수 있었다.
<br>
사용하지위에서 코드 사용한거 보면 출력시
out.print(출력할 내용 + "<br>");
와 같은 형태를 사용했다.
System.out.print
가 아니라 out.print
의 형태를 사용한 것이다.out.println
으로 작성한다고 해도 에러는 안나지만 println
의 기능을 하지 못한다. 결국 어쨌든 html의 형태로 작성되고 있는거기 때문에 <%...%>안에 작성한다고 해도 <br>
를 사용해 줄 바꿈을 해줘야 원하는 대로 작동한다.1) println 을 사용해줬을 때
<%
int sum = 0;
for(int i=0; i<=10; i++) {
out.println(i);
sum += i;
}
%>
<!-- 표현문 : 호출 결과를 문자열 형태로 출력 -->
<br> <p> 합계= <%= sum %> </p>
출력모습
println의 기능이 제대로 먹히지 않고 출력된 것을 확인할 수 있다.
2) <br>
사용해줬을 때
<h2> Scripting tag </h2>
<%
int sum = 0;
for(int i=0; i<=10; i++) {
out.print(i + "<br>");
sum += i;
}
%>
<!-- 표현문 : 호출 결과를 문자열 형태로 출력 -->
<br> <p> 합계= <%= sum %> </p>
출력모습
page 디렉티브 태그
: 현재 jsp 페이지에 대한 정보를 설정하는 태그
: 어디든 선언 능하지만 일반적으로는 최상단에 작성한다
: 속성 = language, contentType, pageEncoding, import, session, buffer,autoFlush, isThreadSafe, info, errorPage, isErrorPage, isErrorPage, isScriptingEnable, isEUgnored
session : 서버측에서 자료를 저장하는 것
cookie : 클라이언트 측에서 자료를 저장하는 것
<%@ page contentType="text/html; charset=UTF-8"%>
<!-- contentType="text/html; charset=UTF-8" = contentType="text/html"; pageEncoding="UTF-8"-->
<%@ page import="java.util.*, java.io.*" %>
<%@ page session = "true"%>
<%@ page buffer="32kb" %>
<%@ page autoFlush="true" %>
<%@ page isThreadSafe = "true" %>
<!-- true=스레드처리 / false=순차처리 -->
<%@ page info = "이곳은 JSP 컨테이너에 대한 설명을 쓰는 곳" %>
에러 페이지 만들기로 한번 사용모습 보기
1. 현재 페이지에서 에러가 나면 특정 페이지(error_page.jsp)로 가라
2. 예외처리할 수 있는 exception 객체를 사용하는 page에 연결하기
"error_page.jsp"
<!-- 에러가 발생하면 아래 페이지로 이동해라 -->
<%@ page errorPage="error_page_error.jsp" %>
<body>
<%
String str = null;
out.print(str.toString());%>
</body>
"error_page_error.jsp"
<body>
<h4> errorPage 디렉티브 테그 </h4>
문자열에 자료를 넣지 않아 에러가 발생했습니다
</body>
위와 같이 식으로 작성하면
이렇게 에러가 나자 해당 파일(error_page_error.jsp) 파일로 이동했고, 내가 작성한 문장이 출력되는 것을 확인 할 수 있었다.
"error_page.jsp"
<!-- 에러가 발생하면 아래 페이지로 이동해라 -->
<%@ page errorPage="page_isErrorPage_error.jsp" %>
<body>
<%
String str = null;
out.print(str.toString());%>
</body>
"page_isErrorPage_error.jsp"
<%@page import="java.io.PrintWriter"%>
<!-- isErrorPage 내장객체 사용 기본 값은 false 상태 -->
<%@ page isErrorPage = "true" %>
<body>
<h4> 에러가 발생했습니다 </h4>
<h5> exception 내장 객체로 에러 처리하기</h5>
<!-- isErrorpage가 false로 꺼져있다면 내장객체인 exception 을 사용할 수 없다 -->
<% exception.printStackTrace(new PrintWriter(out)); %>
</body>
작성 순서에 따라 설정한 문구가 출력된 후 내장 객체가 에러 메세지를 출력하는 걸 확인할 수 있다.
: jsp 페이지의 특정 역역에 외부 파일의 내용을 포함하는 태그이다.
포함할 수 있는 외부파일 종류 = html, jsp, txt
선언하는 특정 위치는 없고, jsp 페이지 어디에서든 선언 가능하다
<%@ include file = " " %>
이런 모양
<%@ include file="menu.jsp" %>
<%! String greeting = "웹 쇼핑몰에 오신 것을 환영합니다";
String tagline = "Welcome to Market!"; %>
이런 식으로 연결하면 menu.jsp와 연결되는 거고, 그 파일의 내용이 현재 페이지에 계속 노출된다.
: 서버나 클라이언트에게 어떤 행동을 하도록 명령하는 태그
: jsp 페이지에서 페이지-페이지 사이를 제어
: 다른 페이지의 실행결과 내용을 현재 페이지에 포함 시킨다
: 자바 빈즈 등의 다양한 기능을 제공
: XML 형식 제공
: <jsp:종류 ... />의 모양
보기 1.
"forward.jsp 파일"
<h2> 액션 태그 </h2>
<!-- 연결 페이지로 보내버리고, 이 페이지는 출력 모양이 안나온다 -->
<jsp:forward page="forward_data.jsp" />
"forward_data.jsp 파일"
<body>
<h2> forward_data 파일 입니다 </h2>
<p> <%= (new java.util.Date()).toLocaleString() %>
</body>
분명 forward 파일에<h2> 액션 태그 </h2>
를 작성해주었고, forward 파일을 실행 시켰음에도 불구하고, 막상 실행시키면 forward_data.jsp 파일의 모습이 출력되는 걸 확인할 수 있다.
보기 2.
"first.jsp 파일"
<body>
<h3> 이 파일은 first.jsp 입니다 </h3>
<!-- 액션태그 사용 -->
<jsp:forward page="second.jsp" />
<p> ====== first.jsp 페이지 =======
</body>
"second.jsp 파일"
<body>
<h3> 이 파일은 second.jsp 파일입니다 </h3>
Today is <%= new java.util.Date() %>
</body>
이번에도 분명히 first.jsp 파일에 내용도 작성해 주었고, 실행했음에도 불구하고 second.jsp의 내용이 실행되는 것을 확인할 수 있었다.
현재 페이지를 열심히 작성했는데, 보내버려서 출력되지 않는다면 얼마나 아쉬울까. 그래서 갔다가 돌아오는 모양도 알아봤다.
"first.jsp 파일"
<body>
<h3> 이 파일은 first_include.jsp 파일</h3>
<!-- 갔다가 다시 이 페이지로 돌아옴 -->
<jsp:include page="second.jsp" />
<p>==============================</p>
</body>
"second.jsp 파일"
<body>
<h3> second_include.jsp 파일입니다 </h3>
Today is <%= (new java.util.Date()).toLocaleString() %>
</body>
위와 같이 first_include의 내용이 출력되고, 연결한 위치에서 넘어갔다가 다시 돌아오는 모습을 확인 할 수 있다.
param
이라는 걸 사용해도 된다.
자세히 보면 <jsp:param name=" " value=" " />
이런 모양으로 되어있으며 name에는 넘겨줄 변수명, value에는 넘겨줄 값을 적어주면 된다.
"first.jsp 파일"
<body>
<h3> 현재 파일은 first.jsp 입니다</h3>
<jsp:include page="second.jsp">
<jsp:param name="name" value="kim java" />
<jsp:param name="dept" value="computer" />
<jsp:param name="age" value="24" />
<jsp:param name="phone" value="7890-1234" />
</jsp:include>
<p> 이곳은 include 액션 태그 이후의 위치
</body>
"second.jsp 파일"
<body>
<h3> 현재 파일은 second.jsp 입니다</h3>
이름 : <%= request.getParameter("name") %> <br>
학과 : <%= request.getParameter("dept") %> <br>
나이 : <%= request.getParameter("age") %> <br>
번호 : <%= request.getParameter("phone") %>
<p> -------------------------------- </p>
</body>
연결된 파일로 값을 들고 넘어가서
원하는 대로 출력시켜 주고 다시 돌아오는 모습을 확인
만약 "first.jsp 파일" 에서 값을 그냥 한글로 넘겨준다면
<jsp:param name="name" value="김자바" />
<jsp:param name="dept" value="컴퓨터 공학과" />
이런 식으로 깨져서 제대로 안 들어간 걸 볼 수 있다.
어떤 방법이 있을까 찾아봤는데 <% request.setCharacterEncoding(" "); %>
을 넣어주면 된다는 글을 봤다.
그래서 상단에 아래와 같이 명시해주었고,
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<% request.setCharacterEncoding("utf-8"); %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h3> 현재 파일은 first.jsp 입니다</h3>
<jsp:include page="second.jsp">
<jsp:param name="name" value="김자바" />
<jsp:param name="dept" value="컴퓨터 공학과" />
<jsp:param name="age" value="24" />
<jsp:param name="phone" value="7890-1234" />
</jsp:include>
<p> 이곳은 include 액션 태그 이후의 위치
</body>
</html>
값이 제대로 넘어가고 출력되는걸 확인할 수 있었다
"first.jsp 파일"
상단에 인코더를 명시해주고
<%@ page import="java.net.URLEncoder" %>
<body>
<h3> 현재 파일은 first.jsp 입니다</h3>
<jsp:include page="second.jsp">
<jsp:param name="name" value='<%= java.net.URLEncoder.encode("김자바") %>' />
<jsp:param name="dept" value='<%= java.net.URLEncoder.encode("컴퓨터 공학과") %>' />
<jsp:param name="age" value="24" />
<jsp:param name="phone" value="7890-1234" />
</jsp:include>
<p> 이곳은 include 액션 태그 이후의 위치
</body>
"second.jsp 파일"
<%@ page import="java.net.URLDecoder" %>
<body>
<h3> 현재 파일은 second.jsp 입니다</h3>
<%
String name = request.getParameter("name");
String dept = request.getParameter("dept");
%>
학과 : <%=java.net.URLDecoder.decode(dept)%> <br>
이름 : <%=java.net.URLDecoder.decode(name)%> <br>
나이 : <%= request.getParameter("age") %> <br>
번호 : <%= request.getParameter("phone") %>
<p> -------------------------------- </p>
</body>
보내는 쪽에서는 import로 인코더를 받아주고
value='<%= java.net.URLEncoder.encode(" ")
받는 쪽에서는 import로 디코더를 받아주고
변수로 따로 받아 java.net.URLDecoder.decode( )
역시나 깨지지 않고, 잘 출력된다.