본문 바로가기

STUDY/국비과정

[JAVA 웹 개발 공부] 국비지원 58일차 - Attribute, forward, DB 연동

기본 객체의 속성(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);
%>