> tomcat 설치
tomcat 9버전 설치 - 압축풀기 - eclipse 가 있는 폴더로 이동
이클립스 실행 후 new - other - server 선택 - apache 의 Tomcat v9.0 Server 선택 - Browse 로 tomcat 폴더 선택
1. Project 생성: new - other - dynamic 검색 - Dynamic Web Project 선택 - Project name 작성
2. Servlet 생성: Project (or package) 우클릭 - new - Servlet - package, class name 작성
(servlet 이 안 보일 경우: window - perspective - open perspective - other - Java EE)
→ 경로: (project) > Java Resources > src > (Java Package) > (Class)
* 실행 시 서버는 tomcat 선택
* 실행 브라우저 선택: window - web browser
만든 servlet 은 HttpServlet 을 상속받아 만들어짐
오버라이딩 된 doGet 메소드 - 실행할 명령문 작성
3. JSP 파일 생성
WebContent 에 새 폴더 생성 (WebContent 우클릭 - new - folder - name 작성)
만든 폴더 우클릭 - new - JSP File - name 작성 (.jsp)
* https://github.com/emmetio/emmet-eclipse 설치
> JSP (Java Server Page)
html 기반으로 작성된 jsp 파일은 (servlet) java 로 바뀌어 페이지에 구현됨
jsp → java → html → 화면
- workspace> .metadata> .plugins> org.eclipse.wst.server.core> tmp0> work> ..> 우클릭> code로 열기 하여 자바코드 확인 가능
< 스크립트 >
1. scriptlet 스크립트릿 (<% %>)
자바 코드 작성 가능 (<script> 코드와 혼동 주의 - script 코드는 html)
* out 이라는 객체를 사용할 수 있는 이유는 코드 위에 객체가 선언되어있기 때문
기본객체 (response, request, pageContext, session, application, config, out, page) - jsp 교재 114페이지 참고
객체의 타입을 검색해보면 객체에 대해 자세히 알 수 있음 (ex. out 의 타입은 JspWriter, https://docs.oracle.com/javaee/7/api/javax/servlet/jsp/JspWriter.html )
scriptlet 사용 예)
1. jsp
<h1>Hello</h1>
<%
for (int i = 0; i < 5; i++){
out.println("<p>hello</p>");
}
%>
2. java
out.write("<h1>Hello</h1>\r\n");
for (int i = 0; i < 5; i++){
out.println("<p>hello</p>");
}
3. html
<h1>Hello</h1>
<p>hello</p>
<p>hello</p>
<p>hello</p>
<p>hello</p>
<p>hello</p>
4. 화면
Hello
hello
hello
hello
hello
hello
* page 디렉티브
import 는 <%@ page import="java.util.*" %> 와 같이 (attribute 로) 작성
(window> preferences> template검색 - JSP Files 안의 Editor 안의 Templates > New JSP File (html 5) 더블클릭 하여 기본 설정을 변경)
java resources 안에 자바 코드로 작성한 클래스를 만들고, jsp 파일에서 import 하여 이를 사용할 수 있음
2. expression 표현식 (<%= %>)
값을 출력
scriptlet 과 달리 한 줄에 작성, statement 작성 불가하며, parameter 작성에 쓰임
3. declaration 선언부 (<%! %>)
필드 또는 메소드 작성 가능
class 안에 바로 작성되기 때문에 주로 파일 윗부분에 작성됨
_jspService 라는 메소드
< 기본 객체 JSP Implicit Object >
response, request, pageContext, session, application, config, out, page - jsp 교재 114페이지 참고
그 중에서 jsp 에서 가장 많이 사용되는 기본 객체는 request
타입: HttpServletRequest ( https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html )
대표적인 메소드: getParameter
string 으로 읽기 때문에 int 에 형변환 없이 바로 저장할 수 없음 (int a = Integer.parseInt(para1);)
query string: 주소에서 "?" 뒤에 위치 (?name=value&name=value&...)
HTML Form Elements 참고 ( https://www.w3schools.com/html/html_form_elements.asp )
<form> 안에 <input> element 작성
<form>
<input name="q">
<input type="submit">
</form>
<p><%= request.getParameter("q") %></p>
input 의 type 에 따라 (submit, text, number, date, file, password, email, checkbox, radio 등) 사용자가 입력할 수 있는 방법이 다양하게 결정됨
text 가 (input 태그의 type 속성의) 기본값
submit 과 같은 form 에 위치한 element 들은 submit 클릭 시 함께 전송됨
<form action="">
<input type="text" name="para1">
<input type="submit">
</form>
<%= request.getParameter("para1") %>
→ aaaa 입력 시 주소창에 ?para1=aaaa 로 표시되며, request 에 의해 aaaa 가 화면에 출력됨
<form action="">
<input type="checkbox" name="movie" value="action">액션
<input type="checkbox" name="movie" value="horror">공포
<input type="checkbox" name="movie" value="family">가족
<input type="checkbox" name="movie" value="kids">어린이
<input type="checkbox" name="movie" value="romance">로맨스
<input type="submit" value="전송">
</form>
<ul>
<%
String[] movies = request.getParameterValues("movie");
if(movie != null){
for(String movie : movies){
out.print("<li>");
out.print(movie);
out.print("</li>");
}
}
%>
</ul>
checkbox 는 동일한 name 값을 가진 element 를 여러개 선택할 수 있지만, radio 는 단 하나만 선택할 수 있음
<form action="">
<input type="radio" name="color" value="red"> 빨강
<input type="radio" name="color" value="blue"> 파랑
<input type="radio" name="color" value="yellow"> 노랑
<input type="radio" name="color" value="green"> 초록
<input type="radio" name="color" value="white"> 흰색
<input type="submit" value="전송">
</form>
<%
String color = request.getParameter("color");
%>
<p>좋아하는 색: <%= color %></p>
<div style="width:100px; height:100px; border:2px solid black; background-color:<%= color %>">
</div>
초기에 체크된 상태로 시작하는 checkbox/radio 를 원하면, 해당 element 에 checked 작성
<input type="checkbox" name="movie" value="action" checked> 액션
<input type="radio" name="color" value="red" checked> 빨강
input 말고도 option
<form action="">
<select name="color" id="">
<option value="red">빨강</option>
<option value="blue" selected>파랑</option>
</select>
<br>
<input type="submit" value="전송">
</form>
input 말고도 textarea (빈 요소 아님)
<form action="">
<textarea name="text1" id="" cols="30" rows="10"></textarea>
<input type="submit" value="전송">
</form>
String txt = request.getParameter("text1");
<textarea name="" id="" cols="30" rows="10" readonly><%= txt %></textarea>
→ ?text1=입력한텍스트, <script> 작성으로 해킹!
post
<form action="" method="post">
post 방식(요청방식)으로 입력하면 query string 에 표시되지 않음
get: 쿼리 문자열이 노출되는 방식, 길이 제한 있음 (<form action="" method="get">, 기본값이 get 이므로 작성하지 않으면 get)
post: 쿼리 문자열이 노출되지 않는 방식(body 에 붙어서 전송), 길이 제한 없음, 엔터 자체가 submit 형태
- 로그인 (아이디, 패스워드) 작성에 사용될 수 있음
context path / context root
03module
파일을 여러개 모아서 사용 (파일 여러개 동시에 선택)
.jspf 파일은 jsp 의 일부분으로 다른 jsp 에 포함되도록 만들어짐
반복사용되는 코드를 jspf 로 뽑아서 jsp 파일에서 include
<%@ include file ="포함할 파일"%> 와 같이 작성 (ex. <%@ include file="/includee.jsp"%>)
이 때 중복되는 불필요한 부분은 제외하고 복붙된다
경로
1)절대경로 - 폴더루트로 사용됨, '/' 로 시작, 기준점이며 수시로 바뀔 수 있다
2)상대경로 - 현재 jsp 페이지 기준으로 결정됨 (현재 파일 기준)
경로 지정은 <%= request.getContextPath() %> 로 많이 쓰임 (<a href="<%= request.getContextPath() %>/02request/35login-form.jsp">)
절대 경로 링크 예. <a href="/jsp1025/04path/02browser2.jsp">
상대 경로 링크 예. <a href="02browser2.jsp">
icon
webcontent 안에 resource 폴더를 만들고 그 안에 css 폴더를 만들어서, 그 안에 있는 아이콘을 사용함
<link rel="stylesheet" href="<%= request.getContextPath() %>/resource/css/icon/css/all.css">
resource > css > icon > css > all.css 라는 파일
jsp action tag
각 jsp 작업 태그 - 특정 작업을 수행하는 데에 사용
jsp 태그 - 페이지 간 플로우를 제어, java bean 을 사용하는 데에 사용
작성 형식은 "jsp:" + 기능에 따른 용어 (ex. jsp:forward)
include 액션 태그 (jsp:include) 는 그대로 복붙이 아님, 메소드가 호출된 결과라고 보아야하며, 몇가지 기본 객체를 함께 넘겨줌
ex. <jsp:include page="04include-ex-sub.jsp"></jsp:include>
main
name=John 하면 main 과 sub 모두의 name 에 john 이 입력됨
<jsp:param value="" name=""/> 으로 sub을 만들어놓고 name 사용 후 value 값을 조절 가능
05attribute
getParameter 는 오직 string
string 이 아닌 값을 넘겨주고 싶을 때?
request.setAttribute("attr1","avengers");
→ attr1 (객체명) 의 이름으로 avengers (객체) 를 넘겨줄 수 있음
<%= request.getAttribute("attr1") %>
→ object 를 반환하므로 모든 객체 가능, 단 다시 사용하려면 강제형변환 필요
* main - sub ?? 05attribute
06sub 코드 중 -
MyBook book = (MyBook) request.getAttribute("book");
MyBook book1 = new MyBook("java tutorial", 30000);
→ 자바 - 객체선언, 다형성 참고
request : client → server 의 java(servlet)
response : server 의 html(jsp) → client
06forward
<jsp:forward>
forward 를 만나는 순간 그 전에 출력했던 내용이 다 사라짐
그 후 01other.jsp 코드가 순서대로 출력 (페이지 소스 검사해도 01other.jsp 나옴)
그리고 끝남, 01main.jsp 로 돌아오지 않음
html 코드들이 지워지고 출력된다고 생각해도 됨
main 에서 <jsp:forward page="01other.jsp"></jsp:forward> 만나면 그 후 01other.jsp 코드가 순서대로 출력되는 것임
main 에서 forward 이후에 내용 추가해도 출력 안됨
요청은 01.main.jsp, 내용은 01other.jsp
03 - main 에서 param1, param2 값을 입력하면 other 에서도 적용됨, request 를 공유하기 때문
request 는 attribute 를 주로 사용, parameter 도 사용
META-INF : 밖에서 접근 불가한 폴더
WEB-INF : 밖에서 접근 불가한 파일을 만드는 곳 (실행도 불가, 접근도 불가)
<jsp:forward page="09page.jsp"></jsp:forward>
<jsp:forward page="/WEB-INF/veiw/06forward/09pageb.jsp"></jsp:forward>
07redirect
session
타입: javax.servlet.http.httpSession
설명: HTTP 세션 정보를 저장한다
session 은 서버측의 컨테이너에서 관리되는 정보, 이 정보는 컨테이너에서 접속~종료까지 유지되며, 접속시간에 제한을 두어 일정시간 응답이 없으면 정보를 더 이상 유지되지 않게 설정이 가능
정보가 서버측에서 저장된다는 점에서 보안적으로 유리, 즉 세션은 client 와 server 간의 접속을 유지시켜주는 역할
- 서버쪽에서 웹컨테이너의 상태를 유지하기 위해 정보를 저장하는 객체 (방법)
- 웹 브라우저 당 한개의 세션 정보를 생성하여 사용
- 접속시간에 제한을 두어 일정시간 응답이 없으면 유지 못하게 설정이 가능
session 객체 메소드
세션 생성: session.setAttribute("name", "value");
세션 정보 가져오기: session.getAttribute("name");
세션 유지시간 설정하고 반환하기: session.setMaxInactiveInterval(초); / session.getMaxInactiveInterval(초);
세션 정보 삭제: session.removeAttribute("name");
세션 정보 초기화: session.invalidate();
(삭제와 초기화의 차이
- 초기화는 세션의 모든 속성 값을 제거(각 속성 값들을 하나씩 제거할 필요 없음)
따라서 세션 유지 시간이 지났을 때 세션이 초기화되는 것 같은 효과를 가짐
초기화가 안되면 서버는 세션정보를 계속 가지고있게 되어 부담이 되거나 보안상의 문제가 있어 일반적으로 삭제보다 초기화 사용
예를들어 로그아웃 기능 시 사용
삭제는 파라미터로 지정된 이름의 속성값을 제거
세션에 저장해둔 속성을 이미 모두 사용하였고 더 이상 사용할 필요가 없을 때 사용
! 로그아웃 하면 초기화!! (쿠키 초기화?)
07redirect
톰캣이 response 객체를 조작하여 client 에 응답을 줌
프로토콜버전/상태코드 (HTTP/1.1 200)
두번째줄부터 header
status code
302 Found : 요청된 리소스의 URI 가 일시적으로 변경되었음을 의미, 향후 URI 에 추가 변경이 있을 수 있음. 따라서 이 URI 는 이후 요청 시 클라이언트에서 사용해야 함. 다른 곳으로 요청을 보내달라는 응답.
404 Not Found : 서버가 요청한 리소스를 찾을 수 없음. 브라우저에서 URL 이 인식되지 않음을 의미. 혹은 403 이 대힌 이 응답을 발송할 수도 있음.
500 Internal Server Error : 서버에서 처리 방법을 모르는 상황이 발생
String location = "03to.jsp";
response.sendRedirect(location);
forward 와 response 차이점?
forward 는 요청을 main, 내용을 other - request 하나로 공유
response 는 주소도 03to.jsp 가지고 내용도 03to.jsp - request 각각 씀 (03from 과 03to 가)
redirect
웹 브라우저 - jsp 파일 사이에서 웹브라우저가 파일로 요청을 보내고 파일에서 브라우저로 리다이렉트하라고 지정함
즉, 서버가 클라이언트 요청에 대해 특정 URL 로 다시 이동을 요청하는 룰임, 클라이언트가 서버에 resource 요청을 함
만약 request.setAttribute("attr1", "java"); 를 넣고 다른 파일에서 request.getAttribute("attr1"); 로 값을 꺼냈는데 결과값이 null? -> 두 파일의 request 가 서로 다른 객체라는 의미
session - 같은 브라우저!!
session 을 이용하여 attribute 받을 수 있음 request 들이 공유하는 객체 (같은 브라우저, 같은 클라이언트 일때)
URLEncoder.encode("입력값", 인코딩);
인코딩 예) "UTF-8"
이를 이용하여 문자 뒤에 더하고 & 으로 쿼리스트링 연결
HashMap 사용하기 - Map<String, String> map = new HashMap<>();
<%@ page import="java.net.URLEncoder" %> import 하기 (한글/특문 있을수 있으니?)
response.sendRedirect("16path-to.jsp"); - 상대경로
브라우저가 사용하는 경로라서 request.getContextPath()
from → to 는 보통 절대 경로를 많이 씀
session 은 여러 객체를 공유하는 느낌이라고 생각하면 됨
! 정리 ! request 로 받은 attr1 은 전달이 안됐음 왜? 각각 다른 request 를 쓰기 때문!
그런데 session 은 같은 브라우저를 공유하기만 하면 전달이 가능! (달리 말하면, 서로 다른 브라우저에서는 공유 불가!)
* 세션을 유지하는 방법
첫번째 요청에 대한 응답에 쿠키를 포함 - 두번째 요청부터 같은 쿠키를 가지고 있으면 같은 브라우저에서 온 요청으로 판단
(쿠키 삭제? 설정- 쿠키검색- 모든 쿠키 및 사이트 데이터 보기- localhost- 검색해서 쓰레기통으로)
(교재 114. session 의 실제 타입: javax.servlet.http.httpSession)
첫번째 응답에 주는 쿠기 받고 나중에 세션이 초기화되면 다시 줌
각 브라우저마다 가지고 있지만 어떤 하나의 세션만 가능
setMaxInactiveInterval()
- 초단위, 클라이언트 요청 사이에 이 세션이 열린 상태로 유지되는 시간(초)를 지정하는 정수
- 반환값이 0 이하면 세션이 절대 시간 초과되지 않음
? 타임아웃 설정? 설정하지 않으면 WAS 기본값으로 적용 (Tomcat(conf/web.xml)은 30분)
! 우선순위: 1. session.setMaxInactiveInterval() 프로그램 내에서 time out 설정한 경우 2. Web application 내의 WEB-INF/web.xml
3. Tomcat 내의 conf/web.xml
09cookie
Request Headers 에 쿠키명=값 쌍으로 들고다님
쿠키는 브라우저, 세션은 서버에 저장됨
요청에 포함된 모든 헤더 이름의 열거를 반환하며 요청에 헤더가 없는 경우 이 메소드는 빈 열거를 반환
일부 servlet 컨테이너는 servlet 이 이 메소드를 사용하여 헤더에 엑세스 하는 것을 허용하지 않음, 이경우 null 반환
request.getHeader("~");
세션 쿠키 maxAge (tomcat - JSESSIONID)
서버에도 세션이 남아있으면 브라우저 종료해도 남아있을 수 있음
10scope
기본객체
request - HttpServletRequest - 하나의 http 요청
page - PageContext - 하나의 jsp 페이지
session - HttpSession - 하나의 브라우저
application - ServletContext - 하나의 웹 어플리케이션
같은 페이지에서는 pageContext 로 setget 할 수 있는데 다른 페이지에서는 못 꺼냄
11expression language (el)
el 꺼낼 때 어떤 영역에서 꺼내는지 모름. 중복된 이름 값을 넣었을 때 어떤 순서대로 찾지? - pageContext>request>session>application
(같은 이름 다른 영역 → 가장 좁은 영역부터 찾아서 출력함)
JavaBean 자바빈은 속성(데이터), 변경 이벤트, 객체 직렬화를 위한 표준. 이 중 jsp 에서는 속성을 표현하기 위해 사용됨.
property 값에는 읽기 전용과 읽기쓰기 property 가 존재.
1. 읽기 전용 property: get 또는 is 메소드만 존재
2. 읽기/쓰기 property: get/set 또는 is/set 메소드가 존재
Java Bean Property
- get, set 메소드에 의해 결정됨
- property 이름은 get, set 메소드의 get, set 을 지우고 앞글자를 소문자로 함 (변수명 첫글자는 소문자)
java bean
기본 생성을 가지고 있어야 함
클래스의 property 는 get, set 에 의해 결정됨
property 타입이 boolean 인 경우 get 대신 is 붙일 수 있음
getter: getFieldName()
- public / 필드의 리턴타입 / get+필드이름(첫문자 대문자) / 리턴 값은 필드 값
setter: setFieldName(타입 fieldName)
- public / void / set+필드이름(첫문자 대문자) / 매개변수 타입은 필드 타입
★ expression language
작성법: $(attribute }
jsp 에 출력용으로 사용됨
역슬래시 사용 시 el 적용 안됨 (\${attribute })
예)
java코드: <%= pageContext.getAttribute("pageAttr1") %> → null 출력됨
el: ${pageAttr1 } → null 안나옴
el 은 없는 값이면 아무것도 출력되지 않음
application
application 을 이용한 set, getattribute
어플리케이션은 모든 jsp, 모든 servlet 이 공유해서 사용하는 객체
attribute명.property명
el 은 읽는 용도 get 메소드가 있으면 점을 이용하여 사용 가능
${attribute명.property명 }
자바코드를 사용하기 위해서는 bean jsp 파일을 import 하여야 함
map 의 toString 결과는 (key, value) 쌍으로 나옴
el 의 점연산자로 숫자 사용이 안됨 - 점연산자 대신 [] 연산자 사용 가능
만약 key 가 숫자라면 [] 안에 string 으로 써주면 됨
jstl 이 제공하는 태그의 종류
1. 코어 - c
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2. XML - x
3. 국제화 - fmf
4. 데이터베이스 - sql
5. 함수 - fn
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
test="${param.food eq 'apple'}" → ?food=apple
<c:if></c:if>
<c:choose> <c:when></c:when> <c:otherwise></c:otherwise> </c:choose>
<c:foreach></c:foreach> 반복
'course 2021 > JSP' 카테고리의 다른 글
JSP06 - 05attribute (0) | 2021.11.17 |
---|---|
JSP05 - 04path (0) | 2021.11.17 |
JSP04 - 03module (0) | 2021.11.17 |
JSP03 - 02request (0) | 2021.11.17 |
JSP02 - memo (0) | 2021.11.17 |