JSP 7일차

MOZZI KIM·2022년 11월 30일
0

JSP

목록 보기
7/10
post-thumbnail

1. emp 테이블을 DAO, DTO 클래스로 만들어 뿌리시오.

  • dept 테이블을 DAO, DTO 클래스로 만들어 뿌리시오.

  • emp 테이블의 총 월급합(모든 사원의 월급합)을 뿌리시오.

    <%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
    <%@page import="edu.global.ex.dto.EmpDto"%>
    <%@page import="edu.global.ex.dao.EmpDao"%>
    <%@page import="java.util.List"%>
    <%@ 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>
    <%
    	EmpDao empDao = new EmpDao();
    	List<EmpDto> emps = empDao.empList();
    	
    	for(EmpDto emp : emps){
    		out.print("사번 : " + emp.getEmpno() + 
    				  " 이름 : " + emp.getEname() +
    				  " 직종 : " + emp.getJob() +
    				  " 매니져 : " + emp.getMgr() +
    				  " 입사일 : " + emp.getHiredate() +
    				  " 월급 : " + emp.getSal() +
    				  " 상여 : " + emp.getComm() +
    				  " 부서번호 : " + emp.getDeptno() + "<br/>"
    				  );
    	}
    %>
    </body>
    </html>
    

    package edu.global.ex.dto;
    public class EmpDto {
      private int empno;
      private String ename;
      private String job;
      private int mgr;
      private String hiredate;
      private int sal;
      private String comm;
      private int deptno;
      
      public EmpDto() {}
      
        public EmpDto(int empno, String ename,String job ,int mgr,
        String hiredate,int sal,String comm,int deptno) {
           this.empno = empno;
           this.ename = ename;
           this.job = job;
           this.mgr = mgr;
           this.hiredate = hiredate;
           this.sal = sal;
           this.comm = comm;
           this.deptno = deptno;
        }
    
        public int getEmpno() {
           return empno;
        }
    
        public void setEmpno(int empno) {
           this.empno = empno;
        }
    
        public String getEname() {
           return ename;
        }
    
        public void setEname(String ename) {
           this.ename = ename;
        }
    
        public String getJob() {
           return job;
        }
    
        public void setJob(String job) {
           this.job = job;
        }
    
        public int getMgr() {
           return mgr;
        }
    
        public void setMgr(int mgr) {
           this.mgr = mgr;
        }
    
        public String getHiredate() {
           return hiredate;
        }
    
        public void setHiredate(String hiredate) {
           this.hiredate = hiredate;
        }
    
        public int getSal() {
           return sal;
        }
    
        public void setSal(int sal) {
           this.sal = sal;
        }
    
        public String getComm() {
           return comm;
        }
    
        public void setComm(String comm) {
           this.comm = comm;
        }
    
        public int getDeptno() {
           return deptno;
        }
    
        public void setDeptno(int deptno) {
           this.deptno = deptno;
        }
    }

package edu.global.ex.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import edu.global.ex.dto.EmpDto;

public class EmpDao {
   //커넥션풀을 사용하기 위한 소스코드 (DataSource를 import할 시 java.sql로 해야한다.
   //커넥션 풀 객체
   private DataSource dataSource = null; 
   
   /*
    * <Resource auth="Container" driverClassName="oracle.jdbc.OracleDriver"
    * maxIdle="10" maxTotal="20" maxWaitMillis="-1" name="jdbc/oracle1"
    * password="tiger" type="javax.sql.DataSource"
    * url="jdbc:oracle:thin:@127.0.0.1:1521:xe" username="scott" />
    */
   
   public EmpDao() {
      //기존에driver를 설정하고 Class.forName(driver)를 넣는 방식과는 달리 context.xml에 
        //리소스를 설정해주었다. context.xml에 있는 소스를 읽기 위해 context객체 생성한다.
      try {
         Context context = new InitialContext();
         dataSource = (DataSource)context.lookup("java:comp/env/jdbc/oracle");
         
      } catch (NamingException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }      
      
   }
   
   public List<EmpDto> empList(){
      List<EmpDto> emps = new ArrayList<>();
      
      Connection connection = null;
      PreparedStatement preparedStatement = null;
      ResultSet rs = null;
      
      try {
         String query = "select * from emp";
         connection = dataSource.getConnection();
         preparedStatement = connection.prepareStatement(query);
         rs = preparedStatement.executeQuery();
         
         while(rs.next()) {
            int empno = rs.getInt("empno");   
            String ename = rs.getString("ename");
            String job = rs.getString("job");
            int mgr = rs.getInt("mgr");
            String hiredate = rs.getString("hiredate");
            int sal = rs.getInt("sal");
            String comm = rs.getString("comm");
            int deptno = rs.getInt("deptno");
            
            EmpDto dto = new EmpDto(empno, ename, job, mgr, hiredate, sal, comm, deptno);
            emps.add(dto);

            
         }         
         
      } catch (Exception e) {
         e.printStackTrace();
      }finally {
         
         try {
            if(rs != null) rs.close();
            if(preparedStatement != null) preparedStatement.close();
            if(connection != null) connection.close();
         } catch (Exception e2) {
            e2.printStackTrace();
         }
         
      }
      
      return emps;   
      
   }
}

2. 아래의 sql 구문을 작성하시오.

-- 사원들의 입사일에서 입사 년도와 입사 달을 출력하는 쿼리문
-- 각 직원들이 근무한 개월 수를 수하는 쿼리문
-- 입사한 달의 마지막 날을 구하는 쿼리문
-- 현재 날짜를 반환하는 쿼리문


