JAVA, JSP

setAttribute, getAttribute, request.getParameter, session객체, JDBC 프로그램 순서 7단계

suji0730 2024. 7. 16. 15:15

 

1) setAttribute, getAttribute

request.getParameter()는 파라미터의 값들을 String 타입으로 보내고 받는데, 더 많은 정보들을 주고 받기 위해서는 정보들을 Object로 만들어 담을 수 있다. 이 때 사용되는 것이 request.setAttribute()와 request.getAttribute() 이다.
 
1. 동일한 웹 애플리케이션 안에 있는 모든 페이지에서 정보를 공유하기 위해서 ServletContext 객체를 사용
2. ServletContext 객체에 데이터를 동록하는 메소드 setAttribute()
3. 추출하는 메소드 getAttribute()

void setAttribute(String name, Object value)

Object getAttribute(String name)

 

① setAttribute(String name, Object Value)

- 속성 값을 설정하는 함수

첫번째 인자  Stiring name : 등록하는 데이터의 이름 지정, 추출할 때 등록한 이름으로 검색하여 추출
두번째 인자 Object value : 실제로 공유하기 위해서 등록하는 데이터, Object로 선언되었으므로 어떠한 자바 객체도 공유 가능

② getAttribute(String name)
- 속성 값을 가져오는 함수


인자 String name : 찾으려는 데이터의 등록된 이름.

 

- 주의 사항 : 반환하는 데이터의 타입 주의
setAttribute()메소드로 어떠한 자바 객체도 등록할 수 있기 때문에 getAttirbute() 메소드의 반환 타입은 자바 객체의 최상위 타입인 Object로 반환됨
따라서 getAttribute()로 추출한 데이터는 항상 원래 데이터 타입으로 캐스팅 해서 사용해야함

 

출처: https://dynamoj.tistory.com/entry/setAttribute와-getAttribute [제이의 개발 블로그:티스토리]

 

※ 속성 처리 메소드

메소드 리턴타입 설명
setAttribute(String name, Object value) void 이름이 name인 속성의 값을 value로 지정한다.
getAttribute(String name) Object 이름이 name인 속성읠 값을 구한다.
지정한 이름의 속성이 존재하지 않을 경우 null을 리턴한다.
removeAttribute(String name) void 이름이 name인 속성을 삭제한다.
getAttributeNames() java.util Enumeration 속성의 이름 목록을 구한다.

 

 

2) request.getAttribute(속성) VS request.getParameter(파라미터)


- 값 전달할때 보통 요청이 처리되는 동안만 유지가 되는 request 사용
- 둘의 기본적인 차이는 반환형
  request.getAttribute 반환형: Object  -> 주로 빈 객체나 다른 클래스를 받아올때 사용
  request.getParameter 반환형: String

getParameter()는 웹브라우저에서 전송받은 request영역의 값을 읽어오고, getAttribute()의 경우 setAttribute()속성을 통한 설정이 없으면 무조건 null값을 리턴한다.

간단한 예를 들자면,
request.getParameter("num")은 웹브라우저에서 전송받은 request영역에서 name값이 "num"인것을 찾아 그 값을 읽어오는데
request.getAttribute("num")은 request.setAttribute("num", "123") 과 같이 setAttribute()를 통해 값을 설정해주지 않으면 null값을 리턴받게 된다.



- 사용처
form 태그에서의 간단한 입력을 처리할때는 파라미터 사용
db 처리할때나 객체를 넘겨줘야 할때는 속성 사용

 

 

3) sendRedirect
response.sendRedirect("경로명");   -> ex) response.sendRedirect(request.getContextPath()+"/index.jsp");

- 아예 다른 페이지로 이동
- 데이터 유지되지 않음
- url이 바뀜

 

 

 


 

session객체
주소값 : 
//로그인 전 상태를 구분하기 위한 값
data 영역
String S_ID = null;
String S_LEVEL = null;
String S_NAME = null;

 

session객체
주소값 : 
//로그인 후 상태를 구분하기 위한 값
data 영역
String S_ID = "id001";
String S_LEVEL = "구매자"; or "판매자" or "관리자"
String S_NAME = "김보쌈";

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<%
request.setCharacterEncoding("euc-kr");

