너굴 개발 일지

TIL_210421_JSP 기초2 (label, forward, application, JSP파일 데이터 옮기는 방법, 한글 변수 안 깨지게 전달하는 방법) 본문

JSP,Serlvet

TIL_210421_JSP 기초2 (label, forward, application, JSP파일 데이터 옮기는 방법, 한글 변수 안 깨지게 전달하는 방법)

너굴냥 2021. 4. 21. 23:20

목차

- label 태그

- forward

- 파라미터 값으로 한글 변수 안 깨지게 전달하는 방법

- application

- jsp파일에서 다른 jsp파일로 데이터를 옮기는 다양한 방법

- 위를 사용한 예제

 

 

 

 

label 태그

input 태그의 의미를 정의하기 위한 태그

label 태그가 있으면 라벨 클릭시 input type = text인 경우 활성화, checkbox / radio인 경우 체크된다

 

label 태그 속성 for

설명(연결)하고 싶은 input태그의 id값을 지정

즉, input 태그에 id값이 있어야 하며, 해당 id값을 label태그의 for 속성에 넣어줘야 한다

 

<form action="04_testLogin.jsp">
		<label for="userid">아이디 : </label> 
		<input type="text" name="id" id="userid" required="required" /><br />
		
		<label for="userpw">비밀번호 : </label>
		<input type="password" name="pwd" id="userpw" required="required" /><br />
		
		<input type="submit" value="로그인" />
</form>

 

 

로그인 프로젝트 예시

04_loginForm.jsp

<%@ 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>
	<form action="04_testLogin.jsp">
		<label for="userid">아이디 : </label> 
		<input type="text" name="id" id="userid" required="required" /><br />
		
		<label for="userpw">비밀번호 : </label>
		<input type="password" name="pwd" id="userpw" required="required" /><br />
		
		<input type="submit" value="로그인" />
	
	</form>
</body>
</html>
04_testLogin.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.URLEncoder" %>
<% 
	String id = "admin";
	String pwd = "1234";
	String name = "관리자";
	request.setCharacterEncoding("UTF-8");
	String id_r = request.getParameter("id");
	String pwd_r = request.getParameter("pwd");
	
	if(id_r.equals(id) && pwd_r.equals(pwd)){
		response.sendRedirect("04_main.jsp?name=" + URLEncoder.encode(name, "UTF-8"));
	}else{
		response.sendRedirect("04_loginResult.jsp?code=fail");
	}

%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>로그인 실패 화면</title>
</head>

<body>
	<%
		String code = request.getParameter("code");
		if(code.equals("fail")){
			out.print("아이디 또는 비밀번호가 일치하지 않습니다 . <br />");
			out.print("다시 입력해주세요. <br />");
		}
	%>
	<b><a href="javascript:history.go(-1)">다시 돌아가기</a></b>
	<!-- 전페이지로 돌아가게 하는 기능 -->
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>관리자 로그인 화면</title>
</head>

<body>
	<%=request.getParameter("name") %> 님 반갑습니다.
	<br />
	접속 환영합니다 ^^
</body>
</html>

 

 


 

파라미터 값으로 한글 변수 안 깨지게 보내는 방법

만약, 04_testLogin.jsp 에서 name이라는 변수를 아래와 같이 보내게 코딩해서 전달하게 된다면

String name = "관리자";

if(id_r.equals(id) && pwd_r.equals(pwd)){
		response.sendRedirect("04_main.jsp?name=" + name);
	}

데이터를 전달받는 페이지에선 "관리자" 라는 데이터를 읽을 수가 없다

이유는 ? reponse.sendRedirect() 메서드는 post 형식이기에 실제로 <head>영역을 타고 들어가 UTF-8이 적용되지 않는다.

따라서 파라미터 값으로 한글을 전달할 경우 아래와 같이 코딩해야 한다

 

 

(1) 보내는 쪽에서 <form method="post">형식이고,받는 쪽에서 한글 변수를 받아야 할 때 

