2022년 5월 26일 목요일

JSP 02 내장 객체

 내장 객체 특징

  • 컨테이너가 미리 선언해 놓은 참조 변수를 이용해 사용
  • 별도의 객체 생성 없이 각 내장 객체의 메서드 사용
  • JSP 문서 안의 <% 스크립틀릿 %> 과 <%= 표현식 %> 에서만 사용 가능
  • <%! 선언부 %> 에서는 즉시 사용은 불가능, 매개변수로 전달 받아 사용 가능


request 객체 : 클라이언트가 전송한 요청 정보를 담고 있는 객체

  • 클라이언트와 서버에 대한 정보 읽기
  • 클라이언트가 전송한 요청 매개변수에 대한 정보 읽기
  • 요청 헤더 및 쿠키 정보 읽기


//GET 방식으로 요청
 <a href="./RequestWebInfo.jsp?eng=Hello&han=안녕"> 

//POST 방식으로 요청
<form action="RequestWebInfo.jsp" method="post">  
        영어 : <input type="text" name="eng" value="Bye" /><br />
        한글 : <input type="text" name="han" value="잘 가" /><br />
        <input type="submit" value="POST 방식 전송" />
</form>

//클라이언트와 서버의 환경 정보 읽기
<body>
    <ul>
        <li>데이터 전송 방식 : <%= request.getMethod() %></li>
        <li>URL : <%= request.getRequestURL() %></li>
        <li>URI : <%= request.getRequestURI() %></li>
        <li>프로토콜 : <%= request.getProtocol() %></li>
        <li>서버명 : <%= request.getServerName() %></li>
        <li>서버 포트 : <%= request.getServerPort() %></li>
        <li>클라이언트 IP 주소 : <%= request.getRemoteAddr() %></li>
        <li>쿼리스트링 : <%= request.getQueryString() %></li>
        <li>전송된 값 1 : <%= request.getParameter("eng") %></li>
        <li>전송된 값 2 : <%= request.getParameter("han") %></li>
    </ul>
</body>

내장 객체 - request
<body>
<%
<!--한글인 경우 깨지기에 다국어 지원하는 UTF-8로 설정 -->
request.setCharacterEncoding("UTF-8");  

<!--전송되는 값이 1개라면 getParameter -->
String id = request.getParameter("id");    
String sex = request.getParameter("sex");

<!-- 전송되는 값이 2개 이상이면 getParameterValues -->
String[] favo = request.getParameterValues("favo");  
String favoStr = "";

<!-- favo  값이 있으면 반복해서 하나의 문자열로 합침 -->
if (favo != null) {  
    for (int i = 0; i < favo.length; i++) {
        favoStr += favo[i] + " ";
    }
}
String intro = request.getParameter("intro").replace("\r\n", "<br/>");  
%>
<ul>
    <li>아이디 : <%= id %></li>
    <li>성별 : <%= sex %></li>
    <li>관심사항 : <%= favoStr %></li>
    <li>자기소개 : <%= intro %></li>
</ul>
</body>

요청 헤더 정보 출력하기
<body>
    <%
    Enumeration headers = request.getHeaderNames();  
    while (headers.hasMoreElements()) {  
        String headerName = (String)headers.nextElement();  
        String headerValue = request.getHeader(headerName); 
        out.print("헤더명 : " + headerName + ", 헤더값 : " + headerValue + "<br/>");
    }
    %>
    <p>이 파일을 직접 실행하면 referer 정보는 출력되지 않습니다.</p>
</body>

response 객체 : 요청에 대한 응답을 웹 브라우저로 보내는 역할
  • 페이지 이동을 위한 redirect
  • HTTP 헤더에 응답 헤더 추가

<body>
<%
<!--request 내장 객체로 전송된 매개 변수를 얻어옴-->
String id = request.getParameter("user_id");
String pwd = request.getParameter("user_pwd"); 

<!--회원 인증(테스용으로 하드 코딩)-->
if (id.equalsIgnoreCase("must") && pwd.equalsIgnoreCase("1234")) {
    <!--로그인 환영 페이지로 이동-->
    response.sendRedirect("ResponseWelcome.jsp");
}
else {
    <!--첫 화면으로 이동 + 로그인 실패 에러 출력-->
    request.getRequestDispatcher("ResponseMain.jsp?loginErr=1")
       .forward(request, response); 
}
%>
</body>