String userId = request.getParameter("userId");
String userPw = request.getParameter("userPw");

System.out.println(userId + "<- userId");
System.out.println(userPw + "<- userPw");

String dbid = "id001";
String dbpw = "pw001";
String dblevel = "구매자";
String dbname = "김보쌈";
String dbemail = "email1@naver.com";
String message = null;

if(userId.equals(dbid)){
	System.out.println("1-1 아이디 일치");
	if(userPw.equals(dbpw)){
		System.out.println("2-1 비밀번호 일치 - 로그인 성공");
		session.setAttribute("S_ID", dbid);
		session.setAttribute("S_LEVEL", dblevel);
		session.setAttribute("S_NAME", dbname);
		//response.sendRedirect(request.getContextPath()+"/index.jsp");
		message = "로그인 성공";
	}else{
		System.out.println("2-2 비밀번호 불일치");
		message = "비밀번호 불일치";
	}
}else{
	System.out.println("1-2 아이디 불일치");
	message = "아이디 불일치";
}
%><script type="text/javascript">
	alert("<%= message %>");
	location.href="<%= request.getContextPath() %>/index.jsp";
</script>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<%
String S_ID = (String)session.getAttribute("S_ID");
String S_LEVEL = (String)session.getAttribute("S_LEVEL");
String S_NAME = (String)session.getAttribute("S_NAME");
System.out.println(S_ID + "<- S_ID ");
System.out.println(S_LEVEL + "<- S_LEVEL ");
System.out.println(S_NAME + "<- S_NAME ");
%>
   <!-- Begin Wrapper -->
   <div id="wrapper">
         <!-- Begin Header -->
         <div id="header">
 /module/top.jsp 코드 include 	<br/><br/>        

<%
if(S_LEVEL == null){ 
%>
	          
<!-- 1-1 로그인 전 화면 시작 -->
<a href="<%= request.getContextPath() %>/user/user_insert_form.jsp">01회원가입</a><br><br>
	          

<form action="<%= request.getContextPath() %>/login/login_action.jsp" method="post">
	로그인 : <br>
	아이디 : <input type="text" name="userId">
	비번 : <input type="password" name="userPw">
		  <input type="submit" value="로그인 버튼">
</form>
<!-- 1-1 로그인 전 화면 끝-->
<%
}else{ 
%>

<!-- 1-2 로그인 후 화면 시작 -->
<%	if(S_LEVEL.equals("관리자")){ %>
		<a href="<%= request.getContextPath() %>/user/user_insert_form.jsp">01회원가입</a>
		<a href="<%= request.getContextPath() %>/user/user_list.jsp">02회원검색</a>		 
		<a href="#">03상품등록</a>		 
		<a href="#">04상품검색</a><br><br>
<%	} else if(S_LEVEL.equals("판매자")){ %>
		<a href="<%= request.getContextPath() %>/user/user_insert_form.jsp">01회원가입</a> 
		<a href="#">03상품등록</a>		 
		<a href="#">04상품검색</a><br><br>
<%	} else if(S_LEVEL.equals("구매자")){ %>
		<a href="<%= request.getContextPath() %>/user/user_insert_form.jsp">01회원가입</a>
		<a href="#">04상품검색</a><br><br>
<%	} %>

<%= S_NAME %>님 <%= S_LEVEL %>권한 로그인 중
<a href="<%= request.getContextPath() %>/login/logout.jsp">로그아웃</a>
	          
<!-- 1-2 로그인 후 화면 끝 -->
<% 
} 
%>
		 </div>
		 <!-- End Header -->

 


root 계정으로 실행

-- DB 생성
CREATE DATABASE dev52db DEFAULT CHARACTER SET UTF8;
-- 사용자 추가
CREATE USER 'dev52id'@'%' IDENTIFIED BY 'dev52pw';
-- 사용자 권한 설정
GRANT ALL PRIVILEGES ON dev52db.* TO 'dev52id'@'%';
-- 변경된 내용을 메모리에 반영
FLUSH PRIVILEGES;