request.setCharacterEncoding("원하는 인코딩 형식") 메서드 꼭 선적용 !

request.setCharacterEncoding("UTF-8");
request.getParameter("name");

 

(2) 보내는 쪽에서 파라미터 값으로 한글 변수를 보내줘야 할 때

1. 외부 클래스  java.net.URLEncorder  import( 네트워크 상에서 데이터를 주고 받기에 필요 )

2. URLEncoder.encode(원하는 변수, "인코딩 방식") 메서드 적용

04_testlogin.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.URLEncoder" %>
<% 
	String id = "admin";
	String pwd = "1234";
	String name = "관리자";
	request.setCharacterEncoding("UTF-8");
	String id_r = request.getParameter("id");
	String pwd_r = request.getParameter("pwd");
	
	if(id_r.equals(id) && pwd_r.equals(pwd)){
		response.sendRedirect("04_main.jsp?name=" + URLEncoder.encode(name, "UTF-8"));
	}else{
		response.sendRedirect("04_loginResult.jsp?code=fail");
	}

%>

 

 


 

forward

WAS의 서블릿이나 JSP가 요청을 받은 후 그 요청을 처리하다가, 추가적인 처리를 같은 웹 어플리케이션안에 포함된 다른 서블릿이나 JSP에게 위임하는 경우가 있는데 이렇게 위임하는 것을 포워드(forward)라고 한다

요청 처리를 전달받은 페이지는 요청 전달을 했던 페이지의 기본 객체를 그대로 사용

-> 현재 실행중인 페이지와 forward에 의해 호출될 페이지는 request, response 객체를 공유 

즉, forward 방식은 이동한 URL로 요청정보를 그대로 전달하기에 사용자가 최초로 요청한 요청정보는 다음 URL에서도 유효

 

참고로 모든 JSP 내부엔 request / response / out / cookie /session  객체가 존재하므로 따로 객체 생성할 필요 없이 바로 사용 가능

 

forward 방식 

1) pateContext.forward("이동할 페이지");

2) <jsp:forward page="이동할 페이지" />; (forward 액션 태그)

3) RequestDispacther rd = request.getDispacther("이동할 페이지");

   rd.forward(request, response);

forward 동작 원리

 

forward 메서드 사용 태그

RequestDispatcher dispatcher = request.getRequestDispatcher("05_forwardResultFail.jsp");
<!-- getRequestDispatcher() 메서드에 요청 정보를 다시 보내줄 페이지 정보 명시-->
dispatcher.forward(request, response);

 

forward 메서드 사용 예시

( 나이 제한이 있는 놀이기구 탑승시 손님 나이에 따른 탑승, 탑승 불가를 안내하는 코드)

05_forwardForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>05_forwardForm.jsp</title>
</head>
<body>
	입장하려면 나이를 입력하세요!<br />
	<form action="05_forwardTest.jsp">
		<input type="text" name="age" required="required" />
		<input type="submit" value="전송" />
	</form>
</body>
</html>
05_forwardTest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	int old = Integer.parseInt(request.getParameter("age"));	
	// int old는 변수 
	// getParameter("age")의 age는 '05_fowardForm.jsp'에서 전달 받는 파라미터 값
	if(old<=19){
		RequestDispatcher dispatcher = request.getRequestDispatcher("05_forwardResultFail.jsp");
		dispatcher.forward(request, response); // forward() 메서드의 매개변수는 불변 
		// 여기서 request는 request.getParameter("age") 이 값이 전달됨 
		// 한마디로 최초로 데이터를 보내주는 jsp 페이지의 파라미터 값을 다음 다음 다음..페이지에도 전달 가능 
	}else{
		RequestDispatcher dispatcher = request.getRequestDispatcher("05_forwardResultSuccess.jsp");
		dispatcher.forward(request, response);
	}
