-
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