190715_Day66 JSP 기본객체, 액션, 표현 언어 (EL), 커스텀 태그, JSTL (표준태그 라이브러리)
<복습>
Java Server Page(서버스크립트)
- 서버스크립트 : 서버에서 실행 ( JVM 위에서 실행 )
확장자는 파일명.jsp
HTML + Java코드
- HTML : js, css
- Java : 기본태그, 기본객체
<html> <head> <style> 엘리먼트에 대한 CSS정의 </style> <script> 자바스크립트 문법( 태그와 스타일에 대한 조작 ) </script> </head> <!-- hello.jsp --> <body> <%! 선언적인 요소 ( 자바클래스의 멤버 요소 ) %> <% service()메소드 내에 들어갈 코드 ( 메소드 호출, 조건문, 반복문 ) %> <%= 표현식, 출력식 out.print()메소드로 변환 %> <%-- JSP주석 (브라우저에 전달 X) --%> <!-- htrml주석(브라우저에 전달 O), HTML주석 안의 JSP태그들은 실행됨!211111111111111111 -->
<%! int su; %>
<% su=200;
A obj = new A(); %>
<%= "안녕" %>
<h3>나 헤딩 타이틀</h3>
<% for(int i=0; i<3; i++) { %>
<font color=red>안녕<%=i%></font><br>
<% } %>
</body>
</html>
```
hello.jsp에 대한 브라우저 (URL)요청
1. hello_jsp.java ( 서블릿 )페이지 유무
2. ```java
public class hello_jsp extends HttpServlet
{
public void init(){}
public void service(HttpServletRequest request, HttpServletResponse response)
{
//브라우저 서비스 -> MVC에서는 Controller
PageContext pageContext = new PageContext();
HttpSession session = new HttpSession();
ServletContext application = new ServletContext();
ServletConfig config = new ServletConfig();
JspWriter out = new JspWriter();
Object page = this;
===> JSP기본객체
------------------작성된 JSP---------------------------
out.print("<html>");
out.print("<head>");
out.print("<style>");
out.print("엘리먼트에 대한 CSS정의");
out.print("</style>");
out.print("<script>");
out.print("자바스크립트 문법 (태그와 스타일에 대한 조작)");
out.print("</script>");
out.print("</head>");
out.print("<body> ");
out.print("<!-- HTML주석 (브라우저에 전달O), HTML주석안의 JSP태그들은 실행됨!! -->");
su=200;
A obj = new A();
out.print("안녕");
out.print("<h3>나 헤딩 타이틀</h3>");
for(int i=0; i<3; i++) {
out.print("<font color=red>안녕");
out.print(i);
out.print("</font><br>");
}
out.print("</body>");
out.print("</html>");
}//service
public void destroy(){}
}
<body>
<%
int sum=50;
String name="gildong";
%>
<script>
var str="홍길동";
document.write(str); // 출력됨
document.write(sum); //출력 안됨, sum이 스크립트내에 없네?, null혹은 undifind
document.write(<%= sum %>); //출력 됨
document.write(<%= name %>); //출력 안됨, document.write(gildong); 이 되어버림
document.write('<%= name %>'); // 출력 됨
var su=<%=sum%>; // 잘됨~ , 반대의 경우(자바에 뿌려주는)에는 ajax ? 써야 한다.
document.write('이름='+ <%=name%>); // 안됨, 위에서와 같은 이유. 문자열 + 변수가 된다., '이름='+ ' + <%=name%> + '이렇게 감싸버리면 가능하지만, 그렇게 안하고 '이름 = <%=name%>' 으로 처리한다!
</script>
<%
out.print(str); //안됨. %가 먼저 실행되는데 여기서는 위의 홍길동은 없는 상태!
%>
</body>
```
※JSP기본객체(내장객체)
종류)
request(javax.servlet.http.HttpServletRequest)
- HTML폼요소의 선택값 등 사용자 입력 정보를 읽어 올 때 사용.
response(java.servlet.http.HttpServletResponse)
- 사용자 요청에 대한 응답을 처리하기 위해 사용.
pageContext(javax.servlet.jsp.PageContext) - 페이지 개념, 영역객체
- 현재 JSP실행에 대한 context정보를 참조하기 위해 사용.
- 서블릿 클래스에서는 사용하지 못함.
session(javax.servlet.http.HttpSession)
(세션 == 접속)
---> 브라우저를 통해 URL요청을 했을때 서버에서는 각브라우저를 식별할수 있는 번호를 부여!!서버측 메모리에 기억하고 있다가 브라우저가 또다른 (URL)요청을 할 때 같은 Client인지 비교.
- 클라이언트에 대한 세션정보를 처리하기 위해 사용.
- 비연결형 프로토콜 HTTP
(한 페이지가 출력된 다음에 서버와 클라이언트 연결은 끊어짐.)에 대해
마치 계속 연결되어있는 것처럼 해주는 메커니즘. - 쿠키는 사용자PC에 세션은 서버에 사용자와 관련된 정보를 보관.
application(javax.servlet.ServletContext)
ServletContext를 기억하기
웹서버의 애플리케이션 처리와 관련된 정보를 참조하기 위해 사용.
개발자를 위한 서버정보)
getServerInfo()
JSP/서블릿 컨테이너의 이름과 버전을 리턴
getMajorVersion()
컨테이너가 지원하는 서블릿 API의 Major버전정보 리턴
getMinorVersion()
컨테이너가 지원하는 서블릿 API의 Minor버전정보 리턴
서버자원정보)
getMimeType(filename)
지정된 파일에 대한 MIME Type을 리턴
getResource(path)
path에 지정된 자원을 URL객체로 리턴
getResourceAsStream(path)
path에 지정된 자원을 InputStream객체로 리턴
getRealPath(path)
path에 지정된 자원의 파일시스템의 실제 경로 리턴
※영역 객체 종류
pageContext
pageContext.getRequest();
request
request.getSession();
session
session.getServletContext();
application
ServletContext application = request.getSession().getServletContext();
getContext(path)
path에 지정된 자원의 컨텍스트 정보를 리턴
getRequestDispatcher(path)
path에 지정된 자원을 위한 request dispatcher를 생성
로그관련정보)
log(message)
문자열 message의 내용을 로그 파일에 기록.
log(message, exception)
예외상황에 대한 정보를 포함하여 로그 파일에 기록.
out(javax.servlet.jsp.JspWriter)
- 사용자에게 전달하기 위한 output스트림을 처리.
- 브라우저 출력객체
주요메소드)
getBufferSize()- 출력버퍼의 크기를 byte로 알려준다.
getRemaining() - 남아있는 버퍼의 크기 중 사용 가능한 비율을 알려준다.
clearBuffer() - 버퍼에 있는 컨텐츠를 모두 지운다.
flush() - 버퍼를 비우고 output stream도 비운다.
close() - output stream을 닫고 버퍼를 비운다.
println(content) - content내용을 newline과 함께 출력
print(content) - content내용을 출력
config(javax.servlet.ServletConfig)
- 현재 JSP에 대한 초기화 환경을 처리하기 위해 사용.
page(java.lang.Object)
- 현재 JSP페이지에 대한 클래스정보.
exception(java.lang.Throwable)
- 예외 처리를 위해 사용.
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>application객체 테스트</title>
</head>
<%-- application_test.jsp --%>
<body>
<h3>application(ServeltContext) 객체 테스트</h3>
<hr>
1. 서블릿 컨테이너 이름 : <%= application.getServerInfo() %><br>
2. 서블릿 API버전: <%= application.getMajorVersion() %>.<%=application.getMinorVersion() %>
<br>
3. 현재 Context(= 현재 웹어플리케이션, 제품, TomTest)의 실제경로(서버의 디스크경로):
<%= application.getRealPath("") %><br>
<%
//application.log("기록할 메시지") --> 필요한 정보 기록
//문제 ) 어떤 사용자 (ip)가 어떤 요청을 했는지(get,post) 파일로 작성해 보세요.
String addr = request.getRemoteAddr(); // 접속 클라이언트의 ip정보
String method = request.getMethod(); // HTTP 요청방식("get", "post")
String protocol = request.getProtocol(); // Http 요청 버전 : 1.0 1.1
String uri = request.getRequestURI();
//서버에서 모니터링한 결과를 기록!!
String info="▶접속한 클라이언트 정보◀ protocol:"+ protocol+
", 요청방식:"+ method +", 접속 IP:"+ addr+", 경로:"+uri+
"("+ new Date() +")";
System.out.println(info); // 서버콘솔 출력
out.print(info); // 브라우저 출력
application.log(info); // 파일 출력 ( 기록 )
%>
</body>
</html>
※JSP액션(Action)
- JSP페이지간 흐름 제어
- 자바애플릿 지원 - 보안때문에 지원 끝남.
- 자바빈즈 컴포넌트와 JSP 상호 작용 지원
액션종류)
include : 다른 페이지를 현재 페이지에 포함시킨다.
<jsp:include page = "포함될 페이지 경로"/>
jsp: 접두사 prefix ===>포함될 페이지를 먼저 실행하고, 그 결과물을 현재페이지에 포함
<%@include file = "포함될 페이지 경로"%>
===> 현재 페이지에 먼저 포함, 전체 컴파일!
★주의)
< jsp:include > 의 태그명은 ? include
그럼 jsp: 는 뭔데? 접두사 prefix 라고 한다.
확장자 jsp문서내에 prefix붙는 태그는 전부 자바요소 를 태그로 표현
무슨말이야?? html 의 탈을 쓴 java?
JVM에서 실행이 되어지고 시작과 끝이 명확해야 한다.
<jsp:include > => 시작태그만 명시하면 에러!
<jsp:include ></ jsp:include > (O)
<jsp:include /> (O)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>include_action 테스트</title> </head> <!-- include_action --> <body> <h3>include_action.jsp</h3> <hr color="red"> <% int su=300; %> <%-- <jsp:include page="application_test.jsp"/> --%> <%@include file="application_test.jsp" %> </body> </html>
forward : 현재페이지의 제어를 다른 페이지로 전달( 페이지 이동 )
형식)
<jsp:forward page="이동할경로"/>
<%@ 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> <%-- forward_action.jsp --%> <body> <h3>forward_action.jsp</h3> <jsp:forward page="application_test.jsp"/> </body> </html>
useBean : 클래스 객체를 생성하고 사용할 범위를 설정할 때 지정.
형식)
<jsp:useBean class="pack(package명).A(클래스)" id='obj'/> ===> 의미 : A obj = new A(); <% A obj = new A(); %> <!-- 에러발생 중복 생성 --> <jsp:useBean class = "pack.A" id = 'obj' scope="page"/> <jsp:useBean class = "pack.A" id = 'obj' scope="request"/> <% A obj; if(request영역에 obj라는 A클래스 객체가 존재하지 않는다면) { obj = new A(); }else{ obj = request.getAttribute("obj"); } %> <jsp:useBean class = "pack.A" id = 'obj' scope="session"/> <jsp:useBean class = "pack.A" id = 'obj' scope="application"/> <영역 scope속성> scope='page' (기본값) : 현 페이지에서만 객체 사용 scope='request' : request호출 관계에 있는 페이지간의 객체 공유 (forward를 통한 페이지 이동을 했을 경우) scope='session' : 'sesstion' 동일브라우저(같은 세션간)내에 표시되는 페이지간의 객체 공유 scope='application' 동일 서버내 ( 동일 Context-TomTest )에서 서비스 되어지는 모든 페이지간의 객체 공유
setProperty : useBean의 세터메소드 호출
형식)
<jsp:setProperty name = "useBean에서 사용한 id" property = "속성명" value = "데이터"/>
getProperty :useBean의 게터메소드
형식)
<jsp:getProperty name="useBean에서 사용한 id" property="속성명" />
예)
<jsp:useBean class = "test.Person" id="p"/> -->> test.Person p = new test.Person(); <jsp:setProperty name ="p" property = "age" value="13"/> -->> p.setAge(Interger.parseInt("13")); <jsp:getProperty name = "p" property = "age"/> -->> out.print(p.getAge());
<!-- Person.java 만들고 나서-->
<%@page import="t0715.Person"%>
<%@ 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>
<%-- useBean_action.jsp
<useBean>태그는 특정 클래스의 객체 생성을 하는 역할.
--%>
<jsp:useBean class="t0715.Person" id="p" scope="page"/>
<%
//Person p = new Person(); ==> 에러발생!! 중복된 지역변수 p를 사용하였음!!
//즉, <jsp:useBean>의 id속성은 변수명으로 사용됨
%>
<body>
<h3>useBean_action.jsp</h3>
<hr>
<%
p.setName("나길동");
%>
<jsp:setProperty property="age" name="p" value="13"/>
<%-- p.setAge(13); --%>
<jsp:setProperty property="job" name="p" value="학생"/>
<%= p %>
<br>
이름1: <jsp:getProperty property="name" name="p"/><br>
이름2: <%= p.getName() %><br>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:useBean class="t0715.Person" id="p" scope="session"/> <!-- 여기서 scope 바뀔때마다 전달 유무가 바뀜. -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>useBean액션 영역 테스트</title>
</head>
<!-- useBean_action_scope.jsp -->
<body>
<h3>useBean 액션 영역 테스트</h3>
<%
p.setName("나길동");
//move.jsp이동
request.getRequestDispatcher("move.jsp")
.forward(request, response);
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:useBean class="t0715.Person" id="p" scope="session"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%-- move.jsp --%>
<body>
<h3>move.jsp</h3>
<hr>
사람정보 : <%= p %>
</body>
</html>
<%@ 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>
<!-- useBean_action2.jsp -->
<body>
<h3>사람정보등록</h3>
<hr>
<form action="insertProcess.jsp" method="post">
이름 : <input type="text" name="name"><br>
나이 : <input type="text" name="age"><br>
직업 : <input type="text" name="job"><br>
<input type="submit" value="등록">
</form>
</body>
</html>
<%@page import="t0715.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:useBean class = "t0715.Person" id="vo"/> <!-- 추가 -->
<% request.setCharacterEncoding("UTF-8"); %>
<jsp:setProperty property="*" name="vo"/>
<%--
<jsp:setProperty property = "age" name="vo"/>
=> vo.setAge(Integer.parseInt(request.getparameter("age")));
--%> <!-- 추가 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>입력처리</title>
</head>
<%-- insertProcess.jsp --%>
<body>
<h3>DB입력처리</h3>
<hr>
<%
/*
여지것 이렇게 해왔었지만! 이젠 달라
String name = request.getParameter("name");
String age = request.getParameter("age");
String job = request.getParameter("job");
Person vo = new Person();
vo.setName(name);
vo.setAge(Integer.parseInt(age));
vo.setJob(job);
*/
//PersonDao dao = new PersonDao();
//dao.insert(vo);
out.print(vo);
%>
</body>
</html>
★ < < 표현 언어 > >
Expression Language : EL
처음 JSTL ( JSP Standard Tag Library)에서 소개
현재 JSP 스펙에 포함되어 사용
자바빈즈 속성 값을 보다 쉽고 제약을 덜 받은 방법으로 사용하기 위해 나온 것
JSP파일이 useBean액션태그나 표현식등으로 복잡해 지는 것을 막고 MVC에서 일종의 템플릿 코드처럼 사용할 수 있도록 해줌.
문법)
- 표현언어는 '$'로 시작 - 모든 내용을 '{표현식}'과 같이 구성 --> ${ } ※참고 : <script> $ ( )</script> ----- ------ Java { 중괄호 } EL JavaScript ( 소괄호 ) jQuery - 표현식에는 기본적으로 변수명 혹은 ' 키명.속성명' 구조를 갖는다. 영역객체.setAttribute("키값", vo) request.setAttribute("p", vo) ${p.name} - 표현식에 부가적으로 숫자, 문자열, boolean, null과 같은 상수값도 가능 - 표현식에는 기본적인 연상 가능 <% int su - 10; %> <script> var i=<%= su %>; </script> <input type = text value =<%= su%> name = age> <% <%=su%> s {} %> 불가능, 둘다 html 내에 써야 한다.
속성접근)
${person.name} 또는 ${person["name"]} : out.print(person.getName()) ${row[0]} : row라는 이름의 컬렉션의 첫번째 아이템 ---> 데이터를 영역에 저장 request.setAttribute("p" , new Person("길동")); ---> 데이터를 영역에서 조회 Person p = (Person)request.getAttribute("p"); out.print(p.getName()); ---> 위의 두 줄을 EL로 표현 : ${p.name} ${sessionScope.p.name} request와 session영역에 공통적으로 'p'키값이 정의
내장객체)
pageScope, requestScope, sessionScope, applicationScope, param, paramValues, header, headerValues, initParam, cookie, pageContext <% out.print(데이터); ----> JSP페이지내에서는 out에 대한 자료형 선언을 하지 않았다. %> ${ param.username } -----> String name = request.getParameter("username"); out.print(name);
<%@page import="t0715.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL테스트</title>
</head>
<%--el_test.jsp --%>
<body>
<h3>EL (표현언어 = 출력언어)테스트</h3>
<%
//영역에 데이터 저장 - > MVC에서는 주로 Contoller가 담당!
//영역객체.setAttribute(String key, Object value);
pageContext.setAttribute("k1","기묘진");
request.setAttribute("k2","이진뿐"); //자주사용
session.setAttribute("k3", "이비키"); //자주사용
application.setAttribute("k4", "대한민국");
request.setAttribute("k5", new Person("김유신", 14, "화랑"));
session.setAttribute("k5", "송혜교");
application.setAttribute("k5", "박보검");
int su=33;
%>
<h3>ExpresstionLanguage(표현언어EL = 출력언어) 테스트 </h3>
<hr>
k1: <%= pageContext.getAttribute("k1") %><br>
k2: <%= request.getAttribute("k2") %><br>
k3: <%= session.getAttribute("k3") %><br>
k4: <%= application.getAttribute("k4") %><br>
k5(request): <%= request.getAttribute("k5") %><br>
k5(session): <%= session.getAttribute("k5") %><br>
k5(application):<%= application.getAttribute("k5") %><br>
su: <%= su %><br>>
존재하지 않는 k6? : <%= request.getAttribute("k6") %>
<hr color="red">
K1 : ${k1 }<br>
K2 : ${k2 }<br>
K3 : ${k3 }<br>
K4 : ${k4 }<br>
K5 : ${k5 }<font color=red>영역구분없이 키값만 출력하면 page, request, session, application 순으로 가장 가까운 데이터 출력</font><br>
K5(request) : ${request.k5 }<br>
K5(session) : ${session.k5 }<br>
K5(application) : ${applicationScope.k5 }<br>
su(영역객체X, 지역변수) : ${su }<font color = blue>지역변수는 사용불가<br>
su를 키값으로 인식</font><br>
K6(정의되지 않은 키값) : ${k6 }<font color=" blue">없는 키값은 빈문자열 출력</font> <br>
<hr color="orage">
<h3>입력폼</h3>
<form action="print.jsp" method="post">
이름: <input type="text" name="username"><br>
나이: <input type="text" name="userage"><br>
<button type="submit">전송</button>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파라미터 데이터 출력</title>
</head>
<%-- print.jsp
<form action='print.jsp'>
<input name='username'> ==> 파라미터
</form>
print.jsp?age=13 ==> 파라미터
--%>
<body>
<h3>파라미터 데이터 출력</h3>
이름 : <%= request.getParameter("username") %><br>
나이 : <%= request.getParameter("userage") %><br>
아무거나(존재하지 않는 파라미터): <%= request.getParameter("any")%><br>
<hr color="blue">
이름 : ${param.username }<br>
나이 : ${param.userage}<br>
아무거나 : [[${param.any }]]
<%--
${a } ----> 영역에서 a키를 찾아서 키에 저장된 데이터를 바로 출력
${a.b } ----> a키에 저장된 값은 반드시 클래스여야만 함!!
만약 A클래스가 저장되어 있다면 A클래스내의 getB()메소드의 리턴값을 얻어서 출력
${param.a} ----> 폼태그내의 name속성에 저장된 값을 기준으로 데이터 얻고 화면에 출력
--%>
</body>
</html>
<커스텀 태그> Custom(사용자 정의) Tag
JSP페이지에서 반복적인 프로그램 로직을 캡슐화하기 위해 고안.
기본적으로 제공되는 태그 이외에 사용자가 확장한 태그라는 의미에서
붙여진 이름.커스텀태그 사용이유)
비즈니스 로직으로부터 화면 표현을 분리
비즈니스 로직의 캡슐화
보다 손쉬운 웹 페이지 제작
종류)
JSP 1.2커스텀태그
JSP 2.0커스텀태그
<JSP 1.2커스텀태그 요소>
- 태그 핸들러 클래스(Tag Handler Class) .class
- 자바 클래스 파일로 태그의 동작을 구현해놓은 파일.
- 태그 라이브러리 기술자(Tag Library Descriptor) .tld (XML문법)
- 태그이름등 태그 정보 및 태그 핸들러 클래스와의 관계를 기술.
- TagSupport
- doStartTag() : 시작태그를 만날 때 호출
- doEndTag() : 끝태그를 만날 때 호출
- doAfterBody() : 태그바디가 있을 때 처리를 위해 자동호출
예제) WEB-INF/classes/MyTagHandler.class
WEB-INF/tld/myTag.tld
<< TLD스키마 >>
- WEB-INF 밑에 tld 만들고 xml file 생성
- MyTag.tld 로 이름 짓고 아래 부분 넣기
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
package t0715;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class MyTagHandler extends TagSupport{
//태그를 만났을때 실행할 (로직적인)코드를 기술
@Override
public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut(); //브라우저 출력객체
try {
for(int i=0; i<10; i++) {
if(i%2==0)
out.print("<font color=blue>안녕,커스텀태그~!!</font>");
else
out.print("<font color=red>안녕,커스텀태그~!!</font>");
out.print("<br>");
}
} catch (IOException e) {
e.printStackTrace();
}
return SKIP_BODY;//엘리먼트의 본문이 없는 경우 ----> 내용없음 ---> 빈태그
}//doStartTag
}
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<!-- WEB-INF/tld/myTag.tld -->
<description>커스텀태그테스트</description>
<tlib-version>1.2</tlib-version>
<short-name>MsgTag</short-name>
<!-- 태그정의(태그이름, 매핑할 클래스 -->
<tag>
<name>gildong</name>
<tag-class>t0715.MyTagHandler</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<name>lime</name>
<tag-class>t0715.MyTagHandler</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
이제 테스트
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%--JSP 1.2 방식의 커스텀태그 --%>
<%@taglib uri="/WEB-INF/tld/myTag.tld" prefix="my" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>커스텀태그</title>
</head>
<!-- customTag_test.jsp -->
<body>
<h3>커스텀태그 테스트</h3>
<hr>
<my:gildong/>
<hr>
<my:lime/>
</body>
</html>
<JSP 2.0커스텀태그 요소>
- 태그파일 .tag
- 몇가지 제약사항을 제외하고 대부분 JSP파일과 동일한 구성을 갖음.
- WEB-INF/tags 폴더에 저장.
예) WEB-INF/tags/juwon.tag ----------> 파일명 == 태그명, 태그에 매핑할 로직 정의
juwon.tag
<%@tag import="t0715.Product"%>
<%@ tag language="java" pageEncoding="UTF-8"%>
<%@attribute name ="border" %>
<%@attribute name ="color" %>
<!--
WEB-INF/tags/juwon.tag(JSP문법과 흡사)
저장파일명 == 태그명
==> HTML + JAVA
-->
<h3><jsp:doBody/></h3>
<%
Product p = new Product();
String []list = p.getProductList();
%>
<table border="${border }" bgcolor="${color }" cellpadding="5">
<%
for(int i=0; i<list.length; i++){
out.print("<tr><td>"+list[i]+"</td></tr>");
}
%>
</table>
Product.java
package t0715;
public class Product
{
String []productList = {"item1", "item2", "item3", "item4", "item5"};
public String[] getProductList (){
return productList;
}
}
customTag_test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%--JSP 1.2 방식의 커스텀태그 --%>
<%@taglib uri="/WEB-INF/tld/myTag.tld" prefix="my" %>
<%--JSP 2.0 --%>
<%@taglib tagdir = "/WEB-INF/tags" prefix="you" %>
<%-- taglib지시어는 확장된 태그(커스텀태그)를 현재문서에서 사용하고자 할 때 기술 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>커스텀태그</title>
</head>
<!-- customTag_test.jsp -->
<body>
<h3>커스텀태그 테스트</h3>
<hr>
<my:gildong/>
<hr>
<my:lime/>
<hr color = pink>
<you:juwon border="10" color="pink">상품목록</you:juwon>
</body>
</html>
- JSP페이지에서 많이 사용되는 논리적인 판단, 반복처리, 포맷처리를 위한
커스텀 태그를 표준으로 만들어서 정의한 것. - http://search.maven.org
--------> 검색: jstl
종류)
- 코어(변수지원, 흐름제어, URL처리)
- XML (XML코어, 흐름제어, XML변환)
- 국제화 (지역, 메시지형식, 숫자 및 날짜 형식)
- 데이터베이스(SQL)
- 함수(컬렉션 처리, String 처리)
<코어태그>
- 변수지원 : set, remove
JSP페이지 안에서 -----> <c:set> <c:remove>
- 흐름제어 : if, choose, forEach, forTokens
- URL처리 : import, redirect, url
- 기타 : catch, out
jstl-1.2.jar 파일 빌드패스 하고
input_age.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>나이입력</title>
</head>
<%--input_age.jsp --%>
<body>
<h3>나이입력</h3>
<hr>
<form action="jstl_test.jsp">
나이: <input type="text" name="age"><br>
<button>입력</button>
</form>
</body>
</html>
jstl_test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL테스트</title>
</head>
<%-- jstl_test.jsp --%>
<body>
<h3>JSTL(JSP Standard Tag Library)테스트</h3>
<hr>
<%--<% if(조건식){} %> --%>
<c:if test="true">
HTML마크업, text<br>
조건식 참일때 실행<br>
</c:if>
<c:if test="some text">
Some Text
</c:if>
<c:if test="${2<3 }">
2는 3보다 작다 <br>
</c:if>
<%-- 나이테스트 --%>
<c:if test="${param.age < 20 }">
<font color="pink">나이가 20미만입니다!!</font>
</c:if>
<c:if test="${param.age >= 20 }">
<font color="pink">나이가 20이상입니다!!</font>
</c:if>
<c:if test="${param.age >= 20 && param.age < 30 }">
<font color="blue">20대입니다.</font><br>
</c:if>
<hr>
<%--나이 20대 , 30대 체크 --%>
<c:choose> <%-- if~else if~else문과 유사 --%>
<c:when test="${param.age<20 || param.age>39 }">
<font color = "blue">나이가 20대 또는 30대가 아닙니다.</font><br>
</c:when>
<c:when test="${param.age < 30}">
<font color = "blue">나이가 20대입니다.</font><br>
</c:when>
<c:otherwise>
<font color = "blue">나이가 30대입니다.</font><br>
</c:otherwise>
</c:choose>
<hr>
<h4>forEach테스트</h4>
<%--
<c:forEach begin ="0" end ="10" var = "i" varStatus="stat" step="2">
카운트 : ${stat.count},
JSTL 안녕~ + ${i }<br>
</c:forEach>
--%>
<%-- JSTL 안녕~! 홀수줄은 빨강, 짝수줄은 파랑으로 총 10줄을 출력하시오 --%>
<c:forEach begin ="1" end ="10" var = "i" varStatus="stat">
<c:if test= "${stat.count % 2 == 1}">
<font color="red">하이</font><br>
</c:if>
<c:if test= "${stat.count % 2 == 0}">
<font color="blue">안녕</font><br>
</c:if>
</c:forEach>
</body>
</html>
'클라우드 기반 웹 개발자 과정 공부' 카테고리의 다른 글
190712_Day65 JSP (0) | 2019.07.12 |
---|---|
190711_Day64 JSP (0) | 2019.07.11 |
190710_Day63 JSP (0) | 2019.07.10 |