today_is

[ jsp ] request 와 response 의 내장객체 본문

java

[ jsp ] request 와 response 의 내장객체

ye_rang 2023. 12. 7. 11:36

 오늘의 목표  

다른 페이지간의 데이터 이동을 시켜보자 ! 

 

 


 jsp 정의 

Java를 기반으로 하는 서버 측 웹 프로그래밍 언어

 

 

 

 

 jsp 내장 객체   ( request  /  response ) 

request 

서버에 어떤 정보를 요청하는 것

요청 정보는 request 객체가 관리한다.

 

 

response

웹 브라우저의 요청에 응답하는 것

response객체는 응답(response)의 정보를 가지고 있는 객체이다.

 

 

<%@ 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>

<style>
	table {
		border-collapse: collapse;
		border: 2px solid black;
	}
	td, th {
		padding: 10px;
		border: 1px solid grey;
	}
	thead {
		backgroud-color: #dadada;
	}
</style>


<body>


<h1>request 와 response 의 내장객체</h1>
<hr>

<h3>스트립틀릿 내부에서는 객체를 별도로 생성하지 않아도 request, reponse에 접근할 수 있다</h3>
<h3>request 와 response 는 JSP의 내장객체에 해당한다 (별도 생성이 필요없음)</h3>

<table>
	<thead>
		<tr>
			<th colspan="3">request 주요메서드</th>
		</tr>
		<tr>
			<td>형식</td>
			<td>기능</td>
			<td>예시</td>
		</tr>
	</thead>	
	<tbody>
		<tr>
			<td>request.getMethod()</td>
			<td>클라이언트가 보낸 요청의 메서드를 문자열로 반환</td>
			<td><%=request.getMethod() %></td>
		</tr>
		<tr>
			<td>request.getLocalAddr()</td>
			<td>클라이언트가 보낸 요청의 대상 주소(서버 주소)를 문자열로 반환</td>
			<td><%=request.getLocalAddr() %></td>
		</tr>
		<tr>
			<td>request.getRemoteAddr()</td>
			<td>요청을 보낸 클라이언트의 주소를 문자열로 반환</td>
			<td><%=request.getRemoteAddr() %></td>
		</tr>
		<tr>
			<td>request.setAttribute(String name, Object o)</td>
			<td>request 내장 객체에 자바 객체를 저장한다</td>
			<td><%	request.setAttribute("today", new java.util.Date()); %></td>
		</tr>
		<tr>
			<td>request.getAttribute(String name)</td>
			<td>request에 저장된 내장 객체를 이름으로 불러와서 Object로 반환한다</td>
			<td><%= request.getAttribute("today") %></td>
		</tr>
		<tr>
			<td>request.getCookies</td>
			<td>요청에 담긴 쿠키를 배열 형태로 반환한다. null을 반환할 수도 있다</td>
			<td><%= request.getCookies() %></td>
		</tr>
		
		<tr>
			<td>request.getContentType()</td>
			<td>request에 담긴 contentType 을 문자열로 반환</td>
			<td><%=request.getContentType() %></td>
		</tr>
		<tr>
			<td>request.getReuestURL()</td>
			<td>클라이언트가 요청한 주소를 반환</td>
			<td><%=request.getRequestURL() %></td>
		</tr>
		<tr>
			<td>request.getProtocol()</td>
			<td>요청 프로토콜을 반환한다. http 혹은 https</td>
			<td><%=request.getProtocol() %></td>
		</tr>
		<tr>
			<td>request.getServerName()</td>
			<td>요청 서버주소를 반환한다. 글자주소를 우선적으로 제공하고, 없으면 IP 반환</td>
			<td><%=request.getServerName() %></td>
		</tr>
		<tr>
			<td>request.getServerPort()</td>
			<td>요청 서버의 포트번호를 반환한다. 범위는 0 ~65535</td>
			<td><%=request.getServerPort() %></td>
		</tr>
		<tr>
			<td>request.getContextPath()</td>
			<td>요청받은 자원의 최상위 폴더경로를 문자열로 반환한다<br>
				이 경로는 JSP 프로젝트의 webapp(WebContent) 폴더에 해당하는 경로이다
			</td>
			<td><%=request.getContextPath() %></td>
		</tr>
		<tr>
			<td>request.getRequestURI()</td>
			<td>요청받은 자원 고유 식별자를 문자열로 반환한다. 
            서버안의 주소만 나온다. 
            전체주소가 아님</td>
			<td><%=request.getRequestURI() %></td>
		</tr>
		<tr>
			<td>request.getParameter(String name)</td>
			<td>요청에 담긴 클라이언트의 파라미터를 문자열로 반환한다.<br>
				클라이언트의 입력값이므로, 서버에서 set하는 메서드는 없다
			</td>
			<td><%=request.getParameter("guest") %></td>
		</tr>
		<tr>
			<td>request.getQueryString()</td>
			<td>주소에서 URL을 제외한 쿼리스트링을 문자열로 반환한다.</td>
			<td><%=request.getQueryString() %></td>
	</tbody>
