코딩하는토끼 2021. 11. 10. 13:10

> 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> 반복