%>
05_forwardResultFail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String age = request.getParameter("age");
 	// 따라서 age는 forwardForm.jsp에서 보낸 age 파라미터 
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>05_forwardResultFail.jsp</title>
</head>
<body bgcolor="red">
	입력한 나이는 <%=age %>이기 떄문에, 입장 불가합니다.
</body>
</html>
05_forwardResultSuccess.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String old = request.getParameter("age");
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>05_forwardResultSuccess.jsp</title>
</head>
<body bgcolor="green">
	손님 나이는 <%=old %>이기에 입장 가능합니다 ^^
</body>
</html>

 

 

 

forward, Redirect 차이는 ??

Redirect는 최초 요청을 받은 URL1에서 클라이언트에 redirect할 URL2를 리턴하고, 클라이언트에게 전혀 새로운 요청을 생성해 URL2에 다시 요청을 보낸다. 따라서 처음 보냈던 최초의 요청정보는 더이상 유효하지 않게 된다.

따라서 둘의 차이점은 다음과 같다.

1) URL의 변화여부 (변화 O -> redirect, 변화 X -> forward)

2) 객체의 재사용여부 (재사용 O -> forward, 재사용 X -> redirect )

 

즉, 시스템(session, DB)에 변화가 있는 요청(로그인, 회원가입, 글쓰기 등)의 경우 -> redirect방식으로 응답

     시스템에 변화가 없는 단순조회(리스트보기, 조회)의 경우 -> forward방식으로 응답하는 것이 바람직하다

 

 


application

jsp의 내장 객체 중 하나로 주요 메서드는 다음과 같다 

메서드

설명
getContextPath() 웹 애플리케이션의 context 경로명
request.getPath()와 같은 결과
getRealPath("jsp파일명") 웹 애플리케이션의 파일 경로
gerServerInfo() 웹 서버(컨테이너)의 이름과 버전

 

application 메서드 예시

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 내장객체 : application의 주요메서드 (06_application.jsp)</title>
</head>

<body>
	<h3>JSP 내장객체 : application의 주요메서드</h3>
	웹 어플리케이션의 context 경로명 : <%=application.getContextPath() %><br />
	웹 어플리케이션의 파일 경로 : <%= application.getRealPath("06_application.jsp") %><br />
	웹 서버(컨테이너)의 이름과 버전 : <%=application.getServerInfo() %><br />
</body>
</html>

 

참고로 application.getRealPath("06_application.jsp") -> jsp는 이클립스가 아닌 서버에서 실행되기에

실제로 jsp가 위치하는 경로로 (톰캣 서버 내부)  c드라이브에 있는 이미지 파일 불러 올 경우 불러올 수 없음
따라서 webcontent에 이미지 폴더를 만들어서 거기에 저장해야 함 

만약 이미지 파일들을 jsp 페이지에 업로드하고 싶다면 <img src="./~~img/~~.jpg"> 상대경로를 이용하여 호출

용량이 큰 동영상,고음질 파일 같은 자료는 프로젝트 내부가 아닌 서버에 넣어놔야 함


jsp파일에서 다른 jsp파일로 데이터를 옮기는 다양한 방법

jsp에는 pageContext, request, session, application라는 내장 객체가 있는데 이를 이용하여 데이터를 넘길 수 있다

 

(1) pageContext : 현재 JSP 페이지, 객체 자체는 외부로 전달 불가(다른 페이지로 넘길 수 없어)

(2) request : 현재 JSP의 내장객체, 외부로 전달 가능 (RequestDispatcher 객체의 forward() 메서드 통해 가능)

(3) session : 어플리케이션 내의 내부 임시 저장소인 session 영역, (어플 구동중일 때만 사용, 다른 파일이 언제든 접근하여 사용 가능)

                        request처럼 RequestDispatcher 객체 생성할 필요 X

(4) application : 어플리케이션 내의 임시 저장소 (), 다른 파일들이 언제든 접근 가능 

 

