JSP 내장 객체

  • JSP 내에서 선언하지 않고 사용하는 객체
  • JSP가 서블릿 형태로 자동 변환된 클래스의 메서드 _jspService() 내에 지역적으로 선언되어 있다.
  • 보통 스크립트릿(<% %>)에서 사용한다.
  • 사용자 요청을 컨트롤하거나 페이지간의 데이터 공유

JSP 내장 객체의 종류

 


내장 객체 - request

  • 사용자 요청(웹 클라이언트)과 관련된 기능을 제공하는 내장 객체
  • 주로 클라이언트에서 서버로 전달되는 정보를 처리할 때 request를 사용한다.
  • 대표적인 예로, 로그인 HTML 폼을 통해 입력된 값을 JSP에서 가져올 때 사용한다.

request의 주요 메서드

request 내장 객체: HttpServletRequest 타입

  1. 단일값을 받을 경우
    - String getParameter(name) => 문자열 name과 이름이 같은 매개변수의 값을 가져옴
  2. 다중값을 받을 경우
    - String[ ] getParameterValues(name) => 문자열 name과 이름이 같은 매개변수의 값들을 배열 형태로 가져옴. checkbox, multiplelist에 주로 사용함

 

실습

[ex07_form.jsp]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>ex07_form.jsp</h1>
<p>다양한 입력 양식을 이용해 서버에 데이터를 전달해보자.</p>
<hr color="red">
<form name="f" method="get" action="ex07_request.jsp">
    <br><br>
        성별:
        <input type="radio" name="gender" value="M">남자
        <input type="radio" name="gender" value="F" checked>여자
        <!-- radio버튼=>단일선택 (동일한 name일때 단일선택 가능)
             checkbox버튼=>다중선택
        -->
        <br><br>
        취미:
        <input type="checkbox" name="hobby" id="hobby1"
         value="reading" checked>독서
        <input type="checkbox" name="hobby" id="hobby2"
         value="music">음악감상
        <input type="checkbox" name="hobby" id="hobby3"
         value="movie">영화감상 
        <br><br>
        드롭다운리스트:
        <select name="job"> <!--단일선택-->
            <option value="">::직업을 선택하세요::</option>
            <option value="Backend">백엔드 개발자</option>
            <option value="Frontend" selected>프런트엔드 개발자</option>
            <option value="Engineer">시스템 엔지니어</option>
        </select>
        <br><br>
        다중선택리스트: <!--다중선택하려면 multiple속성을 준다-->
        <select name="lang" id="lang" multiple size="6">
            <option value="">::사용 가능한 언어::</option>
            <option value="HTML">HTML</option>
            <option value="JavaScript">JavaScript</option>
            <option value="Java">Java</option>
            <option value="C">C</option>
        </select>
        <br><br>
        <button>서버에 전송</button>
</form>
cs
실행 결과

 

1
<form name="f" method="get" action="ex07_request.jsp">
cs

get방식으로 ex07_request.jsp 페이지로 데이터를 보낸다.

 

[ex07_request.jsp]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
<h1>ex07_request.jsp</h1>
<%
//(1) [단일값] 성별, 직업 값을 받아서 출력하세요(getParameter)
String gender = request.getParameter("gender");
String job = request.getParameter("job");
if(gender==null || job==null){
    response.sendRedirect("ex07_form.jsp");
    return;
}
//(2) [다중값] 취미, 언어 값들을 받아서 출력하세요(getParameterValues)
String[] hobbies = request.getParameterValues("hobby");
String[] langs = request.getParameterValues("lang");
%>
 
<h3>성별: <%=gender %></h3>
<h3>직업: <%=job %></h3>
<h3>취미: 
<%
    if(hobbies!=null){
        for(String hb: hobbies){
            out.println(hb+", ");
        }
    }
%>
</h3>
<h3>언어:
<%
    if(langs!=null){
        for(String lang: langs){
            out.println(lang+", ");
        }
    }
%>
</h3>
cs

 

 

이제 form에서 체크를 한 뒤, ex07_request.jsp에서 데이터를 어떻게 받을지 확인해보자.

get방식이기 때문에 url에 선택했던 값들이 들어간다.

 


HttpServletRequest 사용하여 주소 정보 가져오기

request의 HttpServletRequest를 사용하면 서버단에서 주소 정보를 추출할 수 있다.

 

주소 정보를 추출할 때 사용하는 주요 메서드

  • request.getServerName(): 웹서버로 요청시, 서버의 도메인 이름을 반환 (ex. localhost)
  • request.getServerPort(): 웹서버로 요청시, 서버의 port 번호를 반환 (ex. 8080)
  • request.getQueryString(): 웹서버로 요청시, 요청에 사용된 QueryString을 반환 (? 뒤의 내용 추출)
  • request.getRequestURL(): 웹서버로 요청시, 요청에 사용된 URL 전체 경로를 반환
  • request.getRequestURI(): 웹서버로 요청시, 요청에 사용된 URL로부터 URI값을 반환 (프로젝트+파일경로 반환)
  • request.getRemoteAddr(): 웹서버로 정보를 요청하는 웹 브라우저의 IP 주소를 반환
  • request.getContextPath(): 해당 JSP 페이지가 속한 웹 어플리케이션의 콘텍스트 경로를 반환 (프로젝트 path만 반환)
  • request.getServletPath(): 콘텍스트명 이후의 서블릿 경로를 반환
  • request.getProtocol(): 요청 프로토콜을 반환 (http / https)

실습

http://localhost:9090/MyWeb/example/ex07_request.jsp?gender=F&hobby=reading&hobby=movie&job=Frontend&lang=HTML&lang=JavaScript 주소 정보를

HttpServletRequest를 사용하여 가져와보자.

 

