${param.name}하면 parameter의 name을 가져옴
아직은 request.getParameter의 구문을 사용하는 기업들도 꽤 됨
설정 건들지 않음
이름은 사용자 마음대로
web.xml을 프로젝트에서만 사용한다는 체크
프로젝트 안에 들어가 있는 건 해당 프로젝트에서만 사용
서버는 모든 곳에서 사용 가능
모든 파일은 index.으로 시작하게 되어있음
이름이 index가 아니라면 해당 이름으로 바꿔줘야할 상황도 있음
코드에서 저 이름으로 되어있는 것들은 무조건 먼저 실행
서버에 프로젝트가 돌아가는지 add/remove 메뉴탭에서 확인하고 서버 실행 후 (오류가 뜨면 servlet을 가지고 있는 프로젝트에서 오류가 발생한 것임.(detail을 보면 어디서 오류났는지 볼 수 있음) 그러면 그 오류난 곳을 수정하거나 오류가 많다면 서버를 지우고(server파일까지도) 다시 설정(톰캣버전 9.0 + 포트번호 새로 부여)하면 됨
포트번호 확인
링크에 localHost:본인의포트번호/프로젝트의루트명 하면 index.으로 되어있느 파일이 제일 먼저 읽혀서 먼저 뜨게 됨
그래서 첫 페이지는 index.jsp , index.html로 만드는 것으로 진행
보통 저기에 회사명이 들어감
서버 상단에 Module에 들어가면 프로젝트를 선택하고 edit를 눌러 루트명을 변경할 수 있음
파일 경로가 웹의 url에 보여지지 않게하려면 모든 jsp파일들은 폴더(여기선 views) 안에 넣어줄 것임
EL내장객체, 어느 영역까지 접근 가능한가
--index.jsp파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>* EL(Expression Language)</h1>
<p>
기존에 사용했던 표현식(출력식) <%=name %><br> <!-- < ~ >는 html태그로 만듦 -->
jsp상에서 표현하고자 하는 값을 ${ name }의 형식으로 표현하여 작성하는 것
</p>
<h4><a href="el.do">01_EL의 구문</a></h4> <!-- servlet(el.do)으로 갈거임 -->
<h4><a href="operation.do">02_EL의 연산자</a></h4>
<hr>
<!--
* JSP를 이루는 구성인자
1. 스크립트 원소 : jsp페이지에서 자바코드를 직접 기술할 수 있게 하는 기능
Ex) 스크립트릿, 표현식(출력문), ...
2. 지시어 : jsp페이지 정보에 대한 내용을 표현한다거나 또다른 페이지를 포함할 때 사용
3. 액션태그(표준액션태그, 커스텀액션태그) : xml 기술을 이용하여 기존의 jsp문법을 확장하는 기술을 제공하는 태그
>> 표준액션태그(standard Action Tag) : JSP페이지에서 바로 사용 가눙
모든 태그명 앞에 jsp: 접두어 붙임
>> 커스텀액션태그(Custom Action Tag) : JSP페이지에서 바로 사용 불가능(별도의 라이브러리 연동 필요)
모든 태그명 앞에 jsp: 외의 다른 접두어 붙음(종류는 다양)
가장 대표적인 유용한 라이브러리 == JSTL
-->
<h1>JSP Action Tag</h1>
<p>XML 기술을 이용하여 기존의 jsp문법을 확장하는 기술을 제공하는 태그</p>
<h3>* 커스텀 액션 태그</h3>
<a href="views/02_customAction/jstl.jsp">JSTL</a>
</body>
</html>
--Person.java파일
package com.kh.model.vo;
public class Person {
private String name;
private int age;
private String gender;
public Person() { } //매개변수 없는 생성자
public Person(String name, int age, String gender) { //매개변수 있는 생성자
super();
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() { //객체 생성 후 객체 이름 호출하면 얘가 호출됨
return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
}
-- 01.el.jsp 파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.kh.model.vo.Person" %> <!-- bean 객체 사용하기 위해 import -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>1. 기존 방식대로 스크립트릿과 표현식을 이용하여 각 scope에 담겨있는 값을 뽑아 화면에 출력</h3>
<%--
<%
//request Scope 받아오기
String classRoom = (String)request.getAttribute("classRoom"); //object타입이라 형변환
//B강의장이라는 값을 classRoom이라는 변수에 담음
Person student = (Person)request.getAttribute("student");
//student는 객체(new Person)로 담았기 때문에 객체(Person)로 담아야 함
// session Scope 받아오기
String academy = (String)session.getAttribute("academy"); //object타입이라 형변환
Person teacher = (Person)session.getAttribute("teacher");
//teacher는 객체(new Person)로 담았기 때문에 객체(Person)로 담아야 함
%>
학원명 : <%=academy %></p>
강의장 : <%=classRoom %></p>
강사 : <%=teacher %>: toString으로 해놨기 때문에 이렇게 변수명만 넣어도 주소가 아닌 값이 출력
<%=teacher.getName() %>,<%=teacher.getAge() %>,<%=teacher.getGender() %><p/>
<!-- toString말고 하나하나 다 호출해오기 -->
수강생 정보
<ul>
<li>이름 : <%=student.getName() %></li>
<!-- student에는 학생 정보가 모두 담겨있는데 이름만 가져오고 싶기 때문에 .getName -->
<!-- .get을 해주는 이유는 원래 name, age, gender는 private인데 get메서드 처리를 해줬기 때문 -->
<li>나이 : <%=student.getAge() %></li>
<li>성별 : <%=student.getGender() %></li>
</ul>
--%>
<h3>2. EL을 이용하여 쉽게 해당 Scope에 저장된 값 출력 </h3>
<p>
EL을 이용하여 getXXX를 통해 값을 빼올 필요없이 EL구문내에 key값만 제시하면 바로 접근 가능<br>
기본적으로 EL은 jsp내장객체를 구분하지 않고 자동으로 모든 내장객체에 key값을 검색해서 존재하면 값을 가져옴
</p>
학원명 : ${ academy } <br>
<!-- page scope -> request scope -> session scope (가장 작은 공개범위부터) 검색하여 있으면 가져옴.
이렇게만 넣어줘도 끝임! -->
강의장 : ${ classRoom }<p/>
강사 : ${ teacher.name }, ${teacher.age },${teacher.gender }</p>
<!-- 변수이름을 써주면 알아서 get.변수이름을 호출하여 값을 가져옴 -->
<h3>3. EL사용시 내장 객체들의 저장된 key값이 동일한 경우</h3>
scope값: ${scope }</p> <!-- 제일 작은 범위인 request부터 보기 때문에 "request" 출력됨 -->
<!--
EL은 공유범위가 제일 작은 scope에서부터 해당 key값 검색
page -> request -> session -> application 순으로 검색
만일, 모든 영역에서 못 찾을 경우 => 아무것도 출력 안 됨(오류 아님)
-->
test값: ${test }<p/> <!-- 없는 key값 넣으면 그냥 공백처리됨(기존 스크립트릿 방식으론 null값 들어옴) -->
<h3>4. 직접 scope를 지정하여 접근하기</h3>
<%pageContext.setAttribute("scope", "page"); %>
pageScope에 담긴 값 : ${scope } 또는 ${pageScope.scope }</p>
requestScope에 담긴 값 : ${requestScope.scope }</p>
sessionScope에 담긴 값 : ${sessionScope.scope }</p>
applicationScope에 담긴 값 : ${applicationScope.scope }
<!-- page에 담긴 scope값 호출하려면 직접 지정 -->
잘못된 접근(없는 key값) : ${sessionScope.classRoom }
</body>
</html>
--elServlet.java파일
package com.kh.controller;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.kh.model.vo.Person;
@WebServlet("/el.do")
public class ELServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 데이터들을 담을 수 있는 jsp내장 객체 종류
* 1. ServletContext(application Scope)
* 한 애플리케이션 당 단 하나만 존재하는 객체
* 이 영역에 데이터를 담으면 애플리케이션 전역에서 사용가능
* 공유범위가 가장 큼(jsp/servlet/java에서 사용가능)
*
* 2. HttpSession(session Scope)
* 한 브라우저 당 하나 존재하는 객체
* 이 영역에 데이터를 담으면 jsp/servlet단에서 사용가능(java에서 사용불가)
* 공유범위가 2번째로 크다
*
* 3. HttpServletRequest(request Scope)
* 요청 때마다 매번 생성되는 객체
* 이 영역에 데이터를 담으면 해당 request객체를 포워딩 받는 응답jsp에서만 사용가능
* (request를 받은 곳에서 끝. 그 다음 파일로 넘어가지 않아 또 새롭게 만들어줘야함)
* 공유범위가 응답jsp(혹은 응답servlet)에서 한 번만 받음
*
* 4. PageContext(page Scope)
* jsp마다 존재하는 객체
* 공유범위가 가장 작음(해당 그 페이지)
*
* 위의 4개의 객체들에
* 데이터를 담을 때: .setAttribute("key",담을 데이터(문자,파일,ArrayList,객체,숫자 등))
* 데이터를 꺼낼 때: .getAttribute("key") 반환값은 담겨있는 데이터(value)
* 데이터를 삭제할 때: .removeAttribute("key")
*/
// 1. request Scope에 담기
request.setAttribute("classRoom", "B강의장");
request.setAttribute("student", new Person("홍길동",20,"남성")); //Bean에서 만든 객체 생성 + 생성자 호출하여 담기
// 2. session Scope에 담기
HttpSession session = request.getSession(); //세션 얻어오기(세션은 객체 생성이 아닌 request로 얻어옴)
session.setAttribute("academy", "kh정보교육원");
session.setAttribute("teacher", new Person("김지원",25,"여성"));
//스코프가 같으면 같은 key이름일 경우 덮어쓰기 됨. 스코프가 다르면 key이름이 같아도 따로 담김
//request Scope와 session Scope에 동일한 key값으로 데이터 담기
request.setAttribute("scope","request");
session.setAttribute("scope", "session");
// 3. application Scope에 담기
ServletContext application = request.getServletContext();
application.setAttribute("scope", "application");
//response.sendRedirect("view/1_EL/01.el.jsp"); 통해 내가 원하는 위치로 이동함. 모든 걸 종료하고 결과값을 되돌려줌. 그래서 request에 담아서 못 보냄
//그래서 응답페이지를 지정하여 포워딩 되도록 설정함
request.getRequestDispatcher("views/1_EL/01.el.jsp").forward(request, response);
//request로 들어온 것을 어디로 보낼지 지정(request.getRequestDispatcher("view/1_EL/01.el.jsp") +
//.forward(request, response);: 기존에 넘어온 거(HttpServletRequest request), 내가 담은 거(HttpServletResponse response) 모두 보내줌
}
}
request에 담은 건 저 세 개
세 개 중에 골라서 값 넣어줌
session에 담은 건 저 세 개
제일 작은 범위인 request부터 보기 때문에 "request" 출력됨
이런식으로 scope가 할당되면 page값이 출력됨
프로그래밍 언어를 모르는 사용자들을 위해 일반 영어로 명시해주기도 함
--02.elOperation.jsp 파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>1. 산술연산</h3>
기존방식 : <%=(int)request.getAttribute("big") + (int)request.getAttribute("small") %>
<!-- Integer.paseint: Integer(클래스의 형태)로 가져와서 String(객체형) 타입을 int형으로 -->
<!-- int(일반형): object타입이라 일반형으로 가져옴 -->
<p/>
10 + 3 = ${big + small }<p/>
10 - 3 = ${big - small }<p/>
10 * 3 = ${big * small }<p/>
10 / 3 = ${big / small } 또는 ${big div small }<p/>
10 % 3 = ${big % small } 또는 ${big mod small }<p/>
<h3>2. 대소 비교 연산 </h3>
10 > 3 = ${big > small } 또는 ${big gt small }<p/>
10 < 3 = ${big < small } 또는 ${big lt small }<p/>
10 < 3 = ${big >= small } 또는 ${big ge small }<p/>
10 < 3 = ${big <= small } 또는 ${big le small }<p/>
<h3>3. 동등 비교 연산</h3>
sOne과 sTwo가 일치합니까? ${sOne == sTwo } 또는 ${sOne eq sTwo }<p/>
sOne과 sTwo가 일치하지 않습니까? ${sOne != sTwo } 또는 ${sOne ne sTwo }<p/>
big에 담긴 값이 10과 일치합니까? ${big == 10 } 또는 ${big eq 10 }<p/>
sOne에 담긴 값이 "안녕"과 일치합니까? ${sOne == "안녕" } 또는 ${sOne eq '안녕' }<p/>
<!-- el안에서 문자열 리터럴 제시시 홑따옴표든 쌍따옴표든 가리지 않는다 -->
<h3>4. 객체가 null인지 또는 리스트가 비어있는지 비교</h3>
pOne이 null입니까? ${pOne == null } 또는 ${empty pOne }<p/>
pTwo이 null입니까? ${pOne == null } 또는 ${empty pTwo }<p/>
pOne이 null이 아닙니까? ${pOne != null } 또는 ${not empty pOne }<p/>
aOne이 비어있습니까? ${empty aOne }, ${aOne == null } <p/>
aTwo가 비어있습니까? ${empty aTwo }<p/>
<h3>5. 논리연산자</h3>
and 연산자 : ${true && false } 또는 ${true and false }<p/>
or 연산자 : ${true || false } 또는 ${true or false }<p/>
big이 small보다 크고 aOne이 텅 비어있습니까?
${big gt small and empty aOne} <!-- true반환 -->
</body>
</html>
--jstl.jsp 파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>JSTL이란?</h1>
<p>
JSP Standard Tag Library의 약자로 JSP에서 사용되는 커스텀 액션태그로<br>
공동적으로 자주 사용되는 코드들을 집합으로 만들어 보다 쉽게 사용할 수 있도록<br>
태그화하여 표준으로 제공하는 라이브러리
</p>
<h3>* 라이브러리 다운로드</h3>
1) Apatch Tomcat 사이트 접속<br>
2) 메뉴바 Taglibs 메뉴 접속<br>
3) 4개의 라이브러리 모두 다운로드<br>
4) WEB-INF/lib/ 에 추가<p/>
<h3>* JSTL 선언 방법</h3>
<p>
JSTL을 사용하고자 하는 해당 jsp페이지 상단에 <br>
<%@ tagelib prefix="접두어" uri="라이브러리 파일상의 uri주소" %>
</p>
<h4>1. JSTL Core Library</h4>
<p>변수와 조건문, 반복문 등의 로직과 관련된 문법을 제공</p>
<a href="01.core.jsp">core library</a>
<h4>3. JSTL Core Library</h4>
<p>EL 안에서 사용할 수 있는 메소드 제공</p>
<a href="03.fn.jsp">function library</a>
</body>
</html>
--01.core.jsp 파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*, com.kh.model.vo.Person" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!--^ 반드시 써야합니다 ^ -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>JSTL Core Library</h1>
<h3>1. 변수(속성==attribute)</h3>
<pre>
* 변수 선언과 동시에 초기화(c:set var="" value="" [scope=""])
- 변수 선언하고 초기값을 대입해주는 기능을 제공
- 해당 변수들을 어떤 scope에 담아둘건지 지정 가능함(생략시 pageScope에 담김)
=> 해당 scope에 setAttribute를 통해 key-value형태로 데이터를 담아놓는 것이라고 생각하면 됨
=> c:set으로 선언된 변수는 EL로 접근해서 사용 가능함(스크립팅 원소로는 접근 불가)
- 변수 타입을 별도로 지정 안함
- 초기값을 반드시 지정해야됨
</pre>
<c:set var="num1" value="10" />
<c:set var="num2" value="20" scope="request" />
<!-- request값도 사용가능함 -->
num1 변수값 : ${num1}<br>
num2 변수값 : ${num2}<br>
<%--
<%
int num1 = 10;
int num2 = 20;
%> 원래 이거였던 거를 위처럼 c:set으로 할 수 있음
<%--num1 변수값 : <%=num1 %><br> 스크립팅 원소로는 접근 불가 --%>
<c:set var="result" value="${num1 +num2}" scope="session"/>
<%-- 변수들이 문자열이라 ${}해야 인식됨. num2이 scope값이 있어서 여기도 그 scope와 같거나 큰 scope를 할당 --%>
10 + 20의 result : ${result }</p>
pageScope.num1 : ${pageScope.num1 }<br/>
requestScope.num2 :${requestScope.num2 }<br/>
sessionScope.result : ${sessionScope.result }<br/>
requestScope.result : ${requestScope.result }<p/>
<!-- value속성 대신 시작태그와 종료태그 사이에 초기값 지정 가능 -->
<c:set var="result" scope="request">9999</c:set>
requestScope.result : ${requestScope.result } <!-- 여기선 9999출력됨 -->
<hr>
<pre>
* 변수 삭제(c:remove var="제거하고자하는 변수명" [scope=""])
- 해당 scope에서 변수를 찾아 제거하는 태그
- scope 생략하면 모든 scope에서 해당 변수 모두 다 찾아서 제거함
=> 해당 scope에 .removeAttribute를 통해 제거하는 거라고 생각하면 됨
</pre>
삭제 전 result : ${result }<p/>
<%--
1) 특정 scope지정해서 삭제<br>
<c:remove var="result" scope="request" />
request에서 삭제 후 result : ${result }<p/>
--%>
2) 모든 scope에서 삭제<p/>
<c:remove var="result"/>
모두 삭제 후 result : ${result }<p/>
<pre>
* 변수(데이터) 출력 (c:out value="출력하고자하는값" [default="기본값"] [escapeXml])<br>
데이터를 출력하고자할 때 사용하는 태그
</pre>
<c:out value="${num1 }"/><br> <!-- 원래 스크립트릿으로 끊어서 가져와야하지만 이렇게만 해도 가능 -->
<c:out value="${result }" default="없음" /> <!-- 값이 없을 경우를 대비해 default값을 넣어줌 -->
<c:set var="outTest" value="<b>출력테스트</b>" />
<c:out value="${outTest }" /> <!-- <b>태그가 String 자체로 출력됨 -->
<c:out value="${outTest }" escapeXml="false" />
</body>
</html>
value 초기값 설정 두 가지 종류로 할 수 있음