</table>

<form>
	<p><input name="guest" placeholder="손님 이름 입력" required></p>
	<p><input type="submit" value="제출"></p>
</form>


</body>
</html>

 

 


 

 2개의 페이지를 이용한 데이터 입력 / 전송 / 출력 

 

 

 

jsp 스크립트 태그 

  : jsp 페이지에서 자바코드를 사용하고 싶을 때 쓰는 문법 

지시자 (directive) <%@    %> import, include 등을 설정
선언문 (declaration) <%!      %> 변수나 메서드를 정의함
스크립틀릿 (scriptlet) <%       %> 모든 자바코드를 사용할 수 있음.
자바코드 작성
표현식 (expression) <%=     %> 변수나 메서드 리턴값 등의 결과값을 문자열 형태로 출력

 

 

 

 

 

[ form.jsp 의 역할 ]  : 사용자로부터 데이터 입력을 받아온다.

 

데이터 입력을 받기 위해서는 form 을 사용하고,

form 은 action 을 이용하여 result.jsp 페이지로 전송한다 

 

[ form.jsp ]


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>form.jsp</title>
</head>
<body>

<form action="result.jsp">
	<p><input type="text" name="name" placeholder="이름" required autofocus></p>
	<p><input type="number" name="age" min="0" max="100" placeholder="나이" required></p>
	<p><input type="submit"></p>
</form>	

</body>
</html>

 

 

 

 

[ result.jsp 의 역할 ]  :  form.jsp 가 보내온 데이터를 받아서 출력한다

 

받아온 데이터는 스크립틀릿 (<% %>) 을 이용하여

request.getParameter(" form 에서 사용한 name ") 을 통해 해당 데이터를 불러올 수 있다.

 

출력은 스크립틀릿 내부에서도 가능하지만, 

표현식(<%= %>) 으로 출력하는 것이 일반적이다. 

 

[ result.jsp ]


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>result.jsp</title>
</head>
<body>

<%
	String name = request.getParameter("name");
	String age = request.getParameter("age");
	String msg = "";
	
	if(name != null) {                                     
		String adult = Integer.parseInt(age) >= 20 ? "성인" : "미성년자";
		msg = String.format("%s님의 나이는 %s살이고, %s입니다", name, age, adult);
	}
%>


<h3><%=msg %></h3>
<a href="form.jsp"><button>재입력</button></a>

</body>
</html>

 

 


 

 

 사용자의 입력을 받아서 리스트에 추가하여 사용하기 

 

 

1) form 을 이용하여 사용자의 입력을 받는다

2) 현재 페이지에서 바로 받아서 리스트에 담는다

3) 해당 리스트의 각각을 dto 라는 이름으로 객체를 담는다

4) dto.  의 형태로 원하는값을 출력한다 ( 이때, 온점은 '~의' 라는 의미이다)

 

