*JSP 주석 <%-- --%>
: HTML 주석은 요청처리후 디버그 창에 내용이 보인다.
<body>
<h1>test1.jsp</h1>
<h3>2024-09-03 12:04:00</h3><!-- html 태그는 정적이므로 항상 같은 시각 출력됨 -->
<hr>
<%
Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int min = c.get(Calendar.MINUTE);
int sec = c.get(Calendar.SECOND);
%>
<h3>현재 시각은 <%= hour %>시 <%= min %>분 <%= sec %>초 입니다.</h3>
<!-- jsp 코드가 포함된 부분을 html 주석으로 처리할 경우
=> 실행해서 응답을 받았는데 html 주석을 쳐놓은 경우 응답내용이 표시된다.
=> 주의!! 이떄, jsp 코드가 서버에 실행될 때 코드 내용에 따라 서버상에서 오류가 발생할 수있다. -->
<!-- <h3>현재 시각 :<%=new Date() %> </h3> --> <!-- 파싱(변환)된 시각이 소스보기로 확인가능 -->
<!-- 결론! jsp 코드가 포함된 영역은 jsp주석으로 처리해야 실행조차 되지않는다.
=> 해당 주석부분 자체를 서버가 아예 무시하기 때문에 처리도 안되고 클라이언틀 전송
주석 단축키를 누르면 jsp 주석으로 자동처리됨
또한 서버상 요류가 발생할 수 있는 코드를 jsp 주석으로 처리하면 오류발생 없다. -->
<%-- <h3>현재 시각 :<%=new Date("22222222222222222") %> </h3> --%>
<%
// 이부분은 jsp 문서내에서 자바코드가 기술되는 영역(스크립트릿)으로
// 서버에서 컴파일 후 실행되어 결과값만 클라이언트로 전송되는 부분이다.
// 한줄 주석 및 범위 주석 등 자바의 주석을 모둔 사용
// 따라서, 이 주석들은 웹브라우ㅈ에서 해당영역 내에 표시되지 않는다.
%>
</body>
[ 결과화면 및 디버그화면 ]
* JSP 스크립트요소 (선언문(Declaration), 스크립틀릿(Scriptlet), 표현식(Expression))
: JSP 페이지 내에 자바코드를 삽입하기 위해 사용됨.
1. 선언문
- 자바코드에서 말하는 멤버변수와 메소드를 선언하기 위해 사용됨
- <%! ... %> 태그 사용. 선언문 태그는 중복사용 가능.
- 변수의 위치가 어디에 있든지 상관없다.
2. 스크립틀릿
- <% %> 태그 사용.
- 자바의 기본적인 문장들을 그대로 표현 가능한 블럭
- 스크립틀릿 내부는 자바의 메서드 내부와 동일한 위치로 취급됨
(실제로 컴파일된 클래스의 메서드 내에 해당 코드들이 위치함)
=> 메서드 내에서 수행 가능한 작업들만 코드로 기술 가능 (로컬 변수 선언, if 문 등의 문장 사용, 인스턴스 생성 등...)
=> 스크립틀릿 내에서 선언된 변수는 로컬 변수로 취급되며 접근제한자 지정이 불가능하고,
메서드를 정의할 수 없다! (= 메서드 내에서 메서드 정의 불가)
- 스크립틀릿 내에서 선언된 변수(로컬변수)는 선언된 위치보다 위(앞)쪽에서 접근불가!
- 변수 선언도 가능하며, 선언된 변수는 로컬 변수로 취급됨.
- 다른 메서드를 호출하거나 객체 생성 등의 다양한 작업가능함.
- 스크립틀릿 내에서 웹브라우저(화면)에 데이터를 출력하려면
JSP에서 제공하는 내장객체 out 객체의 print() 또는 println() 메서드 사용하여 출력가능
=> 주의! println() 메서드를 호출하더라도 줄바꿈 기능이 동작하지 않는다.
=> HTML에서 줄바꿈을 위한 엔터키는 공백2개로 취급되기 때문
따라서 <br>태그 등을 문자열에 포함시켜 줄바꿈을 직접 HTML 형식으로 수행해야 함.
ex) out.print("str3 = " + str3 +"<br>"); // 출력후 줄바꿈
- 스크립틀릿 외부라도 실제 클래스 내에서는 선언문을 제외한 나머지 모든 코드가
하나의 메서드(_jspService())내에 위치하므로 로컬변수는 스크립틀릿 외부에서도 접근가능하다.
끝나는거는 /html에서 끝난다. 그래서 범위를 벗어나지 않음.
3. 표현식
- 선언된 변수 값이나 메소드의 리턴값을 스크립틀릿 태그 외부에서 출력하려고 사용함.
- 출력객체의 print() 메서드를 통해 자동으로 문자열(String) 형식으로 변환되어 출력됨.
[ form 태그 ]
1) action 속성
- submit 동작 시 폼 태그 내의 입력값(= 폼 파라미터)를 모두 HTTP 요청 메세지에 저장 후
action 속성에 저장된 페이지(또는 파일)로 포워딩(이동) 작업 수행(=해당 페이지로 요청보냄)
=> 이 때, HTTP 요청 메세지 형태로 전송
2) method 속성
- 서버가 수행해야할 동작을 클라이언트 측에서 지정
- GET 방식(method="get" => 기본값)
=> URL 에 파라미터가 함께 포함되어 전송되는 요청 방식
(POST 방식에 비해 빠르지만, 요청 데이터 길이 제한이 있으며, 데이터가 노출됨)
- POST 방식(method="post")
=> URL 대신 BODY 에 파라미터를 포함하여 전송되는 요청 방식
(요청 데이터 길이 제한이 없으며, 데이터 노출이 최소화 되나, 상대적으로 느림)
=> 요청된 페이지에서 파라미터 데이터에 접근 시 한글 처리가 되지 않을 수 있으므로
request.setCharacterEncoding("UTF-8"); 코드를 사용하여
한글 인코딩 방식을 UTF-8(유니코드) 방식으로 변경해야한다!
- submit 버튼 클릭 시: form 태그 내의 데이터(= 폼 파라미터)가 HTTP 요청 메세지에 포함되고
action 속성에 지정된 페이지로 이동(= 페이지를 요청)하면서 HTTP 요청 메세지 전달함
=> 요청 관련 모든 정보는 request 객체가 관리(= JSP 가 자동으로 생성하는 객체 = 내장 객체)
따라서, request.메서드명() 형태로 request 객체의 메서드 호출하여 객체 다루기 가능
=> 요청받은 request 객체에 저장된 폼 파라미터 데이터를 가져오는 방법
1) request.getParameter("파라미터명"); // 단일 파라미터 데이터 가져오기 = String 리턴
2) request.getParameterValues("파라미터명"); // 복수 항목 파라미터 가져오기
= String[] 리턴(주로, checkbox 처럼 하나의 이름으로 복수개의 파라미터 전달할 경우 사용)
=> "파라미터명" 부분에는 폼 태그에서 입력 항목의 name 속성에 지정된 속성값 사용
=> 주의! 지정된 파라미터가 존재하지 않을 경우(지정한 이름이 없을 경우) null 값이 리턴되고,
파라미터는 있으나 데이터가 없는 경우에는 널스트링("") 값이 리턴됨
- 체크박스와 같은 여러개의 값을 가지고 오려면? getParameter() 메서드 사용시 하나의 데이터(첫번째)만 가져올 수 있음.
=> 따라서, getParameter() 메서드 대신 getParameterValues()메서드를 호출하여
파라미터를 String[](배열) 타입으로 리턴받아 처리햐아 한다.
배열을 반복문을 통해 차례대로 접근하여 데이터 출력
- 주의! 체크박스를 하나도 체크하지않았을 경우 request.getParameterValues() 메서드 리턴값이
null이 되고 (=배열 저장하는 벼수가 null)
이 배열의 length 속성에 접근하는 등의 배열을 사용하려 할때 null 값으로 인한 오류 발생함
(=NullPointer exception 예외 발생함)
=> 따라서, null 값에 대한 오류까지 방지할 수 있도록 하려면
객체(배열)이 null 이 아닐 경우에만 접근하도록 if 문을 추가해야 한다.
- 주의! 취미 3개중 하나라도 체크하지 않았을 경우 배열 인덱스로 직접 접근시 0 - 2번까지 접근할 대존재하지 않는 인덱스 때문에 에러 발생
에러메시지 : (java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2)
(=> 배열 크기(length)가 2인 배열에 인덱스 2번 지정하여 배열 범위를 벗어남!) => 0, 1 만 존재
=> 결론! 배열 접근 시 for문을 사용하여 배열 크기만큼 반복 접근하는 것이 안전하다!
<자바 코드 내에서 문자열 데이터에 대한 일치 여부를 비교할 때>
동등비교연산자(==) 대신 String 클래스의 equals() 메서드를 활용하여 문자열 비교 필수!
=> 동등비교연산자는 문자열의 '내용' 이 아닌 문자열이 저장된 위치의 '주소값' 을 비교하므로
동일한 내용의 문자열이라도 비교 결과가 false 값이 될 수 있다!
< 문자열 비교 기본 문법 >
if(문자열.equals(비교할문자열)) {
// 문자열이 일치할 경우 수행할 작업
} else {
// 문자열이 일치하지 않을 경우 수행할 작업
}
'자바스프링웹공부(2024) > JSP' 카테고리의 다른 글
2024.09.04.영역객체의 속성과 범위(Scope) (1) | 2024.09.08 |
---|---|
2024.09.03. response (6) | 2024.09.08 |