범위 크기 :  pageContext < request < seccion < applcation

 

 

 

jsp 내장 객체를 활용한 데이터 옮기기 예시

07_firstPage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
/** JSP(07_firstPage.jsp)가 JSP(07_secondPage.jsp)에게 전달 하는 다양한 방법 **/
/** 07_firstPage.jsp는 값들을 셋팅, 07_secondPage.jsp에게 전달 **/
/** Java Collection : Map 계열 구조를 띈다**/

	pageContext.setAttribute("name", "pageContext data");
	request.setAttribute("name", "request data");
	session.setAttribute("name", "session data");
	application.setAttribute("name", "application data");
	
	// 잘 처리 되는지 테스트용
	System.out.println("페이지 속성 : " + pageContext.getAttribute("name"));
	System.out.println("request 속성: " + request.getAttribute("name"));
	System.out.println("session 속성 : " + session.getAttribute("name"));
	System.out.println("application 속성 : " + application.getAttribute("name"));
	
	RequestDispatcher dispacther = request.getRequestDispatcher("07_secondPage.jsp");
	dispacther.forward(request, response);
	// 포워딩 바로 하지 말고 페이지 테스트 후 실행하기 (왜냐면 포워딩하면 바로 넘어가기 때문에 오류 발생하면 어디가 오류인지 몰라)
	// 저장되는 위치가 다르기에 키값으로 동일한 변수명 사용 가능

%>
07_secondPage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>07_firstPage.jsp에서 전달된 값을 07_secondPage.jsp에서 출력</title>
</head>

<body>
pageContext 속성 : <%= pageContext.getAttribute("name") %><br />
request 속성 : <%= request.getAttribute("name") %><br />
session 속성 : <%= session.getAttribute("name") %><br />
application 속성 : <%= application.getAttribute("name") %>
</body>
</html>

firstPage.jsp 실행시 콘솔창 결과

 

 

Q) getParameter() 와 getAttribute() 메소드이 차이는 ?

getParameter()는 반환 타입 String으로 클라이언트의 HTML 페이지에서 필요한 정보를 얻는데 사용한다

getAttribute()는 반환 타입이 Object로 이전에 JSP 또는 Servlet 페이지에 설정된 매개 변수를 가져오는데 사용한다

(이전에 setAttribute() 속성을 통한 설정이 있어야만 하며 그렇지 않으면 null값을 가져온다)


 

이를 이용한 문제 

 

프로젝트 명 : forward_test_본인이니셜

프로젝트 내부 구조는 아래 그림 또는 (첨부파일)를 이용

 

오라클 사용자 계정 명 : forward_본인이니셜

오라클 사용자 계정 비밀번호 : 1234

오라클 테이블 명 : forward_tbl

 

테이블 저장 내용 

번호 : 사용자로 부터 입력받지 않음. (단, 중복 없이 자동으로 1씩 증가)

이름 : 사용자가 입력한 이름 (단, null 은 허용하지 않음)

색상 : jsp 파일명 처럼 영문으로 저장 (단, null 은 허용하지 않음)

날짜 : 사용자로 부터 입력받지 않음.   (단, null 은 허용하지 않음)

 

직접 짠 코드

더보기
forwardForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>forwardForm.jsp</title>
</head>
<body>
	<h1>포워딩될 페이지에 파라미터값 전달하기 예제</h1><br />
	<form action="forwardResult.jsp">
		이름 입력 : <input type="text" name="name" required="required" /><br /><br />
		색 선택 : <input type="radio" name="color" value="yellow" />노랑색
		       <input type="radio" name="color" value="green" />초록색
		       <input type="radio" name="color" value="blue" />파랑색
		       <input type="radio" name="color" value="red" />빨강색<br /><br />
	 	<input type="submit" value="확인">
 	</form>

</body>
</html>
forwardResult.jsp

