기본 객체의 속성(Attribute)
네 개의 기본객체 pagecontext, request, session, application 는 속성을 갖고 있다.
속성은 각각의 기본 객체가 존재하는 동안에 사용될 수 있고, JSP 페이지 사이에서 정보를 주고 받거나 공유하기 위한 목적으로 사용된다.
<속성이름, 값> 형태를 가지고, 서로 다른 이름을 가진 속성을 여러개 포함할 수 있다.
request 기본 객체는 한 번의 요청에 대해 유효하게 동작하며 , 한 번의 요청을 처리하는 데 사용되는 모든 JSP에서 공유된다.
| 메소드 | 반환타입 | 설명 |
| setAttribute(String name, Object value) | void | 이름이 name인 속성의 값을 value로 지정한다. |
| getAttribute(String name) | Object | 이름이 name인 속성의 값을 구한다. 존재하지 않을 경우 null을 반환한다. |
| removeAttribute(String name) | void | 이름이 name인 속성을 삭제한다. |
| getAttributeNames() | Enumeration | 속성의 이름 목록을 구한다. (pageContext 제외) |
setAttribute() 메소드의 value 파라미터의 타입이 Object이고 getAttribute() 메소드의 리턴타입이 Object인데, 이것은 모든 클래스 타입을 속성의 값으로 사용가능하다는 것을 의미 한다.
다양한 타입의 객체를 속성값으로 저장할수 있으며, 형변환이 필요하다.
Parameter vs Attribute
| Parameter | Attribute |
| 키 name(String), 값 value(String) | 키 name(String), 값 value(Object) |
| 사용자 입장이라 value값이 단순히 String만으로 가능하다. (어플리케이션 외부) |
개발자의 입장이라 value값이 Object로 가능하다. (어플리케이션 내부) |
| 파라미터를 사용하는 주체는 사용자이다. | attribute를 사용하는 주체는 개발자이다. |
| get밖에 없다. (읽기만 가능하다) | get, set, remove가 다 있다. |
Redirect vs forward
| Redirect 방식 | Forward 방식 | |
| 처리방법 | 페이지 자체를 이동함. | 응답을 위임함. |
| 페이지이동 | Web Container는 redirect 명령이 들어오면 웹 브라우저에게 다른 페이지로 이동하라는 명령을 내림 즉, 다른 페이지를 호출해서 이동 |
Web Container 차원에서의 페이지 이동만 존재 실제 페이지 이동 X |
| url | 웹 브라우저는 url을 redirect된 주소로 변경 | 웹 브라우저에는 최초에 호출한 url이 표시 (url 주소는 바뀌지 않는다.) |
| 객체 | 새로운 페이지에서는 request, response 객체가 새롭게 생성 (request와 resonse 객체를 공유하지 않음) | 현재 실행중인 페이지와 forward에 의해 호출된 페이지는 request와 resonse 객체를 공유 |
| 과정 | 1. 사용자가 링크를 클릭 (클라이언트가 서버에 요청) 2. 서버가 클라이언트에 Redirect 주소 보냄 3. 클라이언트는 서버에게 받은 새로운 주소로 재요청 4. 서버 응답 |
1. 클라이언트가 서버에 요청 2. 서버는 Web Container에 의해 다른 주소로 forward. 이때 객체 정보도 같이 전달 3. 서버는 새 주소에서 반환한 결과를 응답 |
JSP 연습 - 간단한 웹 계산기
*calcform.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>간단한 웹 계산기</title>
</head>
<body>
<form action="calcstep1.jsp">
<input type="number" name="first"/>
<select name="operator">
<option value="plus">+</option>
<option value="minus">-</option>
<option value="mul">*</option>
<option value="div">/</option>
</select>
<input type="number" name="second"/>
<input type="submit"/>
</form>
</body>
</html>
*calcstep1.jsp
<%
String first = request.getParameter("first");
String operator = request.getParameter("operator");
String second = request.getParameter("second");
Integer num1 = Integer.valueOf(first);
Integer num2 = Integer.valueOf(second);
if (operator.equals("div") && num2 == 0) {
response.sendRedirect("./calcform.jsp");
} else {
int result = 0;
if (operator.equals("plus")) {
result = num1 + num2;
} else if (operator.equals("minus")) {
result = num1 - num2;
} else if (operator.equals("mul")) {
result = num1 * num2;
} else if (operator.equals("div")) {
result = num1 / num2;
}
//response.sendRedirect("./calcstep2.jsp?result=" + result);
request.setAttribute("result", result);
request.getRequestDispatcher("calcstep2.jsp").forward(request, response);
}
%>
*calcstep2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>계산 결과 페이지2</title>
</head>
<body>
<%
Integer result = (Integer) request.getAttribute("result");
%>
<p>연산 결과 <%= result %></p>
</body>
</html>
JSP 연습 - 랜덤 숫자 만들기
*WEB-INF
WEB-INF 폴더안은 일반 사용자가 브라우저에 패스를 넣어서 접근할수가 없기 때문에 노출하고 싶지 않은 파일이나 설정을 도와주는 파일들 넣을 수 있다.
페이지 내에 논리적 흐름이 없어서 수행된 값을 보여줄 수 없는 페이지들을 넣으면 된다.
*lib
프로젝트에서 필요한 라이브러리 파일을 저장해서 사용하는 폴더이다.