신규 세션 생성
이름 : local_mysql_dev52id_dev52db
IP : 127.0.0.1
사용자 : dev52id
암호 : dev52pw
port : 3306
DB명 : dev52db

 

 

m_insert_action.jsp

String jdbcDriver = "jdbc:mysql://localhost:3306/dev52db?" +
				"useUnicode=true&characterEncoding=euckr";
String dbUser = "dev52id";
String dbPass = "dev52pw";

 

 

 

//JDBC(Java data base connectivity)
※ 프로그램 순서 7단계
1단계 :드라이버 로딩(mysql 드라이버 로딩)


2단계 :Connection객체로 DB연결
1)ip 2)port번호 3)db접속id 4)db접속비번 5)db명(sid,service name)

3단계 :Query실행을 위한 준비
( statement 또는 PreparedStatement객체생성)

4단계 :Query실행


5단계 :Query실행결과 사용
(insert,update,delete의 경우 생략 가능단계)

6단계 :statement 또는 PreparedStatement객체 종료(close())


7단계 :DB연결(Connection 객체) 종료(close())

 

 

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.PreparedStatement" %>
<%@ page import = "java.sql.SQLException" %>

<%
	request.setCharacterEncoding("euc-kr");	//post방식 한글처리
	Connection conn = null;	//connection 인터페이스 data type으로 conn 객체참조변수 선언 후 초기값을 null로 설정
	PreparedStatement pstmt = null;	//PreparedStatement 인터페이스 data type으로 pstmt 객체참조변수 선언 후 초기값을 null로 설정
//화면에서 입력자료 받아서 콘솔창에 출력 시작
	String m_id = request.getParameter("m_id");
	String m_pw = request.getParameter("m_pw");
	String m_level = request.getParameter("m_level");
	String m_name = request.getParameter("m_name");
	String m_email = request.getParameter("m_email");
	System.out.println(m_id + "<-- m_id /minsert/m_insert_pro.jsp");
	System.out.println(m_pw + "<-- m_pw /minsert/m_insert_pro.jsp");
	System.out.println(m_level + "<-- m_level /minsert/m_insert_pro.jsp");
	System.out.println(m_name + "<-- m_name /minsert/m_insert_pro.jsp");
	System.out.println(m_email + "<-- m_email /minsert/m_insert_pro.jsp");
//화면에서 입력자료 받아서 콘솔창에 출력 끝	
	//JDBC 프로그램 순서
	//01단계 :드라이버 로딩 시작
	Class.forName("com.mysql.jdbc.Driver");
	//01단계 :드라이버 로딩 끝
	
	try{
//02단계 :DB연결(Connection)시작
		String jdbcDriver = "jdbc:mysql://localhost:3306/dev52db?" +
				"useUnicode=true&characterEncoding=euckr";
		String dbUser = "dev52id";
		String dbPass = "dev52pw";
		
		conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
		System.out.println(conn + "<-- conn");
		System.out.println(conn.getClass() + "<-- conn.getClass()");
		
		
//02단계 :DB연결(Connection)끝
//03단계 :Query실행을 위한 statement 또는 prepareStatement객체생성 시작
		pstmt = conn.prepareStatement(
				"INSERT INTO tb_member VALUES (?, ?, ?, ?, ?)");
		System.out.println(pstmt + "<-- pstmt 1");
		System.out.println(pstmt.getClass() + "<-- pstmt.getClass() 1");
//insert into tb_member values('id001','pw001','관리자','홍01','email01');
		pstmt.setString(1, m_id);
		pstmt.setString(2, m_pw);
		pstmt.setString(3, m_level);
		pstmt.setString(4, m_name);
		pstmt.setString(5, m_email);

		System.out.println(pstmt + "<-- pstmt 2");
		
//03단계 :Query실행을 위한 statement 또는 prepareStatement객체생성 끝
//04단계 :Query실행 시작
		int result = pstmt.executeUpdate();
		System.out.println(result + "<-- result");
//04단계 :Query실행 끝
//05단계 :Query실행결과 사용 (insert의 경우 생략 가능단계)

	}finally{
		//06단계 :statement 또는 prepareStatement객체 종료(close())
		if (pstmt != null) try { pstmt.close(); } catch(SQLException ex) {}
		//07단계 :Connection 객체 종료(close())
		if (conn != null) try { conn.close(); } catch(SQLException ex) {}
	}

