today_is
[ jsp ] request 와 response 의 내장객체 본문
오늘의 목표
다른 페이지간의 데이터 이동을 시켜보자 !
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 의 주요 메서드를 익숙해질때까지 봐야할 것같다 .
'java' 카테고리의 다른 글
[ 백준 3003번 ] 킹, 퀸, 룩, 비숍, 나이트, 폰 ( java ) (0) | 2023.12.09 |
---|---|
[ jsp ] 단순한 도서 관리 (0) | 2023.12.08 |
[ socket ] ip 주소를 통해 간단한 메시지 주고받기 (0) | 2023.12.06 |
DAO 와 DTO (template 이용 X) - 2 (0) | 2023.12.05 |
DAO 와 DTO (template 이용) - 1 (0) | 2023.12.03 |