ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 16. JSP 내장 객체(내장 변수)
    개발자 수업/JSP 2021. 12. 7. 18:04

    1. 내장 객체(내장 변수)
        1) JSP가 서블릿으로 변환시 컨테이너가 자동으로 생성시키는 서블릿 멤버 변수



    2. 영역(Scope)
        1) page 영역 : 동일한 페이지에서만 공유됨. 페이지를 벗어나면 소멸됨
        2) request 영역 : 하나의 요청에 의해 호출된 페이지와 포워드(요청 전달)된 페이지까지 공유됨
                          새로운 페이지를 요청(페이지 이동)하면 소멸됨

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
    	request.setAttribute("name", "이순신");
    	request.setAttribute("address", "서울시 강남구");
    %>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>첫 번째 JSP</title>
    </head>
    <body>
    	<%
    		RequestDispatcher dispatcher = request.getRequestDispatcher("request2.jsp");
    		dispatcher.forward(request, response);
    	%>
    </body>
    </html>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
    	String name = (String)request.getAttribute("name");
    	String address = (String)request.getAttribute("address");
    %>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>두 번째 JSP</title>
    </head>
    <body>
    	<h1>이름은 <%=name %>입니다.</h1>
    	<h1>주소는 <%=address %>입니다.</h1>
    </body>
    </html>


        3) session 영역 : 클라이언트가 처음 접속한 후 웹 브라우저를 닫을 때까지 공유됨
                          포워드나 페이지 이동시에도 영역은 소멸되지 않음

    package kr.co.ezenac.embededobject;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    @WebServlet("/sess")
    public class SessionTest extends HttpServlet{
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		HttpSession session = request.getSession();		//session 객체를 가져옴
    		session.setAttribute("name", "이순신");			//session 객체에 name을 바인딩함
    		
    		out.print("<html><body>");
    		out.print("<h1>세션에 이름을 바인딩합니다.</h1>");
    		out.print("<a href='/chap09_JSP/test01/session1.jsp'>첫 번째 페이지로 이동하기</a>");
    		out.print("</body></html>");
    	}
    }
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
    	String name = (String)session.getAttribute("name"); /* session 객체에 바인딩된 name값 가져옴 */
    	session.setAttribute("address", "서울시 서초구");		/* session 객체에 address를 바인딩함 */
    %>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>session 내장 객체 테스트1</title>
    </head>
    <body>
    	이름은 <%=name %>입니다.<br>
    	<a href="session2.jsp">두 번째 페이지로 이동</a>
    </body>
    </html>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
    	String name = (String)session.getAttribute("name"); /* session 객체에 바인딩된 name값 가져옴 */
    	String address = (String)session.getAttribute("address");	/* session 객체에 address를 바인딩함 */
    %>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>session 내장 객체 테스트2</title>
    </head>
    <body>
    	이름은 <%=name %>입니다.<br>
    	주소는 <%=address %>입니다.
    </body>
    </html>


    <%@page import="java.util.ArrayList"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
    	ArrayList<String> lists = new ArrayList<>();
    	lists.add("리스트");
    	lists.add("컬렉션");
    	session.setAttribute("lists", lists);
    %>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>session 영역</title>
    </head>
    <body>
    	<h2>페이지 이동 후 session 영역의 속성 읽기</h2>
    	<a href="sessionLocation.jsp">sessionLocation.jsp 바로가기</a>
    </body>
    </html>
    <%@page import="java.util.ArrayList"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>session 영역</title>
    </head>
    <body>
    	<h2>페이지 이동 후 session 영역의 속성 읽기</h2>
    	<%
    		ArrayList<String> lists = (ArrayList<String>)session.getAttribute("lists");
    	
    		for(String str : lists) {
    			out.print(str + "<br>");
    		}
    	%>
    </body>
    </html>



        4) application 영역 : 한 번 저장되면 웹 애플리케이션이 종료될 때까지 유지됨
                              즉 서버가 셧다운되지 않는다면 언제까지든 공유되는 영역임

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
    	session.setAttribute("name","이순신");
    	application.setAttribute("address", "서울시 서초구");
    %>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>내장 객체 스코프 테스트1</title>
    </head>
    <body>
    	<h1>이름과 주소를 저장합니다.</h1>
    	<a href="appTest2.jsp">두번째 웹 페이지로 이동</a>
    </body>
    </html>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
    	String name = (String)session.getAttribute("name");
    	String address = (String)application.getAttribute("address");
    %>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>내장 객체 스코프 테스트2</title>
    </head>
    <body>
    	<h1>이름은 <%=name %>입니다.</h1>
    	<h1>주소는 <%=address %>입니다.</h1>
    </body>
    </html>


    package kr.co.ezenac.application;
    
    public class Person {
    	private String name;
    	private int age;
    	
    	public Person() {
    		// TODO Auto-generated constructor stub
    	}
    
    	public Person(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    	
    	
    }
    <%@page import="java.util.HashMap"%>
    <%@page import="kr.co.ezenac.application.Person"%>
    <%@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">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>application 영역</title>
    </head>
    <body>
    	<h2>application 영역의 공유</h2>
    	<%
    		Map<String, Person> maps = new HashMap<>();
    		maps.put("actor1", new Person("김현주", 45));
    		maps.put("actor2", new Person("차승원", 48));
    		application.setAttribute("maps", maps);
    	%>
    	application 영역에 속성이 저장되었습니다.
    </body>
    </html>
    <%@page import="java.util.Set"%>
    <%@page import="kr.co.ezenac.application.Person"%>
    <%@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">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>application 영역의 속성 읽기</title>
    </head>
    <body>
    	<h2>application 영역의 속성 읽기</h2>
    	<%
    		Map<String, Person> maps = (Map<String, Person>)application.getAttribute("maps");
    		Set<String> keys = maps.keySet();
    		
    		for(String key : keys) {
    			Person person = maps.get(key);
    			out.print(String.format("이름: %s, 나이: %d<br>", person.getName(), person.getAge()));
    		}
    	%>
    </body>
    </html>


    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>회원 검색</title>
    </head>
    <body>
    	<form method="post" action="member.jsp">
    		이름 : <input type="text" name="name"><br>
    		<input type="submit" value="조회하기">
    	</form>
    </body>
    </html>
    <%@page import="java.util.Date"%>
    <%@page import="java.util.List"%>
    <%@page import="kr.co.ezenac.member.MemberDAO"%>
    <%@page import="kr.co.ezenac.member.MemberVO"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>회원 정보 출력</title>
    	<style type="text/css">
    		h1 {
    			text-align: center;
    		}
    	</style>
    </head>
    <body>
    	<h1>회원 정보 출력</h1>
    	<%
    		request.setCharacterEncoding("utf-8");
    		String _name = request.getParameter("name");	//전송된 이름을 가져옴
    		
    		MemberVO memberVO = new MemberVO();
    		memberVO.setName(_name);
    		
    		MemberDAO dao = new MemberDAO();
    		List<MemberVO> membersList = dao.listMembers(memberVO);	
    		//memberVO를 listMembers() 전달해 조회 조건에 해당되는 회원 정보 결과 받음 
    	%>
    	
    	<table border="1" width="800" align="center">
    		<tr align="center" bgcolor="#FFFF66">
    			<td>아이디</td>
    			<td>비밀번호</td>
    			<td>이름</td>
    			<td>이메일</td>
    			<td>가입일</td>
    		</tr>	
    		<%
    			for(int i=0; i<membersList.size(); i++) {	//MemberDAO에서 조회한 회원 정보를 반복문 이용해서 테이블의 행으로 출력함
    				MemberVO vo = membersList.get(i);
    				String id = vo.getId();
    				String pwd = vo.getPwd();
    				String name = vo.getName();
    				String email = vo.getEmail();
    				Date joinDate = vo.getJoinDate();
    				
    		%>
    		<tr align="center">
    			<td><%=id %></td>
    			<td><%=pwd %></td>
    			<td><%=name %></td>
    			<td><%=email %></td>
    			<td><%=joinDate %></td>
    		</tr>	
    		<%
    			}
    		%>
    	</table>
    </body>
    </html>
    package kr.co.ezenac.member;
    
    import java.sql.Connection;
    import java.sql.Date;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.sql.DataSource;
    
    public class MemberDAO {
    	private Connection conn;
    	private PreparedStatement pstmt;
    	private DataSource dataFactory;
    	
    	public MemberDAO() {
    		try {
    			Context ctx = new InitialContext();
    			Context envContext = (Context)ctx.lookup("java:/comp/env");		//JNDI에 접근하기 위해 기본경로를 지정
    			//톰캣 context.xml에 설정한 name 값인 jdbc/oracle을 이용해 톰캣이 미리 연결한 DataSource를 받아옴
    			dataFactory = (DataSource)envContext.lookup("jdbc/oracle");		
    		} catch (NamingException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public List<MemberVO> listMembers() {
    		List<MemberVO> list = new ArrayList<MemberVO>();
    		
    		try {
    			conn = dataFactory.getConnection();	//DataSource를 이용해 DB에 연결함
    			
    			String query = "SELECT * FROM T_MEMBER";
    			System.out.println(query);
    			
    			pstmt = conn.prepareStatement(query);	//prepareStatement()메서드에 SQL문을 전달해 객체 생성함
    			ResultSet rs = pstmt.executeQuery();	//미리 설정한 SQL문을 실행함
    			
    			while(rs.next()) {
    				String id = rs.getString("id");
    				String pwd = rs.getString("pwd");
    				String name = rs.getString("name");
    				String email = rs.getString("email");
    				Date joinDate = rs.getDate("joinDate");	//조회한 레코드의 각 컬럼 값을 받아옴
    				
    				MemberVO vo = new MemberVO();
    				vo.setId(id);
    				vo.setPwd(pwd);
    				vo.setName(name);
    				vo.setEmail(email);
    				vo.setJoinDate(joinDate);				//각 컬럼 값을 다시 MemberVO 객체의 속성에 설정함
    				
    				list.add(vo);							//설정된 MemberVO 객체를 다시 ArrayList에 저장함
    			}
    			
    			rs.close();
    			pstmt.close();
    			conn.close();
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		
    		return list;				//조회한 레코드의 개수만큼 MemberVO 객체를 저장한 ArrayList를 반환함
    	}
    	
    	public List<MemberVO> listMembers(MemberVO memberVO) {
    		List<MemberVO> membersList = new ArrayList<>();
    		
    		String _name = memberVO.getName();			//조회할 이름 가져옴
    		
    		try {
    			conn = dataFactory.getConnection();		//DataSource를 이용해 DB에 연결함
    			
    			String query = "SELECT * FROM T_MEMBER ";
    			
    			if((_name != null && _name.length() != 0)) {	//_name 값이 존재하면 SQL문에 WHERE절을 추가하여
    				query += "WHERE NAME=?";					//해당 이름으로 조회함
    				pstmt = conn.prepareStatement(query);
    				pstmt.setString(1, _name);
    			} else {
    				pstmt = conn.prepareStatement(query);	
    				//prepareStatement()메서드에 SQL문을 전달해 객체 생성함
    				//_name 값이 없으면 모든 회원 정보를 조회함
    			}
    			
    			System.out.println("prepareStatement : " + query);
    		
    			ResultSet rs = pstmt.executeQuery();	//미리 설정한 SQL문을 실행함
    			
    			while(rs.next()) {
    				String id = rs.getString("id");
    				String pwd = rs.getString("pwd");
    				String name = rs.getString("name");
    				String email = rs.getString("email");
    				Date joinDate = rs.getDate("joinDate");	//조회한 레코드의 각 컬럼 값을 받아옴
    				
    				MemberVO vo = new MemberVO();
    				vo.setId(id);
    				vo.setPwd(pwd);
    				vo.setName(name);
    				vo.setEmail(email);
    				vo.setJoinDate(joinDate);				//각 컬럼 값을 다시 MemberVO 객체의 속성에 설정함
    				
    				membersList.add(vo);					//설정된 MemberVO 객체를 다시 ArrayList에 저장함
    			}
    			
    			rs.close();
    			pstmt.close();
    			conn.close();
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		
    		return membersList;
    	}
    	
    	public void addMember(MemberVO memberVO) {
    		try {
    			conn = dataFactory.getConnection();		// DataSource를 이용해 DB 연결
    			
    			String id = memberVO.getId();			// 테이블에 저장할 회원 정보 받아옴
    			String pwd = memberVO.getPwd();
    			String name = memberVO.getName();
    			String email = memberVO.getEmail();
    			
    			String query = "insert into t_member (id, pwd, name, email) values (?, ?, ?, ?)";
    			System.out.println("prepareStatement: " + query);
    			
    			pstmt = conn.prepareStatement(query);
    			
    			pstmt.setString(1, id);					//insert문의 ?에 순서대로 회원 정보 세팅
    			pstmt.setString(2, pwd);
    			pstmt.setString(3, name);
    			pstmt.setString(4, email);
    			
    			pstmt.executeUpdate();
    			pstmt.close();
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public void delMember(String id) {
    		try {
    			conn = dataFactory.getConnection();
    			
    			String query = "DELETE FROM T_MEMBER tm WHERE ID = ?";	//delete문을 문자열로 만듦
    			System.out.println("prepareStatement : " + query);
    			
    			pstmt = conn.prepareStatement(query);
    			pstmt.setString(1, id);		//첫 번째 '?'에 전달된 ID를 인자로 넣음
    			pstmt.executeUpdate();		//delete문 실행 -> 테이블에서 해당 ID 회원 정보 삭제
    			pstmt.close();
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public boolean isExisted(MemberVO memberVO) {
    		boolean result = false;
    		
    		String id = memberVO.getId();
    		String pwd = memberVO.getPwd();
    		
    		try {
    			conn = dataFactory.getConnection();
    			//decode() 함수를 이용해 조회하여 ID와 비밀번호가 테이블에 존재하면 true를,
    			//존재하지 않으면 false를 리턴함
    			String query = "SELECT DECODE(COUNT(*), 1, 'true', 'false') AS RESULT FROM T_MEMBER";
    			query += " WHERE id=? AND pwd=?";
    			
    			//메서드로 전달된 ID와 비밀번호를 이용해 SQL문을 작성한 후 DB에 조회함
    			pstmt = conn.prepareStatement(query);
    			pstmt.setString(1, id);
    			pstmt.setString(2, pwd);
    			ResultSet rs = pstmt.executeQuery();
    			
    			rs.next();			//커서를 첫 번째 레코드로 위치시킴
    			result = Boolean.parseBoolean(rs.getString("result"));
    			System.out.println("result = " + result);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		
    		return result;
    	}
    	
    }
    package kr.co.ezenac.member;
    
    import java.sql.Date;
    
    /*
     	id 			varchar2(10)	PRIMARY KEY,
    	pwd			varchar2(10)	NOT NULL,
    	name		varchar2(50),
    	email		varchar2(50),
    	joinDate	DATE			DEFAULT sysdate
     */
    
    public class MemberVO {
    	private String id;
    	private String pwd;
    	private String name;
    	private String email;
    	private Date joinDate;
    	
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
    	public String getPwd() {
    		return pwd;
    	}
    	public void setPwd(String pwd) {
    		this.pwd = pwd;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getEmail() {
    		return email;
    	}
    	public void setEmail(String email) {
    		this.email = email;
    	}
    	public Date getJoinDate() {
    		return joinDate;
    	}
    	public void setJoinDate(Date joinDate) {
    		this.joinDate = joinDate;
    	}
    }

    '개발자 수업 > JSP' 카테고리의 다른 글

    19. 액션태그  (0) 2021.12.09
    17. Cookie  (0) 2021.12.08
    15. JSP와 구성요소 + 연습  (0) 2021.12.07
    14. 서블릿 관련 Listener API  (0) 2021.12.06
    13. 필터 API  (0) 2021.12.06

    댓글