ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 학원 day45. JSP(2) 구성요소, 내장객체, 요청파라미터값 전달방식
    기록 2022. 11. 8. 13:52

    JSP 구성요소

    디렉티브(지시어)

    • JSP페이지에 대한 설정 정보를 정의한다.

    page 디렉티브

      <%@ page 속성="속성값" />
      <%-- jsp페이지에 대한 정보를 설정한다. -->
    • page 디렉티브의 주요 속성
      • contentType
        • 응답컨텐츠의 타입 및 인코딩방식을 설정
        • 설정예)
          <%@ page contentType="text/html; charset=utf-8" %>  <%-- JSP의 실행결과로 html이 응답으로 내려간다 --%>  
          <%@ page contentType="text/xml; charset=utf-8" %>
          <%@ page contentType="application/json; charset=utf-8" %>
          <%@ page contentType="text/plain; charset=utf-8" %>
      • pageEncoding
        • jsp 파일을 저장할 때 사용할 인코딩방식을 설정(UTF-8 : 한글의 경우, 2바이트의 유니코드를 3바이트로 변환하여 저장하는 방식)
        • 설정예)
          <%@ page pageEncoding="utf-8" %>
      • import
        • jsp 파일에서 사용되는 클래스에 대한 import문 역할 수행
        • 설정예)
          <%@ page import="java.util.List"%>
          <%@ page import="java.util.List,java.util.ArrayList"%>
      • errorPage
        • jsp파일 실행 중 에러 발생시 표시할 페이지를 설정
        • 설정예)
          <%@ page errorPage="serverError.jsp" %>
      • isErrorPage
        • 에러페이지로 사용되는 jsp 페이지인지 여부를 설정
        • isErrorPage 속성은 에러페이지로 사용되는 jsp에 설정하는 속성이다.
        • isErrorPage="true"로 설정하면, 이전페이지에서 발생한 예외객체를 전달받을 수 있다.
        • 설정예)
          <%@ page isErrorPage="true" %>

    • trimDirectiveWhiteSpace
      • 디렉티브 정의로 발생되는 빈줄을 삭제할지 여부를 설정
      • 설정예)
        <%@ page trimDirectiveWhiteSpace="true" %>

    +) autoFlush : JspWriter라는 객체가 서버에서 브라우저쪽으로 HTML컨텐츠를 내려보내주는데, 내부적으로 버퍼를 갖고 있다. 버퍼가 가득차면 내려보내게 되는데 버퍼가 가득차지 않아도 자동으로 Flush배출시켜주는 기능을 켜는 설정이다. 버퍼(임시저장소)가 있으면 읽고 쓰는 속도가 향상된다

     

    include 디렉티브

      <%@ include file="현재페이지에 포함시킬 jsp파일의 경로와 이름" />
    • JSP 페이지에 다른 jsp페이지를 포함시킨다.
    • include 디렉티브의 주요 속성
      • file
        • 현재 페이지에 포함시킬 jsp파일의 경로와 이름을 지정한다.
        • 설정예)
          <%@ include file="common/header.jsp" %>

     

    taglib 디렉티브 (태그 라이브러리 디렉티브)

      <%@ taglib prefix="속성값" uri="속성값" />
    • JSP 페이지에서 사용할 커스텀 태그 라이브러리나 JSP표준태그 라이브러리를 정의한다.
    • taglib 디렉티브의 주요 속성 (나중에 배울 예정)
      • prefix
        • 태그 라이브러리 적용시 사용되는 별칭을 지정한다.
      • uri
        • jsp페이지에서 사용할 태그라이브러리 식별자를 정의한다.
          <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
          <%@ prefix="fmt" taglib="http://java.sun.com/jsp/jstl/fmt" %>

    스크립트 요소

    • JSP에서 로직을 수행하거나, 변수의 값을 출력에 포함시키거나, 메소드를 정의하거나 할 때 사용한다.

    스크립트릿

      <%
        자바코드를 작성할 수 있다.
      %>
    • JSP 페이지에서 자바코드를 실행할 수 있게 한다.
    • JSP가 자바파일로 변환될 때, _jspService메소드내에 포함되는 코드를 작성할 수 있게 한다.
    • 사용예)
      <%
        int x = 10;
        EmployeeService service = new EmployeeService();
        
        // 접근제한자를 가지는 변수를 정의할 수 없다., jspService라는 메소드 안에 들어가는데 메소드 안에서는 접근제한자를 사용할 수 없기 때문
        private int y = 10;	// 오류
        
        // 메소드를 정의할 수 없다. 
        private void log(Employee emp) {
          System.out.println(emp.getName());
        }
      %>

    표현식

      <태그><%=값 %></태그>
      <태그><%=값을 반환하는 메소드 %></태그>
    • 응답컨텐츠에 포함되어서 클라이언트로 전송되게 한다.
    • 변수에 저장된 값이나, 메소드의 실행결과로 획득되는 반환값을 표현식에서 사용할 수 있다.
    • 표현식 안에 세미콜론 붙이지 않는다는 것에 유의하기! 자바로 변환될 때 out.print(emp.getName();); <-이렇게 되어버리기 때문!
    • 사용예)
      <% 
        int empNo = 100;
        EmployeeService employeeService = EmployeeService.getInstance();
        Employee emp = employeeService.getEmployeeDetailInfo(empNo);
      %>
      <table>
        <tr>
          <th>직원이름</th><td><%=emp.getName() %></td>   //emp.getName()뒤에 세미콜론 안붙인다는거 주의하기!!
          <th>소속부서번호</th><td><a href="dept.jsp?deptno=<%=emp.getDeptNo() %>"><%=emp.getDeptNo() %></a></td>
          <th>전화번호</th><td><input type="text" value="<%=emp.getTel() %>" /></td>
        </tr>
      </table>

    선언식

      <%!
        private DecimalFormat df = new DecimalFormat("##,###");
        private String numberToCurrency(long number) {
          return df.format(number);
        }
      %>
    • JSP페이지에 새로운 필드나 새로운 메소드를 정의(선언)할 때 사용한다.
    • 사용빈도는 그렇게 높지 않다.

    주석

      <%-- jsp 주석을 여기에 적는다. --%>
      
      <%-- 아래의 모든 코드는 주석처리되어서 실행되지 않는다. --%>
      <%--
        int bookNo = Integer.parseInt(request.getParameter("no"));
        BookService bookService = BookService.getInstance();
        Book book = bookService.getBookInfo(bookNo);
      --%>
    • jsp주석을 추가한다. 자바코드로 변환될 때 제외된다.

    JSP의 내장객체

    • JSP 페이지가 자바코드로 변환될 때 _jspService메소드에서 사용가능한 객체
    • JSP는 웹 애플리케이션 개발에 필요한 객체를 미리 생성(획득)해서 적절한 변수에 저장하고, 스크립트릿에서 사용가능한 상태로 초기화시켜놓는다.

    -> 브라우저에서 sample.jsp 실행을 요청하면 jsp쪽의 코드가 jsp 내장객체가 준비된 곳 아래에 위치하게 된다.

    따라서, jsp의 모든 내장객체(8개)를 사용할 수 있다. 

     

    변수명 / 클래스명 / 설명

    request HttpServletRequest 클라이언트가 보낸 요청메세지 정보를 저장한다.
    response HttpServletResponse 클라이언트로 보낼 응답메세지 정보를 저장한다.
    session HttpSession 세션정보를 저장한다.(로그인처리와 관련)
    out JspWriter 응답컨텐츠를 클라이언트로 출력하는 스트림
    application ServletContext 웹 애플리케이션을 나타내는 객체다..
    config ServletConfig 서블릿의 초기화에 필요한 정보를 저장한다.
    pageContext PageContext JSP 페이지에 대한 정보를 저장한다.
    exception Throwable 에러정보를 저장한다.(isErrorPage="true")에서만 사용가능
    page Object JSP 페이지를 구현한 자바객체가 저장된다.

    -> HTTP요청메세지를 받으면 톰캣이 자동으로 웹애플리케이션을 실행시키기 위해 필요한 객체들을 만들어준다. 그리고 객체들을 변수안에 넣어놓는다. 

    톰캣은 요청을 받으면 항상 2개의 객체(HttpServletRequest, HttpServletResponse)를 만든다.

    Http 요청메시지를 분석해서 HttpServletRequest에 요청정보를 담는다.

    톰캣이 실행되면 ServletContext라는 객체가 생성된다.

    jsp 객체마다 ServletConfig라는 객체가 자동으로 생성된다. 

    PageContext객체는 _jspService 안에 만들어진다.


    HttpServletRequest 

    • request 변수에 저장된다. (HttpServletRequest객체는 요청이 올때마다 매번 새롭게 만들어진다.)
    • 클라이언트가 서버로 보낸 모든 요청 메세지를 저장하고 있다
    • 요청메세지정보를 획득할 수 있는 다양한 getXXX() 메소드를 제공한다.
    • HttpServletRequest는 사실 인터페이스이고 톰캣은 이를 구현한 객체를 생성하고 있는 것임.

    HttpServletRequest 인터페이스

    • 주요 메소드

    반환타입 / 메소드명 / 설명

    String getParameter(String name) 지정된 이름의 요청파라미터값을 반환한다.
    요청파라미터값이 없으면 null을 반환한다
    String[] getParameterValues(String name) 지정된 이름의 모든 요청파라미터값을 배열의 형태로 반환한다
    요청파라미터값이 없으면 null을 반환한다
    void setCharacterEncoding(String encoding) 요청파라미터값을 지정된 인코딩방식으로 복원한다
    void setAttribute(String name, Object value) 요청객체에 이름,객체 쌍의 속성(객체)을 저장한다.
    Object getAttribute(String name) 요청객체에서 지정된 이름으로 저장된 속성(객체)를 반환한다.
    지정된 이름의 속성이 존재하지 않으면 null을 반환한다.
    void removeAttribute(String name) 요청객체에서 지정된 이름으로 저장된 속성(객체)을 삭제하다.
    HttpSession getSession() 요청객체의 세션아이디에 해당하는 세션객체를 반환한다.
    세션아이디가 없으면 세션객체를 새로 생성한 후 반환한다.
    세션아이디에 해당하는 세션객체가 없으면 새로 생성한 후 반환한다
    HttpSession getSession(boolean create) create값을 true로 설정하면 위의 getSession() 메소드와 동일.
    create값을 false로 설정하면 세션아이디에 해당하는 세션객체가
    있을 때만 세션객체를 반환하고, 아닌 경우 null을 반환한다
    String getHeader(String name) 지정된 이름의 요청헤더값을 반환한다
    String getRequestURI() 요청 URI 경로를 반환한다
    String getContextPath() 현재 웹애플리케이션의 컨텍스트 경로를 반환한다
    String getRemoteAddr() 요청을 보낸 클라이언트의 ip주소를 반환한다
    String getMethod() 요청방식을 반환한다. (get/post방식)
    Locale getLocale() 클라이언트의 로케일 정보(브라우저의 기본언어, 국가정보)를 반환한다.

    요청메세지

    <%@page import="java.util.Locale"%>
    <%@ 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>
    <body>
    	<h1>HttpServletRequest 객체</h1>
    	<p><%=request %></p>
    	<%
    		// HttpServletRequest의 주요 메소드
    		
    		// String getMethod()는 요청방식을 반환한다.
    		String method = request.getMethod();
    	
    		//String getContextPath()는 웹 애플리케이션의 context path를 반환한다.
    		String contextPath = request.getContextPath();
    		
    		// String getRequestURI()는 요청 URI를 반환한다.
    		String requestURI = request.getRequestURI();
    		
    		//String getRemoteAddr()은 서버로 요청을 보낸 클라이언트의 ip주소를 반환한다.
    		String ipAddress = request.getRemoteAddr();
    		
    		//String getLocale()은 서버로 요청을 보낸 클라이언트의 로케일 정보(브라우저의 기본언어, 국가정보)를 반환한다.
    		Locale locale = request.getLocale();
    		
    		// String getHeader(String name)은 요청메세지의 요청 헤더정보(클라이언트에 관한 부가정보)를 반환한다.
    		String agent = request.getHeader("user-agent");
    		String accept = request.getHeader("accept");
    		String acceptEncoding = request.getHeader("accept-encoding");
    		String acceptLanguage = request.getHeader("accept-language");
    	%>
    	
    	<h3>요청객체가 가지고 있는 주요 정보</h3>
    	<dl>
    		<dt>요청방식</dt><dd><%=method %></dd> 
    		<dt>컨텍스트 패스</dt><dd><%=contextPath %></dd>
    		<dt>요청 URI</dt><dd><%=requestURI %></dd>
    		<dt>클라이언트의 ip 주소</dt><dd><%=ipAddress %></dd>
    		<dt>클라이언트의 로케일정보</dt><dd><%=locale %></dd>
    	</dl>
    	
    	<h3>요청메세지의 헤더정보</h3>
    	<dl>
    		<dt>클라이언트의 브라우저 정보</dt><dd><%=agent %></dd>
    		<dt>클라이언트의 브라우저가 지원하는 컨텐츠 타입</dt><dd><%=accept %></dd>
    		<dt>클라이언트의 브라우저가 지원하는 컨텐츠 압축 방식</dt><dd><%=acceptEncoding %></dd>
    		<dt>클라이언트의 브라우저가 지원하는 언어</dt><dd><%=acceptLanguage %></dd>
    	</dl>
    </body>
    </html>


    요청파라미터값 전달 방법 3가지

    1. 링크에서 요청URL 뒤에 Query String 붙여놓기

    -> 클라이언트는 서버에게 어떤 jsp객체를 실행해야 하는지 알려주는 것도 중요하지만, 어떤 책을 골랐는지도 알려줘야 한다. 따라서, URL뒤에 부가적인 정보를 붙여서 detail.jsp 객체에게 어떤 책의 상세정보를 불러와야 하는지 알려준다. ?물음표 뒤에 쿼리스트링을 붙여서 요청파라미터값을 전달하는 방법이 있다. 쿼리스트링은 클라이언트에서 서버로 값을 전해주는 방법이다. 요청파라미터란, 클라이언트가 서버에게 보내는 정보를 뜻한다.  

     

    요청메시지를 받으면 톰캣은 항상 내부에 요청객체와 요청응답객체를 만드는데 요청객체 안에는 요청헤더정보 요청파라미터정보가 들어있다. 

    첫번째 방법에서는 쿼리스트링 안에 들어간 것이 요청파라미터 정보가 된다. 쿼리스트링은 name=value로 구성된다.

     

    * request객체에 있는 가장 중요한 메소드

    // String getParameter(String name)

    // 지정된 이름의 요청파라미터값을 반환한다.

    String value = request.getParameter("bookNo");

    * value의 값은 "1001"이다.

    Book book = bookService.getBookDetail(value);

     

    <table>

    <tr>

    <th>제목</th><%=book.getTitle() %></td>

    <th>저자</th><%=book.getAuthor() %></td>

    <th>출판사</th><%=book.getPublisher() %></td>

    </tr>

    </table>

     

    < sample-4.jsp >

    <%@ 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>
    <body>
    	<h1>쿼리스트링으로 sample-5.jsp에 요청파라미터값 전달하기</h1>
    	
    	<h3>도서목록</h3>
    	<ul>
    		<li><a href="sample-5.jsp?no=1001">이것이 자바다</a></li>
    		<li><a href="sample-5.jsp?no=1002">자바의 정석</a></li>
    		<li><a href="sample-5.jsp?no=1004">혼자서 공부하는 자바</a></li>
    		<li><a href="sample-5.jsp?no=1005">혼자서 공부하는 파이썬</a></li>
    		<li><a href="sample-5.jsp?no=1006">스프링 인 액션</a></li>
    		<li><a href="sample-5.jsp?no=1008">스프링 클라우드로 개발하는 마이크로서비스</a></li>
    	</ul>
    </body>
    </html>

    sample-4 실행결과

    < sample-5.jsp >

    <%@ 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>
    <body>
    	<h1>sample-4.jsp에서 쿼리 스트링으로 전달한 요청파라미터값 조회하기</h1>
    	
    	<%
    		String value = request.getParameter("no");
    	%>
    	<p>sample-4.jsp에서 sample-5.jsp로 전달한 값 : <%=value %></p>
    </body>
    </html>

    sample-5 실행결과

     

    2. 입력폼을 이용해서 요청파라미터값을 입력받고 get방식(URL뒤에 쿼리스트링 붙이기)으로 전달하기

    -> form의 method="get"으로 지정하고 submit 버튼을 눌러서 폼 입력값을 제출한다.

    GET방식의 요청메세지

    <h2>Get방식 - 입력폼을 이용해서 요청파라미터값 전달하기</h2>
    	<form method="get" action="sample-5.jsp">
    		<select name="opt">
    			<option value="title">제목</option>
    			<option value="author">저자</option>
    			<option value="publisher">출판사</option>
    			<option value="content">내용</option>
    		</select>
    		<input type="text" name="keyword"/>
    		<button type="submit">검색</button>
    	</form>

    <h3>GET방식 - 입력폼으로 전달한 요청파라미터값 조회</h3>
    	<%
    		String searchOption = request.getParameter("opt");
    		String searchKeyword = request.getParameter("keyword");
    	%>
    	<p>입력폼의 검색 옵션값: <%=searchOption %></p>
    	<p>입력폼의 검색 키워드: <%=searchKeyword %></p>

     

    3. 입력폼을 이용해서 요청파라미터값을 입력받고 POST방식(요청메시지 바디부에 요청파라미터값을 담는 방식)으로 전달하기

    POST방식의 요청메세지

    -> form의 method="post"으로 지정하고 submit버튼을 눌러서 폼 입력값을 제출한다.

    값이 제대로 들어갔는지 검사페이지의 Payload에서 확인할 수 있다.

    	<h2>Post방식 - 입력폼을 이용해서 요청파라미터값 전달하기</h2>
    	<form method="post" action="sample-5.jsp">
    		<div>
    			<label>이메일</label>
    			<input type="email" name="email" />
    		</div>
    			<div>
    			<label>비밀번호</label>
    			<input type="password" name="password" />
    		</div>
    			<div>
    			<label>비밀번호 확인</label>
    			<input type="password" name="passwordConfirm" />
    		</div>
    			<div>
    			<label>이름</label>
    			<input type="text" name="name" />
    		</div>
    			<div>
    			<label>전화번호</label>
    			<input type="text" name="phone" />
    		</div>
    			
    			<button type="submit">회원가입</button>
    	</form>

    <h3>POST방식 - 입력폼으로 전달한 요청파라미터값 조회</h3>
    	<%
    		String email = request.getParameter("email");
    		String password = request.getParameter("password");
    		String passwordConfirm = request.getParameter("passwordConfirm");
    		String name = request.getParameter("name");
    		String phone = request.getParameter("phone");
    	%>
    	<p>이메일: <%=email %></p>
    	<p>비밀번호: <%=password %></p>
    	<p>비밀번호 확인: <%=passwordConfirm %></p>
    	<p>이름: <%=name %></p>
    	<p>전화번호: <%=phone %></p>


    <브라우저와 웹서버간의 요청과 응답>

    댓글

Designed by Tistory.