@ 서블릿을 쉽게 개발하기 위한 방법,
웹 컨테이너에게 메타 방법을 통해 전달하는 효과
@ jdbcfactory 생성을 계속 하지 않도록 - init 만들었었다.
- 해결을 위해 Listener 활용할 수 있다.
-
- 웹 어플리케이션의 시작 실행 종료 과정에서 발생하는 중요 이벤트에 대한 처리 클래스로 다양한 리스너를 제작, 등록 할 수 있다.
순번 | 리스너(인터페이스) | 모니터링 내용 |
---|---|---|
1 | javax.servlet.ServletContextAttributeListener | 서블릿 컨텐스트에 속성의 추가/삭제/수정 |
2 | javax.servlet.http.HttpSessionListener | 세션상태변화(사용자 접속현황) |
3 | javax.servlet.ServletRequestListener | 사용자 요청 발생시 |
4 | javax.servlet.ServletRequestAttributeListener | Request 속성의 추가/삭제/수정 |
5 | javax.servlet.http.HttpSessionBindingListener | 속성을 넣고자 하는 대상이 세션에 포함되어 있는지 확인 |
6 | javax.servlet.http.HttpSessionAttributeListener | 세션 속성의 추가/삭제/수정 |
7 | javax.servlet.ServletContextListener | 애플리케이션 컨텍스트 생성/소멸 (이번 web_blog에서 init을 serviceContextListener를 통해 활용) |
8 | javax.servlet.http.HttpSessionActivationListener | 세션의 활성화 상태 (액션 이벤트 처리와 비슷한 형태. ) |
-
package kr.or.kosta.jsp.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import kr.or.kosta.jsp.dao.DaoFactory; import kr.or.kosta.jsp.dao.JdbcDaoFactory; /** * ServletContext 생명주기(생성/소멸) 관련 이벤트 리스너 * @author 김기정 */ public class ServletContextLoadListener implements ServletContextListener { /** * ServletContext생성 이벤트 처리 * ServletContext가 생성되면(서블릿컨테이너 초기화) 웹 애플리케이션내의 * 모든 Servlet, JSP, Filter 등이 공유할 수 있는 객체 또는 리소스 생성 및 등록(초기화) */ public void contextInitialized(ServletContextEvent event) { System.out.println("[Debug] : ServletContext 생성됨 >>>"); DaoFactory daoFactory = new JdbcDaoFactory(); // 모든 서블릿, JSP들이 공유할 수 있도록 ServletContext에 DaoFactory 저장 ServletContext servletContext = event.getServletContext(); servletContext.setAttribute("daoFactory", daoFactory); } public void contextDestroyed(ServletContextEvent event) { System.out.println("[Debug] : ServletContext(서블릿컨테이너) 종료됨 >>>"); } }
-
활용 예제 - listByPage-v2 : 메소드 init을 생략 가능하다.
//DaoFactory factory = new JdbcDaoFactory(); DaoFactory factory = (DaoFactory)application.getAttribute("daoFactory"); //어플리케이션 등록을 통해 더 쉽게 활용 가능하다. UserDao dao = factory.getUserDao(); List<User> list = dao.listByPage(params);
<%--이 아래 메서드는 지워도 도 된다. : servletContext가 역할 대신 수행--%> <%-- 여기는 index.jsp - > init 생략 가능 <%! public void jspInit(){ DaoFactory daoFactory = new JdbcDaoFactory2(); getServletContext().setAttribute("daoFactory", daoFactory); } %> --%>
-
클라이언트의 요청을 서블릿이나 JSP가 받기 전에 공통 기능을 수행하기 위해 설정하는 기능이다.
- Web_blog프로젝트, 로그인, 인코딩, 이미지 변환 등의 작업을 공통적으로 수행 가능하다.
-
필터의 특징
- 필터 체인
- 필터는 여러개 생성이 가능하며, 묶어서 처리가 가능하다.
- 필터 체인
-
적용의 절차
- web.xml에 태그 이용한 필터 등록
package kr.or.kosta.jsp.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 요청파라메터 한글인코딩 처리 필터
*/
public class CharacterEncodingFilter implements Filter {
private String encoding;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
encoding = filterConfig.getInitParameter("encoding");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 전처리
if(encoding != null){
request.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);
// 후처리
}
@Override
public void destroy() { }
}
<!-- 필터 등록 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>kr.or.kosta.jsp.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-
브라우저 요청과 관련된 것이기 때문에 매핑이 필요한 것이다.
- (*) 모든 요청 상황에 대한 처리를 해준다.
- pattern 을 여러개 사용이 가능하다.
- 모든 요청에 대한 필터링 처리 기능이 가능하다.
package kr.or.kosta.jsp.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
/**
* 사용자 로그인 여부 체크 필터
*/
public class LoginCheckFilter implements Filter {
// private String loginPage = "/user/login.jsp";
private String loginPage;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
loginPage = filterConfig.getInitParameter("loginPage");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("[디버깅] : LoginCheckFiler 실행..");
boolean isLogin = false;
Cookie[] cookies = ((HttpServletRequest)request).getCookies();
if(cookies != null) {
for (Cookie cookie : cookies) {
if(cookie.getName().equals("loginId")) {
isLogin = true;
break;
}
}
}
if(isLogin) {
chain.doFilter(request, response);
}else {
if(loginPage == null) {
throw new ServletException("LoginCheckFilter에 loginPage가 설정되어 있지 않습니다.");
}
request.setAttribute("uri", ((HttpServletRequest)request).getRequestURI());
request.getServletContext().getRequestDispatcher(loginPage).forward(request, response);
}
}
@Override
public void destroy() {}
}
<filter>
<filter-name>LoginCheckFilter</filter-name>
<filter-class>kr.or.kosta.jsp.filter.LoginCheckFilter</filter-class>
<init-param>
<param-name>loginPage</param-name>
<param-value>/user/login.jsp</param-value>
</init-param>
</filter>
<!-- 요청하는 페이지 목록을 선택적으로 활용 가능하다. -->
<filter-mapping>
<filter-name>LoginCheckFilter</filter-name>
<url-pattern>/user/list.jsp</url-pattern>
<url-pattern>/user/listByPage.jsp</url-pattern>
<url-pattern>/user/listByPage-v2.jsp</url-pattern>
<url-pattern>/some/*</url-pattern>
</filter-mapping>
- JSP의 단점
- HTML템플릿 텍스트와 자바 언어를 사용하는 원소의 혼재로 가독성 떨어짐
EL : ${ applicationScope.mail }
JSP : <%=application.getAttribute(“mail”) %>
-
JSP에 자바 스크립트 코드를 사용할 수 있게 해주는 것
- Property를 통해 자동으로 접근 가능하다.
-
- 스크립트 언어로 자바코드 대신에 값을 쉽고 간결하게 표현 가능하다.
- JSP의 표현식을 대체하고, <jsp: getProperty>액션태그 보완을 위해 사용한다.
- JSTL과 함께 사용하면, 가독성과 유지보수를 높일 수 있다.
-
주요 기능_
- 스코프, 객체에 저장된 자바빈의 속성이나 Collection객체의 원소를 대체 가능
- 연산자 사용 , 디폴트 객체(11개 - 미리 생성된 객체)
- 자바 객체의 인스턴스 및 클래스 메서드를 호출 가능하다.
<c:if test="${b.like_check == 'Y' }">
<li><a
href="javascript:likeUp(${b.board_no },'<%=session.getAttribute("id") %>')"
class="icon fa-heart" id="icon${b.board_no}">${b.b_like_cnt }</a></li>
</c:if>
<c:if test="${b.like_check == 'N' }">
<li><a
href="javascript:likeUp(${b.board_no },'<%=session.getAttribute("id") %>')"
class="icon fa-heart-o" id="icon${b.board_no}">${b.b_like_cnt }</a></li>
</c:if>
<%-- JSP 표현식(출력문) 대신 사용--%>
<%= request.getAttribute(“user”).getName() %>
EL로 간단히 표현 ☞ ${requestScope.user.name} 또는 ${user.name}
<%-- 액션태그의 속성으로 사용--%>
<jsp:include page=“/module/${skin.id}/header.jsp” />
-
getName -> user.name으로 접근 가능하다.
-
자바스크립트 언어와 똑같다고 생각하면 된다~
-
<%@ page contentType="text/html; charset=utf-8" %> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>EL연습</title> </head> <body> ${"김기정" } ${'김기정'} ${10 } ${NULL } ${true } ${false } <br> <%=10 + "20" %>,${10+"20" }<br> ${ true && false }, ${true and false } ${empty null } ${empty "" } </body> </html>
-
EL코드를 통해 자바 스크립트를 이용한다.
-
empty - null, 빈문자열, 컬렉션 체크 모두 가능
-
${ true && false }, ${true and false } ${empty null } ${empty "" }
-
산술 및 논리 연산자 활용가능하다. / empty를 통해 쉽게 빈문자 체크 가능
-
-
-
RequestScope : 기본 객체에 저장된 속성 <key, 값>
-
디폴트객체 기 능 pageScope pageContext 기본 객체에 저장된 속성<키, 값> 매핑을 저장한 Map 객체 requestScope request 기본 객체에 저장된 속성<키, 값> 매핑을 저장한 Map 객체 sessionScope session 기본 객체에 저장된 속성<키, 값> 매핑을 저장한 Map 객체 applicationScope application 기본 객체에 저장된 속성<키, 값> 매핑을 저장한 Map 객체 param 요청 파라미터의 <파라미터이름, 값> 매핑을 저장한 Map 객체 request.getParameter(“파라미터이름”)의 결과와 동일 paramValues 요청 파라미터의 <파라미터이름, 값배열> 매핑을 저장한 Map 객체 request.getParameterValues(“파라미터이름”)의 결과와 동일 header 요청 정보의 <헤더이름, 값> 매핑을 저장한 Map 객체 request.getHeader(“헤더이름”)의 결과와 동일 headerValues 요청 정보의 <헤더이름, 값배열> 매핑을 저장한 Map 객체 request.getHeaders(“헤더이름”)의 결과와 동일 initParam web.xml의 의 초기파라미터 <이름, 값> 매핑을 저장한 Map 객체 application.getInitParameter(“파라미터이름”)의 결과와 동일 cookie <쿠키이름, Cookie> 매핑을 저장한 Map 객체 request.getCookies()의 결과와 동일 pageContext jsp의 pageContex와 동일한 자바 빈객체
-
param - > map 구조 : 요청 파라미터의 매핑을 저장한 MAP객체
paramValues -> 요청 파라미터의 매핑을 저장한 Map객체
EL이 NULL값일 경우 - 빈 문자열이 찍힌다. : 유용하게 활용 가능하다. 에러 발생의 빈도 수를 줄여준다.
-
쿠키 받기 위한 방법 (Cookie)
-
<쿠키이름, Cookie> 매핑을 저장한 Map객체
-
request.getCookies()의 결과와 동일하다
-
${sessionScope}<br> ${applicationScope}<br> 모든 스코프객체에서 검색 : ${name}<br> <%=request.getParameter("id") %> ${param.id}<br> ${paramValues}<br> ${paramValues.hobby[0]},${paramValues.hobby[1]} ${header}<br> 브라우저 정보 : ${header["user-agent"]}<br> ${headerValues}<br> ${initParam}<br> ${initParam.message}<br> ${cookie}<br> 쿠키이름 : ${cookie.loginCookie.name}<br> 쿠키값 : ${cookie.loginCookie.value}
-
-
-
<%@ page contentType="text/html; charset=utf-8" %> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>EL 디폴트 객체 (11개)</title> </head> <body> <br> ${pageScope } --------------------------------------페이지스코프<br> ${requestScope } -------------------------------------리퀘스트 스코프<br> ${SessionScope } -------------------------------------세션스코프<br> <%--${applicationScope } --%> -------------------------------------<br> ${param.name }, ${param["name"] } -------------------------------------파람.네임<br> ${paramValues.hobby[0] }, ${paramValues.hobby[1] } -------------------------------------파람벨류.하비<br> ${header["user-agent"]} --------------------------------------헤더.유저에이전트<br> ${headerValues["user-agent"]} --------------------------------------헤더벨류.유저에이전트<br> ${param["name"] } --------------------------------------쿠키<br> 쿠키 : ${cookie.loginId.name }, ${cookie.loginId.value } --------------------------------------<br> ${pageContext.request.method } <%request.getMethod() %><br> </body> </html>
-
기존의 출력문을 EL이 대체하고 있는 것이다.
-
액션 태그의 getProperty를 보완하는 역할이다. 점을 여러개 사용하여 하위 객체까지 접근 가능하다.
-
<%@page import="java.util.Calendar"%> <%@ page contentType="text/html; charset=utf-8" %> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>EL 디폴트 객체 (11개)</title> </head> <body> <% // 테스트를 위한 Scope객체에 데이터 저장 String today = String.format("%1$tF %1$tT", Calendar.getInstance()); request.setAttribute("today", today); session.setAttribute("id", "bangry"); String[] names = {"김기정", "박기정", "최기정"}; //얘는 단지 지역변수 일 뿐이다. Scope객체에 접근방법 %> <%--날짜 호출을 위한 두가지 방법 --%> <%=request.getAttribute("today") %> ${requestScope.today}<br> ${today}<br> <%--아이디 호출을 위한 두가지 방법 --%> <%=pageContext.findAttribute("id") %> ${id}<br> <%--배열 생성 후 접근 : 접근 불가능하다!!!!!. --%> ${names[0]}, ${names[1]}, ${names[2]}<br> <%--jsp usebean태그로 user/ dog java 접근 --%> <jsp:useBean id="dog" class="kr.or.kosta.jsp.el.Dog" scope="page"/> <jsp:setProperty property="name" name="dog" value="강아지루니루니"/> <jsp:useBean id="student" class="kr.or.kosta.jsp.el.Student" scope="page"/> <jsp:setProperty property="name" name="student" value="학생이름이혜림"/> <jsp:setProperty property="dog" name="student" value="${dog}"/> <%-- <jsp:getProperty property="id" name="student"/> <jsp:getProperty property="name" name="student"/> <jsp:getProperty property="dog" name="student"/> --%> <%--dog객체의 toString 으로출력된다. 결과 : Dog [name=강아지루니루니] --%> <jsp:getProperty property="dog" name="student"/><br> 학생이름 : ${student.name }<br> 강아지 이름 : ${student.dog.name }<br> <%-- ${student.id}, ${student.name}, ${student.dog.name}<br> --%> </body> </body> </html>
-
결과 화면 : 2018-10-24 12:43:33 2018-10-24 12:43:33 2018-10-24 12:43:33 bangry bangry , , Dog [name=강아지루니루니] 학생이름 : 학생이름이혜림 강아지 이름 : 강아지루니루니
-
-
- annotation과 비슷한 표현
- TLD파일에 함수 표현
- annotation과 비슷한 표현
-
<%@page isELIgnored="true" %>
- EL이 TEXT메시지 형태로 나올 수 있다.
-
JSP스크립트 요소의 자바 코드를 사용하지 않고도, HTML태그와 같이 표준화된 태그만으로 쉽게 사용 가능한 JSP 표준 태그 라이브러리
-
태그 사용 종류
-
- 액션 태그
- Custom태그
- JSPL 미리 만들어진 TAG라이브러리
-
C:\KOSTA187\tools\apache-tomcat-8.0.53\webapps\examples\WEB-INF\lib
복사 -> WEB-INF -> lib -> 붙여넣기 이용
-
-
1. 태그 내용 없이 사용하는 경우 <c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] /> 2. 태그 내용이 있는 경우 <c:out value="value" [escapeXml="{true|false}"]> default value (value에 내용이 없을 때 출력될 기본 값) </c:out>
-
<c:out value="김기정"/><br> ${message }<br> <c:out value="${message }" default="기본 메시지 입니다..."/><br> <%--위의 두가지 태그의 차이점 1. 꺽쇠가 있을 경우이 결과 창이 달라진다. 2. EL은 있는 그대로 출력한다. 3. out 태그는 다 바꾸어 준다. 4. out 태그 메시지 안에 오류 발생시, 디폴트 값을 지정해주어서 오류를 막아줄 수 있다.
-
-
-
JSP 4개의 스코프 객체에 속성을 설정하거나 빈의 프로퍼티 사용시 사용한다.
-
1. 스코프 객체에 속성을 추가하는 경우 <c:set value="value" var="varName" [scope="{page|request|session|application}"]/> 2. 특정 빈 객체의 프로퍼티 값을 설정하는 경우 <c:set value="value" target="target" property="propertyName"/>
-
VAR 입력값이 : KEY값이 된다.
-
VALUE : 저장하고자 하는 값이 될 수 있다.
-
- 스코프 객체에 속성을 추가하는 경우 예제
-
<%@ page contentType="text/html; charset=utf-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%--태그만 활용하여 스코프 객체에 저장할 수 있다. --%> <c:set var="message" value="JSTL <연습>입니다." scope="page"/> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <c:out value="김기정"/><br> ${message }<br> <c:out value="${message }" default="기본 메시지 입니다..."/><br> <%--위의 두가지 태그의 차이점 1. 꺽쇠가 있을 경우이 결과 창이 달라진다. 2. EL은 있는 그대로 출력한다. 3. out 태그는 다 바꾸어 준다. 4. out 태그 메시지 안에 오류 발생시, 디폴트 값을 지정해주어서 오류를 막아줄 수 있다. --%> </body> </html>
-
- 특정 빈 객체에 프로퍼티 값을 설정하는 경우
<%@ page contentType="text/html; charset=utf-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%--태그만 활용하여 스코프 객체에 저장할 수 있다. --%> <c:set var="message" value="JSTL <연습>입니다." scope="page"/> <%--특정 빈 객체에 프로퍼티 값을 설정하는 경우 --%> <jsp:useBean id="dog" class="kr.or.kosta.jsp.el.Dog"/> <c:set target="${dog}" property="name" value="루니"/> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <c:out value="김기정"/><br> ${message }<br> <c:out value="${message }" default="기본 메시지 입니다..."/><br> <%--위의 두가지 태그의 차이점 1. 꺽쇠가 있을 경우이 결과 창이 달라진다. 2. EL은 있는 그대로 출력한다. 3. out 태그는 다 바꾸어 준다. 4. out 태그 메시지 안에 오류 발생시, 디폴트 값을 지정해주어서 오류를 막아줄 수 있다. --%> 강아지 이름 : ${dog.name } </body> </html>
-
-
-
4개의 스코프 객체에 저장된 속성 제거시 사용.
-
<c:remove var="message"/>
-
기존 메시지가 지워지고, message 내의 default값이 나온다.
-
-
-
<c:catch [var="varName"]> 예외 처리 </c:catch>
-
오류 발생시 나타나는 화면을 변경해준다 -> try catch 개념
-
-
<%@ page contentType="text/html; charset=utf-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <c:catch var="ex"> <%= 100/0 %> </c:catch> ${ex }예외가 발생하였습니다. </body> </html>
결과 화면 : java.lang.ArithmeticException: / by zero예외가 발생하였습니다.
-
-
조건이 맞는 경우, 태그 바디 부분 처리( IF문과 유사하지만 else는 지원하지 않음)
-
1. 바디 내용이 없는 경우 <c:if test="testCondition" var="varName" scope="{page|request|session|application}"]/> 2. 바디 내용이 있는 경우 <c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]> body content </c:if>
-
var 키워드 옆에는 scope값이 따라온다.
-
<%@ page contentType="text/html; charset=utf-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="score" value="85" scope="request"/> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <c:if test="${score>50 }"> 통과 </c:if> <c:if test="${empty param }"> <c:set var="page" value="1"> </c:set> </c:if> ${page } </body> </html>
-
-
-
Switch 문과 유사한 기능. 하나의 태그에는 여러개의 when 태그가 존재한다.
-
<c:choose> body content (<when> and <otherwise> subtags) <c:when test="testCondition"> body content </c:when> <c:otherwise> conditional block </c:otherwise> </c:choose>
-
<%@ page contentType="text/html; charset=utf-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="score" value="85" scope="request"/> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <c:choose> <c:when test="${score >=90 }">수</c:when> <c:when test="${score >=80 }">우</c:when> <c:when test="${score >=70 }">미</c:when> <c:when test="${score >=60 }">양</c:when> <c:otherwise>가</c:otherwise> </c:choose> </body> </html>
-
Switch문으로 활용 가능한 => choose
-
-
-
자바의 for 문과 유사하며 가장 유용한 JSTL태그 중 하나
-
1. 지정된 회수 반복 <c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end“ [step="step"]> body content </c:forEach> 2. 컬렉션 객체의 사이즈 만큼 반복(확장 for문과 유사) <c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> body content </c:forEach>
-
varStatus = 상태 정보 변화 / begin = 반복 언제부터 시작 / end = 어디부터 어디까지 / step = 증가
-
김기정 입니다를 10번 출력하기 위한 forEach 태그
-
<%@ page contentType="text/html; charset=utf-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%--김기정 입니다. 10번 출력하는 forEach 태그 --%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <c:forEach var="i" begin="1" end="10"> ${ i} : 김기정 입니다.<br> </c:forEach> </body> </html>
-
<%@ page contentType="text/html; charset=utf-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%--김기정 입니다. 10번 출력하는 forEach 태그 --%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <c:forEach var="i" begin="1" end="10"> ${i } : 김기정 입니다.<br> </c:forEach> <table border="3"> <c:forEach var="i" begin="2" end="9"> <tr> <c:forEach var="j" begin="1" end="9"> <td>${i } * ${j } = ${i*j }</td> </c:forEach> </tr> </c:forEach> </table> </body> </html>
-
<%@page import="kr.or.kosta.jsp.dao.User"%> <%@page import="java.util.List"%> <%@page import="java.util.ArrayList"%> <%@ page contentType="text/html; charset=utf-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%--가상의 데이터를 만들고 forEach 문을 돌려 데이터 인출하기 --%> <% List<String> teams = new ArrayList(); teams.add("한화 이글즈"); teams.add("두산 베어즈"); teams.add("SK 와이번즈"); request.setAttribute("teams", teams); List<User> users = new ArrayList<User>(); users.add(new User("bangry1","이혜림","1111","nina3355@naver.com","2018")); users.add(new User("bangry2","이혜림","1111","nina3355@naver.com","2018")); users.add(new User("bangry3","이혜림","1111","nina3355@naver.com","2018")); users.add(new User("bangry4","이혜림","1111","nina3355@naver.com","2018")); users.add(new User("bangry5","이혜림","1111","nina3355@naver.com","2018")); request.setAttribute("users", users); %> <%--김기정 입니다. 10번 출력하는 forEach 태그 --%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <c:forEach var="i" begin="1" end="10"> ${i } : 김기정 입니다.<br> </c:forEach> <%--구구단 만들기 테이블 --%> <table border="3"> <c:forEach var="i" begin="2" end="9"> <tr> <c:forEach var="j" begin="1" end="9"> <td>${i } * ${j } = ${i*j }</td> </c:forEach> </tr> </c:forEach> </table> <%-- SELECT 팀이름 작성하기 --%> <select> <c:forEach var="team" items="${teams }"> <option>${team }</option> </c:forEach> </select> <%--User의 입럭 데이터 인출하기 --%> <table border="1"> <tr> <td>아이디</td> <td>이름</td> <td>비밀번호</td> <td>이메일</td> <td>가입일자</td> </tr> <c:choose> <c:when test="${not empty users}"> <c:forEach var="user" items="${users }" varStatus="status"> <tr> <td>${status.index} ${user.id }</td> <td>${user.name }</td> <td>${user.passwd }</td> <td>${user.email }</td> <td>${user.regdate }</td> </tr> </c:forEach> </c:when> <c:otherwise> <tr> <td colspan="5">회원이 존재하지 않습니다.</td> </tr> </c:otherwise> </c:choose> </table> <% String ssn = "940308-1111111"; request.setAttribute("ssn", ssn); %> <c:forTokens var="token" items="${ssn }" delims="-"> ${token }, </c:forTokens> </body> </html>
-
-
-
<%@ include %> 지시어와 <jsp:include /> 액션태그와 달리 웹 컨테이너 외부 자원도 포함 가능
-
포함 하고자 하는 자원을 문자열 형태로 포함 하는 경우 <c:import url="url" [context="context"] [var="varName"] [scope="{page|request|session|application}"] [charEncoding="charEncoding"]> optional body content for <c:param /> </c:import>
-
<%@page import="kr.or.kosta.jsp.dao.User"%> <%@page import="java.util.List"%> <%@page import="java.util.ArrayList"%> <%@ page contentType="text/html; charset=utf-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <%-- <c:import url="http://www.naver.com" ></c:import>--%> <c:import url="https://www.naver.com" var="output"></c:import> 안녕안녕 여기에 임시저장해놓았어! <%-->${output } --%> <c:out value="${output }"></c:out> </body> </html>
-
-
-
URL재작성
-
1. 바디가 없는 경우 <c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]/> 2. 바디가 있는 경우 <c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]> <c:param/> </c:url>
-
<%@page import="kr.or.kosta.jsp.dao.User"%> <%@page import="java.util.List"%> <%@page import="java.util.ArrayList"%> <%@ page contentType="text/html; charset=utf-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <% String url = "https://www.naver.com?name=bangry"; %> <a href="<%=url%>">이동</a> <c:url var="url" value="https://www.naver.com"> <c:param name="id" value="bangry"/> <c:param name="name" value="김기정"/> </c:url> <a href="${url }">이동</a> </body> </html>
복잡했던 주소값의 전달을 더 쉽고 간단하게 처리할 수 있다.
-
-
-
1. 바디가 없는 경우 <c:param name="name" value="value"/> 2. 바디 내용을 속성 값으로 사용하는 경우 <c:param name="name"> parameter value </c:param>
<%@page import="kr.or.kosta.jsp.dao.User"%> <%@page import="java.util.List"%> <%@page import="java.util.ArrayList"%> <%@ page contentType="text/html; charset=utf-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%-- c:param 태그 --%> <%-- import, url, redirect 태그에서 파라미터 설정할 때 사용하는 태그 --%> <c:redirect url="https://www.daum.net"> <c:param name="name" value="bangry"/> </c:redirect>
<c:redirect url="https://www.daum.net">
- 이렇게만 작성하여도 페이지 실행시 바로 홈페이지 실행된다
-
<c:redirect url="https://www.daum.net"> <c:param name="name" value="bangry"/> </c:redirect>
- 파라미터 전송 시에도 활용 가능하다.
- 주의 : PATH가 일치하여야 한다.
<%@page import="kr.or.kosta.jsp.dao.User"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- c:param 태그 --%>
<%-- import, url, redirect 태그에서 파라미터 설정할 때 사용하는 태그 --%>
<%--
<c:redirect url="https://www.daum.net">
--%>
<%--
<c:redirect url="https://www.daum.net">
<c:param name="name" value="bangry"/>
</c:redirect>
--%>
<c:redirect url="/user/login.jsp" context="/jsp"></c:redirect>
core, function, fmt, spring
http://noritersand.tistory.com/256
<%@page import="kr.or.kosta.jsp.dao.User"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<fmt:formatNumber value="1700600"/>
<!-- 1,700,600 -->
<fmt:formatNumber value="1700600" type="number"/>
<!-- 1,700,600 -->
<fmt:formatNumber value="1700600" type="number" groupingUsed="false"/>
<!-- 1700600 -->
<fmt:formatNumber value="1700600" type="currency" groupingUsed="true"/>
<!-- ₩1,700,600 -->
<fmt:formatNumber value="1670400" type="currency" currencySymbol="&"/>
<!-- &1,670,400 -->
<fmt:formatNumber value="0.5" type="percent"/>
<!-- 50% -->
<fmt:formatNumber value="999" minIntegerDigits="5" minFractionDigits="2"/>
<!-- 00,999.00 -->
<fmt:formatNumber value="9876543.61" pattern=".000" />
<!-- 9876543.610 -->
<fmt:formatNumber value="9876543.612345" pattern="#,#00.0#"/>
</body>
</html>
-
<c:out value="${now}"/> <!-- Wed Apr 22 17:14:22 KST 2015 --> <fmt:formatDate value="${now}" type="date"/> <!-- 2015. 4. 22 --> <fmt:formatDate value="${now}" type="time"/> <!-- 오후 5:14:22 --> <fmt:formatDate value="${now}" type="both"/> <!-- 2015. 4. 22 오후 5:14:22 --> <fmt:formatDate value="${now}" type="both" dateStyle="default" timeStyle="default"/> <!-- 2015. 4. 22 오후 5:14:22--> <fmt:formatDate value="${now}" type="both" dateStyle="short" timeStyle="short"/> <!-- 15. 4. 22 오후 5:14 --> <fmt:formatDate value="${now}" type="both" dateStyle="medium" timeStyle="medium"/> <!-- 2015. 4. 22 오후 5:14:22 --> <fmt:formatDate value="${now}" type="both" dateStyle="long" timeStyle="long"/> <!-- 2015년 4월 22일 (수) 오후 5시 14분 22초 --> <fmt:formatDate value="${now}" type="both" dateStyle="full" timeStyle="full"/> <!-- 2015년 4월 22일 수요일 오후 5시 14분 22초 KST --> <fmt:formatDate value="${now}" type="both" pattern="yyyy년MM월dd일 HH시mm분ss초 E요일"/> <!-- 2015년04월22일 17시14분22초 금요일 -->