HTTP 헤더에 응답 헤더 추가, 수정하기  
<%
// 응답 헤더에 추가할 값 준비 
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm");
long add_date = s.parse(request.getParameter("add_date")).getTime(); 

java.sql.Date date2 = new java.sql.Date(add_date); 
System.out.println(date2);

int add_int = Integer.parseInt(request.getParameter("add_int"));
String add_str = request.getParameter("add_str");

// 응답 헤더에 값 추가(add), 수정(set)
response.addDateHeader("myBirthday", add_date);
response.addIntHeader("myNumber", add_int);
response.addIntHeader("myNumber", 1004); // 추가
response.addHeader("myName", add_str);
response.setHeader("myName", "안중근");  // 수정
%>
<html>
<head><title>내장 객체 - response</title></head>
<body>
    <h2>응답 헤더 정보 출력하기</h2>
    <%
    Collection<String> headerNames = response.getHeaderNames();
    for (String hName : headerNames) {
        String hValue = response.getHeader(hName);
    %>
        <li><%= hName %> : <%= hValue %></li>
    <%
    }   
    %>
    
    <h2>myNumber만 출력하기</h2>
    <%
Collection<String> myNumber = response.getHeaders("myNumber");
for (String myNum : myNumber) {
%>
<li>myNumber : <%= myNum %></li>
<%
}
%>
</body>
</html>

out 객체 : 스크립틀릿 내에서 변수를 브라우저에 출력해야 한다면 out 내장 객체 사용
<body>
    <%
    // 버퍼 내용 삭제하기
    out.print("출력되지 않는 텍스트");  // 버퍼에 저장  
    out.clearBuffer();  // 버퍼를 비움(윗 줄의 출력 결과 사라짐) 

    out.print("<h2>out 내장 객체</h2>");

    // 버퍼 크기 정보 확인
    out.print("출력 버퍼의 크기 : " + out.getBufferSize() + "<br>");
    out.print("남은 버퍼의 크기 : " + out.getRemaining() + "<br>"); 

    out.flush();  // 버퍼 내용 출력 
    out.print("flush 후 버퍼의 크기 : " + out.getRemaining() + "<br>");

    // 다양한 타입의 값 출력
    out.print(1);
    out.print(false);
    out.print('가');
    %>
</body>

application 객체 :  웹 애플리케이션당 1개만 생성되며 모든 JSP 페이지에서 접근 가능. 전반에서 사용하는 정보를 저장하거나, 서버의 정보 등을 얻어오는데 사용
<body>
    <h2>web.xml에 설정한 내용 읽어오기</h2>
    초기화 매개변수 : <%= application.getInitParameter("INIT_PARAM") %>

    <h2>서버의 물리적 경로 얻어오기</h2>
    application 내장 객체 : <%= application.getRealPath("/02ImplicitObject") %>

    <h2>선언부에서 application 내장 객체 사용하기</h2>
    <%!
    public String useImplicitObject() {
        return this.getServletContext().getRealPath("/02ImplicitObject");
    }
    public String useImplicitObject(ServletContext app) {
        return app.getRealPath("/02ImplicitObject");
    }
    %>
    <ul>
        <li>this 사용 : <%= useImplicitObject() %></li>
        <li>내장 객체를 인수로 전달 : <%= useImplicitObject(application) %></li>
    </ul>
</body>

exception 객체 :  오류명과 오류 메시지를 출력하는 객체
  • 404 에러 - 클라이언트가 요정한 경로에서 문서를 찾을 수 없음
  • 405 에러 - 허용되지 않은 메서드 처리할 컨트롤러가  없음
  • 500 에러 - 서버 내부 오류
<body>
<%
int status = response.getStatus();  // response 내장 객체로부터 에러 코드 확인

