[JSP] 지시어, 태그, 내장객체, 스크립트

:)·2024년 4월 9일

개발

목록 보기
13/19
post-thumbnail

JSP

  • 개념
    • 앨리먼트(element) : 의미가 있는 단어 (ex p : paragraph, ol : ordered list)
    • 태그 : 앨리먼트를 꺽은 괄호 (ex < p>< /p>, < br/>, < body>< /body>)
    • 애트리뷰트(attribute) : 앨리먼트에 부여할 수 있는 특성. 굳이 바꾸지 않아도 기본값이 설정 (ex color="red"에서 color부분
    • 밸류(value) : attribute나 property에 부여되는 값 따옴표로 묶여있음 (ex color="red")
    • 프로퍼티(property) : 앨리먼트에 부여할 수 있는 속성 또한, 기본값이 설정되어 있음 (ex color="red" attribute와 value를 모두 지칭해서 property)

지시어

  • page: 페이지 정보설정
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    • language : 스크립트 언어의 유형을 정해주는 속성 기본 설정 값: java

    • contentType : MIME 형식을 지정해주고 캐릭터셋을 설정

    • pageEncoding : contentType과 동일한 기능, "해당 JSP 파일을 UTF-8로 인코딩 하겠다"

    • contentType: "클라이언트(웹브라우저)가 받아볼 페이지가 UTF-8 형식이다"

    • import : JSP 파일 내에서 외부 자바 패키지나 클래스 불러올 때 사용

      <%@ page import="java.util.*" %>
    • errorPage : 현재 페이지가 오류가 발생할 경우 호출될 페이지를 지정

    • isErrorPage : 현재의 페이지가 일반적인 페이지인지 예외를 처리하는 페이지인지 지정할때 사용.

      • 기본값: "false", 예외(Exception)을 처리하는 페이지: "true"
    • session : JSP 페이지가 HttpSession을 사용할지에 대한 여부 지정(기본 값: "true")

    • buffer : JSP 페이지의 출력 버퍼의 크기를 지정하는 속성(기본값: "8kb", 사용하지 않을때: "none")

    • autoFlush : JSP 페이지의 내용들이 클라이언트(웹 브라우저)에 출력되기 전 버퍼가 가득 찼을 경우 버퍼를 자동으로 비울 것인지 지정하는 속성(기본값: "true")

    • isThreadSafe : 다중쓰레드를 사용할 수 있는지 없는지 지정(기본값: "true"/ “false”: 순차적 진행)

    • info : 해당 JSP 페이지에 대한 설명 작성

    • extends : JSP 페이지가 어떤 클래스를 상속받는지 설정
      - include: 외부 파일을 현재 JSP 페이지에 포함시킴

      <%@ include file="삽입할 파일 이름" %>
  • taglib: 표현 언어에서 사용할 자바클래스나 JSTL 선언
    - 커스텀 태그 라이브러리를 JSP 파일에서 사용하기 위한 지시어
    - uri : "커스텀 태그 TLD 파일의 위치" 입력
    - prefix: "해당 커스텀 태그를 사용할 이름" 선언
    <%@ taglib uri="/META-INF/mytag.tld" prefix="mytag" %>

    태그

    • c: core 태그 : 값 저장과 출력, 실행 제어
      1. if문 : <c:if test=""> 실행코드 </c:if>
      2. if - else문: <c:choose>
        <c: when test=""> 실행코드 /여러 경우시 when을 추가 작성
        <c:otherwise> 실행코드
      3. foreach: <c:forEach var="i" begin="1" end="10" varStatus="status" step="2">
      4. 자바객체 활용: <%CustomerVo vo= new CustomerVo(value …);
        pageContext.setAttribute("customer",vo); %>
      • 코드
        1. pageContext 영역에 '애트리뷰트' 이름 age, 값 23을 저장
        <c:set var="age" value="13"/>
        
        2. 저장된 애트리뷰트 값 출력
        age: <c:out value="${age }"></c:out></h5>  -> age는 애트리뷰트 이름
        name: <c:out value="${name }"></c:out>     ->name은 자바변수. 출력 안됨
        
        3. 자바의 if 태그 대신 사용
        <h5>c:if테스트</h5>
        <!-- 조건식을 test 속성에 작성. EL 기호 안에 사용 -->
        <c:if test ="${age<20 }">
        <div style ="color:green">청소년입니다. </div>
        </c:if>
        <c:if test ="${age>=20 }">
        <div style ="color:red">성인입니다. </div>
        </c:if>
        
        4. if~else 형식
        <c:set var="age" value="23"/>  <!-- 애트리뷰트 age값 변경 -->
        <c:choose>
        <c:when test="${age <20 }">
        <div style ="color:green">청소년입니다. </div>
        </c:when>
        <c:otherwise>
        <div style ="color:red">성인입니다. </div>
        </c:otherwise>
        </c:choose>
        
        5. for문
        <c:forEach var="i" begin="1" end="10" varStatus="status" step="2">
        <div>
        <c:out value="${i }"/>
        <c:out value="${i*11}"/>
        <!-- varstatus 속성은 for 반복 상태를 알 수 있는 값을 제공 -->
        <c:out value="${status.count}"/>
        <c:out value="${status.step}"/>
        </div>
        </c:forEach>
        
        6. 자바 객체 활용하기
        <%CustomerVo vo= new CustomerVo("momo","강모모"[,"momo22@daum.net](mailto:,%22momo22@daum.net)",29,null);
        //만들어진 객체를 pageContext scope의 애트리뷰트로 저장
        pageContext.setAttribute("customer",vo); %>
        <c:out value="${customer }"/>
        <ul>
        
        <li>${customer.customId}</li>
        <li>${[customer.name](http://customer.name/)}</li>
        <li>${customer.email}</li>
        <li>${customer.age}</li>
        </ul>
        
        7. 자바 객체의 컬렉션(list) 활용하기 -> jdbc로 sql 조회한 결과 List인 경우 활용 가능
        List<CustomerVo> list = List.of(new CustomerVo("momo12","강모모","momo12@daum.net",25,null),
        											new CustomerVo("momo13","강모모","momo13@daum.net",26,null);
        											
        pageContext.setAttribute("list",list);%>
        
        		<!-- 컬렉션 list에서 값을 하나씩 가져와 애트리뷰트 이름 vo에 저장 -->
        		<c:forEach items="${list }" var="vo" varStatus="status">
        			<c:out value="${status.index }"/>, <c:out value="${vo }"/>
        			<!--varStatus 속성 index는 지금처럼 items 로 컬렉션 다룰 때 사용  -->
        			<!--vo에 저장된 객체 속성을 각각 출력하기  -->
        			<ul>
        				<li><c:out value="${vo.customId }"/></li>
        				<li><c:out value="${vo.name }"/></li>
        				<li><c:out value="${vo.email }"/></li>
        				<li><c:out value="${vo.age }"/></li>
        			</ul>
        		</c:forEach>
    • fmt: format . 출력 포맷 설정 (숫자,날짜 출력형식 / Locale 설정)
      • <fmt:formatNumber value="9999999"/> → 서식(기본: 3자리마다 ,) 있는 출력저장 동작 , value에는 값을 직접 또는 el
      • <fmt:parseNumber var="test" value="8888888"/> → fmt:parseNumber는 변수에 저장만 (출력별개)
      • <fmt:setLocale value="ko_kr"/> → 기준 국가 지정
      • <fmt:formatDate value="${now }" /> →날짜 출력
      • 코드
        <!-- formatNumber는 서식(기본: 3자리마다 ,) 있는 출력과 저장 동작 , value에는 값을 직접 또는 el -->
        	   <fmt:formatNumber  value="9999999"/> <br>  
        	   <!-- fmt:parseNumber는 변수에 저장만 (출력별개).  -->
        	   <fmt:parseNumber var="test"  value="8888888"/> 
        	   test :<c:out value=" ${test }"/><br>  <!-- 서식 없는 출력 -->
        	   <!-- 현재 locale : ko_kr 표기는 언어_국가 형식 :화폐단위 -₩   ->화폐, 날짜는 locale에 영향을 받음-->
        	   <fmt:formatNumber  value="9999999"  type="currency"/><br> 
        	   <!--  locale 변경 : en_us :화폐단위 - $ -->
        	   <fmt:setLocale value="en_us"/>  
        	   <fmt:formatNumber  value="9999999"  type="currency"/><br> 
        	   <!-- type: 화폐단위 , 퍼센트(percent) 등 표시 , 
        	        pattern : 직접 소수점 이하, 전체 자리수 지정-->
        	   <hr>
        	   <!-- 789,789.123 기본패턴:소수점 최대 3자리 -->
        	   <fmt:formatNumber value="789789.12345" /><br>  
        	    <!-- 789,789.12 -->
        	   <fmt:formatNumber value="789789.12345" pattern="#,###.##"/><br> 
        	   <fmt:formatNumber value="789789.12345" pattern="#,###.#####"/><br> 
        	   <fmt:formatNumber value="789789.123" pattern="0000,000,000.00000"/><br>
        	   <!-- 자릿수를 맞추기 위해 빈자리에 0을 넣음
        	   		fmt:formatXXX: 출력과 변수에 저장
        			fmt:parseXXX:  저장만 함 	   	  -->
        			
        	   <hr>
        	   <!-- 날짜 패턴에 대소문자 유의 : 일 dd, 월 MM , 분 mm , 시(12) hh , 시(24) HH -->
        	   <!-- Jan 20, 2023 *formatDate 도 var 로 변수 저장 -->
        		<!--now 애트리뷰트 값 : 테스트 위해 자바객체로 생성 -->	    
        	   <fmt:setLocale value="ko_kr"/> 
        	   <c:set var="now" value="<%= new java.util.Date()%>"/>
        	    현재시간과 날짜 : ${datetime1 }<br>  <!-- 출력결과 :  Thu Nov 03 20:14:00 KST 2022 -->
        	   <fmt:formatDate value="${now }" /><br>  
        	   <!-- parseDate의 pattern은 value 값의 형식을 알려줍니다. pattern이 없으면 날짜 타입으로 변환을 못함..(문자열을 날짜 타입으로 캐스팅)-->
        	   <fmt:parseDate value="2022-11-03 20:14" var="datetime1" pattern="yyyy-MM-dd HH:mm"/> 
        	    지정된 시간과 날짜 : <c:out value="${datetime1 }"/>
        	    <hr>
        	   <fmt:formatDate value="${datetime1 }" type="date"/><br>  <!-- Jan 20, 2023 -->
        	   <fmt:formatDate value="${datetime1 }" type="time"/><br>  <!-- 10:35:29 AM -->
        	   <fmt:formatDate value="${datetime1 }" type="both"/><br>  <!-- Jan 20, 2023, 10:35:29 AM -->
        	   <hr>
        	   <fmt:formatDate value="${datetime1 }" pattern="yyyy-MM-dd HH:mm:ss"/><br> 
        	   <!-- 2022-11-03 20:14:00  시간이 24시 기준(HH)-->
        	   <fmt:formatDate value="${datetime1 }" pattern="yyyy-MM-dd a hh:mm:ss"/><br>
        	   <!-- 2022-11-03 PM 08:14:00   시간이 12시 기준(hh). a는 오전/오후 표시-->
    • fn : 함수.문자열 메소드를 함수형태로 사용 (자바의 문자열 메소드와 상당부분 일치)
      • core, fmt 라이브러리는 태그를 제공
      • fn 라이브러리는 함수를 사용할 수 있게 함
        • 문자열 메소드의 결과값이 태그 안에서 출력되도록 함
        • “${fn: 메소드()}”
      • 코드
        <ul>
        			<li><c:out value="${fn:length(msg)}"/></li>
        			<li><c:out value="${fn:indexOf(msg,'am')}"/></li>
        			<li><c:out value="${fn:toUpperCase(msg)}"/></li>
        			<li><c:out value="${fn:substring(msg,3,6)}"/></li>
        			<li><c:out value="${fn:contains(msg,'am')}"/></li>
        			<li><c:out value="${fn:contains(msg,'are')}"/></li>
        			<li><c:out value="${fn:replace(msg,'Twice','Viviz')}"/></li>
        			<c:set value="he                llo           !" var="temp"/>
        			<li><c:out value="${temp }"/>공백 하나만 출력되는 이유: html 문서에는 공백이 하나만 반영됨, 연속적으로 출력하고 싶은 경우 &nbsp;사용해야함 </li>
        			<li><c:out value="${fn:replace(temp,' ','&nbsp;')}"/></li>
        			<li>${fn:replace(temp,' ','&nbsp;')}</li>
        			<!-- 리턴이 발생하는 split은 c:set 으로 실행, 리턴받을 var 정의 -->
        			<c:set value="${fn:split(msg,' ')}" var="temps"/>
        			
        		</ul>
        		<h4>msgArr 배열 애트리뷰트값을 하나씩 출력</h4>
        		<ul>
        			<c:forEach items ="${msgArr }" var="arr" varStatus="status">
        				<li><c:out value="${arr }"/></li>
        			</c:forEach>
        	</ul>
    • EL : ${} 은 getAttribute로 값을 가져와서 출력 → <%= =>의 대체
      • 객체변수명.getXXX() getter 메소드 사용... -> EL은 알아서 getter 동작. 객체의 속성 이름 정확히 작성

스크립트 요소

  • 선언부
    • 변수나 메서드 선언 : <%! %>
    • 스클립틀릿 - 자바 코드 : <% %>
      • 메서드 호출만 가능, 생성 X (_jspService() 메서드의 하위 객체이기에)
    • 표현식 <%= %>
      • 실행결과로 하나의 값이 남는 문장(상수, 변수, 수식, 반환값이 있는 메서드 호출...)
    • 코드 예시
      <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
      <%! public int add(int num1, int num2){                             -> 선언부
      	return num1+num2;}
      <html><head/>
      <body>
      <% int result = add(10, 20); %>                                     ->스클립틀릿
      덧셈결과 1: <%=result%> <br/>                                       ->표현식
      덧셈결과 2:  <%=add(30,40)%>  </body></html>

내장객체

  • 특징
    • 컨테이너가 미리 선언한 참조변수 이용
    • 별도의 객체 생성 없이 내장 객체의 메서드 사용 가능
    • JSP문서 안의 <%스클립틀릿%> 과 <%= 표현식%>에서만 가능 / <%!선언부%> 에서 즉시 X, 매개변수로 전달 O
      내장객체데이터 타입
      requestjavax.servlet.http.HttpServletRequest
      responsejavax.servlet.http.HttpServletResponse
      sessionjavax.servlet.http.HttpSession
      applicationjavax.servlet.ServletContext
      configjavax.servlet.ServletConfig
      outjavax.servlet.jsp.JspWriter
      pageContextjavax.servlet.jsp.PageContext
      • out: 변수 등 값을 웹에 출력시 주로 사용 → out.print();
      • exception: 예외 처리를 위해 사용

영역

  1. page: 동일한 페이지에서만 공유, 페이지 벗어날 시 소멸

  2. session: 접속후, 웹브라우저 닫을때까지

    1. 주로 로그
  3. request

  • 사용자가 보낸 요청에 대한 정보를 저장하는 객체
  • 클라이언트가 전송한 요청 매개변수에 대한 정보 읽기
  • request 의 파라미터 사용→처리 해야할 사용자 데이터 request (요청)
    1. url 의 쿼리스트링 (조회)
      a 태그 href 속성값으로 정하기.
      자바스크립트의 location.href = '요청 url과 쿼리스트링'

    2. form 태그 사용 (저장)

      *쿼리스트링: URL 뒤 → “?키=값&키=값”

    3. GET → 파라미터 값 노출 됨/ POST → 파라미터 값 노출안됨

    • 환경정보
      <li>요청 URL: <%= request.getRequestURL() %></li>
      <li>요청 URI: <%= request.getRequestURI() %></li> 
      <li>컨텍스트(context): <%=request.getContextPath() %></li>
      <li>쿼리스트링: <%=request.getQueryString() %></li>     ->키와 값 전체 (GET일때만 가능)
      <li>값의 일부: <%=request.getParameter("han") %></li>   -> "han" 원하는 값의 키(1개)
      <li>여러 값: <%=request.getParameterValues("favo") %></li>   -> "favo"키의 여러값 (foreach로 담기)
      
      <li>클라이언트 ip : <%= request.getRemoteAddr() %></li>
      <li>클라이언트 host : <%= request.getRemoteHost() %></li>
      <li>클라이언트 포트 : <%= request.getRemotePort() %></li>
      <!-- 기준이 서버이므로 remote 멀리 떨어진 것이 클라이언트.. local이 서버 -->
      <li> 서버 ip : <%= request.getLocalAddr() %></li>
      <li> 서버 name : <%= request.getLocalName() %></li>
      <li> 서버 port : <%= request.getLocalPort() %></li>
      ----------------------------------------------------------------------
      요청 URL : http://192.168.30.254:8088/jsp1/day2/9_request.jsp
      요청 URI : /jsp1/day2/9_request.jsp    -> 실제 자원 위치
      컨텍스트(context) : /jsp1				//이클립스에서 프로젝트 이름을 기본으로 설정
      클라이언트 ip :192.168.12.5
      클라이언트 host : 192.168.12.5
      클라이언트 포트 : 52335				//클라이언트에서 요청을 보내는 포트(임의의 값)
      서버 ip :192.168.30.254
      서버 Name : DESKTOP-HUJUVSS
      서버 포트 : 8088					//특정 서비스 진입하는 포트
    • 포워드된 페이지에서 request 속성값 읽기
      req.setCharacterEncoding("UTF-8"); ->한글 입력시 필수 
      
      RequestDispatcher dispatcher = request.getRequestDispatcher("../../webapp/member/list.jsp");
      		dispatcher.forward(request, response);
    • 파라미터
      • 파라미터 보내기
        <ul>
        <li><a href="5_param_receive.jsp?name=sana&age=24">1. name, age 2개의 파라미터 보내기</a></li>
        <li><a href="5_param_receive.jsp?name=sana">2. name, age 2개의 파라미터 보내기-age 파라미터 없음</a></li>
        <li><a href="5_param_receive.jsp?name=sana&age=">3. name, age 2개의 파라미터 보내기-age값 없음</a></li>
        </ul>
        1. 정상작동
        2. age = null
        3. age = 공백
      • 파라미터 받기
        <body><%
        	TblCustomerDao dao = new TblCustomerDao();
        	String name = request.getParameter("name");
        	String temp = request.getParameter("age");
        	List<CustomerVo> list = null;
        	if((name !=null && name.length()!=0)&&(temp!=null && temp.length() !=0)){
        		int age = Integer.parseInt(temp);
        		list = dao.selectBy(name, age);
        		out.print(list);
        		if(list.size()==0) out.print("<h4>조회결과가 없습니다</h4>");
        	} else{
        		out.print("파라미터 값을 모두 입력하세요");
        	}
        %></body>
    • GET
      • get 요청을 처리하는 메소드 - 인자 2개 (XXXRequest, XXXResponse .. 요청과 응답에 대한 처리 가능)
      • 사용자 요청을 request 객체에 저장하면서 동시에 응답을 전달할 객체 response가 생성됨
      • URL: 전체경로 , URI:프로젝트 파일경로 , ContextPath: 프로젝트실행의 시작점(주소창 확인하면서 url 지정)
        • 정보: [MyInfo]: request URL :http://localhost:8088/jsp1/first.cc , URI: /jsp1/first.cc, ContextPath: /jsp1

          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          //사용자 요청에 대한 정보출력(request 객체의 속성값): 로그 출력에서 {}는 결과값 표시     ->{} 순서대로 () 가 들어감
          logger.info("\n[MyInfo]: request URL :{} , URI: {}, 컨텍스트패스: {}",
          request.getRequestURL(),request.getRequestURI(), request.getContextPath());
      • 코드 예시
        //고객전체 조회 요청은 a 태그 메뉴이므로 GET 방식 요청
        @WebServlet(urlPatterns = {"/customers.cc"}, description="고객 전체 조회")
        public class CustomerServlet extends HttpServlet{
        
        	private static final long serialVersionUID = 1L;
        	private static final Logger logger = LoggerFactory.getLogger(CustomerServlet.class);
        
        @Override
        	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        		//dao 실행하고 리턴받은 list를 로그로 찍어보기
        		TblCustomerDao dao = new TblCustomerDao();
        		List<CustomerVo> list = dao.allCustomers();
        		logger.info("[@,@] 전체 고객 조회: {}",list);
        		
        		//뷰(jsp)에 애트리뷰트 값을 저장해서 보내기
        		//페이지 컨텍스트는 하나의 웹페이지 범위, request(매개변수명)는 하나의 요청 범위로 애트리뷰트 저장.
        		req.setAttribute("list",list);
        		
        		//뷰 jsp로 '요청'을 '전달-애트리뷰트'하고 화면을 전환(forward)해야 함
        		RequestDispatcher dispqtcher = req.getRequestDispatcher("/day3/Customers.jsp");
        		dispqtcher.forward(req, resp); //forward가 전달..
        		//실행 브라우저: url: http://localhost:8088/jsp1/customers.cc
        		//화면 웹페이지는 customers.jsp
        	}
    • POST
      //register.jsp 화면에서 입력된 값을 post 방식으로 전달받기
      	@Override
      	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      		//POST 요청값 인코딩 필수
      		req.setCharacterEncoding("UTF-8");
      		
      		logger.info("[MyInfo]고객 데이터 저장이 요청되었습니다.");
      		String userid = req.getParameter("userid");
      		String name = req.getParameter("name");
      		String email = req.getParameter("email");
      		String temp = req.getParameter("age");
      		//나이가 필수 입력이 아니라면 값이 비어있을수 있음. 그때 parseint 확인 해보기 => 오류 발생
      		int age = 0;
      		//form 태그 요소에 name="age"가 있으므로 temp가 null일 경우는 없음 ->post에서는 입력요소가 있다면 무조건 공백으로라도 채워져있음/ get은 공백 O
      		if(temp.length() !=0) age = Integer.parseInt(temp);
      		
      		//dao의 메소드 인자로 전달할 vo 객체 생성하기-join 메소드 
      		 CustomerVo vo= new CustomerVo(userid, name, email, age, null);
      		 logger.info("\t 입력값 vo: {}", vo);
      		 
      		 TblCustomerDao dao = new TblCustomerDao();
      		 dao.join(vo); // pk 아이디 중복값있으면 무결성 오류 발생
      		
      		 //서버가 클라이언트에게 응답을 보냄 ->"customers.cc로 요청을 보내라
      		 resp.sendRedirect("customers.cc");
      		 //리다이렉트는 웹페이지의 js, out.print .. 출력 사용 불가능}

ㄴ 모든 jsp페이지 공유, 이동 혹은 요청 응답 완료시 소멸

  1. application: 웹 애플리케이션 종료 시까지
  • 주요 메소드 (get,set)
    void setAttribute(String name, Object value)
    -속성값 저장: name=속성명 , value= 저장할 값
    Object getAttribute(String name)
    -속성값 불러오기
    void removeAttribute(String name)
    -저장된 속성 삭제(존재하지 않아도 오류 X)
profile
:) GITHUB: https://github.com/YJ2123412

0개의 댓글