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기본객체(내장객체)

종류)

  1. request(javax.servlet.http.HttpServletRequest)

    • HTML폼요소의 선택값 등 사용자 입력 정보를 읽어 올 때 사용.
  2. response(java.servlet.http.HttpServletResponse)

    • 사용자 요청에 대한 응답을 처리하기 위해 사용.
  3. pageContext(javax.servlet.jsp.PageContext) - 페이지 개념, 영역객체

    • 현재 JSP실행에 대한 context정보를 참조하기 위해 사용.
    • 서블릿 클래스에서는 사용하지 못함.
  4. session(javax.servlet.http.HttpSession)
    (세션 == 접속)
    ---> 브라우저를 통해 URL요청을 했을때 서버에서는 각브라우저를 식별할수 있는 번호를 부여!!

           서버측 메모리에 기억하고 있다가 브라우저가 또다른 (URL)요청을 할 때 같은 Client인지 비교.
    • 클라이언트에 대한 세션정보를 처리하기 위해 사용.
    • 비연결형 프로토콜 HTTP
      (한 페이지가 출력된 다음에 서버와 클라이언트 연결은 끊어짐.)에 대해
      마치 계속 연결되어있는 것처럼 해주는 메커니즘.
    • 쿠키는 사용자PC에 세션은 서버에 사용자와 관련된 정보를 보관.
  5. 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)

  • 예외상황에 대한 정보를 포함하여 로그 파일에 기록.

  1. out(javax.servlet.jsp.JspWriter)

    • 사용자에게 전달하기 위한 output스트림을 처리.
    • 브라우저 출력객체

    주요메소드)
    getBufferSize()

    • 출력버퍼의 크기를 byte로 알려준다.
      getRemaining()
    • 남아있는 버퍼의 크기 중 사용 가능한 비율을 알려준다.
      clearBuffer()
    • 버퍼에 있는 컨텐츠를 모두 지운다.
      flush()
    • 버퍼를 비우고 output stream도 비운다.
      close()
    • output stream을 닫고 버퍼를 비운다.
      println(content)
    • content내용을 newline과 함께 출력
      print(content)
    • content내용을 출력
  2. config(javax.servlet.ServletConfig)

    • 현재 JSP에 대한 초기화 환경을 처리하기 위해 사용.
  3. page(java.lang.Object)

    • 현재 JSP페이지에 대한 클래스정보.
  4. 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 상호 작용 지원

액션종류)

  1. 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>
  1. 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>
  1. 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 )에서 서비스 되어지는 모든 페이지간의 객체 공유
  1. setProperty : useBean의 세터메소드 호출

    • 형식)

      <jsp:setProperty name = "useBean에서 사용한 id"
                      property = "속성명" value = "데이터"/>
  2. 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페이지에서 반복적인 프로그램 로직을 캡슐화하기 위해 고안.

  • 기본적으로 제공되는 태그 이외에 사용자가 확장한 태그라는 의미에서
    붙여진 이름.

    커스텀태그 사용이유)

  1. 비즈니스 로직으로부터 화면 표현을 분리

  2. 비즈니스 로직의 캡슐화

  3. 보다 손쉬운 웹 페이지 제작

    종류)
    JSP 1.2커스텀태그
    JSP 2.0커스텀태그

<JSP 1.2커스텀태그 요소>

  1. 태그 핸들러 클래스(Tag Handler Class) .class
    • 자바 클래스 파일로 태그의 동작을 구현해놓은 파일.
  2. 태그 라이브러리 기술자(Tag Library Descriptor) .tld (XML문법)
    • 태그이름등 태그 정보 및 태그 핸들러 클래스와의 관계를 기술.
  3. 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커스텀태그 요소>

  1. 태그파일 .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 Standard Tag Library 표준태그 라이브러리

  • JSP페이지에서 많이 사용되는 논리적인 판단, 반복처리, 포맷처리를 위한
    커스텀 태그를 표준으로 만들어서 정의한 것.
  • http://search.maven.org
    --------> 검색: jstl

종류)

  1. 코어(변수지원, 흐름제어, URL처리)
  1. XML (XML코어, 흐름제어, XML변환)
  1. 국제화 (지역, 메시지형식, 숫자 및 날짜 형식)
  1. 데이터베이스(SQL)
  1. 함수(컬렉션 처리, String 처리)

<코어태그>

  1. 변수지원 : set, remove
    JSP페이지 안에서 ----->  <c:set>   <c:remove>  
  2. 흐름제어 : if, choose, forEach, forTokens
  3. URL처리 : import, redirect, url
  4. 기타 : 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

+ Recent posts