[ex07_request.jsp]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<h2>request의 주요 메서드</h2>
http://localhost:9090/MyWeb/example/ex07_request.jsp?gender=F&hobby=reading&hobby=movie&job=Frontend&lang=HTML&lang=JavaScript
<%
    String server = request.getServerName(); //host명 반환
    int port = request.getServerPort(); //포트번호 반환
    StringBuffer url = request.getRequestURL(); //url정보 반환
    String uri = request.getRequestURI(); //uri정보 반환
    
    String queryStr = request.getQueryString();//query string (? 뒤의 내용들 추출)
    String ctx = request.getContextPath(); //context명 "/MyWeb"
    
    String protocol = request.getProtocol(); //프로토콜 (http)
    String cip = request.getRemoteAddr(); //클라이언트의 ip주소 반환
 
%>
<h3>호스트명: <%=server %></h3>
<h3>서버 포트번호: <%=port %></h3>
<h3>요청 url: <%=url %></h3>
<h3>요청 uri: <%=uri %></h3>
<h3>쿼리스트링: <%=queryStr %></h3>
<h3>컨텍스트명: <%=ctx %></h3>
<h3>프로토콜: <%=protocol %></h3>
<h3>클라이언트의 ip주소: <%=cip %></h3>
<h3>컨텍스트명 이후의 경로: <%=request.getServletPath() %></h3>
cs

실행 결과


내장 객체 - response

  • 웹 클라이언트로 보내는 사용자 응답과 관련된 기능을 제공
  • 사용자 요청(request)을 처리하고 응답을 다른 페이지로 전달하는 등의 기능을 제공

 

response의 주요 메서드

response 내장 객체: HttpServletResponse 타입

  • sendRedirect(url): 클라이언트 요청을 다른 페이지로 보낸다.
  • sendError(status, msg): 오류 코드를 세팅하고 메시지를 보낸다.

 

실습

[ex08_form.jsp]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>response를 살펴봅시다</h1>
 
<h2>테스트 방법: 아이디 입력박스에 killer, forward,
redirect값을 입력하여 테스트 하세요.
</h2>
 
    <form action="ex08_response.jsp" method="POST">
    <div>
        <label for="uid">아이디</label>
        <!--label의 for 부분에 입력양식의 id값을 넣어줌  -->
        <input type="text" name="uid" id="uid2">
    </div>
    <div>
        <label for="pwd">비밀번호</label>
        <!--label의 for 부분에 입력양식의 id값을 넣어줌  -->
        <input type="password" name="pwd" id="pwd">
    </div>
    <div>
        <button>로그인</button>
    </div>
    </form>
cs

실행 결과

 

[ex08_response.jsp]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>ex08_response.jsp 페이지입니다</h1>
<p>response객체의 주요 메서드<br>
    - sendRedirect(페이지)<br>
    - sendError(에러코드)<br>
</p>
<%
//1. 아이디(uid)와 비밀번호(pwd)값 받아서 브라우저에 출력하세요
String id = request.getParameter("uid");
String pw = request.getParameter("pwd");
out.println("<h3>id: " + id + ", pw: " + pw);
//2. 아이디와 비밀번호가 null값이면 ex08_form.jsp로 redirect 이동시키기
if(id==null || pw==null){
    response.sendRedirect("ex08_form.jsp");
    return;
}
//3. 빈문자열일 경우 잘못된 요청 에러를 출력하세요 -400
if(id.trim().isEmpty() || pw.trim().isEmpty()){
    response.sendError(400"잘못된 요청-아이디, 비밀번호 필수로 입력");
    return;
}
//4. killer가 들어오면 접근 금지 에러를 출력하세요 -403
if(id.equals("killer")){
    response.sendError(response.SC_FORBIDDEN, "killer는 접근 금지");//403
    return;
}
//5. uid가 redirect라면 "welcome.jsp"로 redirect방식으로 이동시키세요
if(id.equals("redirect")){
    request.setAttribute("msg", id+"님 환영합니다."); //request에 저장 (redirect는 정보 유지X)
    session.setAttribute("msg", id+"님 환영합니다."); //session에 저장 (정보 유지O)
    response.sendRedirect("welcome.jsp");
    return;
}
//6. uid가 forward라면 "welcome.jsp"로 forward방식으로 이동시키세요
if(id.equals("forward")){
    request.setAttribute("msg", id+"님 환영합니다."); //request에 저장 (forward는 정보 유지O)
    session.setAttribute("msg", id+"님 환영합니다."); //session에 저장 (정보 유지O)
%>
    <jsp:forward page="welcome.jsp" />
<%
}
%>
cs

 

[welcome.jsp]

1
2
3
4
5
6
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>welcome.jsp</h1>
 
<h2 style='color:red'>메시지: <%=request.getAttribute("msg"%></h2>
<h2 style='color:blue'>메시지: <%=session.getAttribute("msg"%></h2>
cs

 

 

1) 아이디와 비밀번호 값을 받아서 브라우저에 출력(아이디: kkk, 비밀번호: 123)

 

2) 아이디와 비밀번호가 빈 문자열일 경우 - 400에러

 

3) 아이디에 killer를 입력 - 403에러

 

4) 아이디에 redirect를 입력

redirect 방식을 사용하면 기존의 request는 사라지고 새로운 request가 발생하기 때문에 "msg" = id + "님 환영합니다" (key=value) 를 저장했던 request가 사라져서 메시지가 null이 된다. (request, response가 유지되지 않는다.)

 

5) 아이디에 forward를 입력

forward 방식을 사용하면 request와 response가 유지되기 때문에 "msg" = id + "님 환영합니다"(key=value)를 저장했던 request가 그대로 유지되고, 메시지에도 출력된다.

+ Recent posts