ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JSP 정리
    웹프로그래밍/jsp 2018. 2. 21. 12:25
    • JSP 개념
    • WAS에서 실행되며 동적 웹 컴포넌트이며(JSP, Servlet 둘다)

      JSP는 Servlet과는 반대로 HTML 코드에 JAVA언어를 삽입하여 동적 문서를 만든다.

      (Servlet은 JAVA 코드에서 PrintWriter 출력 객체를 이용해서 Html 코드를 삽입한다.)


      .JSP 요청이 들어오면 Servlet이 있는지 확인하고 없을 경우 .java -> .class로 변환하여 메모리에 할당하고 로직을 실행한다. 재요청이 들어오면 기존 Servlet을 재활용한다.

      그러므로 다른 CGI 언어보다 속도가 빠르다. (변환과정이 있기 때문에 Servlet보다는 약간 느리다고 할 수 있다.)


      JAVA 코드를 삽입하려면 태그를 이용해야 한다.



      • JSP 태그의 종류

      WAS에서 실행 되므로 Html 소스보기에서 보이지 않는다. 

      지시자: <%@   %>   - 페이지 속성

      주석: <%--   --%> 

      선언: <%!   %> - 변수, 메소드 선언 

      표현식: <%=   %> - 결과값 출력

      스크립트릿: <%   %> - JAVA 코드 삽입

      액션태그: <jsp:action> </jsp:action> - 자바빈 연결


      • JSP 동작 원리

      클라이언트가 웹브라우저로 페이지.jsp를 요청하면 WAS에 있는 JSP 컨테이너가 .jsp파일을 Servlet 파일(.java)로 변환합니다.

      Servlet파일은 컴파일 된 후 .class 파일로 변환(메모리에 상주하기 위해서)되고 클라이언트에게 html 파일 형태로 응답 됩니다.



      웹브라우저 요청 

      http://주소/helloworld.jsp



      JSP -> Servlet(JSP파일의 html태그는 servlet 파일에서 PrintWriter 클래스 객체에 의해서 변환)

      helloworld.jsp -> helloworld_jsp.java


                 ↓


      Servlet -> class

      helloworld_jsp.java -> helloworld_jsp.class


                 ↓


      웹브라우저 응답

      HTML형태



      • JSP 내부 객체

      .jsp의 에서 객체 생성없이 바로 사용할 수 있는 것

      Servlet으로 변환될때 JSP 컨테이너에 의해서 자동으로 객체가 생성된다.



      • 내부 객체의 종류

      입출력: request, response, out

      서블릿: page, config

      세션: session

      예외: exception


      • JSP 태그 예시

      -스크립트릿

      JSP문서 안에 JAVA 코드를 넣기 위한 태그 <% %>


      -선언

      변수 또는 메소드를 선언할때 사용 <%! %>


      -표현식

      값을 출력하기 위해 사용됨 <%=  %>

      결과값은 String 타입, ; 세미콜론 사용 불가


      -지시자

      페이지의 속성을 지정한다. 사용하는 언어 및 import 할때 <%@ %>


      -include 지시자

      <body>,<head> 등 태그 안, 페이지를 삽입할 위치에

      <%@ include file="파일명.jsp" %>


      -taglib 지시자

      태그라이브러리는 사용자가 만든 태그의 모음이다.  이것을 사용하기 위해 taglib 지시자를 사용 한다. 속성이 uri와 prefix로 나뉜다. (JSTL)


      -주석

      HTML: <!- comments --> 웹브라우져에서 소스보기 하면 나온다.

      JSP: <%-- comments --%> 소스보기 안 보인다.

      이것도 가능: <% //JAVA코드 %>



      예시)

      <%@ page language="java" contentType="text/html; charset=EUC-KR"

          pageEncoding="EUC-KR"%>

      <%@page import="java.util.Arrays" %>


      <body>

      <%

      int i = 0;

      while(true){

      i++;

      out.println("2*" + i + "=" + (2*i) +"<br/>);

      %>

      ========<br/>

      <%

      if(i>=9) break;

      }

      %>



      <!%

      int i = 10;

      String str = "abc";

      %>


      <%!

      private int sum(int a, int b) {

      return a+b;

      }

      %>


      <%

      out.println("i="+i+"<br/>");

      out.pritnln("str="+str+ "<br/>");

      out.println("sum =" + sum(1,5) + "<br/>");

      %>


      <%= i %><br/>

      <%= str %><br/>

      <%= sum(1,5) %>

      </body>


      • request 객체

      클라이언트가 웹브라우져를 통해 요청한 정보는 request 객체가 관리 한다.


      -관련메소드

      getContextPath()

      getSession()

      getMethod()

      getProtocol()

      getRequestURL()

      getRequestURI()

      getQuerySTring()


      JSP 페이지는 데이터 값을 전송하는 것이 목적이므로 parameter 관련 메소드가 중요하다. .jsp에서 요청 받은 데이터는 String이므로 필요할 경우 Integer.parseInt()메소드로 Int로 변환해야 한다.


      -관련메소드

      getParameter(String name)

      getParameterNames();

      getParameterValues(String name)


      • response 객체

      요청에 응답하는 정보는 response 객체가 가지고 있다.


      -관련메소드

      getCharacterEncoding()

      addCookie(Cookie)

      sendRedirect(URL)



      • JSP 액션태그

      -개념:

      JSP 페이지 내에서 어떤 동작이 이루어지도록 지시하는 태그


      -forward

      현재 페이지(URL)에서 특정 페이지를 보여주고자 할때 사용


      예시)

      <jsp:forward page="sub.jsp"/>


      -include

      현재 페이지의 중간에 다른 페이지를 삽입할때 사용


      예시)

      <jsp:include page="page0.jsp" flush="true/>


      -param

      forward 와 include 태그에서 데이터 전달을 목적으로 사용


      예시)

      page1.jsp에서


      <jsp:forward page="page2.jsp">

      <jsp:param value="abcde" name="id"/>

      <jsp:param value="12345" name="pw"/>


      </jsp:forward>



      page1.jsp에서


      <%! String id, pw;%>

      <%

      id = request.getParameter("id");

      pw = request.getParameter("pw");

      %>

      id: <%=id %> <br/>

      pw: <%=pw %> <br/>



      • 쿠키

      -개념

      http 통신규약에서 서버가 웹브라우저의 요청에 응답 후에 연결이 끊기는데, 이때 특정 정보를 보관,유지하기 위해서 사용하는 수단이다.

       쿠키는 서버가 생성하지만, 클라이언트측에 저장된다. 그리고 서버는 클라이언트의 요청이 들어올때마다 쿠키의 속성값을 참조 또는 변경할 수 있다.

      쿠키는 4kb, 300개까지의 데이터를 가질 수 있다.


      -쿠키 관련 메소드

      setMaxAge()

      setpath()

      setValue()

      setVersion()

      getMaxAge()

      getName()

      getPath()

      getValue()

      getVersion()



      -쿠키 생성과정 정리


      쿠키생성(쿠키 클래스)

      setter로 속성 설정

      response객체에 쿠키 탑재



      • 세션

      쿠키처럼 클라이언트의 웹브라우저 정보를 담는 것. 차이점은 서버상에 객체로 존재 한다.

      서버에서만 접근되므로 보안이 좋고 저장용량의 한계가 없다.

      클라이언트의 요청이 발생하면 JSP 컨테이너에서 자동생성 된다. 내부객체인 session을 지원하므로 속성을 설정할 수 있다.


      -관련 메소드

      setAttribute()

      getAtrribute()

      getAttributeNames()

      getId() -각 세션의 고유한 아이디

      isNew()

      getMaxInactiveInternal() - 세션의 유효기간

      removeAttribute() - 세션의 특정 데이터 제거

      Invalidate() - 모든 세션 데이터 삭제


      -logincheck.jsp


      <body>

      <%!String id,pw; %>

      <%

      id = request.getParameter("id");

      pw = request.getParameter("pw");

      if(id.equals("abcde") && pw.equals("12345")) {

      //Cookie cookie = new Cookie("id", id);

      //cookie.setMaxAge(60);

      //response.addCookie(cookie);

      session.setAttribute("id",id);   //입력받은 id를 세션 속성으로 설정

      response.sendRedirect("welcome.jsp");

      } else {

      response.sendRedirect("login.html");

      }

      %>


      </body>


      -welcome.jsp


      <%@ page import="java.util.Enumeration" %>   


      <body>

      <%

      Enumeration enumeration = session.getAttributeNames();

      while(enumeration.hasMoreElements()) {

      String sName = enumeration.nextElement().toString();

      String sValue = (String)session.getAttribute(sName);

      if(sValue.equals("abcde")) out.println(sValue + "님 안녕하세요"+"<br/>");

      }


      %>

      <a href="logout.jsp">로그아웃</a>

      </body>



      -logout.jsp


      <%@ page import="java.util.Enumeration" %>    

      <body>

      <%

      Enumeration enumeration = session.getAttributeNames();

      while(enumeration.hasMoreElements()) {

      String sName = enumeration.nextElement().toString();

      String sValue = (String)session.getAttribute(sName);

      if(sValue.equals("abcde")) {

      session.removeAttribute(sName);

      }

      }

      %>

      <a href="sessionTest.jsp">sessionTest</a>


      </body>


      -sessionTest.jsp


      <%@ page import="java.util.Enumeration" %> 


      <body>

      <% 

      Enumeration enumeration = session.getAttributeNames();

      int i = 0;

      while(enumeration.hasMoreElements()) {

      i++;

      String sName = enumeration.nextElement().toString();

      String sValue = (String)session.getAttribute(sName);

      out.println("sName:"+sName + "<br/>");

      out.println("sValue:"+sValue + "<br/>");

      }

      if(i ==0) out.println("해당 세션이 삭제되었습니다.");

      %>


      </body>



    • 예외 페이지

    JSP, Servlet에서도 예외가 발생한다. 여기서 예외처리는 톰캣이 제공하는 기본 에러 페이지가 아닌 사용자에게 친숙한 형태의 페이지로 유도하는 것이다.



    -페이지 지시자를 이용한 예외처리


    ※예외가 발생하는 페이지:

    <%@ page errorPage="예외처리 페이지명.jsp"%>


    ※예외 '처리' 페이지:

    <%@ page isErrorPage = "true"%>   //기본 값은 false이므로 꼭 true로 명시할 것.

    <% response.setStatus(200); %>   //에러페이지(500)가 아닌 정상적인 페이지(200)임을 명시(명시하지 않을 경우 웹 컨테이너가 실행하면서 500으로 세팅해버리는 경우가 있음)


    <%= exception.getMessage() %> //true로 명시하면서 exception객체를 참조가능



    -web.xml 파일을 이용한 예외처리


    <error-page>

    <error-code>404</error-code>   //404 -페이지 없음, 500 -연산 오류

    <location>/예외처리페이지명.jsp</location>

    </error-page>


    <error-page>

    <error-code>500</error-code>   //500 -연산 오류

    <location>/예외처리페이지명2.jsp</location>

    </error-page>


    .

    .

    .


    ※주의)

    .jsp에서 page 지시자는 명시하지 않는다.

    <% response.setStatus(200); %> status는 명시한다.



    • 자바빈

    -개념:

    반복적인 작업을 효율적으로 하기 위해서 사용. 속성와 기능으로 이루어진 클래스(데이터와 메소드)

    .jsp에서 액션태그로 빈의 속성과 기능을 사용합니다. 


    -bean 관련 액션태그: 

    useBean, setProperty, getProperty


    -scope(범위):

    page: 생성된 페이지 내에서

    request: 요청된 페이지 내에서

    session: 웹브라우저의 생명주기와 동일하게

    applitcation: 웹 어플리케이션 생명주기와 동일하게


    예시)

    -페이지명.jsp에서 page 지시자 아래에 입력

    <jsp:useBean id="임의의 bean id" class="com.javalec.Student" scope="page" />



    <body>


    -값을 설정할때

    <jsp:setProperty name="임의의 bean id" property="name" value="홍길동 />


    -값을 가져올때

    <jsp:getProperty name="임의의 bean id" property="name"/>


    </body>



    -Student 클래스(bean)

    package com.javalec;


    public class Student {


    private String name;

    private int age;

    private int grade;

    public Student() {

    }


    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 int getGrade() {

    return grade;

    }


    public void setGrade(int grade) {

    this.grade = grade;

    }

    }