*step1.jsp
<%@page import="java.util.Random"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Random r = new Random();
int number = r.nextInt();
request.setAttribute("number", number);
request.getRequestDispatcher("/WEB-INF/step2.jsp")
.forward(request, response);
%>
*step2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>랜덤 숫자</title>
</head>
<body>
<p>생성된 랜덤 정수 : <%= request.getAttribute("number") %>
</body>
</html>
JSP 연습 - DB에서 정보 가져오기

*CountryRepository.java
package country;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class CountryRepository {
public Map<String, Integer> selectAll() throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
Map<String, Integer> map = new LinkedHashMap<>();
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/world", "root", "root");
PreparedStatement stmt = conn.prepareStatement("SELECT name, population FROM country");
ResultSet rs = stmt.executeQuery();) {
while (rs.next()) {
String name = rs.getString("name");
int population = rs.getInt("population");
map.put(name, population);
}
}
return map;
}
public Map<String, Integer> selectByName(String name) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
String query = "SELECT name, population FROM country WHERE name LIKE ?";
Map<String, Integer> map = new LinkedHashMap<>();
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/world", "root", "root");
PreparedStatement stmt = conn.prepareStatement(query);) {
stmt.setString(1, "%" + name + "%");
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
String n = rs.getString("name");
int population = rs.getInt("population");
map.put(n, population);
}
}
}
return map;
}
public List<String> distinctContinent() throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
List<String> list = new ArrayList<>();
String query = "SELECT DISTINCT continent FROM country";
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/world", "root", "root");
PreparedStatement stmt = conn.prepareStatement(query);
ResultSet rs = stmt.executeQuery();) {
while (rs.next()) {
String continent = rs.getString("Continent");
list.add(continent);
}
}
return list;
}
public Map<String, Integer> selectByContinent(String continent) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
String query = "SELECT name, population FROM country WHERE continent = ?";
Map<String, Integer> map = new LinkedHashMap<>();
try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/world", "root", "root");
PreparedStatement stmt = conn.prepareStatement(query);) {
stmt.setString(1, continent);
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
String name = rs.getString("name");
int population = rs.getInt("population");
map.put(name, population);
}
}
return map;
}
}
}
*country.jsp
<%@page import="java.util.Map.Entry"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>국가 목록</title>
</head>
<body>
<ul>
<%
Map<String, Integer> map = (Map) request.getAttribute("map");
for (Entry<String, Integer> e : map.entrySet()) {
%>
<li><%= e.getKey() %> = <%= e.getValue() %></li>
<%
}
%>
</ul>
</body>
</html>
1. 전체 국가 목록 보기
*selectall.jsp

<%@page import="country.CountryRepository"%>
<%@page import="java.util.Map"%>
<%
CountryRepository repo = new CountryRepository();
Map<String, Integer> map = repo.selectAll();
request.setAttribute("map", map);
request.getRequestDispatcher("/WEB-INF/country.jsp")
.forward(request, response);
%>
2. 국가명 입력 → 국가 목록 조회


*countryname.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>국가명 입력</title>
</head>
<body>
<form action="selectname.jsp">
<input type="text" name="name"/>
<input type="submit"/>
</form>
</body>
</html>
*selectname.jsp
<%@page import="java.util.Map"%>
<%@page import="country.CountryRepository"%>
<%
String name = request.getParameter("name");
CountryRepository repo = new CountryRepository();
Map<String, Integer> map = repo.selectByName(name);
request.setAttribute("map", map);
request.getRequestDispatcher("/WEB-INF/country.jsp")
.forward(request, response);
%>
3. 대륙 선택 → 국가 목록 조회


*countrycontinent.jsp
<%@page import="java.util.List"%>
<%@page import="java.util.Map"%>
<%@page import="country.CountryRepository"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>대륙명 골라</title>
</head>
<body>
<%
CountryRepository repo = new CountryRepository();
List<String> list = repo.distinctContinent();
%>
<form action="selectcontinent.jsp">
<select name="continent">
<%
for (String continent : list) {
%>
<option><%= continent %></option>
<%
}
%>
</select>
<input type="submit" />
</form>
</body>
</html>
*selectcontinent.jsp
<%@page import="java.util.Map"%>
<%@page import="country.CountryRepository"%>
<%
String continent = request.getParameter("continent");
CountryRepository repo = new CountryRepository();
Map<String, Integer> map = repo.selectByContinent(continent);
request.setAttribute("map", map);
request.getRequestDispatcher("/WEB-INF/country.jsp")
.forward(request, response);
%>