<%@page import="java.sql.SQLException"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%
	String n = request.getParameter("name");
	String c = request.getParameter("color");
	
	Connection con = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;

	try{
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		String id = "forward_bjy";
		String pwd = "1234";
		
		Class.forName(driver);
		con = DriverManager.getConnection(url, id, pwd);
		
		String query = "insert into forward_tbl (no, name, color) values (forward_seq.nextval, ?, ?)";
		
		pstmt = con.prepareStatement(query);
		pstmt.setString(1, n);
		pstmt.setString(2, c);
		
		int num = pstmt.executeUpdate();
		if(num>0){
			System.out.print("데이터 저장 성공 !");
		}else{
			System.out.print("데이터 저장 실패...");
		}
	}catch(ClassNotFoundException e){
		System.err.print("드라이버 로딩 에러 : " + e.getMessage());
	}catch(SQLException e){
		System.err.print("커넥션 에러 : " + e.getMessage());
	}finally{
		try{
			if(con != null){
				con.close();
			}
			if(pstmt != null){
				pstmt.close();
			}
		}catch(SQLException e){
			System.err.print("close() 에러 : " + e.getMessage());
		}
	}
	
	if(c.equals("blue")){
		RequestDispatcher dispatcher = request.getRequestDispatcher("blue.jsp");
		dispatcher.forward(request, response);
	}else if(c.equals("yellow")){
		RequestDispatcher dispatcher = request.getRequestDispatcher("yellow.jsp");
		dispatcher.forward(request, response);
	}else if(c.equals("green")){
		RequestDispatcher dispatcher = request.getRequestDispatcher("green.jsp");
		dispatcher.forward(request, response);
	}else{
		RequestDispatcher dispatcher = request.getRequestDispatcher("red.jsp");
		dispatcher.forward(request, response);
	}
%>
blue.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String name = request.getParameter("name");
	String color= request.getParameter("color");

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Blue.jsp</title>
</head>
<body>
	<h1>포워딩된 페이지 - <%= color %>.jsp</h1><br />
	<b><%= name %></b> 님의 좋아하는 색은 "<%= color %>"이고 자기탐구와 내적성장을 상징하는 색입니다.<br />
	<img src="./forward_image/blue.jpg">

</body>
</html>
green.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String name = request.getParameter("name");
	String color= request.getParameter("color");

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Green.jsp</title>
</head>
<body>
	<h1>포워딩된 페이지 - <%= color %>.jsp</h1><br />
	<b><%= name %></b> 님의 좋아하는 색은 "<%= color %>"이고 기분의 안정과 온화함을 상징하는 색입니다.<br />
	<img src="./forward_image/green.jpg">

</body>
</html>
red.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String name = request.getParameter("name");
	String color= request.getParameter("color");

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Red.jsp</title>
</head>
<body>
	<h1>포워딩된 페이지 - <%= color %>.jsp</h1><br />
	<b><%= name %></b> 님의 좋아하는 색은 "<%= color %>"이고 생명을 상징하는 색입니다.<br />
	<img src="./forward_image/red.jpg">
</body>
</html>
yellow.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String name = request.getParameter("name");
	String color= request.getParameter("color");

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Yellow.jsp</title>
</head>
<body>
	<h1>포워딩된 페이지 - <%= color %>.jsp</h1><br />
	<b><%= name %></b> 님의 좋아하는 색은 "<%= color %>"이고 빛의 밝음과 따뜻함을 상징하는 색입니다.<br />
	<img src="./forward_image/yellow.jpg">

</body>
</html>

실행 결과 

'JSP,Serlvet' 카테고리의 다른 글

TIL_210426_JSTL ,Servlet 기초  (0) 2021.04.26
TIL_210422_JSP 표준 액션 태그  (0) 2021.04.25
TIL_210420_JSP 기초  (0) 2021.04.20
HTML, JSP) 다른 페이지로 이동하는 법  (0) 2021.04.20
210416_HTML,JSP 관련 예제  (0) 2021.04.18