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();
'JAVA, JSP' 카테고리의 다른 글
| java - 논리연산자, 대입연산자, 삼항연산자 (0) | 2024.07.18 |
|---|---|
| JDBC(Java data base connectivity) 프로그램 순서 7단계 (0) | 2024.07.18 |
| 기능적/비기능적 요구사항, post, get방식, jsp 문법 구조, include (0) | 2024.07.15 |
| java - 오버플로우, 언더플로우, 비교연산자, 주석, 문자열 비교 메서드 (0) | 2024.07.11 |
| post, get 방식, Wrapper class (0) | 2024.07.10 |