%>

Connection conn = null; //connection 인터페이스 data type으로 conn 객체참조변수 선언 후 초기값을 null로 설정
PreparedStatement pstmt = null; //PreparedStatement 인터페이스 data type으로 pstmt 객체참조변수 선언 후 초기값을 null로 설정

new가 없다면...
선언된 메서드 내부 처리과정에서 객체가 생성될 것으로 예상된다..
내가 선언한 메서드가 아니라 라이브러리에서 제공되는 메서드를 호출한다면 선언된 메서드 내부 처리과정에서 객체가 생성될 것이다.................................................

Connection conn = new Connection인터페이스 구현 클래스 생성자메서드();
conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
DriverManager : 클래스
getConnection 메서드 호출 시 3개의 문자열이 입력됨
getConnection 선언된 메서드 내부 처리과정에서 DB연결을 위한 3개의 문자열을 입력받아서 확인을 한다(DB연결가능한지 확인)
Connection인터페이스 구현 클래스 통해 생성된 객체의 주소값을 리턴한다
.getConnection : Connection java.sql.DriverManager.getConnection(String url, String user, String password) throws SQLException

-Console창
cohttp://m.mysql.cj.jdbc.ConnectionImpl@8dd34cd<-- conn

Connection인터페이스 구현 클래스 : ConnectionImpl
cohttp://m.mysql.cj.jdbc.ConnectionImpl@8dd34cd <- 리턴값
cohttp://m.mysql.cj.jdbc.ConnectionImpl@8dd34cd <- Connection인터페이스 구현 클래스 중에서 ConnectionImpl 클래스를 통해 생성된 객체의 주소값 리턴값


conn 객체참조변수에 할당된 주소값 : cohttp://m.mysql.cj.jdbc.ConnectionImpl@8dd34cd 

PreparedStatement 인터페이스로 선언된 pstmt 객체참조변수
pstmt = conn.prepareStatement("INSERT INTO tb_member VALUES (?, ?, ?, ?, ?)");

선언된 PreparedStatement 메서드의 내부 처리과정 :
PreparedStatement 인터페이스 구현 클래스를 통해 생성된 객체의 주소값이 리턴된다

cohttp://m.mysql.cj.jdbc.ClientPreparedStatement

3단계 쿼리실행준비 : ?에 값이 채워지지 않았기 때문에 3단계 쿼리실행준비 단계가 안됐다. 

INSERT INTO tb_member(m_id, m_pw, m_level, m_name, m_email)  VALUES (8, 8, 8, 8, 8)
INSERT INTO tb_member VALUES (?, ?, ?, ?, ?)

pstmt 객체참조변수에 할당된 주소를 찾아가면 setString 메서드 호출이 가능하다.
setString 메서드 첫번째 입력값 ex) 1번의 의미는 첫번째 ?에 m_id 변수에 담긴 값을 입력

pstmt.setString(1, m_id);
INSERT INTO tb_member VALUES ('id007', ?, ?, ?, ?)
pstmt.setString(2, m_pw);
pstmt.setString(3, m_level);
pstmt.setString(4, m_name);
INSERT INTO tb_member VALUES ('id007', 'pw007', '판매자', '김보쌈', ?)
pstmt.setString(5, m_email);
INSERT INTO tb_member VALUES ('id007', 'pw007', '판매자', '김보쌈', 'email@')

-> 쿼리 문장이 완성되었기 때문에 쿼리 준비가 끝났다.


4단계 : 쿼리 실행
executeUpdate 메서드는 insert, update, delete쿼리를 실행하는 메서드이다.
정상 쿼리 실행 후에는 리턴값 1을 리턴한다

5단계 : 쿼리실행결과 사용(생략 가능)
int result = pstmt.executeUpdate();
if(result==1){//정상쿼리실행}else{//비정상}

6,7단계 : 객체 종료
pstmt.close();
conn.close();