// 에러 코드에 따라 적절한 메시지 출력
if (status == 404) {
    out.print("404 에러가 발생하였습니다.");
    out.print("<br/>파일 경로를 확인해주세요.");
}
else if (status == 405) {
    out.print("405 에러가 발생하였습니다.");
    out.print("<br/>요청 방식(method)을 확인해주세요.");
}
else if (status == 500) {
    out.print("500 에러가 발생하였습니다.");
    out.print("<br/>소스 코드에 오류가 없는지 확인해주세요.");
}
%>
</body>

2강 전체 요약 
  • request 객체 -  클라이언트의 요청을 받거나 웹 브라우저에 대한 정보, 요청 헤더에 대한 정보를 읽을 때 사용
  • response 객체 - 요청에 대한 응답을 웹 브라우저로 보낼 때 사용. 페이지 이동이나 응답 헤더를 추가할 때도 사용
  • out  객체 - 변수 등의 값을 웹 브라우저에 출력할 때 사용
  • application 객체 - 웹 애플리케이션을  구성하는 모든 JSP 에서 접근 가능한 객체로, 웹 애플리케이션에 대한 설정값을  저장할 때 주로 사용
  • exception 객체 - 예외 처리를 위해 사용

JSP 01 기본

 게으름에.. -_-; 이제야 1강 요약 정리 해본다.

-JSP 특징- 

HTML 코드 안에서 필요한 부분만 자바 코드를 스크립트 형태로 추가

자주 쓰이는 기능을 내장 객체로 사용

처리된 결과를 보여주는 view를 만들 때 사용


-서블릿 특징-

자바 코드 안에서 전제 HTML 페이지 생성

변수 선언, 초기화에 반드시 선행

컨트롤러를 만들 때 사용


-JSP 파일 기본 구조-

지시어 : JSP 페이지를 자바 코드로 변환하는데 필요한 정보를 JSP 엔진에 알려줌 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"

    errorPage="IsErrorPage.jsp" %>

language :  스트립핑 언어(java)

contentType : 문서의 타입 (text/html; charset=UTF-8)

pageEncoding : 인코딩 방식 (UTF-8)

errorPage : 에러시 이동할 페이지 지정 (IsErrorPage.jsp)


<%@ include file = "IncludeFile.jsp" %>  

include :  외부 클래스 가져오기 (IncludeFile.jsp)


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8" isErrorPage="true"%>

isErrorPage : 현재 페이지가 에러 페이지임을 표시 (isErrorPage="true")


<%!  // 선언부(메서드 선언)

public int add(int num1 , int num2) {

    return num1 + num2;

}

%>

<html>

<head><title>스크립트 요소</title></head>

<body>

<%  // 스크립틀릿(자바 코드)

int result = add(10, 20);

%>

덧셈 결과 1 : <%= result %> <br />

덧셈 결과 2 : <%= add(30, 40) %>

</body>

</html>


2022년 5월 21일 토요일

JSP 공부 시작~~ 0강

예전에 다뤄봤던 JSP를 복습해보기로 한다.

스프링 부트 + AWS를 공부하고 나니 의외로 예전 버전인 스프링의 개념이 필요했다.

분명 썼던 거라도 오랫동안 사용하지  않으면 기억 손실로 복습이 필요하다.  ㅠㅠ

그래서 우선 JSP를 공부 할 때마다 이 곳에 각 강의 요약 정리를 올리고자 한다.

목표는 1일 2강이 목표이긴 하나... 변수가 생기면 늦을 수도 있다...

0강은 기본 셋팅 후에 남기는 글이다.


이번에 공부할 책은 "성낙현의 JSP 자바 웹 프로그래밍" 이다.

선택한 이유는 나름 최근에 나온 책이면서, 실무에서 가장 많이 쓴다는 버전으로 공부하기 때문이다.

셋팅 버전은 다음과 같다.

OS : 윈도우10

JDK : openjdk -11.0.2 

톰켓 :  9

이클립스 : 2020-09 윈도우 64비트


선 공부한 스프링부트 + AWS에서 책과 다르게 최신 버전으로 공부 했다가 오류 고치느라 고생한 경험으로 이번에는 책에 버전을 맞춰서 공부 하고자 한다..

JSP 요약 정리가 끝나면 스프링부트도 요약 정리해서 올릴 예정이다.