<%@ 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>사용자의 입력값을 리스트에 추가하고 화면에 출력</h1>

<hr>


<!-- form 에 action 이 없으면, [현재주소]로 새로운 요청을 보낸다 -->
<form>
	<p>
		<select name="category" required>
			<option value="">=== 카테고리 ===</option>
			<option value="족발/보쌈">족발/보쌈</option>
			<option value="찜/탕/찌개">찜/탕/찌개</option>
			<option value="돈까스/회/일식">돈까스/회/일식</option>
			<option value="피자">피자</option>
			<option value="고기/구이">고기/구이</option>
			<option value="야식">야식</option>
			<option value="양식">양식</option>
			<option value="치킨">치킨</option>
			<option value="중식">중식</option>		
		</select>
	</p>
	
	<p><input type="text" name = "storeName" placeholder="식당이름" required></p>
	<p><input type="text" name = "menuName" placeholder="메뉴이름" required></p>
	<p><input type="number" name = "menuPrice" placeholder="주문금액" min="0" step="100" required></p>
	<p><input type="submit"></p>
</form>



<%@ page import="java.util.ArrayList , food.FoodDTO" %>


<%!	//	선언부 : 멤버필드 및 멤버 메서드를 정의

	private ArrayList<FoodDTO> list = new ArrayList<>();

%>



<% //  스크립틀릿의 내부코드 	==  	service() 함수 내부의 내용
  //  지역 변수는 함수가 호출될 때마다 새로 만들어진다 -> 값이 유지되지 않는다 
  //  리스트를 멤버 필드로 생성해두면, 객체가 소멸하기 전까지(= 서버가 재시작하기 전까지) 값이 유지된다
  //  (= 선언부를 이용하자!)
	

	//	4개의 파라미터를 전달받는다
	String category = request.getParameter("category");	 // <select name="category">
	String storeName = request.getParameter("storeName");   // <input name="storeName">
	String menuName = request.getParameter("menuName");	// <input name="menuName">
	String menuPrice = request.getParameter("menuPrice");  // ★ 파라미터를 받을때에는 웬만하면 String 으로 받고, set(Integer.parseInt)
	
	
	//	전달받은 파라미터를 변수에 저장한다
	if(category != null) {
		FoodDTO dto = new FoodDTO();
		dto.setCategory(category);
		dto.setStoreName(storeName);
		dto.setMenuName(menuName);
		dto.setMenuPrice(Integer.parseInt(menuPrice));
		
		//	리스트에 추가하기
		list.add(dto);
		
		
		//	리스트 정렬하기
		//	list.sort((a, b) -> a.getCategory().compareTo(b.getCategory())); // 등록 후 카테고리 별로 정렬하고 화면에 출력 
		
		list.sort((a, b) -> a.getMenuPrice() - b.getMenuPrice());		// 등록 후 가격 별로 정렬하고 화면에 출력 
		
	}

%>

<table border="1" cellpadding="10" cellspacing="0">
	<tr bgcolor="#dadada">
		<th>카테고리</th>
		<th>식당이름</th>
		<th>메뉴이름</th>
		<th>메뉴가격</th>
	</tr>
	<%for(FoodDTO dto : list) { %>
	<tr>
		<td><%=dto.getCategory() %></td>
		<td><%=dto.getStoreName() %></td>
		<td><%=dto.getMenuName() %></td>
		<td><%=dto.getMenuPrice() %></td>
	</tr>
	<% } %>
</table>


</body>
</html>

 

 

 


 

study_review

 

처음에는 request 에 대한 어떠한 선언도 없이, 바로 request 를 사용해서 리퀘스트의 의미가 이해가 가지 않았었는데,

내장객체라는 것을 알게되고 나서는 사용하는데 있어서 조금 익숙해졌다.

 

아마, 변수를 사용하기전에 매번 변수 선언을 했었기 때문에 어색함을 느꼈던 것 같다.

 

request 의 주요 메서드를 익숙해질때까지 봐야할 것같다 .