SELECT ENAME, 19||SUBSTR(HIREDATE, 1, 2)as 년도, SUBSTR(HIREDATE, 4, 2)FROM EMP;
SELECT ENAME, 19||SUBSTR(HIREDATE, 1, 2)as 년도, SUBSTR(HIREDATE, 4, 2)FROM EMP Where SUBSTR(HIREDATE, 4,2)= '09';

--현재날짜
select sysdate from dual; --+1하면내일 -1하면 어제
select sysdate +1 ,sysdate -2 from dual;

--직원들이 근무한 개월 수를 구하는 쿼리문
select ename, months_between(sysdate,hiredate) from emp;
select ename, trunc(months_between(sysdate,hiredate)) from emp;

--입사한 달의 마지막 날을 구하는 쿼리문
select hiredate, last_day(hiredate) from emp;

3. CP(connection pool)에 대하여 설명하시오.

📌 커넥션 풀(Connection Pool)이란?

WAS(웹 컨테이너)가 실행 될 때 DB연결을 위해 미리 일정수의 connection 객체를 만들어 Pool에 담아 뒀다가 사용자의 요청이 발생하면 Pool에서 생성되어 있는 Connection 객체를 넘겨주고 사용자가 사용이 끝나면 Connection 객체를 다시 Pool에 반환하여 보관하는 기법이다.


4. EL에 대하여 설명하시오.

📌 EL(Expression language)란?

EL은 Expression language의 약자로 JSP 2.0 스펙에 추가된 개념이다. 원래는 JSTL 1.0 규약에 소개된 내용으로 자바 코들르 대신해 실행시간에 태그의 속성 값을 지정하는 역활을 했었습니다. 초기의 EL은 JSTL의 액션 태그에서만 작동하는 문제가 있었는데, JSP 2.0 부터는 JSP 컨테이너가 EL 표현식을 해석할 수 있게 도어 표준 액션 태그, 커스텀 태그, 템플릿 데이터와 같이 자바코드를 사용해야 했던 모든 곳에 EL을 사용할 수 있다.

EL은 자바스크립트에서 확장된 Xpath에서 힌트를 얻어 만들어졌다. 그러나 EL은 값이 없는 변수(null)에 대해 좀 더 관대하고 데이터 형 변환을 자동으로 해준다. 이러한 특징들은 질의 문자열을 처리하는 데 주요하게 작용한다. EL을 사용하면 값이 없거나 형 변환 등에 전혀 신경 쓸 필요 없이 사용할 수 있다.

📌 EL 구문

  • EL구문은 ${....}내에 표현식으로 표현

📌 EL 표현식

  • 문자
    true{true}{false}
    123{123}{3.14}
    "JAVA"{"JAVA"}{'java'}

  • EL연산자
    산술연산자: +, -, *, /, %, mode
    논리연산자: &&, ||, !, and, or, not
    비교연산자: ==, !=, <, >, <=, >=, eq, ne, lt, get, le, ge
    empty연산자: 값이 null이거나 공백문자인지를 판단하는 연산자
    empty""true{empty ""} → true{empty null} → true

[참조] https://opentutorials.org/module/3569/21228


5. 아래의 액션 태그를 EL로 표현하시오.

<jsp:getProperty name="member" property="name"/>

>> ${member.name}

6. 4개의 scope 에 대하여 설명하시오.(예습)

1. page 영역

한 번의 클라이언트 요청이 오면, 하나의 JSP 페이지가 응답됩니다.
page 영역은 이 때 하나의 JSP 페이지 내에서만 객체를 공유하는 영역을 의미합니다. ( JSP only )
JSP 파일에는 pageContext가 내장되어 있으며, 이 객체는 page 영역에서만 유효합니다.
JSP 파일에 <% %> 안에 변수를 사용하면 이 변수는 해당 JSP 파일 내에서만 유효한데, page 스코프에 정의된 객체이기 때문입니다.

2. request 영역

요청을 받아서 응답하기까지 객체가 유효한 영역입니다.
Servlet에서 forward 또는 include를 사용하면, request 요청 객체가 공유되어서 request 영역이 됩니다.
지금까지 Servlet에서 JSP로 객체를 보낼 때 사용했던 방법입니다.
Servlet에서는 reqeust.setAttribute("이름", 객체); 로 전달하였고,
JSP에서는 Obejct ob j = request.getAttribute("이름"); 으로 받았습니다.
이 때 사용했던 request 객체가 request 영역입니다.

3. session 영역

하나의 브라우저 당 1개의 session 객체가 생성됩니다.
즉, 같은 브라우저 내에서 요청되는 페이지들은 같은 객체를 공유하게 되는데, 이를 세션 영역이라고 합니다.
세션이 종료되면 객체는 반환됩니다.
requset.getSession() 메서드를 호출하여 세션 영역의 객체를 얻을 수 있습니다.

4. application 영역

하나의 애플리케이션 당 1개의 application 객체가 생성됩니다.
즉, 같은 애플리케이션 내에서 요청되는 페이지들은 같은 객체를 공유하게 되는데 이를 애플리케이션 영역이라고 합니다.
애플리케이션이 종료되면 객체는 반환됩니다.
request.getServletContext() 메서드를 호출하여, 애플리케이션 영역의 객체를 얻을 수 있습니다.

👉 scope 범위는 page < request < session < application 순이라는 것을 알 수 있습니다.

profile
코린이

0개의 댓글